Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/fakethirtyeight/ia_upload.py
Original file line number Diff line number Diff line change
Expand Up @@ -571,6 +571,10 @@ def repair_one_podcast_year(
)
resp.raise_for_status()
except Exception as exc: # noqa: BLE001
if _is_noop_metadata_error(exc):
return MetadataRepairResult(
identifier=identifier, status="repaired", year=year
)
return MetadataRepairResult(
identifier=identifier,
status="error",
Expand All @@ -580,6 +584,14 @@ def repair_one_podcast_year(
return MetadataRepairResult(identifier=identifier, status="repaired", year=year)


def _is_noop_metadata_error(exc: Exception) -> bool:
"""True when archive.org says the requested metadata is already present."""
response = getattr(exc, "response", None)
status_code = getattr(response, "status_code", None)
text = getattr(response, "text", "")
return status_code == 400 and "no changes to _meta.xml" in text


def _load_repaired(log_path: Path) -> set[str]:
if not log_path.exists():
return set()
Expand Down
46 changes: 41 additions & 5 deletions tests/test_podcast_upload.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from pathlib import Path

import pytest
import requests

from fakethirtyeight.download_podcasts import filename_for
from fakethirtyeight.ia_upload import (
Expand Down Expand Up @@ -216,11 +217,27 @@ def modify_metadata(
return _FakeResponse()


class _NoopMetadataArchiveItem:
def modify_metadata(
self,
metadata: dict[str, str],
request_kwargs: dict[str, str] | None = None,
) -> _FakeResponse:
response = requests.Response()
response.status_code = 400
response._content = b'{"success":false,"error":"no changes to _meta.xml"}'
error = requests.HTTPError("400 Client Error")
error.response = response
raise error


class _FakeArchiveSession:
def __init__(self) -> None:
self.item = _FakeArchiveItem()
def __init__(
self, item: _FakeArchiveItem | _NoopMetadataArchiveItem | None = None
) -> None:
self.item = item or _FakeArchiveItem()

def get_item(self, identifier: str) -> _FakeArchiveItem:
def get_item(self, identifier: str) -> _FakeArchiveItem | _NoopMetadataArchiveItem:
return self.item


Expand All @@ -229,7 +246,8 @@ def test_repair_one_podcast_year_patches_only_year_metadata() -> None:
"https://traffic.megaphone.fm/ESP1234567890.mp3",
identifier="fivethirtyeight-politics-esp1234567890",
)
session = _FakeArchiveSession()
item = _FakeArchiveItem()
session = _FakeArchiveSession(item)

result = repair_one_podcast_year(
session, # type: ignore[arg-type]
Expand All @@ -240,7 +258,25 @@ def test_repair_one_podcast_year_patches_only_year_metadata() -> None:

assert result.status == "repaired"
assert result.identifier == "fivethirtyeight-politics-esp1234567890"
assert session.item.metadata == {"year": "2020"}
assert item.metadata == {"year": "2020"}


def test_repair_one_podcast_year_treats_archive_noop_as_repaired() -> None:
row = _metadata_row(
"https://traffic.megaphone.fm/ESP1234567890.mp3",
identifier="fivethirtyeight-politics-esp1234567890",
)
session = _FakeArchiveSession(_NoopMetadataArchiveItem())

result = repair_one_podcast_year(
session, # type: ignore[arg-type]
row,
year="2020",
dry_run=False,
)

assert result.status == "repaired"
assert result.error == ""


def test_disambiguate_identifiers_suffixes_only_collisions() -> None:
Expand Down
Loading