diff options
-rw-r--r-- | emms-info-native.el | 142 |
1 files changed, 141 insertions, 1 deletions
diff --git a/emms-info-native.el b/emms-info-native.el index 97c1917..e3181ef 100644 --- a/emms-info-native.el +++ b/emms-info-native.el @@ -546,7 +546,7 @@ outside itself.") ("TDRC" . "date") ("TPA" . "discnumber") ("TPOS" . "discnumber") - ("TCON" . "genre") + ("TCON" . genre) ("TPUB" . "label") ("TDOR" . "originaldate") ("TOR" . "originalyear") @@ -566,6 +566,135 @@ Sources: - URL `https://picard-docs.musicbrainz.org/en/appendices/tag_mapping.html' - URL `http://wiki.hydrogenaud.io/index.php?title=Foobar2000:ID3_Tag_Mapping'") +(defconst emms-info-native--id3v1-genres + '((0 . "Blues") + (1 . "Classic Rock") + (2 . "Country") + (3 . "Dance") + (4 . "Disco") + (5 . "Funk") + (6 . "Grunge") + (7 . "Hip-Hop") + (8 . "Jazz") + (9 . "Metal") + (10 . "New Age") + (11 . "Oldies") + (12 . "Other") + (13 . "Pop") + (14 . "R&B") + (15 . "Rap") + (16 . "Reggae") + (17 . "Rock") + (18 . "Techno") + (19 . "Industrial") + (20 . "Alternative") + (21 . "Ska") + (22 . "Death Metal") + (23 . "Pranks") + (24 . "Soundtrack") + (25 . "Euro-Techno") + (26 . "Ambient") + (27 . "Trip-Hop") + (28 . "Vocal") + (29 . "Jazz+Funk") + (30 . "Fusion") + (31 . "Trance") + (32 . "Classical") + (33 . "Instrumental") + (34 . "Acid") + (35 . "House") + (36 . "Game") + (37 . "Sound Clip") + (38 . "Gospel") + (39 . "Noise") + (40 . "AlternRock") + (41 . "Bass") + (42 . "Soul") + (43 . "Punk") + (44 . "Space") + (45 . "Meditative") + (46 . "Instrumental Pop") + (47 . "Instrumental Rock") + (48 . "Ethnic") + (49 . "Gothic") + (50 . "Darkwave") + (51 . "Techno-Industrial") + (52 . "Electronic") + (53 . "Pop-Folk") + (54 . "Eurodance") + (55 . "Dream") + (56 . "Southern Rock") + (57 . "Comedy") + (58 . "Cult") + (59 . "Gangsta") + (60 . "Top 40") + (61 . "Christian Rap") + (62 . "Pop/Funk") + (63 . "Jungle") + (64 . "Native American") + (65 . "Cabaret") + (66 . "New Wave") + (67 . "Psychadelic") + (68 . "Rave") + (69 . "Showtunes") + (70 . "Trailer") + (71 . "Lo-Fi") + (72 . "Tribal") + (73 . "Acid Punk") + (74 . "Acid Jazz") + (75 . "Polka") + (76 . "Retro") + (77 . "Musical") + (78 . "Rock & Roll") + (79 . "Hard Rock") + (80 . "Folk") + (81 . "Folk-Rock") + (82 . "National Folk") + (83 . "Swing") + (84 . "Fast Fusion") + (85 . "Bebob") + (86 . "Latin") + (87 . "Revival") + (88 . "Celtic") + (89 . "Bluegrass") + (90 . "Avantgarde") + (91 . "Gothic Rock") + (92 . "Progressive Rock") + (93 . "Psychedelic Rock") + (94 . "Symphonic Rock") + (95 . "Slow Rock") + (96 . "Big Band") + (97 . "Chorus") + (98 . "Easy Listening") + (99 . "Acoustic") + (100 . "Humour") + (101 . "Speech") + (102 . "Chanson") + (103 . "Opera") + (104 . "Chamber Music") + (105 . "Sonata") + (106 . "Symphony") + (107 . "Booty Bass") + (108 . "Primus") + (109 . "Porn Groove") + (110 . "Satire") + (111 . "Slow Jam") + (112 . "Club") + (113 . "Tango") + (114 . "Samba") + (115 . "Folklore") + (116 . "Ballad") + (117 . "Power Ballad") + (118 . "Rhythmic Soul") + (119 . "Freestyle") + (120 . "Duet") + (121 . "Punk Rock") + (122 . "Drum Solo") + (123 . "A cappella") + (124 . "Euro-House") + (125 . "Dance Hall")) + "id3v1 genres.") + (defconst emms-info-native--id3v2-text-encodings '((0 . latin-1) (1 . utf-16) @@ -749,11 +878,22 @@ with key/value-pair. Extract the key and, if it is a mapped element in `emms-info-native--id3v2-frame-to-info', use it as INFO-ID. +If INFO-ID is `genre', assume that DATA is either id3v1 genre +reference \"(XX)\" or plain genre string. In the former case, +map XX to a string via `emms-info-native--id3v1-genres'; in the +latter case use the genre string verbatim. + Return a cons cell (INFO-ID . VALUE) where VALUE is the decoded string." (when info-id (let ((str (emms-info-native--decode-id3v2-string data))) (cond ((stringp info-id) (cons info-id str)) + ((eq info-id 'genre) + (if (string-match "^(\\([0-9]+\\))" str) + (let ((v1-genre (assoc (string-to-number (match-string 1 str)) + emms-info-native--id3v1-genres))) + (when v1-genre (cons "genre" (cdr v1-genre)))) + (cons "genre" str))) ((eq info-id 'user-defined) (let* ((key-val (split-string str (string 0))) (key (downcase (car key-val))) |