Repository navigation
Scanning never creates a Roll, so scanned frames lose every roll-scoped feature #1216
kurtwindisch
started this conversation in
General
Replies: 1 comment
|
#1256 mostly solves this issue by adding "Scan as a Roll". |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
I wanted to explore the fact that scanning a roll via either the film scanner or camera scan interfaces never creates a roll in the library. This first seemed like an inconvenience, adding an extra step of having to refresh the library to discover the roll folder. But with the the new roll-oriented workflow, it seems like there could be larger problems as a result of this gap/bug.
Here is a summary of the analysis so far. I'm still trying to understand the degree of any issues (and whether the impacts below are correct) and would like to know what others think.
Summary
Frames from the Film Scanner and from camera scan land in the Film Strip but never
become a Roll.
state.active_roll_idstays unset, so the Roll panel, roll defaults,Half Frame, Roll Analysis and scenes are all unavailable on exactly the frames a
scanning session produces. Now that the workflow starts from the Roll panel, this is
the one entry point that does not reach it.
What creates a Roll today
Three functions, and nothing else:
rolls.recognize_folder(rolls.py:71),rolls.import_subfolders_as_rolls(rolls.py:139) androlls.create_virtual_roll(
rolls.py:204). Their only callers areopen_library_folders(controller.py:1475),import_subfolders_as_rolls/rediscover_rolls(controller.py:1446,controller.py:1458) andcreate_roll_from_session(controller.py:1514).Both scan paths call
request_asset_discovery(...)directly and reach none of them:_on_scan_finished/_on_scan_batch_finished—controller.py:4872,controller.py:4878_on_capture_finished—controller.py:5290The two scanners are in different shape:
writes to
<hot folder>/<roll>/(scanlight.py:1337). The name reachesconfig.metadata.capture_rollfor XMP and the{{ roll }}export token(
controller.py:2383,xmp.py:101) and stops there. It never reaches the roll store.folder under a
{{ date }}_{{ seq }}pattern (settings.py:40,scan.py:1403,service.py:134), and one batch is one strip, not a roll. A 36-exposure roll isseveral batches into the same folder.
Problems
1. Half Frame cannot be turned on.
half_frame.py:98disables Enable, Adjust andAuto without a roll, and
request_asset_discoverypasseshalf_frame=Falsewhenactive_roll_idis unset (controller.py:1371). A half-frame roll scanned in does notsplit. The sticky
half_frame_modeflag can be on and discovery still refuses, so thestate is not even visible as "off".
2. Every Roll-tab card reads Frame with the Roll button disabled.
controls_panel.py:948andmetadata.py:422. This covers Film Mode, Calibration, Crop,Roll Analysis, Metering, Raw Decode, Lens, Flat Field and all Metadata cards. The rig
facts the scan was made with cannot be set once for the batch. Setting frame 1 and using
Apply to Selected is a different gesture: it records no roll default, so Reset to Roll
has nothing to return to.
3. Roll Analysis records nothing.
_finish_normalization(controller.py:4262)pushes the pooled baseline onto the loaded frames, but skips
set_roll_normalizationand leaves
sourceempty. The baseline holds for the session only. Scenes areunavailable, since
create_sceneneeds a roll id.4. Nothing survives a restart.
restore_sessionrecovers the roll by looking thesession paths up in the roll store (
controller.py:1316,controller.py:1320). Scannedpaths are in no roll, so the session returns rollless and problems 1 to 3 repeat.
5. Gear auto-match never runs. The Roll Settings prefill hangs off
folder_roll_created, emitted only when a folder is recognized for the first time(
library_tree.py:183→files.py:1186). A scanned folder is never recognized.6. Library Refresh recovers only one folder shape.
rediscover_rollsre-walks onlyregistered import-source parents (
controller.py:1451), anddiscover_roll_foldersstops descending at the first folder that holds images (
rolls.py:123). See the tablebelow for what that does and does not reach.
7. Scanning while a roll is open absorbs the new frames into it.
_on_discovery_finishedappends every newly discovered path to the active roll'smembership (
controller.py:2061). Scanning roll 2 while roll 1 is open writes roll 2'sframes into roll 1's
extra_paths, with no prompt and no undo. On the Film Scanner thisis not an edge case: the Output folder is sticky, so it happens on the second roll of
every session.
8. Refresh plus an open roll produces double membership. When both 6 and 7 apply,
the scanned frames end up members of two rolls at once: the roll that was open absorbed
them into
extra_paths, and Refresh also recognized their folder as its own roll.rolls_containing_paththen returns both,_roll_id_for_restored_pathsreturnsNonebecause the paths no longer agree on one roll, and the session comes back rollless after
a restart anyway — with one roll's membership permanently polluted.
What Library Refresh does and does not recover
Measured with the scan folder under a parent registered by Import Subfolders as Rolls:
parent/folder.Two further conditions on the first row: the folder must not have been deleted as a roll
before (
skip_dismissed=Truekeeps dismissed folders out), and its name must not match adiscovery filter (default
export).In every case Refresh does not open the roll.
active_roll_idstaysNone, so HalfFrame still did not split the scan that produced the frames, and a Roll Analysis run
before the refresh recorded nothing.
The only full recovery is Import Folder as a Roll on the scan folder, followed by
opening it. That restores everything, and it survives a restart. It is usable where the
output folder is already per-roll (camera scan) and not where it is one sticky flat
folder (the Film Scanner), because importing that folder gives one roll holding every
roll ever scanned into it.
Related finding: "roll" means two different things
The Film Strip's contents and
active_roll_idare independent state, and theroll-scoped operations do not agree on which one they mean:
(
request_reset_roll,controller.py:4303) acts onvisible_actual_indices_ordered(). Roll Analysis readsstate.uploaded_files(
_normalization_targets,controller.py:4050) and runs with no roll; only thepersist step is skipped. Save as Roll takes
uploaded_fileswholesale.scenes, the stored baseline, roll-scoped edit forks,
section_push._roll_id_for_orphan_asset(
session.py:1149) gives a frame its own roll's defaults from whatever roll containsthat path. A strip holding frames from three rolls gives each frame a different
roll's defaults, so the model does not assume the strip is one roll.
The two also diverge with a roll open:
open_library_folders(add_to_session=True)addsframes without touching
active_roll_id, and a Film Strip filter can hide roll frameswhile Reset Roll then acts only on what is visible.
This means the batch-shaped operations already work on a scanned strip; the
identity-shaped ones do not, because they need a roll that persists past the session.
Reproducing it
Use a fresh empty output folder, for example
~/scans/repro/roll_a. Every roll createdbelow is removable with right-click, Delete, which forgets the roll record only and
leaves files and edits alone.
A. The gap. Film Scanner panel, Output folder
~/scans/repro/roll_a, load a strip,Scan. Then:
No roll — 6 frames, tooltip "These frames are not oneroll."
one roll. Open the roll itself to split its scans." A half-frame roll does not split.
"These frames are not one roll, so there is no roll to hold a shared value."
No roll.B. Refresh cannot reach it. Click Refresh in Library.
roll_anever appears,because a scan registers no import source.
C. The flat folder merges two rolls (problem 7). Import Folder as a Roll on
roll_a; everything in A now works. Leave it open, load a different roll of film, andScan without touching the Output folder. The new frames join the open roll. Library
shows one roll with the combined count, and Refresh will not separate them.
D. Camera scan proves it is only a missing call. Camera Scanning panel, Folder
~/scans/repro/cam, RollReproRoll1, scan a few frames. They land in~/scans/repro/cam/ReproRoll1/— correctly named, correctly per-roll. The tally stillreads
No rolland Library is still empty. Change Roll toReproRoll2and scan a fewmore. Then Import Subfolders as Rolls on
~/scans/repro/cam: both appear immediately,correctly named and separated. The roll boundary and its name were on disk all along.
E. Double membership (problem 8). Import Subfolders as Rolls on a parent holding one
roll folder. Open that roll. Scan into a new sibling subfolder under the same parent.
Refresh. The new folder becomes its own roll, and its frames are also in the first
roll's
extra_paths. Restart: the session comes back rollless.Design constraint
The roll has to exist and be active before
request_asset_discoveryruns. Creatingit after the files land does not fix problem 1, because half-frame splitting is decided
inside discovery — which is also why Refresh, which never opens the roll, cannot stand in
for a fix.
Open questions
the Film Scanner too?
<output>/<roll>/,mirroring camera scan; a virtual roll over the flat output folder; or recognizing the
output folder itself?
All reactions