- Immich adapter (adapters/immich.js): swipe a self-hosted photo library over its REST API, proving the adapter contract works for remote sources, not just the filesystem. - Refactor the preview contract from resolvePreviewPath() to streamPreview()/streamThumbnail(), so adapters can serve previews from anywhere (local file, proxied fetch, etc). - macOS Quick Look-backed thumbnail cache (lib/thumbnails.js): real resized thumbnails, HEIC/HEIF, and video poster frames, with a hard timeout and graceful fallback to the original file everywhere else. - Native "Browse..." folder picker (osascript) in Settings, with manual typing as the fallback on other platforms. - Confirm-guarded "Empty trash" action -- the only place this project permanently deletes anything. - Session resume: progress now survives a server restart and an unchanged Rescan via .swipeanything-session.json. - Accessibility pass: live region item announcements, aria-labels on action buttons, focus-trapped shortcuts dialog with focus restore, visible focus rings, a real role="progressbar", and <button>s instead of <a href="#"> in the header. - node:test suite (23 tests) covering the folder adapter, the Immich adapter (mocked fetch, no live server needed), and the HTTP API end-to-end; wired up as `npm test`. - Also includes the keyboard shortcuts (up/down undo/skip), swipe stamps, and shortcuts modal from the previous session that hadn't been committed yet.
27 lines
660 B
JavaScript
27 lines
660 B
JavaScript
'use strict';
|
|
|
|
const { FolderAdapter } = require('./folder');
|
|
const { ImmichAdapter } = require('./immich');
|
|
|
|
// Register new adapters here. See CONTRIBUTING.md for the full guide.
|
|
const ADAPTERS = {
|
|
[FolderAdapter.id]: FolderAdapter,
|
|
[ImmichAdapter.id]: ImmichAdapter,
|
|
};
|
|
|
|
function getAdapter(id) {
|
|
return ADAPTERS[id];
|
|
}
|
|
|
|
function listAdapters() {
|
|
return Object.values(ADAPTERS).map((AdapterClass) => ({
|
|
id: AdapterClass.id,
|
|
label: AdapterClass.label,
|
|
description: AdapterClass.description,
|
|
configSchema: AdapterClass.configSchema,
|
|
actions: AdapterClass.actions,
|
|
}));
|
|
}
|
|
|
|
module.exports = { ADAPTERS, getAdapter, listAdapters };
|