WIP CLI Got the list command working for albums, artists, and media files.
This commit is contained in:
parent
6af528e46b
commit
688bea9103
@ -73,8 +73,8 @@ Configuration:
|
|||||||
private String afterLeader =
|
private String afterLeader =
|
||||||
new ANSI().restoreCursor().eraseLine(Erase.ToEnd).toString()
|
new ANSI().restoreCursor().eraseLine(Erase.ToEnd).toString()
|
||||||
private String eraseLeader =
|
private String eraseLeader =
|
||||||
new ANSI().cursorPrevLine().eraseLine(Erase.All).cursorPrevLine()
|
new ANSI().eraseLine(Erase.All).cursorPrevLine().eraseLine(Erase.All)
|
||||||
.eraseLine(Erase.All).toString()
|
.cursorPrevLine().eraseLine(Erase.All).toString()
|
||||||
|
|
||||||
private int displayWidth = 79
|
private int displayWidth = 79
|
||||||
private long msgTimeout
|
private long msgTimeout
|
||||||
@ -217,7 +217,7 @@ Configuration:
|
|||||||
if (new Date() > dismissMsgDate) resetStatus()
|
if (new Date() > dismissMsgDate) resetStatus()
|
||||||
if (consoleReadBuffer.size() > 0) {
|
if (consoleReadBuffer.size() > 0) {
|
||||||
line = consoleReadBuffer.remove(0)
|
line = consoleReadBuffer.remove(0)
|
||||||
processInput(line.split(/\w/) as LinkedList)
|
processInput(line.split(/\s/) as LinkedList)
|
||||||
} else {
|
} else {
|
||||||
drawLeader()
|
drawLeader()
|
||||||
Thread.sleep(250)
|
Thread.sleep(250)
|
||||||
@ -226,8 +226,10 @@ Configuration:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private def processInput(LinkedList<String> line) {
|
private def processInput(LinkedList<String> line) {
|
||||||
|
logger.debug("line: $line")
|
||||||
String command = line.poll()
|
String command = line.poll()
|
||||||
switch(command.toLowerCase()) {
|
logger.debug("command: $command")
|
||||||
|
switch(command?.toLowerCase()) {
|
||||||
case 'album': return selectAlbum(line)
|
case 'album': return selectAlbum(line)
|
||||||
case 'artist': return selectArtist(line)
|
case 'artist': return selectArtist(line)
|
||||||
case 'scan': return scanMediaLibrary()
|
case 'scan': return scanMediaLibrary()
|
||||||
@ -237,7 +239,7 @@ Configuration:
|
|||||||
if (nextArg.toLowerCase() == 'all')
|
if (nextArg.toLowerCase() == 'all')
|
||||||
return processList(line, true)
|
return processList(line, true)
|
||||||
else {
|
else {
|
||||||
if (nextArg) line.push(nextArg)
|
if (nextArg) line.addFirst(nextArg)
|
||||||
return processList(line, false) }
|
return processList(line, false) }
|
||||||
|
|
||||||
case 'debug':
|
case 'debug':
|
||||||
@ -258,46 +260,6 @@ Configuration:
|
|||||||
resetStatus()
|
resetStatus()
|
||||||
break
|
break
|
||||||
|
|
||||||
case "list artists for album":
|
|
||||||
if (!selection.album) {
|
|
||||||
setErr("No album is selected.")
|
|
||||||
break }
|
|
||||||
outStream.println(makeArtistList(
|
|
||||||
library.getArtistsByAlbumId(selection.album.id),
|
|
||||||
selection.album))
|
|
||||||
drawLeader(true)
|
|
||||||
break
|
|
||||||
|
|
||||||
case ~/list artists( .+)?/:
|
|
||||||
def name = Matcher.lastMatcher[0][1]?.trim()
|
|
||||||
def artists
|
|
||||||
if (name) artists = library.getArtistsByName(name)
|
|
||||||
else artists = library.getArtists()
|
|
||||||
|
|
||||||
outStream.println(makeArtistList(artists))
|
|
||||||
drawLeader(true)
|
|
||||||
break
|
|
||||||
|
|
||||||
case "list albums for artist":
|
|
||||||
if (!selection.artist) {
|
|
||||||
setErr("No artist selected.")
|
|
||||||
break }
|
|
||||||
outStream.println(makeAlbumList(
|
|
||||||
library.getAlbumsByArtistId(selection.artist.id),
|
|
||||||
selection.artist))
|
|
||||||
drawLeader(true)
|
|
||||||
break
|
|
||||||
|
|
||||||
case ~/list albums( .+)?/:
|
|
||||||
def name = Matcher.lastMatcher[0][1]?.trim()
|
|
||||||
def albums
|
|
||||||
if (name) albums = library.getAlbumsByName(name)
|
|
||||||
else albums = library.getAlbums()
|
|
||||||
|
|
||||||
outStream.println(makeAlbumList(albums))
|
|
||||||
drawLeader(true)
|
|
||||||
break
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
status.text = errorStyle +
|
status.text = errorStyle +
|
||||||
"Unrecognized command: '$line'${normalStyle}"
|
"Unrecognized command: '$line'${normalStyle}"
|
||||||
@ -310,16 +272,58 @@ Configuration:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private def processList(LinkedList options, boolean all) {
|
private def processList(LinkedList options, boolean all) {
|
||||||
|
logger.debug("Listing albums. Options: $options")
|
||||||
def option = options.poll()
|
def option = options.poll()
|
||||||
|
logger.debug("Option: $option")
|
||||||
|
|
||||||
|
def list
|
||||||
switch(option) {
|
switch(option) {
|
||||||
case 'albums':
|
case 'albums':
|
||||||
|
if (all) list = library.getAlbums()
|
||||||
|
else if (selection.album) list = [selection.album]
|
||||||
|
else list = library.getAlbumsWhere(
|
||||||
|
playlistId: selection.playlist?.id,
|
||||||
|
artistId: selection.artist?.id,
|
||||||
|
mediaFileId: selection.mediaFile?.id)
|
||||||
|
|
||||||
|
String albumMatch = options?.join(" ")?.trim()
|
||||||
|
if (albumMatch) list = list.findAll { it.name =~ albumMatch }
|
||||||
|
printLongMessage(makeAlbumList(list, all))
|
||||||
|
break
|
||||||
|
|
||||||
case 'artists':
|
case 'artists':
|
||||||
|
if (all) list = library.getArtists()
|
||||||
|
else if (selection.artist) list = [selection.artist]
|
||||||
|
else list = library.getArtistsWhere(
|
||||||
|
playlistId: selection.playlist?.id,
|
||||||
|
albumId: selection.album?.id,
|
||||||
|
mediaFileId: selection.mediaFile?.id)
|
||||||
|
|
||||||
|
String artistMatch = options?.join(" ")?.trim()
|
||||||
|
if (artistMatch) list = list.findAll { it.name =~ artistMatch }
|
||||||
|
printLongMessage(makeArtistList(list, all))
|
||||||
|
break
|
||||||
|
|
||||||
|
case 'files':
|
||||||
|
if (all) list = library.getMediaFiles()
|
||||||
|
else if (selection.mediaFile) list = [selection.mediaFile]
|
||||||
|
else list = library.getMediaFilesWhere(
|
||||||
|
playlistId: selection.playlist?.id,
|
||||||
|
artistId: selection.artist?.id,
|
||||||
|
albumId: selection.album?.id)
|
||||||
|
|
||||||
|
String mediaFileMatch = options?.join(" ")?.trim()
|
||||||
|
if (mediaFileMatch) list = list.findAll {
|
||||||
|
it.name =~ mediaFileMatch }
|
||||||
|
printLongMessage(makeMediaFileList(list, all))
|
||||||
|
break
|
||||||
|
|
||||||
case 'bookmarks':
|
case 'bookmarks':
|
||||||
case 'playlists':
|
case 'playlists':
|
||||||
default:
|
default:
|
||||||
printLongMessage("Unrecognized option to the ${promptStyle}" +
|
printLongMessage("Unrecognized option to the ${promptStyle}" +
|
||||||
"list${normalStyle} command. Use ${promptStyle}help list" +
|
"list${normalStyle} command. Use ${promptStyle}help list" +
|
||||||
"to see a list of valid options.")
|
"${normalStyle} to see a list of valid options.")
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -331,7 +335,7 @@ Configuration:
|
|||||||
|
|
||||||
if (!criteria) { selection.album = null; resetStatus(); return null }
|
if (!criteria) { selection.album = null; resetStatus(); return null }
|
||||||
|
|
||||||
Album match = library.getByIdOrName(Album, criteria)
|
def match = library.getByIdOrName(Album, criteria)
|
||||||
|
|
||||||
if (!match) { setErr("No album matches '$input'."); return null }
|
if (!match) { setErr("No album matches '$input'."); return null }
|
||||||
else if (match.size() > 1) {
|
else if (match.size() > 1) {
|
||||||
@ -343,12 +347,12 @@ Configuration:
|
|||||||
resetStatus()
|
resetStatus()
|
||||||
return match[0] }
|
return match[0] }
|
||||||
|
|
||||||
public void selectArtist(LinkedList input) {
|
public Artist selectArtist(LinkedList input) {
|
||||||
String criteria = input.join(" ")
|
String criteria = input.join(" ")
|
||||||
|
|
||||||
if (!criteria) { selection.artist = null; resetStatus(); return null }
|
if (!criteria) { selection.artist = null; resetStatus(); return null }
|
||||||
|
|
||||||
Artist match = library.getByIdOrName(Artist, criteria)
|
def match = library.getByIdOrName(Artist, criteria)
|
||||||
|
|
||||||
if (!match) { setErr("No artist matches '$input'."); return null }
|
if (!match) { setErr("No artist matches '$input'."); return null }
|
||||||
else if (match.size() > 1) {
|
else if (match.size() > 1) {
|
||||||
@ -408,33 +412,52 @@ Configuration:
|
|||||||
status.text = errorStyle + errMsg
|
status.text = errorStyle + errMsg
|
||||||
dismissMsgDate = new Date(new Date().time + msgTimeout) }
|
dismissMsgDate = new Date(new Date().time + msgTimeout) }
|
||||||
|
|
||||||
private String makeAlbumList(def albums, Artist artist = null) {
|
private String makeAlbumList(def albums, boolean listAll) {
|
||||||
def result = new StringBuilder()
|
def result = new StringBuilder()
|
||||||
.append(eraseLeader)
|
|
||||||
.append("--------------------\nAlbums")
|
.append("--------------------\nAlbums")
|
||||||
|
|
||||||
if (artist) result.append(" (for artist '$artist'):\n")
|
if (!listAll && (selection.playlist || selection.artist ||
|
||||||
else result.append(":\n\n")
|
selection.mediaFile))
|
||||||
|
result.append("\n(for selection: ")
|
||||||
|
.append(describeSelection())
|
||||||
|
|
||||||
|
result.append(":\n\n")
|
||||||
result.append(albums.collect { "${it.id}: ${it}" }.join("\n"))
|
result.append(albums.collect { "${it.id}: ${it}" }.join("\n"))
|
||||||
.append("\n\n\n")
|
.append("\n")
|
||||||
|
|
||||||
return result.toString() }
|
return result.toString() }
|
||||||
|
|
||||||
private String makeArtistList(def artists, Album album = null) {
|
private String makeArtistList(def artists, boolean listAll) {
|
||||||
def result = new StringBuilder()
|
def result = new StringBuilder()
|
||||||
.append(eraseLeader)
|
|
||||||
.append("--------------------\nArists")
|
.append("--------------------\nArists")
|
||||||
|
|
||||||
if (album) result.append(" (for album '$album'):\n")
|
if (!listAll && (selection.playlist || selection.artist ||
|
||||||
else result.append(":\n\n")
|
selection.mediaFile))
|
||||||
|
result.append("\n(for selection: ")
|
||||||
|
.append(describeSelection())
|
||||||
|
|
||||||
|
result.append(":\n\n")
|
||||||
result.append(artists.collect { "${it.id}: ${it.name}" }.join("\n"))
|
result.append(artists.collect { "${it.id}: ${it.name}" }.join("\n"))
|
||||||
.append("\n\n\n")
|
.append("\n")
|
||||||
|
|
||||||
return result.toString() }
|
return result.toString() }
|
||||||
|
|
||||||
private String resetStatus() {
|
private String makeMediaFileList(def mediaFiles, boolean listAll) {
|
||||||
|
def result = new StringBuilder()
|
||||||
|
.append("--------------------\nMedia Files")
|
||||||
|
|
||||||
|
if (!listAll && (selection.playlist || selection.artist ||
|
||||||
|
selection.mediaFile))
|
||||||
|
result.append("\n(for selection: ")
|
||||||
|
.append(describeSelection())
|
||||||
|
|
||||||
|
result.append(":\n\n")
|
||||||
|
result.append(mediaFiles.collect { "${it.id}: ${it.trackNumber} - ${it.name}" }.join("\n"))
|
||||||
|
.append("\n")
|
||||||
|
|
||||||
|
return result.toString() }
|
||||||
|
|
||||||
|
private String describeSelection() {
|
||||||
StringBuilder s = new StringBuilder()
|
StringBuilder s = new StringBuilder()
|
||||||
|
|
||||||
if (selection.playlist) s.append(playlistStyle)
|
if (selection.playlist) s.append(playlistStyle)
|
||||||
@ -454,9 +477,16 @@ Configuration:
|
|||||||
|
|
||||||
if (selection.mediaFile) s.append(fileStyle)
|
if (selection.mediaFile) s.append(fileStyle)
|
||||||
.append(selection.mediaFile)
|
.append(selection.mediaFile)
|
||||||
|
.append(normalStyle)
|
||||||
|
|
||||||
|
return s.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
private String resetStatus() {
|
||||||
|
String s = describeSelection()
|
||||||
|
|
||||||
if (s.size() == 0) status.text = "No current media selections."
|
if (s.size() == 0) status.text = "No current media selections."
|
||||||
else status.text = s.toString()
|
else status.text = s
|
||||||
|
|
||||||
return status.text}
|
return status.text}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user