summaryrefslogtreecommitdiff
path: root/zipper.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'zipper.lisp')
-rw-r--r--zipper.lisp34
1 files changed, 34 insertions, 0 deletions
diff --git a/zipper.lisp b/zipper.lisp
new file mode 100644
index 0000000..4d80f59
--- /dev/null
+++ b/zipper.lisp
@@ -0,0 +1,34 @@
+;;;; zipper.lisp
+
+(in-package :vampire)
+
+(defun clean-slashes (str)
+ (cl-ppcre:regex-replace-all "/" str "-"))
+
+(defun zip-playlist (playlist)
+ (let* ((tracks (zip-playlist-filenames playlist))
+ (out (format nil "public/static/~a.zip" (clean-slashes (playlist-title playlist)))))
+ (org.shirakumo.zippy:compress-zip tracks out)))
+
+(defun zip-track-filename (track pos playlist)
+ (with-slots (artist album title codec) track
+ (format nil "~a/~2,'0d-~a-~a-~a.~a" (zip-playlist-dir playlist) pos
+ (clean-slashes artist) (clean-slashes album) (clean-slashes title) codec)))
+
+(defun zip-playlist-dir (playlist)
+ (format nil "public/static/downloads/~a/" (clean-slashes (playlist-title playlist))))
+
+(defun zip-playlist-filenames (playlist)
+ (loop for track in (playlist-tracks playlist)
+ for i from 1
+ collect (zip-track-filename track i playlist)))
+
+(defun copy-audio-files-for-download (playlist)
+ (ensure-directories-exist #P"public/static/downloads/")
+ (let ((audio-files (mapcar #'track-file (playlist-tracks playlist)))
+ (dest-files (zip-playlist-filenames playlist))
+ (dest-dir (zip-playlist-dir playlist)))
+ (ensure-directories-exist dest-dir)
+ (loop for file in audio-files
+ for dest in dest-files
+ do (uiop:copy-file file (format nil "~a~a" dest-dir dest)))))