@@ -121,20 +121,59 @@ let status { status } = Atomic.get status
121121let indicator ?(metadata = Frame.Metadata. empty) ?temporary s =
122122 { uri = home_unrelate s; temporary = temporary = Some true ; metadata }
123123
124- (* * Length *)
124+ type dresolver = {
125+ dpriority : unit -> int ;
126+ file_extensions : unit -> string list ;
127+ dresolver : metadata :Frame .metadata -> string -> float ;
128+ }
129+
125130let dresolvers_doc = " Methods to extract duration from a file."
126131
127- let dresolvers = Plug. create ~doc: dresolvers_doc " audio file formats (duration)"
132+ let conf_dresolvers =
133+ Dtools.Conf. list ~p: (conf#plug " dresolvers" ) ~d: []
134+ " Methods to extract file duration."
135+
136+ let f c v =
137+ match c#get_d with
138+ | None -> c#set_d (Some [v])
139+ | Some d -> c#set_d (Some (d @ [v]))
140+
141+ let dresolvers =
142+ Plug. create ~doc: dresolvers_doc
143+ ~register_hook: (fun name _ -> f conf_dresolvers name)
144+ " audio file formats (duration)"
145+
146+ let get_dresolvers ~file () =
147+ let extension = try Utils. get_ext file with _ -> " " in
148+ let f cur name =
149+ match Plug. get dresolvers name with
150+ | Some ({ file_extensions } as p)
151+ when List. mem extension (file_extensions () ) ->
152+ (name, p) :: cur
153+ | Some _ -> cur
154+ | None ->
155+ log#severe " Cannot find duration resolver %s" name;
156+ cur
157+ in
158+ let resolvers = List. fold_left f [] conf_dresolvers#get in
159+ List. sort
160+ (fun (_ , a ) (_ , b ) -> compare (b.dpriority () ) (a.dpriority () ))
161+ resolvers
128162
129163let compute_duration ~metadata file =
130164 try
131- Plug. iter dresolvers (fun _ resolver ->
165+ List. iter
166+ (fun (name , { dpriority; dresolver } ) ->
132167 try
133- let ans = resolver ~metadata file in
168+ log#info " Trying duration resolver %s (priority: %d) for file %s.."
169+ name (dpriority () )
170+ (Lang_string. quote_string file);
171+ let ans = dresolver ~metadata file in
134172 raise (Duration ans)
135173 with
136174 | Duration e -> raise (Duration e)
137- | _ -> () );
175+ | _ -> () )
176+ (get_dresolvers ~file () );
138177 raise Not_found
139178 with Duration d -> d
140179
0 commit comments