Hi,

My collection of music contains many examples of multiple-disc albums.
With the stock EMMS, this has the undesired effect of playing all track
1s of an album, followed by all track 2s, followed by all track 3s,
etc.  I made the attached patch to fix this for me; as a new user with a
restricted collection, I haven't tested all possible codepaths.

>From 03f9518b851a31710fbc8c4502b20eed0bfed1c4 Mon Sep 17 00:00:00 2001
From: Christophe Rhodes <[email protected]>
Date: Fri, 30 Mar 2012 21:04:36 +0100
Subject: [PATCH] support discnumber metadata

Necessary to preserve the expected playing order for multiple-disc
albums (e.g. operas, large-scale masses, compilations).  Tested to
the extent of working both for metadata ingestion and in the browser
in my entirely-FLAC collection.  Other modifications (principally in
the tag editor) untested.
---
 lisp/emms-browser.el       |   10 ++++++++++
 lisp/emms-info-metaflac.el |    1 +
 lisp/emms-info.el          |    1 +
 lisp/emms-playlist-sort.el |   20 +++++++++++---------
 lisp/emms-tag-editor.el    |    7 ++++---
 5 files changed, 27 insertions(+), 12 deletions(-)

diff --git a/lisp/emms-browser.el b/lisp/emms-browser.el
index 6bff443..c52f326 100644
--- a/lisp/emms-browser.el
+++ b/lisp/emms-browser.el
@@ -786,6 +786,15 @@ return an empty string."
            (concat "0" tracknum)
          tracknum)))))
 
