- Update ports for Alloy, Grafana, Loki, Prometheus, Promtail, Tempo, and Uptime Kuma to new ranges - Add Arrtrix content management commands and subscriptions - Implement Radarr and Sonarr client logic for movie and series management - Add matrix commands for download and subscription management - Add subscription repository with database schema and logic - Update Arrtrix config and example config for content section - Update help text and command processor to include new commands - Update vendor hash for Arrtrix package
76 lines
1.9 KiB
Go
76 lines
1.9 KiB
Go
package arr
|
|
|
|
import (
|
|
"fmt"
|
|
"slices"
|
|
"strings"
|
|
)
|
|
|
|
type ContentType string
|
|
|
|
const (
|
|
ContentTypeMovies ContentType = "movies"
|
|
ContentTypeSeries ContentType = "series"
|
|
)
|
|
|
|
var supportedContentTypes = []ContentType{
|
|
ContentTypeMovies,
|
|
ContentTypeSeries,
|
|
}
|
|
|
|
var supportedEvents = map[ContentType][]string{
|
|
ContentTypeMovies: {"Test", "Grab", "Download", "Rename", "MovieFileDelete", "MovieDelete"},
|
|
ContentTypeSeries: {"Test", "Grab", "Download", "Rename", "EpisodeFileDelete", "SeriesDelete"},
|
|
}
|
|
|
|
func SupportedContentTypes() []ContentType {
|
|
return append([]ContentType(nil), supportedContentTypes...)
|
|
}
|
|
|
|
func SupportedEventTypes(contentType ContentType) []string {
|
|
return append([]string(nil), supportedEvents[contentType]...)
|
|
}
|
|
|
|
func ParseContentType(value string) (ContentType, error) {
|
|
contentType := ContentType(strings.ToLower(strings.TrimSpace(value)))
|
|
if slices.Contains(supportedContentTypes, contentType) {
|
|
return contentType, nil
|
|
}
|
|
return "", fmt.Errorf("unsupported content type %q (expected one of: %s)", value, Strings())
|
|
}
|
|
|
|
func ParseEventType(contentType ContentType, value string) (string, error) {
|
|
value = strings.TrimSpace(value)
|
|
if strings.EqualFold(value, "all") {
|
|
return "all", nil
|
|
}
|
|
for _, eventType := range supportedEvents[contentType] {
|
|
if strings.EqualFold(eventType, value) {
|
|
return eventType, nil
|
|
}
|
|
}
|
|
return "", fmt.Errorf("unsupported event type %q for %s", value, contentType)
|
|
}
|
|
|
|
func SupportsEventType(contentType ContentType, eventType string) bool {
|
|
return slices.Contains(supportedEvents[contentType], strings.TrimSpace(eventType))
|
|
}
|
|
|
|
func (c ContentType) Label() string {
|
|
switch c {
|
|
case ContentTypeMovies:
|
|
return "movies"
|
|
case ContentTypeSeries:
|
|
return "series"
|
|
default:
|
|
return string(c)
|
|
}
|
|
}
|
|
|
|
func Strings() string {
|
|
values := make([]string, 0, len(supportedContentTypes))
|
|
for _, contentType := range supportedContentTypes {
|
|
values = append(values, string(contentType))
|
|
}
|
|
return strings.Join(values, ", ")
|
|
}
|