Git Product home page Git Product logo

laurencerawlings / savify Goto Github PK

View Code? Open in Web Editor NEW
1.1K 1.1K 79.0 579 KB

Download Spotify songs to mp3 with full metadata and cover art!

License: MIT License

Python 89.14% Makefile 4.34% Dockerfile 1.20% Shell 5.31%
album-artwork cover-art downloads-songs ffmpeg id3v2 metadata mp3 playlists podcasts spotify spotify-alternative spotify-api spotify-downloader spotify-playlist spotify-playlist-downloader spotify-to-mp3 spotify-web-api tags youtube youtube-dl

savify's Introduction

Hi there

Website Email

I am a developer from the United Kingdom with knowledge of a wide variety of languages and tools. I studied Computer Science at Swansea University from 2018-2021. To check out some of my work you can visit my website linked above, or check out some of my repositories here. I am always looking for new opportunities, if you would like to get into contact with me send me an email, or use any of the social channels below.

Connect With Me

Linkedin Twitter Discord

Languages & Markups

Python C# Java JavaScript C/C++ PHP Kotlin SQL TypeScript CSS3 SASS Shell HTML5 Markdown ReStructuredText

Tools & Frameworks

VisualStudio VisualStudio Code Unity Blender Git Firebase Laravel Android Studio Node.js Vue.js React Electron TailwindCSS Docker Discord Spotify API AWS Figma GIMP

GitHub

Laurence's GitHub Stats
Top Languages

savify's People

Contributors

devjake avatar laurencerawlings avatar lucanello avatar pyup-bot avatar teilzeittaco avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

savify's Issues

[BUG] This video may be inappropriate for some users.

Describe the bug
Getting, error below when video is only for adult

[ERROR] ERROR: This video may be inappropriate for some users.

To Reproduce

  1. Add to spotify list song which have video on YouTube restricted for adults
  2. Run savify

Expected behavior
Loading music restricted to some users possible.

Screenshots

Desktop (please complete the following information):

  • OS: windows 10
  • Version [2.3.4]

Additional context
Possible solution: https://askubuntu.com/a/1358874

[BUG] Permanent Traceback error in python

Describe the bug
The software worked for a while. But for like 2 weeks it produces this error. I'm not sure what could be the problem as nothing had been changed. I've checked the Path variables and API and deleted older Python versions. Now I have the recent Python 3.9 running, but still this error occurs.
I don't know whether it is a misconfig on my side or a bug, because it seems to work on other users.

To Reproduce
No matter what playlist I use, this error comes up. I've only used -o as an option.

Screenshots
If applicable, add screenshots to help explain your problem.
image

Desktop (please complete the following information):

  • OS: Windows 10, recent version with all updates
  • Python 3.9

Thank you for your awesome application!!

[FEATURE] Log skipped/unfound tracks to a logfile

Is your feature request related to a problem? Please describe.
Currently, Savify simply logs to console which is an issue when running Savify in Docker or not controlling Logs. This is an issue when several tracks are not found or skipped because the song lengths don't match (see #24).

Describe the solution you'd like
Savify should save an error(-only) logfile which explains what tracks couldn't be downloaded and for what reason.

[FEATURE] Comparing track lengths to improve certainty

Is your feature request related to a problem? Please describe.
Right now, Savify searches the track by the song name and simply downloads the best match (1st search result). This often leads to wrong downloads, especially when the song and/or artist name can be misinterpreted. Currently, there is no comparison if the found YouTube video matches the song. The only similarities are the song title and search query for YouTube.

Describe the solution you'd like
There should be a feature added which makes sure that the found YouTube video is the right song.

A way to implement a feature which makes sure the right video is selected could be a comparator between the song and video length. The video should always be about the same length as the song, otherwise something is wrong. There could be a variable which can be modified and tells how many percent the video length can be off. That reduces the risk of false positives (sometimes there are intros and outros added to the YouTube videos).

E.g.: max_length_difference = 0.1 -> A song on Spotify with 3 minutes (= 180 seconds) playtime has to be within the range of 162 seconds to 198 seconds video length.

Informations like the Spotify song length can be extracted from the API, as well as the video length from the HTML and/or the YouTube API.

[BUG] KeyError: 'tag_name'

Describe the bug
When executing savify it tries to fetch updates from https://api.github.com/repos/LaurenceRawlings/savify/releases/latest which in my case i was rate limited.

I guess i was rate limited because my script looked like this:

cat tracks_v1.txt | while read line 
do
    savify $line -g "%artist%/%album%" -q best -f mp3  -o ~/Desktop/music_v1
done

so the function check_for_updates() gets called for every single line in that text file.

Expected behavior
Do not check for updates when the command is issued. Instead let the user look for updates himself.

Screenshots

Script:

