What works:
2008-10-10 - Dragging from tree.2008-10-09 - Search results can be displayed as a tree.
What is broke (or non-existent):
To Do For Release:
First Pre-Alpha Release: Hystrix bengalensis
First Production Release: Hystrix africaeaustralis
Need to complete Library adding and removing.
- Add existing library.
- Remove library.
Add progress bar for file adds.
- Need to add a done and cancel button.
- Do I want the progress dialog to close automatically after a period of time?
Fix file adding procedure so that the database is not searched 3 times for every file.
Add a message window/log. Also connect the status bar.
Add support for multiple file types.
Add an installation message, with a Pre-Alpha warning.
Create a py2exe distribution.
First Production Release: Hystrix africaeaustralis
Be able to save custom tags.
- Save to file metadata.
- Save to separate database.
To Do:
(For specific bugs I am using the Sourceforge bug tracker.)
Adding/Updating Files:
Right now when files are added the database is queried up to 3 times for each file. This severely slows down the process as the disk must be accessed each time.
What I need to do is to read the relevant part of the database into memory and then do all the checks against this list. This will increase memory usage but will probably speed the process up enormously.
What I need to do is to read the relevant part of the database into memory and then do all the checks against this list. This will increase memory usage but will probably speed the process up enormously.
I need to add a dialog and status bar, and do the adding in the background.
Right now when I add files I am first getting all the filenames, then getting the metadata from each file. It may be slightly faster to do both operations at the same time (probably not though.)
When files are added for update, an update is done even if the file data matches the record. It is probably faster to check the record before updates (given that I have to get it from the db anyway).
Error Handling:
In hystrix_database.HystrixSearch.extractTerms (removeDuplicateTerms) A runtime error is raised if there is a logic problem with the search. This need a custom error class and need to be handled correctly by the search routines.
Metadata:
So far only mp3 files are supported. I need to add the rest.
Deal with cover_art / images correctly.
In Id3.py I have just turned this off.
In Id3.py I have just turned this off.
Searching:
I need a way to search for tracks/albums/artist that don't have custom tags.
I need a way to search for tracks that are improperly tagged.
Database:
It might be worth storing the base path for library in the database. It might be able to use that data as a guess for the program if the database is added.
It might be worth giving each hystrix installation a unique id, then adding a record to this table for each installation.
It might be worth giving each hystrix installation a unique id, then adding a record to this table for each installation.
Retrieving the whole database can take quite a bit of time (a couple seconds with 16668 songs. To make this appear faster I might want to save the results if the whole database is ever queried. Then I can pull it up again quickly. If I was willing to have a larger memory footprint I could try to fetch those results on startup. I might also want to try loading the database into memory and seeing if that changes the query/extraction time.
If I want to get really fancy I should only pull up the data I that I immediately need, and incremental pull up more data as it is requested. This would have to be done in the background.
I might want to store the file modification date in the database, this could be use to help update the database quickly.
I should have a table in the database that includes all of the directories in the library. This will make checking for new/deleted/renamed files easier (I think).
I need to have a database that holds any mismatches between the hystrix id and the musicbrainz id.
New playlist entries should always use the musicbrains id. If a playlist cannot find a song, it should first check the mismatch list. Then do a search by meta data.
New playlist entries should always use the musicbrains id. If a playlist cannot find a song, it should first check the mismatch list. Then do a search by meta data.
Display (View & Model):
Album date: I want to be able to see it.
There are two ways to do this:
There are two ways to do this:
- Append the date to the album string.
- Have the date show up in the first column.
Is there a way to switch between soring by albumartist and by artist?
How do I solve the various artists problem?
Idealy I would be able to display the track both under the artist name and under various artists. Doing that is kinda tricky though. Also doing this can make the results very messy, especially for certain types of remix albums.
Idealy I would be able to display the track both under the artist name and under various artists. Doing that is kinda tricky though. Also doing this can make the results very messy, especially for certain types of remix albums.
I would eventually like to add an "all" option to all of the tree branches. To do this with out tripling the model size (or worse) I should generate the all branches on the fly. Then all I need to know are their size (I think.) Most important is to have an all albums under root, and an all tracks under each artist. I will need to figure out how I want to do sorting in this case.
Right now there is a delay in dragging files as the disk spins up. This could be removed by querying the file on the start of a drag. This querying would likely need to be done in a separate thread to keep it from slowing the program.
A check should be done to see if the files exist at some point prior(?) to dragging them.
Now if an album is dragged, it only returns the tracks that were found in the search. Do I want it to always return the full album? How about for Artists? Can I do this from a context menu?
As it is, drags have to initiates from the column that has the tree. I need to fix that so that they can be started anywhere.
GUI:
When the search bar is clicked on all of the active database files should be pinged to make sure the drive are awake.
Add an about message.
When a library is added and found not to be available the button needs to be grayed out.
I might want to make it possible to change the order of the library buttons by dragging.
Libraries:
Need a better check of the basepath. What I have not will not work for removable devices. This looks rather complicated to do and will require me to write separate branches for windows, linux and possibly os x.
Things to keep in mind:
- Encoding in hystrix_nt_drag is taken from locale.getdefaultlocale()
- Global state file is found using sys.path[0]. This may not be right.
Future Ideas:
Playlist:
When on random, if a file (or files) is added to playlist, they will be played, then random resumed.
There should be an option to have the file window track with the playlist. This would be especially useful when the playlist is on random. This tracking will need to deal with expanding/contracting trees.
There needs to be a way to exclude files from automatic/radom playlists.
I think the way to do this is to add an 'exclude' column to the database.
I think the way to do this is to add an 'exclude' column to the database.
Dependancies:
- Python 2.5
- PyQt4
- mutagen
- pythonutils
- pywin32 (windows only)
- apsw
Done:
(Stuff that used to be on the todo list.)
Database:
Sorting:
I need to think a little about how I want to sort the items out of the database.
I need to think a little about how I want to sort the items out of the database.
- Album sorting should be done by date if available.
- Need to make sure the date is formatted such that this is possible.
- Artist sorting should either be done by artistsortname or albumartistsortname.
To decide this I need to think about how I am going to deal with displaying various artist albums.
SQLite does case insensitive searches for 7-bit Latin characters. All other characters are case sensitive. This is true for both searching and sorting.
I eventually need to decide how to deal with this. There are a couple possible solutions. The best one is probably to use a sort_artist column for searches.
I eventually need to decide how to deal with this. There are a couple possible solutions. The best one is probably to use a sort_artist column for searches.
- Create a sort_artist, sort_album & sort_title column in the database where either all non-ASCII characters have been converted to lower case, or changed to their nearest ASCII equivalent. This has the disadvantage that it will double the size of the database.
- Write (or find) a custom sorting function for SQLite that can deal with non-ASCII characters.
- Do the sorting after the search (this might be a lot slower).
I need to add indexing and ordering.
Right now I am storing the absolute path in the database. This is not portable nor will it work well with removable media. Instead I need to be storing a relative path (except for Internet based files).
If I do things this way then all files in a library have to be on one drive. Perhaps I can have multiple columns to hold relative paths with respect to different base paths. Otherwise I could have an option to store absolute paths.
Display / Model:
If I do things this way then all files in a library have to be on one drive. Perhaps I can have multiple columns to hold relative paths with respect to different base paths. Otherwise I could have an option to store absolute paths.
Right now my tree generation is case sensitive. Best way to fix this is to have a artistsortname entry in the database that is not case sensitive.
Right now the sorting & tree generation is done by 'artist'. It is probably more useful to do this by 'album artist'. Ideally we would want a way to switch back and forth.
The delay before a drag is started is too long.
Main:
Need to setup for saving and loading the state of the hystrix application.
The most important thing here is to save/load the libraries.
GUI:
The most important thing here is to save/load the libraries.
When the search bar is clicked on for the first time all text the text should be selected.
Add an icon.