diff options
| -rw-r--r-- | emms-source-playlist.el | 217 | ||||
| -rw-r--r-- | emms.el | 64 | 
2 files changed, 217 insertions, 64 deletions
| diff --git a/emms-source-playlist.el b/emms-source-playlist.el new file mode 100644 index 0000000..847b32f --- /dev/null +++ b/emms-source-playlist.el @@ -0,0 +1,217 @@ +;;; emms-source-playlist.el --- EMMS sources from playlist files + +;; Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. + +;; Author: Jorgen Schäfer <forcer@forcix.cx> +;; Keywords: emms, mp3, mpeg, multimedia + +;; This file is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. +;; +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +;; Boston, MA 02110-1301 USA + +;;; Commentary: + +;; This file contains track sources for EMMS which read playlist +;; files. EMMS' own playlist files are supported as well als the +;; typical .m3u and .pls files. + +;;; Code: + +;; Version control +(defvar emms-source-playlist-version "0.1 $Revision: 1.30 $" +  "emms-source-playlist.el version string") +;; $Id: emms-source-file.el,v 1.30 2005/08/11 06:16:15 yonirabkin Exp $ + +(require 'emms) +(require 'emms-source-file) + +(defcustom emms-source-playlist-formats +  '((emms-source-playlist-native-p emms-source-playlist-parse-native)) +  "*A list of playlist format functions. +Each entry is a list with two elements: +A function which returns non-nil if the current buffer is of this +type, and a function which parses such a buffer. +The former is called with no arguments, while the latter is +called with two buffers: The playlist buffer and the file buffer." +  :type 'sexpr +  :group 'emms) + +;;; EMMS native playlists + +;; Format: +;; ;;; This is an EMMS playlist file. Play it with M-x emms-play-playlist +;; <sexpr> + +(defun emms-source-playlist-native-p () +  "Return non-nil if the current buffer contains a native EMMS playlist." +  (save-excursion +    (goto-char (point-min)) +    (looking-at "^;;; This is an EMMS playlist file"))) + +(defun emms-source-playlist-parse-native () +  "Parse the native EMMS playlist in the current buffer." +  (save-excursion +    (goto-char (point-min)) +    (read (current-buffer)))) + +(defun emms-source-playlist-unparse-native (in out) +  "Unparse a native playlist from IN to OUT. +IN should be a buffer with a EMMS playlist in it. +OUT should be a buffer to get the native EMMS format." +  (with-current-buffer in ;; Don't modify the position +    (save-excursion       ;; in the IN buffer +      (with-current-buffer out +        (insert ";;; This is an EMMS playlist file." +                " Play it with M-x emms-play-playlist\n") +        (insert "(") +        (let ((track (emms-source-playlist-first in)) +              (firstp t)) +          (while track +            (if (not firstp) +                (insert "\n ") +              (setq firstp nil)) +            (prin1 track (current-buffer)) +            (setq track (emms-source-playlist-next in)))) +        (insert ")\n"))))) + +(define-emms-source native-playlist (file) +  "An EMMS source for a native EMMS playlist file." +  (interactive (list (read-file-name "Playlist file: " +                                     emms-source-file-default-directory +                                     emms-source-file-default-directory +                                     t))) +  (mapc #'emms-playlist-insert-track +        (with-temp-buffer +          (insert-file-literally file) +          (goto-char (point-min)) +          (when (not (emms-source-playlist-native-p)) +            (error "Not a native EMMS source file.")) +          (emms-source-playlist-parse-native)))) + +(defun emms-playlist-save (file) +  "Store the current playlist in a native format." +  (interactive (list (read-file-name "Store as: " +                                     emms-source-file-default-directory +                                     emms-source-file-default-directory +                                     nil))) +  (with-current-buffer (find-file-noselect file) +    (delete-region (point-min) +                   (point-max)) +    (emms-source-playlist-unparse-native (with-current-emms-playlist +                                           (current-buffer)) +                                         (current-buffer)) +    (save-buffer))) + +;;; m3u/pls files + +;; Format: +;; Either a list of filename-per-line, ignore lines beginning with # +;; or: +;; #EXTM3U +;; #EXTINF:<length in seconds>,<name> +;; <filename> + +; emms-source-playlist-m3u-p +; emms-source-playlist-parse-m3u +; emms-source-playlist-unparse-m3u + + +;;; Helper functions + +(defun emms-source-playlist-first (buf) +  "Return the first track in BUF. +This moves point." +  (with-current-buffer buf +    (condition-case nil +        (progn +          (emms-playlist-first) +          (emms-playlist-track-at (point))) +      (error +       nil)))) + +(defun emms-source-playlist-next (buf) +  "Return the next track in BUF. +This moves point." +  (with-current-buffer buf +    (condition-case nil +        (progn +          (emms-playlist-next) +          (emms-playlist-track-at (point))) +      (error +       nil)))) + +;;; Old stuff: +;;  +;; (defun emms-playlist-save (playlist filename) +;;   "Save a playlist in the native EMMS format." +;;   (interactive "bPlaylist buffer name: \nFFile to save playlist as: ") +;;   (let ((tracklist '())) +;;     (condition-case nil +;;         (with-current-buffer playlist +;;           (save-excursion +;;             (emms-playlist-first) +;;             (while (emms-playlist-track-at) +;;               (setq tracklist (cons (emms-playlist-track-at) +;;                                     tracklist)) +;;               (emms-playlist-next)))) +;;       (error nil)) +;;     (setq tracklist (nreverse tracklist)) +;;     ;; tracklist complete, let's write it ! +;;     (with-current-buffer (find-file-noselect filename) +;;       (erase-buffer) +;;       (prin1 tracklist (current-buffer)) +;;       (insert "\n") +;;       (save-buffer) +;;       (kill-buffer (current-buffer))))) +;;  +;; (defun emms-playlist-save-active (filename) +;;   "Save the active EMMS playlist in native format." +;;   (interactive "FFile to save playlist as: ") +;;   (emms-playlist-save emms-playlist-buffer filename)) +;;  +;; (defun emms-playlist-save-as-m3u (playlist filename) +;;   "Save a playlist in .m3u format." +;;   (interactive "bPlaylist buffer name: \nFFile to save playlist as: ") +;;   (let ((tracklist '())) +;;     (condition-case nil +;;         (with-current-buffer playlist +;;           (save-excursion +;;             (emms-playlist-first) +;;             (while (emms-playlist-track-at) +;;               (setq tracklist (cons (emms-playlist-track-at) +;;                                     tracklist)) +;;               (emms-playlist-next)))) +;;       (error nil)) +;;     (setq tracklist (nreverse tracklist)) +;;     ;; tracklist complete, let's write it ! +;;     (with-current-buffer (find-file-noselect filename) +;;       (erase-buffer) +;;       (insert "#EXTM3U\n") +;;       (mapc (lambda (track) +;; 	      (let ((time (or (emms-track-get track 'info-mtime) "")) +;; 		    (artist (emms-track-get track 'info-artist)) +;; 		    (title (emms-track-get track 'info-title)) +;; 		    (name (emms-track-get track 'name))) +;; 		(insert (format "#EXTINF: %s,%s - %s\n%s\n" +;; 				time artist title name)))) +;;             tracklist) +;;       (save-buffer) +;;       (kill-buffer (current-buffer))))) +;;  +;; (defun emms-playlist-save-current-as-m3u (filename) +;;   "Save the active EMMS playlist in m3u format." +;;   (interactive "FFile to save playlist as: ") +;;   (emms-playlist-save-as-m3u emms-playlist-buffer filename)) + + @@ -872,70 +872,6 @@ ignore this."        (setq i (- i 1))))    vector) -;;; Saving playlists. - -(defun emms-playlist-save (playlist filename) -  "Save a playlist in the native EMMS format." -  (interactive "bPlaylist buffer name: \nFFile to save playlist as: ") -  (let ((tracklist '())) -    (condition-case nil -        (with-current-buffer playlist -          (save-excursion -            (emms-playlist-first) -            (while (emms-playlist-track-at) -              (setq tracklist (cons (emms-playlist-track-at) -                                    tracklist)) -              (emms-playlist-next)))) -      (error nil)) -    (setq tracklist (nreverse tracklist)) -    ;; tracklist complete, let's write it ! -    (with-current-buffer (find-file-noselect filename) -      (erase-buffer) -      (prin1 tracklist (current-buffer)) -      (insert "\n") -      (save-buffer) -      (kill-buffer (current-buffer))))) - -(defun emms-playlist-save-active (filename) -  "Save the active EMMS playlist in native format." -  (interactive "FFile to save playlist as: ") -  (emms-playlist-save emms-playlist-buffer filename)) - -(defun emms-playlist-save-as-m3u (playlist filename) -  "Save a playlist in .m3u format." -  (interactive "bPlaylist buffer name: \nFFile to save playlist as: ") -  (let ((tracklist '())) -    (condition-case nil -        (with-current-buffer playlist -          (save-excursion -            (emms-playlist-first) -            (while (emms-playlist-track-at) -              (setq tracklist (cons (emms-playlist-track-at) -                                    tracklist)) -              (emms-playlist-next)))) -      (error nil)) -    (setq tracklist (nreverse tracklist)) -    ;; tracklist complete, let's write it ! -    (with-current-buffer (find-file-noselect filename) -      (erase-buffer) -      (insert "#EXTM3U\n") -      (mapc (lambda (track) -	      (let ((time (or (emms-track-get track 'info-mtime) "")) -		    (artist (emms-track-get track 'info-artist)) -		    (title (emms-track-get track 'info-title)) -		    (name (emms-track-get track 'name))) -		(insert (format "#EXTINF: %s,%s - %s\n%s\n" -				time artist title name)))) -            tracklist) -      (save-buffer) -      (kill-buffer (current-buffer))))) - -(defun emms-playlist-save-current-as-m3u (filename) -  "Save the active EMMS playlist in m3u format." -  (interactive "FFile to save playlist as: ") -  (emms-playlist-save-as-m3u emms-playlist-buffer filename)) - -  ;;; Sources | 
