diff options
| author | Adam Malczewski <[email protected]> | 2026-04-09 17:13:03 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-04-09 17:13:03 +0900 |
| commit | db1b2315b78d2b358fa8b375ae0216c408ed097e (patch) | |
| tree | c1e00ce88304c2d65c9d8bf153a9af5a2d3fc5aa /src/lib/flashair | |
| parent | a4b619ff1229b226da3e7228c167aad4289e1784 (diff) | |
| download | flashair-speedsync-db1b2315b78d2b358fa8b375ae0216c408ed097e.tar.gz flashair-speedsync-db1b2315b78d2b358fa8b375ae0216c408ed097e.zip | |
image viewer
Diffstat (limited to 'src/lib/flashair')
| -rw-r--r-- | src/lib/flashair/client.ts | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/lib/flashair/client.ts b/src/lib/flashair/client.ts index 4e3a567..978eb60 100644 --- a/src/lib/flashair/client.ts +++ b/src/lib/flashair/client.ts @@ -77,6 +77,9 @@ function parseFileList(text: string): FlashAirFileEntry[] { /** Known image extensions the FlashAir thumbnail.cgi supports (JPEG only). */ const JPEG_EXTENSIONS = new Set(['.jpg', '.jpeg']); +/** Regex matching common image file extensions. */ +const IMAGE_EXTENSIONS = /\.(jpe?g|png|bmp|gif)$/i; + function isJpeg(filename: string): boolean { const ext = filename.slice(filename.lastIndexOf('.')).toLowerCase(); return JPEG_EXTENSIONS.has(ext); @@ -193,6 +196,42 @@ export const flashair = { return { blob, meta }; }, + /** + * Recursively list all image files on the card starting from a root directory. + * Returns files sorted by date, newest first. + */ + async listAllImages(rootDir: string): Promise<FlashAirFileEntry[]> { + const allImages: FlashAirFileEntry[] = []; + const dirsToVisit: string[] = [rootDir]; + + while (dirsToVisit.length > 0) { + const dir = dirsToVisit.pop(); + if (dir === undefined) break; + + let entries: FlashAirFileEntry[]; + try { + entries = await flashair.listFiles(dir); + } catch { + continue; + } + + for (const entry of entries) { + if (entry.isDirectory) { + dirsToVisit.push(entry.path); + } else if (IMAGE_EXTENSIONS.test(entry.filename)) { + allImages.push(entry); + } + } + } + + allImages.sort((a, b) => { + const dateCompare = b.rawDate - a.rawDate; + if (dateCompare !== 0) return dateCompare; + return b.rawTime - a.rawTime; + }); + + return allImages; + }, } as const; export type { FlashAirFileEntry, ThumbnailMeta } from './types'; |
