diff --git a/.local/share/common-lisp/source/ambrevar/file.lisp b/.local/share/common-lisp/source/ambrevar/file.lisp index bba00bcd..07971626 100644 --- a/.local/share/common-lisp/source/ambrevar/file.lisp +++ b/.local/share/common-lisp/source/ambrevar/file.lisp @@ -9,6 +9,9 @@ (trivial-package-local-nicknames:add-package-local-nickname :alex :alexandria) (trivial-package-local-nicknames:add-package-local-nickname :sera :serapeum)) +;; TODO: Allow some slots to modify file on disk. Transaction? +;; Could we edit files virtually nonetheless? Does that even make sense? + (sera:eval-always (defun name-identity (name definition) (declare (ignore definition)) @@ -230,3 +233,29 @@ See `%description'." (defun finder+mime (root &rest predicates) (let ((*finder-constructor* #'file+mime)) (apply #'finder root predicates))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defclass* mediafile (file+mime) ; REVIEW: Include MIME? + ((media-format nil + :type (or null ambrevar/ffprobe:media-format)) + (media-streams '() + :type (or null + (cons ambrevar/ffprobe:media-stream)))) + (:accessor-name-transformer #'name-identity)) + +(defmethod initialize-instance :after ((file mediafile) &key) + (let ((probe (ambrevar/ffprobe:ffprobe (path file)))) + (setf (media-format file) (first probe) + (media-streams file) (rest probe)))) + +(defun mediafile (path) + (make-instance 'mediafile :path path)) + +(defun mediawalk (root &rest predicates) + (let ((*finder-constructor* #'mediafile)) + (apply #'walk root predicates))) + +(defun mediafinder (root &rest predicates) + (let ((*finder-constructor* #'mediafile)) + (apply #'finder root predicates)))