Skip to content

Commit 24acbba

Browse files
committed
add basic audiobook support
1 parent abbcd67 commit 24acbba

1 file changed

Lines changed: 106 additions & 78 deletions

File tree

pythonbits/bb.py

Lines changed: 106 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,13 @@ def confirm_finalization(self, fields):
6161
fields or self.default_fields)
6262

6363
def subcategory(self):
64-
files = []
65-
for root, _, fs in os.walk(self['path']):
64+
path = self['path']
65+
if os.path.isfile(path):
66+
files = [(os.path.getsize(path), path)]
67+
else:
68+
files = []
69+
70+
for root, _, fs in os.walk(path):
6671
for f in fs:
6772
fpath = os.path.join(root, f)
6873
files.append((os.path.getsize(fpath), fpath))
@@ -863,35 +868,15 @@ def _render_form_description(self):
863868

864869

865870
class AudioSubmission(BbSubmission):
866-
default_fields = ("description", "form_tags", "year", "cover", "artist",
867-
"title", "format", "bitrate", "media")
871+
default_fields = ("description", "form_tags", "year", "cover",
872+
"title", "format", "bitrate")
868873

869874
def subcategory(self):
870-
return MusicSubmission
871-
872-
873-
class MusicSubmission(AudioSubmission):
874-
default_fields = (AudioSubmission.default_fields + (
875-
'remaster', 'remaster_year', 'remaster_title'))
876-
_form_type = 'Music'
877-
878-
@form_field('remaster_true', 'checkbox')
879-
def _render_remaster(self):
880-
# todo user input function/module to reduce boilerplating
881-
return bool(
882-
input('Is this a special/remastered edition? [y/N] ').lower()
883-
== 'y')
884-
885-
@form_field('remaster_year')
886-
def _render_remaster_year(self):
887-
if self['remaster']:
888-
return input('Please enter the remaster year: ')
875+
release, rg = self['release']
889876

890-
@form_field('remaster_title')
891-
def _render_remaster_title(self):
892-
if self['remaster']:
893-
return (input('Please enter the remaster title (optional): ')
894-
or None)
877+
if 'Audiobook' in rg['secondary-type-list']:
878+
return AudiobookSubmission
879+
return MusicSubmission
895880

896881
@form_field('format')
897882
def _render_format(self):
@@ -944,23 +929,6 @@ def _render_bitrate(self):
944929
log.debug("format:{}\ntags:{}", format, tags)
945930
raise RuntimeError('Unrecognized format/bitrate')
946931

947-
@form_field('media')
948-
def _render_media(self):
949-
# choices = ['CD', 'DVD', 'Vinyl', 'Soundboard', 'DAT', 'Web']
950-
951-
media = self['summary']['media']
952-
if len(media) > 1:
953-
log.debug(media)
954-
media = media[0]
955-
956-
if media == 'CD':
957-
return media
958-
elif media == 'Digital Media':
959-
return 'Web'
960-
elif "vinyl" in media.lower():
961-
return 'Vinyl'
962-
963-
raise NotImplementedError(media)
964932

965933
def _render_mediainfo_path(self):
966934
assert os.path.isdir(self['path'])
@@ -1023,7 +991,6 @@ def _render_tags(self):
1023991

