Files
Curator/docs/modules/core.file.md
T

5.7 KiB

src/core/file.py

The File class: one playable movie file as the UI sees it. A File is a view onto one media entry of a movie record in the pool index — metadata (title, tags, ČSFD link, attributes, date) lives on the shared record, so every version of a film reads the same values. See docs/architecture.md.

Source: src/core/file.py

Classes

File

class · line 5

class File:

One movie file in the pool, as the UI sees it. Holds the path, the list of tags and the metadata accessors; metadata itself is stored on the movie record in the pool index and the File reads it through it.

File.__init__

method · line 6

__init__(file_path: Path, tagmanager=None, index=None) -> None

Create a file object for file_path. Metadata is loaded from the pool index when index is given; without an index the object is in-memory only.

File._identity_from_path

method · line 41

_identity_from_path() -> tuple[str, str, str | None, int | None, str]

(key, title, year, tmdb_id, label) implied by this file's location.

A file inside its own Title (rok) [tmdbid] folder is one version of that movie — identity comes from the folder, and the rest of its own stem is the version label. A flat file carries both in its own name.

File.get_metadata

method · line 67

get_metadata() -> None

Load this file's metadata from the movie record that owns it.

Since the pool index became identity-keyed (see src.core.movie), a File is a view on one media entry of a movie record — every version of the same film therefore reads the same title/tags/ČSFD/… A file the index doesn't know yet joins the movie of the same identity when there is one (that's how a newly added version inherits the shared metadata instead of blanking it), otherwise it starts a new record.

File._init_new_metadata

method · line 95

_init_new_metadata() -> None

Reset all metadata fields to their defaults for a file the index doesn't know yet.

File._build_record

method · line 107

_build_record() -> dict

Serialise this file's metadata into the dictionary stored in the pool index (tags as full paths, auto-derived tags, date, title, ČSFD link, …).

File._apply_record

method · line 126

_apply_record(data: dict) -> None

Load metadata from an index record dictionary into this object's fields (the inverse of _build_record). Missing keys fall back to defaults.

File.save_metadata

method · line 152

save_metadata()

Persist metadata into this file's movie record (no-op without index).

Writes the shared fields onto the movie record and makes sure the record lists this file among its media. A file the index has never seen starts a new record under its own identity key.

File._library_name

method · line 182

_library_name() -> str

Top-level pool folder this file sits in (its library), or "".

File.added_timestamp

method · line 190

added_timestamp() -> float

Epoch seconds for 'date added' — the stored added or the file mtime.

Used to order the "recently added" folder (newer = larger). The fallback is mtime, not ctime: creating the Filmotéka hardlinks bumps the source inode's ctime, which would make ctime-based ordering meaningless, whereas mtime (preserved from the source on import) stays stable.

File.name_context

method · line 209

name_context() -> dict

Fields for a miniDLNA filename template (see config tag schema).

Provides title / year / rating / ext / stem / filename from the movie's metadata (year & rating come from the NFO cache, year falling back to a Rok tag, then the canonical filename). Missing values render empty.

File.set_attribute

method · line 242

set_attribute(key: str, value: str | None) -> None

Set a free-form attribute (e.g. 'collection_sort'); None/'' removes it.

File.delete_metadata

method · line 253

delete_metadata() -> None

Drop this file from its movie record; the last one takes the record.

Removing one version of a multi-version movie leaves the movie (and its metadata) in place — only when its last media entry goes does the whole record go with it.

File.relocate

method · line 273

relocate(new_path: Path) -> None

Point this File at a new path, moving its media entry along.

The physical file must already have been moved/renamed by the caller; this only repoints the movie record's media entry (and the File), so a rename never detaches a file from its movie.

File.set_date

method · line 294

set_date(date_str: str | None)

Set the date the movie was added (YYYY-MM-DD) or clear it with None / an empty string, then save the metadata.

File.apply_nfo

method · line 303

apply_nfo(nfo, schema: list[dict] | None=None) -> dict

Regenerate the auto (NFO-derived) tags from the movie's NFO.

Reads genres/year/countries/rating from nfo (nfo.NfoData) per the tag schema's source fields and (re)creates those tags; user-added tags are kept. Also caches year/rating (for folder grouping) and fills the title when missing. nfo of None (no NFO yet) is a no-op.

Returns: dict with 'success' and 'tags_added'.

File.add_tag

method · line 347

add_tag(tag)

Attach a tag to this file. Accepts a Tag or a category/name string; a string without a category goes to the default category. Saves on change.

File.remove_tag

method · line 364

remove_tag(tag)

Detach a tag, given as a Tag or a category/name string. Saves on change.