diff options
author | Martin Polden <mpolden@mpolden.no> | 2019-02-05 19:44:00 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2019-02-05 19:45:27 +0100 |
commit | f91c65906c46a10db0e7626414cae1145d468ee1 (patch) | |
tree | 899e9f135b0936c9a5344f69dbc32d58e5550fa4 | |
parent | 3c6c206e8d2058bfc4e0a47ec0908e9c800eef38 (diff) |
Handle combined episode and part tags
-rw-r--r-- | parser/parser.go | 89 | ||||
-rw-r--r-- | parser/parser_test.go | 7 | ||||
-rw-r--r-- | queue/queue_test.go | 2 |
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) } |