Fix tests and const.py to hold options

This commit is contained in:
ritiek
2018-01-11 21:50:40 +05:30
parent 77dab0665d
commit fce2a1abcd
11 changed files with 132 additions and 147 deletions

8
core/const.py Normal file
View File

@@ -0,0 +1,8 @@
import logzero
_log_format = ("%(color)s%(levelname)s:%(end_color)s %(message)s")
formatter = logzero.LogFormatter(fmt=_log_format)
# options
log = logzero.setup_logger(formatter=formatter)
args = None

View File

@@ -1,6 +1,6 @@
import subprocess import subprocess
import os import os
from core.logger import log from core.const import log
"""What are the differences and similarities between ffmpeg, libav, and avconv? """What are the differences and similarities between ffmpeg, libav, and avconv?

View File

@@ -1,27 +1,38 @@
import logging
import argparse import argparse
import os import os
import sys import sys
from core.logger import log_leveller, _LOG_LEVELS_STR
_LOG_LEVELS_STR = ['INFO', 'WARNING', 'ERROR', 'DEBUG']
def log_leveller(log_level_str):
loggin_levels = [logging.INFO, logging.WARNING, logging.ERROR, logging.DEBUG]
log_level_str_index = _LOG_LEVELS_STR.index(log_level_str)
loggin_level = loggin_levels[log_level_str_index]
return loggin_level
def get_arguments(): def get_arguments(to_group=False, raw_args=None):
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description='Download and convert songs from Spotify, Youtube etc.', description='Download and convert songs from Spotify, Youtube etc.',
formatter_class=argparse.ArgumentDefaultsHelpFormatter) formatter_class=argparse.ArgumentDefaultsHelpFormatter)
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument( if to_group:
'-s', '--song', help='download song by spotify link or name') group = parser.add_mutually_exclusive_group(required=True)
group.add_argument(
'-l', '--list', help='download songs from a file') group.add_argument(
group.add_argument( '-s', '--song', help='download song by spotify link or name')
'-p', '--playlist', help='load songs from playlist URL into <playlist_name>.txt') group.add_argument(
group.add_argument( '-l', '--list', help='download songs from a file')
'-b', '--album', help='load songs from album URL into <album_name>.txt') group.add_argument(
group.add_argument( '-p', '--playlist', help='load songs from playlist URL into <playlist_name>.txt')
'-u', '--username', group.add_argument(
help="load songs from user's playlist into <playlist_name>.txt") '-b', '--album', help='load songs from album URL into <album_name>.txt')
group.add_argument(
'-u', '--username',
help="load songs from user's playlist into <playlist_name>.txt")
parser.add_argument( parser.add_argument(
'-m', '--manual', default=False, '-m', '--manual', default=False,
help='choose the song to download manually', action='store_true') help='choose the song to download manually', action='store_true')
@@ -59,10 +70,7 @@ def get_arguments():
type=str.upper, type=str.upper,
help='set log verbosity') help='set log verbosity')
parsed = parser.parse_args() parsed = parser.parse_args(raw_args)
parsed.log_level = log_leveller(parsed.log_level) parsed.log_level = log_leveller(parsed.log_level)
return parsed return parsed
parsed = get_arguments()

View File

@@ -1,5 +1,5 @@
from slugify import SLUG_OK, slugify from slugify import SLUG_OK, slugify
from core.logger import log from core.const import log
import os import os

View File

@@ -1,16 +0,0 @@
import logzero
import logging
_LOG_LEVELS_STR = ['INFO', 'WARNING', 'ERROR', 'DEBUG']
def log_leveller(log_level_str):
loggin_levels = [logging.INFO, logging.WARNING, logging.ERROR, logging.DEBUG]
log_level_str_index = _LOG_LEVELS_STR.index(log_level_str)
loggin_level = loggin_levels[log_level_str_index]
return loggin_level
log_format = ("%(color)s%(levelname)s:%(end_color)s %(message)s")
formatter = logzero.LogFormatter(fmt=log_format)
# create a default logger
log = logzero.setup_logger(formatter=formatter)

View File

@@ -1,7 +1,7 @@
from mutagen.easyid3 import EasyID3 from mutagen.easyid3 import EasyID3
from mutagen.id3 import ID3, APIC from mutagen.id3 import ID3, APIC
from mutagen.mp4 import MP4, MP4Cover from mutagen.mp4 import MP4, MP4Cover
from core.logger import log from core.const import log
import urllib.request import urllib.request

