mirror of
https://github.com/truewhile/MeBox.git
synced 2026-10-10 23:36:37 +08:00
fix(media): 修复emby电影库混入剧集/特别篇识别/剧集合集 + 新增手动编辑元数据
emby 兼容层(hills/yamby 等客户端): - 电影库不再混入剧集:filterLikelyEpisodicPathsFromMovieQuery 按路径 特征(Season/S0x/Specials/电视剧/日番/国漫等)剔除误入电影库的剧集 - itemPayload 改用 mediaShouldBeEpisode:有季集号且(属剧集库或路径像剧集) 才标记为 Episode,修正电影库里剧集被当成 Movie 特别篇识别: - episode_parser 新增 patSpecialSeason,识别 S0/Season 0/Specials/SP/OVA/ OAD/番外/特别篇/特典 文件夹 → 第0季;seasonFromParents 返回 found 标志, 区分"明确第0季"与"未识别默认第1季" - emby seasonDir 正则同步支持 Specials/SP/OVA/特别篇 等 剧集合集: - groupSeries 抽出 isSeriesCard,卡片链接按是否剧集判定,修复剧集卡片 跳转;每集分离的根因(季集号/分组key)随入库识别修复一并改善 手动编辑元数据(自采集视频无TMDB信息时可自定义封面/标题/简介/分类): - 新增 MediaService.UpdateMetadata + PATCH /media/:id/metadata(需admin) - 前端 MetadataEditDialog 接入 LibraryPage 与 MediaDetailPage 其他:scanner/scraper/nfo/local+cloud_metadata/adult 元数据识别配套改进; .gitignore 忽略本地 .dev-cache/.dev-data 运行产物。
This commit is contained in:
@@ -1840,16 +1840,16 @@ func cloudMetadataNeedsRefresh(existing existingCloudMedia, localMeta *LocalMeta
|
||||
if localMeta.Year > 0 && existing.Year <= 0 {
|
||||
return true
|
||||
}
|
||||
if localMeta.TMDbID > 0 && existing.TMDbID <= 0 {
|
||||
if localMeta.TMDbID > 0 && existing.TMDbID != localMeta.TMDbID {
|
||||
return true
|
||||
}
|
||||
if localMeta.BangumiID > 0 && existing.BangumiID <= 0 {
|
||||
if localMeta.BangumiID > 0 && existing.BangumiID != localMeta.BangumiID {
|
||||
return true
|
||||
}
|
||||
if strings.TrimSpace(localMeta.DoubanID) != "" && strings.TrimSpace(existing.DoubanID) == "" {
|
||||
if strings.TrimSpace(localMeta.DoubanID) != "" && strings.TrimSpace(existing.DoubanID) != strings.TrimSpace(localMeta.DoubanID) {
|
||||
return true
|
||||
}
|
||||
if strings.TrimSpace(localMeta.TheTVDBID) != "" && strings.TrimSpace(existing.TheTVDBID) == "" {
|
||||
if strings.TrimSpace(localMeta.TheTVDBID) != "" && strings.TrimSpace(existing.TheTVDBID) != strings.TrimSpace(localMeta.TheTVDBID) {
|
||||
return true
|
||||
}
|
||||
if strings.TrimSpace(localMeta.PosterURL) != "" && strings.TrimSpace(existing.PosterURL) == "" {
|
||||
@@ -1897,7 +1897,7 @@ func cloudSeriesTitleFromMediaPath(mediaPath string) (string, int) {
|
||||
}
|
||||
base := strings.TrimSpace(dirs[len(dirs)-1])
|
||||
usedSeasonFolder := false
|
||||
if seasonFromDir(base) > 0 {
|
||||
if _, ok := seasonFromDir(base); ok {
|
||||
usedSeasonFolder = true
|
||||
dirs = dirs[:len(dirs)-1]
|
||||
if len(dirs) == 0 {
|
||||
@@ -2387,7 +2387,7 @@ func applyLocalMetadata(m *model.Media, local *LocalMetadata) {
|
||||
if local.TheTVDBID != "" {
|
||||
m.TheTVDBID = local.TheTVDBID
|
||||
}
|
||||
if local.SeasonNum > 0 {
|
||||
if local.SeasonNum > 0 || local.EpisodeNum > 0 {
|
||||
m.SeasonNum = local.SeasonNum
|
||||
}
|
||||
if local.EpisodeNum > 0 {
|
||||
@@ -2405,11 +2405,15 @@ func applyLocalMetadata(m *model.Media, local *LocalMetadata) {
|
||||
if local.NSFW {
|
||||
m.NSFW = true
|
||||
}
|
||||
if local.HasNFO || (!local.PathHint && localHasDescriptiveMetadata(local)) {
|
||||
if localMetadataMarksMatched(local) {
|
||||
m.ScrapeStatus = "matched"
|
||||
}
|
||||
}
|
||||
|
||||
func localMetadataMarksMatched(local *LocalMetadata) bool {
|
||||
return local != nil && (local.HasNFO || (!local.PathHint && localHasDescriptiveMetadata(local)))
|
||||
}
|
||||
|
||||
func localHasDescriptiveMetadata(local *LocalMetadata) bool {
|
||||
if local == nil {
|
||||
return false
|
||||
|
||||
Reference in New Issue
Block a user