@@ -69,7 +69,7 @@ class Proposal(NamedTuple):
6969def assign_items (
7070 items : Sequence [Item ],
7171 tracks : Sequence [TrackInfo ],
72- ) -> tuple [dict [ Item , TrackInfo ], list [Item ], list [TrackInfo ]]:
72+ ) -> tuple [list [ tuple [ Item , TrackInfo ] ], list [Item ], list [TrackInfo ]]:
7373 """Given a list of Items and a list of TrackInfo objects, find the
7474 best mapping between them. Returns a mapping from Items to TrackInfo
7575 objects, a set of extra Items, and a set of extra TrackInfo
@@ -86,16 +86,17 @@ def assign_items(
8686 # Each item in `assigned_item_idxs` list corresponds to a track in the
8787 # `tracks` list. Each value is either an index into the assigned item in
8888 # `items` list, or -1 if that track has no match.
89- mapping = {
90- items [iidx ]: t
89+ item_info_pairs = [
90+ ( items [iidx ], t )
9191 for iidx , t in zip (assigned_item_idxs , tracks )
9292 if iidx != - 1
93- }
94- extra_items = list (set (items ) - mapping .keys ())
93+ ]
94+ item_info_pairs .sort (key = lambda it : (it [0 ].disc , it [0 ].track , it [0 ].title ))
95+ extra_items = list (set (items ) - {i for i , _ in item_info_pairs })
9596 extra_items .sort (key = lambda i : (i .disc , i .track , i .title ))
96- extra_tracks = list (set (tracks ) - set ( mapping . values ()) )
97+ extra_tracks = list (set (tracks ) - { t for _ , t in item_info_pairs } )
9798 extra_tracks .sort (key = lambda t : (t .index , t .title ))
98- return mapping , extra_items , extra_tracks
99+ return item_info_pairs , extra_items , extra_tracks
99100
100101
101102def match_by_id (items : Iterable [Item ]) -> AlbumInfo | None :
@@ -217,10 +218,12 @@ def _add_candidate(
217218 return
218219
219220 # Find mapping between the items and the track info.
220- mapping , extra_items , extra_tracks = assign_items (items , info .tracks )
221+ item_info_pairs , extra_items , extra_tracks = assign_items (
222+ items , info .tracks
223+ )
221224
222225 # Get the change distance.
223- dist = distance (items , info , mapping )
226+ dist = distance (items , info , item_info_pairs )
224227
225228 # Skip matches with ignored penalties.
226229 penalties = [key for key , _ in dist ]
@@ -232,7 +235,7 @@ def _add_candidate(
232235
233236 log .debug ("Success. Distance: {}" , dist )
234237 results [info .album_id ] = hooks .AlbumMatch (
235- dist , info , mapping , extra_items , extra_tracks
238+ dist , info , dict ( item_info_pairs ) , extra_items , extra_tracks
236239 )
237240
238241
0 commit comments