94 lines
2.8 KiB
Python
94 lines
2.8 KiB
Python
"""Fechas aproximadas de discovery: bandera upload_date_approx.
|
|
|
|
Matriz de precedencia de upsert_videos + upgrade approx->real de
|
|
set_upload_date + conversion timestamp -> YYYYMMDD en discover.
|
|
Spec: docs/superpowers/specs/2026-08-22-approximate-upload-dates-design.md
|
|
"""
|
|
|
|
from yt_scraper.store import Store, VideoRef
|
|
|
|
|
|
def _ref(vid, date=None, approx=0, ch="ch1"):
|
|
return VideoRef(
|
|
video_id=vid,
|
|
channel_id=ch,
|
|
title="t " + vid,
|
|
url=f"https://youtu.be/{vid}",
|
|
upload_date=date,
|
|
date_approx=approx,
|
|
)
|
|
|
|
|
|
def _store(tmp_path):
|
|
s = Store(tmp_path / "test.db")
|
|
s.upsert_channel("ch1", None, "Canal de prueba")
|
|
return s
|
|
|
|
|
|
def test_approx_into_empty(tmp_path):
|
|
s = _store(tmp_path)
|
|
s.upsert_videos([_ref("v1", date="20260820", approx=1)])
|
|
row = s.get_video("v1")
|
|
assert row.upload_date == "20260820"
|
|
assert row.upload_date_approx == 1
|
|
|
|
|
|
def test_real_not_downgraded_by_approx(tmp_path):
|
|
s = _store(tmp_path)
|
|
s.upsert_videos([_ref("v1", date="20240101", approx=0)])
|
|
s.upsert_videos([_ref("v1", date="20260820", approx=1)])
|
|
row = s.get_video("v1")
|
|
assert row.upload_date == "20240101"
|
|
assert row.upload_date_approx == 0
|
|
|
|
|
|
def test_approx_refreshed_by_newer_approx(tmp_path):
|
|
s = _store(tmp_path)
|
|
s.upsert_videos([_ref("v1", date="20260101", approx=1)])
|
|
s.upsert_videos([_ref("v1", date="20260820", approx=1)])
|
|
row = s.get_video("v1")
|
|
assert row.upload_date == "20260820"
|
|
assert row.upload_date_approx == 1
|
|
|
|
|
|
def test_extraction_upgrades_approx_to_real(tmp_path):
|
|
s = _store(tmp_path)
|
|
s.upsert_videos([_ref("v1", date="20260820", approx=1)])
|
|
s.set_upload_date("v1", "20260818")
|
|
row = s.get_video("v1")
|
|
assert row.upload_date == "20260818"
|
|
assert row.upload_date_approx == 0
|
|
|
|
|
|
def test_set_upload_date_still_skips_existing_real(tmp_path):
|
|
s = _store(tmp_path)
|
|
s.upsert_videos([_ref("v1", date="20240101", approx=0)])
|
|
s.set_upload_date("v1", "20260818")
|
|
assert s.get_video("v1").upload_date == "20240101"
|
|
|
|
|
|
def test_migration_defaults_flag_to_zero(tmp_path):
|
|
# Filas creadas por la via vieja (INSERT sin la columna) quedan con 0.
|
|
s = _store(tmp_path)
|
|
s.upsert_videos([_ref("v2", date=None, approx=0)])
|
|
row = s.get_video("v2")
|
|
assert not row.upload_date_approx
|
|
|
|
|
|
# --- conversion en discover -------------------------------------------------
|
|
|
|
from yt_scraper.discover import _entry_upload_date
|
|
|
|
|
|
def test_entry_upload_date_prefers_exact():
|
|
assert _entry_upload_date({"upload_date": "20240101"}) == ("20240101", 0)
|
|
|
|
|
|
def test_entry_upload_date_from_timestamp():
|
|
ts = 1716115200 # 2024-05-19 12:00 UTC
|
|
assert _entry_upload_date({"timestamp": ts}) == ("20240519", 1)
|
|
|
|
|
|
def test_entry_upload_date_none():
|
|
assert _entry_upload_date({}) == (None, 0)
|