@@ -30,6 +30,7 @@ import (
30
30
"unicode"
31
31
32
32
"github.com/davidbyttow/govips/v2/vips"
33
+ "github.com/dhowden/tag"
33
34
"github.com/gabriel-vasile/mimetype"
34
35
"github.com/kenshaw/colors"
35
36
"github.com/kenshaw/fontimg"
@@ -115,14 +116,15 @@ func run(w io.Writer, args *Args) func(context.Context, []string) error {
115
116
for i := 0 ; i < len (cliargs ); i ++ {
116
117
v , err := open (cliargs [i ])
117
118
if err != nil {
118
- fmt .Fprintf (w , "error: unable to open arg %d: %v\n " , i , err )
119
+ fmt .Fprintf (w , "error: unable to open arg %d: %v\n \n " , i , err )
120
+ } else {
121
+ files = append (files , v ... )
119
122
}
120
- files = append (files , v ... )
121
123
}
122
124
// render
123
125
for i := 0 ; i < len (files ); i ++ {
124
126
if err := args .render (w , files [i ]); err != nil {
125
- fmt .Fprintf (w , "error: unable to render arg %d: %v\n " , i , err )
127
+ fmt .Fprintf (w , "error: unable to render arg %d: %v\n \n " , i , err )
126
128
}
127
129
}
128
130
return nil
@@ -202,6 +204,8 @@ func (args *Args) renderFile(name string) (image.Image, string, error) {
202
204
g = args .renderFont
203
205
case strings .HasPrefix (typ , "video/" ):
204
206
g , notStream = args .renderFfmpeg , true
207
+ case strings .HasPrefix (typ , "audio/" ):
208
+ g = args .renderTag
205
209
default :
206
210
return nil , "" , fmt .Errorf ("mime type %q not supported" , typ )
207
211
}
@@ -493,6 +497,24 @@ func (args *Args) vipsExport(v *vips.ImageRef) (image.Image, error) {
493
497
return img , nil
494
498
}
495
499
500
+ // renderTag renders the embedded picture from music metadata (ie, album art).
501
+ func (args * Args ) renderTag (r io.Reader , _ string ) (image.Image , error ) {
502
+ f , ok := r .(* os.File )
503
+ if ! ok {
504
+ return nil , fmt .Errorf ("must take *os.File, got: %T" , r )
505
+ }
506
+ md , err := tag .ReadFrom (f )
507
+ if err != nil {
508
+ return nil , err
509
+ }
510
+ pic := md .Picture ()
511
+ if pic == nil {
512
+ return nil , errors .New ("no embedded picture" )
513
+ }
514
+ img , _ , err := image .Decode (bytes .NewReader (pic .Data ))
515
+ return img , err
516
+ }
517
+
496
518
// addBackground adds a background to a image.
497
519
func (args * Args ) addBackground (fg image.Image , typ string ) image.Image {
498
520
if args .bgc == nil || typ == "image/svg" {
@@ -763,6 +785,7 @@ var (
763
785
var extensions = map [string ]bool {
764
786
"3g2" : true ,
765
787
"3gp" : true ,
788
+ "aac" : true ,
766
789
"asf" : true ,
767
790
"avif" : true ,
768
791
"avi" : true ,
@@ -774,6 +797,7 @@ var extensions = map[string]bool{
774
797
"dvb" : true ,
775
798
"dwg" : true ,
776
799
"eot" : true ,
800
+ "flac" : true ,
777
801
"flv" : true ,
778
802
"gif" : true ,
779
803
"heic" : true ,
@@ -785,13 +809,16 @@ var extensions = map[string]bool{
785
809
"jpg" : true ,
786
810
"jxl" : true ,
787
811
"jxs" : true ,
812
+ "m4a" : true ,
788
813
"m4v" : true ,
789
814
"markdown" : true ,
790
815
"md" : true ,
791
816
"mj2" : true ,
792
817
"mkv" : true ,
793
818
"mov" : true ,
819
+ "mp3" : true ,
794
820
"mp4" : true ,
821
+ "mpeg3" : true ,
795
822
"mpeg" : true ,
796
823
"mpg" : true ,
797
824
"odc" : true ,
@@ -800,6 +827,9 @@ var extensions = map[string]bool{
800
827
"odp" : true ,
801
828
"ods" : true ,
802
829
"odt" : true ,
830
+ "oga" : true ,
831
+ "ogg" : true ,
832
+ "ogv" : true ,
803
833
"otf" : true ,
804
834
"otg" : true ,
805
835
"otp" : true ,
0 commit comments