157 lines
4.5 KiB
Go
157 lines
4.5 KiB
Go
package metadata
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestScanEpisodes(t *testing.T) {
|
|
root := t.TempDir()
|
|
seasonDir := filepath.Join(root, "s2024")
|
|
if err := os.MkdirAll(seasonDir, 0o755); err != nil {
|
|
t.Fatalf("mkdir: %v", err)
|
|
}
|
|
|
|
base := filepath.Join(seasonDir, "TestChannel.s2024Se0210S.Sample.abc123")
|
|
infoPath := base + ".info.json"
|
|
videoPath := base + ".mp4"
|
|
thumbPath := base + ".jpg"
|
|
|
|
epJSON := `{"title":"Episode","channel":"Test Channel","id":"abc123","description":"Episode description","upload_date":"20240210","ext":"mp4"}`
|
|
if err := os.WriteFile(infoPath, []byte(epJSON), 0o644); err != nil {
|
|
t.Fatalf("write info: %v", err)
|
|
}
|
|
if err := os.WriteFile(videoPath, []byte("video"), 0o644); err != nil {
|
|
t.Fatalf("write video: %v", err)
|
|
}
|
|
if err := os.WriteFile(thumbPath, []byte("thumb"), 0o644); err != nil {
|
|
t.Fatalf("write thumbnail: %v", err)
|
|
}
|
|
|
|
assets, err := ScanEpisodes(root)
|
|
if err != nil {
|
|
t.Fatalf("ScanEpisodes error: %v", err)
|
|
}
|
|
if len(assets) != 1 {
|
|
t.Fatalf("expected 1 asset, got %d", len(assets))
|
|
}
|
|
|
|
asset := assets[0]
|
|
if asset.MediaPath != videoPath {
|
|
t.Fatalf("unexpected media path: %s", asset.MediaPath)
|
|
}
|
|
if len(asset.Sidecars) != 1 || asset.Sidecars[0] != thumbPath {
|
|
t.Fatalf("unexpected sidecars: %#v", asset.Sidecars)
|
|
}
|
|
}
|
|
|
|
func TestScanShows(t *testing.T) {
|
|
root := t.TempDir()
|
|
showDir := filepath.Join(root, "sNA")
|
|
if err := os.MkdirAll(showDir, 0o755); err != nil {
|
|
t.Fatalf("mkdir: %v", err)
|
|
}
|
|
|
|
base := filepath.Join(showDir, "test-channel")
|
|
infoPath := base + ".info.json"
|
|
posterPath := base + ".jpg"
|
|
|
|
showJSON := `{"channel":"Test Channel","channel_id":"chan123","description":"Show description","thumbnails":[]}`
|
|
if err := os.WriteFile(infoPath, []byte(showJSON), 0o644); err != nil {
|
|
t.Fatalf("write show info: %v", err)
|
|
}
|
|
if err := os.WriteFile(posterPath, []byte("poster"), 0o644); err != nil {
|
|
t.Fatalf("write poster: %v", err)
|
|
}
|
|
|
|
if err := os.WriteFile(filepath.Join(showDir, "other-channel.jpg"), []byte("other"), 0o644); err != nil {
|
|
t.Fatalf("write extra image: %v", err)
|
|
}
|
|
|
|
assets, err := ScanShows(root)
|
|
if err != nil {
|
|
t.Fatalf("ScanShows error: %v", err)
|
|
}
|
|
if len(assets) != 1 {
|
|
t.Fatalf("expected 1 show asset, got %d", len(assets))
|
|
}
|
|
|
|
asset := assets[0]
|
|
if asset.InfoPath != infoPath {
|
|
t.Fatalf("unexpected info path: %s", asset.InfoPath)
|
|
}
|
|
if len(asset.Images) != 1 || asset.Images[0] != posterPath {
|
|
t.Fatalf("unexpected images: %#v", asset.Images)
|
|
}
|
|
}
|
|
|
|
func TestScanShowsFiltersImagesPerChannel(t *testing.T) {
|
|
root := t.TempDir()
|
|
showDir := filepath.Join(root, "sNA")
|
|
if err := os.MkdirAll(showDir, 0o755); err != nil {
|
|
t.Fatalf("mkdir: %v", err)
|
|
}
|
|
|
|
primaryBase := filepath.Join(showDir, "channel-one")
|
|
secondaryBase := filepath.Join(showDir, "channel-two")
|
|
|
|
primaryInfo := primaryBase + ".info.json"
|
|
secondaryInfo := secondaryBase + ".info.json"
|
|
|
|
if err := os.WriteFile(primaryInfo, []byte(`{"channel":"One","channel_id":"one","description":"","thumbnails":[]}`), 0o644); err != nil {
|
|
t.Fatalf("write primary info: %v", err)
|
|
}
|
|
if err := os.WriteFile(secondaryInfo, []byte(`{"channel":"Two","channel_id":"two","description":"","thumbnails":[]}`), 0o644); err != nil {
|
|
t.Fatalf("write secondary info: %v", err)
|
|
}
|
|
|
|
if err := os.WriteFile(primaryBase+".jpg", []byte("one"), 0o644); err != nil {
|
|
t.Fatalf("write primary image: %v", err)
|
|
}
|
|
if err := os.WriteFile(secondaryBase+".jpg", []byte("two"), 0o644); err != nil {
|
|
t.Fatalf("write secondary image: %v", err)
|
|
}
|
|
|
|
assets, err := ScanShows(root)
|
|
if err != nil {
|
|
t.Fatalf("scan shows: %v", err)
|
|
}
|
|
if len(assets) != 2 {
|
|
t.Fatalf("expected 2 show assets, got %d", len(assets))
|
|
}
|
|
|
|
for _, asset := range assets {
|
|
switch asset.Show.Title {
|
|
case "One":
|
|
if len(asset.Images) != 1 || asset.Images[0] != primaryBase+".jpg" {
|
|
t.Fatalf("primary images mismatch: %#v", asset.Images)
|
|
}
|
|
case "Two":
|
|
if len(asset.Images) != 1 || asset.Images[0] != secondaryBase+".jpg" {
|
|
t.Fatalf("secondary images mismatch: %#v", asset.Images)
|
|
}
|
|
default:
|
|
t.Fatalf("unexpected show asset: %s", asset.Show.Title)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestNormalizeEpisodeThumbnail(t *testing.T) {
|
|
got := NormalizeEpisodeThumbnail("file.jpg")
|
|
expected := "file-thumb.jpg"
|
|
if got != expected {
|
|
t.Fatalf("expected %s, got %s", expected, got)
|
|
}
|
|
|
|
got = NormalizeEpisodeThumbnail("file-thumb.jpg")
|
|
if got != "file-thumb.jpg" {
|
|
t.Fatalf("normalization should keep thumb suffix, got %s", got)
|
|
}
|
|
|
|
got = NormalizeEpisodeThumbnail("file.jpeg")
|
|
if got != "file-thumb.jpeg" {
|
|
t.Fatalf("unexpected jpeg normalization: %s", got)
|
|
}
|
|
}
|