summaryrefslogtreecommitdiffhomepage
path: root/src/lib/flashair/client.ts
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-04-09 17:13:03 +0900
committerAdam Malczewski <[email protected]>2026-04-09 17:13:03 +0900
commitdb1b2315b78d2b358fa8b375ae0216c408ed097e (patch)
treec1e00ce88304c2d65c9d8bf153a9af5a2d3fc5aa /src/lib/flashair/client.ts
parenta4b619ff1229b226da3e7228c167aad4289e1784 (diff)
downloadflashair-speedsync-db1b2315b78d2b358fa8b375ae0216c408ed097e.tar.gz
flashair-speedsync-db1b2315b78d2b358fa8b375ae0216c408ed097e.zip
image viewer
Diffstat (limited to 'src/lib/flashair/client.ts')
-rw-r--r--src/lib/flashair/client.ts39
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';