View File

@@ -4,9 +4,7 @@ from titlecase import titlecase
import pprint import pprint
from core import internals from core import internals
from core import logger from core.const import log
log = logger.log
def generate_token(): def generate_token():

View File

@@ -1,13 +1,12 @@
import pafy import pafy
from core import internals from core import internals
from core import arguments from core import const
from core.logger import log
import os import os
import pprint import pprint
args = arguments.parsed log = const.log
def go_pafy(raw_song, meta_tags=None): def go_pafy(raw_song, meta_tags=None):
@@ -36,15 +35,15 @@ def get_youtube_title(content, number=None):
def download_song(file_name, content): def download_song(file_name, content):
""" Download the audio file from YouTube. """ """ Download the audio file from YouTube. """
if args.input_ext in (".webm", ".m4a"): if const.args.input_ext in (".webm", ".m4a"):
link = content.getbestaudio(preftype=args.input_ext[1:]) link = content.getbestaudio(preftype=const.args.input_ext[1:])
else: else:
return False return False
if link: if link:
log.debug('Downloading from URL: ' + link.url) log.debug('Downloading from URL: ' + link.url)
filepath = '{0}{1}'.format(os.path.join(args.folder, file_name), filepath = '{0}{1}'.format(os.path.join(const.args.folder, file_name),
args.input_ext) const.args.input_ext)
log.debug('Saving to: ' + filepath) log.debug('Saving to: ' + filepath)
link.download(filepath=filepath) link.download(filepath=filepath)
return True return True
@@ -63,7 +62,7 @@ def generate_youtube_url(raw_song, meta_tags, tries_remaining=5):
'maxResults' : 50, 'maxResults' : 50,
'type' : 'video' } 'type' : 'video' }
if args.music_videos_only: if const.args.music_videos_only:
query['videoCategoryId'] = '10' query['videoCategoryId'] = '10'
if not meta_tags: if not meta_tags:
@@ -97,7 +96,7 @@ def generate_youtube_url(raw_song, meta_tags, tries_remaining=5):
log.debug(pprint.pformat(videos)) log.debug(pprint.pformat(videos))
if args.manual: if const.args.manual:
log.info(song) log.info(song)
log.info('0. Skip downloading this song.\n') log.info('0. Skip downloading this song.\n')
# fetch all video links on first page on YouTube # fetch all video links on first page on YouTube

View File

