Initial commit
commit
1d34cca728
|
@ -0,0 +1,3 @@
|
|||
.env
|
||||
.cache
|
||||
.idea/
|
|
@ -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.
|
|
@ -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'])
|
|
@ -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).
|
|
@ -0,0 +1,3 @@
|
|||
spotipy~=2.18.0
|
||||
python-dotenv~=0.14.0
|
||||
termcolor~=1.1.0
|
Loading…
Reference in New Issue