Initial commit

master
kolbyd 2021-06-09 21:07:42 -04:00
commit 1d34cca728
No known key found for this signature in database
GPG Key ID: 58EB626C079F3E9C
5 changed files with 145 additions and 0 deletions

3
.gitignore vendored 100644
View File

@ -0,0 +1,3 @@
.env
.cache
.idea/

21
LICENSE.md 100644
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2021 Kolby Dunning
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

70
Main.py 100644
View File

@ -0,0 +1,70 @@
import os
import spotipy
from datetime import date
from dotenv import load_dotenv
from termcolor import colored
def chunks(l, n):
for i in range(0, len(l), n):
yield l[i:i+n]
# Check if the environment file exists
if os.path.exists('.env'):
load_dotenv()
pass
else:
with open('.env', 'x') as f:
f.write("# .env\n"
"SPOTIFY_CLIENT_ID=\n"
"SPOTIFY_CLIENT_SECRET=")
print(colored("Fill in the required fields in '.env'.", "yellow"))
exit(1)
# Ensure we have our ID and secret from Spotify's API
if os.getenv("SPOTIFY_CLIENT_ID") is None or os.getenv("SPOTIFY_CLIENT_SECRET") is None:
print(colored("Ensure you have included your Spotify credentials. If you don't have them, please make an app at "
"developer.spotify.com", "red"))
exit(1)
print("Connecting to Spotify. " + colored("Check your browser in case there is a login prompt.", "yellow"))
spotify = spotipy.Spotify(auth_manager=spotipy.oauth2.SpotifyOAuth(
client_id=os.getenv("SPOTIFY_CLIENT_ID"),
client_secret=os.getenv("SPOTIFY_CLIENT_SECRET"),
redirect_uri="http://localhost:8080/callback/",
scope="user-library-read playlist-modify-public playlist-modify-private")
)
print("Connected to Spotify successfully. Starting the converter.")
flag = True # Spotify doesn't want to return all liked songs. Set to false when done.
offset = 0 # Offset to spotify songs
tracks = []
while flag:
chunk = spotify.current_user_saved_tracks(50, offset)
for track in chunk['items']:
tracks.append(track['track']['uri'])
if chunk['next'] is None:
flag = False
offset += 50
# Check if the user wants the playlist to be public
playlist_public = input(colored("Do you want the playlist to be public? (y/n)", "green") +
colored(" [n] ", "yellow")) == "y"
new_playlist = spotify.user_playlist_create(spotify.current_user()['id'],
"Liked Songs - " + date.today().strftime("%m-%d-%Y"),
playlist_public,
description="Auto generated from this user's liked songs.")
# Use chunks of 100 due to Spotify limitations
for chunk in chunks(tracks, 100):
spotify.playlist_add_items(new_playlist['id'], chunk)
print("Complete! Check out your new playlist at " + new_playlist['external_urls']['spotify'])

48
README.md 100644
View File

@ -0,0 +1,48 @@
# Spotify Playlist Converter
### Developed by [Kolby Dunning](https://kolbyd.ca) (kolbyd)
## Setup
### Spotify
If you do not have a Spotify account, ensure that you have that first.
Go to [developer.spotify.com](https://developer.spotify.com/) and log in with your account. Create a new
app, and go into it. Click 'edit settings', add `http://localhost:8080/callback/` as your redirect URI.
Copy the client ID and secret to add to the `.env` file.
The file should be the same as the one shown below:
```
# .env
SPOTIFY_CLIENT_ID={your client ID}
SPOTIFY_CLIENT_SECRET={your client secret}
```
If you run `Main.py` and you don't have the variables set or the file doesn't exist, you will told by the
CLI.
### Python
This project was built in Python 3.8. If you don't currently have Python, please visit
[python.org/downloads](https://www.python.org/downloads/).
1. Run `pip install -r requirements.txt` to install the dependencies.
1. Fill in the required fields in `.env` (if you haven't already)
1. Run `python Main.py`
1. Follow the steps from the CLI.
## Contribution Guide
I always appreciate contributions to my work. I prefer pull requests over issues, but both work.
### Pull Request
- Please document your code when required
- Explain the modifications you made in the description
- What did you solve? Why is this a good addition?
### Issues
Even though it is labeled issues, feel free to add new feature requests as well.
- Say what the issue/feature is.
- Why does this need to be fixed/why is it a good addition?
- How would you reproduce (if it's an issue)?
## Help/Questions?
Please email me at [kolby[at]kolbyd.ca](mailto:kolby@kolbyd.ca).

3
requirements.txt 100644
View File

@ -0,0 +1,3 @@
spotipy~=2.18.0
python-dotenv~=0.14.0
termcolor~=1.1.0