Skip to content

Commit a1687cb

Browse files
committed
add music track listing
1 parent 4b2b1f0 commit a1687cb

2 files changed

Lines changed: 92 additions & 36 deletions

File tree

pythonbits/bb.py

Lines changed: 90 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -917,30 +917,40 @@ def _render_bitrate(self):
917917
format = self['format']
918918
tags = self['tags']
919919
if format == 'MP3':
920-
if tags['encoder_settings'] == '-V 0':
920+
if '-V 0' in tags['encoder_settings']:
921921
return 'V0(VBR)'
922-
elif tags['encoder_settings'] == '-V 2':
922+
elif '-V 2' in tags['encoder_settings']:
923923
return 'V2(VBR)'
924-
elif tags['bitrate'] == 192000:
925-
return '192'
926-
elif tags['bitrate'] == 256000:
927-
return '256'
928-
elif tags['bitrate'] == 320000:
929-
return '320'
924+
elif tags['bitrate_mode'] in [mutagen.mp3.BitrateMode.CBR,
925+
mutagen.mp3.BitrateMode.UNKNOWN]:
926+
if abs(tags['bitrate']-192000) < 100:
927+
return '192'
928+
elif abs(tags['bitrate']-256000) < 100:
929+
return '256'
930+
elif abs(tags['bitrate']-320000) < 100:
931+
return '320'
930932

931933
elif 'FLAC' in format:
932934
return 'Lossless'
933935

934-
raise Exception('Unrecognized format/bitrate')
936+
log.debug("format:{}\ntags:{}", format, tags)
937+
raise RuntimeError('Unrecognized format/bitrate')
935938

936939
@form_field('media')
937940
def _render_media(self):
938941
media = self['summary']['media']
942+
if len(media) > 1:
943+
log.debug(media)
944+
media = media[0]
939945

940-
if len(media) == 1:
941-
return media[0]
946+
if media == 'CD':
947+
return media
948+
elif media == 'Digital Media':
949+
return 'Web'
950+
elif "vinyl" in media.lower():
951+
return 'Vinyl'
942952

943-
raise Exception('Handle this')
953+
raise NotImplementedError(media)
944954

945955
def _render_mediainfo_path(self):
946956
assert os.path.isdir(self['path'])
@@ -953,41 +963,56 @@ def _render_mediainfo_path(self):
953963
return full_path
954964
raise Exception('No media file found')
955965

956-
def _render_songlist(self):
957-
# from musicbrainz release
966+
def _render_tracklist(self):
967+
release, _ = self['release']
968+
full_tracklist = []
969+
mediumlist = release['medium-list']
970+
971+
for medium in mediumlist:
972+
log.debug('medium {}', medium.keys())
973+
if len(mediumlist) > 1:
974+
title = "{} {}".format(medium['format'], medium['position'])
975+
if 'title' in medium:
976+
title += ": {}".format(medium['title'])
977+
else:
978+
title = medium['format']
979+
980+
tracklist = [
981+
(t['number'], t['recording']['title'],
982+
timedelta(milliseconds=int(t['recording']['length'])))
983+
for t in medium['track-list']]
984+
full_tracklist.append((title, tracklist))
958985

959-
return None
986+
return full_tracklist
960987

961988
def _render_tags(self):
962989
tags = mutagen.File(self['mediainfo_path'], easy=True)
963990
# if type(tags) == mutagen.mp3.MP3:
964991
# tags = mutagen.mp3.MP3(self['mediainfo_path'], ID3=EasyID3)
965992

966-
print(dir(tags.info))
993+
print('tagsdir', dir(tags.info))
967994
try:
968-
print(tags.info.encoder_settings)
995+
print('encoder', tags.info.encoder_settings)
969996
except AttributeError:
970997
pass
971-
log.debug(type(tags))
972-
log.debug(tags.pprint())
998+
log.debug('type tags', type(tags))
999+
log.debug('tags', tags.pprint())
9731000

