added parsing of rss
This commit is contained in:
parent
9749f9eb49
commit
2ca59a846b
4 changed files with 98 additions and 10 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -1 +1 @@
|
||||||
datafile
|
podcasts.toml
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
Name = "Hello Internet"
|
|
||||||
URL = "http://www.hellointernet.fm/podcast?format=rss"
|
|
||||||
Dir = "/home/psw/podcasts/HelloInternet"
|
|
|
@ -1,10 +1,69 @@
|
||||||
package podcatch
|
package podcatch
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
// "podcatch/structs"s
|
. "podcatch/structs"
|
||||||
// "github.com/pelletier/go-toml"
|
"github.com/pelletier/go-toml"
|
||||||
|
"encoding/xml"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"regexp"
|
||||||
|
"log"
|
||||||
)
|
)
|
||||||
var Version string = "0.1"
|
var Version string = "0.1"
|
||||||
|
var Podcasts map[string]Podcast = make(map[string]Podcast)
|
||||||
func Start(){
|
func Start(){
|
||||||
fmt.Printf("Starting PodCatch Version : %s...\r\n", Version )
|
fmt.Printf("Starting PodCatch Version : %s...\r\n", Version )
|
||||||
|
getPodcasts()
|
||||||
|
}
|
||||||
|
func getPodcasts(){
|
||||||
|
if len(Podcasts) == 0 {
|
||||||
|
getPodcastFiles()
|
||||||
|
}
|
||||||
|
for shortname,podcast := range Podcasts {
|
||||||
|
fmt.Println(shortname)
|
||||||
|
fmt.Printf("Checking RSS for %s...\r\n", podcast.Name)
|
||||||
|
podcast.RSS = getRSS(podcast)
|
||||||
|
downloadCasts(podcast)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func getPodcastFiles() {
|
||||||
|
content, err := ioutil.ReadFile("podcasts.toml")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
e := toml.Unmarshal(content,&Podcasts)
|
||||||
|
if e != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
fmt.Printf("Found %d podcasts.\r\n",len(Podcasts))
|
||||||
|
}
|
||||||
|
func getRSS(podcast Podcast) Rss {
|
||||||
|
resp, err := http.Get(podcast.URL)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
html, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
return parseRSS(podcast,html)
|
||||||
|
}
|
||||||
|
func parseRSS(podcast Podcast, rssxml []byte) Rss {
|
||||||
|
var rss Rss
|
||||||
|
e := xml.Unmarshal(rssxml,&rss)
|
||||||
|
if e != nil {
|
||||||
|
log.Fatal(e)
|
||||||
|
}
|
||||||
|
return rss
|
||||||
|
}
|
||||||
|
func downloadCasts(podcast Podcast) {
|
||||||
|
fmt.Println(podcast.RSS.Version)
|
||||||
|
for _,item := range podcast.RSS.Channel.Items {
|
||||||
|
fmt.Printf("Downloading '%s' from : %s.\r\n", item.Title, item.Media.URL)
|
||||||
|
re := regexp.MustCompile(`[^0-9a-zA-Z-_]+`)
|
||||||
|
filename := re.ReplaceAllString(item.Title,"_") + ".mp3"
|
||||||
|
fmt.Println(filename)
|
||||||
|
// fmt.Printf("%s - %s - %s\r\n", item.Title, item.Media.URL, item.Media.Type)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,39 @@
|
||||||
package structs
|
package structs
|
||||||
|
import (
|
||||||
|
"encoding/xml"
|
||||||
|
)
|
||||||
type Podcast struct {
|
type Podcast struct {
|
||||||
Name string
|
|
||||||
URL string
|
URL string
|
||||||
Dir string
|
Name string
|
||||||
|
Directory string
|
||||||
|
RSS Rss
|
||||||
|
}
|
||||||
|
type Rss struct {
|
||||||
|
XMLName xml.Name `xml:"rss"`
|
||||||
|
Version string `xml:"version,attr"`
|
||||||
|
Channel Channel `xml:"channel"`
|
||||||
|
Description string `xml:"description"`
|
||||||
|
Title string `xml:"title"`
|
||||||
|
Link string `xml:"link"`
|
||||||
|
}
|
||||||
|
type Channel struct {
|
||||||
|
XMLName xml.Name `xml:"channel"`
|
||||||
|
Title string `xml:"title"`
|
||||||
|
Link string `xml:"link"`
|
||||||
|
Description string `xml:"description"`
|
||||||
|
Items []Item `xml:"item"`
|
||||||
|
}
|
||||||
|
type Item struct {
|
||||||
|
XMLName xml.Name `xml:"item"`
|
||||||
|
Title string `xml:"title"`
|
||||||
|
Link string `xml:"link"`
|
||||||
|
Description string `xml:"description"`
|
||||||
|
PubDate string `xml:"pubdate"`
|
||||||
|
Guid string `xml:"guid"`
|
||||||
|
Media Media `xml:"enclosure"`
|
||||||
|
}
|
||||||
|
type Media struct {
|
||||||
|
XMLName xml.Name `xml:"enclosure"`
|
||||||
|
URL string `xml:"url,attr"`
|
||||||
|
Type string `xml:"type,attr"`
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue