4
4
5
5
use std:: collections:: HashMap ;
6
6
use anyhow:: Error ;
7
+ use onetagger_renamer:: { Renamer , RenamerConfig , TemplateParser } ;
7
8
use rand:: seq:: SliceRandom ;
8
9
use std:: sync:: atomic:: { AtomicBool , Ordering } ;
9
10
use std:: sync:: { Arc , Mutex } ;
@@ -275,6 +276,7 @@ impl TrackImpl for Track {
275
276
}
276
277
277
278
// Album art
279
+ let mut cover_data = None ;
278
280
if ( config. overwrite_tag ( SupportedTag :: AlbumArt ) || tag. get_art ( ) . is_empty ( ) ) && self . art . is_some ( ) && config. tag_enabled ( SupportedTag :: AlbumArt ) {
279
281
info ! ( "Downloading art: {:?}" , self . art) ;
280
282
match self . download_art ( self . art . as_ref ( ) . unwrap ( ) ) {
@@ -289,15 +291,7 @@ impl TrackImpl for Track {
289
291
}
290
292
291
293
tag. set_art ( CoverType :: CoverFront , "image/jpeg" , Some ( "Cover" ) , data. clone ( ) ) ;
292
- // Save to file
293
- if config. album_art_file {
294
- let path = path. as_ref ( ) . parent ( ) . unwrap ( ) . join ( "cover.jpg" ) ;
295
- if !path. exists ( ) {
296
- if let Ok ( mut file) = File :: create ( path) {
297
- file. write_all ( & data) . ok ( ) ;
298
- }
299
- }
300
- }
294
+ cover_data = Some ( data) ;
301
295
} ,
302
296
None => warn ! ( "Invalid album art!" )
303
297
}
@@ -327,7 +321,24 @@ impl TrackImpl for Track {
327
321
}
328
322
329
323
// Save
330
- tag. save_file ( path. as_ref ( ) ) ?;
324
+ tag. save_file ( & path. as_ref ( ) ) ?;
325
+
326
+ // Cover file
327
+ if let Some ( cover_data) = cover_data {
328
+ match AudioFileInfo :: load_file ( & path, None , None ) {
329
+ Ok ( info) => {
330
+ let cover_path = get_cover_path ( & info, path. as_ref ( ) . parent ( ) . unwrap ( ) , config) ;
331
+ match std:: fs:: write ( & cover_path, cover_data) {
332
+ Ok ( _) => debug ! ( "Cover written to: {}" , cover_path. display( ) ) ,
333
+ Err ( e) => error ! ( "Failed to write cover file: {e}" ) ,
334
+ }
335
+ } ,
336
+ Err ( e) => {
337
+ error ! ( "Failed generating cover path: {e}" ) ;
338
+ }
339
+ }
340
+ }
341
+
331
342
Ok ( ( ) )
332
343
}
333
344
@@ -379,6 +390,23 @@ impl TrackImpl for Track {
379
390
380
391
}
381
392
393
+ /// Get path to cover file
394
+ fn get_cover_path ( info : & AudioFileInfo , folder : impl AsRef < Path > , config : & TaggerConfig ) -> PathBuf {
395
+ let mut path = folder. as_ref ( ) . join ( "cover.jpg" ) ;
396
+
397
+ if let Some ( template) = config. cover_filename . as_ref ( ) {
398
+ if !template. trim ( ) . is_empty ( ) {
399
+ // Generate new filename
400
+ let renamer_config = RenamerConfig :: default_with_paths ( & folder, template) ;
401
+ let mut renamer = Renamer :: new ( TemplateParser :: parse ( template) ) ;
402
+ let new_path = renamer. generate_name ( folder. as_ref ( ) , info, & renamer_config) ;
403
+ path = new_path. with_extension ( "jpg" ) ;
404
+ }
405
+ }
406
+
407
+ path
408
+ }
409
+
382
410
pub trait AudioFileInfoImpl {
383
411
/// Load audio file info from path
384
412
fn load_file ( path : impl AsRef < Path > , filename_template : Option < Regex > , title_regex : Option < Regex > ) -> Result < AudioFileInfo , Error > ;
0 commit comments