[INFO]  Checking for updates...
Traceback (most recent call last):
  File "spotify_downloader.py", line 16, in <module>
    s = Savify(api_credentials=api_creds,
  File "/home/oskar/.local/lib/python3.8/site-packages/savify/savify.py", line 80, in __init__
    self.check_for_updates()
  File "/home/oskar/.local/lib/python3.8/site-packages/savify/savify.py", line 84, in check_for_updates
    latest_ver = requests.get('https://api.github.com/repos/LaurenceRawlings/savify/releases/latest').json()[
KeyError: 'tag_name'

Response from https://api.github.com/repos/LaurenceRawlings/savify/releases/latest link:

{"message":"API rate limit exceeded for XXX.XXX.XXX.XXX. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)","documentation_url":"https://docs.github.com/rest/overview/resources-in-the-rest-api#rate-limiting"}

Desktop:

  • OS: ubuntu
  • Version [2.3.4

QUICK FIX
cloned the repo and uncomment line https://github.com/LaurenceRawlings/savify/blob/main/savify/savify.py#L80

2 issue with savify

  • Savify version: latest
  • Python version: 3.8.1
  • Operating System: win 7 x64

Description

Savify.exe not work on win 7 x64. api-ms-win-core-path-l1-1-0.dll is required. download and put dll on system32 not work.
work with python but have error with API credentials to environment. how to add?

[BUG] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1122)>

Describe the bug
A clear and concise description of what the bug is.
After filling out the correct parameters within the Savify class, the bot would search through the songs and try to download them but retrieve an SSL certificate error

To Reproduce
Run the main.py

Expected behavior
Expected the songs to be downloaded within the FOlder

Screenshots
If applicable, add screenshots to help explain your problem.

Desktop (please complete the following information):

  • OS: Mac
  • Version [2.0,1]

Additional context
I already know what I need to do to fix it. The issue is within the package that is making a user agent to download the files isn't properly configured with the SSL verification.
image

image

Bug : Fails to download because fail save the artwork

  • Savify version:
  • Python version: 3.7
  • Operating System: Windows OS

Description

It downloads the .mp3 file successfully but fails to save the cover image later on so deletes the file completely there should be an option or arg parse statment to not download cover images to avoid this

Update: when I download the playlist for the same track the artwork gets downloaded sucessfully but get the same error messages
"Failed to add artwork" then it deletes all the files

What I Did

>>> from savify import Savify
>>> s = Savify(api_credentials=("user","pass"))
>>> s.download("https://open.spotify.com/track/1feANd8EfcDP5UqSvbheM3")

[DEBUG] [download] Downloading playlist: Sachet Tandon - Bekhayali (From "Kabir Singh") (AUDIO)
[DEBUG] [youtube:search] query "Sachet Tandon - Bekhayali (From "Kabir Singh") (AUDIO)": Downloading page 1
[DEBUG] [youtube:search] playlist Sachet Tandon - Bekhayali (From "Kabir Singh") (AUDIO): Downloading 1 videos
[DEBUG] [download] Downloading video 1 of 1
[DEBUG] [youtube] K9w6UBZOn5o: Downloading webpage
[DEBUG] [youtube] Downloading just video K9w6UBZOn5o because of --no-playlist
[DEBUG] [download] Destination: C:\Users******\AppData\Roaming\Savify\temp\c5008e90-250e-11eb-905b-7c2a3178fa13.webm
[download] 0.0% of 6.05MiB at 14.71KiB/s ETA 07:01
[download] 0.0% of 6.05MiB at 42.86KiB/s ETA 02:24
[download] 0.1% of 6.05MiB at 95.89KiB/s ETA 01:04
[download] 0.2% of 6.05MiB at 200.00KiB/s ETA 00:31
[download] 0.5% of 6.05MiB at 313.13KiB/s ETA 00:19
[download] 1.0% of 6.05MiB at 459.85KiB/s ETA 00:13
[download] 2.0% of 6.05MiB at 404.46KiB/s ETA 00:15
[download] 4.1% of 6.05MiB at 537.97KiB/s ETA 00:11
[download] 8.2% of 6.05MiB at 541.31KiB/s ETA 00:10
[download] 16.5% of 6.05MiB at 579.60KiB/s ETA 00:08
[download] 26.6% of 6.05MiB at 643.97KiB/s ETA 00:07
[download] 39.3% of 6.05MiB at 717.79KiB/s ETA 00:05
[download] 54.5% of 6.05MiB at 790.96KiB/s ETA 00:03
[download] 71.8% of 6.05MiB at 815.21KiB/s ETA 00:02
[download] 86.4% of 6.05MiB at 823.85KiB/s ETA 00:01
[download] 100.0% of 6.05MiB at 870.56KiB/s ETA 00:00
[download] 100% of 6.05MiB in 00:07
[DEBUG] [ffmpeg] Destination: C:\Users\rlalchan\AppData\Roaming\Savify\temp\c5008e90-250e-11eb-905b-7c2a3178fa13.mp3
[DEBUG] Deleting original file C:\Users\rlalchan\AppData\Roaming\Savify\temp\c5008e90-250e-11eb-905b-7c2a3178fa13.webm (pass -k to keep)
[DEBUG] [download] Finished downloading playlist: Sachet Tandon - Bekhayali (From "Kabir Singh") (AUDIO)

Download Finished!
Completed 0/1 tracks in 40.2420s

Failed Tracks:

Track: Bekhayali (From "Kabir Singh")
Reason: Failed to add cover art.

Can not change the quality of mp3

  • Savify version: 2.0.7
  • Python version:3.8.2
  • Operating System: windows 10

Description

When trying to download mp3 and use a custom quality I get and int() error.
Only when use quality=Quality.BEST I get the mp3 without error, but the bitrate is 124kbps in all the mp3 songs.

What I Did

s = Savify(api_credentials=("user","pass"), download_format='mp3', quality=Quality.Q256K, output_path=Path(C:\Users\name\Desktop), group='%album%')
s.download(link)

ERROR: invalid literal for int() with base 10: '256K'

Failed to add cover art

  • Savify version: v2.0.10
  • Python version: 3.8.2
  • Operating System: Win10 64x

Description

I followed the installation steps and everything works fine, but I have the following issue:

[DEBUG] [download] Downloading playlist: James TW - When You Love Someone (AUDIO)
[DEBUG] [youtube:search] query "James TW - When You Love Someone (AUDIO)": Downloading page 1
[DEBUG] [youtube:search] playlist James TW - When You Love Someone (AUDIO): Downloading 1 videos
[DEBUG] [download] Downloading video 1 of 1
[DEBUG] [youtube] Zwu585LtGto: Downloading webpage
[ERROR] ERROR: Zwu585LtGto: YouTube said: Unable to extract video data
[DEBUG] [download] Finished downloading playlist: James TW - When You Love Someone (AUDIO)

Download Finished!
Completed 0/1 tracks in 2.4410s

Failed Tracks:

Track: When You Love Someone
Reason: Failed to add cover art.


As you can see "Reason: Failed to add cover art." how to solve the add cover art issue?

Thanks.
issue

[BUG] Errors showing up when trying to download songs

Describe the bug

  1. [ERROR] ERROR: unable to download video data: HTTP Error 403: Forbidden
  2. [ERROR] ERROR: WARNING: unable to obtain file audio codec with ffprobe
  3. [ERROR] ERROR: unable to rename file: [Errno 2] No such file or directory:
  4. urllib3 (1.26.8) or chardet (3.0.4) doesn't match a supported version!

I am getting these errors all the time when I download. It doesn't seem to affect the actual download, so I'm not sure why it's showing as an error, though some downloads stall for a very long time before completing. Sometimes it gets stuck on the last 1-2 songs in a playlist/album.

To Reproduce
To produce errors:
savify "https://open.spotify.com/playlist/37i9dQZF1DX2kt7dB63bU1" -q best -f mp3 -o "./" -g "%playlist%"

To produce stalling:
savify "https://open.spotify.com/track/5vxhoZSPbnyhJVOd8WOGVR?si=6eec776bde30408c" -q best -f mp3 -o "./" -g "%artist%/%album%"

Expected behavior
Downloads work without error or exit the script if there is an exception.

Screenshots
Screen Shot 2022-01-28 at 12 43 46 PM

Desktop (please complete the following information):

  • OS: MacOS Catalina
  • Version 10.15.7

Failed to add cover art when downloading in wav format

  • Savify version: v2.0.10
  • Python version: 3.9.0
  • Operating System: Windows 10

Description

I tried to download song in wav format, but I got "Reason: Failed to add cover art." error.
I know that "Tags and cover art will only be applied to songs downloaded in mp3 format.", but the wav file is unplayable. Is there any way to disable the art cover? Or is the wav art cover support comming soon?

What I Did



   ┎───────────┒      /$$$$$$                       /$$  /$$$$$$
   ┃(((((((((((┃     /$$__  $$                     |__/ /$$__  $$
   ┃(((((((((((┃    | $$  \__/  /$$$$$$  /$$    /$$ /$$| $$  \__//$$   /$$
   ┃(((((((((((┃    |  $$$$$$  |____  $$|  $$  /$$/| $$| $$$$   | $$  | $$
   ┃(((((((((((┃     \____  $$  /$$$$$$$ \  $$/$$/ | $$| $$_/   | $$  | $$
╭━━┛(((((((((((┗━━╮  /$$  \ $$ /$$__  $$  \  $$$/  | $$| $$     | $$  | $$
 ╲(((((((((((((((╱  |  $$$$$$/|  $$$$$$$   \  $/   | $$| $$     |  $$$$$$$
   ╲(((((((((((╱     \______/  \_______/    \_/    |__/|__/      \____  $$
     ╲(((((((╱                                                   /$$  | $$
       ╲(((╱                                                    |  $$$$$$/
         V                                                       \______/ v2.0.10
                 Copyright (c) 2018-2020 Laurence Rawlings


[DEBUG] [download] Downloading playlist: 2 Chainz - We Own It (Fast & Furious) (AUDIO)
[DEBUG] [youtube:search] query "2 Chainz - We Own It (Fast & Furious) (AUDIO)": Downloading page 1
[DEBUG] [youtube:search] playlist 2 Chainz - We Own It (Fast & Furious) (AUDIO): Downloading 1 videos
[DEBUG] [download] Downloading video 1 of 1
[DEBUG] [youtube] tYQ1Okyi3g4: Downloading webpage
[DEBUG] [youtube] Downloading just video tYQ1Okyi3g4 because of --no-playlist
[DEBUG] [download] Destination: C:\Users\xxx\AppData\Roaming\Savify\temp\64c8cd69-2e68-11eb-ad4c-e09467e0cacb.webm
[download]   0.0% of 3.49MiB at 200.98KiB/s ETA 00:17
[download]   0.1% of 3.49MiB at 602.95KiB/s ETA 00:05
[download]   0.2% of 3.49MiB at  1.37MiB/s ETA 00:03
[download]   0.4% of 3.49MiB at  2.45MiB/s ETA 00:01
[download]   0.9% of 3.49MiB at  1.05MiB/s ETA 00:03
[download]   1.8% of 3.49MiB at  1.54MiB/s ETA 00:02
[download]   3.6% of 3.49MiB at  1.59MiB/s ETA 00:02
[download]   7.1% of 3.49MiB at  1.74MiB/s ETA 00:01
[download]  14.3% of 3.49MiB at  2.03MiB/s ETA 00:01
[download]  28.6% of 3.49MiB at  2.35MiB/s ETA 00:01
[download]  57.3% of 3.49MiB at  2.49MiB/s ETA 00:00
[download] 100.0% of 3.49MiB at  2.57MiB/s ETA 00:00
[download] 100% of 3.49MiB in 00:01
[DEBUG] [ffmpeg] Destination: C:\Users\xxx\AppData\Roaming\Savify\temp\64c8cd69-2e68-11eb-ad4c-e09467e0cacb.wav
[DEBUG] Deleting original file C:\Users\xxx\AppData\Roaming\Savify\temp\64c8cd69-2e68-11eb-ad4c-e09467e0cacb.webm (pass -k to keep)
[DEBUG] [download] Finished downloading playlist: 2 Chainz - We Own It (Fast & Furious) (AUDIO)

Download Finished!
Completed 0/1 tracks in 5.9495s

Failed Tracks:

Track: We Own It (Fast & Furious)
Reason: Failed to add cover art.


C:\Users\xxx\Desktop\savify>

Thanks

[BUG] Not always getting best quality.

Describe the bug
youtube-dl doesn't always use the 'best' quality.

To Reproduce
Download any 'older' album as the source then verify bitrate afterward.

Expected behavior
Expect the bitrate to be higher than 128.

Screenshots
Highlighted the MP3 I downloaded via youtube-dl from the same source according tot he logs.
image

Desktop (please complete the following information):

  • OS: linux
  • Version: 2.3.4

Additional context
Ran commands using defaults and choosing 'best' quality.

Spotify API credentials not setup.

  • Savify version: 2.0.10
  • Python version: 3.9.1
  • Operating System: Windows 10

Description

Trying to use Savify to download a playlist, but receiving error message below. Downloaded latest savify.exe file and did not configure a API.

What I Did

**Command:**
savify "SPOTIFY URL"

Tried several different URLs, all the same error

**Traceback:**
Traceback (most recent call last):
  File "savify\__main__.py", line 11, in <module>
  File "savify\__init__.py", line 24, in cli
  File "click\core.py", line 829, in __call__
  File "click\core.py", line 782, in main
  File "click\core.py", line 1066, in invoke
  File "click\core.py", line 610, in invoke
  File "savify\cli.py", line 57, in main
  File "savify\savify.py", line 46, in __init__
RuntimeError: Spotify API credentials not setup.
[12308] Failed to execute script __main__

Isn't the idea of the .exe file to not setup the Spotify URL?

[BUG] no such option: -m

If I use the template config from docker-scripts/template.config.sh for bulk download, the command fails with

no such option: -m

When I remove the additional options Savify is working, but I want to create a playlist from the downloaded files. Which option do I have to use? I am using the docker version.

[BUG] AttributeError: 'NoneType' object has no attribute 'get_temp_dir'

Hi, Everything Seems to be fine but i get this error:

=================
s = Savify(api_credentials=(".","."), quality=Quality.BEST, download_format=Format.MP3)
File "C:\Python310\lib\site-packages\savify\savify.py", line 75, in init
clean(self.path_holder.get_temp_dir())
AttributeError: 'NoneType' object has no attribute 'get_temp_dir'

My Code:
from savify import Savify
from savify.types import Format, Quality

s = Savify(api_credentials=(".","."), quality=Quality.BEST, download_format=Format.MP3)

Spotify URL

s.download(".")

[BUG] TypeError: download() missing 1 required positional argument: 'query'

Describe the bug
I keep getting this error despite there already been a query_type in the code
please can you evaluate my python and see the issue. Thanks

Traceback (most recent call last):
File "E:\PythonAI\main.py", line 106, in
Savify.download(song_download, query_type=Type.TRACK)
TypeError: download() missing 1 required positional argument: 'query'

Screenshots
data=[]
with open('top50_songs.csv', newline='') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
data.append(row)
col = [x[4] for x in data]
count = 1

Savify(api_credentials=(cid, secret), quality=Quality.BEST, download_format=Format.MP3, path_holder=PathHolder(downloads_path='Saved'))
while count <50:
song_download = col[count]
song_download = song_download.replace('spotify:track:', 'https://open.spotify.com/track/')
Savify.download(song_download, query_type=Type.TRACK)
print(song_download)
count = count + 1

Desktop (please complete the following information):

  • Windows
  • pycharm

Sign In

It says

[WARNING] unable to download video info webpage: HTTP Error 410: Gone
[ERROR] ERROR: Sign in to confirm your age
This video may be inappropriate for some users.

How should i Sign in to confirm my age?

[FEATURE] Skip ffmpeg

Is your feature request related to a problem? Please describe.
I'm looking for the best quality audio, so no conversion please. Perhaps could just restrict the format by passing an arg to youtube-dl e.g. "-f bestaudio[ext=m4a]" but still, need to disable the ffmpeg branch somehow.

Describe the solution you'd like
An argument to skip conversion with ffmpeg, e.g. --raw? or --no-convert?

Describe alternatives you've considered
Using raw youtube-dl or pafy. But I like the metadata handling you do here!

Additional context
Add any other context or screenshots about the feature request here.

Edit: An afterthought is that ID3v2 is probably not supported for all audio formats, so perhaps extra checks are required to e.g. forbid downloading an audio version which cannot have ID3v2 tags or perhaps skip adding them if audio format does not support it. But I think mp3 and mp4/m4a should be fine.

Bug "YouTube said: Unable to extract video data" - Savify.exe

  • Savify version: v2.0.10
  • Python version: 3.9.0
  • Operating System: Windows 10 Home 20H2 64-bit

Description

I wanted to download a song, but an error appeard.

What I Did

savify "https://open.spotify.com/track/2FY7b99s15jUprqC0M5NCT" -q best -f mp3 -g "%artist%/%album%" -o "C:\Users\xxx\Music\Spotify".
[ERROR] ERROR: 9BPfyhhv7-c: YouTube said: Unable to extract video data

Thanks

[FEATURE] missing -a argument

Is your feature request related to a problem? Please describe.

Previous versions there was an option: savify -f flac -a URL. Once provided with artist link, it would download all singles, albums in one go. This seems to be missing within new version.

Describe the solution you'd like
Re-add the ability to download all singles and albums by artist with providing the artist link. Or explaining why this could no longer be supported, if there is anything possible I can do to help add this feature back.

Describe alternatives you've considered
n/a

Additional context
n/a

[FEATURE] Opt for Topic channels or channels with the name of the artist when available?

Hello! I just had an idea that might help improve the certainty of downloads and make the chance of it downloading the right song higher, if there's a Topic channel of what you're downloading, the downloader should opt for that instead of just random channels with the supposed song, plus, it'll most likely download the uncensored/explicit versions of songs instead of censored.

So essentially, it'd be great if the downloader would search for a song, see if it's uploaded on a Topic channel, and if it is, it should snag that download instead of off a random channel, and if it can't find a Topic channel with it, then it should proceed to try to find a channel with the name of the artist of the song with the song on it. I think it'd definitely help ensure you get the right song, plus, combined with feature request #24 , it'd basically ensure that you always get the right download

[FEATURE] Ability to pass youtube-dl arguments

Is your feature request related to a problem? Please describe.
There should be a possibility to directly pass youtube-dl arguments. This is especially handy if you're working in a specific environment where a different configuration of youtube-dl is necessary. For example regarding IPv4/IPv6 switching.

Describe the solution you'd like
It should made possible that you can pass youtube-dl arguments if you want to.

Installation Trouble

  • Savify version: 2.0.5
  • Python version: 3.9
  • Operating System: Windows 10

Description

I tried to follow the installation instructions, but failed.

  • Installed FFMpeg Version as in the instruction
  • Downloaded savify.exe and run it via the command line. Got the error: Cannot open C:\Own\Savify-script.py

[FEATURE] Ability to bulk download artist albums

Is your feature request related to a problem? Please describe.
Currently, Savify does not recognize artist links.

Describe the solution you'd like
It would be awesome if it would be possible to pass Spotify artist links and the script downloads all albums this artist published.
Since artists can also publish playlists and have albums they appeared as co-creator in, there could be flags defining whether to download the additional data.

Describe alternatives you've considered
My current workaround is to pass all albums the artist published one by one.

Savify not downloading songs

Hi, I followed all the instructions and installed savify. At first, it worked and downloaded songs for Spotify but suddenly it detects the songs list but doesn't download anything. It stuck with the downloading screen.
Annotation 2021-02-08 123634

[FEATURE] How are spotify and youtube actually used?

Is your feature request related to a problem? Please describe.
I can't tell from the README how spotify and youtube(-dl) are used in savify, i.e. without digging through the code. Could you elaborate in the README? Perhaps with more examples?

i.e. my best guess atm is that savify uses youtube-dl to get the audio using default arguments (of youtube-dl) and then it uses spotify API to get the metadata and attach it to the file. This is very cool but think it's not clear in the README.

Some more examples would be very useful for each use case, e.g.

  • what happens with "savify artist-title" query? will it just search on youtube for "artist-title" and download audio of first result?
  • what about "savify spotify-url"?
  • also which providers are available and what if you only want to use one, e.g. youtube?

Describe the solution you'd like
README update :)

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

Difference in time.

Difference in time.

Hello!
First, thank you for the script. Everything works well only when I try to download this album https://open.spotify.com/album/3wk2mhdBfUBFk73jozwl1I the first track, Space sounds a little longer than necessary (there is silence at the end of the track). Tell me, can this be fixed in the next versions, because in other scripts that are a little worse than yours, everything works fine, as well as, if possible, add the Album Atrtist tag to mp3 files?

Thanks for your support. ;)

[BUG] Non-Utf8 in Track Name

Describe the bug
Tracks that contain non utf-8 characters, such as symbols or non-latin alphabets cannot be downloaded.

To Reproduce
Steps to reproduce the behavior:

s = Savify(api_credentials=(ID, SECRET), path_holder=PathHolder(downloads_path=path), logger=Logger(log_location='logs'),
    ydl_options={"quiet": True, "logger": None, "no_warnings": True}, group="%playlist%")
s.download(playlist_link, query_type=Type.ALBUM)

Expected behavior
The file to be downloaded and properly renamed.

Screenshots
image

Desktop (please complete the following information):

  • OS: Windows 10
  • Version [2.3.4]

Initial Update

The bot created this issue to inform you that pyup.io has been set up on this repo.
Once you have closed it, the bot will open pull requests for updates as soon as they are available.

Feature Request: Download complete Playlist

  • Savify version: 2.0.7
  • Python version: 3.7.3
  • Operating System: Windows WSL2 / Debian, MacOS

Description

As a User, i would like to download a whole playlist with more than 50 titles. It seems that Spotify has limited the view to 50 titles, so only the first 50 can be downloaded.
At least one possibility to add an offset would be good.

[BUG] UnicodeEncodeError: 'charmap' codec can't encode characters in position 41-49: character maps to undefined

Describe the bug
UnicodeEncodeError: 'charmap' codec can't encode characters in position 41-49: character maps to undefined

To Reproduce
./Savify.exe "https://open.spotify.com/track/2EexjnAQrKPksopkTzIuKs" -q best -f mp3 -o .

Expected behavior
It should download the .mp3

Screenshots
image

Desktop (please complete the following information):

  • OS: Windows
  • Version 10

Additional context
Add any other context about the problem here.

Env. Var is invaild

I added the env var but it still shows "Spotify API credentials not setup!".

[BUG] List index out of range for cover art on specific playlists

Describe the bug
The script can't start the download for two specific, personal playlists.

To Reproduce
Steps to reproduce the behavior [e.g. the command you ran]:
savify "spotify-link" -o /download -g "%playlist%" -q best -f mp3

Expected behavior
The download should continue and, if a single file can't be downloaded, skip this song.

Screenshots

Traceback (most recent call last):
  File "/usr/local/bin/savify", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/savify/cli.py", line 66, in main
    s.download(query, query_type=query_type)
  File "/usr/local/lib/python3.8/site-packages/savify/savify.py", line 91, in download
    queue = self._parse_query(query, query_type=query_type)
  File "/usr/local/lib/python3.8/site-packages/savify/savify.py", line 73, in _parse_query
    result = self.spotify.link(query)
  File "/usr/local/lib/python3.8/site-packages/savify/spotify.py", line 36, in link
    return self._get_playlist_tracks(query)
  File "/usr/local/lib/python3.8/site-packages/savify/spotify.py", line 52, in _get_playlist_tracks
    return _pack_playlist(playlist)
  File "/usr/local/lib/python3.8/site-packages/savify/spotify.py", line 72, in _pack_playlist
    tracks.append(Track(track_data))
  File "/usr/local/lib/python3.8/site-packages/savify/track.py", line 6, in __init__
    self._cover_art_url = spotify_data['album']['images'][0]['url']
IndexError: list index out of range

Desktop (please complete the following information):

  • OS: Docker base image python:3.8-slim based on debian:buster-slim
  • Version: v2.1.3

Option to download only audio files higher than certain bitrate

Hello,
First of all thank your for the great code! It's awesome!
I have a feature request and am hoping you could consider adding it.
Basically I don't like to download any audio files with variable bitrates lower than 200kbps.
In fact if the quality of the music is that low I'd rather not have it in my library.
Is there a way to add a filter option in the command line which defines the lowest accepted quality?
Accordingly in your code first check the highest available bitrates and then only download if it satisfies the filter condition.

For example something like adding [abr>128] after "best" or even as a separate filter tag. See below:

savify "https://open.spotify.com/track/4Dju9g4NCz0LDxwcjonSvI" -q best[abr>128] -f mp3 -o "/path/to/downloads"

Many thanks

[BUG] Missing track number in metadata

Describe the bug
When I download an album with this tool, it does not include the track number in the metadata (or in the filename) so the tracks play out of order.

To Reproduce
I downloaded this url: https://open.spotify.com/album/1vz94WpXDVYIEGja8cjFNa
and opened it in the macos system inspector and VLC.

Additional context
I moved to https://github.com/spotDL/spotify-downloader instead, which allows formatting the name with {track-number} - {title} and seems to have many other nice features

Microsoft Defender - Trojan Alert

  • Savify version: v2.1.2
  • Python version:
  • Operating System: Windows 10

Description

Just downloaded the latest version v2.1.2.
Microsoft Defender blocks execution of savify.exe with the following:

Trojan:Script/Conteban.A!ml

What I Did

executed savify.exe

[BUG] Unable to download API page

Describe the bug
Some kind of API error is in an infinite loop:
Unable to download API page: <urlopen error [Errno 8] nodename nor servname provided, or not known>

To Reproduce
savify "https://open.spotify.com/album/6H4jUZ7n3mPjHPj9kuUlhE" -q best -f mp3 -o "./" -g "%artist%/%album%"

Expected behavior
If there is an API error, just exit the script.

Desktop (please complete the following information):

  • OS: MacOS Catalina
  • Version 10.15.7

Mention that Mp3s ared downloaded from youtube and not from spotify.

  • Savify version:2.0.10
  • Python version:3.8
  • Operating System: Linux

Description

Would be nice to mention in the docs that savify downloads the mp3 from youtube and not from spotify. Only metainformation are used from spotify. So everybody understands that nothing illegal happens.

Instead of this small issue, a nice library.

What I Did

Nothing - I learned new tool mkvirtualenv :-D

[BUG] Savify crashes when attempting to download a track whose title, author or album ends with an ellipsis.

Describe the bug

Savify is unable to process Spotify tracks that end with an ellipsis (...) in either the track's name, album or artist, when grouping by track and album name. This seems to originate from the code to save the downloaded file. This would make sense, as Windows doesn't allow for folders to end with periods; "Folder names cannot end with a period in Windows, though the name can end with a period followed by a whitespace character such as a non-breaking space."

The following error is given:

Traceback (most recent call last):
  File "c:\users\admin\downloads\youtube dl\venv\lib\site-packages\savify\savify.py", line 250, in _download
    ffmpeg.run()
  File "c:\users\admin\downloads\youtube dl\venv\lib\site-packages\ffmpy.py", line 106, in run
    raise FFRuntimeError(self.cmd, self.process.returncode, out[0], out[1])
ffmpy.FFRuntimeError: `ffmpeg -i C:\Users\Admin\AppData\Roaming\Savify\temp/5w5vw9cokQ9s8dHQmQqLX4.mp3 -i C:\Users\Admin\AppData\Roaming\Savify\temp\29eea82c-708f-11eb-9af5-309c2344e680.jpg -loglevel quiet -hide_banner -y -map 0:0 -map 1:0 -c copy -id3v2_version 3 -metadata:s:v "title=Album cover" -metadata:s:v "comment=Cover (front)" "C:\Users\Admin\AppData\Roaming\Savify\downloads\Lyrics Born\Later That Day...\Lyrics Born - Bad Dreams.mp3"` exited with status 1

STDOUT:


STDERR:


During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\users\admin\appdata\local\programs\python\python38\lib\shutil.py", line 788, in move
    os.rename(src, real_dst)
FileNotFoundError: [WinError 3] The system cannot find the path specified: 'C:\\Users\\Admin\\AppData\\Roaming\\Savify\\temp/5w5vw9cokQ9s8dHQmQqLX4.mp3' -> 'C:\\Users\\Admin\\AppData\\Roaming\\Savify\\downloads\\Lyrics Born\\Later That Day...\\Lyrics Born - Bad Dreams.mp3'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\users\admin\appdata\local\programs\python\python38\lib\runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "c:\users\admin\appdata\local\programs\python\python38\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "C:\Users\Admin\Downloads\YouTube DL\venv\Scripts\savify.exe\__main__.py", line 7, in <module>
  File "c:\users\admin\downloads\youtube dl\venv\lib\site-packages\click\core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "c:\users\admin\downloads\youtube dl\venv\lib\site-packages\click\core.py", line 782, in main
    rv = self.invoke(ctx)
  File "c:\users\admin\downloads\youtube dl\venv\lib\site-packages\click\core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "c:\users\admin\downloads\youtube dl\venv\lib\site-packages\click\core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "c:\users\admin\downloads\youtube dl\venv\lib\site-packages\savify\cli.py", line 110, in main
    s.download(query, query_type=query_type)
  File "c:\users\admin\downloads\youtube dl\venv\lib\site-packages\savify\savify.py", line 109, in download
    jobs = pool.map(self._download, queue)
  File "c:\users\admin\appdata\local\programs\python\python38\lib\multiprocessing\pool.py", line 364, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()
  File "c:\users\admin\appdata\local\programs\python\python38\lib\multiprocessing\pool.py", line 771, in get
    raise self._value
  File "c:\users\admin\appdata\local\programs\python\python38\lib\multiprocessing\pool.py", line 125, in worker
    result = (True, func(*args, **kwds))
  File "c:\users\admin\appdata\local\programs\python\python38\lib\multiprocessing\pool.py", line 48, in mapstar
    return list(map(*args))
  File "c:\users\admin\downloads\youtube dl\venv\lib\site-packages\savify\savify.py", line 255, in _download
    move(output_temp, output)
  File "c:\users\admin\appdata\local\programs\python\python38\lib\shutil.py", line 802, in move
    copy_function(src, real_dst)
  File "c:\users\admin\appdata\local\programs\python\python38\lib\shutil.py", line 432, in copy2
    copyfile(src, dst, follow_symlinks=follow_symlinks)
  File "c:\users\admin\appdata\local\programs\python\python38\lib\shutil.py", line 261, in copyfile
    with open(src, 'rb') as fsrc, open(dst, 'wb') as fdst:
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\Admin\\AppData\\Roaming\\Savify\\downloads\\Lyrics Born\\Later That Day...\\Lyrics Born - Bad Dreams.mp3'

To Reproduce

Enter the following command:
savify [redacted; playlist share link] -g "%artist%/%album%"

Expected behaviour

Savify works as intended, downloading missing tracks, grouping them into folders according to the track's title and album. However, when a track's title or album ends with an ellipsis, Savify crashes.

Desktop (please complete the following information):

  • OS Name: Microsoft Windows 10 Pro
  • Version: 10.0.19041 Build 19041

Additional context

As is shown, one such track that Savify cannot process is Bad Dreams by Lyrics Born, on their album Later That Day..., found here.

A second track that also fails is One Step Beyond... by Madness, on their album One Step Beyond. Whilst the Spotify track doesn't contain an ellipsis, it would appear that the YouTube equivalent does.

I imagine the solution is to either re-encode any suffix full-stops/periods with an alternative character or instead simply remove them. Folder names could also be appended with whitespace, although I feel this isn't a great long-term solution.

[BUG] Savify gets stuck in loop when trying to download a song

Describe the bug
Savify keeps looping when there is no video to download

To Reproduce
Steps to reproduce the behavior [e.g. the command you ran]:
savify "一念逍遥" -o /path/to/destistation -g "%artist%/%album%" -vv

Expected behavior
A clear and concise description of what you expected to happen.
Expected to skip downloading or only download the playlist

Screenshots
If applicable, add screenshots to help explain your problem.
image

Desktop (please complete the following information):

  • OS: Ubuntu
  • Version 20.04

[BUG] unable to download due to youtube-dl error

** what happended**

[INFO]  Downloading 1 songs...
[ERROR] ERROR: Signature extraction failed: Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/youtube_dl-2021.1.24.1-py3.8.egg/youtube_dl/extractor/youtube.py", line 1303, in _decrypt_signature
    func = self._extract_signature_function(
  File "/usr/local/lib/python3.8/site-packages/youtube_dl-2021.1.24.1-py3.8.egg/youtube_dl/extractor/youtube.py", line 1204, in _extract_signature_function
    res = self._parse_sig_js(code)
  File "/usr/local/lib/python3.8/site-packages/youtube_dl-2021.1.24.1-py3.8.egg/youtube_dl/extractor/youtube.py", line 1279, in _parse_sig_js
    initial_function = jsi.extract_function(funcname)
  File "/usr/local/lib/python3.8/site-packages/youtube_dl-2021.1.24.1-py3.8.egg/youtube_dl/jsinterp.py", line 245, in extract_function
    raise ExtractorError('Could not find JS function %r' % funcname)
youtube_dl.utils.ExtractorError: Could not find JS function 'na'; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see  https://yt-dl.org/update  on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.
 (caused by ExtractorError("Could not find JS function 'na'; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see  https://yt-dl.org/update  on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.")); please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see  https://yt-dl.org/update  on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.
[ERROR] ERROR: Signature extraction failed: Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/youtube_dl-2021.1.24.1-py3.8.egg/youtube_dl/extractor/youtube.py", line 1303, in _decrypt_signature
    func = self._extract_signature_function(
  File "/usr/local/lib/python3.8/site-packages/youtube_dl-2021.1.24.1-py3.8.egg/youtube_dl/extractor/youtube.py", line 1204, in _extract_signature_function
    res = self._parse_sig_js(code)
  File "/usr/local/lib/python3.8/site-packages/youtube_dl-2021.1.24.1-py3.8.egg/youtube_dl/extractor/youtube.py", line 1279, in _parse_sig_js
    initial_function = jsi.extract_function(funcname)
  File "/usr/local/lib/python3.8/site-packages/youtube_dl-2021.1.24.1-py3.8.egg/youtube_dl/jsinterp.py", line 245, in extract_function
    raise ExtractorError('Could not find JS function %r' % funcname)
youtube_dl.utils.ExtractorError: Could not find JS function 'na'; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see  https://yt-dl.org/update  on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.
 (caused by ExtractorError("Could not find JS function 'na'; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see  https://yt-dl.org/update  on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.")); please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see  https://yt-dl.org/update  on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.
[ERROR] ERROR: Signature extraction failed: Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/youtube_dl-2021.1.24.1-py3.8.egg/youtube_dl/extractor/youtube.py", line 1303, in _decrypt_signature
    func = self._extract_signature_function(
  File "/usr/local/lib/python3.8/site-packages/youtube_dl-2021.1.24.1-py3.8.egg/youtube_dl/extractor/youtube.py", line 1204, in _extract_signature_function
    res = self._parse_sig_js(code)
  File "/usr/local/lib/python3.8/site-packages/youtube_dl-2021.1.24.1-py3.8.egg/youtube_dl/extractor/youtube.py", line 1279, in _parse_sig_js
    initial_function = jsi.extract_function(funcname)
  File "/usr/local/lib/python3.8/site-packages/youtube_dl-2021.1.24.1-py3.8.egg/youtube_dl/jsinterp.py", line 245, in extract_function
    raise ExtractorError('Could not find JS function %r' % funcname)
youtube_dl.utils.ExtractorError: Could not find JS function 'na'; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see  https://yt-dl.org/update  on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.
 (caused by ExtractorError("Could not find JS function 'na'; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see  https://yt-dl.org/update  on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.")); please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see  https://yt-dl.org/update  on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.

To Reproduce

docker run --rm -v "`pwd`:/root/.local/share/Savify/downloads" \
           -e SPOTIPY_CLIENT_ID=xxxxxx \
           -e SPOTIPY_CLIENT_SECRET=xxxx \
           laurencerawlings/savify:latest "https://open.spotify.com/track/4Dju9g4NCz0LDxwcjonSvI"

Expected behavior
no errors.

Desktop (please complete the following information):

  • OS: macos
  • Version 2.3.4
  • youtube-dl version: 2021.06.06
  • ffmpeg version: 4.4.1

[FEATURE] Bulk artist download script

Is your feature request related to a problem? Please describe.
Right now it's only possible to bulk download playlists. A script that adds the ability to download artists should be added.

Describe the solution you'd like
The existing script should be taken apart so you only have to add your credentials a single time. Recurring functions like the naming function should be outsourced aswell.
For even easier use, environment variables could be used here too.

[BUG] unsupported operand type(s) for -: 'str' and 'str'

Describe the bug

The script spams the error
[ERROR] ERROR: unsupported operand type(s) for -: 'str' and 'str'
and doesn't download anything. Even in verbose, it doesn't tell what the problem is.
It was found when using the docker script.

You can use this test playlist to reproduce it: https://open.spotify.com/playlist/4gfEjnxSzYannYuYXk2e9r?si=e408d9fba8e34bca

To Reproduce

Download any playlist with the current version of the source code.

Expected behavior

It should download the songs in the given playlist.

Log

Downloading element: https://open.spotify.com/playlist/4gfEjnxSzYannYuYXk2e9r?si=e408d9fba8e34bca
No VPN found! Running without VPN!
sh: title: not found


  /$$$$$$$$$$$$$      /$$$$$$                       /$$  /$$$$$$
 | $$$$$$$$$$$$$     /$$__  $$                     |__/ /$$__  $$
 | $$$$$$$$$$$$$    | $$  \__/  /$$$$$$  /$$    /$$ /$$| $$  \__//$$   /$$
 | $$$$$$$$$$$$$    |  $$$$$$  |____  $$|  $$  /$$/| $$| $$$$   | $$  | $$
 | $$$$$$$$$$$$$     \____  $$  /$$$$$$$ \  $$/$$/ | $$| $$_/   | $$  | $$
/$$$$$$$$$$$$$$$$$$  /$$  \ $$ /$$__  $$  \  $$$/  | $$| $$     | $$  | $$
\ $$$$$$$$$$$$$$$$/ |  $$$$$$/|  $$$$$$$   \  $/   | $$| $$     |  $$$$$$$
  \ $$$$$$$$$$$$/    \______/  \_______/    \_/    |__/|__/      \____  $$
    \ $$$$$$$$/                                                  /$$  | $$
      \ $$$$/      https://github.com/LaurenceRawlings/savify   |  $$$$$$/
        \_/                                                      \______/ v2.3.4


[INFO]	Checking for updates...
[INFO]	Savify is up to date!
[INFO]	Downloading 2 songs...
[DEBUG]	[download] Downloading playlist: Ai_No_Hana - Please Fix Me audio
[DEBUG]	[youtube:search] query "Ai_No_Hana - Please Fix Me audio": Downloading page 1
[DEBUG]	[download] Downloading playlist: Daniel Pemberton - It's Not Working audio
[DEBUG]	[youtube:search] query "Daniel Pemberton - It's Not Working audio": Downloading page 1
[DEBUG]	[youtube:search] playlist Ai_No_Hana - Please Fix Me audio: Downloading 1 videos
[DEBUG]	[download] Downloading video 1 of 1
[DEBUG]	[youtube] 3r4r0Fm13OY: Downloading webpage
[DEBUG]	[youtube:search] playlist Daniel Pemberton - It's Not Working audio: Downloading 1 videos
[DEBUG]	[download] Downloading video 1 of 1
[DEBUG]	[youtube] _4c0qNrU3wc: Downloading webpage
[DEBUG]	[youtube] Downloading just video 3r4r0Fm13OY because of --no-playlist
[DEBUG]	[youtube] 3r4r0Fm13OY: Downloading MPD manifest
[ERROR]	ERROR: unsupported operand type(s) for -: 'str' and 'str'

Desktop:

  • OS: Ubuntu 20.10
  • Version 2.3.4 (current source code)

Typo in environment variables

  • Savify version: latest
  • Python version: any
  • Operating System: any

Description

There is a typo in the name of the env vars: SPOTIPY_CLIENT_ID and SPOTIPY_CLIENT_SECRET. They should probably be SPOTIFY_CLIENT_ID and SPOTIFY_CLIENT_SECRET

Youtube support?

  • Savify version: latest
  • Python version:3.9
  • Operating System: windows 10 20h4

Description

I'm trying to add Youtube support, but I can't find where to enter the link to check if spotify else youtube link.

What I Did

Please help me.

Grouping not working in .bat files

  • Savify version: v2.0.10
  • Python version: 3.9.0
  • Operating System: Windows 10

Description

I tried to make a .bat file to make downloading easier, but it didn't work.

I made a .bat file looking like this:

@ECHO OFF
echo Please paste the song link
set/p "link=> "
cd C:/savify-dl
savify "link" -q best -f mp3 -g "%artist%/%album%" -o "C:\Users\xxx\Music\Spotify"
pause

And I got this error:
Error: Invalid value for '-g' / '--group': Group must be in the form x or x/x/x... where x in [%artist%, %album%, %playlist%]

Thanks

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.