package com.robonobo.console.cmds; import static com.robonobo.common.util.TextUtil.*; import java.io.PrintWriter; import java.security.SecureRandom; import java.util.HashSet; import java.util.Set; import org.doomdark.uuid.UUIDGenerator; import com.robonobo.common.concurrent.CatchingRunnable; import com.robonobo.common.util.FileUtil; import com.robonobo.console.RobonoboConsole; import com.robonobo.core.RobonoboController; import com.robonobo.core.api.RobonoboException; import com.robonobo.core.api.model.Playlist; import com.robonobo.core.api.model.PlaylistConfig; import com.robonobo.core.api.model.Stream; import com.robonobo.core.api.model.User; public class playlist implements ConsoleCommand { public void printHelp(PrintWriter out) { out.println("'playlist list [mine|<email>]' lists playlists\n" + "'playlist show [mine|<email>] <title>' lists the tracks in the specified playlist\n" + "'playlist autodl [mine|<email>] <title> [true|false]' turns auto-downloading on or off for the playlist\n" + "'playlist vis <title> [all|me|friends]' sets my playlist visibility\n" + "'playlist create <title> <desc>' creates a playlist\n" + "'playlist delete <title>' deletes playlist\n" + "'playlist add <title> <streamid>' adds a share to the playlist\n" + "'playlist remove <title> <streamid>' removes an item from the playlist\n" + "'playlist share <title> <email>' shares a playlist with someone else"); } public void run(RobonoboConsole console, String[] args, PrintWriter out) throws Exception { RobonoboController control = console.getController(); if (args.length < 2) { printHelp(out); return; } if (args[0].equals("list")) doList(control, args, out); else if (args[0].equals("show")) doShow(control, args, out); else if (args[0].equals("autodl")) doAutoDl(control, args, out); else if (args[0].equals("vis")) doVis(control, args, out); else if (args[0].equals("create")) doCreate(control, args, out); else if (args[0].equals("delete")) doDelete(control, args, out); else if (args[0].equals("add")) doAdd(control, args, out); else if (args[0].equals("remove")) doRemove(control, args, out); else if (args[0].equals("share")) doShare(control, args, out); else printHelp(out); } private void doCreate(RobonoboController control, String[] args, PrintWriter out) throws Exception { if (args.length < 3) { printHelp(out); return; } Playlist p = new Playlist(); p.setTitle(args[1]); p.setDescription(args[2]); p.getOwnerIds().add(control.getMyUser().getUserId()); control.createPlaylist(p, null); } private void doDelete(RobonoboController control, String[] args, PrintWriter out) throws Exception { Playlist p = getNamedPlaylist(control, control.getMyUser(), args[1]); if (p == null) { out.println("No such playlist '" + args[1] + "'"); return; } control.deletePlaylist(p); } private void doAdd(RobonoboController control, String[] args, PrintWriter out) throws Exception { if (args.length < 3) { printHelp(out); return; } Playlist p = getNamedPlaylist(control, control.getMyUser(), args[1]); if (p == null) { out.println("No such playlist '" + args[1] + "'"); return; } p.getStreamIds().add(args[2]); control.updatePlaylist(p); } private void doRemove(RobonoboController control, String[] args, PrintWriter out) throws Exception { if (args.length < 3) { printHelp(out); return; } Playlist p = getNamedPlaylist(control, control.getMyUser(), args[1]); if (p == null) { out.println("No such playlist '" + args[1] + "'"); return; } if (p.getStreamIds().remove(args[2])) control.updatePlaylist(p); else out.println("Stream id '" + args[2] + "' is not in playlist '" + p.getTitle() + "'"); } private void doVis(RobonoboController control, String[] args, PrintWriter out) throws Exception { if (args.length < 3) { printHelp(out); return; } Playlist p = getNamedPlaylist(control, control.getMyUser(), args[1]); if (p == null) { out.println("No such playlist '" + args[1] + "'"); return; } p.setVisibility(args[2]); control.updatePlaylist(p); } private void doAutoDl(final RobonoboController control, String[] args, PrintWriter out) { if (args.length < 4) { printHelp(out); return; } final User u = args[1].equalsIgnoreCase("mine") ? control.getMyUser() : control.getKnownUser(args[1]); if (u == null) { out.println("No user found with email " + args[1]); return; } final Playlist p = getNamedPlaylist(control, u, args[2]); if (p == null) { out.println("No such playlist '" + args[2] + "'"); return; } if (!args[3].equalsIgnoreCase("true") && !args[3].equalsIgnoreCase("false")) { printHelp(out); return; } PlaylistConfig pc = control.getPlaylistConfig(p.getPlaylistId()); pc.setItem("autoDownload", args[3].toLowerCase()); control.putPlaylistConfig(pc); if (args[3].equalsIgnoreCase("true")) { control.getExecutor().execute(new CatchingRunnable() { public void doRun() throws Exception { control.checkPlaylistUpdate(p.getPlaylistId()); } }); } } private void doShow(RobonoboController control, String[] args, PrintWriter out) { if (args.length < 3) { printHelp(out); return; } final User u = args[1].equalsIgnoreCase("mine") ? control.getMyUser() : control.getKnownUser(args[1]); if (u == null) { out.println("No user found with email " + args[1]); return; } final Playlist p = getNamedPlaylist(control, u, args[2]); if (p == null) { out.println("No such playlist '" + args[2] + "'"); return; } out.println("Title: " + p.getTitle()); out.println("Desc: " + p.getDescription()); if (p.getStreamIds().size() == 0) out.println("No tracks"); else { out.println(rightPadOrTruncate("Title", 32) + rightPadOrTruncate("Artist", 24) + rightPadOrTruncate("Album", 24) + rightPadOrTruncate("Duration", 10) + rightPadOrTruncate("Size", 8) + rightPadOrTruncate("Id", 40)); for (String streamId : p.getStreamIds()) { Stream s = control.getKnownStream(streamId); out.println(rightPadOrTruncate(s.getTitle(), 32) + rightPadOrTruncate(s.getAttrValue("artist"), 24) + rightPadOrTruncate(s.getAttrValue("album"), 24) + rightPadOrTruncate(formatDurationHMS(s.getDuration()), 10) + rightPadOrTruncate(FileUtil.humanReadableSize(s.getSize()), 8) + rightPadOrTruncate(s.getStreamId(), 40)); } } } private void doList(RobonoboController control, String[] args, PrintWriter out) { final User u = args[1].equalsIgnoreCase("mine") ? control.getMyUser() : control.getKnownUser(args[1]); if (u == null) { out.println("No user found with email " + args[1]); return; } if (u.getPlaylistIds().size() == 0) out.println("No playlists for user " + u.getEmail()); else { for (Long plId : u.getPlaylistIds()) { Playlist p = control.getKnownPlaylist(plId); if (p != null) out.println("Title: '" + p.getTitle() + "', Desc: " + p.getDescription()); } } } private void doShare(RobonoboController control, String[] args, PrintWriter out) { if (args.length < 3) { printHelp(out); return; } User me = control.getMyUser(); Playlist p = getNamedPlaylist(control, me, args[1]); if (p == null) { out.println("No such playlist: " + args[1]); return; } // Check if this is going to a friend - if not, check we have enough // invites String sendEmail = args[2]; long sendUserId = -1; for (Long friendId : me.getFriendIds()) { User friend = control.getKnownUser(friendId); if (friend.getEmail().equals(sendEmail)) { sendUserId = friendId; break; } } Set<String> emails = new HashSet<String>(); Set<Long> friendIds = new HashSet<Long>(); if(sendUserId > 0) friendIds.add(sendUserId); else emails.add(sendEmail); try { control.sharePlaylist(p, friendIds, emails); } catch (RobonoboException e) { out.println("Error sharing playlist: "+e.getMessage()); return; } out.println("Playlist shared successfully."); } private Playlist getNamedPlaylist(RobonoboController control, User u, String plTitle) { for (Long playlistId : u.getPlaylistIds()) { Playlist p = control.getKnownPlaylist(playlistId); if (p.getTitle().equals(plTitle)) return p; } return null; } }