ambrevar/file: Add mediafile support.

master
Pierre Neidhardt 2021-01-15 19:53:41 +01:00
parent 54ef9aaaed
commit b6f307753f
1 changed files with 29 additions and 0 deletions

View File

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