mirror of
https://github.com/issadarkthing/gomu.git
synced 2025-04-26 13:49:21 +08:00
fetch lyric from tag editor is working
This commit is contained in:
parent
727f2d5a7a
commit
97343b9670
261
popup.go
261
popup.go
@ -3,16 +3,13 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"regexp"
|
"regexp"
|
||||||
"sort"
|
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
|
|
||||||
"github.com/bogem/id3v2"
|
|
||||||
"github.com/gdamore/tcell/v2"
|
"github.com/gdamore/tcell/v2"
|
||||||
"github.com/rivo/tview"
|
"github.com/rivo/tview"
|
||||||
"github.com/sahilm/fuzzy"
|
"github.com/sahilm/fuzzy"
|
||||||
@ -840,239 +837,6 @@ func ytSearchPopup() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func tagPopup(node *AudioFile) (err error) {
|
|
||||||
|
|
||||||
popupLyricMap := make(map[string]string)
|
|
||||||
popupID := "tag-input-popup"
|
|
||||||
|
|
||||||
var tag *id3v2.Tag
|
|
||||||
if node.isAudioFile {
|
|
||||||
tag, err = id3v2.Open(node.path, id3v2.Options{Parse: true})
|
|
||||||
if err != nil {
|
|
||||||
return tracerr.Wrap(err)
|
|
||||||
}
|
|
||||||
defer tag.Close()
|
|
||||||
} else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
usltFrames := tag.GetFrames(tag.CommonID("Unsynchronised lyrics/text transcription"))
|
|
||||||
|
|
||||||
for _, f := range usltFrames {
|
|
||||||
uslf, ok := f.(id3v2.UnsynchronisedLyricsFrame)
|
|
||||||
if !ok {
|
|
||||||
die(errors.New("USLT error"))
|
|
||||||
}
|
|
||||||
res := uslf.Lyrics
|
|
||||||
popupLyricMap[uslf.ContentDescriptor] = res
|
|
||||||
}
|
|
||||||
var options []string
|
|
||||||
for option := range popupLyricMap {
|
|
||||||
options = append(options, option)
|
|
||||||
}
|
|
||||||
sort.Strings(options)
|
|
||||||
|
|
||||||
var (
|
|
||||||
artistInputField *tview.InputField = tview.NewInputField()
|
|
||||||
titleInputField *tview.InputField = tview.NewInputField()
|
|
||||||
albumInputField *tview.InputField = tview.NewInputField()
|
|
||||||
getTagButton *tview.Button = tview.NewButton("Get Tag")
|
|
||||||
saveTagButton *tview.Button = tview.NewButton("Save Tag")
|
|
||||||
lyricDropDown *tview.DropDown = tview.NewDropDown()
|
|
||||||
deleteLyricButton *tview.Button = tview.NewButton("Delete Lyric")
|
|
||||||
getLyric1Button *tview.Button = tview.NewButton("Get Lyric 1")
|
|
||||||
getLyric2Button *tview.Button = tview.NewButton("Get Lyric 2")
|
|
||||||
getLyric3Button *tview.Button = tview.NewButton("Get Lyric 3")
|
|
||||||
lyricTextView *tview.TextView
|
|
||||||
leftGrid *tview.Grid = tview.NewGrid()
|
|
||||||
rightFlex *tview.Flex = tview.NewFlex()
|
|
||||||
)
|
|
||||||
artistInputField.SetLabel("Artist: ").
|
|
||||||
SetFieldWidth(20).
|
|
||||||
SetText(tag.Artist()).
|
|
||||||
SetFieldBackgroundColor(gomu.colors.popup).
|
|
||||||
SetBackgroundColor(gomu.colors.background)
|
|
||||||
titleInputField.SetLabel("Title: ").
|
|
||||||
SetFieldWidth(20).
|
|
||||||
SetText(tag.Title()).
|
|
||||||
SetFieldBackgroundColor(gomu.colors.popup).
|
|
||||||
SetBackgroundColor(gomu.colors.background)
|
|
||||||
albumInputField.SetLabel("Album: ").
|
|
||||||
SetFieldWidth(20).
|
|
||||||
SetText(tag.Album()).
|
|
||||||
SetFieldBackgroundColor(gomu.colors.popup).
|
|
||||||
SetBackgroundColor(gomu.colors.background)
|
|
||||||
getTagButton.SetBorder(true).
|
|
||||||
SetBackgroundColor(gomu.colors.background).
|
|
||||||
SetTitleColor(gomu.colors.accent)
|
|
||||||
saveTagButton.SetSelectedFunc(func() {
|
|
||||||
tag, err = id3v2.Open(node.path, id3v2.Options{Parse: true})
|
|
||||||
if err != nil {
|
|
||||||
errorPopup(err)
|
|
||||||
}
|
|
||||||
defer tag.Close()
|
|
||||||
tag.SetArtist(artistInputField.GetText())
|
|
||||||
tag.SetTitle(titleInputField.GetText())
|
|
||||||
tag.SetAlbum(albumInputField.GetText())
|
|
||||||
err := tag.Save()
|
|
||||||
if err != nil {
|
|
||||||
errorPopup(err)
|
|
||||||
} else {
|
|
||||||
defaultTimedPopup(" Success ", "Tag update successfully")
|
|
||||||
}
|
|
||||||
}).
|
|
||||||
SetBorder(true).
|
|
||||||
SetBackgroundColor(gomu.colors.background).
|
|
||||||
SetTitleColor(gomu.colors.foreground)
|
|
||||||
|
|
||||||
deleteLyricButton.SetSelectedFunc(func() {
|
|
||||||
_, langExt := lyricDropDown.GetCurrentOption()
|
|
||||||
if len(options) > 0 {
|
|
||||||
err := embedLyric(node.path, "", langExt, true)
|
|
||||||
if err != nil {
|
|
||||||
errorPopup(err)
|
|
||||||
}
|
|
||||||
// Reset dropdown options
|
|
||||||
var newOptions []string
|
|
||||||
for _, v := range options {
|
|
||||||
if v == langExt {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
newOptions = append(newOptions, v)
|
|
||||||
}
|
|
||||||
lyricDropDown.SetOptions(newOptions, nil).
|
|
||||||
SetCurrentOption(0)
|
|
||||||
// Reset lyricpreview
|
|
||||||
if len(newOptions) > 0 {
|
|
||||||
_, langExt = lyricDropDown.GetCurrentOption()
|
|
||||||
lyricTextView.SetText(popupLyricMap[langExt]).
|
|
||||||
SetTitle(" " + langExt + " lyric preview ")
|
|
||||||
} else {
|
|
||||||
langExt = ""
|
|
||||||
lyricTextView.SetText("No lyric embeded.").
|
|
||||||
SetTitle(" " + langExt + " lyric preview ")
|
|
||||||
}
|
|
||||||
infoPopup(langExt + " lyric deleted successfully.")
|
|
||||||
} else {
|
|
||||||
infoPopup("No lyric embeded.")
|
|
||||||
}
|
|
||||||
}).
|
|
||||||
SetBorder(true).
|
|
||||||
SetBackgroundColor(gomu.colors.background).
|
|
||||||
SetTitleColor(gomu.colors.accent)
|
|
||||||
|
|
||||||
getLyric1Button.SetBorder(true).
|
|
||||||
SetBackgroundColor(gomu.colors.background).
|
|
||||||
SetTitleColor(gomu.colors.accent)
|
|
||||||
getLyric2Button.SetBorder(true).
|
|
||||||
SetBackgroundColor(gomu.colors.background).
|
|
||||||
SetTitleColor(gomu.colors.accent)
|
|
||||||
getLyric3Button.SetBorder(true).
|
|
||||||
SetBackgroundColor(gomu.colors.background).
|
|
||||||
SetTitleColor(gomu.colors.accent)
|
|
||||||
lyricDropDown.SetOptions(options, nil).
|
|
||||||
SetCurrentOption(0).
|
|
||||||
SetFieldBackgroundColor(gomu.colors.background).
|
|
||||||
SetFieldTextColor(gomu.colors.accent).
|
|
||||||
SetPrefixTextColor(gomu.colors.accent).
|
|
||||||
SetSelectedFunc(func(text string, _ int) {
|
|
||||||
lyricTextView.SetText(popupLyricMap[text]).
|
|
||||||
SetTitle(" " + text + " lyric preview ")
|
|
||||||
}).
|
|
||||||
SetLabel("Embeded Lyrics: ")
|
|
||||||
lyricDropDown.SetBackgroundColor(gomu.colors.popup)
|
|
||||||
|
|
||||||
var lyricText string
|
|
||||||
_, langExt := lyricDropDown.GetCurrentOption()
|
|
||||||
lyricText = popupLyricMap[langExt]
|
|
||||||
if lyricText == "" {
|
|
||||||
lyricText = "No lyric embeded."
|
|
||||||
langExt = ""
|
|
||||||
}
|
|
||||||
lyricTextView = tview.NewTextView()
|
|
||||||
lyricTextView.
|
|
||||||
SetDynamicColors(true).
|
|
||||||
SetRegions(true).
|
|
||||||
SetScrollable(true).
|
|
||||||
SetTitle(" " + langExt + " lyric preview ").
|
|
||||||
SetBorder(true)
|
|
||||||
|
|
||||||
lyricTextView.SetText(lyricText).
|
|
||||||
SetScrollable(true).
|
|
||||||
SetWordWrap(true).
|
|
||||||
SetWrap(true).
|
|
||||||
SetBackgroundColor(gomu.colors.popup).
|
|
||||||
SetBorder(true)
|
|
||||||
|
|
||||||
leftGrid.SetRows(3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3).
|
|
||||||
SetColumns(30).
|
|
||||||
AddItem(artistInputField, 0, 0, 1, 3, 1, 10, true).
|
|
||||||
AddItem(titleInputField, 1, 0, 1, 3, 1, 10, true).
|
|
||||||
AddItem(albumInputField, 2, 0, 1, 3, 1, 10, true).
|
|
||||||
AddItem(getTagButton, 3, 0, 1, 3, 1, 10, true).
|
|
||||||
AddItem(saveTagButton, 4, 0, 1, 3, 1, 10, true).
|
|
||||||
AddItem(lyricDropDown, 6, 0, 1, 3, 1, 10, true).
|
|
||||||
AddItem(deleteLyricButton, 7, 0, 1, 3, 1, 10, true).
|
|
||||||
AddItem(getLyric1Button, 8, 0, 1, 3, 1, 10, true).
|
|
||||||
AddItem(getLyric2Button, 9, 0, 1, 3, 1, 10, true).
|
|
||||||
AddItem(getLyric3Button, 10, 0, 1, 3, 1, 10, true)
|
|
||||||
leftGrid.SetBorder(true).
|
|
||||||
SetTitle(node.name).
|
|
||||||
SetBorderPadding(1, 1, 2, 2)
|
|
||||||
|
|
||||||
rightFlex.SetDirection(tview.FlexColumn).
|
|
||||||
AddItem(lyricTextView, 0, 1, true)
|
|
||||||
|
|
||||||
lyricFlex := tview.NewFlex().SetDirection(tview.FlexColumn).
|
|
||||||
AddItem(leftGrid, 0, 2, true).
|
|
||||||
AddItem(rightFlex, 0, 3, true)
|
|
||||||
|
|
||||||
lyricFlex.
|
|
||||||
SetTitle(node.name).
|
|
||||||
SetBorderPadding(1, 1, 2, 2).
|
|
||||||
SetBackgroundColor(gomu.colors.popup)
|
|
||||||
|
|
||||||
inputs := []tview.Primitive{
|
|
||||||
artistInputField,
|
|
||||||
titleInputField,
|
|
||||||
albumInputField,
|
|
||||||
getTagButton,
|
|
||||||
saveTagButton,
|
|
||||||
lyricDropDown,
|
|
||||||
deleteLyricButton,
|
|
||||||
getLyric1Button,
|
|
||||||
getLyric2Button,
|
|
||||||
getLyric3Button,
|
|
||||||
lyricTextView,
|
|
||||||
}
|
|
||||||
|
|
||||||
gomu.pages.
|
|
||||||
AddPage(popupID, center(lyricFlex, 90, 40), true, true)
|
|
||||||
gomu.popups.push(lyricFlex)
|
|
||||||
|
|
||||||
lyricFlex.SetInputCapture(func(e *tcell.EventKey) *tcell.EventKey {
|
|
||||||
switch e.Key() {
|
|
||||||
case tcell.KeyEnter:
|
|
||||||
if deleteLyricButton.HasFocus() {
|
|
||||||
return e
|
|
||||||
} else if saveTagButton.HasFocus() {
|
|
||||||
return e
|
|
||||||
}
|
|
||||||
|
|
||||||
case tcell.KeyEsc:
|
|
||||||
gomu.pages.RemovePage(popupID)
|
|
||||||
gomu.popups.pop()
|
|
||||||
case tcell.KeyTab:
|
|
||||||
cycleFocus(gomu.app, inputs, false)
|
|
||||||
case tcell.KeyBacktab:
|
|
||||||
cycleFocus(gomu.app, inputs, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
return e
|
|
||||||
})
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func lyricPopup(audioFile *AudioFile) error {
|
func lyricPopup(audioFile *AudioFile) error {
|
||||||
|
|
||||||
results, err := lyric.GetLyricOptions(audioFile.name)
|
results, err := lyric.GetLyricOptions(audioFile.name)
|
||||||
@ -1105,7 +869,7 @@ func lyricPopup(audioFile *AudioFile) error {
|
|||||||
errorPopup(err)
|
errorPopup(err)
|
||||||
gomu.app.Draw()
|
gomu.app.Draw()
|
||||||
} else {
|
} else {
|
||||||
infoPopup("Lyric added successfully")
|
infoPopup("en Lyric added successfully")
|
||||||
gomu.app.Draw()
|
gomu.app.Draw()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1148,7 +912,7 @@ func lyricPopupCN(audioFile *AudioFile, serviceProvider string) error {
|
|||||||
errorPopup(err)
|
errorPopup(err)
|
||||||
gomu.app.Draw()
|
gomu.app.Draw()
|
||||||
} else {
|
} else {
|
||||||
infoPopup("Lyric added successfully")
|
infoPopup("cn Lyric added successfully")
|
||||||
gomu.app.Draw()
|
gomu.app.Draw()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1157,24 +921,3 @@ func lyricPopupCN(audioFile *AudioFile, serviceProvider string) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func cycleFocus(app *tview.Application, elements []tview.Primitive, reverse bool) {
|
|
||||||
for i, el := range elements {
|
|
||||||
if !el.HasFocus() {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if reverse {
|
|
||||||
i = i - 1
|
|
||||||
if i < 0 {
|
|
||||||
i = len(elements) - 1
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
i = i + 1
|
|
||||||
i = i % len(elements)
|
|
||||||
}
|
|
||||||
|
|
||||||
app.SetFocus(elements[i])
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user