New patches: [abstract-POST-and-GET-requests-in-own-functions.dpatch Tassilo Horn **20080212090550] { hunk ./emms-lastfm.el 176 +(defun emms-lastfm-http-POST (url string sentinel &optional sentinel-args) + "Perform a HTTP POST request to URL using STRING as data. +STRING will be encoded to utf8 before the request. Call SENTINEL +with the result buffer." + (let ((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 string 'utf-8))) + (url-retrieve url sentinel sentinel-args))) + +(defun emms-lastfm-http-GET (url sentinel &optional sentinel-args) + "Perform a HTTP GET request to URL. +Call SENTINEL with SENTINEL-ARGS and the result buffer." + (let ((url-show-status emms-lastfm-submission-verbose-p) + (url-request-method "GET")) + (url-retrieve url sentinel sentinel-args))) + hunk ./emms-lastfm.el 202 - (track-number (emms-track-get emms-lastfm-current-track 'info-tracknumber)) + (track-number (emms-track-get emms-lastfm-current-track + 'info-tracknumber)) hunk ./emms-lastfm.el 207 - '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))) + 'info-playing-time)))) + ;; wait up to 5 seconds to submit np infos in order to finish handshaking. + (dotimes (i 5) + (when (not (and emms-lastfm-session-id + emms-lastfm-now-playing-url)) + (sit-for 1))) + (when (and emms-lastfm-session-id + emms-lastfm-now-playing-url) + (emms-lastfm-http-POST emms-lastfm-now-playing-url + (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) + 'emms-lastfm-submit-now-playing-sentinel)))) hunk ./emms-lastfm.el 337 - (let ((url-request-method "GET") - (timestamp (emms-lastfm-current-unix-time-string))) - (url-retrieve + (let ((timestamp (emms-lastfm-current-unix-time-string))) + (emms-lastfm-http-GET hunk ./emms-lastfm.el 380 - '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) - "&i[0]=" emms-lastfm-current-track-starting-time-string - "&o[0]=P" ;; TODO: Maybe support others. See the API. - "&r[0]=" ;; The rating. Empty if not applicable (for P it's not) - "&l[0]=" track-length - "&b[0]=" (emms-escape-url album) - "&n[0]=" track-number - "&m[0]=" musicbrainz-id) - 'utf-8))) - (url-retrieve emms-lastfm-submit-url - 'emms-lastfm-submission-sentinel))) + 'info-playing-time)))) + (emms-lastfm-http-POST + emms-lastfm-submit-url + (concat "&s=" emms-lastfm-session-id + "&a[0]=" (emms-escape-url artist) + "&t[0]=" (emms-escape-url title) + "&i[0]=" emms-lastfm-current-track-starting-time-string + "&o[0]=P" ;; TODO: Maybe support others. See the API. + "&r[0]=" ;; The rating. Empty if not applicable (for P it's not) + "&l[0]=" track-length + "&b[0]=" (emms-escape-url album) + "&n[0]=" track-number + "&m[0]=" musicbrainz-id) + 'emms-lastfm-submission-sentinel))) hunk ./emms-lastfm.el 447 - (let ((url-request-method "GET")) - (url-retrieve (emms-lastfm-radio-get-handshake-url) - 'emms-lastfm-radio-handshake-sentinel - (list fn radio-url)))) + (emms-lastfm-http-GET (emms-lastfm-radio-get-handshake-url) + 'emms-lastfm-radio-handshake-sentinel + (list fn radio-url))) hunk ./emms-lastfm.el 467 - (let ((url-request-method "GET")) - (url-retrieve + (progn + (emms-lastfm-http-GET hunk ./emms-lastfm.el 603 - (let ((url-request-method "GET")) - (url-retrieve - (concat emms-lastfm-radio-base-url - "control.php?" - "session=" emms-lastfm-radio-session - "&command=" command - "&debug=" (number-to-string 0)) - 'emms-lastfm-radio-rating-sentinel))) + (emms-lastfm-http-GET + (concat emms-lastfm-radio-base-url + "control.php?" + "session=" emms-lastfm-radio-session + "&command=" command + "&debug=" (number-to-string 0)) + 'emms-lastfm-radio-rating-sentinel)) hunk ./emms-lastfm.el 628 - (let ((url-request-method "GET") - (url-show-status nil)) - (url-retrieve - (concat emms-lastfm-radio-base-url - "np.php?" - "session=" emms-lastfm-radio-session - "&debug=" (number-to-string 0)) - (or fn 'emms-lastfm-radio-request-metadata-sentinel) - data))) + (emms-lastfm-http-GET + (concat emms-lastfm-radio-base-url + "np.php?" + "session=" emms-lastfm-radio-session + "&debug=" (number-to-string 0)) + (or fn 'emms-lastfm-radio-request-metadata-sentinel) + data)) } [(emms-lastfm-radio-request-metadata-sentinel): Let `emms-track-updated' take care of updating track info. William Xu **20080212041204] { hunk ./emms-lastfm.el 640 - (title (emms-key-value "track" buffer))) + (title (emms-key-value "track" buffer)) + (track (emms-playlist-current-selected-track))) hunk ./emms-lastfm.el 643 - (setq emms-mode-line-string (format emms-mode-line-format - (concat artist " - " title))) - (force-mode-line-update)))) + (emms-track-set track 'info-artist artist) + (emms-track-set track 'info-title title) + (emms-track-updated track)))) hunk ./emms-mode-line.el 57 - "Format the currently playing song" + "Format the currently playing song." } [- emms-url.el: (emms-url-quote, emms-url-quote-plus), New functions William Xu **20080212064822 renamed from emms-lyrics-url-quote, emms-lyrics-url-quote-plus defined in emms-lyrics.el. - emms-url.el: (emms-escape-url, emms-url-specials), deleted, since they can only escape ASCII characters, emms-url-quote can handle all characters. - Update affected files accordingly. ] { merger 0.0 ( hunk ./emms-lastfm.el 207 - '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))) + 'info-playing-time)))) + ;; wait up to 5 seconds to submit np infos in order to finish handshaking. + (dotimes (i 5) + (when (not (and emms-lastfm-session-id + emms-lastfm-now-playing-url)) + (sit-for 1))) + (when (and emms-lastfm-session-id + emms-lastfm-now-playing-url) + (emms-lastfm-http-POST emms-lastfm-now-playing-url + (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) + 'emms-lastfm-submit-now-playing-sentinel)))) hunk ./emms-lastfm.el 217 - "&a[0]=" (emms-escape-url artist) - "&t[0]=" (emms-escape-url title) - "&b[0]=" (emms-escape-url album) + "&a[0]=" (emms-url-quote artist) + "&t[0]=" (emms-url-quote title) + "&b[0]=" (emms-url-quote album) ) hunk ./emms-lastfm.el 345 - "&u=" (emms-escape-url emms-lastfm-username) + "&u=" (emms-url-quote emms-lastfm-username) merger 0.0 ( hunk ./emms-lastfm.el 382 - '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) - "&i[0]=" emms-lastfm-current-track-starting-time-string - "&o[0]=P" ;; TODO: Maybe support others. See the API. - "&r[0]=" ;; The rating. Empty if not applicable (for P it's not) - "&l[0]=" track-length - "&b[0]=" (emms-escape-url album) - "&n[0]=" track-number - "&m[0]=" musicbrainz-id) - 'utf-8))) - (url-retrieve emms-lastfm-submit-url - 'emms-lastfm-submission-sentinel))) + 'info-playing-time)))) + (emms-lastfm-http-POST + emms-lastfm-submit-url + (concat "&s=" emms-lastfm-session-id + "&a[0]=" (emms-escape-url artist) + "&t[0]=" (emms-escape-url title) + "&i[0]=" emms-lastfm-current-track-starting-time-string + "&o[0]=P" ;; TODO: Maybe support others. See the API. + "&r[0]=" ;; The rating. Empty if not applicable (for P it's not) + "&l[0]=" track-length + "&b[0]=" (emms-escape-url album) + "&n[0]=" track-number + "&m[0]=" musicbrainz-id) + 'emms-lastfm-submission-sentinel))) hunk ./emms-lastfm.el 392 - "&a[0]=" (emms-escape-url artist) - "&t[0]=" (emms-escape-url title) + "&a[0]=" (emms-url-quote artist) + "&t[0]=" (emms-url-quote title) ) merger 0.0 ( merger 0.0 ( hunk ./emms-lastfm.el 392 - "&a[0]=" (emms-escape-url artist) - "&t[0]=" (emms-escape-url title) + "&a[0]=" (emms-url-quote artist) + "&t[0]=" (emms-url-quote title) hunk ./emms-lastfm.el 382 - '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) - "&i[0]=" emms-lastfm-current-track-starting-time-string - "&o[0]=P" ;; TODO: Maybe support others. See the API. - "&r[0]=" ;; The rating. Empty if not applicable (for P it's not) - "&l[0]=" track-length - "&b[0]=" (emms-escape-url album) - "&n[0]=" track-number - "&m[0]=" musicbrainz-id) - 'utf-8))) - (url-retrieve emms-lastfm-submit-url - 'emms-lastfm-submission-sentinel))) + 'info-playing-time)))) + (emms-lastfm-http-POST + emms-lastfm-submit-url + (concat "&s=" emms-lastfm-session-id + "&a[0]=" (emms-escape-url artist) + "&t[0]=" (emms-escape-url title) + "&i[0]=" emms-lastfm-current-track-starting-time-string + "&o[0]=P" ;; TODO: Maybe support others. See the API. + "&r[0]=" ;; The rating. Empty if not applicable (for P it's not) + "&l[0]=" track-length + "&b[0]=" (emms-escape-url album) + "&n[0]=" track-number + "&m[0]=" musicbrainz-id) + 'emms-lastfm-submission-sentinel))) ) hunk ./emms-lastfm.el 398 - "&b[0]=" (emms-escape-url album) + "&b[0]=" (emms-url-quote album) ) hunk ./emms-lastfm.el 450 - "&username=" (emms-escape-url emms-lastfm-username) + "&username=" (emms-url-quote emms-lastfm-username) hunk ./emms-lastfm.el 482 - "&url=" (emms-escape-url lastfm-url) + "&url=" (emms-url-quote lastfm-url) hunk ./emms-lyrics.el 68 +(require 'emms-url) hunk ./emms-lyrics.el 222 - (emms-lyrics-url-quote-plus + (emms-url-quote-plus hunk ./emms-lyrics.el 227 - (emms-lyrics-url-quote-plus title))))) + (emms-url-quote-plus title))))) hunk ./emms-lyrics.el 480 - -;;; Utilities - -(defun emms-lyrics-url-quote (s &optional safe) - "Replace special characters in S using the `%xx' escape. -Characters in [a-zA-Z_.-/] and SAFE(default is \"\")) will never be -quoted. -e.g., - (url-quote \"abc def\") => \"abc%20def\"." - (or safe (setq safe "")) - (mapconcat (lambda (c) - (if (if (string-match "]" safe) - ;; ] should be place at the beginning inside [] - (string-match - (format "[]a-zA-Z_.-/%s]" - (replace-regexp-in-string "]" "" safe)) - (char-to-string c)) - (string-match (format "[a-zA-Z_.-/%s]" safe) - (char-to-string c))) - (char-to-string c) - (format "%%%02x" c))) - (string-to-list (encode-coding-string s 'utf-8)) - "")) - -(defun emms-lyrics-url-quote-plus (s &optional safe) - "Run (emms-url-quote s \" \"), then replace ` ' with `+'." - (replace-regexp-in-string - " " "+" (emms-lyrics-url-quote s (concat safe " ")))) - hunk ./emms-player-mpd.el 761 - (url-insert-file-contents (emms-escape-url url)) + (url-insert-file-contents (emms-url-quote url)) hunk ./emms-url.el 29 +(require 'emms-compat) hunk ./emms-url.el 31 -(defvar emms-url-specials - '((?\ . "%20") - (?\n . "%0D%0A") - (?& . "%26") - (?? . "%3F")) - "*An alist of characters which must be represented specially in URLs. -The transformation is the key of the pair.") +(defun emms-url-quote (s &optional safe) + "Replace special characters in S using the `%xx' escape. +Characters in [a-zA-Z_.-/] and SAFE(default is \"\") will never be +quoted. +e.g., + (url-quote \"abc def\") => \"abc%20def\"." + (or safe (setq safe "")) + (mapconcat (lambda (c) + (if (if (string-match "]" safe) + ;; ] should be place at the beginning inside [] + (string-match + (format "[]a-zA-Z_.-/%s]" + (emms-replace-regexp-in-string "]" "" safe)) + (char-to-string c)) + (string-match (format "[a-zA-Z_.-/%s]" safe) + (char-to-string c))) + (char-to-string c) + (format "%%%02x" c))) + (string-to-list (encode-coding-string s 'utf-8)) + "")) hunk ./emms-url.el 52 -(defun emms-escape-url (url) - "Escape specials in URL. - -The specials to escape are specified by the `emms-url-specials' -variable." - (apply (function concat) - (mapcar - (lambda (ch) - (let ((repl (assoc ch emms-url-specials))) - (if (null repl) - (char-to-string ch) - (cdr repl)))) - (append url nil)))) +(defun emms-url-quote-plus (s &optional safe) + "Run (emms-url-quote s \" \"), then replace ` ' with `+'." + (emms-replace-regexp-in-string + " " "+" (emms-url-quote s (concat safe " ")))) } [Resolve conflicts with Tassilo's repo. William Xu **20080212103958] { hunk ./emms-lastfm.el 207 - '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))) + 'info-playing-time)))) + ;; wait up to 5 seconds to submit np infos in order to finish handshaking. + (dotimes (i 5) + (when (not (and emms-lastfm-session-id + emms-lastfm-now-playing-url)) + (sit-for 1))) + (when (and emms-lastfm-session-id + emms-lastfm-now-playing-url) + (emms-lastfm-http-POST emms-lastfm-now-playing-url + (concat "&s=" emms-lastfm-session-id + "&a[0]=" (emms-url-quote artist) + "&t[0]=" (emms-url-quote title) + "&b[0]=" (emms-url-quote album) + "&l[0]=" track-length + "&n[0]=" track-number + "&m[0]=" musicbrainz-id) + 'emms-lastfm-submit-now-playing-sentinel)))) hunk ./emms-lastfm.el 380 - '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) - "&i[0]=" emms-lastfm-current-track-starting-time-string - "&o[0]=P" ;; TODO: Maybe support others. See the API. - "&r[0]=" ;; The rating. Empty if not applicable (for P it's not) - "&l[0]=" track-length - "&b[0]=" (emms-escape-url album) - "&n[0]=" track-number - "&m[0]=" musicbrainz-id) - 'utf-8))) - (url-retrieve emms-lastfm-submit-url - 'emms-lastfm-submission-sentinel))) + 'info-playing-time)))) + (emms-lastfm-http-POST + emms-lastfm-submit-url + (concat "&s=" emms-lastfm-session-id + "&a[0]=" (emms-url-quote artist) + "&t[0]=" (emms-url-quote title) + "&i[0]=" emms-lastfm-current-track-starting-time-string + "&o[0]=P" ;; TODO: Maybe support others. See the API. + "&r[0]=" ;; The rating. Empty if not applicable (for P it's not) + "&l[0]=" track-length + "&b[0]=" (emms-url-quote album) + "&n[0]=" track-number + "&m[0]=" musicbrainz-id) + 'emms-lastfm-submission-sentinel))) } Context: [add-todo-comment.dpatch Tassilo Horn **20080211141544] [add-support-for-now-playing-infos-on-lastfm-page.dpatch Tassilo Horn **20080211121258] [bugfixes-for-scrobbling-api-1.2.dpatch Tassilo Horn **20080211114131] [push-lastfm-submission-api-to-1.2.dpatch Tassilo Horn **20080211102659] [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. address@hidden [emms-streams.el: add docstring for emms-stream-toggle-default-action address@hidden [emms-streams.el: update Philosomatika stream URL address@hidden [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 address@hidden / with _ in track names. ] [emms-browser.el: bind n and p to next- and previous-line. address@hidden [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. address@hidden 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 address@hidden ~/.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 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 address@hidden [TAG 3.0 address@hidden Patch bundle hash: fc36090f60182b26d96d37325a2545aaf2262f2d