Verify deletion actually removed the file before reporting success
MeTube's /delete only unlinks the file when it's configured with
DELETE_FILE_ON_TRASHCAN=true; otherwise it just drops the entry from its
own "done" list and returns {"status": "ok"} regardless -- we were trusting
that response and marking the job "deleted" (offering a re-download) while
the file was still sitting on mediaVM's disk the whole time.
Now HEAD-check the media_url right after the delete call. If the file is
still reachable, leave the job's status untouched (still "completed", still
playable) and surface a clear 409 explaining MeTube's own config is why,
rather than lying about local state.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
8ddea8762d
commit
441a3ef9df
4 changed files with 65 additions and 1 deletions
|
|
@ -19,6 +19,15 @@ class DeleteNotAllowed(Exception):
|
|||
pass
|
||||
|
||||
|
||||
class DeleteDidNotRemoveFile(Exception):
|
||||
"""MeTube accepted the /delete request but the file is still reachable
|
||||
afterwards -- its DELETE_FILE_ON_TRASHCAN setting is very likely off on
|
||||
that instance, which is outside this app's control (see AGENTS.md
|
||||
constraint 11: never touch MeTube's own config/source)."""
|
||||
|
||||
pass
|
||||
|
||||
|
||||
def get_latest_job(db: Session, video_id: int) -> DownloadJob | None:
|
||||
return (
|
||||
db.query(DownloadJob)
|
||||
|
|
@ -69,7 +78,18 @@ def delete_local_copy(db: Session, video: Video) -> DownloadJob:
|
|||
if not job.metube_job_id:
|
||||
raise DeleteNotAllowed("Missing MeTube job id, cannot request deletion")
|
||||
|
||||
MeTubeClient().delete_download(job.metube_job_id)
|
||||
client = MeTubeClient()
|
||||
client.delete_download(job.metube_job_id)
|
||||
|
||||
# MeTube's /delete only unlinks the file if it's configured with
|
||||
# DELETE_FILE_ON_TRASHCAN=true -- otherwise it just drops the entry from
|
||||
# its own "done" list and the file stays put. We don't control that
|
||||
# instance's config, so verify rather than trust the "ok" response.
|
||||
if job.media_url and client.check_media(job.media_url):
|
||||
raise DeleteDidNotRemoveFile(
|
||||
"MeTube removed the entry but the file is still on disk "
|
||||
"(its DELETE_FILE_ON_TRASHCAN setting is likely off)"
|
||||
)
|
||||
|
||||
job.status = "deleted"
|
||||
job.media_url = None
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue