mirror of
https://github.com/rembo10/headphones.git
synced 2026-07-20 07:54:01 +01:00
update Beets
This commit is contained in:
+95
-69
@@ -17,37 +17,38 @@ and work composition date
|
||||
"""
|
||||
|
||||
|
||||
import musicbrainzngs
|
||||
|
||||
from beets import ui
|
||||
from beets.plugins import BeetsPlugin
|
||||
|
||||
import musicbrainzngs
|
||||
|
||||
|
||||
def direct_parent_id(mb_workid, work_date=None):
|
||||
"""Given a Musicbrainz work id, find the id one of the works the work is
|
||||
part of and the first composition date it encounters.
|
||||
"""
|
||||
work_info = musicbrainzngs.get_work_by_id(mb_workid,
|
||||
includes=["work-rels",
|
||||
"artist-rels"])
|
||||
if 'artist-relation-list' in work_info['work'] and work_date is None:
|
||||
for artist in work_info['work']['artist-relation-list']:
|
||||
if artist['type'] == 'composer':
|
||||
if 'end' in artist.keys():
|
||||
work_date = artist['end']
|
||||
work_info = musicbrainzngs.get_work_by_id(
|
||||
mb_workid, includes=["work-rels", "artist-rels"]
|
||||
)
|
||||
if "artist-relation-list" in work_info["work"] and work_date is None:
|
||||
for artist in work_info["work"]["artist-relation-list"]:
|
||||
if artist["type"] == "composer":
|
||||
if "end" in artist.keys():
|
||||
work_date = artist["end"]
|
||||
|
||||
if 'work-relation-list' in work_info['work']:
|
||||
for direct_parent in work_info['work']['work-relation-list']:
|
||||
if direct_parent['type'] == 'parts' \
|
||||
and direct_parent.get('direction') == 'backward':
|
||||
direct_id = direct_parent['work']['id']
|
||||
if "work-relation-list" in work_info["work"]:
|
||||
for direct_parent in work_info["work"]["work-relation-list"]:
|
||||
if (
|
||||
direct_parent["type"] == "parts"
|
||||
and direct_parent.get("direction") == "backward"
|
||||
):
|
||||
direct_id = direct_parent["work"]["id"]
|
||||
return direct_id, work_date
|
||||
return None, work_date
|
||||
|
||||
|
||||
def work_parent_id(mb_workid):
|
||||
"""Find the parent work id and composition date of a work given its id.
|
||||
"""
|
||||
"""Find the parent work id and composition date of a work given its id."""
|
||||
work_date = None
|
||||
while True:
|
||||
new_mb_workid, work_date = direct_parent_id(mb_workid, work_date)
|
||||
@@ -62,8 +63,9 @@ def find_parentwork_info(mb_workid):
|
||||
the artist relations, and the composition date for a work's parent work.
|
||||
"""
|
||||
parent_id, work_date = work_parent_id(mb_workid)
|
||||
work_info = musicbrainzngs.get_work_by_id(parent_id,
|
||||
includes=["artist-rels"])
|
||||
work_info = musicbrainzngs.get_work_by_id(
|
||||
parent_id, includes=["artist-rels"]
|
||||
)
|
||||
return work_info, work_date
|
||||
|
||||
|
||||
@@ -71,19 +73,20 @@ class ParentWorkPlugin(BeetsPlugin):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
self.config.add({
|
||||
'auto': False,
|
||||
'force': False,
|
||||
})
|
||||
self.config.add(
|
||||
{
|
||||
"auto": False,
|
||||
"force": False,
|
||||
}
|
||||
)
|
||||
|
||||
if self.config['auto']:
|
||||
if self.config["auto"]:
|
||||
self.import_stages = [self.imported]
|
||||
|
||||
def commands(self):
|
||||
|
||||
def func(lib, opts, args):
|
||||
self.config.set_args(opts)
|
||||
force_parent = self.config['force'].get(bool)
|
||||
force_parent = self.config["force"].get(bool)
|
||||
write = ui.should_write()
|
||||
|
||||
for item in lib.items(ui.decargs(args)):
|
||||
@@ -92,22 +95,26 @@ class ParentWorkPlugin(BeetsPlugin):
|
||||
item.store()
|
||||
if write:
|
||||
item.try_write()
|
||||
|
||||
command = ui.Subcommand(
|
||||
'parentwork',
|
||||
help='fetch parent works, composers and dates')
|
||||
"parentwork", help="fetch parent works, composers and dates"
|
||||
)
|
||||
|
||||
command.parser.add_option(
|
||||
'-f', '--force', dest='force',
|
||||
action='store_true', default=None,
|
||||
help='re-fetch when parent work is already present')
|
||||
"-f",
|
||||
"--force",
|
||||
dest="force",
|
||||
action="store_true",
|
||||
default=None,
|
||||
help="re-fetch when parent work is already present",
|
||||
)
|
||||
|
||||
command.func = func
|
||||
return [command]
|
||||
|
||||
def imported(self, session, task):
|
||||
"""Import hook for fetching parent works automatically.
|
||||
"""
|
||||
force_parent = self.config['force'].get(bool)
|
||||
"""Import hook for fetching parent works automatically."""
|
||||
force_parent = self.config["force"].get(bool)
|
||||
|
||||
for item in task.imported_items():
|
||||
self.find_work(item, force_parent)
|
||||
@@ -124,35 +131,38 @@ class ParentWorkPlugin(BeetsPlugin):
|
||||
parentwork_info = {}
|
||||
|
||||
composer_exists = False
|
||||
if 'artist-relation-list' in work_info['work']:
|
||||
for artist in work_info['work']['artist-relation-list']:
|
||||
if artist['type'] == 'composer':
|
||||
if "artist-relation-list" in work_info["work"]:
|
||||
for artist in work_info["work"]["artist-relation-list"]:
|
||||
if artist["type"] == "composer":
|
||||
composer_exists = True
|
||||
parent_composer.append(artist['artist']['name'])
|
||||
parent_composer_sort.append(artist['artist']['sort-name'])
|
||||
if 'end' in artist.keys():
|
||||
parentwork_info["parentwork_date"] = artist['end']
|
||||
parent_composer.append(artist["artist"]["name"])
|
||||
parent_composer_sort.append(artist["artist"]["sort-name"])
|
||||
if "end" in artist.keys():
|
||||
parentwork_info["parentwork_date"] = artist["end"]
|
||||
|
||||
parentwork_info['parent_composer'] = ', '.join(parent_composer)
|
||||
parentwork_info['parent_composer_sort'] = ', '.join(
|
||||
parent_composer_sort)
|
||||
parentwork_info["parent_composer"] = ", ".join(parent_composer)
|
||||
parentwork_info["parent_composer_sort"] = ", ".join(
|
||||
parent_composer_sort
|
||||
)
|
||||
|
||||
if not composer_exists:
|
||||
self._log.debug(
|
||||
'no composer for {}; add one at '
|
||||
'https://musicbrainz.org/work/{}',
|
||||
item, work_info['work']['id'],
|
||||
"no composer for {}; add one at "
|
||||
"https://musicbrainz.org/work/{}",
|
||||
item,
|
||||
work_info["work"]["id"],
|
||||
)
|
||||
|
||||
parentwork_info['parentwork'] = work_info['work']['title']
|
||||
parentwork_info['mb_parentworkid'] = work_info['work']['id']
|
||||
parentwork_info["parentwork"] = work_info["work"]["title"]
|
||||
parentwork_info["mb_parentworkid"] = work_info["work"]["id"]
|
||||
|
||||
if 'disambiguation' in work_info['work']:
|
||||
parentwork_info['parentwork_disambig'] = work_info[
|
||||
'work']['disambiguation']
|
||||
if "disambiguation" in work_info["work"]:
|
||||
parentwork_info["parentwork_disambig"] = work_info["work"][
|
||||
"disambiguation"
|
||||
]
|
||||
|
||||
else:
|
||||
parentwork_info['parentwork_disambig'] = None
|
||||
parentwork_info["parentwork_disambig"] = None
|
||||
|
||||
return parentwork_info
|
||||
|
||||
@@ -169,13 +179,17 @@ class ParentWorkPlugin(BeetsPlugin):
|
||||
"""
|
||||
|
||||
if not item.mb_workid:
|
||||
self._log.info('No work for {}, \
|
||||
add one at https://musicbrainz.org/recording/{}', item, item.mb_trackid)
|
||||
self._log.info(
|
||||
"No work for {}, \
|
||||
add one at https://musicbrainz.org/recording/{}",
|
||||
item,
|
||||
item.mb_trackid,
|
||||
)
|
||||
return
|
||||
|
||||
hasparent = hasattr(item, 'parentwork')
|
||||
hasparent = hasattr(item, "parentwork")
|
||||
work_changed = True
|
||||
if hasattr(item, 'parentwork_workid_current'):
|
||||
if hasattr(item, "parentwork_workid_current"):
|
||||
work_changed = item.parentwork_workid_current != item.mb_workid
|
||||
if force or not hasparent or work_changed:
|
||||
try:
|
||||
@@ -184,14 +198,18 @@ add one at https://musicbrainz.org/recording/{}', item, item.mb_trackid)
|
||||
self._log.debug("error fetching work: {}", e)
|
||||
return
|
||||
parent_info = self.get_info(item, work_info)
|
||||
parent_info['parentwork_workid_current'] = item.mb_workid
|
||||
if 'parent_composer' in parent_info:
|
||||
self._log.debug("Work fetched: {} - {}",
|
||||
parent_info['parentwork'],
|
||||
parent_info['parent_composer'])
|
||||
parent_info["parentwork_workid_current"] = item.mb_workid
|
||||
if "parent_composer" in parent_info:
|
||||
self._log.debug(
|
||||
"Work fetched: {} - {}",
|
||||
parent_info["parentwork"],
|
||||
parent_info["parent_composer"],
|
||||
)
|
||||
else:
|
||||
self._log.debug("Work fetched: {} - no parent composer",
|
||||
parent_info['parentwork'])
|
||||
self._log.debug(
|
||||
"Work fetched: {} - no parent composer",
|
||||
parent_info["parentwork"],
|
||||
)
|
||||
|
||||
elif hasparent:
|
||||
self._log.debug("{}: Work present, skipping", item)
|
||||
@@ -203,9 +221,17 @@ add one at https://musicbrainz.org/recording/{}', item, item.mb_trackid)
|
||||
item[key] = value
|
||||
|
||||
if work_date:
|
||||
item['work_date'] = work_date
|
||||
item["work_date"] = work_date
|
||||
return ui.show_model_changes(
|
||||
item, fields=['parentwork', 'parentwork_disambig',
|
||||
'mb_parentworkid', 'parent_composer',
|
||||
'parent_composer_sort', 'work_date',
|
||||
'parentwork_workid_current', 'parentwork_date'])
|
||||
item,
|
||||
fields=[
|
||||
"parentwork",
|
||||
"parentwork_disambig",
|
||||
"mb_parentworkid",
|
||||
"parent_composer",
|
||||
"parent_composer_sort",
|
||||
"work_date",
|
||||
"parentwork_workid_current",
|
||||
"parentwork_date",
|
||||
],
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user