78 lines
2.2 KiB
Go
78 lines
2.2 KiB
Go
package naming
|
|
|
|
import (
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
// folderIDPattern matches patterns like [tmdbid-27205], {tmdb-27205},
|
|
// [imdbid-tt1375666], {imdb-tt1375666}, [tvdbid-81189], {tvdb-81189}, etc.
|
|
// The regex captures the provider prefix and the ID value.
|
|
var folderIDPattern = regexp.MustCompile(`[{\[](tmdb|tmdbid|imdb|imdbid|tvdb|tvdbid)-([\w]+)[}\]]`)
|
|
var trailingImdbIDPattern = regexp.MustCompile(`(?i)(?:^|\s)(tt\d{7,8})$`)
|
|
var trailingNumericIDPattern = regexp.MustCompile(`(?:^|\s)(\d+)$`)
|
|
|
|
// ParseStructuredFolderIDs extracts only explicit structured provider IDs from
|
|
// a folder or file name, such as {tmdb-27205} or [imdbid-tt1375666}. It does
|
|
// not consider trailing bare IDs or folderType-based heuristics.
|
|
func ParseStructuredFolderIDs(name string) *FolderIDHints {
|
|
matches := folderIDPattern.FindAllStringSubmatch(name, -1)
|
|
if len(matches) == 0 {
|
|
return nil
|
|
}
|
|
|
|
hints := &FolderIDHints{}
|
|
for _, m := range matches {
|
|
provider := strings.ToLower(m[1])
|
|
id := m[2]
|
|
|
|
switch provider {
|
|
case "tmdb", "tmdbid":
|
|
hints.TmdbID = id
|
|
case "imdb", "imdbid":
|
|
hints.ImdbID = id
|
|
case "tvdb", "tvdbid":
|
|
hints.TvdbID = id
|
|
}
|
|
}
|
|
|
|
if hints.TmdbID == "" && hints.ImdbID == "" && hints.TvdbID == "" {
|
|
return nil
|
|
}
|
|
return hints
|
|
}
|
|
|
|
// ParseFolderIDs extracts external provider IDs from a folder name.
|
|
// It supports bracket styles [] and {} with provider prefixes tmdb/tmdbid,
|
|
// imdb/imdbid, tvdb/tvdbid, plus bare trailing IDs. Bare numeric IDs are
|
|
// interpreted using folderType: series -> TVDB, everything else -> TMDB.
|
|
func ParseFolderIDs(folderName string, folderType string) *FolderIDHints {
|
|
if hints := ParseStructuredFolderIDs(folderName); hints != nil {
|
|
return hints
|
|
}
|
|
|
|
trimmed := strings.TrimSpace(folderName)
|
|
if m := trailingImdbIDPattern.FindStringSubmatch(trimmed); m != nil {
|
|
return &FolderIDHints{ImdbID: strings.ToLower(m[1])}
|
|
}
|
|
|
|
m := trailingNumericIDPattern.FindStringSubmatch(trimmed)
|
|
if m == nil {
|
|
return nil
|
|
}
|
|
|
|
id := m[1]
|
|
if looksLikeYear(id) {
|
|
return nil
|
|
}
|
|
|
|
if strings.EqualFold(strings.TrimSpace(folderType), "series") {
|
|
return &FolderIDHints{TvdbID: id}
|
|
}
|
|
return &FolderIDHints{TmdbID: id}
|
|
}
|
|
|
|
func looksLikeYear(value string) bool {
|
|
return len(value) == 4 && value >= "1800" && value <= "2100"
|
|
}
|