From c87dc5e04f808f9d095f812008888937d6053c2f Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Sun, 24 Sep 2023 22:34:30 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=A7=20More=20of=20fingerprinting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/print.go | 49 ++++++++++++++++++++++++++++++++++++------ media/brainz/brainz.go | 39 +++++++++++++++++++++++++++++++++ utils/utils.go | 7 ++++++ 3 files changed, 89 insertions(+), 6 deletions(-) diff --git a/app/print.go b/app/print.go index 7ce26dc..39673ee 100644 --- a/app/print.go +++ b/app/print.go @@ -2,16 +2,49 @@ package app import ( "fmt" + "strconv" + "codeberg.org/danjones000/strip-beats/input/list" "codeberg.org/danjones000/strip-beats/media" "codeberg.org/danjones000/strip-beats/media/brainz" + "codeberg.org/danjones000/strip-beats/utils" ) +type recOpt struct { + rec brainz.Recording + num int +} + +func (o recOpt) Title() string { + return o.rec.Title +} + +func (o recOpt) Text() string { + return fmt.Sprintf( + "By %s - First Released %s - %s %s", + o.rec.FirstArtist().Name, + o.rec.FirstReleaseDate, + o.rec.FirstGenre().Name, + utils.Tern(o.rec.Video, "(Video)", "")) +} + +func (o recOpt) Rune() rune { + s := strconv.Itoa(o.num) + for _, c := range s { + return c + } + return 0 +} + +func (o recOpt) Selected() func() { + return nil +} + func print() { if file == nil { PickFileWithConf() } - fp, err := media.Fingerprint("/home/drj/MyFiles/Videos/WebShows/YouTube/Dolly_Parton_-_Topic/Just_Because_I_m_a_Woman.Dolly_Parton_-_Topic.Fmv-XQerVkM.webm") + fp, err := media.Fingerprint(file.Format.Path) if err != nil { panic(err) } @@ -19,17 +52,21 @@ func print() { if err != nil { panic(err) } - var recs []brainz.Recording + var recs []list.Option + var rec brainz.Recording + i := 1 for _, res := range ids.Results { - for _, rec := range res.Recordings { + for _, rec = range res.Recordings { err = brainz.FillRecording(&rec) if err != nil { panic(err) } - recs = append(recs, rec) - + recs = append(recs, recOpt{rec, i}) + i = (i + 1) % 10 } } - fmt.Printf("%+v\n", recs) + rec = list.List("Which recording is the correct one?", recs, nil).(recOpt).rec + + fmt.Printf("%+v\n", rec.Title) } diff --git a/media/brainz/brainz.go b/media/brainz/brainz.go index da9d999..30553d7 100644 --- a/media/brainz/brainz.go +++ b/media/brainz/brainz.go @@ -19,6 +19,45 @@ type Recording struct { Video bool Releases []Release Genres []Genre + ArtistCredit []ArtistCredit `json:"artist-credit"` +} + +func (r Recording) FirstArtist() Artist { + var a Artist + for _, ac := range r.ArtistCredit { + if ac.Artist.Name != "" { + return ac.Artist + } + } + for _, rel := range r.Releases { + for _, ac := range rel.ArtistCredit { + if ac.Artist.Name != "" { + return ac.Artist + } + } + } + + if a.Name == "" { + a.Name = "Unknown Artist" + } + return a +} + +func (r Recording) FirstGenre() Genre { + var g Genre + for _, g = range r.Genres { + if g.Name != "" { + return g + } + } + for _, rel := range r.Releases { + for _, g = range rel.Genres { + if g.Name != "" { + return g + } + } + } + return g } type Genre struct { diff --git a/utils/utils.go b/utils/utils.go index 1f40e98..197b898 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -29,3 +29,10 @@ func HourMinSecToSeconds(time string) (float64, error) { dur, _ := t.ParseDuration(f) return dur.Seconds(), nil } + +func Tern[V any](choice bool, one, two V) V { + if choice { + return one + } + return two +}