From f553674b714beab23982b984fd11b6d48d6219d5 Mon Sep 17 00:00:00 2001 From: ShukeBta Date: Thu, 28 May 2026 14:52:52 +0800 Subject: [PATCH] Update commit message generation --- .tmp-deploy-server.pid | 2 +- internal/service/emby_compat.go | 25 +++++-- internal/service/local_metadata_test.go | 98 +++++++++++++++++++++++++ internal/service/scraper.go | 3 - 4 files changed, 117 insertions(+), 11 deletions(-) diff --git a/.tmp-deploy-server.pid b/.tmp-deploy-server.pid index 9a672fa..552313f 100644 --- a/.tmp-deploy-server.pid +++ b/.tmp-deploy-server.pid @@ -1 +1 @@ -28604 +20380 diff --git a/internal/service/emby_compat.go b/internal/service/emby_compat.go index ab32214..d917a2c 100644 --- a/internal/service/emby_compat.go +++ b/internal/service/emby_compat.go @@ -49,10 +49,11 @@ func NewEmbyService(cfg *config.Config, log *zap.Logger, repo *repository.Contai func (e *EmbyService) SystemInfo() map[string]any { return map[string]any{ "Id": embyServerID, + "ServerId": embyServerID, "ServerName": "MediaStationGo", "Version": "10.8.13", - "ProductName": "MediaStationGo", - "OperatingSystem": "Linux", + "ProductName": "Jellyfin Server", + "OperatingSystem": "Windows", "Architecture": "X64", "LocalAddress": "", "WanAddress": "", @@ -61,6 +62,9 @@ func (e *EmbyService) SystemInfo() map[string]any { "SupportsLibraryMonitor": true, "SupportsHttps": false, "SupportsAutoDiscovery": true, + "HttpServerPortNumber": e.cfg.App.Port, + "HttpsPortNumber": 0, + "PublishedServerUrl": "", "WebSocketPortNumber": e.cfg.App.Port, "CompletedInstallations": []any{}, "CanSelfRestart": false, @@ -72,11 +76,18 @@ func (e *EmbyService) SystemInfo() map[string]any { // SystemInfoPublic 是不需要认证的精简版(Emby Web 客户端登陆前会拉)。 func (e *EmbyService) SystemInfoPublic() map[string]any { return map[string]any{ - "Id": embyServerID, - "ServerName": "MediaStationGo", - "Version": "10.8.13", - "ProductName": "MediaStationGo", - "OperatingSystem": "Linux", + "Id": embyServerID, + "ServerId": embyServerID, + "ServerName": "MediaStationGo", + "Version": "10.8.13", + "ProductName": "Jellyfin Server", + "OperatingSystem": "Windows", + "LocalAddress": "", + "WanAddress": "", + "HttpServerPortNumber": e.cfg.App.Port, + "HttpsPortNumber": 0, + "SupportsHttps": false, + "SupportsAutoDiscovery": true, "StartupWizardCompleted": true, } } diff --git a/internal/service/local_metadata_test.go b/internal/service/local_metadata_test.go index 76e17de..c76129b 100644 --- a/internal/service/local_metadata_test.go +++ b/internal/service/local_metadata_test.go @@ -219,6 +219,60 @@ func TestReadAdultMovieNFOFallbackInSingleMovieFolder(t *testing.T) { } } +func TestReadAdultNFOByCodeForStackedFile(t *testing.T) { + root := t.TempDir() + mediaPath := filepath.Join(root, "SSIS-001-C.mp4") + if err := os.WriteFile(mediaPath, []byte("x"), 0o644); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(filepath.Join(root, "SSIS-001.nfo"), []byte(` + 按番号命中的本地 NFO + SSIS-001 + SSIS-001-poster.jpgSSIS-001-fanart.jpg +`), 0o644); err != nil { + t.Fatal(err) + } + poster := filepath.Join(root, "SSIS-001-poster.jpg") + fanart := filepath.Join(root, "SSIS-001-fanart.jpg") + if err := os.WriteFile(poster, []byte("jpg"), 0o644); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(fanart, []byte("jpg"), 0o644); err != nil { + t.Fatal(err) + } + + got, err := ReadLocalMetadata(mediaPath, root, false) + if err != nil { + t.Fatal(err) + } + if got == nil || got.Title != "按番号命中的本地 NFO" || got.AdultCode != "SSIS-001" || !got.HasNFO { + t.Fatalf("unexpected metadata: %+v", got) + } + if got.PosterURL != poster || got.BackdropURL != fanart { + t.Fatalf("artwork poster=%q fanart=%q", got.PosterURL, got.BackdropURL) + } +} + +func TestReadAdultArtworkByCodeWithoutNFO(t *testing.T) { + root := t.TempDir() + mediaPath := filepath.Join(root, "SSIS-001-CD1.mp4") + if err := os.WriteFile(mediaPath, []byte("x"), 0o644); err != nil { + t.Fatal(err) + } + poster := filepath.Join(root, "SSIS-001-poster.jpg") + if err := os.WriteFile(poster, []byte("jpg"), 0o644); err != nil { + t.Fatal(err) + } + + got, err := ReadLocalMetadata(mediaPath, root, false) + if err != nil { + t.Fatal(err) + } + if got == nil || got.PosterURL != poster || !got.HasArtwork || got.HasNFO { + t.Fatalf("unexpected artwork metadata: %+v", got) + } +} + func TestScanLibraryUsesLocalMetadata(t *testing.T) { root := t.TempDir() seasonDir := filepath.Join(root, "Show", "Season 02") @@ -277,6 +331,50 @@ func TestScanLibraryUsesLocalMetadata(t *testing.T) { } } +func TestScanLibraryDoesNotMarkArtworkOnlyAsMatched(t *testing.T) { + root := t.TempDir() + mediaPath := filepath.Join(root, "SSIS-001-CD1.mp4") + if err := os.WriteFile(mediaPath, []byte("x"), 0o644); err != nil { + t.Fatal(err) + } + poster := filepath.Join(root, "SSIS-001-poster.jpg") + if err := os.WriteFile(poster, []byte("jpg"), 0o644); err != nil { + t.Fatal(err) + } + + db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) + if err != nil { + t.Fatal(err) + } + if err := db.AutoMigrate(&model.Library{}, &model.Media{}, &model.Setting{}); err != nil { + t.Fatal(err) + } + repos := repository.New(db) + lib := model.Library{Name: "Adult", Path: root, Type: "movie", Enabled: true} + if err := repos.Library.Create(t.Context(), &lib); err != nil { + t.Fatal(err) + } + + scanner := NewScannerService(&config.Config{}, zap.NewNop(), repos, NewHub(zap.NewNop()), nil, nil) + res, err := scanner.ScanLibrary(t.Context(), lib.ID) + if err != nil { + t.Fatal(err) + } + if res.LocalMetadata != 1 { + t.Fatalf("LocalMetadata = %d, want 1", res.LocalMetadata) + } + var media model.Media + if err := db.First(&media, "path = ?", mediaPath).Error; err != nil { + t.Fatal(err) + } + if media.PosterURL != poster { + t.Fatalf("poster_url = %q, want %q", media.PosterURL, poster) + } + if media.ScrapeStatus == "matched" { + t.Fatalf("artwork-only media should remain enrichable, got status %q", media.ScrapeStatus) + } +} + func TestScanLibraryParsesEpisodesForMovieTypedLibrary(t *testing.T) { root := t.TempDir() seasonDir := filepath.Join(root, "哈哈哈哈哈 (2020)", "Season 06") diff --git a/internal/service/scraper.go b/internal/service/scraper.go index 2b047d2..aaca805 100644 --- a/internal/service/scraper.go +++ b/internal/service/scraper.go @@ -261,9 +261,6 @@ func mergeLocalMetadataIntoMatch(match *Match, local *LocalMetadata) { if local.TMDbID > 0 { match.TMDbID = local.TMDbID } - if local.BangumiID > 0 { - match.BangumiID = local.BangumiID - } if local.Genres != "" { match.Genres = splitNFOList(local.Genres) }