@@ -1,13 +1,13 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# -*- coding: UTF-8 -*- # -*- coding: UTF-8 -*-
from core import logger from core import const
from core import handle
from core import metadata from core import metadata
from core import convert from core import convert
from core import internals from core import internals
from core import spotify_tools from core import spotify_tools
from core import youtube_tools from core import youtube_tools
from core import arguments
from slugify import slugify from slugify import slugify
import spotipy import spotipy
import pafy import pafy
@@ -24,10 +24,10 @@ def check_exists(music_file, raw_song, meta_tags):
""" Check if the input song already exists in the given folder. """ """ Check if the input song already exists in the given folder. """
log.debug('Cleaning any temp files and checking ' log.debug('Cleaning any temp files and checking '
'if "{}" already exists'.format(music_file)) 'if "{}" already exists'.format(music_file))
songs = os.listdir(args.folder) songs = os.listdir(const.args.folder)
for song in songs: for song in songs:
if song.endswith('.temp'): if song.endswith('.temp'):
os.remove(os.path.join(args.folder, song)) os.remove(os.path.join(const.args.folder, song))
continue continue
# check if any song with similar name is already present in the given folder # check if any song with similar name is already present in the given folder
file_name = internals.sanitize_title(music_file) file_name = internals.sanitize_title(music_file)
@@ -36,29 +36,29 @@ def check_exists(music_file, raw_song, meta_tags):
if internals.is_spotify(raw_song): if internals.is_spotify(raw_song):
# check if the already downloaded song has correct metadata # check if the already downloaded song has correct metadata
# if not, remove it and download again without prompt # if not, remove it and download again without prompt
already_tagged = metadata.compare(os.path.join(args.folder, song), already_tagged = metadata.compare(os.path.join(const.args.folder, song),
meta_tags) meta_tags)
log.debug('Checking if it is already tagged correctly? {}', log.debug('Checking if it is already tagged correctly? {}',
already_tagged) already_tagged)
if not already_tagged: if not already_tagged:
os.remove(os.path.join(args.folder, song)) os.remove(os.path.join(const.args.folder, song))
return False return False
log.warning('"{}" already exists'.format(song)) log.warning('"{}" already exists'.format(song))
if args.overwrite == 'prompt': if const.args.overwrite == 'prompt':
log.info('"{}" has already been downloaded. ' log.info('"{}" has already been downloaded. '
'Re-download? (y/N): '.format(song)) 'Re-download? (y/N): '.format(song))
prompt = input('> ') prompt = input('> ')
if prompt.lower() == 'y': if prompt.lower() == 'y':
os.remove(os.path.join(args.folder, song)) os.remove(os.path.join(const.args.folder, song))
return False return False
else: else:
return True return True
elif args.overwrite == 'force': elif const.args.overwrite == 'force':
os.remove(os.path.join(args.folder, song)) os.remove(os.path.join(const.args.folder, song))
log.info('Overwriting "{}"'.format(song)) log.info('Overwriting "{}"'.format(song))
return False return False
elif args.overwrite == 'skip': elif const.args.overwrite == 'skip':
log.info('Skipping "{}"'.format(song)) log.info('Skipping "{}"'.format(song))
return True return True
return False return False
@@ -157,32 +157,32 @@ def grab_single(raw_song, number=None):
if not refined_songname == ' - ': if not refined_songname == ' - ':
songname = refined_songname songname = refined_songname
if args.dry_run: if const.args.dry_run:
return return
file_name = internals.sanitize_title(songname) file_name = internals.sanitize_title(songname)
if not check_exists(file_name, raw_song, meta_tags): if not check_exists(file_name, raw_song, meta_tags):
if youtube_tools.download_song(file_name, content): if youtube_tools.download_song(file_name, content):
input_song = file_name + args.input_ext input_song = file_name + const.args.input_ext
output_song = file_name + args.output_ext output_song = file_name + const.args.output_ext
print('') print('')
try: try:
convert.song(input_song, output_song, args.folder, convert.song(input_song, output_song, const.args.folder,
avconv=args.avconv) avconv=const.args.avconv)
except FileNotFoundError: except FileNotFoundError:
encoder = 'avconv' if args.avconv else 'ffmpeg' encoder = 'avconv' if const.args.avconv else 'ffmpeg'
log.warning('Could not find {0}, skipping conversion'.format(encoder)) log.warning('Could not find {0}, skipping conversion'.format(encoder))
args.output_ext = args.input_ext const.args.output_ext = const.args.input_ext
output_song = file_name + args.output_ext output_song = file_name + const.args.output_ext
if not args.input_ext == args.output_ext: if not const.args.input_ext == const.args.output_ext:
os.remove(os.path.join(args.folder, input_song)) os.remove(os.path.join(const.args.folder, input_song))
if not args.no_metadata: if not const.args.no_metadata:
if metadata: if metadata:
metadata.embed(os.path.join(args.folder, output_song), meta_tags) metadata.embed(os.path.join(const.args.folder, output_song), meta_tags)
else: else:
log.warning('Could not find metadata') log.warning('Could not find metadata')
@@ -196,27 +196,27 @@ token = spotify_tools.generate_token()
spotify = spotipy.Spotify(auth=token) spotify = spotipy.Spotify(auth=token)
if __name__ == '__main__': if __name__ == '__main__':
args = arguments.parsed const.args = handle.get_arguments()
internals.filter_path(args.folder) internals.filter_path(const.args.folder)
logger.log = logger.logzero.setup_logger(formatter=logger.formatter, const.log = const.logzero.setup_logger(formatter=const.formatter,
level=args.log_level) level=const.args.log_level)
log = logger.log log = const.log
log.debug('Python version: {}'.format(sys.version)) log.debug('Python version: {}'.format(sys.version))
log.debug('Platform: {}'.format(platform.platform())) log.debug('Platform: {}'.format(platform.platform()))
log.debug(pprint.pformat(args.__dict__)) log.debug(pprint.pformat(const.args.__dict__))
try: try:
if args.song: if const.args.song:
grab_single(raw_song=args.song) grab_single(raw_song=const.args.song)
elif args.list: elif const.args.list:
grab_list(text_file=args.list) grab_list(text_file=const.args.list)
elif args.playlist: elif const.args.playlist:
grab_playlist(playlist=args.playlist) grab_playlist(playlist=const.args.playlist)
elif args.album: elif const.args.album:
spotify_tools.grab_album(album=args.album) spotify_tools.grab_album(album=const.args.album)
elif args.username: elif const.args.username:
spotify_tools.feed_playlist(username=args.username) spotify_tools.feed_playlist(username=const.args.username)
# Actually we don't necessarily need this, but yeah... # Actually we don't necessarily need this, but yeah...
# Explicit is better than implicit! # Explicit is better than implicit!

