emms-help
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [emms-help] Problems getting emms-player-mpd working, and solutions


From: Michael Olson
Subject: Re: [emms-help] Problems getting emms-player-mpd working, and solutions
Date: Fri, 1 Aug 2014 08:55:42 -0700

Or rather, emms-cache-set-from-mpd-all


On Fri, Aug 1, 2014 at 8:55 AM, Michael Olson <address@hidden> wrote:
I think that `emms-player-mpd-update-all' might already do what you want.


On Thu, Jul 31, 2014 at 11:17 PM, Alexis <address@hidden> wrote:

Hi all,

Below is a naïve, proof-of-concept implementation of building EMMS cache
data via querying of the MusicPD database, using the 'connection'
package[1] for TCP communication. On my system,
emms-player-mpd-build-cache-from-db is roughly 80 times as fast as the
existing cache-building method of running mp3info: whereas the latter
takes 20+ minutes to complete, emms-player-mpd-build-cache-from-db
finishes in less than 15 seconds.


Alexis.

[1] Available via MELPA, or on GitHub here:
https://github.com/myrkr/dictionary-el/blob/master/connection.el



--- BEGIN proof-of-concept code ---

(require 'connection)
(setq conn (connection-open "localhost" "6600"))
(generate-new-buffer "*test-cache*")

(defun emms-player-mpd-build-cache-from-db ()
  "Create the EMMS cache from the contents of the MusicPD database."

  (interactive)

  (let ((track-count 0)
        (artists-string "")
        (artists-list '()))

  ;; Get list of all artists in MPD database.

  (connection-send conn "list artist\n")
  (setq artists-string (connection-read conn "\nOK\n"))

  (with-temp-buffer
    (progn
      (insert artists-string)
      (goto-char (point-min))
      (while (re-search-forward "Artist: \\([^\n]+\\)" nil t)
        (setq artists-list (cons (match-string 1) artists-list)))))

  ;; Get list of all tracks by each artist.

  (dolist (artist artists-list)

    (let ((artist-tracks-string "")
          (artist-tracks-list '()))

      (connection-send conn (concat "list title artist \"" artist "\"\n"))
      (setq artist-tracks-string (connection-read conn "\nOK\n"))

      (with-temp-buffer
        (progn
          (insert artist-tracks-string)
          (goto-char (point-min))
          (while (re-search-forward "Title: \\([^\n]+\\)" nil t)
            (setq artist-tracks-list (cons (match-string 1) artist-tracks-list)))))

      (dolist (track artist-tracks-list)

        (let ((metadata-string "")
              (track-metadata '())
              (track-file "")
              (track-artist "")
              (track-title "")
              (track-album "")
              (track-number "")
              (track-time "")
              (track-mtime "")
              (track-year "")
              (track-genre ""))

          ;; Escape double-quotes in name of track.
          (setq track (replace-regexp-in-string "\042" (concat "\134" "\042") track nil t))

          (connection-send conn (concat "find artist \"" artist "\" "
                                        "title \"" track "\"\n"))
          (setq metadata-string (connection-read conn "\nOK\n"))

          (with-temp-buffer
            (insert metadata-string)
            (goto-char (point-min))
            (while (re-search-forward "^\\([^:]+\\): \\([^\n]+\\)$" nil t)
              (setq track-metadata (cons `(,(match-string 1) . ,(match-string 2)) track-metadata))))

          (setq track-file (cdr (assoc "file" track-metadata)))
          (setq track-artist (cdr (assoc "Artist" track-metadata)))
          (setq track-title (cdr (assoc "Title" track-metadata)))
          (setq track-album (cdr (assoc "Album" track-metadata)))
          (setq track-number (cdr (assoc "Track" track-metadata)))
          (setq track-time (cdr (assoc "Time" track-metadata)))
          (setq track-mtime (date-to-time (cdr (assoc "Last-Modified" track-metadata))))
          (setq track-year (cdr (assoc "Date" track-metadata)))
          (setq track-genre (cdr (assoc "Genre" track-metadata)))

          (setq track-count (+ 1 track-count))
          (if (= 0 (mod track-count 200))
              (message (concat "Tracks processed: " (format "%d" track-count))))

          (print `(*track* (type . file) (name . ,track-file ) (metadata) (info-artist . ,track-artist) (info-title . ,track-title) (info-album . ,track-album) (info-tracknumber . ,track-number) (info-playing-time . ,track-time) (info-year . ,track-year) (info-genre . ,track-genre) (info-mtime ,@track-mtime)) (get-buffer "*test-cache*"))))))))

--- END proof-of-concept code ---

_______________________________________________
Emms-help mailing list
address@hidden
https://lists.gnu.org/mailman/listinfo/emms-help



reply via email to

[Prev in Thread] Current Thread [Next in Thread]