check / check (push) Waiting to run
The default names of `quak get`, `quak get-thumb`, `downloadFile` and `downloadThumbnail`, and the album folders of `backup-metadata`, could be over 255 bytes, which a file system refuses. `defaultFileName` and `shortenKeepingExtension` in `src/filename.ts` now cut such a name short, keeping its extension when it fits; a live photo's image and video get their own extension before the cut. A cut name never starts with a dot and is never a Windows device name. `--out` and `outPath` are kept as given. A `backup-metadata` folder keeps its `<id>-`. `safeExtension` gives `.bin` for an extension of more than 16 letters and digits, so a save path's name always fits. Model: opus-5-5
46 lines
2.0 KiB
TypeScript
46 lines
2.0 KiB
TypeScript
// How the CLI presents a file's identity in `files`, `get`, and `get-thumb`.
|
|
//
|
|
// These read the file's own decrypted metadata — the raw title and the
|
|
// creationTime in microseconds — rather than the `PhotoRecord` projection the
|
|
// rest of the library exposes. The projection prefers `editedName`/`editedTime`
|
|
// and reports time in milliseconds, which is right for a photo browser but
|
|
// would change the CLI's externally-visible output. The pre-library CLI printed
|
|
// `metadata.title` and `metadata.creationTime` and named downloads after
|
|
// `metadata.title`, and issue #52 requires that output stay byte-identical, so
|
|
// the commands shape their output from the raw `EnteFile` through here.
|
|
|
|
import { defaultFileName } from "./filename.js";
|
|
import type { EnteFile, FileType, Microseconds } from "./model/types.js";
|
|
|
|
// One row of `quak files --json`.
|
|
export interface FileListRow {
|
|
id: number;
|
|
title: string;
|
|
fileType: FileType;
|
|
creationTime: Microseconds;
|
|
collectionID: number;
|
|
}
|
|
|
|
export const fileListRow = (file: EnteFile): FileListRow => ({
|
|
id: file.id,
|
|
title: file.metadata.title,
|
|
fileType: file.metadata.fileType,
|
|
creationTime: file.metadata.creationTime,
|
|
collectionID: file.collectionID,
|
|
});
|
|
|
|
// One line of `quak files` in its human, tab-separated form.
|
|
export const fileListLine = (file: EnteFile): string =>
|
|
`${file.id}\t${file.metadata.fileType}\t${file.metadata.title}`;
|
|
|
|
// Default output path for `quak get` when `--out` is not given, made from the
|
|
// title (see `defaultFileName`), with `ext` in place of its extension for a
|
|
// live photo's image or video; `--out` is the user's and is used as is.
|
|
export const originalName = (file: EnteFile, ext?: string): string =>
|
|
defaultFileName(file.metadata.title, file.id, { ext });
|
|
|
|
// Default output path for `quak get-thumb` when `--out` is not given: `thumb_`
|
|
// and the title.
|
|
export const thumbnailName = (file: EnteFile): string =>
|
|
defaultFileName(file.metadata.title, file.id, { prefix: "thumb_" });
|