diff options
author | Grant Shangreaux <grant@unabridgedsoftware.com> | 2022-12-30 20:55:05 -0600 |
---|---|---|
committer | Grant Shangreaux <grant@unabridgedsoftware.com> | 2023-01-07 14:22:47 -0600 |
commit | 745ada638b3f82b4e3076dd75d0fe8c0a47bfb31 (patch) | |
tree | 47a4f0a58d626137d009254dcd9dba590bc29c8b | |
parent | 7a1e8d41ce96a7514adb31529f05aaed6a13c259 (diff) |
Add: zip/download UI and deletion of archive on playlist edit
- Clicking the button will zip the playlist (if there is no zip
archive already existing)
- editing a playlist will delete the zip file
-rw-r--r-- | playlist.lisp | 30 | ||||
-rw-r--r-- | vampire.asd | 3 | ||||
-rw-r--r-- | zipper.lisp | 20 |
3 files changed, 33 insertions, 20 deletions
diff --git a/playlist.lisp b/playlist.lisp index f7f0b04..7a2884b 100644 --- a/playlist.lisp +++ b/playlist.lisp @@ -3,7 +3,7 @@ (in-package :vampire) -;;; CLIENT STATE +;;; CLIENT STATE (defclass/std playlist-ctl () ((playlist :std nil :doc "The playlist instance.") @@ -14,7 +14,6 @@ :std nil :doc "Now Playing Elements") (pl-title pl-tracks pl-dur :std nil :doc "Playlist Elements") - (zipped :std nil :doc "Path to the zipped playlist, if it exists.")) (:documentation "Holds the complete state for this session's viewing of a particular playlist.")) (defclass/std track-ctl () @@ -49,7 +48,7 @@ (when (plusp pos) (nth (1- pos) (tracks ctl))))) -;;; SESSION UTIL +;;; SESSION UTIL (defparameter +playlist-connection-key+ "playlist-connection-key" "Stored in the clog connection object") @@ -65,6 +64,7 @@ (setf (cur-playlist-ctl body) (make-instance 'playlist-ctl :playlist playlist + :zipped-tracks (when (zipped-playlist-exists-p playlist) (zipped-playlist-url playlist)) :editorp (can-edit-p (session-user body) playlist)))) ;;; SYNCHRONIZATION @@ -189,10 +189,11 @@ (curctl (cur-playlist-ctl container)) (pos (position track-ctl (tracks curctl)))) - (when (delete-track-at (playlist curctl) pos) + (when (delete-track-at (playlist curctl) pos) + (delete-zipped-playlist (playlist curctl)) (for-playlist-viewers container ctl (let ((track-ctl (nth pos (tracks ctl)))) - (destroy (container track-ctl)) + (destroy (container track-ctl)) (setf (tracks ctl) (delete track-ctl (tracks ctl)) (text (pl-dur ctl)) (secs-to-hms (playlist-duration (playlist ctl))))))))) @@ -200,6 +201,7 @@ (when-let* ((curctl (cur-playlist-ctl (container track-ctl))) (pos (position track-ctl (tracks curctl)))) (when (swap-tracks (playlist curctl) pos (1+ pos)) + (delete-zipped-playlist (playlist curctl)) (for-playlist-viewers (container track-ctl) ctl (let* ((cur (nth pos (tracks ctl))) @@ -215,6 +217,7 @@ (when-let* ((curctl (cur-playlist-ctl (container track-ctl))) (pos (position track-ctl (tracks curctl)))) (when (swap-tracks (playlist curctl) pos (1- pos)) + (delete-zipped-playlist (playlist curctl)) (for-playlist-viewers (container track-ctl) ctl (let* ((cur (nth pos (tracks ctl))) @@ -348,13 +351,14 @@ (on-ok (lambda (track) (destroy notice) + (delete-zipped-playlist pl) (append-track pl track) (append-track-list-item parent track)))) (setf (value url-input) "") (if-let (track (track-with-source url)) (funcall on-ok track) (add-fetch-track-job - url on-ok + url on-ok (lambda (err) (destroy notice) (format t "~a" err) @@ -393,7 +397,7 @@ (thunk* (let ((user (user-with-name (value userinput)))) (cond - (user + (user (add-editor playlist user) (setf (value userinput) "" (text username-status) "") @@ -439,20 +443,17 @@ (div (:class "row") (div () - (button (:content "Create Playlist Zip" :bind download)) - (a (:link (zipped ctl) :content "Download" :bind dl-link))) + (button (:content "Download Zipped Playlist" :bind zip-download-button))) (div () (new-track-form (pl)) (editor-managment (pl))))) - (set-on-click download (thunk* - (setf (zipped ctl) (zip-playlist pl) - (link dl-link) (zipped ctl) - (display dl-link) "inline"))) + (set-on-click zip-download-button + (thunk* (zip-playlist pl) + (setf (url (location body)) (zipped-playlist-url pl)))) (setf (pl-title ctl) title-elem (pl-dur ctl) dur-elem (display input) "none" - (display dl-link) "none" (display title-elem) "inline") (when (playlist-editors pl) @@ -471,6 +472,7 @@ input (thunk* (when (plusp (length (value input))) + (delete-zipped-playlist pl) ;; must happen first (update-playlist-title pl (value input)) (setf (text title-elem) (value input))) (setf (display input) "none" diff --git a/vampire.asd b/vampire.asd index ac49ea3..9014aa8 100644 --- a/vampire.asd +++ b/vampire.asd @@ -33,4 +33,5 @@ (:file "home") (:file "playlist") (:file "vampire") - (:file "run"))) + (:file "run") + (:file "zipper"))) diff --git a/zipper.lisp b/zipper.lisp index 36e62f9..ede4a71 100644 --- a/zipper.lisp +++ b/zipper.lisp @@ -4,11 +4,13 @@ (defun zip-playlist (playlist) "Compresses playlist tracks into a zip archive." - (with-temp-dir (tmpdir) - (let ((zip-dir (zipped-playlist-path))) - (ensure-directories-exist zip-dir) - (org.shirakumo.zippy:compress-zip - (copy-audio-files-for-download playlist tmpdir) zip-dir :if-exists :overwrite)))) + (ensure-directories-exist (merge-pathnames "media/bundled-playlists/" (static-directory *config*))) + (unless (zipped-playlist-exists-p playlist) + (let ((zip-file (zipped-playlist-path playlist))) + (with-temp-dir (tmpdir) + (with-open-file (_foo zip-file :if-does-not-exist :create :direction :output :if-exists :overwrite) + (org.shirakumo.zippy:compress-zip + (copy-audio-files-for-download playlist tmpdir) zip-file :if-exists :overwrite)))))) (defun zip-track-filename (track pos) "Return a filename for a track. `NN-ARTIST-ALBUM-TITLE.CODEC'" @@ -29,6 +31,9 @@ "Returns the url where the playlist's zip file is expected to exist." (merge-pathnames (zipped-playlist-filename playlist) "/media/bundled-playlists/")) +(defun zipped-playlist-exists-p (playlist) + (uiop:file-exists-p (zipped-playlist-path playlist))) + (defun copy-audio-files-for-download (playlist dir) "Copies all playlist tracks into a temporary directory and returns a list of the pathnames." (loop for track in (playlist-tracks playlist) @@ -37,3 +42,8 @@ for dest = (merge-pathnames (zip-track-filename track pos) dir) do (uiop:copy-file file dest) collect dest)) + +(defun delete-zipped-playlist (playlist) + "Deletes the zipped playlist file. Returns T if it was deleted, NIL otherwise." + (princ "Deleting zipped playlist") + (uiop:delete-file-if-exists (zipped-playlist-path playlist))) |