Skip to content

Commit 7814831

Browse files
committed
Add support for multiple album artists
1 parent 94f7b8d commit 7814831

File tree

3 files changed

+38
-24
lines changed

3 files changed

+38
-24
lines changed

README.org

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ The library is implemented around a set of entities.
4343
| *Name* | *Type* | *Fields* | *Description* |
4444
|------------------+-----------+----------------------+---------------------------------------------------------|
4545
| song | structure | name, album, file, … | |
46-
| album | structure | name, date, artist | |
46+
| album | structure | name, date, artists | |
4747
| artist | structure | name | |
4848
| genre | structure | name | |
4949
| directory | structure | name, path | |

libmpdel.el

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ message from the server.")
173173
(:conc-name libmpdel--album-))
174174
(name nil :read-only t)
175175
(date nil :read-only t)
176-
(artist nil :read-only t))
176+
(artists nil :read-only t))
177177

178178
(cl-defstruct (libmpdel-song
179179
(:constructor libmpdel--song-create)
@@ -214,16 +214,23 @@ message from the server.")
214214
"Return artist name of ENTITY."
215215
(libmpdel--artist-name (libmpdel-artist entity)))
216216

217+
(defun libmpdel-artists-name (entity)
218+
"Return semicolon separated string of artists names of ENTITY."
219+
(string-join (mapcar #'libmpdel--artist-name
220+
(libmpdel-artists entity))
221+
"; "))
222+
217223
(cl-defgeneric libmpdel-artist (entity)
218-
"Return artist of ENTITY.")
224+
"Return artist of ENTITY."
225+
(car (libmpdel-artists entity)))
219226

220-
(cl-defmethod libmpdel-artist ((artist libmpdel-artist))
221-
"Return ARTIST."
222-
artist)
227+
(cl-defmethod libmpdel-artists ((artist libmpdel-artist))
228+
"Return singleton list containing ARTIST."
229+
(list artist))
223230

224-
(cl-defmethod libmpdel-artist ((album libmpdel-album))
231+
(cl-defmethod libmpdel-artists ((album libmpdel-album))
225232
"Return the ALBUM's artist."
226-
(libmpdel--album-artist album))
233+
(libmpdel--album-artists album))
227234

