diff --git a/cli/interface.txt b/cli/interface.txt index 1346627..95771f6 100644 --- a/cli/interface.txt +++ b/cli/interface.txt @@ -5,6 +5,7 @@ select (current) album <id | name> playlist <id | name> file <id | name> + bookmark <id | name> tag(s) <tag-names> * List @@ -23,6 +24,7 @@ add selection to playlist <id | name> add album <id | name> to playlist <id | name> add artist <id | name> to playlist <id | name> add file <id | name> to playlist <id | name> +create playlist <name> * Tagging @@ -58,6 +60,8 @@ clear selected playlist selection +set bookmark + * Transport operations play @@ -75,6 +79,7 @@ top-level commands: select list add + create enque tag play diff --git a/cli/src/main/groovy/com/jdbernard/wdiwtlt/cli/CommandLineInterface.groovy b/cli/src/main/groovy/com/jdbernard/wdiwtlt/cli/CommandLineInterface.groovy index 57c5912..88e179f 100644 --- a/cli/src/main/groovy/com/jdbernard/wdiwtlt/cli/CommandLineInterface.groovy +++ b/cli/src/main/groovy/com/jdbernard/wdiwtlt/cli/CommandLineInterface.groovy @@ -307,17 +307,17 @@ Configuration: option = line.poll() switch (option) { case 'album': - return selectMatches(Album, library.getAlbumsWhere({ - mediaFileId: curMediaFile.id})) + return select(getExactlyOne(Album, library.getAlbumsWhere({ + mediaFileId: curMediaFile.id}))) case 'artist': - return selectMatches(Artist, library.getArtistsWhere({ + return selectMatches(library.getArtistsWhere({ mediaFileId: curMediaFile.id})) case 'playlist': - return selectMatches(Playlist, playQueue) + return selectMatches(playQueue) case 'file': - return selectMatches(MediaFile, curMediaFile) + return selectMatches(curMediaFile) case 'tags': - return selectMatches(Tag, library.getTagsWhere({ + return selectMatches(library.getTagsWhere({ mediaFileId: curMediaFile.id})) default: setErr("Unrecognized option to ${promptStyle}select " + @@ -327,21 +327,16 @@ Configuration: } switch (option) { - case 'album': - return selectMatches(Album, - library.getByIdOrName(Album, line.join(' '))) - case 'artist': - return selectMatches(Artist, - library.getByIdOrName(Artist, line.join(' '))) - case 'playlist': - return selectMatches(Playlist, - library.getByIdOrName(Playlist, line.join(' '))) - case 'file': - return selectMatches(MediaFile, - library.getByIdOrName(MediaFile, line.join(' '))) - case 'tags': - return selectMatches(Tag, - library.getByIdOrName(Tag, line.join(' '))) + case 'album': return selectMatches( + library.getByIdOrName(Album, line.join(' '))) + case 'artist': return selectMatches( + library.getByIdOrName(Artist, line.join(' '))) + case 'playlist': return selectMatches( + library.getByIdOrName(Playlist, line.join(' '))) + case 'file': return selectMatches( + library.getByIdOrName(MediaFile, line.join(' '))) + case 'tags': return selectMatches( + library.getByIdOrName(Tag, line.join(' '))) default: setErr("Unrecognized option to ${promptStyle}select${errorStyle}") @@ -349,24 +344,29 @@ Configuration: } } - private def processNew(LinkedList line) { - def option = line.poll() - switch(option) { - case 'playlist': - case 'bookmark': - default: - printLongMessage("Unrecognized option to the ${promptStyle}" + - "new${normalStyle} command. Use ${promptStyle}help new" + - "${normalStyle} to see a list of valid options.") - return null - } - } - private def processAdd(LinkedList line) { - def options = line.poll() + def option = line.poll() + def thingToAddId, targetPlaylistId + + def errMsg = "Invalid options to the ${promptStyle}add${normalStyle}" + + " command. Use ${promptStyle}help add${normalStyle} to see a " + + "list of valid options."; + + if (option != "selection" && !(thingToAddId = line.poll())) { + printLongMessage(errMsg); return null } + + if (line.poll() != 'to' && line.poll() != 'playlist') { + printLongMessage(errMsg); return null } + + if (!(targetPlaylistId = line.poll())) { + printLongMessage(errMsg); return null } + switch(option) { - case 'playlist': - case 'bookmark': + case 'selection': + case 'album': + case 'artist': + case 'file': + // TODO default: printLongMessage("Unrecognized option to the ${promptStyle}" + "add${normalStyle} command. Use ${promptStyle}help add" + @@ -516,20 +516,27 @@ Configuration: String key = uncapitalize(modelClass.simpleName) this.selection[key] = null } - public def selectMatches(Class modelClass, def matches) { - String englishName = toEnglish(modelClass.simpleName) + public def ensureExactlyOne(def matches) { if (!matches) { - setErr("No $englishName matches."); + setErr("Nothing matches."); return null } - else if (matches.size() > 1) { + + String englishName = toEnglish(modelClass.simpleName) + if (matches.size() > 1) { setErr("Multiple ${englishName}s match: " + matches.collect { "${it.id}: ${it.name}" }.join(', ')) return null } - selection[uncapitalize(modelClass.simpleName)] = matches[0] - resetStatus() return matches[0] } + public def getExactlyOne(Class modelClass, def criteria) { + return ensureExactlyOne(library.getByIdOrName(modelClass, criteria)) } + + public def selectMatches(def matches) { + def match = ensureExactlyOne(matches) + if (match) selection[uncapitalize(match.class.simpleName)] = match + return match } + private void drawLeader(afterOutput = false) { String leader = beforeLeader + getLeader() +