From b6f307753fcdbc4d143a61094aa843847206f2ee Mon Sep 17 00:00:00 2001 From: Pierre Neidhardt Date: Fri, 15 Jan 2021 19:53:41 +0100 Subject: [PATCH] ambrevar/file: Add mediafile support. --- .../common-lisp/source/ambrevar/file.lisp | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) 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)))