Skip to content

Commit ee936d1

Browse files
committed
Updated artwork command
1 parent 05aa6ce commit ee936d1

File tree

4 files changed

+88
-30
lines changed

4 files changed

+88
-30
lines changed

cmd/cli/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type CLI struct {
2323
ChannelLayouts ChannelLayoutsCmd `cmd:"channellayouts" help:"List audio channel layouts"`
2424
PixelFormats PixelFormatsCmd `cmd:"pixelfmts" help:"List video pixel formats"`
2525
Metadata MetadataCmd `cmd:"metadata" help:"Display media metadata information"`
26+
Artwork ArtworkCmd `cmd:"artwork" help:"Save artwork from media file"`
2627
Probe ProbeCmd `cmd:"probe" help:"Probe media file or device"`
2728
Decode DecodeCmd `cmd:"decode" help:"Decode media"`
2829
}

cmd/cli/metadata.go

Lines changed: 0 additions & 30 deletions
This file was deleted.

cmd/cli/metadata_artwork.go

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package main
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"mime"
7+
"net/http"
8+
"os"
9+
"path/filepath"
10+
"strings"
11+
12+
// Packages
13+
"github.com/djthorpe/go-tablewriter"
14+
"github.com/mutablelogic/go-media"
15+
)
16+
17+
type MetadataCmd struct {
18+
Path string `arg:"" required:"" help:"Media file" type:"path"`
19+
}
20+
21+
type ArtworkCmd struct {
22+
Path string `arg:"" required:"" help:"Media file" type:"path"`
23+
}
24+
25+
func (cmd *MetadataCmd) Run(globals *Globals) error {
26+
manager := media.NewManager()
27+
reader, err := manager.Open(cmd.Path, nil)
28+
if err != nil {
29+
return err
30+
}
31+
defer reader.Close()
32+
33+
// Print metadata
34+
opts := []tablewriter.TableOpt{
35+
tablewriter.OptHeader(),
36+
tablewriter.OptOutputText(),
37+
}
38+
return tablewriter.New(os.Stdout, opts...).Write(reader.Metadata())
39+
}
40+
41+
func (cmd *ArtworkCmd) Run(globals *Globals) error {
42+
manager := media.NewManager()
43+
reader, err := manager.Open(cmd.Path, nil)
44+
if err != nil {
45+
return err
46+
}
47+
defer reader.Close()
48+
49+
artwork := reader.Metadata(media.MetaArtwork)
50+
if len(artwork) == 0 {
51+
return errors.New("no artwork")
52+
}
53+
54+
for i, a := range artwork {
55+
data := a.Value().([]byte)
56+
mimetype := http.DetectContentType(data)
57+
if !strings.HasPrefix(mimetype, "image/") {
58+
return fmt.Errorf("invalid mimetype %q for stream %d", mimetype, i)
59+
}
60+
ext, err := mime.ExtensionsByType(mimetype)
61+
if err != nil {
62+
return err
63+
}
64+
if len(ext) == 0 {
65+
return fmt.Errorf("no extension for mimetype %q", mimetype)
66+
}
67+
68+
// Use last extension
69+
filename := filepath.Base(cmd.Path) + ext[len(ext)-1]
70+
if len(artwork) > 1 {
71+
filename = filepath.Base(cmd.Path) + fmt.Sprintf("%d.%s", i+1, ext[len(ext)-1])
72+
}
73+
74+
// Write the file
75+
w, err := os.Create(filename)
76+
if err != nil {
77+
return err
78+
}
79+
defer w.Close()
80+
if _, err := w.Write(data); err != nil {
81+
return err
82+
}
83+
fmt.Println("Written ", filename)
84+
}
85+
86+
return nil
87+
}

test.mp3

-4 MB
Binary file not shown.

0 commit comments

Comments
 (0)