func (day *timeURL) parseBroadcastsFromJsonData(programm WdrProgramm) (ret []*broadcast, err error) { lang_de := "de" publisher := "Westdeutscher Rundfunk" empty := "" for _, b := range programm.Sendungen { bc := broadcast{ BroadcastURL: r.BroadcastURL{ TimeURL: r.TimeURL{ Source: *day.Source.ResolveReference(r.MustParseURL(b.EpgLink)), Time: time.Unix(b.Start/1000, 0).In(day.Station.TimeZone), Station: day.Station, }, Title: b.HauptTitel, }, Language: &lang_de, Publisher: &publisher, Description: &empty, } { t := time.Unix(b.Ende/1000, 0).In(day.Station.TimeZone) bc.DtEnd = &t } ret = append(ret, &bc) } return }
// Station Factory // // Returns a instance conforming to 'scrape.Scraper' func Station(identifier string) *station { switch identifier { case "b3": s := station(r.Station{Name: "Bayern 3", CloseDown: "00:00", ProgramURL: r.MustParseURL("http://www.br.de/mediathek/audio/bayern3-audio-livestream-100~radioplayer.json"), Identifier: identifier, TimeZone: localLoc}) return &s } return nil }
// Station Factory // // Returns a instance conforming to 'scrape.Scraper' func Station(identifier string) *station { switch identifier { case "b4": s := station(r.Station{Name: "Bayern 4", CloseDown: "06:00", ProgramURL: r.MustParseURL("https://www.br-klassik.de/programm/radio/index.html"), Identifier: identifier, TimeZone: localLoc}) return &s } return nil }
// Station Factory // // Returns a instance conforming to 'scrape.Scraper' func Station(identifier string) *station { switch identifier { case "wdr5": s := station(r.Station{Name: "WDR 5", CloseDown: "00:00", ProgramURL: r.MustParseURL("http://www.wdr.de/programmvorschau/ajax/wdr5/uebersicht/"), Identifier: identifier, TimeZone: localLoc}) return &s } return nil }
// Station Factory func Station(identifier string) *station { tz, _ := time.LoadLocation("Europe/Berlin") switch identifier { case "m945": s := station(r.Station{Name: "M 94.5", CloseDown: "00:00", ProgramURL: r.MustParseURL("http://www.m945.de/programm/"), Identifier: identifier, TimeZone: tz}) return &s } return nil }
// Station Factory func Station(identifier string) *station { tz, _ := time.LoadLocation("Europe/Berlin") switch identifier { case "radiofabrik": s := station(r.Station{Name: "radiofabrik", CloseDown: "00:00", ProgramURL: r.MustParseURL("http://www.radiofabrik.at/programm0/tagesprogramm.html"), Identifier: identifier, TimeZone: tz}) return &s } return nil }
// Station Factory func Station(identifier string) *station { tz, _ := time.LoadLocation("Europe/Berlin") switch identifier { case "dlf": s := station(r.Station{Name: "Deutschlandfunk", CloseDown: "00:00", ProgramURL: r.MustParseURL("http://www.deutschlandfunk.de/programmvorschau.281.de.html"), Identifier: identifier, TimeZone: tz}) return &s case "drk": s := station(r.Station{Name: "Deutschlandradio Kultur", CloseDown: "00:00", ProgramURL: r.MustParseURL("http://www.deutschlandradiokultur.de/programmvorschau.282.de.html"), Identifier: identifier, TimeZone: tz}) return &s } return nil }
func TestParseBroadcast_866264(t *testing.T) { { t0, _ := time.Parse(time.RFC3339, "2016-11-27T23:05:00+01:00") assert.Equal(t, "2016-11-27T23:05:00+01:00", t0.Format(time.RFC3339), "oha") } f, err := os.Open("testdata/2016-11-27T2305-b4-ausstrahlung-866264.html") assert.NotNil(t, f, "ouch") assert.Nil(t, err, "ouch") s := Station("b4") t0 := broadcastURL{ BroadcastURL: r.BroadcastURL{ TimeURL: r.TimeURL{ Time: time.Date(2016, time.November, 27, 23, 5, 0, 0, localLoc), Source: *r.MustParseURL("https://www.br-klassik.de/programm/radio/ausstrahlung-866264.html"), Station: r.Station(*s), }, Title: "Musik der Welt", }, Image: r.MustParseURL("https://www.br-klassik.de/pierre-dominique-ponnelle-102~_h-558_v-img__16__9__xl_w-994_-e1d284d92729d9396a907e303225e0f2d9fa53b4.jpg?version=1c52e"), } bc, err := t0.parseBroadcastReader(f, nil) assert.Nil(t, err, "ouch") assert.Equal(t, "b4", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "Musik der Welt", bc.Title, "ouch: Title") assert.Equal(t, "https://www.br-klassik.de/programm/radio/ausstrahlung-866264.html", bc.Source.String(), "ouch: Source") assert.NotNil(t, bc.Language, "ouch: Language") assert.Equal(t, "de", *bc.Language, "ouch: Language") assert.Equal(t, t0.Title, bc.Title, "ouch: Title") assert.Equal(t, "Aus dem Studio Franken:", *bc.TitleSeries, "ouch: TitleSeries") assert.Equal(t, "Minsk, Ufa, Taschkent", *bc.TitleEpisode, "ouch: TitleEpisode") assert.Equal(t, "2016-11-27T23:05:00+01:00", bc.Time.Format(time.RFC3339), "ouch: Time") assert.Equal(t, "2016-11-28T00:00:00+01:00", bc.DtEnd.Format(time.RFC3339), "ouch: DtEnd") assert.Equal(t, "https://www.br-klassik.de/themen/jazz-und-weltmusik/musik-der-welt-102.html", bc.Subject.String(), "ouch: Subject") assert.Equal(t, "2016-11-24T09:15:20+01:00", bc.Modified.Format(time.RFC3339), "ouch: Modified") assert.Equal(t, "Bayerischer Rundfunk", *bc.Author, "ouch: Author") assert.NotNil(t, bc.Description, "ouch: Description") assert.Equal(t, "Fremde Länder, fremde Klänge in Features, Reportagen und Interviews. Ein internationales Autoren-Team präsentiert Musik rund um den Globus, vom Porträt bis zum Konzertmitschnitt.\n\nDie Stationen seiner Karriere haben einen exotischen Klang. Er war Chefdirigent in Minsk. Er kennt die Opernhäuser von Bischkek, Almaty oder Baku wie seine Westentasche. Er hat die Staatsorchester von Armenien, Aserbaidschan und Georgien geleitet. Dabei hat es Pierre-Dominique Ponnelle, Sohn des berühmten Opernregisseurs Jean-Pierre Ponnelle, nach Lehrjahren bei Herbert von Karajan und Otmar Suitner eher durch Zufall gen Osten verschlagen. Grau in Grau hatte er sich diese Welt dort vorgestellt - und war dann fasziniert, gepackt von der Buntheit, der Vielfalt, der musikalischen Qualität, die er in den Ländern der ehemaligen Sowjetunion vorfand. Seine Reisen zu fremden Ländern und Menschen haben inzwischen auch in einer Reihe von Kompositionen ihren Niederschlag gefunden: Da gibt es eine liebevolle Hommage an den armenischen Maler Minas Avetisyan oder ein Streichquartett, das zentralasiatische Melodien verarbeitet. Thorsten Preuß sprach mit dem weitgereisten Komponisten und Dirigenten.\n\nDie musikalischen Reisen des Komponisten und Dirigenten Pierre-Dominique Ponnelle\nVon Thorsten Preuß", *bc.Description, "ouch: Description") assert.NotNil(t, bc.Image, "ouch: Image") assert.Equal(t, "https://www.br-klassik.de/pierre-dominique-ponnelle-102~_h-558_v-img__16__9__xl_w-994_-e1d284d92729d9396a907e303225e0f2d9fa53b4.jpg?version=1c52e", bc.Image.String(), "ouch: Image") }
func TestParseBroadcast_914548(t *testing.T) { { t0, _ := time.Parse(time.RFC3339, "2016-11-27T20:30:00+01:00") assert.Equal(t, "2016-11-27T20:30:00+01:00", t0.Format(time.RFC3339), "oha") } f, err := os.Open("testdata/2016-11-27T2030-b4-ausstrahlung-914548.html") assert.NotNil(t, f, "ouch") assert.Nil(t, err, "ouch") s := Station("b4") t0 := broadcastURL{ BroadcastURL: r.BroadcastURL{ TimeURL: r.TimeURL{ Time: time.Date(2016, time.November, 27, 20, 30, 0, 0, localLoc), Source: *r.MustParseURL("https://www.br-klassik.de/programm/radio/ausstrahlung-914548.html"), Station: r.Station(*s), }, Title: "Intermezzo", }, Image: r.MustParseURL("https://www.br-klassik.de/programm/radio/logo106~_h-558_v-img__16__9__xl_w-994_-e1d284d92729d9396a907e303225e0f2d9fa53b4.jpg?version=78f3c"), } bc, err := t0.parseBroadcastReader(f, nil) assert.Nil(t, err, "ouch") assert.Equal(t, "b4", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "Intermezzo", bc.Title, "ouch: Title") assert.Equal(t, "https://www.br-klassik.de/programm/radio/ausstrahlung-914548.html", bc.Source.String(), "ouch: Source") assert.NotNil(t, bc.Language, "ouch: Language") assert.Equal(t, "de", *bc.Language, "ouch: Language") assert.Equal(t, t0.Title, bc.Title, "ouch: Title") assert.Equal(t, "", *bc.TitleSeries, "ouch: TitleSeries") assert.Nil(t, bc.TitleEpisode, "ouch: TitleEpisode") assert.Equal(t, "2016-11-27T20:30:00+01:00", bc.Time.Format(time.RFC3339), "ouch: Time") assert.Equal(t, "2016-11-27T21:00:00+01:00", bc.DtEnd.Format(time.RFC3339), "ouch: DtEnd") assert.Nil(t, bc.Subject, "ouch: Subject") assert.Equal(t, "2016-11-25T13:15:07+01:00", bc.Modified.Format(time.RFC3339), "ouch: Modified") assert.Equal(t, "Bayerischer Rundfunk", *bc.Author, "ouch: Author") assert.NotNil(t, bc.Description, "ouch: Description") assert.Equal(t, "Ernst von Gemmingen: Violinkonzert Nr. 1 A-Dur (Kolja Lessing, Violine; Münchner Rundfunkorchester: Ulf Schirmer)", *bc.Description, "ouch: Description") assert.NotNil(t, bc.Image, "ouch: Image") assert.Equal(t, "https://www.br-klassik.de/programm/radio/logo106~_h-558_v-img__16__9__xl_w-994_-e1d284d92729d9396a907e303225e0f2d9fa53b4.jpg?version=78f3c", bc.Image.String(), "ouch: Image") }
// Station Factory // // Returns a instance conforming to 'scrape.Scraper' func Station(identifier string) *station { tz, err := time.LoadLocation("Europe/Berlin") if nil != err { panic(err) } s := map[string]station{ "b+": station(r.Station{Name: "Bayern Plus", CloseDown: "05:00", ProgramURL: r.MustParseURL("http://www.br.de/radio/bayern-plus/programmkalender/bayern-plus114.html"), Identifier: identifier, TimeZone: tz}), "b1": station(r.Station{Name: "Bayern 1", CloseDown: "05:00", ProgramURL: r.MustParseURL("http://www.br.de/radio/bayern1/service/programm/index.html"), Identifier: identifier, TimeZone: tz}), "b2": station(r.Station{Name: "Bayern 2", CloseDown: "05:00", ProgramURL: r.MustParseURL("http://www.br.de/radio/bayern2/service/programm/index.html"), Identifier: identifier, TimeZone: tz}), "b5": station(r.Station{Name: "Bayern 5", CloseDown: "06:00", ProgramURL: r.MustParseURL("http://www.br.de/radio/b5-aktuell/programmkalender/b5aktuell116.html"), Identifier: identifier, TimeZone: tz}), "brheimat": station(r.Station{Name: "BR Heimat", CloseDown: "05:00", ProgramURL: r.MustParseURL("http://www.br.de/radio/br-heimat/programmkalender/br-heimat-116.html"), Identifier: identifier, TimeZone: tz}), "puls": station(r.Station{Name: "Puls", CloseDown: "07:00", ProgramURL: r.MustParseURL("http://www.br.de/puls/programm/puls-radio/programmkalender/programmfahne104.html"), Identifier: identifier, TimeZone: tz}), }[identifier] // fmt.Fprintf(os.Stderr, " %p %s\n", &s, s.Name) return &s }