328 lines
9.0 KiB
Go
328 lines
9.0 KiB
Go
package autodownloader
|
|
|
|
import (
|
|
"github.com/5rahim/habari"
|
|
"github.com/samber/lo"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"seanime/internal/api/anilist"
|
|
"seanime/internal/api/metadata"
|
|
"seanime/internal/database/models"
|
|
"seanime/internal/library/anime"
|
|
"testing"
|
|
)
|
|
|
|
func TestComparison(t *testing.T) {
|
|
ad := AutoDownloader{
|
|
metadataProvider: metadata.GetMockProvider(t),
|
|
settings: &models.AutoDownloaderSettings{
|
|
EnableSeasonCheck: true,
|
|
},
|
|
}
|
|
name1 := "[Oshi no Ko] 2nd Season"
|
|
name2 := "Oshi no Ko Season 2"
|
|
aniListEntry := &anilist.AnimeListEntry{
|
|
Media: &anilist.BaseAnime{
|
|
ID: 166531,
|
|
Title: &anilist.BaseAnime_Title{
|
|
Romaji: &name1,
|
|
English: &name2,
|
|
},
|
|
Episodes: lo.ToPtr(13),
|
|
Format: lo.ToPtr(anilist.MediaFormatTv),
|
|
},
|
|
}
|
|
|
|
rule := &anime.AutoDownloaderRule{
|
|
MediaId: 166531,
|
|
ReleaseGroups: []string{"SubsPlease", "Erai-raws"},
|
|
Resolutions: []string{"1080p"},
|
|
TitleComparisonType: "likely",
|
|
EpisodeType: "recent",
|
|
EpisodeNumbers: []int{3}, // ignored
|
|
Destination: "/data/seanime/library/[Oshi no Ko] 2nd Season",
|
|
ComparisonTitle: "[Oshi no Ko] 2nd Season",
|
|
}
|
|
|
|
tests := []struct {
|
|
torrentName string
|
|
succeedTitleComparison bool
|
|
succeedSeasonAndEpisodeMatch bool
|
|
enableSeasonCheck bool
|
|
}{
|
|
{
|
|
torrentName: "[Erai-raws] Oshi no Ko 2nd Season - 03 [720p][Multiple Subtitle] [ENG][FRE]",
|
|
succeedTitleComparison: true,
|
|
succeedSeasonAndEpisodeMatch: true,
|
|
enableSeasonCheck: true,
|
|
},
|
|
{
|
|
torrentName: "[SubsPlease] Oshi no Ko - 16 (1080p)",
|
|
succeedTitleComparison: true,
|
|
succeedSeasonAndEpisodeMatch: true,
|
|
enableSeasonCheck: true,
|
|
},
|
|
{
|
|
torrentName: "[Erai-raws] Oshi no Ko 3rd Season - 03 [720p][Multiple Subtitle] [ENG][FRE]",
|
|
succeedTitleComparison: true,
|
|
succeedSeasonAndEpisodeMatch: false,
|
|
enableSeasonCheck: true,
|
|
},
|
|
{
|
|
torrentName: "[Erai-raws] Oshi no Ko 2nd Season - 03 [720p][Multiple Subtitle] [ENG][FRE]",
|
|
succeedTitleComparison: true,
|
|
succeedSeasonAndEpisodeMatch: true,
|
|
enableSeasonCheck: false,
|
|
},
|
|
{
|
|
torrentName: "[SubsPlease] Oshi no Ko - 16 (1080p)",
|
|
succeedTitleComparison: true,
|
|
succeedSeasonAndEpisodeMatch: true,
|
|
enableSeasonCheck: false,
|
|
},
|
|
{
|
|
torrentName: "[Erai-raws] Oshi no Ko 3rd Season - 03 [720p][Multiple Subtitle] [ENG][FRE]",
|
|
succeedTitleComparison: true,
|
|
succeedSeasonAndEpisodeMatch: true,
|
|
enableSeasonCheck: false,
|
|
},
|
|
}
|
|
|
|
lfw := anime.NewLocalFileWrapper([]*anime.LocalFile{
|
|
{
|
|
Path: "/data/seanime/library/[Oshi no Ko] 2nd Season/[SubsPlease] Oshi no Ko - 12 (1080p).mkv",
|
|
Name: "Oshi no Ko - 12 (1080p).mkv",
|
|
ParsedData: &anime.LocalFileParsedData{
|
|
Original: "Oshi no Ko - 12 (1080p).mkv",
|
|
Title: "Oshi no Ko",
|
|
ReleaseGroup: "SubsPlease",
|
|
},
|
|
ParsedFolderData: []*anime.LocalFileParsedData{
|
|
{
|
|
Original: "[Oshi no Ko] 2nd Season",
|
|
Title: "[Oshi no Ko]",
|
|
},
|
|
},
|
|
Metadata: &anime.LocalFileMetadata{
|
|
Episode: 1,
|
|
AniDBEpisode: "1",
|
|
Type: "main",
|
|
},
|
|
MediaId: 166531,
|
|
},
|
|
})
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.torrentName, func(t *testing.T) {
|
|
|
|
ad.settings.EnableSeasonCheck = tt.enableSeasonCheck
|
|
|
|
p := habari.Parse(tt.torrentName)
|
|
if tt.succeedTitleComparison {
|
|
require.True(t, ad.isTitleMatch(p, tt.torrentName, rule, aniListEntry))
|
|
} else {
|
|
require.False(t, ad.isTitleMatch(p, tt.torrentName, rule, aniListEntry))
|
|
}
|
|
lfwe, ok := lfw.GetLocalEntryById(166531)
|
|
require.True(t, ok)
|
|
_, ok = ad.isSeasonAndEpisodeMatch(p, rule, aniListEntry, lfwe, []*models.AutoDownloaderItem{})
|
|
if tt.succeedSeasonAndEpisodeMatch {
|
|
require.True(t, ok)
|
|
} else {
|
|
require.False(t, ok)
|
|
}
|
|
})
|
|
}
|
|
|
|
}
|
|
|
|
func TestComparison2(t *testing.T) {
|
|
ad := AutoDownloader{
|
|
metadataProvider: metadata.GetMockProvider(t),
|
|
settings: &models.AutoDownloaderSettings{
|
|
EnableSeasonCheck: true,
|
|
},
|
|
}
|
|
name1 := "DANDADAN"
|
|
name2 := "Dandadan"
|
|
aniListEntry := &anilist.AnimeListEntry{
|
|
Media: &anilist.BaseAnime{
|
|
Title: &anilist.BaseAnime_Title{
|
|
Romaji: &name1,
|
|
English: &name2,
|
|
},
|
|
Episodes: lo.ToPtr(12),
|
|
Status: lo.ToPtr(anilist.MediaStatusFinished),
|
|
Format: lo.ToPtr(anilist.MediaFormatTv),
|
|
},
|
|
}
|
|
|
|
rule := &anime.AutoDownloaderRule{
|
|
MediaId: 166531,
|
|
ReleaseGroups: []string{},
|
|
Resolutions: []string{"1080p"},
|
|
TitleComparisonType: "likely",
|
|
EpisodeType: "recent",
|
|
EpisodeNumbers: []int{},
|
|
Destination: "/data/seanime/library/Dandadan",
|
|
ComparisonTitle: "Dandadan",
|
|
}
|
|
|
|
tests := []struct {
|
|
torrentName string
|
|
succeedAdditionalTermsMatch bool
|
|
ruleAdditionalTerms []string
|
|
}{
|
|
{
|
|
torrentName: "[Anime Time] Dandadan - 04 [Dual Audio][1080p][HEVC 10bit x265][AAC][Multi Sub] [Weekly]",
|
|
ruleAdditionalTerms: []string{},
|
|
succeedAdditionalTermsMatch: true,
|
|
},
|
|
{
|
|
torrentName: "[Anime Time] Dandadan - 04 [Dual Audio][1080p][HEVC 10bit x265][AAC][Multi Sub] [Weekly]",
|
|
ruleAdditionalTerms: []string{
|
|
"H265,H.265, H 265,x265",
|
|
"10bit,10-bit,10 bit",
|
|
},
|
|
succeedAdditionalTermsMatch: true,
|
|
},
|
|
{
|
|
torrentName: "[Raze] Dandadan - 04 x265 10bit 1080p 143.8561fps.mkv",
|
|
ruleAdditionalTerms: []string{
|
|
"H265,H.265, H 265,x265",
|
|
"10bit,10-bit,10 bit",
|
|
},
|
|
succeedAdditionalTermsMatch: true,
|
|
},
|
|
//{ // DEVNOTE: Doesn't pass because of title
|
|
// torrentName: "[Sokudo] DAN DA DAN | Dandadan - S01E03 [1080p EAC-3 AV1][Dual Audio] (weekly)",
|
|
// ruleAdditionalTerms: []string{
|
|
// "H265,H.265, H 265,x265",
|
|
// "10bit,10-bit,10 bit",
|
|
// },
|
|
// succeedAdditionalTermsMatch: false,
|
|
//},
|
|
{
|
|
torrentName: "[Raze] Dandadan - 04 x265 10bit 1080p 143.8561fps.mkv",
|
|
ruleAdditionalTerms: []string{
|
|
"H265,H.265, H 265,x265",
|
|
"10bit,10-bit,10 bit",
|
|
"AAC",
|
|
},
|
|
succeedAdditionalTermsMatch: false,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.torrentName, func(t *testing.T) {
|
|
|
|
rule.AdditionalTerms = tt.ruleAdditionalTerms
|
|
|
|
ok := ad.isTitleMatch(habari.Parse(tt.torrentName), tt.torrentName, rule, aniListEntry)
|
|
assert.True(t, ok)
|
|
|
|
ok = ad.isAdditionalTermsMatch(tt.torrentName, rule)
|
|
if tt.succeedAdditionalTermsMatch {
|
|
assert.True(t, ok)
|
|
} else {
|
|
assert.False(t, ok)
|
|
}
|
|
})
|
|
}
|
|
|
|
}
|
|
|
|
func TestComparison3(t *testing.T) {
|
|
ad := AutoDownloader{
|
|
metadataProvider: metadata.GetMockProvider(t),
|
|
settings: &models.AutoDownloaderSettings{
|
|
EnableSeasonCheck: true,
|
|
},
|
|
}
|
|
name1 := "Dandadan"
|
|
name2 := "DAN DA DAN"
|
|
aniListEntry := &anilist.AnimeListEntry{
|
|
Media: &anilist.BaseAnime{
|
|
Title: &anilist.BaseAnime_Title{
|
|
Romaji: &name1,
|
|
English: &name2,
|
|
},
|
|
Status: lo.ToPtr(anilist.MediaStatusFinished),
|
|
Episodes: lo.ToPtr(12),
|
|
Format: lo.ToPtr(anilist.MediaFormatTv),
|
|
},
|
|
}
|
|
|
|
rule := &anime.AutoDownloaderRule{
|
|
MediaId: 166531,
|
|
ReleaseGroups: []string{},
|
|
Resolutions: []string{},
|
|
TitleComparisonType: "likely",
|
|
EpisodeType: "recent",
|
|
EpisodeNumbers: []int{},
|
|
Destination: "/data/seanime/library/Dandadan",
|
|
ComparisonTitle: "Dandadan",
|
|
}
|
|
|
|
tests := []struct {
|
|
torrentName string
|
|
succeedTitleComparison bool
|
|
succeedSeasonAndEpisodeMatch bool
|
|
enableSeasonCheck bool
|
|
}{
|
|
{
|
|
torrentName: "[Salieri] Zom 100 Bucket List of the Dead - S1 - BD (1080p) (HDR) [Dual Audio]",
|
|
succeedTitleComparison: false,
|
|
succeedSeasonAndEpisodeMatch: false,
|
|
enableSeasonCheck: false,
|
|
},
|
|
}
|
|
|
|
lfw := anime.NewLocalFileWrapper([]*anime.LocalFile{
|
|
{
|
|
Path: "/data/seanime/library/Dandadan/[SubsPlease] Dandadan - 01 (1080p).mkv",
|
|
Name: "Dandadan - 01 (1080p).mkv",
|
|
ParsedData: &anime.LocalFileParsedData{
|
|
Original: "Dandadan - 01 (1080p).mkv",
|
|
Title: "Dandadan",
|
|
ReleaseGroup: "SubsPlease",
|
|
},
|
|
ParsedFolderData: []*anime.LocalFileParsedData{
|
|
{
|
|
Original: "Dandadan",
|
|
Title: "Dandadan",
|
|
},
|
|
},
|
|
Metadata: &anime.LocalFileMetadata{
|
|
Episode: 1,
|
|
AniDBEpisode: "1",
|
|
Type: "main",
|
|
},
|
|
MediaId: 171018,
|
|
},
|
|
})
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.torrentName, func(t *testing.T) {
|
|
|
|
ad.settings.EnableSeasonCheck = tt.enableSeasonCheck
|
|
|
|
p := habari.Parse(tt.torrentName)
|
|
if tt.succeedTitleComparison {
|
|
require.True(t, ad.isTitleMatch(p, tt.torrentName, rule, aniListEntry))
|
|
} else {
|
|
require.False(t, ad.isTitleMatch(p, tt.torrentName, rule, aniListEntry))
|
|
}
|
|
lfwe, ok := lfw.GetLocalEntryById(171018)
|
|
require.True(t, ok)
|
|
_, ok = ad.isSeasonAndEpisodeMatch(p, rule, aniListEntry, lfwe, []*models.AutoDownloaderItem{})
|
|
if tt.succeedSeasonAndEpisodeMatch {
|
|
assert.True(t, ok)
|
|
} else {
|
|
assert.False(t, ok)
|
|
}
|
|
})
|
|
}
|
|
|
|
}
|