228235
(cl-defmethod libmpdel-artist ((song libmpdel-song))
229236
"Return the SONG's artist."
@@ -414,7 +421,7 @@ If the SONG's name is nil, return the filename instead."
414421
(libmpdel--album-create
415422
:name (cdr (assq 'Album album-data))
416423
:date (cdr (assq 'Date album-data))
417-
:artist (libmpdel--artist-create :name (assq 'Artist album-data))))
424+
:artists (libmpdel--artists-create (libmpdel-entries album-data 'AlbumArtist))))
418425

419426
(defun libmpdel--create-albums-from-data (data)
420427
"Return a list of albums from DATA, a server's response."
@@ -983,7 +990,11 @@ If HANDLER is nil, ignore response."
983990
(cl-defmethod libmpdel-entity-to-criteria ((album libmpdel-album))
984991
"Return search query matching all songs from ALBUM."
985992
(format "%s album %S"
986-
(libmpdel-entity-to-criteria (libmpdel-artist album))
993+
(string-join
994+
(mapcar (lambda (artist)
995+
(format "albumartist %S" (libmpdel-entity-name artist)))
996+
(libmpdel-artists album))
997+
" ")
987998
(libmpdel-entity-name album)))
988999

9891000
(cl-defmethod libmpdel-entity-to-criteria ((genre libmpdel-genre))

test/libmpdel-test.el

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -54,39 +54,39 @@
5454

5555
(ert-deftest libmpdel-test-artist ()
5656
(let* ((artist (libmpdel--artist-create :name "The Artist"))
57-
(album (libmpdel--album-create :name "The Album" :artist artist))
58-
(song (libmpdel--song-create :name "The song" :album album)))
57+
(album (libmpdel--album-create :name "The Album" :artists (list artist)))
58+
(song (libmpdel--song-create :name "The song" :album album :artists (list artist))))
5959
(should (equal artist (libmpdel-artist artist)))
6060
(should (equal artist (libmpdel-artist album)))
6161
(should (equal artist (libmpdel-artist song)))))
6262

6363
(ert-deftest libmpdel-test-artist-name ()
6464
(let* ((artist (libmpdel--artist-create :name "The Artist"))
65-
(album (libmpdel--album-create :name "The Album" :artist artist))
65+
(album (libmpdel--album-create :name "The Album" :artists (list artist)))
6666
(song (libmpdel--song-create :name "The song" :album album)))
6767
(should (equal "The Artist" (libmpdel-artist-name artist)))
6868
(should (equal "The Artist" (libmpdel-artist-name album)))
6969
(should (equal "The Artist" (libmpdel-artist-name song)))))
7070

7171
(ert-deftest libmpdel-test-album-name ()
7272
(let* ((artist (libmpdel--artist-create :name "The Artist"))
73-
(album (libmpdel--album-create :name "The Album" :artist artist))
73+
(album (libmpdel--album-create :name "The Album" :artists (list artist)))
7474
(song (libmpdel--song-create :name "The song" :album album)))
7575
(should-error (libmpdel-album-name artist))
7676
(should (equal "The Album" (libmpdel-album-name album)))
7777
(should (equal "The Album" (libmpdel-album-name song)))))
7878

7979
(ert-deftest libmpdel-test-album ()
8080
(let* ((artist (libmpdel--artist-create :name "The Artist"))
81-
(album (libmpdel--album-create :name "The Album" :artist artist))
81+
(album (libmpdel--album-create :name "The Album" :artists (list artist)))
8282
(song (libmpdel--song-create :name "The song" :album album)))
8383
(should-error (libmpdel-album artist))
8484
(should (equal album (libmpdel-album album)))
8585
(should (equal album (libmpdel-album song)))))
8686

8787
(ert-deftest libmpdel-test-entity-name ()
8888
(let* ((artist (libmpdel--artist-create :name "The Artist"))
89-
(album (libmpdel--album-create :name "The Album" :artist artist))
89+
(album (libmpdel--album-create :name "The Album" :artists (list artist)))
9090
(song (libmpdel--song-create :name "The song" :album album))
9191
(stored-playlist (libmpdel--stored-playlist-create :name "The playlist")))
9292
(should (equal "The Artist" (libmpdel-entity-name artist)))
@@ -101,7 +101,7 @@
101101

102102
(ert-deftest libmpdel-test-entity-parent ()
103103
(let* ((artist (libmpdel--artist-create :name "The Artist"))
104-
(album (libmpdel--album-create :name "The Album" :artist artist))
104+
(album (libmpdel--album-create :name "The Album" :artists (list artist)))
105105
(song (libmpdel--song-create :name "The song" :album album))
106106
(stored-playlist (libmpdel--stored-playlist-create :name "The playlist")))
107107
(should (equal 'artists (libmpdel-entity-parent artist)))
@@ -118,6 +118,7 @@
118118
(file . "foo/song.ogg")
119119
(Date . "1970-01-01")
120120
(Album . "The Album")
121+
(AlbumArtist . "The Albumartist")
121122
(Genre . "The Genre")
122123
(Artist . "The Artist")))))
123124
(should (equal "The song" (libmpdel-entity-name song)))
@@ -126,7 +127,7 @@
126127
(should (equal "1970-01-01" (libmpdel-entity-date (libmpdel-album song))))
127128
(should (equal (list "The Genre") (mapcar #'libmpdel-entity-name (libmpdel-genres song))))
128129
(should (equal "The Album" (libmpdel-entity-name (libmpdel-album song))))
129-
(should (equal "The Artist" (libmpdel-entity-name (libmpdel-artist (libmpdel-album song)))))))
130+
(should (equal "The Albumartist" (libmpdel-entity-name (libmpdel-artist (libmpdel-album song)))))))
130131

131132
(ert-deftest libmpdel-test-current-playlist-p ()
132133
(should (libmpdel-current-playlist-p 'current-playlist))
@@ -274,20 +275,22 @@
274275

275276
(ert-deftest libmpdel-test-playlist-add-no-string-id-sends-findadd ()
276277
(let* ((artist (libmpdel--artist-create :name "The Artist"))
277-
(album (libmpdel--album-create :name "The Album" :artist artist)))
278+
(album (libmpdel--album-create :name "The Album" :artists (list artist))))
278279
(libmpdel-test--with-connection
279280
(libmpdel-playlist-add album 'current-playlist)
280-
(should (equal '("findadd artist \"The Artist\" album \"The Album\"")
281+
(should (equal '("findadd albumartist \"The Artist\" album \"The Album\"")
281282
(last commands))))))
282283

283284
(ert-deftest libmpdel-test-playlist-add-sends-findadd ()
284285
(let ((song (libmpdel--create-song-from-data
285286
'((Title . "S")
286287
(Album . "A")
288+
(AlbumArtist . "Art")
289+
(AlbumArtist . "Bart")
287290
(Artist . "Art")))))
288291
(libmpdel-test--with-connection
289292
(libmpdel-playlist-add song 'current-playlist)
290-
(should (equal '("findadd artist \"Art\" album \"A\" title \"S\"")
293+
(should (equal '("findadd albumartist \"Art\" albumartist \"Bart\" album \"A\" title \"S\"")
291294
(last commands))))))
292295

293296

@@ -328,9 +331,9 @@
328331
(let* ((artist1 (libmpdel--artist-create :name "artist1"))
329332
(artist1-bis (libmpdel--artist-create :name "artist1"))
330333
(artist2 (libmpdel--artist-create :name "artist2"))
331-
(album1 (libmpdel--album-create :name "album1" :artist artist1))
332-
(album1-bis (libmpdel--album-create :name "album1" :artist artist1))
333-
(album2 (libmpdel--album-create :name "album2" :artist artist1))
334+
(album1 (libmpdel--album-create :name "album1" :artists (list artist1)))
335+
(album1-bis (libmpdel--album-create :name "album1" :artists (list artist1)))
336+
(album2 (libmpdel--album-create :name "album2" :artists (list artist1)))
334337
(song1 (libmpdel--song-create
335338
:name "name"
336339
:file "file"

0 commit comments

Comments
 (0)