package com.bm.andpictures import java.io.InputStream /** * Browses an SMB share starting at [rootKey]. Keys are share-relative paths * using backslashes (matching [SmbUploader]); an empty key means the share * root. */ class NasFileSource( private val uploader: SmbUploader, private val hostAndShare: String, override val rootKey: String, ) : FileSource { override val title: String get() = "NAS" override fun list(dirKey: String): List { val entries = uploader.listEntries(dirKey) val dirs = entries.asSequence() .filter { it.isDirectory } .sortedBy { it.name.lowercase() } .map { TileEntry(it.name, joinKey(dirKey, it.name), isDirectory = true, sizeBytes = 0L, isImage = false) } .toList() val files = entries.asSequence() .filter { !it.isDirectory } .sortedBy { it.name.lowercase() } .map { TileEntry( it.name, joinKey(dirKey, it.name), isDirectory = false, sizeBytes = it.sizeBytes, isImage = isImageName(it.name), ) } .toList() return dirs + files } override fun parentOf(dirKey: String): String? { val norm = dirKey.trim('\\', '/') if (norm.isEmpty() || norm == rootKey.trim('\\', '/')) return null val parent = norm.substringBeforeLast('\\', "") return parent } override fun displayName(dirKey: String): String { val norm = dirKey.trim('\\', '/').replace('\\', '/') return if (norm.isEmpty()) "//$hostAndShare" else "//$hostAndShare/$norm" } override fun openStream(key: String): InputStream = uploader.openRead(key) override fun close() { uploader.close() } private fun joinKey(dir: String, name: String): String { val d = dir.trim('\\', '/') return if (d.isEmpty()) name else "$d\\$name" } }