Or rather, emms-cache-set-from-mpd-all
On Fri, Aug 1, 2014 at 8:55 AM, Michael Olson <[email protected]> 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 <[email protected]> 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 >> [email protected] >> https://lists.gnu.org/mailman/listinfo/emms-help >> > >
_______________________________________________ Emms-help mailing list [email protected] https://lists.gnu.org/mailman/listinfo/emms-help
