SYMBOL INDEX (74 symbols across 19 files) FILE: client/src/App.js function App (line 15) | function App() { FILE: client/src/components/ImageGallery.js function refreshAfterEdit (line 947) | async function refreshAfterEdit(targetDir) { function fetchImages (line 1094) | async function fetchImages( FILE: client/src/components/MapPage.js function MapPage (line 106) | function MapPage() { FILE: client/src/components/ThemeSwitcher.js constant THEME_KEY (line 5) | const THEME_KEY = "theme"; constant AUTO_KEY (line 6) | const AUTO_KEY = "themeAutoMode"; FILE: client/src/components/UploadComponent.js function sanitizeDir (line 24) | function sanitizeDir(input) { class ConcurrencyLimiter (line 33) | class ConcurrencyLimiter { method constructor (line 34) | constructor(limit) { method add (line 40) | add(task) { method next (line 47) | next() { FILE: client/src/utils/secureStorage.js constant STORAGE_KEY (line 1) | const STORAGE_KEY = "cloudimgs_password"; constant SALT (line 2) | const SALT = "cloudimgs-salt-2025"; constant EXPIRATION_TIME (line 3) | const EXPIRATION_TIME = 24 * 60 * 60 * 1000; function xorCipher (line 5) | function xorCipher(input) { function setPassword (line 15) | function setPassword(plain) { function getPassword (line 33) | function getPassword() { function clearPassword (line 82) | function clearPassword() { FILE: server/db/database.js function init (line 32) | function init() { FILE: server/index.js constant PORT (line 20) | const PORT = config.server.port || 5000; constant STORAGE_PATH (line 71) | const STORAGE_PATH = config.storage.path; function cleanTrash (line 73) | async function cleanTrash() { FILE: server/middleware/auth.js function requirePassword (line 3) | function requirePassword(req, res, next) { FILE: server/middleware/upload.js constant STORAGE_PATH (line 7) | const STORAGE_PATH = config.storage.path; constant FORBIDDEN_EXTENSIONS (line 16) | const FORBIDDEN_EXTENSIONS = [ constant FORBIDDEN_MIME_PREFIXES (line 20) | const FORBIDDEN_MIME_PREFIXES = [ FILE: server/routes/imageRoutes.js constant STORAGE_PATH (line 14) | const STORAGE_PATH = config.storage.path; function getDirectories (line 54) | async function getDirectories(dir) { function serveImage (line 263) | async function serveImage(req, res, relPath) { FILE: server/routes/manageRoutes.js constant STORAGE_PATH (line 11) | const STORAGE_PATH = config.storage.path; function moveToTrash (line 67) | async function moveToTrash(filePath) { FILE: server/routes/uploadRoutes.js constant STORAGE_PATH (line 15) | const STORAGE_PATH = config.storage.path; function getBaseUrl (line 17) | function getBaseUrl(req) { FILE: server/services/clipService.js class ClipService (line 8) | class ClipService { method constructor (line 9) | constructor() { method getInstance (line 25) | static getInstance() { method getModels (line 32) | async getModels() { method normalize (line 92) | normalize(vector) { method getTextEmbedding (line 98) | async getTextEmbedding(text) { method getImageEmbedding (line 114) | async getImageEmbedding(imagePath) { method addToQueue (line 136) | addToQueue(image, priority = 'low') { method processQueue (line 154) | async processQueue() { method processImage (line 177) | async processImage(image) { method reindex (line 237) | async reindex() { method scanAll (line 254) | async scanAll() { method getTranslator (line 287) | async getTranslator() { method translate (line 313) | async translate(text) { method search (line 338) | async search(queryText, limit = 50) { FILE: server/services/metadataService.js function parseImageMetadata (line 9) | async function parseImageMetadata(filePath) { function parseAudioDuration (line 23) | async function parseAudioDuration(filePath) { function parseVideoDuration (line 33) | async function parseVideoDuration(filePath) { function getFileMetadata (line 38) | async function getFileMetadata(filePath, relPath, existingStat = null) { constant EXT_AUDIO (line 148) | const EXT_AUDIO = ['.mp3', '.wav', '.ogg', '.m4a', '.flac']; constant EXT_VIDEO (line 149) | const EXT_VIDEO = ['.mp4', '.webm', '.mov', '.avi', '.mkv']; FILE: server/services/syncService.js constant STORAGE_PATH (line 8) | const STORAGE_PATH = config.storage.path; constant CONFIG_DIR_NAME (line 9) | const CONFIG_DIR_NAME = "config"; constant TRASH_DIR_NAME (line 10) | const TRASH_DIR_NAME = ".trash"; constant LEGACY_CACHE_PATH (line 11) | const LEGACY_CACHE_PATH = path.join(STORAGE_PATH, CACHE_DIR_NAME, "img_m... function migrateFromLegacyJson (line 13) | async function migrateFromLegacyJson() { function getAllFiles (line 66) | async function getAllFiles(dir) { function syncFileSystem (line 97) | async function syncFileSystem() { FILE: server/utils/albumUtils.js constant STORAGE_PATH (line 6) | const STORAGE_PATH = config.storage.path; function getAlbumPasswordPath (line 8) | async function getAlbumPasswordPath(dirPath) { function verifyAlbumPassword (line 13) | async function verifyAlbumPassword(dirPath, password) { function isAlbumLocked (line 26) | async function isAlbumLocked(dirPath) { function getAllLockedDirectories (line 37) | async function getAllLockedDirectories() { FILE: server/utils/fileUtils.js constant CACHE_DIR_NAME (line 6) | const CACHE_DIR_NAME = ".cache"; function safeJoin (line 8) | function safeJoin(base, target) { function sanitizeFilename (line 16) | function sanitizeFilename(filename) { function generateThumbHash (line 40) | async function generateThumbHash(filePath) { function getThumbHash (line 71) | async function getThumbHash(filePath) { function saveBase64Image (line 87) | async function saveBase64Image(base64Data, dir) { function downloadFromUrl (line 116) | async function downloadFromUrl(imageUrl) { FILE: server/utils/urlUtils.js function formatImageResponse (line 9) | function formatImageResponse(req, image) {