;;;; 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)))))