func TestParseBroadcastWithImage1(t *testing.T) { f, err := os.Open("testdata/2015-11-16T1605-b2-sendung.html") assert.NotNil(t, f, "ouch") assert.Nil(t, err, "ouch") s := Station("b2") t0 := broadcastURL{ TimeURL: r.TimeURL{ Time: time.Date(2015, time.November, 16, 16, 5, 0, 0, localLoc), Source: *r.MustParseURL("http://www.br.de/radio/bayern2/programmkalender/ausstrahlung-498522.html"), Station: r.Station(*s), }, Title: "Nachrichten, Wetter", } // http://rec.mro.name/stations/b2/2015/11/16/1605%20Eins%20zu%20Eins.%20Der%20Talk bcs, err := t0.parseBroadcastReader(f, nil) assert.Nil(t, err, "ouch") assert.Equal(t, 1, len(bcs), "ouch") bc := bcs[0] assert.Equal(t, "b2", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "Stefan Parrisius im Gespräch mit Yvonne Hofstetter, Big Data Managing Director\nWiederholung um 22.05 Uhr\nAls Podcast verfügbar\n\nErfahrungen und Einsichten, einschneidende Erlebnisse und große Erfolge: Biografische Gespräche mit Menschen, die eine spannende Lebensgeschichte oder einen außergewöhnlichen Beruf haben.", *bc.Description, "ouch: Description") // assert.NotNil(t, bc.Image, "ouch: Image") assert.Equal(t, "http://www.br.de/radio/bayern2/gesellschaft/eins-zu-eins-der-talk/yvonne-hofstetter-110~_v-img__16__9__m_-4423061158a17f4152aef84861ed0243214ae6e7.jpg?version=72771", bc.Image.String(), "ouch: Image") }
func TestUnmarshalBroadcasts0(t *testing.T) { f, err := os.Open("testdata/2016-07-25T0945-program.json") assert.NotNil(t, f, "ouch") assert.Nil(t, err, "ouch") s := Station("b3") u := calItemRangeURL(r.TimeURL{ Time: time.Now(), Source: *s.ProgramURL, Station: r.Station(*s), }) res, err := u.parseBroadcastsReader(f, nil) assert.Equal(t, 3, len(res), "53") bc := res[0] assert.Nil(t, err, "ouch") assert.Equal(t, "b3", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "Die Frühaufdreher", bc.Title, "ouch: Title") assert.Equal(t, "http://www.br.de/mediathek/audio/bayern3-audio-livestream-100~radioplayer.json", bc.Source.String(), "ouch: Source") assert.NotNil(t, bc.Language, "ouch: Language") assert.Equal(t, "de", *bc.Language, "ouch: Language") assert.Nil(t, bc.TitleSeries, "ouch: TitleSeries") assert.Nil(t, bc.TitleEpisode, "ouch: TitleEpisode") assert.Equal(t, "2016-07-25T05:00:00+02:00", bc.Time.Format(time.RFC3339), "ouch: Time") assert.Equal(t, "2016-07-25T09:00:00+02:00", bc.DtEnd.Format(time.RFC3339), "ouch: DtEnd") assert.Nil(t, bc.Subject, "ouch: Subject") assert.Nil(t, bc.Modified, "ouch: Modified") assert.Equal(t, "Bayerischer Rundfunk", *bc.Author, "ouch: Author") assert.Equal(t, "", *bc.Description, "ouch: Description") assert.Nil(t, bc.Image, "ouch: Image") }
func TestUnmarshalBroadcastsFromJSON(t *testing.T) { f, err := os.Open("testdata/2016-07-25T1207-program.json") assert.NotNil(t, f, "ouch") assert.Nil(t, err, "ouch") s := Station("wdr5") u := timeURL(r.TimeURL{ Time: time.Date(2015, time.October, 25, 0, 0, 0, 0, s.TimeZone), Source: *r.MustParseURL("http://www.wdr.de/programmvorschau/ajax/wdr5/uebersicht/2016-07-25/"), Station: r.Station(*s), }) res, err := u.parseBroadcastsFromJsonReader(f, nil) assert.Equal(t, 86, len(res), "53") bc := res[0] assert.Nil(t, err, "ouch") assert.Equal(t, "wdr5", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "WDR Aktuell", bc.Title, "ouch: Title") assert.Equal(t, "http://www.wdr.de/programmvorschau/wdr5/sendung/2016-07-25/40944229/wdr-aktuell.html", bc.Source.String(), "ouch: Source") assert.NotNil(t, bc.Language, "ouch: Language") assert.Equal(t, "de", *bc.Language, "ouch: Language") assert.Nil(t, bc.TitleSeries, "ouch: TitleSeries") assert.Nil(t, bc.TitleEpisode, "ouch: TitleEpisode") assert.Equal(t, "2016-07-25T00:00:00+02:00", bc.Time.Format(time.RFC3339), "ouch: Time") assert.Equal(t, "2016-07-25T00:05:00+02:00", bc.DtEnd.Format(time.RFC3339), "ouch: DtEnd") assert.Nil(t, bc.Subject, "ouch: Subject") assert.Nil(t, bc.Modified, "ouch: Modified") assert.Nil(t, bc.Author, "ouch: Author") assert.Equal(t, "", *bc.Description, "ouch: Description") assert.Nil(t, bc.Image, "ouch: Image") }
// queue one scrape job: now! func (s *station) Scrape() (jobs []r.Scraper, results []r.Broadcaster, err error) { i := calItemRangeURL(r.TimeURL{ Time: time.Now(), Source: *s.ProgramURL, Station: r.Station(*s), }) jobs = append(jobs, &i) return }
func (s *station) dayURLForDate(day time.Time) (ret *timeURL, err error) { r := timeURL(r.TimeURL{ Time: time.Date(day.Year(), day.Month(), day.Day(), 0, 0, 0, 0, s.TimeZone), Source: *r.MustParseURL(s.ProgramURL.String() + day.Format("?daterequest=2006-01-02")), Station: r.Station(*s), }) ret = &r // err = errors.New("Not ümplemented yet.") return }
/////////////////////////////////////////////////////////////////////// // https://www.br-klassik.de/programm/radio/radiosendungen-100~calendar-detail-inner.jsp?date=2016-01-11 // https://www.br-klassik.de/programm/radio/radiosendungen-100~calendarItems.jsp?from=2016-01-10T23:59:59&to=2016-01-11T00:10:00&rows=800 func (s *station) calendarItemRangeURLForTime(t time.Time) (ret *calItemRangeURL, err error) { if nil == s { panic("aua") } t0 := t.Add(time.Minute) t1 := t0.Add(time.Hour) r := calItemRangeURL(r.TimeURL{ Time: t0, Source: *r.MustParseURL("https://www.br-klassik.de/programm/radio/radiosendungen-100~calendarItems.jsp?rows=800" + t0.Format("&from=2006-01-02T15:04:05") + t1.Format("&to=2006-01-02T15:04:05")), Station: r.Station(*s), }) ret = &r // err = errors.New("Not ümplemented yet.") return }
func TestParseScheduleForBroadcasts(t *testing.T) { f, err := os.Open("testdata/2015-10-21-b2-program.html") assert.NotNil(t, f, "ouch") assert.Nil(t, err, "ouch") s := Station("b2") u := timeURL{ Time: time.Date(2015, time.October, 21, 5, 0, 0, 0, localLoc), Source: *r.MustParseURL("http://www.br.de/radio/bayern2/programmkalender/programmfahne102~_date-2015-10-21_-5ddeec3fc12bdd255a6c45c650f068b54f7b010b.html"), Station: r.Station(*s), } a, err := u.parseBroadcastURLsReader(f, nil) assert.Equal(t, 129, len(a), "ouch: len") assert.Equal(t, "b2", a[0].TimeURL.Station.Identifier, "ouch: ") assert.Equal(t, "2015-10-20T05:00:00+02:00", a[0].Time.Format(time.RFC3339), "ouch: ") assert.Equal(t, "2015-10-23T04:58:00+02:00", a[128].Time.Format(time.RFC3339), "ouch: ") }
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") }
func TestUnmarshalBroadcastFromHTML_2(t *testing.T) { f, err := os.Open("testdata/2016-08-21T1800-sendung.html") assert.NotNil(t, f, "ouch") assert.Nil(t, err, "ouch") s := Station("wdr5") lang := "de" dtEnd, _ := time.Parse(time.RFC3339, "2016-08-21T18:05:00+02:00") bc0 := broadcast(r.Broadcast{ BroadcastURL: r.BroadcastURL{ TimeURL: r.TimeURL{ Time: time.Date(2016, time.August, 21, 18, 0, 0, 0, s.TimeZone), Source: *r.MustParseURL("http://www.wdr.de/programmvorschau/wdr5/sendung/2016-07-23/40920025/krimi-am-samstag.html"), Station: r.Station(*s), }, Title: "Krimi am Samstag", }, Language: &lang, DtEnd: &dtEnd, }) res, err := bc0.parseBroadcastFromHtmlReader(f, nil) assert.Equal(t, 1, len(res), "96") bc := res[0] assert.Nil(t, err, "ouch") assert.Equal(t, "wdr5", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "Krimi am Samstag", bc.Title, "ouch: Title") assert.Equal(t, "http://www.wdr.de/programmvorschau/wdr5/sendung/2016-07-23/40920025/krimi-am-samstag.html", bc.Source.String(), "ouch: Source") assert.NotNil(t, bc.Language, "ouch: Language") assert.Equal(t, "de", *bc.Language, "ouch: Language") assert.Nil(t, bc.TitleSeries, "ouch: TitleSeries") assert.Nil(t, bc.TitleEpisode, "ouch: TitleEpisode") assert.Equal(t, "2016-08-21T18:00:00+02:00", bc.Time.Format(time.RFC3339), "ouch: Time") assert.Equal(t, "2016-08-21T18:05:00+02:00", bc.DtEnd.Format(time.RFC3339), "ouch: DtEnd") assert.Nil(t, bc.Subject, "ouch: Subject") assert.Nil(t, bc.Modified, "ouch: Modified") assert.Equal(t, "WDR", *bc.Author, "ouch: Author") assert.Equal(t, "", *bc.Description, "ouch: Description") assert.Nil(t, bc.Image, "ouch: Image") }
func TestUnmarshalBroadcastFromHTML_0(t *testing.T) { f, err := os.Open("testdata/2016-07-23T1705-sendung.html") assert.NotNil(t, f, "ouch") assert.Nil(t, err, "ouch") s := Station("wdr5") lang := "de" dtEnd, _ := time.Parse(time.RFC3339, "2016-07-23T18:00:00+02:00") bc0 := broadcast(r.Broadcast{ BroadcastURL: r.BroadcastURL{ TimeURL: r.TimeURL{ Time: time.Date(2016, time.July, 23, 17, 5, 0, 0, s.TimeZone), Source: *r.MustParseURL("http://www.wdr.de/programmvorschau/wdr5/sendung/2016-07-23/40920025/krimi-am-samstag.html"), Station: r.Station(*s), }, Title: "Krimi am Samstag", }, Language: &lang, DtEnd: &dtEnd, }) res, err := bc0.parseBroadcastFromHtmlReader(f, nil) assert.Equal(t, 1, len(res), "96") bc := res[0] assert.Nil(t, err, "ouch") assert.Equal(t, "wdr5", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "Krimi am Samstag", bc.Title, "ouch: Title") assert.Equal(t, "http://www.wdr.de/programmvorschau/wdr5/sendung/2016-07-23/40920025/krimi-am-samstag.html", bc.Source.String(), "ouch: Source") assert.NotNil(t, bc.Language, "ouch: Language") assert.Equal(t, "de", *bc.Language, "ouch: Language") assert.Nil(t, bc.TitleSeries, "ouch: TitleSeries") assert.Equal(t, "Der Knochenmann", *bc.TitleEpisode, "ouch: TitleEpisode") assert.Equal(t, "2016-07-23T17:05:00+02:00", bc.Time.Format(time.RFC3339), "ouch: Time") assert.Equal(t, "2016-07-23T18:00:00+02:00", bc.DtEnd.Format(time.RFC3339), "ouch: DtEnd") assert.Equal(t, "http://www1.wdr.de/radio/wdr5/sendungen/krimi-am-samstag/uebersicht-krimi-am-samstag100.html", bc.Subject.String(), "ouch: Subject") assert.Nil(t, bc.Modified, "ouch: Modified") assert.Equal(t, "WDR", *bc.Author, "ouch: Author") assert.Equal(t, "Von Wolf Haas\nKomposition: Otto Lechner\nBearbeitung und Regie: Götz Fritsch\nHaas: Wolfram Berger\nBrenner: Erwin Steinhauer\nLöschenkohl: Peter Simonischek\nFerdl: Peter Strauß\nKellnerin: Anna Mertin\nMilovic: Stefan Terdy\nPaul Löschenkohl: Ernst Prassel\nPeter Nidetzky: Peter Nidetzky\nJacky: Harald Pichlhöfer\nRothaarige: Brigitte Soucek\nPalfinger: Erhard Koren\nSchwester: Brigitte Karner\nKrennek: Peter Uray\nHelene: Michou Friesz\nFrau Trummer: Gerti Pall\nKellnerin: Anne Mertin\nFerner wirken mit: Alex Schoeler-Haring, Stefan Puntigam, Ursula\nMihelic-Korp, Johannes Monschein, Netta Goldfarb, Heinrich\nHerki-Hoefler, Horst Klaus, Hertha Block, Friedrich Weidisch, Edith\nUnger, Josef Safranek und Margaret Reschreiter\nMusiker: Georg Graf, Saxofon, Klarinette und Oboe; Herbert Reisinger und\nJoão de Bruçó, Schlagzeug; Anton Burger, Geige; Max Nagl, Saxofon\nAufnahme ORF/MDR\n\nJetzt ist schon wieder was passiert. Privatdetektiv Brenner ist erneut im Einsatz. Krimiautor Wolf Haas schickt ihn diesmal zum wenig idyllischen Grillkönig in die Steiermark - und lässt dabei nicht nur Brathähnchen um Kopf und Kragen fürchten.", *bc.Description, "ouch: Description") assert.Nil(t, bc.Image, "ouch: Image") }
func TestUnmarshalBroadcastFromHTML_4(t *testing.T) { f, err := os.Open("testdata/2016-08-21T2305-sendung.html") assert.NotNil(t, f, "ouch") assert.Nil(t, err, "ouch") s := Station("wdr5") lang := "de" dtEnd, _ := time.Parse(time.RFC3339, "2016-08-22T00:00:00+02:00") bc0 := broadcast(r.Broadcast{ BroadcastURL: r.BroadcastURL{ TimeURL: r.TimeURL{ Time: time.Date(2016, time.August, 21, 23, 5, 0, 0, s.TimeZone), Source: *r.MustParseURL("http://www.wdr.de/programmvorschau/wdr5/sendung/2016-08-21/41025663/der-wdr-5-literatursommer.html"), Station: r.Station(*s), }, Title: "Der WDR 5 Literatursommer", }, Language: &lang, DtEnd: &dtEnd, }) res, err := bc0.parseBroadcastFromHtmlReader(f, nil) assert.Equal(t, 1, len(res), "262") bc := res[0] assert.Nil(t, err, "ouch") assert.Equal(t, "wdr5", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "Der WDR 5 Literatursommer", bc.Title, "ouch: Title") assert.Equal(t, "http://www.wdr.de/programmvorschau/wdr5/sendung/2016-08-21/41025663/der-wdr-5-literatursommer.html", bc.Source.String(), "ouch: Source") assert.NotNil(t, bc.Language, "ouch: Language") assert.Equal(t, "de", *bc.Language, "ouch: Language") assert.Nil(t, bc.TitleSeries, "ouch: TitleSeries") assert.Equal(t, "Michael Kumpfmüller gibt Erziehungsratschläge", *bc.TitleEpisode, "ouch: TitleEpisode") assert.Equal(t, "2016-08-21T23:05:00+02:00", bc.Time.Format(time.RFC3339), "ouch: Time") assert.Equal(t, "2016-08-22T00:00:00+02:00", bc.DtEnd.Format(time.RFC3339), "ouch: DtEnd") assert.Equal(t, "http://www1.wdr.de/radio/wdr5/sendungen/literatursommer/uebersicht-literatursommer102.html", bc.Subject.String(), "ouch: Subject") assert.Nil(t, bc.Modified, "ouch: Modified") assert.Equal(t, "WDR", *bc.Author, "ouch: Author") assert.Equal(t, "bis 24:00 Uhr\nWiederholung: 23.08. 03.05 Uhr\n\n„Die Erziehung des Mannes“ hat sich Michael Kumpfmüller in seinem jüngsten Roman zur Aufgabe gemacht. Am Beispiel von Georg, dem Protagonisten der Geschichte,\n\nerzählt er von den Fallstricken, mit denen Männer in Liebesdingen und im Ehealltag rechnen müssen.\n\nGeorgs Beziehungen gehen immer wieder in die Brüche, dann heiratet er Jule und bekommt mit ihr drei Kinder. Glücklich sind die beide trotzdem nicht. Aber wer trägt die\n\nSchuld an dem Problem? Die feministisch sozialisierte Frau, die ein neues männliches Rollenbild erwartet, und manchmal doch den alten Macho haben will? Der Vater, der seinen Kindern Zärtlichkeit und Nähe vorenthalten hat? Oder Georg selbst, der sich von den Ansprüchen von Frau und Kindern überfordert fühlt?\n\nMinutiös und durchaus komisch protokolliert Michael Kumpfmüller das Leben eines Durchschnittsmannes im 21. Jahrhundert. Immer auf der Suche nach einem Weg aus dem Dilemma von unerfüllbaren Erwartungen und festgefahrenen Verhaltensmustern.\n\nWDR 5 Literatursommer sendet Ausschnitte einer Veranstaltung der lit.COLOGNE 2016.", *bc.Description, "ouch: Description") assert.Nil(t, bc.Image, "ouch: Image") }
func TestUnmarshalBroadcastFromHTML_3(t *testing.T) { f, err := os.Open("testdata/2016-08-21T1805-sendung.html") assert.NotNil(t, f, "ouch") assert.Nil(t, err, "ouch") s := Station("wdr5") lang := "de" dtEnd, _ := time.Parse(time.RFC3339, "2016-08-21T19:00:00+02:00") bc0 := broadcast(r.Broadcast{ BroadcastURL: r.BroadcastURL{ TimeURL: r.TimeURL{ Time: time.Date(2016, time.August, 21, 18, 5, 0, 0, s.TimeZone), Source: *r.MustParseURL("http://www.wdr.de/programmvorschau/wdr5/sendung/2016-07-23/40920025/krimi-am-samstag.html"), Station: r.Station(*s), }, Title: "Krimi am Samstag", }, Language: &lang, DtEnd: &dtEnd, }) res, err := bc0.parseBroadcastFromHtmlReader(f, nil) assert.Equal(t, 1, len(res), "96") bc := res[0] assert.Nil(t, err, "ouch") assert.Equal(t, "wdr5", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "Krimi am Samstag", bc.Title, "ouch: Title") assert.Equal(t, "http://www.wdr.de/programmvorschau/wdr5/sendung/2016-07-23/40920025/krimi-am-samstag.html", bc.Source.String(), "ouch: Source") assert.NotNil(t, bc.Language, "ouch: Language") assert.Equal(t, "de", *bc.Language, "ouch: Language") assert.Nil(t, bc.TitleSeries, "ouch: TitleSeries") assert.Equal(t, "Ich war für viele die Millowitsch-Tochter", *bc.TitleEpisode, "ouch: TitleEpisode") assert.Equal(t, "2016-08-21T18:05:00+02:00", bc.Time.Format(time.RFC3339), "ouch: Time") assert.Equal(t, "2016-08-21T19:00:00+02:00", bc.DtEnd.Format(time.RFC3339), "ouch: DtEnd") assert.Equal(t, "http://www1.wdr.de/radio/wdr5/sendungen/erlebtegeschichten/uebersicht-erlebte-geschichten100.html", bc.Subject.String(), "ouch: Subject") assert.Nil(t, bc.Modified, "ouch: Modified") assert.Equal(t, "WDR", *bc.Author, "ouch: Author") assert.Equal(t, "Lotti Krekel, Schauspielerin und Sängerin\nVon Christian Geuenich\nWiederholung: 22.05 Uhr\n\nLotti Krekel, am 23. August 1941 in Roetgen in der Eifel geboren, war ein Kinderstar des Radios. Dort lernte sie Willy Millowitsch kennen und wurde später als seine Filmund\n\nBühnentochter einem Millionenpublikum bekannt.\n\nElf Jahre lang spielte sie meist die Tochter des großen Kölschen Volksschauspielers, so dass viele Zuschauer sie bis heute für die leibliche Tochter von Willy Millowitsch halten. Ende der 1960er Jahre begann Lotti Krekel eine erfolgreiche zweite Karriere ohne Millowitsch und wurde eher zufällig mit ihrem kölschen Hit „Mir schenke der Ahl e paar Blömcher“ zu einer erfolgreichen Sängerin. Daneben spielte sie in Fernsehfilmen und stand auf der Theater- oder Karnevalsbühne. Mit ihrem Mann Ernst Hilbich und ihrer jüngeren Halbschwester Hildegard Krekel, war\n\nsie in der Fernsehserie „Die Anrheiner“ zu sehen.", *bc.Description, "ouch: Description") assert.Nil(t, bc.Image, "ouch: Image") }
func TestParseBroadcast23h55min(t *testing.T) { f, err := os.Open("testdata/2015-11-15T0005-b+-sendung.html") assert.NotNil(t, f, "ouch") assert.Nil(t, err, "ouch") s := Station("b+") t0 := broadcastURL{ TimeURL: r.TimeURL{ Time: time.Date(2015, time.November, 11, 15, 5, 0, 0, localLoc), Source: *r.MustParseURL("http://www.br.de/radio/bayern-plus/programmkalender/ausstrahlung-497666.html"), Station: r.Station(*s), }, Title: "Bayern plus - Meine Schlager hören", } // http://rec.mro.name/stations/b%2b/2015/11/15/0005%20Bayern%20plus%20-%20Meine%20Schlager%20h%C3%B6ren bcs, err := t0.parseBroadcastReader(f, nil) assert.Nil(t, err, "ouch") assert.Equal(t, 1, len(bcs), "ouch") bc := bcs[0] assert.Equal(t, "b+", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "Bayern plus - Meine Schlager hören", bc.Title, "ouch: Title") assert.Equal(t, "http://www.br.de/radio/bayern-plus/programmkalender/ausstrahlung-497666.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.Nil(t, bc.TitleSeries, "ouch: TitleSeries") assert.Nil(t, bc.TitleEpisode, "ouch: TitleEpisode") assert.Equal(t, "2015-11-15T00:05:00+01:00", bc.Time.Format(time.RFC3339), "ouch: Time") assert.Equal(t, "2015-11-16T00:00:00+01:00", bc.DtEnd.Format(time.RFC3339), "ouch: DtEnd") assert.Equal(t, 1435*time.Minute, bc.DtEnd.Sub(bc.Time), "ouch: Duration") assert.Nil(t, bc.Subject, "ouch: Subject") assert.Equal(t, "2015-10-29T01:25:04+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, "Jeweils zur vollen Stunde\nNachrichten, Wetter, Verkehr", *bc.Description, "ouch: Description") assert.Nil(t, bc.Image, "ouch: Image") assert.Nil(t, bc.Publisher, "Publisher") assert.Nil(t, bc.Creator, "Creator") assert.Nil(t, bc.Copyright, "Copyright") }
func TestUnmarshalBroadcastFromHTML_1(t *testing.T) { f, err := os.Open("testdata/2016-08-21T1705-sendung.html") assert.NotNil(t, f, "ouch") assert.Nil(t, err, "ouch") s := Station("wdr5") lang := "de" dtEnd, _ := time.Parse(time.RFC3339, "2016-08-21T18:00:00+02:00") bc0 := broadcast(r.Broadcast{ BroadcastURL: r.BroadcastURL{ TimeURL: r.TimeURL{ Time: time.Date(2016, time.August, 21, 17, 5, 0, 0, s.TimeZone), Source: *r.MustParseURL("http://www.wdr.de/programmvorschau/wdr5/sendung/2016-07-23/40920025/krimi-am-samstag.html"), Station: r.Station(*s), }, Title: "Krimi am Samstag", }, Language: &lang, DtEnd: &dtEnd, }) res, err := bc0.parseBroadcastFromHtmlReader(f, nil) assert.Equal(t, 1, len(res), "96") bc := res[0] assert.Nil(t, err, "ouch") assert.Equal(t, "wdr5", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "Krimi am Samstag", bc.Title, "ouch: Title") assert.Equal(t, "http://www.wdr.de/programmvorschau/wdr5/sendung/2016-07-23/40920025/krimi-am-samstag.html", bc.Source.String(), "ouch: Source") assert.NotNil(t, bc.Language, "ouch: Language") assert.Equal(t, "de", *bc.Language, "ouch: Language") assert.Nil(t, bc.TitleSeries, "ouch: TitleSeries") assert.Equal(t, "Mördergrube", *bc.TitleEpisode, "ouch: TitleEpisode") assert.Equal(t, "2016-08-21T17:05:00+02:00", bc.Time.Format(time.RFC3339), "ouch: Time") assert.Equal(t, "2016-08-21T18:00:00+02:00", bc.DtEnd.Format(time.RFC3339), "ouch: DtEnd") assert.Equal(t, "http://www1.wdr.de/radio/wdr5/sendungen/hoerspiel-am-sonntag/uebersicht-hoerspiel-am-sonntag100.html", bc.Subject.String(), "ouch: Subject") assert.Nil(t, bc.Modified, "ouch: Modified") assert.Equal(t, "WDR", *bc.Author, "ouch: Author") assert.Equal(t, "Von Lorenz Schröter\nAndré: Christoph Bach\nBeatrice: Mira Partecke\nDaniela: Victoria Trauttmansdorff\nEinar: Christof Wackernagel\nAndré, jung: Jakob Göss\nBruno: Volker Lippmann\nWaldemar: Gunnar Kolb\nMelanie: Julia Riedler\nJunger Mann: Julius Schleheck\nImke: Claudia Mischke\nRegie: Thomas Wolfertz\n\nDas Leben ist eine Sickergrube voller Erinnerungen. Aber was macht man, wenn der Gestank nicht mehr auszuhalten ist? André beschließt, den Sumpf auszuheben.", *bc.Description, "ouch: Description") assert.Nil(t, bc.Image, "ouch: Image") }
func TestParseBroadcast_0(t *testing.T) { { t0, _ := time.Parse(time.RFC3339, "2015-10-22T00:06:13+02:00") assert.Equal(t, "2015-10-22T00:06:13+02:00", t0.Format(time.RFC3339), "oha") } f, err := os.Open("testdata/2015-10-21T0012-b2-sendung.html") assert.NotNil(t, f, "ouch") assert.Nil(t, err, "ouch") s := Station("b2") t0 := broadcastURL{ TimeURL: r.TimeURL{ Time: time.Date(2015, time.October, 21, 0, 12, 0, 0, localLoc), Source: *r.MustParseURL("http://www.br.de/radio/bayern2/programmkalender/ausstrahlung-472548.html"), Station: r.Station(*s), }, Title: "Concerto bavarese", } // http://rec.mro.name/stations/b2/2015/10/21/0012%20Concerto%20bavarese bcs, err := t0.parseBroadcastReader(f, nil) assert.Nil(t, err, "ouch") assert.Equal(t, 1, len(bcs), "ouch") bc := bcs[0] assert.Equal(t, "b2", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "Concerto bavarese", bc.Title, "ouch: Title") assert.Equal(t, "http://www.br.de/radio/bayern2/programmkalender/ausstrahlung-472548.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, "Fränkische Komponisten", *bc.TitleEpisode, "ouch: TitleEpisode") assert.Equal(t, "2015-10-21T00:12:00+02:00", bc.Time.Format(time.RFC3339), "ouch: Time") assert.Equal(t, "2015-10-21T02:00:00+02:00", bc.DtEnd.Format(time.RFC3339), "ouch: DtEnd") assert.Equal(t, "http://www.br.de/radio/bayern2/musik/concerto-bavarese/index.html", bc.Subject.String(), "ouch: Subject") assert.Equal(t, "2015-10-22T00:06:13+02: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, "Franz Schillinger: \"Insisting Voices II\"; \"Veränderliche Langsamkeiten III\" (Wilfried Krüger, Horn; Heinrich Rauh, Violine); Stefan David Hummel: \"In one's heart of hearts\" (Stefan Teschner, Violine; Klaus Jäckle, Gitarre; Sven Forker, Schlagzeug); Matthias Schmitt: Sechs Miniaturen (Katarzyna Mycka, Marimbaphon); Stefan Hippe: \"Annacamento\" (ars nova ensemble nürnberg: Werner Heider); Ludger Hofmann-Engl: \"Abstract I\" (Wolfgang Pessler, Fagott; Sebastian Rocholl, Viola; Ralf Waldner, Cembalo); Ulrich Schultheiß: \"Bubbles\" (Stefan Barcsay, Gitarre)", *bc.Description, "ouch: Description") assert.NotNil(t, bc.Image, "ouch: Image") assert.Equal(t, "http://www.br.de/layout/img/programmfahne/concerto-bavarese112~_v-img__16__9__m_-4423061158a17f4152aef84861ed0243214ae6e7.jpg?version=40aa3", bc.Image.String(), "ouch: Image") }
func TestParseBroadcasts_1(t *testing.T) { f, err := os.Open("testdata/2015-11-14-dlf-programm.html") assert.NotNil(t, f, "ouch") assert.Nil(t, err, "ouch") s := Station("dlf") u := timeURL(r.TimeURL{ Time: time.Date(2015, time.November, 14, 0, 0, 0, 0, s.TimeZone), Source: *r.MustParseURL("http://www.deutschlandfunk.de/programmvorschau.281.de.html?cal:month=10&drbm:date=14.11.2015"), Station: r.Station(*s), }) bcs, err := u.parseBroadcastsFromReader(f, nil) assert.NotNil(t, bcs, "ouch") assert.Nil(t, err, "ouch") assert.Equal(t, 43, len(bcs), "ouch") bc := bcs[1] assert.Nil(t, err, "ouch") assert.Equal(t, "dlf", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "Mitternachtskrimi", bc.Title, "ouch: Title") assert.Equal(t, "http://www.deutschlandfunk.de/programmvorschau.281.de.html?cal:month=10&drbm:date=14.11.2015#0005", bc.Source.String(), "ouch: Source") assert.NotNil(t, bc.Language, "ouch: Language") assert.Equal(t, "de", *bc.Language, "ouch: Language") assert.Equal(t, bc.Title, bc.Title, "ouch: Title") assert.Nil(t, bc.TitleSeries, "ouch: TitleSeries") assert.Nil(t, bc.TitleEpisode, "ouch: TitleEpisode") assert.Equal(t, "2015-11-14T00:05:00+01:00", bc.Time.Format(time.RFC3339), "ouch: Time") assert.Equal(t, "2015-11-14T01:00:00+01:00", bc.DtEnd.Format(time.RFC3339), "ouch: DtEnd") assert.Equal(t, 3300*time.Second, bc.DtEnd.Sub(bc.Time), "ouch: Duration") assert.NotNil(t, bc.Subject, "ouch: Subject") assert.Equal(t, "http://www.deutschlandfunk.de/hoerspiel.687.de.html", bc.Subject.String(), "ouch: Subject") assert.Nil(t, bc.Modified, "ouch: Modified") assert.Nil(t, bc.Author, "ouch: Author") assert.NotNil(t, bc.Description, "ouch: Description") assert.Equal(t, "Gotteskrieger\nVon Christoph Güsken\nRegie: Klaus-Michael Klingsporn\nMusik: Frank Merfort\nMit: Christoph Gawenda, Aylin Esener, Andreas Schmidt, Anita Vulesica, Frank Arnold, Katja Teichmann u.a.\nProduktion: DKultur 2015\nLänge: ca. 54'\n\nNach Terroranschlägen in den europäischen Metropolen gibt es auch in Berlin eine erhöhte Sicherheitsstufe. Die Galerie Schlöndorff steht kurz vor der Eröffnung einer Vernissage mit Werken des Zeichners Laurin Svensson. Vor allem seine Karikatur 'Krisensitzung' hatte im Vorfeld Schlagzeilen gemacht. Das Bild zeigt Jesus, den Propheten Elias und Mohammed bei einem feuchtfröhlichen Abendmahl. Svensson wird auf offener Straße entführt. In einem auf YouTube veröffentlichten Video bekennt sich eine Gruppe namens Deutsches Kalifat zu der Entführung und schließt eine Hinrichtung vor laufender Kamera nicht aus. Dem Leiter der SOKO, Heiko Lübeck, und Hauptkommissarin Aygün Kleist bleiben nur wenige Stunden: Das Ultimatum läuft um Mitternacht ab.\n\nChristoph Güsken, geboren 1958 in Mönchengladbach, lebt in Münster. Zu seinen bekanntesten Werken zählen die Krimis um das Detektivgespann Bernie Kittel und Henk Voss. 2004 produzierte DKultur \"Blaubarts Gärtner\" und 2014 \"Quotenkiller\".", *bc.Description, "ouch: Description") assert.Nil(t, bc.Image, "ouch: Image") assert.Equal(t, "http://www.deutschlandfunk.de/", *bc.Publisher, "Publisher") assert.Nil(t, bc.Creator, "Creator") assert.Nil(t, bc.Copyright, "Copyright") }
func TestParseBroadcasts_2(t *testing.T) { f, err := os.Open("testdata/2016-08-06-drk-programm.html") assert.NotNil(t, f, "ouch") assert.Nil(t, err, "ouch") s := Station("drk") u := timeURL(r.TimeURL{ Time: time.Date(2016, time.August, 6, 0, 0, 0, 0, s.TimeZone), Source: *r.MustParseURL("http://www.deutschlandradiokultur.de/programmvorschau.282.de.html?cal:month=8&drbm:date=06.08.2016"), Station: r.Station(*s), }) bcs, err := u.parseBroadcastsFromReader(f, nil) assert.NotNil(t, bcs, "ouch") assert.Nil(t, err, "ouch") assert.Equal(t, 32, len(bcs), "ouch") bc := bcs[1] assert.Nil(t, err, "ouch") assert.Equal(t, "drk", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "Lange Nacht", bc.Title, "ouch: Title") assert.Equal(t, "http://www.deutschlandradiokultur.de/programmvorschau.282.de.html?cal:month=8&drbm:date=06.08.2016#0005", bc.Source.String(), "ouch: Source") assert.NotNil(t, bc.Language, "ouch: Language") assert.Equal(t, "de", *bc.Language, "ouch: Language") assert.Equal(t, bc.Title, bc.Title, "ouch: Title") assert.Nil(t, bc.TitleSeries, "ouch: TitleSeries") assert.Nil(t, bc.TitleEpisode, "ouch: TitleEpisode") assert.Equal(t, "2016-08-06T00:05:00+02:00", bc.Time.Format(time.RFC3339), "ouch: Time") assert.Equal(t, "2016-08-06T03:00:00+02:00", bc.DtEnd.Format(time.RFC3339), "ouch: DtEnd") assert.Equal(t, 10500*time.Second, bc.DtEnd.Sub(bc.Time), "ouch: Duration") assert.NotNil(t, bc.Subject, "ouch: Subject") assert.Equal(t, "http://www.deutschlandradiokultur.de/lange-nacht.1023.de.html", bc.Subject.String(), "ouch: Subject") assert.Nil(t, bc.Modified, "ouch: Modified") assert.Nil(t, bc.Author, "ouch: Author") assert.NotNil(t, bc.Description, "ouch: Description") assert.Equal(t, "Freiheit - ein Drahtseilakt\nEine Lange Nacht über Frauen in der Manege\nVon Anne Ipsen und Daniela Kletzke\nRegie: Daniela Kletzke\n\nSchon die frühesten Zeugnisse aus der Geschichte der Artistik zeigen Frauen, die über Schwerter springen und auf Händen gehen. Turmseil-Läuferinnen und kettensprengende Kraftartistinnen traten seit jeher auf Jahrmärkten auf, und als der Kampf um das Frauenwahlrecht begann, gaben die Frauen der Manege ein Beispiel für Wagemut, Kraft und Geschicklichkeit. Mit Tattersälen, Menagerien, festen Zirkuspalästen und reisenden Zeltzirkussen begann die moderne Massenunterhaltung, und viele dieser großen Unternehmen wurden von Prinzipalinnen oder Direktorinnen geführt. Bis in die Gegenwart hinein verfolgt diese 'Lange Nacht', wie Frauen im Zirkus hart arbeiten, viel riskieren und manchmal die Freiheit für ungewöhnliche Lebensentwürfe finden. Frauen aus der Generation der Kriegskinder erzählen, wie sie nach dem Zweiten Weltkrieg im Zirkus einen Neuanfang wagten. Und junge Artistinnen berichten von ihrer Suche nach einem neuen Zirkus, der tanzend von großen Gefühlen erzählt und dabei immer noch nach Sägemehl riecht.\n\n01:00 Nachrichten\n\n02:00 Nachrichten", *bc.Description, "ouch: Description") assert.Nil(t, bc.Image, "ouch: Image") assert.Equal(t, "http://www.deutschlandradiokultur.de/", *bc.Publisher, "Publisher") assert.Nil(t, bc.Creator, "Creator") assert.Nil(t, bc.Copyright, "Copyright") }
func (s *station) newTimeURL(relUrl string) (ret r.TimeURL, err error) { m := urlDayRegExp.FindStringSubmatch(relUrl) if nil == m { err = errors.New("Couldn't match regexp on " + relUrl + "") return } dayStr := m[1] day, err := time.ParseInLocation("2006-01-02 15:04", dayStr+" "+s.CloseDown, s.TimeZone) if nil != err { return } ru, _ := url.Parse(relUrl) programURL := *s.ProgramURL.ResolveReference(ru) ret = r.TimeURL{Time: day, Source: programURL, Station: r.Station(*s)} if "" == ret.Station.Identifier { panic("How can the identifier miss?") } // fmt.Fprintf(os.Stderr, " t %s %s\n", ret.Time.Format(time.RFC3339), ret.Source.String()) return }
func TestParseBroadcast_1(t *testing.T) { f, err := os.Open("testdata/2015-10-21T1005-b2-sendung.html") assert.NotNil(t, f, "ouch") assert.Nil(t, err, "ouch") s := Station("b2") t0 := broadcastURL{ TimeURL: r.TimeURL{ Time: time.Date(2015, time.October, 21, 10, 5, 0, 0, localLoc), Source: *r.MustParseURL("http://www.br.de/radio/bayern2/programmkalender/ausstrahlung-472576.html"), Station: r.Station(*s), }, Title: "Notizbuch", } // http://rec.mro.name/stations/b2/2015/10/21/1005%20Notizbuch bcs, err := t0.parseBroadcastReader(f, nil) assert.Nil(t, err, "ouch") assert.Equal(t, 1, len(bcs), "ouch") bc := bcs[0] assert.Equal(t, "b2", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "Notizbuch", bc.Title, "ouch: Title") assert.Equal(t, "http://www.br.de/radio/bayern2/programmkalender/ausstrahlung-472576.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.Nil(t, bc.TitleSeries, "ouch: TitleSeries") assert.Equal(t, "Kann das Warenhaus sich neu erfinden?", *bc.TitleEpisode, "ouch: TitleEpisode") assert.Equal(t, "2015-10-21T10:05:00+02:00", bc.Time.Format(time.RFC3339), "ouch: Time") assert.Equal(t, "2015-10-21T12:00:00+02:00", bc.DtEnd.Format(time.RFC3339), "ouch: DtEnd") assert.Equal(t, "http://www.br.de/radio/bayern2/gesellschaft/notizbuch/index.html", bc.Subject.String(), "ouch: Subject") assert.Equal(t, "2015-10-22T00:06:25+02: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, "Niedrigzinsen:\nPfandhäuser haben Hochkonjuktur trotz Niedrigzinsen /\nWo legen Sie ihr Geld an und wieviel Zinsen bekommen Sie dafür? /\nEin bisschen Risiko muss sein? Wie Anbieter für Produkte werben /\n\nNah dran:\n\"Alles unter einem Dach\" - Kann das Warenhaus sich neu erfinden? /\n\nMünzen:\nBrauchen wir noch Ein- und Zwei-Cent-Münzen? /\nSammler unter sich - Zu Besuch auf der Numismatika, Berlin /\nGehortet - Was tun mit dem Rotgeld, das Zuhause liegt? /\n\nNotizbuch Service:\nWenn der Postmann gar nicht klingelt -\nWas tun mit Briefen, die falsch zugestellt wurden? /\n\nLangsam Essen für Kinder:\nSlow Food stellt ein Kochbuch für Kinder vor - Kann sich das jeder leisten? /\n\nKurz vor 12:\nGlosse: Konsumverzicht\n\nModeration: Christine Bergmann\n11.00 Nachrichten, Wetter\n11.56 Werbung\nAusgewählte Beiträge als Podcast verfügbar\n\nNah dran: \"Alles unter einem Dach\" - Kann das Warenhaus sich neu erfinden?\n\nKarstadt, Wertheim, Tietz - diese Warenhäuser setzten einst unsere Großmütter in helle Erregung. Vom \"Paradies der Damen\" war die Rede - aber natürlich kamen auch die Herren auf ihre Kosten. In den für damalige Zeiten riesigen Verkaufsflächen gab es, wie ein Werbeslogan versprach \"tausendfach alles unter einem Dach\". Doch dann kamen die Möbelhäuser, die Elektronikfachmärkte, die Supermärkte im Gewerbegebiet und die riesigen Einkaufszentren. Nicht zuletzt macht das Internet dem stationären Einzelhandel Konkurrenz. Die Kunden kaufen überall - nur nicht mehr im Warenhaus. Hertie ist pleite, Karstadt kämpft ums Überleben. Kaufhof wurde jüngst an eine kanadische Kette verkauft. Hat das zentrumsnahe Kaufhaus heute noch eine Chance? Wie können Warenhäuser wieder mehr Kunden anlocken? Unterschiedliche Konzepte werden ausprobiert - Ralf Schmidberger hat sie unter die Lupe genommen.", *bc.Description, "ouch: Description") assert.NotNil(t, bc.Image.String(), "ouch: Image") assert.Equal(t, "http://www.br.de/layout/img/programmfahne/sendungsbild128~_v-img__16__9__m_-4423061158a17f4152aef84861ed0243214ae6e7.jpg?version=d2b9d", bc.Image.String(), "ouch: Image") }
func TestParseBroadcastUntilMidnight(t *testing.T) { f, err := os.Open("testdata/2015-10-21T2305-b2-sendung.html") assert.NotNil(t, f, "ouch") assert.Nil(t, err, "ouch") s := Station("b2") t0 := broadcastURL{ TimeURL: r.TimeURL{ Time: time.Date(2015, time.October, 21, 23, 5, 0, 0, localLoc), Source: *r.MustParseURL("http://www.br.de/radio/bayern2/programmkalender/ausstrahlung-472628.html"), Station: r.Station(*s), }, Title: "Nachtmix", } // http://rec.mro.name/stations/b2/2015/10/21/2305%20Nachtmix bcs, err := t0.parseBroadcastReader(f, nil) assert.Nil(t, err, "ouch") assert.Equal(t, 1, len(bcs), "ouch") bc := bcs[0] assert.Equal(t, "b2", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "Nachtmix", bc.Title, "ouch: Title") assert.Equal(t, "http://www.br.de/radio/bayern2/programmkalender/ausstrahlung-472628.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.Nil(t, bc.TitleSeries, "ouch: TitleSeries") assert.Equal(t, "Die Akustik-Avantgarde", *bc.TitleEpisode, "ouch: TitleEpisode") assert.Equal(t, "2015-10-21T23:05:00+02:00", bc.Time.Format(time.RFC3339), "ouch: Time") assert.Equal(t, "2015-10-22T00:00:00+02:00", bc.DtEnd.Format(time.RFC3339), "ouch: DtEnd") assert.Equal(t, "http://www.br.de/radio/bayern2/musik/nachtmix/index.html", bc.Subject.String(), "ouch: Subject") assert.Equal(t, "2015-10-20T13:05:12+02: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, "Die Akustik-Avantgarde\nMusik von Joanna Newsom, Andrew Bird und Devendra Banhart\nMit Michael Bartlewski\n\nJoanna Newsom ist ziemlich einzigartig: Ihre Stimme ist piepsig, ihre Songs können gerne mal acht Minuten sein und dann spielt sie auch noch Harfe. Nicht die besten Voraussetzungen für eine Pop-Karriere. Joanna Newsom hat es trotzdem geschafft - wir blicken auf ihre einmalige Geschichte zurück. Die Harfe bezeichnet Joanna Newsom als Erweiterung ihres Körpers, im Nachtmix gibt es noch mehr Musik von Virtuosen, die die Pop-Welt mit ihren kauzigen, besonders instrumentierten Songs bereichern. Andrew Bird ist der loopende Violinist, Devendra Banhart bleibt wohl immer ein Hippie, und für CocoRosie kann auch auf dem neuen Album alles ein Instrument sein. Dazu: Alela Diane mit klassischen Folk-Klängen und Helado Negro verzaubert mit Zeitlupen-Disco.", *bc.Description, "ouch: Description") assert.NotNil(t, bc.Image.String(), "ouch: Image") assert.Equal(t, "http://www.br.de/radio/bayern2/musik/nachtmix/nachtmix-ondemand-nachhoeren-104~_v-img__16__9__m_-4423061158a17f4152aef84861ed0243214ae6e7.png?version=570b1", bc.Image.String(), "ouch: Image") }
func TestParseBroadcastDescriptionWhitespace(t *testing.T) { f, err := os.Open("testdata/2015-11-15T0900-b2-sendung.html") assert.NotNil(t, f, "ouch") assert.Nil(t, err, "ouch") s := Station("b2") t0 := broadcastURL{ TimeURL: r.TimeURL{ Time: time.Date(2015, time.November, 11, 15, 9, 0, 0, localLoc), Source: *r.MustParseURL("http://www.br.de/radio/bayern2/programmkalender/ausstrahlung-497000.html"), Station: r.Station(*s), }, Title: "Nachrichten, Wetter", } // http://rec.mro.name/stations/b2/2015/11/15/0900%20Nachrichten%2c%20Wetter.xml bcs, err := t0.parseBroadcastReader(f, nil) assert.Nil(t, err, "ouch") assert.Equal(t, 1, len(bcs), "ouch") bc := bcs[0] assert.Equal(t, "b2", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "Die aktuellen Nachrichten des Bayerischen Rundfunks - auch hier auf BR.de zum Nachlesen.", *bc.Description, "ouch: Description") }
func TestParseBroadcasts(t *testing.T) { f, err := os.Open("testdata/2015-10-25-dlf-programm.html") assert.NotNil(t, f, "ouch") assert.Nil(t, err, "ouch") s := Station("dlf") u := timeURL(r.TimeURL{ Time: time.Date(2015, time.October, 25, 0, 0, 0, 0, s.TimeZone), Source: *r.MustParseURL("http://www.deutschlandfunk.de/programmvorschau.281.de.html?cal:month=10&drbm:date=25.10.2015"), Station: r.Station(*s), }) bcs, err := u.parseBroadcastsFromReader(f, nil) assert.NotNil(t, bcs, "ouch") assert.Nil(t, err, "ouch") assert.Equal(t, 46, len(bcs), "ouch") bc := bcs[0] assert.Nil(t, err, "ouch") assert.Equal(t, "dlf", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "Nachrichten", bc.Title, "ouch: Title") assert.Equal(t, "http://www.deutschlandfunk.de/programmvorschau.281.de.html?cal:month=10&drbm:date=25.10.2015#0000", bc.Source.String(), "ouch: Source") assert.NotNil(t, bc.Language, "ouch: Language") assert.Equal(t, "de", *bc.Language, "ouch: Language") assert.Equal(t, bc.Title, bc.Title, "ouch: Title") assert.Nil(t, bc.TitleSeries, "ouch: TitleSeries") assert.Nil(t, bc.TitleEpisode, "ouch: TitleEpisode") assert.Equal(t, "2015-10-25T00:00:00+02:00", bc.Time.Format(time.RFC3339), "ouch: Time") assert.NotNil(t, bc.DtEnd, "ouch: DtEnd") assert.Equal(t, "2015-10-25T00:05:00+02:00", bc.DtEnd.Format(time.RFC3339), "ouch: DtEnd") assert.Equal(t, 300*time.Second, bc.DtEnd.Sub(bc.Time), "ouch: Duration") assert.NotNil(t, bc.Subject, "ouch: Subject") assert.Equal(t, "http://www.deutschlandfunk.de/die-nachrichten.353.de.html", bc.Subject.String(), "ouch: Subject") assert.Nil(t, bc.Modified, "ouch: Modified") assert.Nil(t, bc.Author, "ouch: Author") assert.NotNil(t, bc.Description, "ouch: Description") assert.Equal(t, "", *bc.Description, "ouch: Description") assert.Nil(t, bc.Image, "ouch: Image") assert.Equal(t, "http://www.deutschlandfunk.de/", *bc.Publisher, "Publisher") assert.Nil(t, bc.Creator, "Creator") assert.Nil(t, bc.Copyright, "Copyright") bc = bcs[3] assert.Nil(t, err, "ouch") assert.Equal(t, "dlf", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "Deutschlandfunk Radionacht", bc.Title, "ouch: Title") assert.Equal(t, "http://www.deutschlandfunk.de/programmvorschau.281.de.html?cal:month=10&drbm:date=25.10.2015#0205", bc.Source.String(), "ouch: Source") assert.NotNil(t, bc.Language, "ouch: Language") assert.Equal(t, "de", *bc.Language, "ouch: Language") assert.Equal(t, bc.Title, bc.Title, "ouch: Title") assert.Nil(t, bc.TitleSeries, "ouch: TitleSeries") assert.Nil(t, bc.TitleEpisode, "ouch: TitleEpisode") assert.Equal(t, "2015-10-25T02:05:00+01:00", bc.Time.Format(time.RFC3339), "ouch: Time") assert.Equal(t, "2015-10-25T06:00:00+01:00", bc.DtEnd.Format(time.RFC3339), "ouch: DtEnd") assert.Equal(t, 14100*time.Second, bc.DtEnd.Sub(bc.Time), "ouch: Duration") assert.NotNil(t, bc.Subject, "ouch: Subject") assert.Equal(t, "http://www.deutschlandfunk.de/deutschlandfunk-radionacht.1746.de.html", bc.Subject.String(), "ouch: Subject") assert.Nil(t, bc.Modified, "ouch: Modified") assert.Nil(t, bc.Author, "ouch: Author") assert.NotNil(t, bc.Description, "ouch: Description") assert.Equal(t, "02:05 Sternzeit\n\n02:07 Konzertmomente\n\nLudwig van Beethoven\nKonzert für Klavier und Orchester Nr. 5 Es-Dur, op. 73\nAcademy of St. Martin-in-the-Fields\nLeitung: Murray Perahia\n\n03:00 Nachrichten\n\n03:05 Schlüsselwerke\n\nDmitri Schostakowitsch\nStreichquartett Nr. 14, Fis-Dur, op. 142\nBorodin-Quartett\n\n03:55 Kalenderblatt\n\n04:00 Nachrichten\n\n04:05 Die neue Platte XL\n\nAlte Musik\n\n05:00 Nachrichten\n\n05:05 Auftakt", *bc.Description, "ouch: Description") assert.Nil(t, bc.Image, "ouch: Image") assert.Equal(t, "http://www.deutschlandfunk.de/", *bc.Publisher, "Publisher") assert.Nil(t, bc.Creator, "Creator") assert.Nil(t, bc.Copyright, "Copyright") }
func TestParseBroadcasts_1(t *testing.T) { f, err := os.Open("testdata/2015-11-14-m945-programm.html") assert.NotNil(t, f, "ouch") assert.Nil(t, err, "ouch") s := Station("m945") u := timeURL(r.TimeURL{ Time: time.Date(2015, time.November, 14, 0, 0, 0, 0, s.TimeZone), Source: *r.MustParseURL("http://www.m945.de/programm/?daterequest=2015-11-14"), Station: r.Station(*s), }) bcs, err := u.parseBroadcastsFromReader(f, nil) assert.NotNil(t, bcs, "ouch") assert.Nil(t, err, "ouch") assert.Equal(t, 10, len(bcs), "ouch") assert.Equal(t, "Black Box: HipHop", bcs[0].Title, "ouch: Title") assert.Equal(t, "Musik 01:00-09:00", bcs[1].Title, "ouch: Title") assert.Equal(t, "Hörbar²", bcs[2].Title, "ouch: Title") assert.Equal(t, "Katerfrühstück", bcs[3].Title, "ouch: Title") assert.Equal(t, "K13", bcs[4].Title, "ouch: Title") assert.Equal(t, "Musik 14:00-18:00", bcs[5].Title, "ouch: Title") assert.Equal(t, "Störfunk", bcs[6].Title, "ouch: Title") assert.Equal(t, "Kanalratten", bcs[7].Title, "ouch: Title") assert.Equal(t, "Spurensuche", bcs[8].Title, "ouch: Title") assert.Equal(t, "Musik 22:00-00:00", bcs[9].Title, "ouch: Title") bc := bcs[1] assert.Nil(t, err, "ouch") assert.Equal(t, "m945", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "Musik 01:00-09:00", bc.Title, "ouch: Title") assert.Equal(t, "http://www.m945.de/programm/?daterequest=2015-11-14", bc.Source.String(), "ouch: Source") assert.NotNil(t, bc.Language, "ouch: Language") assert.Equal(t, "de", *bc.Language, "ouch: Language") assert.Equal(t, "Musik 01:00-09:00", bc.Title, "ouch: Title") assert.Nil(t, bc.TitleSeries, "ouch: TitleSeries") assert.Nil(t, bc.TitleEpisode, "ouch: TitleEpisode") assert.Equal(t, "2015-11-14T01:00:00+01:00", bc.Time.Format(time.RFC3339), "ouch: Time") assert.Equal(t, "2015-11-14T09:00:00+01:00", bc.DtEnd.Format(time.RFC3339), "ouch: DtEnd") assert.Equal(t, 480*time.Minute, bc.DtEnd.Sub(bc.Time), "ouch: Duration") assert.Nil(t, bc.Subject, "ouch: Subject") assert.Nil(t, bc.Modified, "ouch: Modified") assert.Nil(t, bc.Author, "ouch: Author") assert.NotNil(t, bc.Description, "ouch: Description") assert.Equal(t, "", *bc.Description, "ouch: Description") assert.Nil(t, bc.Image, "ouch: Image") assert.Equal(t, "http://www.m945.de/", *bc.Publisher, "Publisher") assert.Nil(t, bc.Creator, "Creator") assert.Nil(t, bc.Copyright, "Copyright") bc = bcs[2] assert.Equal(t, "m945", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "Hörbar²", bc.Title, "ouch: Title") assert.Equal(t, "http://www.m945.de/programm/?daterequest=2015-11-14", bc.Source.String(), "ouch: Source") assert.NotNil(t, bc.Language, "ouch: Language") assert.Equal(t, "de", *bc.Language, "ouch: Language") assert.Equal(t, "Hörbar²", bc.Title, "ouch: Title") assert.Nil(t, bc.TitleSeries, "ouch: TitleSeries") assert.Nil(t, bc.TitleEpisode, "ouch: TitleEpisode") assert.Equal(t, "2015-11-14T09:00:00+01:00", bc.Time.Format(time.RFC3339), "ouch: Time") assert.Equal(t, "2015-11-14T11:00:00+01:00", bc.DtEnd.Format(time.RFC3339), "ouch: DtEnd") assert.Equal(t, 120*time.Minute, bc.DtEnd.Sub(bc.Time), "ouch: Duration") assert.Nil(t, bc.Subject, "ouch: Subject") // assert.Equal(t, "http://www.m945.de/content/hoerbar_am_vormittag.html", bc.Subject.String(), "ouch: Subject") assert.Nil(t, bc.Modified, "ouch: Modified") assert.Nil(t, bc.Author, "ouch: Author") assert.NotNil(t, bc.Description, "ouch: Description") assert.Equal(t, "Moderation: Severin Schenkel", *bc.Description, "ouch: Description") assert.Nil(t, bc.Image, "ouch: Image") assert.Equal(t, "http://www.m945.de/", *bc.Publisher, "Publisher") assert.Nil(t, bc.Creator, "Creator") assert.Nil(t, bc.Copyright, "Copyright") bc = bcs[3] assert.NotNil(t, bc.Subject, "ouch: Subject") assert.Equal(t, "http://www.m945.de/content/katerfruhstuck.html", bc.Subject.String(), "ouch: Subject") }
func TestParseBroadcasts(t *testing.T) { f, err := os.Open("testdata/2016-03-05-radiofabrik-programm.html") assert.NotNil(t, f, "ouch") assert.Nil(t, err, "ouch") s := Station("radiofabrik") u := timeURL(r.TimeURL{ Time: time.Date(2016, time.March, 5, 0, 0, 0, 0, s.TimeZone), Source: *r.MustParseURL("http://www.radiofabrik.at/programm0/tagesprogramm.html?foo=bar&si_day=05&si_month=03&si_year=2016"), Station: r.Station(*s), }) bcs, err := u.parseBroadcastsFromReader(f) assert.NotNil(t, bcs, "ouch") assert.Nil(t, err, "ouch") assert.Equal(t, 28, len(bcs), "ouch") bc := bcs[0] assert.Nil(t, err, "ouch") assert.Equal(t, "radiofabrik", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "My Favourite Music. With David Hubble", bc.Title, "ouch: Title") assert.Equal(t, "http://www.radiofabrik.at/programm0/tagesprogramm.html?foo=bar&si_day=05&si_month=03&si_year=2016", bc.Source.String(), "ouch: Source") assert.NotNil(t, bc.Language, "ouch: Language") assert.Equal(t, "de", *bc.Language, "ouch: Language") assert.Equal(t, bc.Title, bc.Title, "ouch: Title") assert.Nil(t, bc.TitleSeries, "ouch: TitleSeries") assert.Nil(t, bc.TitleEpisode, "ouch: TitleEpisode") assert.Equal(t, "2016-03-05T01:00:00+01:00", bc.Time.Format(time.RFC3339), "ouch: Time") assert.NotNil(t, bc.DtEnd, "ouch: DtEnd") assert.Equal(t, "2016-03-05T02:00:00+01:00", bc.DtEnd.Format(time.RFC3339), "ouch: DtEnd") assert.Equal(t, 3600*time.Second, bc.DtEnd.Sub(bc.Time), "ouch: Duration") assert.NotNil(t, bc.Subject, "ouch: Subject") assert.Equal(t, "http://www.radiofabrik.at/index.php?id=345", bc.Subject.String(), "ouch: Subject") assert.Nil(t, bc.Modified, "ouch: Modified") assert.Nil(t, bc.Author, "ouch: Author") assert.NotNil(t, bc.Description, "ouch: Description") assert.Equal(t, "", *bc.Description, "ouch: Description") assert.Nil(t, bc.Image, "ouch: Image") assert.Equal(t, "http://www.radiofabrik.at/", *bc.Publisher, "Publisher") assert.Nil(t, bc.Creator, "Creator") assert.Nil(t, bc.Copyright, "Copyright") bc = bcs[27] assert.Nil(t, err, "ouch") assert.Equal(t, "radiofabrik", bc.Station.Identifier, "ouch: Station.Identifier") assert.Equal(t, "Night Shift Radio - Musik - damit die Glotze ausbleibt", bc.Title, "ouch: Title") assert.Equal(t, "http://www.radiofabrik.at/programm0/tagesprogramm.html?foo=bar&si_day=05&si_month=03&si_year=2016", bc.Source.String(), "ouch: Source") assert.NotNil(t, bc.Language, "ouch: Language") assert.Equal(t, "de", *bc.Language, "ouch: Language") assert.Equal(t, bc.Title, bc.Title, "ouch: Title") assert.Nil(t, bc.TitleSeries, "ouch: TitleSeries") assert.Nil(t, bc.TitleEpisode, "ouch: TitleEpisode") assert.Equal(t, "2016-03-05T22:00:00+01:00", bc.Time.Format(time.RFC3339), "ouch: Time") assert.Equal(t, "2016-03-06T00:00:00+01:00", bc.DtEnd.Format(time.RFC3339), "ouch: DtEnd") assert.Equal(t, 7200*time.Second, bc.DtEnd.Sub(bc.Time), "ouch: Duration") assert.NotNil(t, bc.Subject, "ouch: Subject") assert.Equal(t, "http://www.radiofabrik.at/programm0/sendungenvona-z/night-shift-radio.html", bc.Subject.String(), "ouch: Subject") assert.Nil(t, bc.Modified, "ouch: Modified") assert.Nil(t, bc.Author, "ouch: Author") assert.NotNil(t, bc.Description, "ouch: Description") assert.Equal(t, "", *bc.Description, "ouch: Description") assert.Nil(t, bc.Image, "ouch: Image") assert.Equal(t, "http://www.radiofabrik.at/", *bc.Publisher, "Publisher") assert.Nil(t, bc.Creator, "Creator") assert.Nil(t, bc.Copyright, "Copyright") }