diff --git a/docs/dev/beets_import_process.graphml b/docs/dev/beets_import_process.graphml new file mode 100644 index 000000000..0b67b7e5c --- /dev/null +++ b/docs/dev/beets_import_process.graphml @@ -0,0 +1,2528 @@ + + + + + + + + + + + + + + + + + + + + + + + <html><center><p>Start</p></center> +<center><p><tt>__main__.py</tt></p></center></html> + + + + + + + + + + + <html><center><p>Call CLI</p></center> +<center><p><tt>ui.__init__.py main() -> _raw_main()</tt></p></center></html> + + + + + + + + + + + + + + <html><center><p>Bootstrap</p></center> +<center><p><tt>ui.__init__.py _setup()</tt></p></center></html> + + + + + + + + + + + Folder 1 + + + + + + + + + + + + + + + + <html><center><p>Configure Musicbrainz API</p></center> +<center><p><tt>autotag.mb.py configure()</tt></p></center></html> + + + + + + + + + + + <html><center><p>Configure</p></center> +<center><p><tt>_configure()</tt></p></center></html> + + + + + + + + + + + <html><center><p>Load plugins</p></center> +<center><p><tt>_load_plugins()</tt></p></center></html> + + + + + + + + + + + Add types and queries defined by plugin + + + + + + + + + + + Send 'pluginload' event + + + + + + + + + + Get default subcommands + + + + + + + + + + Load plugin subcommands + + + + + + + + + + <html><center><p>Open library</p></center> +<center><p><tt>_open_library()</tt></p></center></html> + + + + + + + + + + + Check if library exists + + + + + + + + + + Continue + + + + + + + + + + + + <html><center><p>Parse subcommand and arguments</p></center> +<center><p><tt>ut.__init__.py _raw_main() -&gt;</center> +<center>SubcommandsOptionParser.parse_subcommand()</tt></p></center><html + + + + + + + + + + + Run subcommand function + + + + + + + + + + Assume 'import' command + + + + + + + + + + <html><center><p>Set importer configuration</p></center> +<center><p><tt>ui.commands.py import_func()</tt></p></center></html> + + + + + + + + + + + Check user-supplied directories + + + + + + + + + + <html><center><p>Import files</p></center> +<center><p><tt>ui.commands.py import_files()</tt></p></center></html> + + + + + + + + + + + <html><center><p>Create import session</p></center> +<center><p><tt>ui.commands.TerminalImportSession</tt></p></center></html> + + + + + + + + + + + + + + <html><center><p>Run session</p></center> +<center><p><tt>TerminalImportSession.run()</tt></p></center></html> + + + + + + + + + + + Folder 2 + + + + + + + + + + + + + + + + Split directory tasks into a task for each album + + + + + + + + + + Add stages for import + + + + + + + + + + Add plugin early import stages + + + + + + + + + + Add plugin import stages + + + + + + + + + + Send 'import_begin' event to plugins + + + + + + + + + + Check if threading enabled + + + + + + + + + + Run pipeline sequentially + + + + + + + + + + Run pipeline in parallel threads + + + + + + + + + + + + Check if autotag enabled + + + + + + + + + + <html><center><p>Find candidates</p></center> +<center><p><tt>importer.py lookup_candidates()</tt></p></center></html> + + + + + + + + + + + <html><center><p>Import as-is</p></center> +<center><p><tt>importer.py import_asis()</tt></p></center></html> + + + + + + + + + + + Send 'import_task_start' plugin event + + + + + + + + + + Check if item is album + + + + + + + + + + <html><center><p><tt>ImportTask.lookup_candidates()</tt></p></center> + + + + + + + + + + + Item is a singleton + + + + + + + + + + <html><center><p><tt>SingletonImportTask.lookup_candidates()</tt></p></center> + + + + + + + + + + + + + + <html><center><p>Find album tags</p></center> +<center><p><tt>autotag.match.py tag_album()</tt></p></center></html> + + + + + + + + + + + Folder 3 + + + + + + + + + + + + + + + + Get current metadata + + + + + + + + + + Check if IDs exist + + + + + + + + + + + + + <html><center><p>Find albums with ID</p></center> +<center><p><tt>autotag.hooks.album_for_id()</tt></p></center></html> + + + + + + + + + + + Folder 4 + + + + + + + + + + + + + + + + <html><center><p><tt>autotag.hooks.album_for_mbid()</tt></p></center> + + + + + + + + + + + <html><center><p><tt>autotag.hooks.album_for_mbid()</tt></p></center> + + + + + + + + + + + <html><center><p><tt>autotag.mb.album_for_id()</tt></p></center> + + + + + + + + + + + Success + + + + + + + + + + Send 'albuminfo_received' plugin event + + + + + + + + + + <html><center><p>Check plugin sources for album ID results</p></center> +<center><p><tt>plugins.album_for_id()</tt></p></center></html> + + + + + + + + + + + Return matches + + + + + + + + + + Success + + + + + + + + + + + + + + + <html><center><p>Add candidates to potential matches</p></center> +<center><p><tt>autotag.match._add_candidate()</tt></p></center></html> + + + + + + + + + + + Folder 5 + + + + + + + + + + + + + + + + Discard empty albums + + + + + + + + + + Filter duplicates + + + + + + + + + + Discard matches without tags + + + + + + + + + + <html><center><p>Find mapping between import items and track info</p></center> +<center><p><tt>assign_items()</tt></p></center></html> + + + + + + + + + + + Skip matches with ignored penalties + + + + + + + + + + <html><center><p>Return <tt>AlbumMatch</tt> objects</p></center></html> + + + + + + + + + + + <html><center><p>Calculate distance of changes</p></center> +<center><p><tt>distance()</tt></p></center></html> + + + + + + + + + + + + + Use metadata for search + + + + + + + + + + <html><center><p>Search with existing ID</p></center> +<center><p><tt>match_by_id()</tt></p></center></html> + + + + + + + + + + + Success + + + + + + + + + + Search with tag terms from metadata + + + + + + + + + + Check if it is a VA release + + + + + + + + + + Collect results from data sources + + + + + + + + + + Sort by distance + + + + + + + + + + <html><center><p>Return <tt>Proposal</tt> with recommendations</p></center></html> + + + + + + + + + + + + + + <html><center><p>Get recommendations</p></center> +<center><p><tt>autotag.match.py _recommendation()</tt></p></center></html> + + + + + + + + + + + Folder 6 + + + + + + + + + + + + + + + + Use configuration threshold +values to classify matches + + + + + + + + + + Downgrade recommendation level if +lower than current recommendation with penalty + + + + + + + + + + <html><center><p>Return <tt>Recommendation</tt> for object</p></center></html> + + + + + + + + + + + + + + + Get user-input for decision on proposals + + + + + + + + + + Apply as-is choice + + + + + + + + + + + + + autotag.match.distance() + + + + + + + + + + Folder 7 + + + + + + + + + + + + + + + + Get current metadata for items + + + + + + + + + + Create autotag.hooks.Distance object +to keep track of penalties + + + + + + + + + + Check if artist is VA + + + + + + + + + + Calculate artist distance + + + + + + + + + + Calculate album difference + + + + + + + + + + Check if album media specified + + + + + + + + + + Check configuration options + + + + + + + + + + Calculate album media distance + + + + + + + + + + Check if medium specified + + + + + + + + + + Check if earliest release preferred + + + + + + + + + + Calculate distance for medium + + + + + + + + + + Assume 1989 + + + + + + + + + + Is original year known + + + + + + + + + + Calculate difference between album year +and original year + + + + + + + + + + Calculate maximum difference between +current year and original year + + + + + + + + + + Add distance ratio of year difference and max difference + + + + + + + + + + Check if year specified + + + + + + + + + + Does year match exactly + + + + + + + + + + Add no penalty for year + + + + + + + + + + Prefer match with closest year + + + + + + + + + + Check country distance + + + + + + + + + + Check label distance + + + + + + + + + + Check catalog number distance + + + + + + + + + + Check disambiguation distance + + + + + + + + + + Check album ID difference + + + + + + + + + + Checked all tracks? + + + + + + + + + + Add track distance + + + + + + + + + + Are tracks missing? + + + + + + + + + + Add full penalty + + + + + + + + + + Are there unmatched tracks? + + + + + + + + + + Add full penalty + + + + + + + + + + Apply plugin distance changes + + + + + + + + + + Return autotag.hooks.Distance object + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Doesn't Exist + + + + + + + + + + + + + + Exists + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No + + + + + + + + + + + + + + Yes + + + + + + + + + + + + + + + + + + + + + + + + Yes + + + + + + + + + + + + + + No + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yes + + + + + + + + + + + + + + No + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yes + + + + + + + + + + + + + + + + + + + + + + + + + + + Yes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yes + + + + + + + + + + + + + + No + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yes + + + + + + + + + + + + + + + + + + + + + Yes + + + + + + + + + + + + + + + + + + + + + + + + + + No + + + + + + + + + + + + + + Yes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No + + + + + + + + + + + + + + Yes + + + + + + + + + + + + + + No + + + + + + + + + + + + + + + + + + + + + + + + + + + Yes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No + + + + + + + + + + + Yes + + + + + + + + + + + + + + Yes + + + + + + + + + + + No + + + + + + + + + + + + + + + + + + + + + + + + + + No + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yes + + + + + + + + + + + + + + Yes + + + + + + + + + + + + + + No + + + + + + + + + + + + + + + + + + + + + + + + Yes + + + + + + + + + + + + + + + + + + + + + + + + + + + No + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/dev/beets_import_process.png b/docs/dev/beets_import_process.png new file mode 100644 index 000000000..c6f88e913 Binary files /dev/null and b/docs/dev/beets_import_process.png differ