Skip to content

Latest commit

 

History

History
167 lines (143 loc) · 8.67 KB

TODO.md

File metadata and controls

167 lines (143 loc) · 8.67 KB

MECOMP todo list

Daemon/Backend

Basic music playing

  • Implement basic RPC server/client capably of handling all the basic functionality of a music player (play, pause, stop, etc.)
  • Implement audio playback functionality
  • Scan music collection from a directory (and it's subdirectories)
  • maintain a persistent state of the music collection (henceforth referred to as "Library" or "Music Library") that allows users to create playlists, track play counts, "like" songs, etc.
  • rescan endpoint: updates the library while minimizing data loss (i.e. play counts, likes, playlists, etc. should be preserved as much as possible)
    • used when adding a new root directory to the music collection, or when there have been changes to the collection while the daemon was not running
  • music library watcher that dynamically updates the library when songs are added, removed, or modified as long as the daemon is running
  • properly handle compilation albums (i.e. albums with multiple artists)
  • add commands for reading songs by artists, in albums, in playlists, in collections, etc.
  • commands for reading the artist/album of songs
  • commands for reading the artists of albums
  • allow users to "like" songs
  • track play counts

Search functionality

  • allow users to search their music library (search for songs, artists, albums, etc.)
    • searching by songs includes the artist names in the index, so for example searching for "Green Day" will return all songs by Green Day (even if the song name doesn't contain "Green Day")

Dynamic Playlists

  • allow users to create dynamic playlists based on a set of criteria (e.g. "all songs with a play count greater than 10", "all songs by Green Day", "all songs in the genre of Rock", etc.)
    • these criteria should be able to be combined with set/boolean logic (union (AND), intersection (OR))
    • criteria can be scoped to allow for more complex queries
  • integrate dynamic playlist functionality into the CLI
  • integrate dynamic playlist functionality into the TUI
  • integrate dynamic playlist functionality into the GUI, when it's done
    • create a capable but intuitive query-building interface similar to the advanced search tools for research databases

Playlists

  • allow users to create playlists
  • allow users to create "smart playlists" that are automatically updated based on a set of criteria (e.g. "all songs with a play count greater than 10", "all songs by Green Day", "all songs with a similarity to Foo greater than X", etc.)
    • these criteria should be able to be combined with set/boolean logic (union (AND), intersection (OR), difference (NOT))
    • criteria can be scoped to allow for more complex queries
  • allow user to import/export playlists in a standard format (e.g. m3u, xspf, etc.)

Radio (song suggestions)

  • analyze audio features of songs to create searchable vector space for nearest neighbor search (M-Tree)
  • use M-Tree index based nearest neighbor search to find similar songs
    • ability to find songs similar to a given:
      • song
      • artist
      • album
      • playlist
      • collection
      • genre

Collections

  • maintains multiple auto-curated "Collections" created by K-Means clustering on the Music Library, these collections will represent the broad themes within your music collection, but are not tied to human defined genres
  • Users can "freeze" a collection, which will convert it to a playlist
  • Functionality to actually create the collections (recluster endpoit)

Metadata Tagger

  • This will probably be done as a separate cli/tui tool
  • if a song is missing important metadata, and there is an internet connection, attempt to fetch the metadata from the MusicBrainz API.
    • we can use the acousticid api to get the musicbrainz id of a song from an audio fingerprint, and then use the musicbrainz id to get the metadata from the musicbrainz api
    • we can use the rust-chromaprint crate to generate the audio fingerprint

Clients

MECOMP-CLI

  • Implement basic functionality (mirror the daemon's functionality). Basically a direct translation of the daemon's API to a CLI.
  • Allow users to pipe results of searches, radios, etc. to other commands (e.g. mecomp-cli search "Green Day" | mecomp-cli radio)
    • pipe to the queue (append): mecomp-cli search "Green Day" | mecomp-cli queue
    • pipe to a new/existing playlist
    • pipe to library lookup
    • pipe to radio
  • add commands for reading songs by artists, in albums, in playlists, in collections, etc.
  • commands for reading the artist/album of songs
  • commands for reading the artists of albums

MECOMP-MPRIS

MECOMP-TUI

  • Implement basic TUI
  • CheckTree widget: a tree/list that allows for multiple items to be selected
    • allow for multiple items to be selected and added to the queue, a playlist, or used to start a radio
    • function to get the selected items
  • Implement mouse support
  • Implement view pages for the following:
    • search results
      • show the results of a search
      • pressing enter on a result will take you to the appropriate view page for that result
      • use CheckTree widget instead of Tree
    • radio results
      • show the results of a radio search
      • keybind to add to queue
      • keybind to add to a playlist
      • use CheckTree widget instead of Tree
    • albums
      • display all albums
      • be able to "enter" an to go to the album view page
      • ability to sort by name, artist, year, etc.
      • use CheckTree widget instead of Tree
    • artists
      • display all artists
      • be able to "enter" an artist to go to the artist view page
      • ability to sort by name, etc.
      • use CheckTree widget instead of Tree
    • songs
      • display all songs
      • be able to "enter" a song to go to the song view page
      • ability to sort by name, artist, album, year, etc.
      • use CheckTree widget instead of Tree
    • playlists
      • display all playlists
      • ability to sort by name, etc.
      • be able to "enter" a playlist to go to the playlist view page
      • keybind to create a new playlist
      • keybind to remove the selected playlist
    • collections
      • display all collections
      • be able to "enter" a collection to go to the collection view page
    • a single album
      • show info about the album, including all the songs contained
      • keybind to add to queue
      • keybind to start a radio
      • keybind to add to a playlist
      • use CheckTree widget instead of Tree
    • a single artist
      • show info about the artist, including all the albums and songs by the artist
      • keybind to add to queue
      • keybind to start a radio
      • keybind to add to a playlist
      • use CheckTree widget instead of Tree
    • a single song
      • show information about the song
      • keybind to add to queue
      • keybind to start a radio
      • keybind to add to a playlist
      • use CheckTree widget instead of Tree
    • a single playlist
      • show the playlist's name and contents
      • keybind to add to queue
      • keybind to start a radio
      • keybind to add to a playlist
      • keybind to remove a song from the playlist
      • use CheckTree widget instead of Tree
    • a single collection
      • show the collection's contents
      • keybind to add to queue
      • use CheckTree widget instead of Tree
  • add confirmation dialogues for potentially destructive actions (e.g. deleting a playlist, initiating a rescan, etc.)
  • keybind to freeze a collection into a playlist
  • at startup, check if the daemon is running, and if it isn't then start it in a detached process

MECOMP-GUI

  • Implement basic GUI