aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2019-02-05 19:44:00 +0100
committerMartin Polden <mpolden@mpolden.no>2019-02-05 19:45:27 +0100
commitf91c65906c46a10db0e7626414cae1145d468ee1 (patch)
tree899e9f135b0936c9a5344f69dbc32d58e5550fa4
parent3c6c206e8d2058bfc4e0a47ec0908e9c800eef38 (diff)
Handle combined episode and part tags
-rw-r--r--parser/parser.go89
-rw-r--r--parser/parser_test.go7
-rw-r--r--queue/queue_test.go2
3 files changed, 58 insertions, 40 deletions
diff --git a/parser/parser.go b/parser/parser.go
index aa742a2..0367011 100644
--- a/parser/parser.go
+++ b/parser/parser.go
@@ -7,13 +7,13 @@ import (
)
var (
- movieExp = regexp.MustCompile(`(.*?)\.(\d{4})`)
- episodeExp = regexp.MustCompile(`(.*)\.(?:(` +
- `(?:S(\d{2}))(?:E(\d{2}))?` + // S01, S01E04
- `|(?:E(\d{2}))` + // E04
- `|(\d{1,2})x(\d{2})` + // 1x04, 01x04
- `|Part\.?(\d{1,2})` + // Part4, Part11, Part.4, Part.11
- `))`)
+ movieExp = regexp.MustCompile(`(.*?)\.(\d{4})`)
+ episodeExps = [4]*regexp.Regexp{
+ regexp.MustCompile(`^(?P<name>.+)\.S(?P<season>\d{2})(?:E(?P<episode>\d{2}))?`), // S01, S01E04
+ regexp.MustCompile(`^(?P<name>.+)\.E(?P<episode>\d{2})`), // E04
+ regexp.MustCompile(`^(?P<name>.+)\.(?P<season>\d{1,2})x(?P<episode>\d{2})`), // 1x04, 01x04
+ regexp.MustCompile(`^(?P<name>.+)\.Part\.?(?P<episode>\d{1,2})`), // Part4, Part11, Part.4, Part.11
+ }
)
type Parser func(s string) (Media, error)
@@ -63,38 +63,49 @@ func Movie(s string) (Media, error) {
}
func Show(s string) (Media, error) {
- m := episodeExp.FindAllStringSubmatch(s, -1)
- if len(m) == 0 || len(m[0]) < 9 {
- return Media{}, fmt.Errorf("failed to parse: %s", s)
- }
- name := m[0][1]
- season := "1"
- episode := "0"
- if m[0][3] != "" { // S01, S01E04
- season = m[0][3]
- if m[0][4] != "" {
- episode = m[0][4]
+ for _, p := range episodeExps {
+ groupNames := p.SubexpNames()
+ matches := p.FindAllStringSubmatch(s, -1)
+ if len(matches) == 0 {
+ continue
+ }
+ match := matches[0]
+ var (
+ name string
+ season = 0
+ episode = 0
+ err error
+ )
+ for i, group := range match {
+ if group == "" {
+ continue
+ }
+ switch groupNames[i] {
+ case "name":
+ name = group
+ case "season":
+ season, err = strconv.Atoi(group)
+ if err != nil {
+ return Media{}, fmt.Errorf("invalid input: %q: %s", s, err)
+ }
+ case "episode":
+ episode, err = strconv.Atoi(group)
+ if err != nil {
+ return Media{}, fmt.Errorf("invalid input: %q: %s", s, err)
+ }
+ }
+ }
+ if season == 0 {
+ season = 1
+ }
+ if season > 0 || episode > 0 {
+ return Media{
+ Release: s,
+ Name: name,
+ Season: season,
+ Episode: episode,
+ }, nil
}
- } else if m[0][5] != "" { // E04
- episode = m[0][5]
- } else if m[0][6] != "" && m[0][7] != "" { // 1x04, 01x04
- season = m[0][6]
- episode = m[0][7]
- } else if m[0][8] != "" { // Part4, Part11, Part.4, Part.11
- episode = m[0][8]
- }
- ss, err := strconv.Atoi(season)
- if err != nil {
- return Media{}, err
- }
- ep, err := strconv.Atoi(episode)
- if err != nil {
- return Media{}, err
}
- return Media{
- Release: s,
- Name: name,
- Season: ss,
- Episode: ep,
- }, nil
+ return Media{}, fmt.Errorf("invalid input: %q", s)
}
diff --git a/parser/parser_test.go b/parser/parser_test.go
index 7faef84..33c9d2c 100644
--- a/parser/parser_test.go
+++ b/parser/parser_test.go
@@ -139,6 +139,13 @@ func TestShow(t *testing.T) {
Season: 2,
Episode: 0,
}},
+ {"Lost.S01E24.Exodus.Part.2.720p.BluRay.x264-SiNNERS",
+ Media{
+ Release: "Lost.S01E24.Exodus.Part.2.720p.BluRay.x264-SiNNERS",
+ Name: "Lost",
+ Season: 1,
+ Episode: 24,
+ }},
}
for _, tt := range tests {
got, err := Show(tt.in)
diff --git a/queue/queue_test.go b/queue/queue_test.go
index ba0df5b..1e187ad 100644
--- a/queue/queue_test.go
+++ b/queue/queue_test.go
@@ -150,7 +150,7 @@ func TestNewQueueRejectsUnparsableItem(t *testing.T) {
if got := q.Items[0].Transfer; got {
t.Errorf("Expected false, got %t", got)
}
- want := "failed to parse: bar"
+ want := `invalid input: "bar"`
if got := q.Items[0].Reason; got != want {
t.Errorf("Expected %q, got %q", want, got)
}