From 3263ff4e07e033095b4ac4cda625d64a437cabc3 Mon Sep 17 00:00:00 2001 From: imsamuka Date: Sun, 2 Jan 2022 22:58:03 -0300 Subject: [PATCH] fix GET requests url encoding --- src/search/spotify.cr | 36 +++++++++++++++++------------------- src/search/youtube.cr | 11 +++++------ 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/search/spotify.cr b/src/search/spotify.cr index 45e9262..ae95492 100755 --- a/src/search/spotify.cr +++ b/src/search/spotify.cr @@ -60,9 +60,10 @@ class SpotifySearcher # ``` def find_item(item_type : String, item_parameters : Hash, offset = 0, limit = 20) : JSON::Any? - query = generate_query(item_type, item_parameters, offset, limit) + query = generate_query(item_type, item_parameters) - url = @root_url.join("search?q=#{query}").to_s + url = "search?q=#{query}&type=#{item_type}&limit=#{limit}&offset=#{offset}" + url = @root_url.join(url).to_s response = HTTP::Client.get(url, headers: @access_header) error_check(response) @@ -228,8 +229,7 @@ class SpotifySearcher # Generates url to run a GET request against to the Spotify open API # Returns a `String.` - private def generate_query(item_type : String, item_parameters : Hash, - offset : Int32, limit : Int32) : String + private def generate_query(item_type : String, item_parameters : Hash) : String query = "" # parameter keys to exclude in the api request. These values will be put @@ -241,9 +241,9 @@ class SpotifySearcher if k == "name" # will remove the "name:" param from the query if item_type == "playlist" - query += item_parameters[k].gsub(" ", "+") + "+" + query += item_parameters[k] + "+" else - query += param_encode(item_type, item_parameters[k]) + query += as_field(item_type, item_parameters[k]) end # check if the key is to be excluded @@ -254,14 +254,21 @@ class SpotifySearcher # NOTE: playlist names will be inserted into the query normally, without # a parameter. else - query += param_encode(k, item_parameters[k]) + query += as_field(k, item_parameters[k]) end end - # extra api info - query += "&type=#{item_type}&limit=#{limit}&offset=#{offset}" + return URI.encode(query.rchop("+")) + end - return query + # Returns a `String` encoded for the spotify api + # + # ``` + # query_encode("album", "A Night At The Opera") + # => "album:A Night At The Opera+" + # ``` + private def as_field(key, value) : String + return "#{key}:#{value}+" end # Ranks the given items based off of the info from parameters. @@ -327,15 +334,6 @@ class SpotifySearcher end end - # Returns a `String` encoded for the spotify api - # - # ``` - # query_encode("album", "A Night At The Opera") - # => "album:A+Night+At+The+Opera" - # ``` - private def param_encode(key : String, value : String) : String - return key.gsub(" ", "+") + ":" + value.gsub(" ", "+") + "+" - end end # puts SpotifySearcher.new() diff --git a/src/search/youtube.cr b/src/search/youtube.cr index 554459e..3bdd2a4 100755 --- a/src/search/youtube.cr +++ b/src/search/youtube.cr @@ -39,12 +39,10 @@ module Youtube song_name = spotify_metadata["name"].as_s artist_name = spotify_metadata["artists"][0]["name"].as_s - human_query = song_name + " " + artist_name + " " + search_terms.strip - url_query = human_query.gsub(" ", "+") + human_query = "#{song_name} #{artist_name} #{search_terms.strip}" + params = HTTP::Params.encode({"search_query" => human_query}) - search_url = "https://www.youtube.com/results?search_query=" + url_query - - response = HTTP::Client.get(search_url) + response = HTTP::Client.get("https://www.youtube.com/results?#{params}") yt_metadata = get_yt_search_metadata(response.body) @@ -189,7 +187,8 @@ module Youtube url = "https://www.youtube.com/watch?v=#{vID}" # this is an internal endpoint to validate the video ID - response = HTTP::Client.get "https://www.youtube.com/oembed?format=json&url=#{url}" + params = HTTP::Params.encode({"format" => "json", "url" => url}) + response = HTTP::Client.get "https://www.youtube.com/oembed?#{params}" return nil unless response.success? res_json = JSON.parse(response.body)