TODO: Get `avconv` working. Oftentimes `play` won't be able to play some tracks due to an unsupported format; we'll need to use `avconv` to convert them (to WAV). (Done!) TODO: Get `play` working. (Done!) TODO: Get play-next working; probably just act like a shuffle. Will need to keep an eye out for the `play` process finishing. (Done!) TODO: Preemptively download and process the next track, while the current one is playing, to eliminate the silent time between tracks. (Done!) TODO: Delete old tracks! Since we aren't overwriting files, we need to manually delete files once we're done with them. (Done!) TODO: Get library filter path from stdin. (Done!) TODO: Show library tree. Do this AFTER filtering, so that people can e.g. see all albums by a specific artist. (Done!) TODO: Ignore .DS_Store. (Done!) TODO: Have a download timeout, somehow. TODO: Fix the actual group format. Often times we get single-letter files being downloaded (which don't exist); I'm guessing that's related to folder names (which are just strings, not title-href arrays) still being in the group array. (Update: that's defin- itely true; 'Saucey Sounds'[0] === 'S', and 'Unofficial'[0] === 'U', which are the two "files" it crashes on while playing -g 'Jake Chudnow'.) (Done!) TODO: A way to exclude a specific group path. (Done!) TODO: Better argv handling. (Done!) TODO: Option to include a specific path from the source playlist. (Done!) TODO: Make a playlist generator that parses http://billwurtz.com instrumentals.html. (Done!) TODO: Make crawl-itunes.js a bit more general, more command-line friendly (i.e. don't require editing the script itself), and make it use the getHTMLLinks function defined in the new crawl-links.js script. (Done!) TODO: Play-in-order track picker. (Done!) TODO: Volume controls. Who knows how to do this? It might have to be an argument passed to `play`. Being able to change the volume while it's playing would be nice, but I'm not sure if that's really possible. (Done! - To the greatest current ability.) TODO: Tempfiles, maybe? (Done!) TODO: Use NOT the internet as its source, so that it's a bit more general purpose. This would only take adding a new downloader. (Done!) TODO: Recursive local file playlist crawler. (Done!) TODO: *Requiring* a literal `playlist.json` file doesn't seem quite right, especially since there's the `--open` option. (Done!) TODO: Make local downlaoder sort more natural - that is, 10 comes immediately after 9, not 1. (1, 5, 9, 10, 12; not 1, 10, 12, 5, 9.) (Done!) TODO: Make a way to skip tracks while playing. Currently the only way is to kill and restart the http-music process; this is bad for numerous reasons, particularly because it gets rid of the pre-downloaded track and forces the user to wait for another one to be downloaded. TODO: Make a --help/-h/-? option that directs helpless users to the man page. (Done!) TODO: Make a way to write the current playlist to a file. I think just renaming the debug-playlist-log option could work, since you could pipe that to a file through your shell. TODO: Figure out a less "hacky" way to kill the process. Ideally we shouldn't have to handle ^C and ^D ourselves; for instance right now ^Z is actually broken, since we aren't using the shell's normal way of handling any keyboard controls such as those! TODO: Separate the code in loop-play.js to be a bit nicer. (Done!) TODO: Cleaning up http-music.js would be nice as well! TODO: A way to kill the up-next song. (Done!) TODO: A way to see information about the currently playing song, as well as the up-next song. TODO: A way to see the previously played songs, and to skip back (or forwards). TODO: Exit on loop-play end. (Since it listens to stdin for input right now, it won't automatically stop.) TODO: Figure out how to attempt to avoid being forced to convert every file.. converting a 10MB MP3 into an 80MB WAV is never good, even if we're storing it as a tempfile! (Done!) TODO: Let playlist filter match things lowercase. '72 Minutes Of Fame' should be matched if '72 Minutes of Fame' can't be! (However, it would also be best to prioritize a case-sensitive match before a non-case-sensitive one. Given the input 'FoObAR', prioritize 'FoObAR' over 'Foobar'.) (Done!)