The player names what it plays in its own history entry (watch, wrel, wtab): a reload or a
bookmark reopens it on the page that hosts it, with that page's list as the queue, or alone
from the catalog (GET /api/videos/{id}/row); a page that hosts none gets the shell's. Back
lands on the page's address without it (useBackToClose's url; ui/Modal passes it on). The
Files viewer and player do the same (fview, fplay). The Plex and channel-manager views are
always written in full, as their fallback is remembered state.
48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
"""A catalog video as the feed lists it, the row a player opened from an address starts from. DB lane."""
|
|
|
|
from datetime import datetime, timezone
|
|
|
|
from app.catalog.models import Channel, Video
|
|
from app.reader.models import VideoState
|
|
|
|
|
|
def _video(db, vid="v1"):
|
|
db.add(Channel(id="UCo", title="Owner", handle="@owner"))
|
|
db.flush()
|
|
db.add(
|
|
Video(
|
|
id=vid,
|
|
title="A talk",
|
|
channel_id="UCo",
|
|
published_at=datetime.now(timezone.utc),
|
|
duration_seconds=3600,
|
|
)
|
|
)
|
|
db.commit()
|
|
|
|
|
|
def test_a_video_comes_as_the_feed_row_with_my_own_state(db, make_user, as_user):
|
|
me, other = make_user(), make_user()
|
|
_video(db)
|
|
db.add(VideoState(user_id=me.id, video_id="v1", status="new", position_seconds=600))
|
|
db.add(VideoState(user_id=other.id, video_id="v1", status="watched", position_seconds=90))
|
|
db.commit()
|
|
r = as_user(me).get("/api/videos/v1/row")
|
|
assert r.status_code == 200, r.text
|
|
row = r.json()
|
|
assert (row["id"], row["title"], row["channel_title"]) == ("v1", "A talk", "Owner")
|
|
assert (row["status"], row["position_seconds"]) == ("new", 600)
|
|
assert row["watch_url"] == "https://www.youtube.com/watch?v=v1"
|
|
|
|
|
|
def test_a_video_never_opened_has_no_state(db, make_user, as_user):
|
|
_video(db)
|
|
row = as_user(make_user()).get("/api/videos/v1/row").json()
|
|
assert (row["status"], row["position_seconds"], row["saved"]) == ("new", 0, False)
|
|
|
|
|
|
def test_a_video_outside_the_catalog_is_not_found(db, make_user, as_user):
|
|
r = as_user(make_user()).get("/api/videos/nope/row")
|
|
assert r.status_code == 404
|
|
assert r.json()["detail"]["code"] == "not_found"
|