+(defun emms-browser-disc-number (track)
+  "Return a string representation of a track number.
+The string will end in a space. If no track number is available,
+return an empty string."
+  (let ((discnum (emms-track-get track 'info-discnumber)))
+    (if (or (not (stringp discnum)) (string= discnum "0"))
+        ""
+      discnum)))
+
 (defun emms-browser-year-number (track)
   "Return a string representation of a track's year.
 This will be in the form '(1998) '."
@@ -1700,6 +1709,7 @@ If > album level, most of the track data will not make sense."
             ("C" . ,(emms-track-get track 'info-composer))
             ("p" . ,(emms-track-get track 'info-performer))
             ("t" . ,(emms-track-get track 'info-title))
+	    ("D" . ,(emms-browser-disc-number track))
             ("T" . ,(emms-browser-track-number track))
             ("d" . ,(emms-browser-track-duration track))
             ("cS" . ,(emms-browser-get-cover-str path 'small))
diff --git a/lisp/emms-info-metaflac.el b/lisp/emms-info-metaflac.el
index c6188c3..5e50578 100644
--- a/lisp/emms-info-metaflac.el
+++ b/lisp/emms-info-metaflac.el
@@ -64,6 +64,7 @@ external metaflac program"
     "--show-tag=NOTE"
     "--show-tag=YEAR"
     "--show-tag=TRACKNUMBER"
+    "--show-tag=DISCNUMBER"
     "--show-tag=GENRE")
   "The argument to pass to `emms-info-metaflac-program-name'."
   :type '(repeat string)
diff --git a/lisp/emms-info.el b/lisp/emms-info.el
index 2f3b7bc..cfc206b 100644
--- a/lisp/emms-info.el
+++ b/lisp/emms-info.el
@@ -35,6 +35,7 @@
 ;; info-title - string naming the title of the song
 ;; info-album - string naming the album
 ;; info-tracknumber - string(?) naming the track number
+;; info-discnumber - string naming the disc number
 ;; info-year - string naming the year
 ;; info-note - string of free-form entry
 ;; info-genre - string naming the genre
diff --git a/lisp/emms-playlist-sort.el b/lisp/emms-playlist-sort.el
index e35d483..138308e 100644
--- a/lisp/emms-playlist-sort.el
+++ b/lisp/emms-playlist-sort.el
@@ -37,7 +37,7 @@
   "Sorting list used by `emms-playlist-sort-by-list'.
 Currently it understands the following fields: name info-artist
 imfo-composer info-performer info-title info-album info-genre
-info-playing-time info-tracknumber."
+info-playing-time info-tracknumber info-discnumber."
   :type 'symbol
   :group 'emms-playlist-sort)
 
@@ -173,15 +173,17 @@ With a prefix argument, decreasingly."
 This is the order in which albums where intended to be played.
 ie. by album name and then by track number."
   (let ((album-a (emms-track-get a 'info-album))
-        (album-b (emms-track-get b 'info-album)))
+        (album-b (emms-track-get b 'info-album))
+	(discnum-a (string-to-number (or (emms-track-get a 'info-discnumber) "0")))
+	(discnum-b (string-to-number (or (emms-track-get b 'info-discnumber) "0")))
+	(tracknum-a (string-to-number (or (emms-track-get a 'info-tracknumber) "0")))
+	(tracknum-b (string-to-number (or (emms-track-get b 'info-tracknumber) "0"))))
     (or (emms-string< album-a album-b)
-        (and album-a
-             album-b
+        (and album-a album-b
              (string= album-a album-b)
-             (< (string-to-number (or (emms-track-get a 'info-tracknumber)
-                                      "0"))
-                (string-to-number (or (emms-track-get b 'info-tracknumber)
-                                      "0")))))))
+	     (or (< discnum-a discnum-b)
+		 (and (= discnum-a discnum-b)
+		      (< tracknum-a tracknum-b)))))))
 
 (defun emms-playlist-sort-by-list-p (a b)
   (catch 'return
@@ -195,7 +197,7 @@ ie. by album name and then by track number."
          (when (< (emms-track-get a info)
                   (emms-track-get b info))
            (throw 'return t)))
-        ((info-tracknumber)
+        ((info-tracknumber info-discnumber)
          (when (< (string-to-number (or (emms-track-get a info) "0"))
                   (string-to-number (or (emms-track-get b info) "0")))
            (throw 'return t)))))))
diff --git a/lisp/emms-tag-editor.el b/lisp/emms-tag-editor.el
index 3eba673..055b951 100644
--- a/lisp/emms-tag-editor.el
+++ b/lisp/emms-tag-editor.el
@@ -92,6 +92,7 @@ is the format template.  The format specification is like:
  t     --     Track info-title
  l     --     Track info-album
  n     --     Track info-tracknumber
+ D     --     Track info-discnumber
  y     --     Track info-year
  g     --     Track info-genre
  ;     --     Track info-note
@@ -139,7 +140,7 @@ should be given.
 See also `emms-tag-editor-tag-file' and `emms-tag-editor-tag-ogg'.")
 
 (defun emms-tag-editor-tag-flac (track)
-  "Commit changes to an OGG file according to TRACK."
+  "Commit changes to an FLAC file according to TRACK."
   (require 'emms-info-metaflac)
   (with-temp-buffer
     (let (need val)
@@ -147,7 +148,7 @@ See also `emms-tag-editor-tag-file' and `emms-tag-editor-tag-ogg'.")
               (let ((info-tag (intern (concat "info-" tag))))
                 (when (> (length (setq val (emms-track-get track info-tag))) 0)
                   (insert (upcase tag) "=" val "\n"))))
-            '("artist" "composer" "performer" "title" "album" "tracknumber" "date" "genre" "note"))
+            '("artist" "composer" "performer" "title" "album" "tracknumber" "discnumber" "date" "genre" "note"))
       (when (buffer-string)
         (funcall #'call-process-region (point-min) (point-max)
                  emms-info-metaflac-program-name nil
@@ -163,7 +164,7 @@ See also `emms-tag-editor-tag-file' and `emms-tag-editor-tag-ogg'.")
             (let ((info-tag (intern (concat "info-" tag))))
               (when (> (length (setq val (emms-track-get track info-tag))) 0)
                 (setq args (append (list "-t" (concat (upcase tag) "=" val)) args)))))
-          '("artist" "composer" "performer" "title" "album" "tracknumber" "date" "genre" "note"))
+          '("artist" "composer" "performer" "title" "album" "tracknumber" "discnumber" "date" "genre" "note"))
     (when args
       (apply #'call-process "vorbiscomment" nil
              (get-buffer-create emms-tag-editor-log-buffer)
-- 
1.7.5.4

Best wishes,

Christophe
_______________________________________________
Emms-patches mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/emms-patches

Reply via email to