Fix remote-priority merge postprocessing.
This commit is contained in:
@@ -251,6 +251,58 @@ def _postprocess_local_priority_merge(
|
||||
|
||||
return merged
|
||||
|
||||
def _postprocess_remote_priority_merge(
|
||||
merged_lines: list[str],
|
||||
base_paths: Sequence[str],
|
||||
local_paths: Sequence[str],
|
||||
remote_paths: Sequence[str],
|
||||
) -> list[str]:
|
||||
|
||||
base_counter = Counter(base_paths)
|
||||
local_counter = Counter(local_paths)
|
||||
remote_counter = Counter(remote_paths)
|
||||
|
||||
remote_base_tracks: list[str] = [
|
||||
track for track in remote_paths if base_counter[track] > 0
|
||||
]
|
||||
|
||||
target_new_counter: dict[str, int] = {}
|
||||
all_tracks = set(local_counter.keys()) | set(remote_counter.keys())
|
||||
for track in all_tracks:
|
||||
if base_counter[track] > 0:
|
||||
continue
|
||||
r_cnt = remote_counter.get(track, 0)
|
||||
l_cnt = local_counter.get(track, 0)
|
||||
if r_cnt > 0:
|
||||
target_new_counter[track] = r_cnt
|
||||
elif l_cnt > 0:
|
||||
target_new_counter[track] = l_cnt
|
||||
|
||||
new_tracks: list[str] = []
|
||||
used_counter: Counter[str] = Counter()
|
||||
|
||||
for track in remote_paths:
|
||||
if base_counter[track] > 0:
|
||||
continue
|
||||
if track not in target_new_counter:
|
||||
continue
|
||||
if used_counter[track] >= target_new_counter[track]:
|
||||
continue
|
||||
new_tracks.append(track)
|
||||
used_counter[track] += 1
|
||||
|
||||
for track in local_paths:
|
||||
if base_counter[track] > 0:
|
||||
continue
|
||||
if track not in target_new_counter:
|
||||
continue
|
||||
if used_counter[track] >= target_new_counter[track]:
|
||||
continue
|
||||
new_tracks.append(track)
|
||||
used_counter[track] += 1
|
||||
|
||||
return remote_base_tracks + new_tracks
|
||||
|
||||
|
||||
def merge_playlists(
|
||||
base_text: str,
|
||||
@@ -294,6 +346,11 @@ def merge_playlists(
|
||||
merged_lines, base_paths, local_paths, remote_paths
|
||||
)
|
||||
|
||||
if strategy == ConflictResolutionStrategy.REMOTE_PRIORITY:
|
||||
merged_lines = _postprocess_remote_priority_merge(
|
||||
merged_lines, base_paths, local_paths, remote_paths
|
||||
)
|
||||
|
||||
_write_results(merged_lines, test_folder)
|
||||
|
||||
return MergeResult(merged_paths=merged_lines, conflicts=conflicts)
|
||||
|
||||
Reference in New Issue
Block a user