freedom-legacy/spotify.go

168 lines
5.5 KiB
Go

package main
import (
"encoding/json"
// "log"
"fmt"
"net/http"
"github.com/zmb3/spotify"
"io/ioutil"
)
const baseURL_track = "https://api.spotify.com/v1/tracks/"
const baseURL_playlist = "https://api.spotify.com/v1/playlists/"
const baseURL_playlists = "https://api.spotify.com/v1/me/playlists"
func get_spotify_auth() (auth spotify.Authenticator){
auth = spotify.NewAuthenticator(redirectURI, spotify.ScopeUserReadPrivate, spotify.ScopePlaylistReadPrivate, spotify.ScopePlaylistReadCollaborative, spotify.ScopeUserLibraryRead)
return
}
// TODO: write this fkn func
func check_if_track_is_valid(track_id string) (state bool) {
state = true
// url := baseURL_track + track_id
// httpClient := &http.Client{}
// req, _ := http.NewRequest("GET", url, nil)
// req.Header.Set("Authorization", "Bearer "+oauthToken)
// res, _ := httpClient.Do(req)
// body, _ := ioutil.ReadAll(res.Body)
// data := new(spotifyTrack)
// json.Unmarshal(body, &data)
// if data.IsLocal {
// state = false
// }
return state
}
func download_all_playlist_of_user(owner_id string, folder string) {
url := baseURL_playlists + "?limit=50&offset=0"
httpClient := &http.Client{}
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("Authorization", "Bearer "+oauthToken)
res, _ := httpClient.Do(req)
body, _ := ioutil.ReadAll(res.Body)
data := new(spotifyPlaylistsOfUser)
json.Unmarshal(body, &data)
var counter = 0
for _,playlist := range data.Items {
fmt.Printf("Downloading Playlist => %s <=\n",playlist.Name)
download_playlist_to_folder(playlist.ID,playlist.Owner.ID,folder)
}
if data.Total > 50 {
for(data.Next != nil) {
nextUrl := *data.Next
request, _ := http.NewRequest("GET",nextUrl, nil)
request.Header.Set("Authorization", "Bearer "+oauthToken)
response, _ := httpClient.Do(request)
body, _ = ioutil.ReadAll(response.Body)
json.Unmarshal(body, &data)
for _,playlist := range data.Items {
counter++
fmt.Printf("Downloading Playlist: => %s <=\n",playlist.Name)
download_playlist_to_folder(playlist.ID,playlist.Owner.ID,folder)
}
}
}
}
func download_playlist_to_folder(playlist_id string, owner_id string, folder string) {
playlist_name := get_name_of_playlist(playlist_id,owner_id)
url := baseURL_playlist + playlist_id + "/tracks?limit=100&offset=0"
httpClient := &http.Client{}
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("Authorization", "Bearer "+oauthToken)
res, _ := httpClient.Do(req)
body, _ := ioutil.ReadAll(res.Body)
data := new(spotifyPlaylistsTracks)
json.Unmarshal(body, &data)
folder = folder + playlist_name+"/"
var counter = 0
for _,track := range data.Items {
counter++
fmt.Println("Nr: ",counter," | Title: ",track.Track.Name," | Artist: ",track.Track.Artists[0].Name)
if track.Track.ID == "" {
// TODO: add file to manual_download list if no spotify id exist
fmt.Printf("track '%s - %s' is a local file. please download this track manually",track.Track.Artists[0].Name,track.Track.Name)
} else {
download_track_to_folder(track.Track.ID,folder)
}
}
if data.Total > 100 {
for(data.Next != nil) {
nextUrl := *data.Next
request, _ := http.NewRequest("GET",nextUrl, nil)
request.Header.Set("Authorization", "Bearer "+oauthToken)
response, _ := httpClient.Do(request)
body, _ = ioutil.ReadAll(response.Body)
json.Unmarshal(body, &data)
for _,track := range data.Items {
counter++
fmt.Println("Nr: ",counter," | Title: ",track.Track.Name," | Artist: ",track.Track.Artists[0].Name)
if track.Track.ID == "" {
// TODO: add file to manual_download list if no spotify id exist
fmt.Printf("track '%s - %s' is a local file. please download this track manually\n",track.Track.Artists[0].Name,track.Track.Name)
} else {
download_track_to_folder(track.Track.ID,folder)
}
}
}
}
fmt.Println("--------------------")
}
func get_name_of_playlist(playlist_id string, owner_id string) (name string) {
url := baseURL_playlist + playlist_id
httpClient := &http.Client{}
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("Authorization", "Bearer "+oauthToken)
res, _ := httpClient.Do(req)
body, _ := ioutil.ReadAll(res.Body)
data := new(spotifyPlaylist)
json.Unmarshal(body, &data)
name = data.Name
return
}
func download_track_to_folder(track_id string, folder string) {
track_name, artist_name := get_track_and_artist_name(track_id)
filename := track_name+" - "+artist_name
youtube_url := search_on_youtube(filename)
download_mp3_from_youtube(youtube_url,folder,filename)
}
// TODO: return error on failure
func get_track_and_artist_name(track_id string) (track_name string, artist_name string){
url := baseURL_track + track_id + "?market=DE"
httpClient := &http.Client{}
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("Authorization", "Bearer "+oauthToken)
res, _ := httpClient.Do(req)
body, _ := ioutil.ReadAll(res.Body)
data := new(spotifyTrack)
json.Unmarshal(body, &data)
return data.Name, data.Artists[0].Name
}