Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.org
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,15 @@ The library is implemented around a set of entities.
| song | structure | name, album, file, … | |
| album | structure | name, artist | |
| artist | structure | name | |
| genre | structure | name | |
| directory | structure | name, path | |
| stored-playlist | structure | name | A named user-specified sequence of songs |
| search-criteria | structure | type, what | Read the [[https://www.musicpd.org/doc/protocol/database.html][protocol documentation]] |
| filter | structure | text | Read the [[https://www.musicpd.org/doc/html/protocol.html#filters][protocol documentation]] |
|------------------+-----------+----------------------+---------------------------------------------------------|
| artists | symbol | /none/ | Represent the set of all artists |
| albums | symbol | /none/ | Represent the set of all albums |
| genres | symbol | /none/ | Represent the set of all genres |
| directories | symbol | /none/ | Represent all directories in ~libmpdel-music-directory~ |
| current-playlist | symbol | /none/ | Represent the currently played sequence of songs |
| stored-playlists | symbol | /none/ | Represent the set of all stored playlists |
Expand Down
49 changes: 49 additions & 0 deletions libmpdel.el
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@ message from the server.")
(file nil :read-only t)
(album nil :read-only t)
(performers nil :read-only t)
(genres nil :read-only t)
(disc nil :read-only t)
(date nil :read-only t)
(id nil :read-only t)
Expand All @@ -191,6 +192,11 @@ message from the server.")
(:conc-name libmpdel--stored-playlist-))
(name nil :read-only t))

(cl-defstruct (libmpdel-genre
(:constructor libmpdel--genre-create)
(:conc-name libmpdel--genre-))
(name nil :read-only t))

(cl-defstruct (libmpdel-search-criteria
(:constructor libmpdel-search-criteria-create)
(:conc-name libmpdel--search-criteria-))
Expand Down Expand Up @@ -240,6 +246,14 @@ message from the server.")
"Return SONG's performers."
(libmpdel--song-performers song))

(cl-defmethod libmpdel-genres ((song libmpdel-song))
"Return SONG's genres."
(libmpdel--song-genres song))

(cl-defmethod libmpdel-genres ((genre libmpdel-genre))
"Return singleton list GENRE."
(list genre))

(cl-defgeneric libmpdel-entity-name (entity)
"Return the name of ENTITY.")

Expand All @@ -251,6 +265,10 @@ message from the server.")
"Return ALBUM's name."
(libmpdel--album-name album))

(cl-defmethod libmpdel-entity-name ((genre libmpdel-genre))
"Return GENRE's name."
(libmpdel--genre-name genre))

(cl-defmethod libmpdel-entity-name ((song libmpdel-song))
"Return SONG's name.

Expand All @@ -270,6 +288,10 @@ If the SONG's name is nil, return the filename instead."
"Return a string describing the `albums' entity."
"All albums")

(cl-defmethod libmpdel-entity-name ((_entity (eql genres)))
"Return a string describing the `genres' entity."
"All genres")

(cl-defmethod libmpdel-entity-name ((_entity (eql current-playlist)))
"Return a string describing the `current-playlist' entity."
"Current playlist")
Expand Down Expand Up @@ -300,6 +322,10 @@ If the SONG's name is nil, return the filename instead."
"Return ALBUM's artist."
(libmpdel-artist album))

(cl-defmethod libmpdel-entity-parent ((_genre libmpdel-genre))
"Return the `genres' entity."
'genres)

(cl-defmethod libmpdel-entity-parent ((_artist libmpdel-artist))
"Return the `artists' entity."
'artists)
Expand Down Expand Up @@ -350,13 +376,20 @@ If the SONG's name is nil, return the filename instead."
(libmpdel--artist-create :name name))
artist-names))

(defun libmpdel--genres-create (genre-names)
"Return a list of genres whose names are GENRE-NAMES."
(mapcar (lambda (name)
(libmpdel--genre-create :name name))
genre-names))

(defun libmpdel--create-song-from-data (song-data)
"Return a song from SONG-DATA, a server's response."
(libmpdel--song-create
:name (cdr (assq 'Title song-data))
:track (cdr (assq 'Track song-data))
:file (cdr (assq 'file song-data))
:performers (libmpdel--artists-create (libmpdel-entries song-data 'Performer))
:genres (libmpdel--genres-create (libmpdel-entries song-data 'Genre))
:album (libmpdel--album-create
:name (cdr (assq 'Album song-data))
:artist (libmpdel--artist-create :name (cdr (assq 'Artist song-data))))
Expand Down Expand Up @@ -935,6 +968,11 @@ If HANDLER is nil, ignore response."
(libmpdel-entity-to-criteria (libmpdel-artist album))
(libmpdel-entity-name album)))

(cl-defmethod libmpdel-entity-to-criteria ((genre libmpdel-genre))
"Return search query matching all songs from GENRE."
(format "genre %S"
(libmpdel-entity-name genre)))

(cl-defmethod libmpdel-entity-to-criteria ((song libmpdel-song))
"Return search query matching SONG."
(format "%s title %S"
Expand Down Expand Up @@ -971,6 +1009,17 @@ If HANDLER is nil, ignore response."
:artist libmpdel--unknown-artist))
(libmpdel-sorted-entries data 'Album))))))

(cl-defmethod libmpdel-list ((_entity (eql genres)) function)
"Call FUNCTION with all genres as parameter."
(libmpdel-send-command
"list genre"
(lambda (data)
(funcall function
(mapcar
(lambda (genre-name)
(libmpdel--genre-create :name genre-name))
(libmpdel-sorted-entries data 'Genre))))))

(cl-defmethod libmpdel-list ((_entity (eql stored-playlists)) function)
"Call FUNCTION with all stored playlists as parameter."
(libmpdel-send-command
Expand Down
2 changes: 2 additions & 0 deletions test/libmpdel-test.el
Original file line number Diff line number Diff line change
Expand Up @@ -120,9 +120,11 @@
(Performer . "The Violinist")
(Performer . "The Pianist")
(Performer . "The Singer")
(Genre . "The Genre")
(Artist . "The Artist")))))
(should (equal "The song" (libmpdel-entity-name song)))
(should (equal "foo/song.ogg" (libmpdel-song-file song)))
(should (equal (list "The Genre") (mapcar #'libmpdel-entity-name (libmpdel-genres song))))
(should (equal "The Album" (libmpdel-entity-name (libmpdel-album song))))
(should (equal (list "The Violinist" "The Pianist" "The Singer")
(mapcar #'libmpdel-entity-name (libmpdel-performers song))))
Expand Down