View File

@@ -1,32 +1,26 @@
# -*- coding: UTF-8 -*- # -*- coding: UTF-8 -*-
from spotdl import logger from spotdl import const
from spotdl import handle
import spotdl import spotdl
import os import os
const.args = handle.get_arguments(to_group=False, raw_args='')
const.args.folder = 'test'
const.args.overwrite = 'skip'
const.args.log_level = handle.logging.DEBUG
spotdl.args = const.args
spotdl.log = const.logzero.setup_logger(formatter=const.formatter,
level=const.args.log_level)
raw_song = "Tony's Videos VERY SHORT VIDEO 28.10.2016" raw_song = "Tony's Videos VERY SHORT VIDEO 28.10.2016"
test_args = '-f test -ll debug -m --overwrite skip'.split()
class TestArgs:
manual = False
input_ext = '.m4a'
output_ext = '.mp3'
folder = 'test'
log_level = logger.logging.DEBUG
overwrite = 'skip'
music_videos_only = False
setattr(spotdl, "args", TestArgs())
spotdl.log = logger.logzero.setup_logger(formatter=logger.formatter,
level=spotdl.args.log_level)
def test_youtube_url(): def test_youtube_url():
expect_url = 'http://youtube.com/watch?v=qOOcy2-tmbk' expect_url = 'http://youtube.com/watch?v=qOOcy2-tmbk'
url = spotdl.generate_youtube_url(raw_song, meta_tags=None) url = spotdl.youtube_tools.generate_youtube_url(raw_song, meta_tags=None)
assert url == expect_url assert url == expect_url
@@ -34,8 +28,8 @@ def test_youtube_title():
global content global content
global title global title
expect_title = "Tony's Videos VERY SHORT VIDEO 28.10.2016" expect_title = "Tony's Videos VERY SHORT VIDEO 28.10.2016"
content = spotdl.go_pafy(raw_song, meta_tags=None) content = spotdl.youtube_tools.go_pafy(raw_song, meta_tags=None)
title = spotdl.get_youtube_title(content) title = spotdl.youtube_tools.get_youtube_title(content)
assert title == expect_title assert title == expect_title
def test_check_exists(): def test_check_exists():
@@ -50,7 +44,7 @@ def test_download():
expect_download = True expect_download = True
# prerequisites for determining filename # prerequisites for determining filename
file_name = spotdl.internals.sanitize_title(title) file_name = spotdl.internals.sanitize_title(title)
download = spotdl.download_song(file_name, content) download = spotdl.youtube_tools.download_song(file_name, content)
assert download == expect_download assert download == expect_download
@@ -61,9 +55,9 @@ def test_convert():
file_name = spotdl.internals.sanitize_title(title) file_name = spotdl.internals.sanitize_title(title)
global input_song global input_song
global output_song global output_song
input_song = file_name + spotdl.args.input_ext input_song = file_name + const.args.input_ext
output_song = file_name + spotdl.args.output_ext output_song = file_name + const.args.output_ext
convert = spotdl.convert.song(input_song, output_song, spotdl.args.folder) convert = spotdl.convert.song(input_song, output_song, const.args.folder)
assert convert == expect_convert assert convert == expect_convert
@@ -73,8 +67,8 @@ def test_metadata():
meta_tags = spotdl.spotify_tools.generate_metadata(raw_song) meta_tags = spotdl.spotify_tools.generate_metadata(raw_song)
file_name = spotdl.internals.sanitize_title(title) file_name = spotdl.internals.sanitize_title(title)
if meta_tags: if meta_tags:
metadata_output = spotdl.metadata.embed(os.path.join(spotdl.args.folder, output_song), meta_tags) metadata_output = spotdl.metadata.embed(os.path.join(const.args.folder, output_song), meta_tags)
metadata_input = spotdl.metadata.embed(os.path.join(spotdl.args.folder, input_song), meta_tags) metadata_input = spotdl.metadata.embed(os.path.join(const.args.folder, input_song), meta_tags)
else: else:
metadata_input = None metadata_input = None
metadata_output = None metadata_output = None
@@ -85,7 +79,7 @@ def test_check_exists2():
expect_check = True expect_check = True
# prerequisites for determining filename # prerequisites for determining filename
file_name = spotdl.internals.sanitize_title(title) file_name = spotdl.internals.sanitize_title(title)
os.remove(os.path.join(spotdl.args.folder, input_song)) os.remove(os.path.join(const.args.folder, input_song))
check = spotdl.check_exists(file_name, raw_song, meta_tags=None) check = spotdl.check_exists(file_name, raw_song, meta_tags=None)
os.remove(os.path.join(spotdl.args.folder, output_song)) os.remove(os.path.join(const.args.folder, output_song))
assert check == expect_check assert check == expect_check

