@@ -118,4 +118,132 @@ uv run mediaforce run "$TMP_ROOT" \
118118
119119kill " $WEB_PID " > /dev/null 2>&1 || true
120120
121+ echo " [smoke] Purge backups (DB-driven)"
122+
123+ PURGE_LIB_DIR=" $TMP_ROOT /purge/library"
124+ PURGE_TRANSCODE_DIR=" $TMP_ROOT /purge/transcode"
125+ mkdir -p " $PURGE_LIB_DIR " " $PURGE_TRANSCODE_DIR "
126+
127+ PURGE_SOURCE=" $PURGE_LIB_DIR /purge-source.mp4"
128+ PURGE_ENCODED=" $PURGE_TRANSCODE_DIR /purge-source.AV1.mp4"
129+
130+ ffmpeg -y \
131+ -f lavfi -i testsrc2=size=640x360:rate=30 \
132+ -f lavfi -i sine=frequency=220:sample_rate=44100 \
133+ -t 10 \
134+ -c:v libx264 -pix_fmt yuv420p -preset veryfast \
135+ -c:a aac -shortest \
136+ " $PURGE_SOURCE " > /dev/null 2>&1
137+
138+ ffmpeg -y -i " $PURGE_SOURCE " -t 10 \
139+ -c:v libaom-av1 -cpu-used 8 -b:v 1M -minrate 1M -maxrate 1M -bufsize 2M -row-mt 1 \
140+ -c:a aac -b:a 96k \
141+ " $PURGE_ENCODED " > /dev/null 2>&1
142+
143+ export PURGE_SOURCE PURGE_ENCODED PURGE_LIB_DIR
144+
145+ PROMOTE_JSON=" $(
146+ uv run python - << -'PY '
147+ import json
148+ import logging
149+ import os
150+ import pathlib
151+ from mediaforce.services.promote import promote_encoded_file_atomic
152+
153+ source = pathlib.Path(os.environ["PURGE_SOURCE"])
154+ encoded = pathlib.Path(os.environ["PURGE_ENCODED"])
155+ dest = pathlib.Path(os.environ["PURGE_LIB_DIR"]) / encoded.name
156+
157+ logger = logging.getLogger("mediaforce.smoke")
158+ logger.handlers.clear()
159+ logger.addHandler(logging.NullHandler())
160+ logger.propagate = False
161+ logger.setLevel(logging.CRITICAL)
162+
163+ result, rollback_state = promote_encoded_file_atomic(
164+ source_path=source,
165+ encoded_path=encoded,
166+ dest_path=dest,
167+ dry_run=False,
168+ move_original_to_backup=True,
169+ rename_sidecars=False,
170+ verify=True,
171+ logger=logger,
172+ )
173+
174+ assert rollback_state is not None
175+ assert result.backup_source_path is not None
176+
177+ print(
178+ json.dumps(
179+ {
180+ "source": str(source),
181+ "dest": str(result.dest_path),
182+ "backup": str(result.backup_source_path),
183+ },
184+ ensure_ascii=False,
185+ )
186+ )
187+ PY
188+ ) "
189+
190+ export PROMOTE_JSON
191+
192+ PURGE_SOURCE_PATH=" $( python -c ' import json,os; print(json.loads(os.environ["PROMOTE_JSON"])["source"])' ) "
193+ PURGE_PROMOTED_PATH=" $( python -c ' import json,os; print(json.loads(os.environ["PROMOTE_JSON"])["dest"])' ) "
194+ PURGE_BACKUP_PATH=" $( python -c ' import json,os; print(json.loads(os.environ["PROMOTE_JSON"])["backup"])' ) "
195+
196+ export PURGE_SOURCE_PATH PURGE_PROMOTED_PATH PURGE_BACKUP_PATH
197+
198+ HOME_OVERRIDE=" $TMP_ROOT /home"
199+ mkdir -p " $HOME_OVERRIDE "
200+
201+ HOME=" $HOME_OVERRIDE " uv run python - << 'PY '
202+ import os
203+ from datetime import datetime, timedelta
204+ from pathlib import Path
205+
206+ from sqlmodel import Session
207+
208+ from mediaforce.db.models import EncodeResult, ensure_schema, init_engine
209+
210+ db = Path.home() / ".config" / "mediaforce" / "mediaforce.db"
211+ engine = init_engine(str(db))
212+ ensure_schema(engine)
213+
214+ promoted_at = (datetime.now() - timedelta(days=1)).isoformat()
215+
216+ with Session(engine) as session:
217+ session.add(
218+ EncodeResult(
219+ source_id=1,
220+ source_path=os.environ["PURGE_SOURCE_PATH"],
221+ output_path=os.environ["PURGE_PROMOTED_PATH"],
222+ output_size_bytes=1234,
223+ tier="good",
224+ crf=28,
225+ preset=5,
226+ film_grain=8,
227+ promoted=True,
228+ promoted_at=promoted_at,
229+ promoted_path=os.environ["PURGE_PROMOTED_PATH"],
230+ source_backup_path=os.environ["PURGE_BACKUP_PATH"],
231+ )
232+ )
233+ session.commit()
234+ PY
235+
236+ HOME=" $HOME_OVERRIDE " uv run mediaforce purge-backups --older-than-days 0 --limit 10 > /dev/null
237+ HOME=" $HOME_OVERRIDE " uv run mediaforce purge-backups --older-than-days 0 --limit 10 --apply > /dev/null
238+
239+ if [ -f " $PURGE_BACKUP_PATH " ]; then
240+ echo " [smoke] purge-backups failed: backup still exists at $PURGE_BACKUP_PATH " >&2
241+ exit 1
242+ fi
243+
244+ if [ ! -f " $PURGE_PROMOTED_PATH " ]; then
245+ echo " [smoke] purge-backups failed: promoted missing at $PURGE_PROMOTED_PATH " >&2
246+ exit 1
247+ fi
248+
121249echo " [smoke] OK"
0 commit comments