~~SLIDESHOW~~ ----- Diese Wiki Seite sieht etwas verhagelt aus, da sie in erster Linie im Präsentationsmodus funktionieren muß. = Radio × Pi [[http://de.wikipedia.org/wiki/Podcast|{{http://images.apple.com/de/itunes/podcasts/images/podcaststips_icon20070905.jpg?40x40|© apple.com}}]] := [[http://br.de/radio/|{{http://www.br.de/static/img/logo/logo_home.png?51x40|© br.de}}]] + [[http://www.raspberrypi.org|{{http://www.raspberrypi.org/img/sprite.png?173x40|© raspberrypi.org}}]] + [[http://www.lua.org/manual/5.1/|{{http://www.lua.org/images/logo.gif?40x40|© lua.org}}]] + [[http://www.rubycentral.com/pickaxe/|{{http://www.ruby-lang.org/images/logo.gif?111x40|© ruby-lang.org}}]] + [[http://streamripper.sourceforge.net/about.php|{{http://streamripper.sourceforge.net/images/streamripperlogo.png?190x30|© streamripper.org}}]] + [[http://www.lighttpd.net|{{http://www.lighttpd.net/light_logo_170px.png?40x40|© lighttpd.net}}]] Radio Rekorder mit lua,ruby,lighttpd,cron,streamripper auf einem Raspberry Pi. //Vortrag am 14. Februar 2013// == Motivation: RSS Feeds meiner Lieblingssendungen * [[http://de.wikipedia.org/wiki/Z%C3%BCndfunk|Zündfunk]] {{http://www.br.de/static/img/bereich/radio/bayern2/zuendfunk/zuendfunk_logo.png}} * [[http://www.br.de/radio/bayern2/sendungen/hoerspiel-und-medienkunst/radiokrimi102.html|B2 Radiokrimi]] {{http://www.br.de/layout/img/programmfahne/sendungsbild_radiokrimi100~_v-image256_-a42a29b6703dc477fd0848bc845b8be5c48c1667.jpg}} * [[http://www.m945.de/sendung/break-beat-action.html/|break beat action]] {{http://www.drumnbass-munich.de/images/bba-logo.gif}} == Amuse-Gueule * [[https://github.com/mro/radio-pi/blob/develop/INSTALL.sh|Installation in 3min]] == Scrape B2: Sendungsinfos {{ :cocoaheads:br-kalender.png?200}} * [[https://github.com/mro/radio-pi/blob/develop/htdocs/app/scraper-br.rb|BR Scraper (nokogiri/ruby)]] * [[http://www.br.de/radio/bayern2/programmkalender/programmfahne102.html|Kalender]] * Sendezeiten * Sendungstexte + Bild * zum Schluß: ''meta'' nach stdout und ''[[https://github.com/mro/radio-pi/blob/develop/htdocs/app/broadcast-render.lua|broadcast-render.lua]]'' pipen! ----- {{http://www.ruby-lang.org/images/logo.gif}} == Storage: noDB, nur statische html Seiten * pro Sendung eine html Datei, * Filesystem == Website == Datenbank * Dateinamen ''yyyy/mm/dd/HHMM abc.html'' * [[https://github.com/mro/radio-pi/blob/develop/htdocs/app/pbmi2003-recmod2012/broadcast.rnc|''meta'' Tags]] angelehnt an [[http://dcpapers.dublincore.org/pubs/article/view/749|Dublin Core PBMI]] ---- {{http://www.lua.org/images/logo.gif}} == Render + parse simple xhtml * [[http://rec.domus.mro.name/stations/b2/now|html]] ist selbst geschrieben, * also bekannt, * also einfach [[https://github.com/mro/radio-pi/blob/develop/htdocs/app/recorder.lua#L371|zu parsen]] == lua: wieso? * extrem schneller Start der Runtime * extrem sparsame Runtime (RAM) * jedes Jahr eine neue Sprache ;-) == lua: wie sieht das aus? * [[http://lua-users.org/wiki/LuaFourOneGrammar|lua BNF]] * Beispiel: [[https://github.com/mro/radio-pi/blob/develop/htdocs/app/broadcast-render.lua#L74|broadcast-render.lua]] * Beispiel: [[https://github.com/mro/radio-pi/blob/develop/htdocs/app/recorder.lua#L634|broadcast_from_file]] == lua: pattern matching * [[http://www.lua.org/pil/20.2.html|lua patterns]], regexp auf Diät * [[http://www.inf.puc-rio.br/~roberto/lpeg/#ex|LPEG]] * 'richtige' Regexp als [[http://www.inf.puc-rio.br/~roberto/lpeg/re.html#ex|LPEG 'Modul']] == lua: html template engine wie fast immer bei lua keine 'offizielle', aber * [[https://github.com/henix/slt2|slt2]] * Beispiel: [[https://github.com/mro/radio-pi/blob/develop/htdocs/app/broadcast.slt2.html|broadcast.slt2.html]] * Beispiel: [[https://github.com/mro/radio-pi/blob/develop/htdocs/app/recorder.lua#L448|broadcast_to_html]] == lua: war's das? Bei weitem nicht: * Metatables * OOP * Functional * C bridge. Beispiel: [[https://github.com/mro/radio-pi/blob/develop/htdocs/app/msleep.c|msleep]] == Publish: lighttpd * cgi * redirects * http digest auth (mp3/[[http://de.wikipedia.org/wiki/Privatkopie|Privatkopie]]) ----- {{http://www.lighttpd.net/light_logo_170px.png}} == Rip * streamripper * [[https://github.com/mro/radio-pi/blob/develop/htdocs/app/enclosure-rip.lua|enclosure-rip.lua]] * [[https://github.com/mro/radio-pi/blob/develop/htdocs/app/streamripper-injector.lua|streamripper-injector.lua]] * taglib (wieder per ruby) ----- {{http://streamripper.sourceforge.net/images/streamripperlogo.png}} == Probleme * lausiger I/O Durchsatz zur USB Platte (vielleicht mach ich auch was falsch) == Vielen Dank {{ http://www.cocoaheads.org/dev/cocoahead_sm2.png}} für Eure Aufmerksamkeit. Feedback willkommmen an [[work@mro.name?subject=Cocoaheads Vortrag: Radio Pi|Marcus Rohrmoser]] Die Folien zum Nachlesen gibt's hier: {{http://chart.apis.google.com/chart?cht=qr&chs=150x150&chl=http://mro.name/pi&f=a.png?200|}} oder http://wiki.mro.name/cocoaheads/ ------ {{tag> Vortrag CocoaHeads Raspi Radio Recorder}}