From 424e912f6c4e6579c27788e7beb37edcfc72ef36 Mon Sep 17 00:00:00 2001 From: ChaoticByte Date: Fri, 14 Mar 2025 19:47:23 +0100 Subject: [PATCH] Remove the usage of custom types where it isn't required --- cli/cli.go | 128 ++++++++++++++++++++++------------------------ core/gtv_api.go | 22 +++++--- core/interface.go | 13 ----- 3 files changed, 77 insertions(+), 86 deletions(-) delete mode 100644 core/interface.go diff --git a/cli/cli.go b/cli/cli.go index eb0b1d8..ef1f7c5 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -38,7 +38,7 @@ func XtermSetTitle(title string) { // Commandline -type Arguments struct { +var Arguments struct { Url string `json:"url"` FormatName string `json:"format_name"` OutputFile string `json:"output_file"` @@ -84,96 +84,92 @@ lurch-dl --url string The url to the video Version: ` + core.Version) } -func CliParseArguments() (Arguments, error) { +func CliParseArguments() error { var err error var ratelimitMbs float64 - a := Arguments{} - flag.BoolVar(&a.Help, "h", false, "") - flag.BoolVar(&a.Help, "help", false, "") - flag.BoolVar(&a.VideoInfo, "info", false, "") - flag.StringVar(&a.Url, "url", "", "") - flag.IntVar(&a.UnparsedChapterNum, "chapter", 0, "") // 0 -> chapter idx -1 -> complete stream - flag.StringVar(&a.FormatName, "format", "auto", "") - flag.StringVar(&a.OutputFile, "output", "", "") - flag.StringVar(&a.TimestampStart, "start", "", "") - flag.StringVar(&a.TimestampStop, "stop", "", "") - flag.BoolVar(&a.Overwrite, "overwrite", false, "") - flag.BoolVar(&a.ContinueDl, "continue", false, "") + flag.BoolVar(&Arguments.Help, "h", false, "") + flag.BoolVar(&Arguments.Help, "help", false, "") + flag.BoolVar(&Arguments.VideoInfo, "info", false, "") + flag.StringVar(&Arguments.Url, "url", "", "") + flag.IntVar(&Arguments.UnparsedChapterNum, "chapter", 0, "") // 0 -> chapter idx -1 -> complete stream + flag.StringVar(&Arguments.FormatName, "format", "auto", "") + flag.StringVar(&Arguments.OutputFile, "output", "", "") + flag.StringVar(&Arguments.TimestampStart, "start", "", "") + flag.StringVar(&Arguments.TimestampStop, "stop", "", "") + flag.BoolVar(&Arguments.Overwrite, "overwrite", false, "") + flag.BoolVar(&Arguments.ContinueDl, "continue", false, "") flag.Float64Var(&ratelimitMbs, "max-rate", 10.0, "") flag.Parse() - a.Video, err = core.ParseGtvVideoUrl(a.Url) + Arguments.Video, err = core.ParseGtvVideoUrl(Arguments.Url) if err != nil { - return a, err + return err } - if a.Video.Category != "streams" { - return a, errors.New("video category '" + a.Video.Category + "' not supported") + if Arguments.Video.Category != "streams" { + return errors.New("video category '" + Arguments.Video.Category + "' not supported") } - if a.TimestampStart == "" { - a.StartDuration = -1 + if Arguments.TimestampStart == "" { + Arguments.StartDuration = -1 } else { - a.StartDuration, err = time.ParseDuration(a.TimestampStart) + Arguments.StartDuration, err = time.ParseDuration(Arguments.TimestampStart) if err != nil { - return a, err + return err } } - if a.TimestampStop == "" { - a.StopDuration = -1 + if Arguments.TimestampStop == "" { + Arguments.StopDuration = -1 } else { - a.StopDuration, err = time.ParseDuration(a.TimestampStop) + Arguments.StopDuration, err = time.ParseDuration(Arguments.TimestampStop) if err != nil { - return a, err + return err } } - a.ChapterIdx = a.UnparsedChapterNum - 1 - a.Ratelimit = ratelimitMbs * 1_000_000.0 // MB/s -> B/s - if a.Ratelimit <= 0 { - return a, errors.New("the value of --max-rate must be greater than 0") + Arguments.ChapterIdx = Arguments.UnparsedChapterNum - 1 + Arguments.Ratelimit = ratelimitMbs * 1_000_000.0 // MB/s -> B/s + if Arguments.Ratelimit <= 0 { + return errors.New("the value of --max-rate must be greater than 0") } - return a, err + return err } // Main func CliRun() int { - cli := Cli{} defer fmt.Print("\n") // cli arguments & help text flag.Usage = CliShowHelp - args, err := CliParseArguments() - if args.Help { + err := CliParseArguments() + if Arguments.Help { CliShowHelp() return 0 - } else if args.Url == "" || err != nil { + } else if Arguments.Url == "" || err != nil { CliShowHelp() if err != nil { - cli.ErrorMessage(err) + CliErrorMessage(err) } return 1 } // detect terminal features XtermDetectFeatures() - // - api := core.GtvApi{}; // Get video metadata if CliXtermTitle { XtermSetTitle("lurch-dl - Fetching video metadata ...") } - streamEp, err := api.GetStreamEpisode(args.Video.Id) + streamEp, err := core.GetStreamEpisode(Arguments.Video.Id) if err != nil { - cli.ErrorMessage(err) + CliErrorMessage(err) return 1 } fmt.Print("\n") fmt.Printf("Title: %s\n", streamEp.Title) // Check and list chapters/formats and exit - if args.ChapterIdx >= 0 { - if args.ChapterIdx >= len(streamEp.Chapters) { - cli.ErrorMessage(&core.ChapterNotFoundError{ChapterNum: args.UnparsedChapterNum}) + if Arguments.ChapterIdx >= 0 { + if Arguments.ChapterIdx >= len(streamEp.Chapters) { + CliErrorMessage(&core.ChapterNotFoundError{ChapterNum: Arguments.UnparsedChapterNum}) CliAvailableChapters(streamEp.Chapters) return 1 } } - if args.VideoInfo { + if Arguments.VideoInfo { fmt.Printf("Episode: %s\n", streamEp.Episode) fmt.Printf("Length: %s\n", streamEp.Length) fmt.Printf("Views: %d\n", streamEp.Views) @@ -195,42 +191,42 @@ func CliRun() int { CliAvailableChapters(streamEp.Chapters) return 0 } - format, err := streamEp.GetFormatByName(args.FormatName) + format, err := streamEp.GetFormatByName(Arguments.FormatName) if err != nil { - cli.ErrorMessage(err) + CliErrorMessage(err) CliAvailableFormats(streamEp.Formats) return 1 } fmt.Printf("Format: %v\n", format.Name) // chapter targetChapter := core.Chapter{Index: -1} // set Index to -1 for noop - if len(streamEp.Chapters) > 0 && args.ChapterIdx >= 0 { - targetChapter = streamEp.Chapters[args.ChapterIdx] - fmt.Printf("Chapter: %v. %v\n", args.UnparsedChapterNum, targetChapter.Title) + if len(streamEp.Chapters) > 0 && Arguments.ChapterIdx >= 0 { + targetChapter = streamEp.Chapters[Arguments.ChapterIdx] + fmt.Printf("Chapter: %v. %v\n", Arguments.UnparsedChapterNum, targetChapter.Title) } // We already set the output file correctly so we can output it - if args.OutputFile == "" { - args.OutputFile = streamEp.GetProposedFilename(args.ChapterIdx) + if Arguments.OutputFile == "" { + Arguments.OutputFile = streamEp.GetProposedFilename(Arguments.ChapterIdx) } // Start Download - fmt.Printf("Output: %v\n", args.OutputFile) + fmt.Printf("Output: %v\n", Arguments.OutputFile) fmt.Print("\n") successful := false aborted := false - for p := range api.DownloadEpisode( + for p := range core.DownloadEpisode( streamEp, targetChapter, - args.FormatName, - args.OutputFile, - args.Overwrite, - args.ContinueDl, - args.StartDuration, - args.StopDuration, - args.Ratelimit, + Arguments.FormatName, + Arguments.OutputFile, + Arguments.Overwrite, + Arguments.ContinueDl, + Arguments.StartDuration, + Arguments.StopDuration, + Arguments.Ratelimit, make(chan os.Signal, 1), ) { // Iterate over download progress if p.Error != nil { - cli.ErrorMessage(p.Error) + CliErrorMessage(p.Error) return 1 } if p.Success { @@ -238,7 +234,7 @@ func CliRun() int { } else if p.Aborted { aborted = true } else { - cli.DownloadProgress(p.Progress, p.Rate, p.Delaying, p.Waiting, p.Retries, p.Title) + CliDownloadProgress(p.Progress, p.Rate, p.Delaying, p.Waiting, p.Retries, p.Title) } } fmt.Print("\n") @@ -246,7 +242,7 @@ func CliRun() int { fmt.Print("\nAborted. ") return 130 } else if !successful { - cli.ErrorMessage(errors.New("download failed")) + CliErrorMessage(errors.New("download failed")) return 1 } else { return 0 } } @@ -270,9 +266,7 @@ func CliAvailableFormats(formats []core.VideoFormat) { fmt.Print("\n") } -type Cli struct{} - -func (cli *Cli) DownloadProgress(progress float32, rate float64, delaying bool, waiting bool, retries int, title string) { +func CliDownloadProgress(progress float32, rate float64, delaying bool, waiting bool, retries int, title string) { if retries > 0 { if retries == 1 { fmt.Print("\n") @@ -291,7 +285,7 @@ func (cli *Cli) DownloadProgress(progress float32, rate float64, delaying bool, } } -func (cli *Cli) ErrorMessage(err error) { +func CliErrorMessage(err error) { fmt.Print("\n") fmt.Println("An error occured:", err) } diff --git a/core/gtv_api.go b/core/gtv_api.go index b77a1d4..471a561 100644 --- a/core/gtv_api.go +++ b/core/gtv_api.go @@ -25,6 +25,18 @@ const RatelimitDelayAfter = 5.0 // in Seconds; Delay the next chunk download aft const ApiBaseurlStreamEpisodeInfo = "https://api.gronkh.tv/v1/video/info?episode=%s" const ApiBaseurlStreamEpisodePlInfo = "https://api.gronkh.tv/v1/video/playlist?episode=%s" +type DownloadProgress struct { + Aborted bool + Error error + Success bool + Delaying bool + Progress float32 + Rate float64 + Retries int + Title string + Waiting bool +} + var ApiHeadersBase = http.Header{ "User-Agent": {"Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/119.0"}, "Accept-Language": {"de,en-US;q=0.7,en;q=0.3"}, @@ -48,9 +60,7 @@ var ApiHeadersVideoAdditional = http.Header{ "Accept": {"*/*"}, } -type GtvApi struct{} - -func (api *GtvApi) GetStreamEpisode(episode string) (StreamEpisode, error) { +func GetStreamEpisode(episode string) (StreamEpisode, error) { ep := StreamEpisode{} ep.Episode = episode info_data, err := httpGet( @@ -93,7 +103,7 @@ func (api *GtvApi) GetStreamEpisode(episode string) (StreamEpisode, error) { return ep, err } -func (api *GtvApi) GetStreamChunkList(video VideoFormat) (ChunkList, error) { +func GetStreamChunkList(video VideoFormat) (ChunkList, error) { baseUrl := video.Url[:strings.LastIndex(video.Url, "/")] data, err := httpGet(video.Url, []http.Header{ApiHeadersBase, ApiHeadersMetaAdditional}, time.Second*10) if err != nil { @@ -103,7 +113,7 @@ func (api *GtvApi) GetStreamChunkList(video VideoFormat) (ChunkList, error) { return chunklist, err } -func (api *GtvApi) DownloadEpisode( +func DownloadEpisode( ep StreamEpisode, chapter Chapter, formatName string, @@ -181,7 +191,7 @@ func (api *GtvApi) DownloadEpisode( } // download format, _ := ep.GetFormatByName(formatName) // we don't have to check the error, as it was already checked by CliRun() - chunklist, err := api.GetStreamChunkList(format) + chunklist, err := GetStreamChunkList(format) chunklist = chunklist.Cut(startDuration, stopDuration) if err != nil { yield(DownloadProgress{Error: err}) diff --git a/core/interface.go b/core/interface.go deleted file mode 100644 index 26bb1a2..0000000 --- a/core/interface.go +++ /dev/null @@ -1,13 +0,0 @@ -package core - -type DownloadProgress struct { - Aborted bool - Error error - Success bool - Delaying bool - Progress float32 - Rate float64 - Retries int - Title string - Waiting bool -}