Subtitling

Wie funktioniert der Download bei FLubtitles

Da es seit kurzem endlich asciio in den Debian Repos gibt, dachte ich, ich probiere das gleich mal aus. Ich hatte letztens auf meinem Whiteboard mal verschiedene Workflows angezeichnet, wie bei FLubtitles z.B. der Download funktioniert. Erstmal die Grafik und weiter unten eine kurze Erläuterung.

                                DownloadSubtitles()
 
 
 
           Client                                           Server
 
 
 
 
                                                          .---------.
                                                          | CouchDB |
                                                          '---------'
                                                             ^   |
                                                             |   |
                                       transparent gzip      |   |
                                       compress/decompress   |   |
                                                             |   |
                                                             |   v
      .--------------.                                  .------------.
      | Subtitle.srt |                                  | FLubtitles |
      '--------------'                                  '------------'
              ^                                                |
              |                                                |
              |                                                v
      zlib.decompress()                                 zlib.compress()
              ^                                                |
              |                                                |
              |                                                v
     base64.b64decode()                               base64.b64encode()
              ^                                                |
              |                   .----------.                 |
              '-------------------| JSON-RPC |<----------------'
                                  '----------'

  1. Der Client ruft via JSON-RPC die Methode DownloadSubtitles() auf mit der Angabe, welche er denn haben will
  2. Diese(n) holt sich FLubtitles daraufhin via HTTP Request aus der CouchDB Datenbank. Da das Modul couchdbkit im HTTP Header nicht "Accept-Encoding: gzip,deflate" angibt, übernimmt CouchDB die Dekompression. Ansonsten würde man die Daten in komprimierter Form bekommen.
  3. Als nächstes werden die Daten zuerst mit zlib komprimiert und dann mit Base64 auf ihre Transfer-Reise vorbereitet.
  4. Der Client macht das genauso, jedoch in umgekehrter Reihenfolge.
  5. Danach kann der Client den Text in eine Datei schreiben und so hat er seinen Untertitel erhalten.

Logging mit Python

Die API für FLubtitles kommt voran. Heute kam rudimentäre Logging Funktionalität dazu. Wie immer mit Python, geht das ziemlich einfach. Hier ein Beispiel:

Das FLubtitles Logging Modul

  • logger.py

import logging
from   logging.handlers import SysLogHandler
 
log     = logging.getLogger('flubtitles')
handler = SysLogHandler(address='/dev/log')
 
formatter = logging.Formatter("%(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
 
log.addHandler(handler)
log.setLevel(logging.INFO)

Benutzt wird es wie folgt:

import logger
 
user1 = 'foo@spam.xxx'
user2 = 'fana@flubtitles.org'
user3 = 'flubtitles@world-domination.org'
 
logger.log.warning('SignUp: <%s> does not match our policies', user1)
logger.log.error('SignUp: The user <%s> already exists', user2)
logger.log.info('SignUp: New User <%s> created', user3)

Und so sieht es dann in /var/log/syslog aus:

Feb 13 20:08:13 flubtitles - WARNING - SignUp: <foo@spam.xxx> does not match our policies
Feb 13 20:08:13 flubtitles - ERROR - SignUp: The user <fana@flubtitles.org> already exists
Feb 13 20:08:13 flubtitles - INFO - SignUp: New User <flubtitles@world-domination.org> created

JSON-RPC statt XML-RPC

Aktuell bin ich wieder etwas aktiver, was die API Implementierung betrifft. Im ersten Wurf hab ich Django als XML-RPC Dispatcher benutzt aber jetzt dann durch wsgi-xmlrpc ersetzt, da ich zuviel Overhead und unnötige Abhängigkeiten vermeiden will. Als schlanken Ersatz nutze ich jetzt das Bottle Framework. Nachdem ich damit auch recht flott Validierungen via HTTP hinzaubern konnte, machte ich mich an die Implementierung einer Registrierungsmethode für neue Benutzer in XML-RPC. Nachdem der Code fertig war zum Testen, wollte es einfach nicht funktionieren und ich wusste nicht warum.

Dieser XML-RPC Request

rpc_srv.SignUp(email = "user@domain.com", password = "password")

schlug immer fehl:

TypeError: __call__() got an unexpected keyword argument 'password'

Nachlesen in der Python Doku, wie man keyword arguments bei Methoden benutzt, brachte keine Hinweise. Sah alles korrekt aus. Kann es sein, dass XML-RPC das nicht unterstützt? Als ich Google diese Frage stellte, bekam ich die Antwort. Ja, leider:

You can't do this with plain xmlrpc since it has no notion of keyword arguments.
However, you can superimpose this as a protocol on top of xmlrpc
that would always pass a list as first argument, and a dictionary as a second,
and then provide the proper support code so this becomes transparent for your usage

Dort wird zwar beschrieben, wie man sich behelfen kann durch Methoden Überschreibung etc... aber ab da hat es mir schon wieder in den Fingern gejuckt, doch lieber nach einer Alternative zu suchen. Und siehe da:

Das trifft sich gut, denn in CouchDB ist ja auch alles in JSON. Einen WSGI Adapter und Python Bibliothek, die mit den Keyword Argumenten umgehen kann gibt es auch schon. Den Code umbauen hat gerade mal 10 Minuten gedauert. Und jetzt funktioniert es auch :-)

