[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[emms-help] emms-cue.el: Recognize cue sheet file
From: |
William Xu |
Subject: |
[emms-help] emms-cue.el: Recognize cue sheet file |
Date: |
Sun, 22 Nov 2009 13:24:54 +0000 (UTC) |
User-agent: |
Loom/3.14 (http://gmane.org/) |
Hi folks!
Recently I've got some .ape and .flac files. But seems mplayer
doesn't recognize the corresponding .cue file, thus making it
impossible to jump to next/prev tracks inside the .ape/.flac
file. Hence, I've created this elisp to fix it.
I plan to commit it shortly.
- William
;;; emms-cue.el --- Recognize cue sheet file
;; Copyright (C) 2009 Free Software Foundation, Inc.
;; Authors: William Xu <address@hidden>
;; This file is part of EMMS.
;; EMMS 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 3
;; of the License, or (at your option) any later version.
;; EMMS 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 EMMS; if not, write to the Free Software Foundation,
;; Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
;;; Commentary:
;; By parsing cue file, we will be able to play next/prev track from a single
;; .ape or .flac file.
;;; Code:
(require 'emms-playing-time)
(defun emms-cue-next ()
"Play next track from .cue file."
(interactive)
(let ((cue-track (emms-cue-next-track)))
(if (cdr cue-track)
(progn
(emms-seek-to (cdr cue-track))
(message "Will play: %s" (car cue-track)))
(message "Nothing to seek or missing .cue file?"))))
(defun emms-cue-prev ()
"Play previous track from .cue file."
(interactive)
(let ((cue-track (emms-cue-prev-track)))
(if (cdr cue-track)
(progn
(emms-seek-to (cdr cue-track))
(message "Will play: %s" (car cue-track)))
(message "Nothing to seek or missing .cue file?"))))
(defun emms-cue-next-track (&optional prev-p)
"Get title and offset of next track from .cue file.
When PREV-P is t, get previous track info instead."
(let* ((track (emms-playlist-current-selected-track))
(name (emms-track-get track 'name))
(cue (concat (file-name-sans-extension name)".cue")))
(when (file-exists-p cue)
(with-current-buffer (find-file-noselect cue)
(save-excursion
(if prev-p
(goto-char (point-max))
(goto-char (point-min)))
(let ((offset nil)
(title "")
;; We should search one more track far when getting previous
;; track.
(one-more-track prev-p))
(while (and (not offset)
(funcall
(if prev-p 'search-backward-regexp
'search-forward-regexp)
"INDEX 01
\\([0-9][0-9]\\):\\([0-9][0-9]\\):\\([0-9][0-9]\\)" nil t 1))
(let* ((min (string-to-number (match-string-no-properties 1)))
(sec (string-to-number (match-string-no-properties 2)))
;; (msec (string-to-number (match-string-no-properties 3)))
(total-sec (+ (* min 60) sec ;; (/ msec 100.0)
)))
(when (funcall (if prev-p '> '<) emms-playing-time total-sec)
(if (not one-more-track)
(progn
(setq offset total-sec)
(when (search-backward-regexp "TITLE \"\\(.*\\)\"" nil
t 1)
(setq title (match-string-no-properties 1))))
(setq one-more-track nil)))))
(cons title offset)))))))
(defun emms-cue-prev-track ()
"See `emms-cue-next-track'."
(emms-cue-next-track t))
(provide 'emms-cue)
;;; emms-cue.el ends here
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [emms-help] emms-cue.el: Recognize cue sheet file,
William Xu <=