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.
This commit is contained in:
Andrew Pimenov 2026-07-16 16:22:04 +03:00
parent 384095f496
commit 1c814830e5
2 changed files with 9 additions and 4 deletions

View file

@ -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

View file

@ -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