emms-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emms-patches] darcs patch: browser/cache: support deleting files, make


From: Damien Elmes
Subject: [Emms-patches] darcs patch: browser/cache: support deleting files, make emms-cache...
Date: Fri, 22 Sep 2006 18:06:38 +0900 (JST)

Fri Sep 22 18:05:53 JST 2006  Damien Elmes <address@hidden>
  * browser/cache: support deleting files, make emms-cache-dirty a defsubst
New patches:

[browser/cache: support deleting files, make emms-cache-dirty a defsubst
Damien Elmes <address@hidden>**20060922090553] {
hunk ./emms-browser.el 75
+;; d               emms-browser-delete-files
hunk ./emms-browser.el 242
+;; Deleting files
+;; -------------------------------------------------------------------
+
+;; You can use the browser to delete tracks from your hard disk.
+;; Because this is dangerous, it is disabled by default.
+
+;; The following code will delete covers at the same time, and remove
+;; parent directories if they're now empty.
+
+;; (defun de-kill-covers-and-parents (dir tracks)
+;;   (when (> (length tracks) 1)
+;;     ;; if we're not deleting an individual file, delete covers too
+;;     (dolist (cover '("cover.jpg"
+;;                      "cover_med.jpg"
+;;                      "cover_small.jpg"
+;;                      "folder.jpg"))
+;;       (condition-case nil
+;;           (delete-file (concat dir cover))
+;;         (error nil)))
+;;     ;; try and delete empty parents - we actually do the work of the
+;;     ;; calling function here, too
+;;     (let (failed)
+;;       (while (and (not (string= dir "/"))
+;;                   (not failed))
+;;         (condition-case nil
+;;             (delete-directory dir)
+;;           (error (setq failed t)))
+;;         (setq dir (file-name-directory (directory-file-name dir)))))))
+;; (add-hook 'emms-browser-delete-files-hook 'de-kill-covers-and-parents)
+
hunk ./emms-browser.el 387
+(defcustom emms-browser-delete-files-hook nil
+  "*Hook run after files have been deleted.
+This hook can be used to clean up extra files, such as album covers.
+Called once for each directory."
+  :group 'emms-browser
+  :type 'hook)
+
hunk ./emms-browser.el 429
+    (define-key map (kbd "D") 'emms-browser-delete-files)
hunk ./emms-browser.el 887
+(defun emms-browser-tracks-at-point (&optional node)
+  "Return a list of tracks at point."
+  (let (tracks)
+    (dolist (node (if node
+                      node
+                    (emms-browser-data-at-point)))
+      (if (not (emms-browser-bdata-p node))
+          (setq tracks (cons node tracks))
+        (setq tracks
+              (append tracks
+                      (emms-browser-tracks-at-point
+                       (emms-browser-bdata-data node))))))
+    tracks))
+
hunk ./emms-browser.el 1089
+(defun emms-browser-go-to-parent ()
+  "Move point to the parent of the current node.
+Return point. If at level one, return the current point."
+  (let ((current-level (emms-browser-level-at-point)))
+    (unless (eq current-level 1)
+      (while (<= current-level (emms-browser-level-at-point))
+        (forward-line -1)))
+    (point)))
+
+(defun emms-browser-delete-current-node ()
+  "Remove the current node, and empty parents."
+  ;; set the data to empty
+  (setcdr (assq 'data (emms-browser-bdata-at-point)) nil)
+  (emms-browser-delete-node-if-empty))
+
+(defun emms-browser-delete-node-if-empty ()
+  "If empty, remove node and empty parents."
+  (when (zerop (length (emms-browser-data-at-point)))
+    (save-excursion
+      (let ((child-bdata (emms-browser-bdata-at-point))
+            parent-data parent-point)
+        ;; record the parent's position before we delete anything
+        (save-excursion
+          (setq parent-point (emms-browser-go-to-parent)))
+        ;; delete the current line
+        (when (emms-browser-subitems-visible)
+          (emms-browser-kill-subitems))
+        (emms-with-inhibit-read-only-t
+         (goto-char (point-at-bol))
+         (kill-line 1))
+        (unless (eq (emms-browser-bdata-level child-bdata) 1)
+          ;; remove the node from the parent, and recurse
+          (goto-char parent-point)
+          (setq parent-bdata (emms-browser-bdata-at-point))
+          (setcdr (assq 'data parent-bdata)
+                  (delq child-bdata
+                        (emms-browser-bdata-data parent-bdata)))
+          (emms-browser-delete-node-if-empty))))))
+
hunk ./emms-browser.el 1228
+(defun emms-browser-delete-files ()
+  "Delete all files under point.
+Disabled by default."
+  (interactive)
+  (let ((tracks (emms-browser-tracks-at-point))
+        dirs path)
+    (unless (yes-or-no-p
+             (format "Really permanently delete these %d tracks? "
+                     (length tracks)))
+      (error "Cancelled!"))
+    (dolist (track tracks)
+      (setq path (emms-track-get track 'name))
+      (delete-file path)
+      (add-to-list 'dirs (file-name-directory path))
+      (emms-cache-del path))
+    ;; remove empty dirs
+    (dolist (dir dirs)
+      (run-hook-with-args 'emms-browser-delete-files-hook dir tracks)
+      (condition-case nil
+          (delete-directory dir)
+        (error nil)))
+    ;; remove the item from the browser
+    (emms-browser-delete-current-node)))
+
+(put 'emms-browser-delete-files 'disabled t)
+
hunk ./emms-browser.el 1259
-
hunk ./emms-cache.el 107
-(defun emms-cache-dirty (&rest ignored)
+(defsubst emms-cache-dirty (&rest ignored)
hunk ./emms-cache.el 115
+;; Note we ignore TYPE, as it's stored in TRACK
hunk ./emms-cache.el 120
+
+(defun emms-cache-del (path)
+  "Remove a track from the cache, with key PATH."
+  (remhash path emms-cache-db)
+  (emms-cache-dirty))
}

Context:

[TAG 2.1
address@hidden 
Patch bundle hash:
7d2c49c371b06293d9a13888c0c378e1918407fa

reply via email to

[Prev in Thread] Current Thread [Next in Thread]