1024992
def _render_release(self):
1025993
tags = self['tags']
1026-
# print(tags)
1027994
if tags['rid']:
1028995
log.info('Found MusicBrainz release in tags')
1029996
release = mb.musicbrainzngs.get_release_by_id(
@@ -1047,8 +1014,8 @@ def _render_release(self):
10471014
# identify self:
10481015
# - num tracks todo
10491016
# - scan for mb tags
1050-
print('rg', rg)
1051-
print('r', release)
1017+
log.debug('release-group {}', rg)
1018+
log.debug('release', release)
10521019

10531020
# todo: assert release group matches!
10541021
# e.g.: assert # of tracks equal
@@ -1078,37 +1045,12 @@ def _render_cover(self):
10781045
return cover
10791046

10801047
def _finalize_cover(self):
1081-
return imagehosting.upload_files(self['cover'])
1048+
return imagehosting.upload(self['cover'])
10821049

10831050
@form_field('year')
10841051
def _render_year(self):
10851052
return self['summary']['year']
10861053

1087-
@form_field('tags')
1088-
def _render_form_tags(self):
1089-
_defaults = {
1090-
'acoustic', 'alternative', 'ambient', 'blues', 'classic.rock',
1091-
'classical', 'country', 'dance', 'dubstep', 'electronic',
1092-
'experimental', 'folk', 'funk', 'hardcore', 'heavy.metal',
1093-
'hip.hop', 'indie', 'indie.pop', 'instrumental', 'jazz', 'metal',
1094-
'pop', 'post.hardcore', 'post.rock', 'progressive.rock',
1095-
'psychedelic', 'punk', 'reggae', 'rock', 'soul', 'trance',
1096-
'trip.hop'}
1097-
tags = self['summary']['tags']
1098-
if not tags:
1099-
tags = input("No tags found. Please enter tags "
1100-
"(comma-separated): ").split(',')
1101-
tags = set(format_tag(tag) for tag in tags)
1102-
while True:
1103-
try:
1104-
assert tags & _defaults != set()
1105-
except AssertionError:
1106-
print("Default tags:\n" + ", ".join(sorted(_defaults)))
1107-
print("Submission must contain at least one default tag.")
1108-
tags = rlinput("Enter tags: ", ",".join(tags)).split(',')
1109-
tags = set(format_tag(tag) for tag in tags)
1110-
else:
1111-
return ",".join(tags)
11121054

11131055
def _render_links(self):
11141056
release, rg = self['release']
@@ -1188,14 +1130,100 @@ def _render_release_desc(self):
11881130

11891131
return description
11901132

1133+
@form_field('scene', 'checkbox')
1134+
def _render_scene(self):
1135+
return False
1136+
1137+
def _get_tags(self, required_tags):
1138+
tags = self['summary']['tags']
1139+
if not tags:
1140+
tags = input("No tags found. Please enter tags "
1141+
"(comma-separated): ").split(',')
1142+
tags = set(format_tag(tag) for tag in tags)
1143+
tags -= {'audiobook'}
1144+
while True:
1145+
try:
1146+
assert tags & required_tags != set()
1147+
except AssertionError:
1148+
print("Default tags:\n" + ", ".join(sorted(required_tags)))
1149+
print("Submission must contain at least one default tag.")
1150+
tags = rlinput("Enter tags: ", ",".join(tags)).split(',')
1151+
tags = set(format_tag(tag) for tag in tags)
1152+
else:
1153+
return ",".join(tags)
1154+
1155+
1156+
class AudiobookSubmission(AudioSubmission):
1157+
_form_type = 'Audiobooks'
1158+
1159+
@form_field('tags')
1160+
def _render_form_tags(self):
1161+
_defaults = {'fiction', 'non.fiction'}
1162+
return self._get_tags(_defaults)
1163+
1164+
@form_field('title')
1165+
def _render_title(self):
1166+
return "{} - {}".format(
1167+
self['summary']['artist'], self['summary']['title'])
1168+
1169+
1170+
class MusicSubmission(AudioSubmission):
1171+
default_fields = (AudioSubmission.default_fields + (
1172+
'artist', 'remaster', 'remaster_year', 'remaster_title', 'media',))
1173+
_form_type = 'Music'
1174+
1175+
@form_field('remaster_true', 'checkbox')
1176+
def _render_remaster(self):
1177+
# todo user input function/module to reduce boilerplating
1178+
return bool(
1179+
input('Is this a special/remastered edition? [y/N] ').lower()
1180+
== 'y')
1181+
1182+
@form_field('remaster_year')
1183+
def _render_remaster_year(self):
1184+
if self['remaster']:
1185+
return input('Please enter the remaster year: ')
1186+
1187+
@form_field('remaster_title')
1188+
def _render_remaster_title(self):
1189+
if self['remaster']:
1190+
return (input('Please enter the remaster title (optional): ')
1191+
or None)
1192+
1193+
@form_field('media')
1194+
def _render_media(self):
1195+
# choices = ['CD', 'DVD', 'Vinyl', 'Soundboard', 'DAT', 'Web']
1196+
1197+
media = self['summary']['media']
1198+
if len(media) > 1:
1199+
log.debug(media)
1200+
media = media[0]
1201+
1202+
if media == 'CD':
1203+
return media
1204+
elif media == 'Digital Media':
1205+
return 'Web'
1206+
elif "vinyl" in media.lower():
1207+
return 'Vinyl'
1208+
1209+
raise NotImplementedError(media)
1210+
1211+
@form_field('tags')
1212+
def _render_form_tags(self):
1213+
_defaults = {
1214+
'acoustic', 'alternative', 'ambient', 'blues', 'classic.rock',
1215+
'classical', 'country', 'dance', 'dubstep', 'electronic',
1216+
'experimental', 'folk', 'funk', 'hardcore', 'heavy.metal',
1217+
'hip.hop', 'indie', 'indie.pop', 'instrumental', 'jazz', 'metal',
1218+
'pop', 'post.hardcore', 'post.rock', 'progressive.rock',
1219+
'psychedelic', 'punk', 'reggae', 'rock', 'soul', 'trance',
1220+
'trip.hop'}
1221+
return self._get_tags(_defaults)
1222+
11911223
@form_field('artist')
11921224
def _render_artist(self):
11931225
return self['summary']['artist']
11941226

11951227
@form_field('title')
11961228
def _render_title(self):
11971229
return self['summary']['title']
1198-
1199-
@form_field('scene', 'checkbox')
1200-
def _render_scene(self):
1201-
return False

0 commit comments

Comments
 (0)