Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/server-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ on:
- 'internal/service/stream_artifacts.go'
- 'internal/service/ondemand.go'
- 'internal/service/media_analysis_worker*.go'
- 'internal/service/scanner.go'
- 'internal/service/scanner_test.go'
- 'internal/service/file_watcher.go'
- 'internal/handler/lite.go'
- 'internal/handler/handler.go'
- 'internal/handler/stream_artifacts.go'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ class HomeViewModel @Inject constructor(
@Composable
fun HomeScreen(
modifier: Modifier = Modifier,
onMediaClick: (String) -> Unit,
onMediaClick: (String, Boolean) -> Unit,
onPlay: (String) -> Unit,
onRestart: (String) -> Unit = onPlay,
onLibraryClick: () -> Unit,
Expand Down Expand Up @@ -243,7 +243,7 @@ fun HomeScreen(
LandscapeMediaCard(
media = media,
imageUrl = resolveHomeArtwork(baseUrl, media, preferBackdrop = true),
onClick = { onMediaClick(media.resolvedId) },
onClick = { onMediaClick(media.resolvedId, media.isSeries) },
)
}
}
Expand Down Expand Up @@ -287,7 +287,7 @@ fun HomeScreen(
private fun HomeHeroCarousel(
items: List<MediaCard>,
baseUrl: String?,
onOpen: (String) -> Unit,
onOpen: (String, Boolean) -> Unit,
onPlay: (String) -> Unit,
onRestart: (String) -> Unit,
onFavoritesClick: () -> Unit,
Expand Down Expand Up @@ -484,7 +484,7 @@ private fun HomeHeroCarousel(
}

Surface(
onClick = { onOpen(item.resolvedId) },
onClick = { onOpen(item.resolvedId, item.isSeries) },
modifier = Modifier
.align(Alignment.TopEnd)
.padding(12.dp),
Expand Down Expand Up @@ -677,7 +677,7 @@ private fun PosterShelf(
items: List<MediaCard>,
baseUrl: String?,
onMore: () -> Unit,
onMediaClick: (String) -> Unit,
onMediaClick: (String, Boolean) -> Unit,
) {
Column {
HomeSectionHeader(title = title, action = "更多", onAction = onMore)
Expand All @@ -687,7 +687,7 @@ private fun PosterShelf(
PosterMediaCard(
media = media,
imageUrl = resolveHomeArtwork(baseUrl, media, preferBackdrop = false),
onClick = { onMediaClick(media.resolvedId) },
onClick = { onMediaClick(media.resolvedId, media.isSeries) },
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ class LibraryViewModel @Inject constructor(

fun resetFilter() = applyFilter(LibraryFilter())

fun selectMedia(id: String) {
fun selectMedia(id: String, isSeries: Boolean = false) {
if (id.isBlank()) return
if (_state.value.selectedMediaId == id && _state.value.selectedDetail != null) return
selectionJob?.cancel()
Expand Down Expand Up @@ -204,7 +204,7 @@ class LibraryViewModel @Inject constructor(
@Composable
fun LibraryScreen(
modifier: Modifier = Modifier,
onMediaClick: (String) -> Unit,
onMediaClick: (String, Boolean) -> Unit,
onPlay: (String) -> Unit,
viewModel: LibraryViewModel = hiltViewModel(),
) {
Expand Down Expand Up @@ -295,7 +295,7 @@ private fun LibraryCatalogPane(
onFilterClick: () -> Unit,
onRefresh: () -> Unit,
onFilterChange: (LibraryFilter) -> Unit,
onMediaClick: (String) -> Unit,
onMediaClick: (String, Boolean) -> Unit,
modifier: Modifier = Modifier,
) {
Column(
Expand Down Expand Up @@ -364,7 +364,7 @@ private fun LibraryGrid(
media: LazyPagingItems<MediaCard>,
state: LibraryUiState,
baseUrl: String?,
onMediaClick: (String) -> Unit,
onMediaClick: (String, Boolean) -> Unit,
) {
LazyVerticalGrid(
columns = GridCells.Adaptive(minSize = 132.dp),
Expand Down Expand Up @@ -399,7 +399,7 @@ private fun LibraryGrid(
subtitle = item.year?.toString(),
imageUrl = resolveImage(baseUrl, item.resolvedPoster),
progress = item.normalizedProgress,
onClick = { onMediaClick(item.resolvedId) },
onClick = { onMediaClick(item.resolvedId, item.isSeries) },
modifier = Modifier.padding(3.dp),
)
}
Expand Down Expand Up @@ -534,7 +534,7 @@ private fun LibraryDetailPane(
state: LibraryUiState,
baseUrl: String?,
onRetry: (String) -> Unit,
onOpenDetail: (String) -> Unit,
onOpenDetail: (String, Boolean) -> Unit,
onPlay: (String) -> Unit,
modifier: Modifier = Modifier,
) {
Expand Down Expand Up @@ -574,7 +574,7 @@ private fun LibraryDetailPane(
private fun LibraryDetailContent(
media: MediaDetail,
baseUrl: String?,
onOpenDetail: (String) -> Unit,
onOpenDetail: (String, Boolean) -> Unit,
onPlay: (String) -> Unit,
) {
Column(
Expand Down Expand Up @@ -637,7 +637,7 @@ private fun LibraryDetailContent(
Text("立即播放")
}
OutlinedButton(
onClick = { onOpenDetail(media.id) },
onClick = { onOpenDetail(media.id, media.mediaType == "series") },
modifier = Modifier
.fillMaxWidth()
.padding(top = 10.dp),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,8 +153,14 @@ fun MainShell(viewModel: MainShellViewModel = hiltViewModel()) {
}
}

fun openDetail(mediaId: String) {
if (mediaId.isNotBlank()) navController.navigate("detail/${Uri.encode(mediaId)}")
fun openDetail(mediaId: String, isSeries: Boolean = false) {
if (mediaId.isNotBlank()) {
if (isSeries) {
navController.navigate("series/${Uri.encode(mediaId)}")
} else {
navController.navigate("detail/${Uri.encode(mediaId)}")
}
}
}

fun openSeries(seriesId: String) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,7 @@ fun MediaDetailScreen(
onHighlightPlay: (String, Double) -> Unit = { id, _ -> onPlay(id) },
onPersonClick: (String) -> Unit,
onCollectionClick: (String) -> Unit,
onMediaClick: (String) -> Unit = onPlay,
onMediaClick: (String, Boolean) -> Unit = { id, _ -> onPlay(id) },
viewModel: MediaDetailViewModel = hiltViewModel(),
) {
val state by viewModel.state.collectAsState()
Expand Down Expand Up @@ -528,7 +528,7 @@ fun MediaDetailScreen(
SimilarPosterCard(
media = item,
imageUrl = resolveImage(baseUrl, item.resolvedPoster),
onClick = { onMediaClick(item.resolvedId) },
onClick = { onMediaClick(item.resolvedId, item.isSeries) },
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ data class PagedSocialAction(
@Composable
fun PagedFavoritesScreen(
onBack: () -> Unit,
onMediaClick: (String) -> Unit,
onMediaClick: (String, Boolean) -> Unit,
viewModel: PagedFavoritesViewModel = hiltViewModel(),
) {
val favorites = viewModel.favorites.collectAsLazyPagingItems()
Expand Down Expand Up @@ -215,7 +215,7 @@ fun PagedFavoritesScreen(
media = media,
imageUrl = resolveImage(session.activeServer?.baseUrl, media.resolvedPoster),
removing = action.runningId == mediaId,
onClick = { onMediaClick(mediaId) },
onClick = { onMediaClick(mediaId, media.isSeries) },
onRemove = { viewModel.remove(mediaId, favorites::refresh) },
)
}
Expand All @@ -236,7 +236,7 @@ fun PagedFavoritesScreen(
@Composable
fun PagedHistoryScreen(
onBack: () -> Unit,
onMediaClick: (String) -> Unit,
onMediaClick: (String, Boolean) -> Unit,
onPlay: (String) -> Unit,
viewModel: PagedHistoryViewModel = hiltViewModel(),
) {
Expand Down Expand Up @@ -314,7 +314,7 @@ fun PagedHistoryScreen(
imageUrl = mediaBackdropUrl(session.activeServer?.baseUrl, mediaId),
deleting = action.runningId == mediaId,
onPlay = { onPlay(mediaId) },
onDetail = { onMediaClick(mediaId) },
onDetail = { onMediaClick(mediaId, media.isSeries) },
onDelete = { viewModel.delete(mediaId, historyItems::refresh) },
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ class SearchViewModel @Inject constructor(
@Composable
fun SearchScreen(
modifier: Modifier = Modifier,
onMediaClick: (String) -> Unit,
onMediaClick: (String, Boolean) -> Unit,
onPersonClick: (String) -> Unit,
onCollectionClick: (String) -> Unit,
viewModel: SearchViewModel = hiltViewModel(),
Expand Down Expand Up @@ -183,7 +183,7 @@ fun SearchScreen(
subtitle = media.year?.toString(),
imageUrl = resolveImage(session.activeServer?.baseUrl, media.resolvedPoster),
progress = media.normalizedProgress,
onClick = { onMediaClick(media.resolvedId) },
onClick = { onMediaClick(media.resolvedId, media.isSeries) },
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ class FavoritesViewModel @Inject constructor(
@Composable
fun FavoritesScreen(
onBack: () -> Unit,
onMediaClick: (String) -> Unit,
onMediaClick: (String, Boolean) -> Unit,
viewModel: FavoritesViewModel = hiltViewModel(),
) {
val state by viewModel.state.collectAsState()
Expand All @@ -124,7 +124,7 @@ fun FavoritesScreen(
media = media,
imageUrl = resolveImage(session.activeServer?.baseUrl, media.resolvedPoster),
subtitle = listOfNotNull(media.year?.toString(), "已收藏").joinToString(" · "),
onClick = { onMediaClick(media.resolvedId.ifBlank { favorite.mediaId }) },
onClick = { onMediaClick(media.resolvedId.ifBlank { favorite.mediaId }, media.isSeries) },
action = {
IconButton(
onClick = { viewModel.remove(favorite.mediaId.ifBlank { media.resolvedId }) },
Expand Down Expand Up @@ -199,7 +199,7 @@ class HistoryViewModel @Inject constructor(
@Composable
fun HistoryScreen(
onBack: () -> Unit,
onMediaClick: (String) -> Unit,
onMediaClick: (String, Boolean) -> Unit,
viewModel: HistoryViewModel = hiltViewModel(),
) {
val state by viewModel.state.collectAsState()
Expand Down Expand Up @@ -229,7 +229,7 @@ fun HistoryScreen(
imageUrl = resolveImage(session.activeServer?.baseUrl, media.resolvedPoster),
subtitle = history.progressLabel,
progress = history.normalizedProgress,
onClick = { onMediaClick(media.resolvedId.ifBlank { history.mediaId }) },
onClick = { onMediaClick(media.resolvedId.ifBlank { history.mediaId }, media.isSeries) },
action = {
IconButton(
onClick = { viewModel.delete(history.mediaId) },
Expand Down Expand Up @@ -381,7 +381,7 @@ class CollectionDetailViewModel @Inject constructor(
fun CollectionDetailScreen(
collectionId: String,
onBack: () -> Unit,
onMediaClick: (String) -> Unit,
onMediaClick: (String, Boolean) -> Unit,
viewModel: CollectionDetailViewModel = hiltViewModel(),
) {
val state by viewModel.state.collectAsState()
Expand Down Expand Up @@ -449,7 +449,7 @@ fun CollectionDetailScreen(
media.rating.takeIf { it > 0 }?.let { "★ %.1f".format(it) },
media.resolution.takeIf(String::isNotBlank),
).joinToString(" · "),
onClick = { onMediaClick(media.id) },
onClick = { onMediaClick(media.id, false) },
)
}
}
Expand Down Expand Up @@ -497,7 +497,7 @@ class PersonDetailViewModel @Inject constructor(
fun PersonDetailScreen(
personId: String,
onBack: () -> Unit,
onMediaClick: (String) -> Unit,
onMediaClick: (String, Boolean) -> Unit,
viewModel: PersonDetailViewModel = hiltViewModel(),
) {
val state by viewModel.state.collectAsState()
Expand Down Expand Up @@ -553,7 +553,7 @@ fun PersonDetailScreen(
media = media,
imageUrl = resolveImage(session.activeServer?.baseUrl, media.resolvedPoster),
subtitle = media.year?.toString().orEmpty(),
onClick = { onMediaClick(media.resolvedId) },
onClick = { onMediaClick(media.resolvedId, media.isSeries) },
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ private val WEB_MOBILE_HOME_GENRES = listOf("动画", "喜剧", "冒险", "家
@Composable
fun WebMobileHomeScreen(
modifier: Modifier = Modifier,
onMediaClick: (String) -> Unit,
onMediaClick: (String, Boolean) -> Unit,
onPlay: (String) -> Unit,
onRestart: (String) -> Unit = onPlay,
onLibraryClick: () -> Unit,
Expand Down Expand Up @@ -172,7 +172,7 @@ fun WebMobileHomeScreen(
media = media,
imageUrl = webMobileArtwork(baseUrl, media, preferBackdrop = true),
width = cardWidth,
onClick = { onMediaClick(media.resolvedId) },
onClick = { onMediaClick(media.resolvedId, media.isSeries) },
)
}
}
Expand Down Expand Up @@ -553,7 +553,7 @@ private fun WebMobilePosterShelf(
items: List<MediaCard>,
baseUrl: String?,
onMore: () -> Unit,
onMediaClick: (String) -> Unit,
onMediaClick: (String, Boolean) -> Unit,
) {
WebMobileSectionSurface {
WebMobileSectionHeader(title = title, action = "更多", onAction = onMore)
Expand All @@ -566,7 +566,7 @@ private fun WebMobilePosterShelf(
media = media,
imageUrl = webMobileArtwork(baseUrl, media, preferBackdrop = false),
width = cardWidth,
onClick = { onMediaClick(media.resolvedId) },
onClick = { onMediaClick(media.resolvedId, media.isSeries) },
)
}
}
Expand Down
5 changes: 5 additions & 0 deletions internal/service/file_watcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,11 @@ func (fw *FileWatcherService) handleEvent(event fsnotify.Event) {
// 判断是否为视频文件或目录
ext := strings.ToLower(filepath.Ext(event.Name))
isVideo := supportedExts[ext]
// 隐藏目录与 NAS 缓存目录(fnOS .@__thumb、群晖 @eaDir 等)内的文件
// 是缩略图/预览缓存,不参与媒体导入
if isVideo && pathHasHiddenOrCacheSegment(event.Name) {
return
}
isDir := false
if info, err := os.Stat(event.Name); err == nil {
isDir = info.IsDir()
Expand Down
Loading