mirror of
https://github.com/Apologieze/Benri.git
synced 2026-01-19 01:28:46 +01:00
265 lines
7.0 KiB
Go
265 lines
7.0 KiB
Go
package main
|
|
|
|
import (
|
|
"animeFyne/anilist"
|
|
curd "animeFyne/curdInteg"
|
|
"fmt"
|
|
"fyne.io/fyne/v2"
|
|
"fyne.io/fyne/v2/app"
|
|
"fyne.io/fyne/v2/canvas"
|
|
"fyne.io/fyne/v2/container"
|
|
"fyne.io/fyne/v2/data/binding"
|
|
"fyne.io/fyne/v2/dialog"
|
|
"fyne.io/fyne/v2/layout"
|
|
"fyne.io/fyne/v2/theme"
|
|
"fyne.io/fyne/v2/widget"
|
|
"github.com/bep/debounce"
|
|
"github.com/charmbracelet/log"
|
|
"github.com/rl404/verniy"
|
|
"image"
|
|
"image/color"
|
|
"io"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
var animeList *[]verniy.MediaList
|
|
var window fyne.Window
|
|
var appW fyne.App
|
|
var animeSelected *verniy.MediaList
|
|
var episodeNumber = widget.NewLabelWithStyle("", fyne.TextAlignCenter, fyne.TextStyle{Bold: true})
|
|
var changedToken bool
|
|
|
|
func main() {
|
|
var AppName = "AnimeGUI"
|
|
dowloadMPV()
|
|
appW = app.New()
|
|
window = appW.NewWindow(AppName)
|
|
window.Resize(fyne.NewSize(1000, 700))
|
|
window.CenterOnScreen()
|
|
window.Show()
|
|
appW.Settings().SetTheme(&forcedVariant{Theme: theme.DefaultTheme(), variant: theme.VariantDark})
|
|
|
|
startCurdInteg()
|
|
if !changedToken {
|
|
fmt.Println(window.Title(), AppName)
|
|
initMainApp()
|
|
appW.Run()
|
|
}
|
|
}
|
|
|
|
func updateAnimeNames(data binding.ExternalStringList) (first bool) {
|
|
if animeList == nil {
|
|
log.Error("No list found")
|
|
return
|
|
}
|
|
tempName := make([]string, 0, 25)
|
|
for _, anime := range *animeList {
|
|
if name := anilist.AnimeToName(anime); name != nil {
|
|
tempName = append(tempName, *name)
|
|
} else {
|
|
tempName = append(tempName, "Error name")
|
|
}
|
|
}
|
|
if len(tempName) != 0 {
|
|
first = true
|
|
}
|
|
err := data.Set(tempName)
|
|
if err != nil {
|
|
return
|
|
}
|
|
return first
|
|
}
|
|
|
|
func GetImageFromUrl(url string) image.Image {
|
|
resp, err := http.Get(url)
|
|
if err != nil {
|
|
fmt.Println("Error downloading image:", err)
|
|
return nil
|
|
}
|
|
defer func(Body io.ReadCloser) {
|
|
_ = Body.Close()
|
|
}(resp.Body)
|
|
|
|
img, _, err := image.Decode(resp.Body)
|
|
if err != nil {
|
|
fmt.Println("Error decoding image:", err)
|
|
return nil
|
|
}
|
|
return img
|
|
}
|
|
|
|
func getAnimeImageFromImage(img image.Image) *canvas.Image {
|
|
size := img.Bounds().Size()
|
|
ratio := float32(size.X) / float32(size.Y)
|
|
var newWidth float32 = 300
|
|
newHeight := newWidth / ratio
|
|
|
|
imageEx := canvas.NewImageFromImage(img)
|
|
imageEx.FillMode = canvas.ImageFillContain
|
|
|
|
imageEx.SetMinSize(fyne.NewSize(newWidth, newHeight))
|
|
|
|
return imageEx
|
|
}
|
|
|
|
func selectCorrectLinking(allAnimeList []AllAnimeIdData, animeName string, animeProgress int) {
|
|
linkingList := widget.NewList(func() int {
|
|
return len(allAnimeList)
|
|
},
|
|
func() fyne.CanvasObject {
|
|
return widget.NewLabel("template")
|
|
},
|
|
func(i widget.ListItemID, o fyne.CanvasObject) {
|
|
o.(*widget.Label).SetText(allAnimeList[i].Name)
|
|
})
|
|
|
|
linkingContainer := container.NewBorder(nil, nil, nil, nil, linkingList)
|
|
dialogC := dialog.NewCustom("Select the correct anime", "Cancel", linkingContainer, window)
|
|
|
|
linkingList.OnSelected = func(index widget.ListItemID) {
|
|
fmt.Println("Selected:", allAnimeList[index])
|
|
dialogC.Hide()
|
|
err, tempAnime := curd.LocalUpdateAnime(databaseFile, animeSelected.Media.ID, allAnimeList[index].Id, animeProgress, 0, 0, animeName)
|
|
if err != nil {
|
|
log.Error("Can't update database file", err)
|
|
return
|
|
}
|
|
if tempAnime != nil {
|
|
localAnime = tempAnime
|
|
}
|
|
OnPlayButtonClick(animeName, animeSelected)
|
|
}
|
|
|
|
dialogC.Resize(fyne.NewSize(600, 900))
|
|
dialogC.Show()
|
|
log.Info("Select the correct anime", allAnimeList)
|
|
|
|
}
|
|
|
|
func changeEpisodeInApp(variation int) {
|
|
var currentSelected = animeSelected
|
|
newNumber := *currentSelected.Progress + variation
|
|
fmt.Println("New number:", newNumber, *currentSelected.Progress)
|
|
if newNumber >= 0 && newNumber <= *currentSelected.Media.Episodes {
|
|
go UpdateAnimeProgress(currentSelected.Media.ID, newNumber)
|
|
currentSelected.Progress = &newNumber
|
|
episodeNumber.SetText(fmt.Sprintf("Episode %d/%d", newNumber, *currentSelected.Media.Episodes))
|
|
}
|
|
}
|
|
|
|
func initMainApp() {
|
|
secondCurdInit()
|
|
window.SetTitle("AnimeGUI")
|
|
fmt.Println(localAnime)
|
|
|
|
debounced := debounce.New(400 * time.Millisecond)
|
|
|
|
data := binding.BindStringList(
|
|
&[]string{},
|
|
)
|
|
|
|
listDisplay := widget.NewListWithData(data,
|
|
func() fyne.CanvasObject {
|
|
return &widget.Label{Text: "template"}
|
|
},
|
|
func(i binding.DataItem, o fyne.CanvasObject) {
|
|
o.(*widget.Label).Bind(i.(binding.String))
|
|
})
|
|
|
|
input := widget.NewEntry()
|
|
input.SetPlaceHolder("Anime name")
|
|
input.OnChanged = func(s string) {
|
|
debounced(func() {
|
|
fmt.Println(s)
|
|
})
|
|
}
|
|
|
|
radiobox := widget.NewRadioGroup([]string{"Watching", "Planning", "Completed", "Dropped"}, func(s string) {
|
|
animeList = anilist.FindList(s)
|
|
if updateAnimeNames(data) {
|
|
listDisplay.Unselect(0)
|
|
listDisplay.Select(0)
|
|
listDisplay.ScrollToTop()
|
|
}
|
|
})
|
|
radiobox.Required = true
|
|
radiobox.Horizontal = true
|
|
|
|
toolbar := widget.NewToolbar(
|
|
widget.NewToolbarAction(theme.ContentAddIcon(), func() {}),
|
|
widget.NewToolbarSeparator(),
|
|
widget.NewToolbarAction(theme.ViewRefreshIcon(), func() {}),
|
|
)
|
|
|
|
inputContainer := container.NewBorder(nil, nil, nil, toolbar, input)
|
|
|
|
vbox := container.NewVBox(
|
|
inputContainer,
|
|
radiobox,
|
|
)
|
|
|
|
var grayScaleList uint8 = 35
|
|
/*if themeVariant == theme.VariantDark {
|
|
grayScaleList = 220
|
|
}*/
|
|
listContainer := container.NewStack(canvas.NewRectangle(color.RGBA{R: grayScaleList, G: grayScaleList, B: grayScaleList, A: 255}), listDisplay)
|
|
|
|
leftSide := container.NewBorder(vbox, nil, nil, nil, listContainer)
|
|
|
|
go anilist.GetData(radiobox, user.Username, deleteTokenFile)
|
|
|
|
imageEx := &canvas.Image{}
|
|
|
|
animeName := widget.NewLabelWithStyle("", fyne.TextAlignCenter, fyne.TextStyle{Bold: true})
|
|
animeName.Wrapping = fyne.TextWrapWord
|
|
|
|
episodeMinus := widget.NewButton(" - ", func() { changeEpisodeInApp(-1) })
|
|
episodePlus := widget.NewButton(" + ", func() { changeEpisodeInApp(1) })
|
|
|
|
episodeContainer := container.NewHBox(layout.NewSpacer(), episodeMinus, episodeNumber, episodePlus, layout.NewSpacer())
|
|
|
|
button := widget.NewButtonWithIcon("Play!", theme.MediaPlayIcon(), func() {
|
|
//fmt.Println(anilist.Search())
|
|
fmt.Println(animeSelected.Media.ID)
|
|
if animeName.Text == "" {
|
|
return
|
|
}
|
|
OnPlayButtonClick(animeName.Text, animeSelected)
|
|
})
|
|
|
|
button.IconPlacement = widget.ButtonIconTrailingText
|
|
button.Importance = widget.HighImportance
|
|
|
|
playContainer := container.NewHBox(layout.NewSpacer(), button, layout.NewSpacer())
|
|
|
|
imageContainer := container.NewVBox(imageEx, animeName, episodeContainer, layout.NewSpacer(), playContainer)
|
|
|
|
listDisplay.OnSelected = func(id int) {
|
|
listName, err := data.GetValue(id)
|
|
animeSelected = &(*animeList)[id]
|
|
if err == nil {
|
|
animeName.SetText(listName)
|
|
}
|
|
|
|
if animeSelected.Progress != nil && animeSelected.Media.Episodes != nil {
|
|
episodeNumber.SetText(fmt.Sprintf("Episode %d/%d", *animeSelected.Progress, *animeSelected.Media.Episodes))
|
|
} else {
|
|
episodeNumber.SetText("No episode data")
|
|
}
|
|
|
|
imageLink := *animeSelected.Media.CoverImage.ExtraLarge
|
|
|
|
imageFile := GetImageFromUrl(imageLink)
|
|
if imageFile == nil {
|
|
log.Error("No image found")
|
|
return
|
|
}
|
|
|
|
*imageEx = *getAnimeImageFromImage(imageFile)
|
|
imageContainer.Refresh()
|
|
}
|
|
|
|
window.SetContent(container.NewBorder(nil, nil, nil, imageContainer, leftSide))
|
|
}
|