From e8a71b25302d21bd88dae9972484c7acc8ceb82a Mon Sep 17 00:00:00 2001 From: Who23 <40632266+Who23@users.noreply.github.com> Date: Fri, 4 Sep 2020 20:49:07 -0400 Subject: [PATCH] Add ability to specifiy youtube URL source Added a new flag (-u) to specify a youtube URL source when downloading a single song. --- README.md | 1 + src/bottle/cli.cr | 4 +++- src/glue/song.cr | 30 +++++++++++++++++++++--------- src/search/youtube.cr | 11 +++++++++++ 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 9c763bc..9ab8d77 100755 --- a/README.md +++ b/README.md @@ -54,6 +54,7 @@ Arguments: -s, --song Specify song name to download -A, --album Specify the album name to download -p, --playlist Specify the playlist name to download + -u, --url Specify the youtube url to download from Examples: $ irs --song "Bohemian Rhapsody" --artist "Queen" diff --git a/src/bottle/cli.cr b/src/bottle/cli.cr index 2cbf378..542d510 100755 --- a/src/bottle/cli.cr +++ b/src/bottle/cli.cr @@ -20,6 +20,7 @@ class CLI [["-s", "--song"], "song", "string"], [["-A", "--album"], "album", "string"], [["-p", "--playlist"], "playlist", "string"], + [["-u", "--url"], "url", "string"], ] @args : Hash(String, String) @@ -48,6 +49,7 @@ class CLI #{Style.blue "-s, --song "} Specify song name to download #{Style.blue "-A, --album "} Specify the album name to download #{Style.blue "-p, --playlist "} Specify the playlist name to download + #{Style.blue "-u, --url "} Specify the youtube url to download from (for single songs only) #{Style.bold "Examples:"} $ #{Style.green %(irs --song "Bohemian Rhapsody" --artist "Queen")} @@ -82,7 +84,7 @@ class CLI elsif @args["song"]? && @args["artist"]? s = Song.new(@args["song"], @args["artist"]) s.provide_client_keys(Config.client_key, Config.client_secret) - s.grab_it + s.grab_it(@args["url"]?) s.organize_it(Config.music_directory) exit elsif @args["album"]? && @args["artist"]? diff --git a/src/glue/song.cr b/src/glue/song.cr index 2cc175a..dba2996 100755 --- a/src/glue/song.cr +++ b/src/glue/song.cr @@ -24,7 +24,9 @@ class Song ], "url" => [ " Searching for URL ...\r", - Style.green(" + ") + Style.dim("URL found \n") + Style.green(" + ") + Style.dim("URL found \n"), + " Validating URL ...\r", + Style.green(" + ") + Style.dim("URL validated \n") ], "download" => [ " Downloading video:\n", @@ -47,11 +49,12 @@ class Song end # Find, downloads, and tags the mp3 song that this class represents. - # + # Optionally takes a youtube URL to download from + # # ``` # Song.new("Bohemian Rhapsody", "Queen").grab_it # ``` - def grab_it + def grab_it(url : (String | Nil) = nil) outputter("intro", 0) if !@spotify_searcher.authorized? && !@metadata @@ -81,14 +84,23 @@ class Song data = @metadata.as(JSON::Any) @filename = data["track_number"].to_s + " - #{data["name"].to_s}.mp3" - outputter("url", 0) - url = Youtube.find_url(@song_name, @artist_name, search_terms: "lyrics") if !url - raise("There was no url found on youtube for " + - %("#{@song_name}" by "#{@artist_name}. ) + - "Check your input and try again.") + outputter("url", 0) + url = Youtube.find_url(@song_name, @artist_name, search_terms: "lyrics") + if !url + raise("There was no url found on youtube for " + + %("#{@song_name}" by "#{@artist_name}. ) + + "Check your input and try again.") + end + outputter("url", 1) + else + outputter("url", 2) + if !Youtube.is_valid_url(url) + raise("The url '#{url}' is an invalid youtube URL " + + "Check the URL and try again") + end + outputter("url", 3) end - outputter("url", 1) outputter("download", 0) Ripper.download_mp3(url.as(String), @filename) diff --git a/src/search/youtube.cr b/src/search/youtube.cr index 7242ea3..635286a 100755 --- a/src/search/youtube.cr +++ b/src/search/youtube.cr @@ -23,6 +23,17 @@ module Youtube alias NODES_CLASS = Array(Hash(String, String)) + # Checks if the given URL is a valid youtube URL + # + # ``` + # Youtube.is_valid_url("https://www.youtube.com/watch?v=NOTANACTUALVIDEOID") + # => false + # ``` + def is_valid_url(url : String) : Bool + response = HTTP::Client.get(url) + return !(response.status_code == 404) + end + # Finds a youtube url based off of the given information. # The query to youtube is constructed like this: # " "