No harness run has ever exercised a trickplay route #148
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
cargo xtask reference provisionnever setsEnableTrickplayImageExtraction.There is no such element in any of the three
options.xml, andSELECT COUNT(*) FROM TrickplayInfosis0in both snapshots. Two consequences,found while landing #99 and #140.
The columns #99 landed are diffed against nothing.
TrickplayInfosis emptyon both sides of every pair run, so the seven columns a client indexes with —
width, height, tile counts, thumbnail count, interval and
Bandwidth— agree bybeing absent.
Bandwidthin particular is a pure function of the encoded tile'sbyte length, and its only coverage anywhere is
jellyfin_core::image::sheet_bandwidth's unit cases and the committed answer keyin
crates/jellyfin-images/tests/sheet.rs.Two scenario requests refuse for a reason they do not name.
crates/jellyfin-harness/scenarios/refusals.json:168-172and:188-192—trickplay-tiles-at-a-width-nothing-was-cut-atandtrickplay-tile-past-the-last-sheet— both refuse because the item has nosheets at all, not because the width is one nothing was cut at or the index is
past the last sheet. They agree between the servers and they cannot fail for the
reason they are named after. They pre-date #99; #99 is what made them visibly
wrong.
Where to start
xtask/src/reference/is whereprovisiondecides the library options. SettingEnableTrickplayImageExtractionandExtractTrickplayImagesDuringLibraryScanmakes a bootstrap produce sheets, at which point both scenarios refuse for the
reason they name and
TrickplayInfosbecomes a table with rows on both sides.The cost is a snapshot rebuild, which redraws the account and the server ids that
scenarios and
config.tomlboth name — so this wants to happen alongside thenext rebuild rather than on its own.
How to know it is done
TrickplayInfosis non-empty in the snapshot,diff-dbreports it as agreeingover a pair rather than as absent, and each of the two refusal requests fails if
the sheet it names is removed from the reasoning.
House rules
Tests run under
cargo nextest; upstream's source is the checkout inupstream/at the pin. Generated artifacts are regenerated, never edited.crates/jellyfin-harness/README.mdsays what a diff means and what an ignoreentry has to carry. A scenario request that cannot fail is not a check.
Two things for whoever grows the fixture, both of them from batch D and both of
the same shape as the trickplay gap this issue already names.
The snapshot has no picture of any kind.
xtask reference provisionregisters every library with empty
ImageFetchersper type, which disables thethree in-box extractors —
Screen Grabber,Embedded Image Extractorand theaudio one — along with the remote fetchers. So
select count(*) from BaseItemImageInfosis 0 on the default snapshot, and neither server draws alibrary tile, a genre collage or a poster there. That is deliberate and worth
keeping: a scan has to be a function of the files. But it means everything
batch D landed is measurable against a pair only on a library provisioned
with those fetchers on —
register_enrichedalready demonstrates themechanism.
Nothing in the media carries a picture to extract.
ffprobeover thefixture's mp3, flac and mkv finds audio and video streams and no
attached_picand no attachments. So even with the fetchers on, only the screen grabber has
anything to do. Measuring the other two takes a track muxed with cover art and
a container muxed with an attached picture —
make-sample-media.shis wherethey would go, and the image records a digest of it, so
xtask reference buildrebuilds when it changes.
Both are noted in
reference/README.mdbeside the trickplay note. They costnothing extra if they ride along with the rebuild this issue already needs.
The provisioning half is landed in
9d3fd58and611fa42. The snapshot is notrebuilt, so this stays open, and the reason is below rather than "no time".
What landed
provisionregisters a new library withEnableTrickplayImageExtractionandExtractTrickplayImagesDuringLibraryScan. Both exist on upstream'sLibraryOptionsand both are needed — the second is what the scan path reads,the first is what
RefreshTrickplayDataAsyncand theRefreshTrickplayImagestask read. The empty
ImageFetcherslists do not disable them:TrickplayProvideris anICustomMetadataProvider, whichCanRefreshMetadataForCachedoes not filter by that list.It also asks for
TrickplayOptions.ScanBehavior: Blocking. Upstream's defaultis
NonBlockingandTrickplayProvider.FetchInternalthen fire-and-forgetsRefreshTrickplayDataAsync, whilextask'sscan()waits only for theRefreshLibrarytask to go idle — so a snapshot cut after a provision wouldhave carried a row for Night Signal on a fast host and none on a slow one.
The fixture would have stopped being a function of the files, which is the
property
reference/README.mdopens by asserting.Not on the enriched library: its clips are five seconds against a ten-second
interval, and upstream cuts no sheets for a file shorter than one.
Why the rebuild is not in this change
Three things, and the third is the one that matters most:
reference/snapshots, which the main checkout and every worktreecopy from. A reference instance was live on
:8096throughout.committed scenarios name the old account id — over a hundred occurrences.
reference/README.mdalready says to restore-and-rescan instead.serves and deletes them — so a snapshot carrying upstream's makes
TrickplayInfosa table upstream has rows in and ours has none, whichdiff-dbreports until an exemption says why. And the two refusal requestsnamed after a width nothing was cut at and an index past the last sheet start
being answered by upstream rather than refused — which is the point, and
also two scenario requests to rewrite.
All three are now written down in
reference/README.mdbeside the trickplaynote, so whoever does the rebuild meets them before rather than after.
On the two extras in the comment above
I drafted generators for the cover art and the attached picture and dropped
them. The audio cover probes cleanly as
attached_pic, but the video attachmentcame through as a video stream rather than an attachment — unlike the font
already in
Test Pattern S02E02.mkv— and I cannot say what upstream's embeddedimage extractor makes of either without a pair to run it against. Committing
them would be the same adds-only smell in a different place. They are still
worth doing with the rebuild;
make-sample-media.shis where.Done. The provisioning half had already landed in
9d3fd58— what was left isthat every snapshot on disk was cut before it, so
TrickplayInfoswas stillempty on both sides of every run.
Rebuilt in
113caba. Thedefaultsnapshot now carries two sets of sheets:The two requests now refuse for the reason they are named after. Measured
against the reference at the pin, on Night Signal, which has sheets at 320:
Before, all four were
404for the same wrong reason.refusals.jsonreplaysover the pair with no trickplay difference — 156 responses, 2 differences,
neither of them a trickplay route.
Two things the rebuild dragged in, both recorded here so the next one is not a
surprise:
reference/var/mediawas froma build this tree no longer records, so its dates disagreed with the ones the
container bakes, and
scan_ingest's date comparison failed on 12 of 20 rowsthe moment the snapshot moved. Deleting the directory and letting
upcopyit again from the image put the two back in step; the suite is green.
jellyfinaccount's id. They are re-pointed in the same commit.One difference the run turned up that is not this issue and not trickplay:
GET /MusicGenres/InstantMixnaming no id answers400on both servers, witha JSON body upstream and a plain-text one here. It is on a route
absent.rsanswers for an excluded feature, and it is unrelated to anything changed here.