View File

@@ -1,54 +1,48 @@
# -*- coding: UTF-8 -*- # -*- coding: UTF-8 -*-
from spotdl import logger from spotdl import const
from spotdl import handle
import spotdl import spotdl
import os import os
const.args = handle.get_arguments(to_group=False, raw_args='')
const.args.folder = 'test'
const.args.overwrite = 'skip'
const.args.log_level = handle.logging.DEBUG
spotdl.args = const.args
spotdl.log = const.logzero.setup_logger(formatter=const.formatter,
level=const.args.log_level)
raw_song = 'http://open.spotify.com/track/0JlS7BXXD07hRmevDnbPDU' raw_song = 'http://open.spotify.com/track/0JlS7BXXD07hRmevDnbPDU'
class TestArgs:
manual = False
input_ext = '.m4a'
output_ext = '.mp3'
folder = 'test'
log_level = 'DEBUG'
overwrite = 'skip'
music_videos_only = False
test_args = TestArgs()
setattr(spotdl, "args", test_args)
spotdl.log = logger.logzero.setup_logger(formatter=logger.formatter,
level=spotdl.args.log_level)
spotdl.internals.filter_path(spotdl.args.folder)
def test_spotify_title(): def test_spotify_title():
expect_title = 'David André Østby - Intro' expect_title = 'David André Østby - Intro'
global meta_tags global meta_tags
meta_tags = spotdl.spotify_tools.generate_metadata(raw_song) meta_tags = spotdl.spotify_tools.generate_metadata(raw_song)
title = spotdl.generate_songname(meta_tags) title = spotdl.internals.generate_songname(meta_tags)
assert title == expect_title assert title == expect_title
def youtube_url(): def test_youtube_url():
expect_url = 'youtube.com/watch?v=rg1wfcty0BA' expect_url = 'http://youtube.com/watch?v=rg1wfcty0BA'
url = spotdl.generate_youtube_url(raw_song, meta_tags) url = spotdl.youtube_tools.generate_youtube_url(raw_song, meta_tags)
assert url == expect_url assert url == expect_url
def youtube_title(): def test_youtube_title():
expect_title = 'Intro - David André Østby' expect_title = 'Intro - David André Østby'
content = spotdl.go_pafy(raw_song, meta_tags) content = spotdl.youtube_tools.go_pafy(raw_song, meta_tags)
title = spotdl.get_youtube_title(content) title = spotdl.youtube_tools.get_youtube_title(content)
assert title == expect_title assert title == expect_title
def test_check_exists(): def test_check_exists():
expect_check = False expect_check = False
# prerequisites for determining filename # prerequisites for determining filename
songname = spotdl.generate_songname(meta_tags) songname = spotdl.internals.generate_songname(meta_tags)
global file_name global file_name
file_name = spotdl.internals.sanitize_title(songname) file_name = spotdl.internals.sanitize_title(songname)
check = spotdl.check_exists(file_name, raw_song, meta_tags) check = spotdl.check_exists(file_name, raw_song, meta_tags)
@@ -58,8 +52,8 @@ def test_check_exists():
def test_download(): def test_download():
expect_download = True expect_download = True
# prerequisites for determining filename # prerequisites for determining filename
content = spotdl.go_pafy(raw_song, meta_tags) content = spotdl.youtube_tools.go_pafy(raw_song, meta_tags)
download = spotdl.download_song(file_name, content) download = spotdl.youtube_tools.download_song(file_name, content)
assert download == expect_download assert download == expect_download