9741001
return {'artist': tags.get('albumartist', tags['artist'])[0],
9751002
'title': tags['album'][0],
9761003
'rid': tags.get('musicbrainz_albumid', [None])[0],
9771004
'format': type(tags).__name__,
9781005
'bitrate': tags.info.bitrate,
1006+
'bitrate_mode': tags.info.bitrate_mode,
9791007
'bits_per_sample': getattr(tags.info, 'bits_per_sample',
9801008
None),
9811009
'encoder_settings': getattr(tags.info, 'encoder_settings',
9821010
None),
9831011
}
9841012

985-
def _render_summary(self):
986-
# identify self:
987-
# - num tracks todo
988-
# - scan for mb tags
1013+
def _render_release(self):
9891014
tags = self['tags']
990-
print(tags)
1015+
#print(tags)
9911016
if tags['rid']:
9921017
log.info('Found MusicBrainz release in tags')
9931018
release = mb.musicbrainzngs.get_release_by_id(
@@ -1006,17 +1031,17 @@ def _render_summary(self):
10061031
query = tags['title']
10071032
rg, release = mb.find_release(query, artist=query_artist)
10081033

1009-
print('rg', rg)
1010-
print('r', release)
1034+
# identify self:
1035+
# - num tracks todo
1036+
# - scan for mb tags
1037+
#print('rg', rg)
1038+
#print('r', release)
10111039

1012-
for medium in release['medium-list']:
1013-
for track in medium['track-list']:
1014-
print(track['number'],
1015-
track['recording']['title'],
1016-
timedelta(milliseconds=int(
1017-
track['recording']['length'])))
1040+
return release, rg
1041+
1042+
def _render_summary(self):
1043+
release, rg = self['release']
10181044

1019-
print(rg.keys())
10201045
return {
10211046
'artist': rg['artist-credit-phrase'],
10221047
'title': rg['title'],
@@ -1042,11 +1067,42 @@ def _render_year(self):
10421067

10431068
@form_field('tags')
10441069
def _render_form_tags(self):
1070+
_defaults = ['acoustic','alternative','ambient','blues','classic.rock',
1071+
'classical','country','dance','dubstep','electronic',
1072+
'experimental','folk','funk','hardcore','heavy.metal',
1073+
'hip.hop','indie','indie.pop','instrumental','jazz',
1074+
'metal','pop','post.hardcore','post.rock',
1075+
'progressive.rock','psychedelic','punk','reggae','rock',
1076+
'soul','trance','trip.hop']
1077+
10451078
return self['summary']['tags']
10461079

1080+
def _render_section_information(self):
1081+
pass
1082+
1083+
def _render_section_tracklist(self):
1084+
s = ""
1085+
for title, tracks in self['tracklist']:
1086+
s += title
1087+
s += "[table]"
1088+
for i, tt, l in tracks:
1089+
s += "[tr]"
1090+
s += "[td]" + i + "[/td]"
1091+
s += "[td]" + tt + "[/td]"
1092+
s += "[td]" + str(l) + "[/td]"
1093+
s += "[/tr]"
1094+
s += "[/table]"
1095+
return s
1096+
10471097
@form_field('album_desc')
10481098
def _render_description(self):
1049-
return 'album description'
1099+
sections = [("Information", self['section_information']),
1100+
("Track list", self['section_tracklist'])]
1101+
1102+
description = "\n".join(bb.section(*s) for s in sections)
1103+
description += bb.release
1104+
1105+
return description
10501106

10511107
@form_field('artist')
10521108
def _render_artist(self):

setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ def find_version(*file_paths):
4141
"logbook~=1.2",
4242
"pyreadline~=2.1",
4343
"progressbar2~=3.38",
44-
"mutagen~=1.40",
45-
"musicbrainzngs~=0.6",
44+
"mutagen~=1.44",
45+
"musicbrainzngs~=0.7",
4646
"terminaltables~=3.1",
4747
],
4848
python_requires=">=3.5,<4.0",

0 commit comments

Comments
 (0)