New patches: [push-lastfm-submission-api-to-1.2.dpatch Tassilo Horn **20080211102659] { hunk ./emms-lastfm.el 126 -(defconst emms-lastfm-client-version 0.1 +(defconst emms-lastfm-client-version 0.2 hunk ./emms-lastfm.el 131 -(defvar emms-lastfm-md5-challenge nil "-- only used internally --") +(defvar emms-lastfm-session-id nil "-- only used internally --") +(defvar emms-lastfm-now-playing-url nil "-- only used internally --") hunk ./emms-lastfm.el 136 +(defvar emms-lastfm-current-track-starting-time nil "-- only used internally --") hunk ./emms-lastfm.el 143 + (setq emms-lastfm-current-track-starting-time (emms-lastfm-current-unix-time)) hunk ./emms-lastfm.el 218 - (setq emms-lastfm-md5-challenge nil + (setq emms-lastfm-session-id nil hunk ./emms-lastfm.el 244 - (when (not (and emms-lastfm-md5-challenge + (when (not (and emms-lastfm-session-id hunk ./emms-lastfm.el 248 +(defun emms-lastfm-current-unix-time () + (let* ((time (current-time)) + (high (car time)) + (low (cadr time))) + (+ (* high 1000) low))) + hunk ./emms-lastfm.el 256 - (let ((url-request-method "GET")) + (let ((url-request-method "GET") + (timestamp (number-to-string (emms-lastfm-current-unix-time)))) hunk ./emms-lastfm.el 260 - "?hs=true&p=1.1" + "?hs=true&p=1.2" hunk ./emms-lastfm.el 263 - "&u=" (emms-escape-url emms-lastfm-username)) + "&u=" (emms-escape-url emms-lastfm-username) + "&t=" timestamp + "&a=" (md5 (concat (md5 emms-lastfm-password) timestamp))) hunk ./emms-lastfm.el 274 - (re-search-forward (rx (or "UPTODATE" "UPDATE" "FAILED" "BADUSER")) - nil t) hunk ./emms-lastfm.el 275 - (if (not (string-match (rx (or "UPTODATE""UPDATE")) response)) - (progn - (cond ((string-match "FAILED" response) - (message "EMMS: Handshake failed: %s" response)) - ((string-match "BADUSER" response) - (message "EMMS: Wrong username")))) - (when (string-match "UPDATE" response) - (message "EMMS: There's a new last.fm plugin version")) + (if (not (string-match (rx (or "OK")) response)) + (message "EMMS: Handshake failed: %s" response) + (forward-line) + (setq emms-lastfm-session-id (emms-read-line)) hunk ./emms-lastfm.el 280 - (setq emms-lastfm-md5-challenge (emms-read-line)) + (setq emms-lastfm-now-playing-url (emms-read-line)) hunk ./emms-lastfm.el 283 - (message "EMMS: Handshaking with server done"))) - (kill-buffer buffer))) + (message "EMMS: Handshaking with server done") + (kill-buffer buffer))))) hunk ./emms-lastfm.el 292 + (track-number (emms-track-get emms-lastfm-current-track 'info-tracknumber)) hunk ./emms-lastfm.el 297 - (date (format-time-string "%Y-%m-%d %H:%M:%S" (current-time) t)) hunk ./emms-lastfm.el 305 - (concat "u=" (emms-escape-url emms-lastfm-username) - "&s=" (md5 (concat (md5 emms-lastfm-password) - emms-lastfm-md5-challenge)) + (concat "&s=" emms-lastfm-session-id hunk ./emms-lastfm.el 308 - "&b[0]=" (emms-escape-url album) - "&m[0]=" musicbrainz-id + "&i[0]=" (number-to-string emms-lastfm-current-track-starting-time) + "&o[0]=P" ;; TODO: Maybe support others. See the API. + "&r[0]=" ;; The rating. Empty if not applicable (for P it's not) hunk ./emms-lastfm.el 312 - "&i[0]=" date) + "&b[0]=" (emms-escape-url album) + "&n[0]=" track-number + "&m[0]=" musicbrainz-id) hunk ./emms-lastfm.el 331 - (message "EMMS: Song couldn't be submitted to last.fm") - (goto-char (point-min)) - (if (re-search-forward "^BADAUTH$" nil t) - ;; Somehow our md5-challenge expired... - (progn - (kill-buffer buffer) - (message "EMMS: Restarting last.fm plugin") - (emms-lastfm-restart)) - (kill-buffer buffer))))) + (message "EMMS: Song couldn't be submitted to last.fm: %s" + (emms-read-line))))) hunk ./emms-lastfm.el 358 - "handshake.php?version=" (number-to-string + "handshake.php?version=" (number-to-string } [bugfixes-for-scrobbling-api-1.2.dpatch Tassilo Horn **20080211114131] { hunk ./emms-lastfm.el 75 +;;; TODO: +;; +;; - Support now-playing infos on the last.fm user website. The url to use is +;; already stored in `emms-lastfm-now-playing-url'. + hunk ./emms-lastfm.el 141 -(defvar emms-lastfm-current-track-starting-time nil "-- only used internally --") +(defvar emms-lastfm-current-track-starting-time-string nil "-- only used internally --") hunk ./emms-lastfm.el 148 - (setq emms-lastfm-current-track-starting-time (emms-lastfm-current-unix-time)) + (setq emms-lastfm-current-track-starting-time-string (emms-lastfm-current-unix-time-string)) hunk ./emms-lastfm.el 253 -(defun emms-lastfm-current-unix-time () - (let* ((time (current-time)) - (high (car time)) - (low (cadr time))) - (+ (* high 1000) low))) +(defun emms-lastfm-current-unix-time-string () + (replace-regexp-in-string "\\..*" "" (number-to-string (float-time)))) hunk ./emms-lastfm.el 259 - (timestamp (number-to-string (emms-lastfm-current-unix-time)))) + (timestamp (emms-lastfm-current-unix-time-string))) hunk ./emms-lastfm.el 276 + ;; skip to the first empty line and go one line further. There the last.fm + ;; response starts. + (re-search-forward "^$" nil t) + (forward-line) hunk ./emms-lastfm.el 295 + (message "DEBUG emms-lastfm-submit-track called!") hunk ./emms-lastfm.el 315 - "&i[0]=" (number-to-string emms-lastfm-current-track-starting-time) + "&i[0]=" emms-lastfm-current-track-starting-time-string } [add-support-for-now-playing-infos-on-lastfm-page.dpatch Tassilo Horn **20080211121258] { hunk ./emms-lastfm.el 75 -;;; TODO: -;; -;; - Support now-playing infos on the last.fm user website. The url to use is -;; already stored in `emms-lastfm-now-playing-url'. - hunk ./emms-lastfm.el 84 +;;; Variables + hunk ./emms-lastfm.el 140 +;;; Scrobbling + hunk ./emms-lastfm.el 147 - (setq emms-lastfm-current-track-starting-time-string (emms-lastfm-current-unix-time-string)) + (setq emms-lastfm-current-track-starting-time-string + (emms-lastfm-current-unix-time-string)) hunk ./emms-lastfm.el 163 - (run-with-timer secs nil 'emms-lastfm-submit-track))))))) + (run-with-timer secs nil 'emms-lastfm-submit-track)))))) + ;; Update the now playing info displayed on the user's last.fm page. This + ;; doesn't affect the user's profile, so it con be done even for tracks that + ;; should not be submitted. + (emms-lastfm-submit-now-playing)) + +(defun emms-lastfm-submit-now-playing () + "Submit now-playing infos to last.fm. +These will be displayed on the user's last.fm page." + (let* ((artist (emms-track-get emms-lastfm-current-track 'info-artist)) + (title (emms-track-get emms-lastfm-current-track 'info-title)) + (album (emms-track-get emms-lastfm-current-track 'info-album)) + (track-number (emms-track-get emms-lastfm-current-track 'info-tracknumber)) + (musicbrainz-id "") + (track-length (number-to-string + (emms-track-get emms-lastfm-current-track + 'info-playing-time))) + (url-http-attempt-keepalives nil) + (url-show-status emms-lastfm-submission-verbose-p) + (url-request-method "POST") + (url-request-extra-headers + '(("Content-type" . + "application/x-www-form-urlencoded; charset=utf-8"))) + (url-request-data + (encode-coding-string + (concat "&s=" emms-lastfm-session-id + "&a[0]=" (emms-escape-url artist) + "&t[0]=" (emms-escape-url title) + "&b[0]=" (emms-escape-url album) + "&l[0]=" track-length + "&n[0]=" track-number + "&m[0]=" musicbrainz-id) + 'utf-8))) + (url-retrieve emms-lastfm-now-playing-url + 'emms-lastfm-submit-now-playing-sentinel))) + +(defun emms-lastfm-submit-now-playing-sentinel (&rest args) + "Parses the server reponse and inform the user if all worked +well or if an error occured." + (let ((buffer (current-buffer))) + (emms-http-decode-buffer buffer) + (goto-char (point-min)) + ;; skip to the first empty line and go one line further. There the last.fm + ;; response starts. + (re-search-forward "^$" nil t) + (forward-line) + (if (re-search-forward "^OK$" nil t) + (progn + (when emms-lastfm-submission-verbose-p + (message "EMMS: Now playing infos submitted to last.fm")) + (kill-buffer buffer)) + (message "EMMS: Now playing infos couldn't be submitted to last.fm: %s" + (emms-read-line))))) hunk ./emms-lastfm.el 302 - emms-lastfm-submit-url)) + emms-lastfm-submit-url + emms-lastfm-now-playing-url)) hunk ./emms-lastfm.el 348 - (message "DEBUG emms-lastfm-submit-track called!") hunk ./emms-lastfm.el 384 + ;; skip to the first empty line and go one line further. There the last.fm + ;; response starts. + (re-search-forward "^$" nil t) + (forward-line) hunk ./emms-lastfm.el 397 - } [add-todo-comment.dpatch Tassilo Horn **20080211141544] { hunk ./emms-lastfm.el 74 + +;;; TODO +;; +;; - Get the last.fm radio stuff right again. Currently the rating stuff seems +;; to be broken. There seems to be no official API, so one needs to look +;; into the sources of the official client which can be found at +;; http://www.audioscrobbler.net/development/client/. } Context: [emms-playlist-mode: Use current buffer for clear and kill. Michael Olson **20080130064148 In this case of the clear and kill commands, it makes the most sense to operate on the current buffer, rather than the currently-designated EMMS playlist buffer. Additionally, fix a bug when doing "a" or "RET" on something that isn't the current EMMS track. ] [emms-player-mpd (clear): Use current buffer if it is an EMMS playlist buffer. Michael Olson **20080130063956] [emms-player-mplayer.el: allow subtitle even for URLs Luca Capello **20080106152951] [emms-lastfm: Handle case where info-playing-time is unset for the current track Michael Olson **20080106233540] [delete-duplicate-def-of-emms-track-simple-description.dpatch Tassilo Horn **20071228191005 Mathias patch added a new definition without removing the old one. ] [Format URL so that it looks nicer in playlist. mathias.dahl@gmail.com**20071228085920] [emms-streams.el: add docstring for emms-stream-toggle-default-action lucas@rincevent.net**20071122153613] [emms-streams.el: update Philosomatika stream URL lucas@rincevent.net**20071122153554] [New var: emms-playlist-limit-hook. William Xu **20071121113028] [MPlayer supports .ape files now.(at least from 1.0rc2) William Xu **20071121112846] [When calling file-exists-p, make sure it's operated on a regular file. (This is the cause of the various tramp errors..) William Xu **20071104143856] [Only add emms-info-* to emms-info-functions when required program actually exists. William Xu **20071104132746] [emms-lyrics.el: (emms-lyrics-find-lyric), Use `emms-source-file-directory-tree-function' instead of forceful emms-source-file-gnu-find. William Xu **20071022090151] [Replace `nnheader-concat' with `concat + file-name-as-directory' to make XEmacs happy. William Xu **20071014063932] [Move emms config files to a common directory: ~/.emacs.d/emms. William Xu **20071012024503] [emms-playlist-limit.el: Fix typos and minor updates. William Xu **20071008070917] [emms-player-mplayer.el (emms-player-mplayer-subtitle-checker): Replace forcer@forcix.cx**20071003112650 / with _ in track names. ] [emms-browser.el: bind n and p to next- and previous-line. lucas@rincevent.net**20071002124109] [fix-next-line-warning.dpatch Tassilo Horn **20070906201831] [emms-lastfm: Allow emms-key-value to take a buffer argument. Michael Olson **20070906192215 I'm trying to track down some weird "error in process sentinel: delete-process: Selecting deleted buffer" errors that occur when I poll with emms-lastfm via a timer and start gnus (which blocks until it is finished retrieving email for all inboxes). These changes don't fix the problem, but they make me feel safer nonetheless :^) . I suspect that it might be caused by a URL.el bug involving deleting the wrong buffer which was pointed out by Diane Murray last month. ] [emms-browser: Fix compiler warning. Presumably the committer meant to write "performer" rather than "composer". Michael Olson **20070906191904] [format-spec expect spec character as a-zA-Z Ye Wenbin **20070902024848] [Error commentation in emms-i18n Ye Wenbin **20070902024825] [Wrong function in emms-history Ye Wenbin **20070902024732] [Simple players now use their regex property as they should. forcer@forcix.cx**20070827133149 emms-player-simple.el (define-emms-simple-player): `playablep' now uses `emms-player-get' for the regex property, instead of using the hardcoded regex, as it should. Thanks to Ye Wenbin for noticing this old bug. ] [fix-browser-covers.dpatch Tassilo Horn **20070829093557 - If emms-browser-covers value is a function, call it with a directory as its docs say. (Before it was called with a file) - Also add to its doc-string that its second arg is a symbol (its size). - Support all image types emacs knows. ] [lastfm: Allow user to specify which type of tracks get submitted Michael Olson **20070819170235] [emms-lastfm: New option emms-lastfm-submission-verbose-p Michael Olson **20070819153739 This controls whether EMMS notifies the user every time a track is submitted. The default is not to do so. ] [Drop eval-when-compile around (require 'overlay) Michael Olson **20070819150408] [Use slightly different XEmacs overlay fix Michael Olson **20070818185218] [XEmacs does not load the overlay functions by default: load them here. Nix **20070818134016] [Add support for composer and performer tags. Nix **20070818133412 The browser keybindings are somewhat discontiguous to avoid breaking people's finger macros: browsing by composer and performer are `b 5' and `b 6' respectively, where artist is `b 1'. In the tag editor, I changed the note format character to %;, making room for composer as %c. I've not added support to last.fm for composer or performer, as it doesn't seem to support either. (I suspect that in most cases the composer should be reported as the artist if it is present, but that is not impolemented here.) ] [docs-for-editing-tags-and-renaming.dpatch Tassilo Horn **20070817150402] [use-existing-functionality-for-renaming-files.dpatch Tassilo Horn **20070817100310 When I implemented the renaming stuff, I was not aware that Ye already thought of this feature. When editing a track, one can edit the filename and the file will be renamed and the cache updated. Now renaming by hitting `R' (`emms-tag-editor-rename') in the playlist makes use of this functionality instead of doing it on its own. ] [fix-cache-problem-when-renaming-tracks.dpatch Tassilo Horn **20070816070106 I fixed the problem with the cache I mentioned in my last patch. ] [support-for-renaming-files-with-tag-editor.dpatch Tassilo Horn **20070815183247 With `R' in a playlist (calls `emms-tag-editor-rename') the file(s) corresponding to the (marked) track(s) or the track at point will be renamed according to the format specified in `emms-tag-editor-rename-format'. Work ok for me, but there's a little problem maybe someone can fix: - If users use the cache it has to be updated somehow. `emms-cache-sync' seems to remove the renamed files. So you have to re-insert all renamed tracks to get them into the cache again. ] [refinements-and-docs-for-emms-history.dpatch Tassilo Horn **20070815080114 This path makes some refinements in emms-history.el: - Start playback after `emms-history-load' only if `emms-history-start-playing' is non-nil. - Added customization group emms-history - defvar -> defcustom - better docstrings and commentary - Added Info docs. (Node "Persistent Playlists") ] [emms-score.el: change score-file to something more sane lucas@rincevent.net**20070802210854 ~/.emms can be an EMMS config file, whereas ~/.emacs.d/ is already used to store the stream bookmarks file, so use it for the score file too. ] [make-S-prefix-key-for-sorting-functions.dpatch Tassilo Horn **20070802200758] [Fix compiler warning in emms-setup Michael Olson **20070723023532] [emms-playlist-limit: Use standard enable/disable/toggle interface Michael Olson **20070723023452] [emms-streams: New option emms-stream-repeat-p Michael Olson **20070723020304 Instead of assuming that everyone will want to automatically repeat a streamlist if it runs out of tracks, make this controlled by the `emms-stream-repeat-p' option, which defaults to nil. ] [emms-player-mpd: Fix bug with selecting an individual URL track to play from a streamlist Michael Olson **20070723015956] [emms-player-mpd: Make callback arg for emms-player-mpd-sync-from-emms optional Michael Olson **20070723015722] [emms-playlist-sort.el: Bind "s s" to emms-playlist-sort-by-score. William Xu **20070719065003] [emms-setup.el: Enable emms-score in emms-devel. William Xu **20070717131538] [emms-lyrics.el: Set default value for emms-lyrics-dir to ~/music/lyrics. William Xu **20070717100946] [emms-playlist-sort.el: Remove emms-playlist-sort-prefix to make the William Xu **20070717095454 codes more clean. And steal "s" prefix key from `emms-playlist-mode'. (An alternative for emms-playlist-mode could be "v", same as XMMS) ] [emms-playlist-limit.el: (define-emms-playlist-limit) Fix prompt string bug. William Xu **20070717082536] [make-number-of-secs-to-seek-configurable.dpatch Tassilo Horn **20070712062052 Patch sent by "Alfred M. Szmidt" in <20070711183504.EFD58301E5@Psilocybe.Update.UU.SE> on the emms-users list (with slight modifications). ] [Avoid even the most remote possibility of a conflict with color-theme.el and its very bad replace-in-string function Michael Olson **20070712211444] [emms-playlist-limit.el: Add missing line: (define-emms-playlist-limit info-title). William Xu **20070711071022] [emms-playlist-limit.el: Minor updates. William Xu **20070709103714] [emms-playlist-limit.el: Update Copyright to GPLv3. William Xu **20070708140012] [emms-playlist-sort.el: Minor updates. William Xu **20070708120050] [emms-playlist-limit.el: Redefine functions emms-playlist-limit-to-* with William Xu **20070708115907 macro: define-emms-playlist-limit. ] [emms-playlist-limit.el: Add default value based on track at point for William Xu **20070708040809 emms-playlist-limit-to-*. ] [New file: emms-playlist-limit.el. And minor updates to emms-playlist-sort. William Xu **20070705160221] [emms-player-mplayer.el: Add "eng.srt", "chs.srt", "cht.srt" to William Xu **20070630124728 emms-player-mplayer-subtitle-extensions. ] [Updated NEWS for post-3.0 forcer@forcix.cx**20070629163917] [TAG 3.0 forcer@forcix.cx**20070629163845] Patch bundle hash: 8cd02b80a30b36b0682148c42b82f25a3e3f4443