From 3affdc830a10adfcee549b6eab6967fabc4c7cff Mon Sep 17 00:00:00 2001 From: Nitesh Sawant Date: Mon, 15 Jan 2018 23:50:19 +0530 Subject: [PATCH 1/9] Tell the user to install `unicode-slugify` in case of ImportError --- core/internals.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/core/internals.py b/core/internals.py index ca7f6ed..800567f 100755 --- a/core/internals.py +++ b/core/internals.py @@ -1,6 +1,10 @@ -from slugify import SLUG_OK, slugify from core.const import log +try: + from slugify import SLUG_OK, slugify +except ImportError: + log.warning('Remove any other slugifies and install unicode-slugify') + import os @@ -68,11 +72,11 @@ def filter_path(path): def videotime_from_seconds(time): - if time<60: + if time < 60: return str(time) - if time<3600: - return '{}:{}'.format(str(time//60), str(time%60).zfill(2)) + if time < 3600: + return '{}:{}'.format(str(time // 60), str(time % 60).zfill(2)) - return '{}:{}:{}'.format(str(time//60), - str((time%60)//60).zfill(2), - str((time%60)%60).zfill(2)) + return '{}:{}:{}'.format(str(time // 60), + str((time % 60) // 60).zfill(2), + str((time % 60) % 60).zfill(2)) From 7cccabc14571627186838767bfddc66cf4e20233 Mon Sep 17 00:00:00 2001 From: Nitesh Sawant Date: Tue, 23 Jan 2018 00:02:06 +0530 Subject: [PATCH 2/9] Changed code as per PR comments --- .vscode/settings.json | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..615aafb --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.pythonPath": "/usr/bin/python3" +} \ No newline at end of file From 9ed7347f03f947139fe5d3b6423570eb1a456647 Mon Sep 17 00:00:00 2001 From: Nitesh Sawant Date: Tue, 23 Jan 2018 00:06:08 +0530 Subject: [PATCH 3/9] Changes as per PR comments --- .vscode/settings.json | 3 --- core/internals.py | 10 ++++++---- 2 files changed, 6 insertions(+), 7 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 615aafb..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "python.pythonPath": "/usr/bin/python3" -} \ No newline at end of file diff --git a/core/internals.py b/core/internals.py index a379cfe..5f14781 100755 --- a/core/internals.py +++ b/core/internals.py @@ -1,15 +1,17 @@ -from slugify import SLUG_OK, slugify +import sys from core import const +log = const.log + try: from slugify import SLUG_OK, slugify except ImportError: - log.warning('Remove any other slugifies and install unicode-slugify') + log.error('Oops! `unicode-slugify` was not found.') + log.info('Please remove any other slugify library and install `unicode-slugify`') + sys.exit(5) import os -log = const.log - formats = { 0 : 'track_name', 1 : 'artist', 2 : 'album', From 988427d88184ecbfc2aa203a36b53ea17ae1acc2 Mon Sep 17 00:00:00 2001 From: Nitesh Sawant Date: Tue, 23 Jan 2018 22:03:39 +0530 Subject: [PATCH 4/9] Fix merge conflict Changed videotime_from_seconds function to fix merge conflict. --- core/internals.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/internals.py b/core/internals.py index 5f14781..99e29e3 100755 --- a/core/internals.py +++ b/core/internals.py @@ -107,12 +107,13 @@ def filter_path(path): os.remove(os.path.join(path, temp)) + def videotime_from_seconds(time): if time < 60: return str(time) if time < 3600: - return '{}:{}'.format(str(time // 60), str(time % 60).zfill(2)) + return '{0}:{1:02}'.format(time//60, time % 60) - return '{}:{}:{}'.format(str(time // 60), - str((time % 60) // 60).zfill(2), - str((time % 60) % 60).zfill(2)) + return '{0}:{1:02}:{2:02}'.format((time//60)//60, + (time//60) % 60, + time % 60) From 6bd2a716668ba8337e1aa1c677a8a95744984477 Mon Sep 17 00:00:00 2001 From: Nitesh Sawant Date: Sun, 4 Feb 2018 15:46:08 +0530 Subject: [PATCH 5/9] Implemented passing config.yml as command line argument --- core/handle.py | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/core/handle.py b/core/handle.py index a2bb9a5..f6af0ea 100644 --- a/core/handle.py +++ b/core/handle.py @@ -1,4 +1,4 @@ -from core import internals +from core import internals,const import logging import yaml @@ -53,6 +53,27 @@ def get_config(config_file): return cfg['spotify-downloader'] +def override_config(config_file, parser, raw_args=None, ): + """ """ + config_file = os.path.join(sys.path[0], 'config.yml') + config = merge(default_conf['spotify-downloader'], get_config(config_file)) + + parser.set_defaults(avconv=config['avconv']) + parser.set_defaults(download_only_metadata=config['download-only-metadata']) + parser.set_defaults(dry_run=config['dry-run']) + parser.set_defaults(file_format=config['file-format']) + parser.set_defaults(folder=os.path.relpath(config['folder'], os.getcwd())) + parser.set_defaults(input_ext=config['input-ext']) + parser.set_defaults(log_level=config['log-level']) + parser.set_defaults(manual=config['manual']) + parser.set_defaults(music_videos_only=config['music-videos-only']) + parser.set_defaults(no_metadata=config['no-metadata']) + parser.set_defaults(no_spaces=config['no-spaces']) + parser.set_defaults(output_ext=config['output-ext']) + parser.set_defaults(overwrite=config['overwrite']) + + return parser.parse_args(raw_args) + def get_arguments(raw_args=None, to_group=True, to_merge=True): parser = argparse.ArgumentParser( description='Download and convert songs from Spotify, Youtube etc.', @@ -129,8 +150,16 @@ def get_arguments(raw_args=None, to_group=True, to_merge=True): choices=_LOG_LEVELS_STR, type=str.upper, help='set log verbosity') + parser.add_argument( + '-c', '--config', default=None, + help='Replace with custom config file' + ) parsed = parser.parse_args(raw_args) parsed.log_level = log_leveller(parsed.log_level) + if parsed.config is not None and to_merge: + print("Config file passed") + parsed = override_config(parsed.config,parser) + pass return parsed From e1ffa92b9c148c115eb24aeb7cd4c8611d86d9f2 Mon Sep 17 00:00:00 2001 From: Nitesh Sawant Date: Sun, 4 Feb 2018 16:01:37 +0530 Subject: [PATCH 6/9] wrote help description for def override_config --- core/handle.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/handle.py b/core/handle.py index f6af0ea..508a35e 100644 --- a/core/handle.py +++ b/core/handle.py @@ -54,8 +54,8 @@ def get_config(config_file): def override_config(config_file, parser, raw_args=None, ): - """ """ - config_file = os.path.join(sys.path[0], 'config.yml') + """ Override default dict with config dict passed as comamnd line argument. """ + config_file = os.path.realpath(config_file) config = merge(default_conf['spotify-downloader'], get_config(config_file)) parser.set_defaults(avconv=config['avconv']) @@ -159,7 +159,6 @@ def get_arguments(raw_args=None, to_group=True, to_merge=True): parsed.log_level = log_leveller(parsed.log_level) if parsed.config is not None and to_merge: - print("Config file passed") parsed = override_config(parsed.config,parser) pass return parsed From 8550abd06a1052b12bf88e25bd0d99fce50714bf Mon Sep 17 00:00:00 2001 From: Nitesh Sawant Date: Sun, 4 Feb 2018 16:07:39 +0530 Subject: [PATCH 7/9] Removed unnecessary imports --- core/handle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/handle.py b/core/handle.py index 508a35e..4b7366d 100644 --- a/core/handle.py +++ b/core/handle.py @@ -1,4 +1,4 @@ -from core import internals,const +from core import internals import logging import yaml From 0e3249646fed51fe75fbecda01ba6fb0b0ff6b83 Mon Sep 17 00:00:00 2001 From: Nitesh Sawant Date: Sun, 4 Feb 2018 22:36:04 +0530 Subject: [PATCH 8/9] Made Changes as per comments on PR removed the unnecessary comma and space at the end! put the closing bracket on the previous line, as it's done with all the other parser.add_argument calls. remove the pass - it's completely unneccesary. --- README.md | 7 +++++++ core/handle.py | 11 +++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 3235d0f..f3e1a21 100755 --- a/README.md +++ b/README.md @@ -140,6 +140,8 @@ optional arguments: (default: False) -ll {INFO,WARNING,ERROR,DEBUG}, --log-level {INFO,WARNING,ERROR,DEBUG} set log verbosity (default: INFO) + -c CONFIG_FILE_PATH --config CONFIG_FILE_PATH + path to custom config.yml file ``` #### Download by Name @@ -261,6 +263,11 @@ to override any default options. Also note that config options are overridden by command-line arguments. +#### Specify the Custom Config File Path + +If you want to use custom `config.yml` instead of default one, you can use `-c`/`--config` option. +E.g. `$ python3 spotdl.py -s "adele hello" -c "/home/user/customConfig.yml"` + ## [Docker Image](https://hub.docker.com/r/ritiek/spotify-downloader/) [![Docker automated build](https://img.shields.io/docker/automated/jrottenberg/ffmpeg.svg)](https://hub.docker.com/r/ritiek/spotify-downloader) [![Docker pulls](https://img.shields.io/docker/pulls/ritiek/spotify-downloader.svg)](https://hub.docker.com/r/ritiek/spotify-downloader) diff --git a/core/handle.py b/core/handle.py index 4b7366d..1d8c695 100644 --- a/core/handle.py +++ b/core/handle.py @@ -40,7 +40,6 @@ def merge(default, config): merged.update(config) return merged - def get_config(config_file): try: with open(config_file, 'r') as ymlfile: @@ -53,7 +52,7 @@ def get_config(config_file): return cfg['spotify-downloader'] -def override_config(config_file, parser, raw_args=None, ): +def override_config(config_file, parser, raw_args=None): """ Override default dict with config dict passed as comamnd line argument. """ config_file = os.path.realpath(config_file) config = merge(default_conf['spotify-downloader'], get_config(config_file)) @@ -152,13 +151,13 @@ def get_arguments(raw_args=None, to_group=True, to_merge=True): help='set log verbosity') parser.add_argument( '-c', '--config', default=None, - help='Replace with custom config file' - ) + help='Replace with custom config.yml file') parsed = parser.parse_args(raw_args) - parsed.log_level = log_leveller(parsed.log_level) if parsed.config is not None and to_merge: parsed = override_config(parsed.config,parser) - pass + + parsed.log_level = log_leveller(parsed.log_level) + return parsed From a8f261edaedd5a2ac9838e309a51772291da1dcf Mon Sep 17 00:00:00 2001 From: Nitesh Sawant Date: Mon, 5 Feb 2018 23:01:44 +0530 Subject: [PATCH 9/9] Changes as per second PR review --- README.md | 4 ++-- core/handle.py | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f3e1a21..b975f82 100755 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ optional arguments: -ll {INFO,WARNING,ERROR,DEBUG}, --log-level {INFO,WARNING,ERROR,DEBUG} set log verbosity (default: INFO) -c CONFIG_FILE_PATH --config CONFIG_FILE_PATH - path to custom config.yml file + Replace with custom config.yml file (default: None) ``` #### Download by Name @@ -265,7 +265,7 @@ Also note that config options are overridden by command-line arguments. #### Specify the Custom Config File Path -If you want to use custom `config.yml` instead of default one, you can use `-c`/`--config` option. +If you want to use custom `.yml` configuration instead of the default one, you can use `-c`/`--config` option. E.g. `$ python3 spotdl.py -s "adele hello" -c "/home/user/customConfig.yml"` ## [Docker Image](https://hub.docker.com/r/ritiek/spotify-downloader/) diff --git a/core/handle.py b/core/handle.py index 1d8c695..9eaa817 100644 --- a/core/handle.py +++ b/core/handle.py @@ -40,6 +40,7 @@ def merge(default, config): merged.update(config) return merged + def get_config(config_file): try: with open(config_file, 'r') as ymlfile: @@ -73,6 +74,7 @@ def override_config(config_file, parser, raw_args=None): return parser.parse_args(raw_args) + def get_arguments(raw_args=None, to_group=True, to_merge=True): parser = argparse.ArgumentParser( description='Download and convert songs from Spotify, Youtube etc.',