Film-Untertitel helfen beim Sprachenlernen

...so lautet der Titel eines aktuellen Spiegel Berichtes:

Ähnliches hatte ich mal unter Untertitel - Eine unterschätzte Lernmöglichkeit für Fremdsprachen beschrieben.

Bei dem Spiegel Artikel musste ich jedoch bei folgendem Satz schmunzeln:

Noch größer ist der Effekt, wenn man auch die englischen Untertitel einblendet,
wie Forscher jetzt herausgefunden haben.

Forscher... tss... Das hätte ich denen auch sagen können :-)

VIM Syntax Highlighting für textbasierte Untertitel Formate

Als ich gestern mit dem Syntax Highlighting für Puppet rumgespielt habe, kam mir eine Idee. Warum nicht selbst so ein Syntax File für die gängigen Untertitel Formate machen, wie z.B. der de-facto Standard SubRip? Vorher aber sicherheitshalber Google gefragt, ob nicht vielleicht schon jemand sich die Arbeit gemacht hat. Und tatsächlich... Zuerst enttäuscht, dann aber doch froh darüber, dass mir jemand diese Arbeit erspart hat. Auf der Seite http://www.linuxpages.org/projects_en.php findet man VIM Syntax Files für die Formate SubRip, mpsub (MPlayer Untertitel Format) und MicroDVD (ja, das ist u.a. ein Untertitel Format).

Danke Josip! So macht Untertitel Bearbeitung auch in der Console Spaß...

An einem Beispiel zeige ich, wie man das Syntax File für SubRip (.srt) einrichtet:

srt.vim

  • sudo -s
  • cd /etc/vim
  • mkdir syntax
  • mkdir ftdetect
  • cd /etc/vim/syntax
  • wget http://www.linuxpages.org/download/srt.vim-1.0.tar.gz
  • tar xzvf srt.vim-1.0.tar.gz
  • mv /etc/vim/syntax/srt.vim-1.0/srt.vim /etc/vim/syntax/
  • cd /etc/vim/ftdetect/
  • echo 'au BufNewFile,BufRead *.srt setf srt' > srt.vim

Aufräumen

  • rm -r /etc/vim/syntax/srt.vim-1.0/
  • rm /etc/vim/syntax/srt.vim-1.0.tar.gz

Es muss der vollständige VIM installiert sein und nicht z.b. vim-tiny...

Und so sieht das dann aus. Wie man sieht, fallen einem durch das Highlighting gleich ein Zeichensatzproblem auf (die blaue 92), das man unter normalen Umständen (hier gEdit, zweites Bild) vielleicht nicht gleich gesehen hätte...


Syndicate content