From 6e0e39ada24bd59292364115bac6e3989a569d4f Mon Sep 17 00:00:00 2001 From: Pijus Kamandulis Date: Tue, 21 Jan 2020 23:46:30 +0200 Subject: [PATCH] Improved parameter parsing --- main.go | 49 +++++--------------------------------- models/config.go | 16 +++++++++++++ workflows/downloadUser.go | 27 +++++++++++++++++++++ workflows/downloadVideo.go | 44 ++++++++++++++++++++++++++++++++++ 4 files changed, 93 insertions(+), 43 deletions(-) create mode 100644 workflows/downloadUser.go create mode 100644 workflows/downloadVideo.go diff --git a/main.go b/main.go index 8bc0c3a..4018398 100644 --- a/main.go +++ b/main.go @@ -1,12 +1,8 @@ package main import ( - client "./client" models "./models" - utils "./utils" - "fmt" - "regexp" - "strings" + workflows "./workflows" ) func main() { @@ -14,49 +10,16 @@ func main() { url := models.Config.URL // Single video - match, _ := regexp.MatchString("\\/@.+\\/video\\/[0-9]+", url) - if match { - getUsernameFromVidURLRegex, _ := regexp.Compile("com\\/@.*") - parts := strings.Split(getUsernameFromVidURLRegex.FindString(url), "/") - username := parts[1][1:] - upload := client.GetVideoDetails(url) - downloadDir := fmt.Sprintf("%s/%s", models.Config.OutputPath, username) - - utils.InitOutputDirectory(downloadDir) - downloadVideo(upload, downloadDir) + if workflows.CanUseDownloadSingleVideo(url) { + workflows.DownloadSingleVideo(url) return } // Tiktok user - downloadUser() -} - -func downloadVideo(upload models.Upload, downloadDir string) { - uploadID := upload.GetUploadID() - downloadPath := fmt.Sprintf("%s/%s.mp4", downloadDir, uploadID) - - if utils.CheckIfExists(downloadPath) { - fmt.Println("Upload '" + uploadID + "' already downloaded, skipping") + if workflows.CanUseDownloadUser(url) { + workflows.DownloadUser(models.GetUsername()) return } - fmt.Println("Downloading upload item '" + uploadID + "' to " + downloadPath) - utils.DownloadFile(downloadPath, upload.URL) - - if models.Config.MetaData { - metadataPath := fmt.Sprintf("%s/%s.json", downloadDir, uploadID) - upload.WriteToFile(metadataPath) - } -} - -func downloadUser() { - username := models.Config.URL - downloadDir := fmt.Sprintf("%s/%s", models.Config.OutputPath, username) - uploads := client.GetUserUploads(username) - - utils.InitOutputDirectory(downloadDir) - - for _, upload := range uploads { - downloadVideo(upload, downloadDir) - } + panic("Could not recognise URL format") } diff --git a/models/config.go b/models/config.go index 34ea98d..450542a 100644 --- a/models/config.go +++ b/models/config.go @@ -4,6 +4,8 @@ import ( "flag" "fmt" "os" + "regexp" + "strings" ) // Config - Runtime configuration @@ -32,3 +34,17 @@ func GetConfig() { Config.Debug = *debug Config.MetaData = *metadata } + +// GetUsername - Get's username from passed URL param +func GetUsername() string { + if match := strings.Contains(Config.URL, "/"); !match { // Not url + return strings.Replace(Config.URL, "@", "", -1) + } + + if match, _ := regexp.MatchString(".+tiktok\\.com/@.+", Config.URL); match { // URL + stripedSuffix := strings.Split(Config.URL, "@")[1] + return strings.Split(stripedSuffix, "/")[0] + } + + panic("Could not recognise URL format") +} diff --git a/workflows/downloadUser.go b/workflows/downloadUser.go new file mode 100644 index 0000000..1443620 --- /dev/null +++ b/workflows/downloadUser.go @@ -0,0 +1,27 @@ +package workflows + +import ( + client "../client" + models "../models" + utils "../utils" + "fmt" + "strings" +) + +// CanUseDownloadUser - Test's if this workflow can be used for parameter +func CanUseDownloadUser(url string) bool { + match := strings.Contains(url, "/") + return !match +} + +// DownloadUser - Download all user's videos +func DownloadUser(username string) { + downloadDir := fmt.Sprintf("%s/%s", models.Config.OutputPath, username) + uploads := client.GetUserUploads(username) + + utils.InitOutputDirectory(downloadDir) + + for _, upload := range uploads { + downloadVideo(upload, downloadDir) + } +} diff --git a/workflows/downloadVideo.go b/workflows/downloadVideo.go new file mode 100644 index 0000000..5ad1551 --- /dev/null +++ b/workflows/downloadVideo.go @@ -0,0 +1,44 @@ +package workflows + +import ( + client "../client" + models "../models" + utils "../utils" + "fmt" + "regexp" +) + +// CanUseDownloadSingleVideo - Check's if DownloadSingleVideo can be used for parameter +func CanUseDownloadSingleVideo(url string) bool { + match, _ := regexp.MatchString("\\/@.+\\/video\\/[0-9]+", url) + return match +} + +// DownloadSingleVideo - Downloads single video +func DownloadSingleVideo(url string) { + username := models.GetUsername() + upload := client.GetVideoDetails(url) + downloadDir := fmt.Sprintf("%s/%s", models.Config.OutputPath, username) + + utils.InitOutputDirectory(downloadDir) + downloadVideo(upload, downloadDir) +} + +// DownloadVideo - Downloads one video +func downloadVideo(upload models.Upload, downloadDir string) { + uploadID := upload.GetUploadID() + downloadPath := fmt.Sprintf("%s/%s.mp4", downloadDir, uploadID) + + if utils.CheckIfExists(downloadPath) { + fmt.Println("Upload '" + uploadID + "' already downloaded, skipping") + return + } + + fmt.Println("Downloading upload item '" + uploadID + "' to " + downloadPath) + utils.DownloadFile(downloadPath, upload.URL) + + if models.Config.MetaData { + metadataPath := fmt.Sprintf("%s/%s.json", downloadDir, uploadID) + upload.WriteToFile(metadataPath) + } +}