diff options
author | Evgeny Kuznetsov <evgeny@kuznetsov.md> | 2020-02-05 09:28:20 +0300 |
---|---|---|
committer | Evgeny Kuznetsov <evgeny@kuznetsov.md> | 2020-02-05 09:28:20 +0300 |
commit | 85caee2d9cad1f022e7101b1a04016f92fda64d1 (patch) | |
tree | 5f396c2094481f1a806ad219669ebf75ff6af6a8 | |
parent | ec0baaa14313e84af97ea1783559e5ccdc293c8e (diff) | |
download | radiorus-rss-85caee2d9cad1f022e7101b1a04016f92fda64d1.tar.gz radiorus-rss-85caee2d9cad1f022e7101b1a04016f92fda64d1.zip |
more testing
-rw-r--r-- | main.go | 39 | ||||
-rw-r--r-- | main_test.go | 22 |
2 files changed, 48 insertions, 13 deletions
@@ -44,7 +44,6 @@ var ( programNameRe = regexp.MustCompile(`<h2>(.+?)?</h2>`) programAboutRe = regexp.MustCompile(`(?s)<div class="brand__content_text__anons">(.+?)?</div>`) programImageRe = regexp.MustCompile(`(?s)<div class="brand\-promo__header">(.+?)?<img src="(.+?)?"(.+?)?alt='(.+?)?'>`) - episodeDateRe = regexp.MustCompile(`brand\-time brand\-menu\-link">(.+?)?\.(.+?)?\.(.+?)? в (.+?)?:(.+?)?</a>`) episodeDescRe = regexp.MustCompile(`<p class="anons">(.+?)?</p>`) episodeTitleRe = regexp.MustCompile(`title brand\-menu\-link">(.+?)?</a>`) episodeUrlRe = regexp.MustCompile(`<a href="/brand/(.+?)?" class="title`) @@ -53,6 +52,8 @@ var ( errBadEpisode = fmt.Errorf("bad episode") errCantParse = fmt.Errorf("could not parse page") + + moscow = time.FixedZone("Moscow Time", int((3 * time.Hour).Seconds())) ) func main() { @@ -135,29 +136,41 @@ func populateFeed(feed *feeds.Feed, page []byte) (err error) { episodeUrl := urlPrefix + string(episodeUrlRe.FindSubmatch(episode)[1]) episodeTitle := string(episodeTitleRe.FindSubmatch(episode)[1]) enclosure := findEnclosure(episode) - dateBytes := episodeDateRe.FindSubmatch(episode) - var date [5]int - for i, b := range dateBytes[1:] { - d, err := strconv.Atoi(string(b)) - if err != nil { - log.Fatal(err) - } - date[i] = d - } - moscow := time.FixedZone("Moscow Time", int((3 * time.Hour).Seconds())) - episodeDate := time.Date(date[2], time.Month(date[1]), date[0], date[3], date[4], 0, 0, moscow) + date := findDate(episode) feed.Add(&feeds.Item{ Id: episodeID(episodeUrl), Link: &feeds.Link{Href: episodeUrl}, Title: episodeTitle, Enclosure: enclosure, - Created: episodeDate, + Created: date, }) } return nil } +func findDate(ep []byte) time.Time { + episodeDateRe := regexp.MustCompile(`brand\-time brand\-menu\-link">(.+?)?\.(.+?)?\.(.+?)? в (.+?)?:(.+?)?</a>`) + dateBytes := episodeDateRe.FindSubmatch(ep) + return parseDate(dateBytes) +} + +func parseDate(bytes [][]byte) time.Time { + if len(bytes) < 4 { + return time.Date(1970, time.January, 1, 0, 0, 0, 0, moscow) + } + + var date [5]int + for i, b := range bytes[1:] { + d, err := strconv.Atoi(string(b)) + if err != nil { + return time.Date(1970, time.January, 1, 0, 0, 0, 0, moscow) + } + date[i] = d + } + return time.Date(date[2], time.Month(date[1]), date[0], date[3], date[4], 0, 0, moscow) +} + func findEnclosure(ep []byte) *feeds.Enclosure { re := regexp.MustCompile(`data\-type="audio"\s+data\-id="(.+?)?">`) diff --git a/main_test.go b/main_test.go index d403753..73dc0c8 100644 --- a/main_test.go +++ b/main_test.go @@ -29,6 +29,7 @@ import ( "strings" "sync" "testing" + "time" "github.com/gorilla/feeds" ) @@ -279,3 +280,24 @@ func TestStripLink(t *testing.T) { } } } + +func TestParseDate(t *testing.T) { + type testval struct { + b [][]byte + d time.Time + } + + var tests = []testval{ + {[][]byte{[]byte{}, []byte("24"), []byte("11"), []byte(`2019`), []byte("14"), []byte("10")}, time.Date(2019, time.November, 24, 14, 10, 0, 0, moscow)}, + {[][]byte{[]byte("foo"), []byte("bar"), []byte("baz"), []byte("qux"), []byte("none")}, time.Date(1970, time.January, 1, 0, 0, 0, 0, moscow)}, + {[][]byte{}, time.Date(1970, time.January, 1, 0, 0, 0, 0, moscow)}, + } + + for _, test := range tests { + got := parseDate(test.b) + want := test.d + if !got.Equal(want) { + t.Error("want:", want, "got:", got) + } + } +} |