Files
silo-server/internal/subtitles/releaseinfo.go
T

53 lines
1.5 KiB
Go

// internal/subtitles/releaseinfo.go
package subtitles
import (
"path/filepath"
"regexp"
"strings"
)
// ReleaseInfo contains metadata parsed from a media filename.
type ReleaseInfo struct {
ReleaseGroup string
Source string // BluRay, WEB-DL, WEBRip, HDTV, etc.
Resolution string // 720p, 1080p, 2160p
VideoCodec string // x264, x265, H.264, H.265, HEVC
AudioCodec string // AAC, DTS, DDP5.1, etc.
}
var (
groupRe = regexp.MustCompile(`-([A-Za-z0-9]+)(?:\.[a-z]{2,4})?$`)
sourceRe = regexp.MustCompile(`(?i)\b(BluRay|BDRip|WEB-DL|WEBRip|HDTV|DVDRip|BRRip|REMUX)\b`)
resolutionRe = regexp.MustCompile(`\b(720|1080|2160|4320)p\b`)
videoCodecRe = regexp.MustCompile(`(?i)\b(x264|x265|H\.?264|H\.?265|HEVC|AVC|VP9|AV1)\b`)
audioCodecRe = regexp.MustCompile(`(?i)\b(AAC|AC3|DTS(?:-HD)?|DDP?\d?\.?\d?|FLAC|TrueHD|Atmos)\b`)
)
// ParseReleaseInfo extracts release metadata from a media filename or path.
func ParseReleaseInfo(filePathOrName string) ReleaseInfo {
name := filepath.Base(filePathOrName)
ext := filepath.Ext(name)
nameNoExt := strings.TrimSuffix(name, ext)
var info ReleaseInfo
if m := groupRe.FindStringSubmatch(nameNoExt); len(m) > 1 {
info.ReleaseGroup = m[1]
}
if m := sourceRe.FindString(nameNoExt); m != "" {
info.Source = m
}
if m := resolutionRe.FindString(nameNoExt); m != "" {
info.Resolution = m
}
if m := videoCodecRe.FindString(nameNoExt); m != "" {
info.VideoCodec = m
}
if m := audioCodecRe.FindString(nameNoExt); m != "" {
info.AudioCodec = m
}
return info
}