From 1c814830e50c547c16c8369e5bfade3df7ce7290 Mon Sep 17 00:00:00 2001 From: Andrew Pimenov Date: Thu, 16 Jul 2026 16:22:04 +0300 Subject: [PATCH] fix apply always re-duplicating tracks on every re-run track_key compared "id:albumId" against playlist track_id, but Yandex never echoes albumId back for playlist entries (always None on read) - so the existing-tracks check could never match anything, and every apply run re-inserted the whole account on top of itself. --- sort_ym/apply.py | 5 ++++- tests/test_apply.py | 8 +++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/sort_ym/apply.py b/sort_ym/apply.py index a478ec3..bb7a12d 100644 --- a/sort_ym/apply.py +++ b/sort_ym/apply.py @@ -105,7 +105,10 @@ def apply_classification( no_album = 0 failed = 0 for row in playlist_rows: - track_key = f"{row['id']}:{row['album_id']}" if row["album_id"] else str(row["id"]) + # Сервер никогда не возвращает albumId у треков в плейлисте (Track.album_id всегда + # None при чтении, проверено вживую на десятках плейлистов, включая чужие) - track_id + # всегда голый id. albumId нужен только для самой вставки, не для сравнения. + track_key = str(row["id"]) if track_key in already: continue diff --git a/tests/test_apply.py b/tests/test_apply.py index 4c0ca9c..00e0647 100644 --- a/tests/test_apply.py +++ b/tests/test_apply.py @@ -18,7 +18,9 @@ class FakeTrackShort: class FakeClient: def __init__(self): - self.playlists = {100: FakePlaylist(100, "Рок — RU", revision=5, tracks=[FakeTrackShort("1:10")])} + # Сервер никогда не возвращает albumId у треков плейлиста - track_id всегда голый id + # (проверено вживую), поэтому фейк тоже хранит только id, без ":album_id". + self.playlists = {100: FakePlaylist(100, "Рок — RU", revision=5, tracks=[FakeTrackShort("1")])} self.created = [] self.inserted = [] self.next_kind = 200 @@ -57,7 +59,7 @@ class FlakyClient: return [self.playlist] def users_playlists(self, kind): - self.playlist.tracks = [FakeTrackShort(f"{i}:{a}") for (i, a) in self.server_tracks] + self.playlist.tracks = [FakeTrackShort(str(i)) for (i, a) in self.server_tracks] return self.playlist def users_playlists_insert_track(self, kind, track_id, album_id, revision=1): @@ -66,7 +68,7 @@ class FlakyClient: if self.insert_calls == 1: raise TimedOutError() self.playlist.revision += 1 - self.playlist.tracks = [FakeTrackShort(f"{i}:{a}") for (i, a) in self.server_tracks] + self.playlist.tracks = [FakeTrackShort(str(i)) for (i, a) in self.server_tracks] return self.playlist