Skip to content

Commit 6944b47

Browse files
authored
Merge pull request metabrainz#1832 from zas/guesstracknumbertitle
Refactor File._guess_tracknumber_and_title() and add tests
2 parents 82cb610 + dc0aeb8 commit 6944b47

File tree

4 files changed

+65
-10
lines changed

4 files changed

+65
-10
lines changed

picard/file.py

+5-6
Original file line numberDiff line numberDiff line change
@@ -253,12 +253,11 @@ def _copy_loaded_metadata(self, metadata, postprocessors=None):
253253
self.metadata.copy(metadata)
254254

255255
def _guess_tracknumber_and_title(self, metadata):
256-
if 'tracknumber' not in metadata or 'title' not in metadata:
257-
tracknumber, title = tracknum_and_title_from_filename(self.base_filename)
258-
if 'tracknumber' not in metadata:
259-
metadata['tracknumber'] = tracknumber
260-
if 'title' not in metadata:
261-
metadata['title'] = title
256+
missing = {'tracknumber', 'title'} - set(metadata)
257+
if missing:
258+
guessed = tracknum_and_title_from_filename(self.base_filename)
259+
for m in missing:
260+
metadata[m] = getattr(guessed, m)
262261

263262
def copy_metadata(self, metadata, preserve_deleted=True):
264263
acoustid = self.metadata["acoustid_id"]

picard/util/__init__.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# Copyright (C) 2012, 2014-2015 Wieland Hoffmann
1313
# Copyright (C) 2013 Ionuț Ciocîrlan
1414
# Copyright (C) 2013-2014 Sophist-UK
15-
# Copyright (C) 2013-2014, 2018-2020 Laurent Monin
15+
# Copyright (C) 2013-2014, 2018-2021 Laurent Monin
1616
# Copyright (C) 2014 Johannes Dewender
1717
# Copyright (C) 2016 Rahul Raturi
1818
# Copyright (C) 2016 barami
@@ -410,6 +410,9 @@ def tracknum_from_filename(base_filename):
410410
return None
411411

412412

413+
GuessedFromFilename = namedtuple('GuessedFromFilename', ('tracknumber', 'title'))
414+
415+
413416
def tracknum_and_title_from_filename(base_filename):
414417
"""Guess tracknumber and title from filename.
415418
Uses `tracknum_from_filename` to guess the tracknumber. The filename is used
@@ -427,7 +430,7 @@ def tracknum_and_title_from_filename(base_filename):
427430
if stripped_filename[:tnlen] == tracknumber:
428431
title = stripped_filename[tnlen:].lstrip()
429432

430-
return (tracknumber, title)
433+
return GuessedFromFilename(tracknumber, title)
431434

432435

433436
def is_hidden(filepath):

test/test_file.py

+49-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
# Picard, the next-generation MusicBrainz tagger
44
#
55
# Copyright (C) 2018-2021 Philipp Wolfer
6-
# Copyright (C) 2019-2020 Laurent Monin
6+
# Copyright (C) 2019-2021 Laurent Monin
7+
# Copyright (C) 2021 Sophist-UK
78
#
89
# This program is free software; you can redistribute it and/or
910
# modify it under the terms of the GNU General Public License
@@ -290,3 +291,50 @@ def test_make_filename_replace_leading_dots(self):
290291
self.assertEqual(
291292
os.path.realpath('/media/music/_somealbum/_sometitle.mp3'),
292293
filename)
294+
295+
296+
class FileGuessTracknumberAndTitleTest(PicardTestCase):
297+
def setUp(self):
298+
super().setUp()
299+
self.set_config_values({
300+
'guess_tracknumber_and_title': True,
301+
})
302+
303+
def test_no_guess(self):
304+
f = File('/somepath/01 somefile.mp3')
305+
metadata = Metadata({
306+
'album': 'somealbum',
307+
'title': 'sometitle',
308+
'tracknumber': '2',
309+
})
310+
f._guess_tracknumber_and_title(metadata)
311+
self.assertEqual(metadata['tracknumber'], '2')
312+
self.assertEqual(metadata['title'], 'sometitle')
313+
314+
def test_guess_title(self):
315+
f = File('/somepath/01 somefile.mp3')
316+
metadata = Metadata({
317+
'album': 'somealbum',
318+
'tracknumber': '2',
319+
})
320+
f._guess_tracknumber_and_title(metadata)
321+
self.assertEqual(metadata['tracknumber'], '2')
322+
self.assertEqual(metadata['title'], 'somefile')
323+
324+
def test_guess_tracknumber(self):
325+
f = File('/somepath/01 somefile.mp3')
326+
metadata = Metadata({
327+
'album': 'somealbum',
328+
'title': 'sometitle',
329+
})
330+
f._guess_tracknumber_and_title(metadata)
331+
self.assertEqual(metadata['tracknumber'], '1')
332+
333+
def test_guess_title_tracknumber(self):
334+
f = File('/somepath/01 somefile.mp3')
335+
metadata = Metadata({
336+
'album': 'somealbum',
337+
})
338+
f._guess_tracknumber_and_title(metadata)
339+
self.assertEqual(metadata['tracknumber'], '1')
340+
self.assertEqual(metadata['title'], 'somefile')

test/test_utils.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
# Copyright (C) 2010-2011, 2014, 2018-2021 Philipp Wolfer
88
# Copyright (C) 2012, 2014, 2018 Wieland Hoffmann
99
# Copyright (C) 2013 Ionuț Ciocîrlan
10-
# Copyright (C) 2013-2014, 2018-2020 Laurent Monin
10+
# Copyright (C) 2013-2014, 2018-2021 Laurent Monin
1111
# Copyright (C) 2014, 2017 Sophist-UK
1212
# Copyright (C) 2016 Frederik “Freso” S. Olesen
1313
# Copyright (C) 2017 Sambhav Kothari
@@ -516,6 +516,11 @@ def test_returns_expected_tracknumber(self):
516516
result = tracknum_and_title_from_filename(filename)
517517
self.assertEqual(expected, result)
518518

519+
def test_namedtuple(self):
520+
result = tracknum_and_title_from_filename('0000002 Foo.mp3')
521+
self.assertEqual(result.tracknumber, '2')
522+
self.assertEqual(result.title, 'Foo')
523+
519524

520525
class PatternAsRegexTest(PicardTestCase):
521526

0 commit comments

Comments
 (0)