diff options
author | Evgeny Kuznetsov <evgeny@kuznetsov.md> | 2019-06-16 22:05:51 +0300 |
---|---|---|
committer | Evgeny Kuznetsov <evgeny@kuznetsov.md> | 2019-06-16 22:05:51 +0300 |
commit | ed5917b93523bd6535f0e82809d209c7768b2cce (patch) | |
tree | 6bf3ded08147e8bb3a975f363ba4444f0ff6cfb9 /main.go | |
download | radiorus-rss-ed5917b93523bd6535f0e82809d209c7768b2cce.tar.gz radiorus-rss-ed5917b93523bd6535f0e82809d209c7768b2cce.zip |
initial commit
It works! Can already be used!
Diffstat (limited to 'main.go')
-rw-r--r-- | main.go | 100 |
1 files changed, 100 insertions, 0 deletions
@@ -0,0 +1,100 @@ +package main + +import ( + "flag" + "github.com/gorilla/feeds" + "io/ioutil" + "log" + "net/http" + "regexp" + "strconv" + "time" +) + +type subst struct { + from string + to string +} + +var ( + substitutes = []subst{ + {from: `"`, to: `"`}, + {from: `–`, to: `–`}, + } + + programNameRe = regexp.MustCompile(`<h2>(.+?)?</h2>`) + episodeRe = regexp.MustCompile(`(?s)<div class="brand__list\-\-wrap\-\-item">(.+?)?<div class="add\-to\-list">`) + episodeAudioRe = regexp.MustCompile(`data\-id="(.+?)?">`) + episodeDateRe = regexp.MustCompile(`brand\-time brand\-menu\-link">(.+?)?\.(.+?)?\.(.+?)? в (.+?)?:(.+?)?</a>`) + episodeTitleRe = regexp.MustCompile(`title brand\-menu\-link">(.+?)?</a>`) + episodeUrlRe = regexp.MustCompile(`<a href="/brand/(.+?)?" class="title`) + + feed = &feeds.Feed{ + Created: time.Now(), + } + outputPath, programNumber string +) + +func main() { + flag.StringVar(&outputPath, "path", "./", "path to put resulting RSS file in") + flag.StringVar(&programNumber, "brand", "57083", "brand number (defaults to Aerostat)") + flag.Parse() + + programUrl := "http://www.radiorus.ru/brand/" + programNumber + "/episodes" + res, err := http.Get(programUrl) + if err != nil { + log.Fatal(err) + } + defer res.Body.Close() + programPage, err := ioutil.ReadAll(res.Body) + if err != nil { + log.Fatal(err) + } + + for _, sub := range substitutes { + re := regexp.MustCompile(sub.from) + programPage = re.ReplaceAll(programPage, []byte(sub.to)) + } + + feed.Title = string(programNameRe.FindSubmatch(programPage)[1]) + feed.Link = &feeds.Link{Href: programUrl} + episodes := episodeRe.FindAll(programPage, -1) + + for _, episode := range episodes { + episodeUrl := "http://www.radiorus.ru/brand/" + string(episodeUrlRe.FindSubmatch(episode)[1]) + episodeTitle := string(episodeTitleRe.FindSubmatch(episode)[1]) + episodeAudioUrl := "https://audio.vgtrk.com/download?id=" + string(episodeAudioRe.FindSubmatch(episode)[1]) + dateBytes := episodeDateRe.FindSubmatch(episode) + var date [5]int + for i, b := range dateBytes[1:] { + date[i], err = strconv.Atoi(string(b)) + if err != nil { + log.Fatal(err) + } + } + 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) + + feed.Add(&feeds.Item{ + Id: episodeUrl, + Link: &feeds.Link{Href: episodeUrl}, + Title: episodeTitle, + Enclosure: &feeds.Enclosure{ + Url: episodeAudioUrl, + Length: "1024", + Type: "audio/mpeg", + }, + Created: episodeDate, + }) + } + + rss, err := feed.ToRss() + if err != nil { + log.Fatal(err) + } + outputFile := outputPath + "radiorus-" + programNumber + ".rss" + output := []byte(rss) + if err := ioutil.WriteFile(outputFile, output, 0644); err != nil { + log.Fatal(err) + } +} |