Three and a half years ago I wrote The Joy of Web Development about the trouble I had embedding movies into webpages. That article is about the most popular article (for spammers :-) on this sparse blog. Now, as I’m gearing up to redo my site and take the movie pages out of self-written CMS limbo and into the 21st century (cough WordPress), I decided to revisit the way I want to publish movies and see what’s going on.

First, publishing movies on one’s own website is out. Youtube and Vimeo rule the pack, and if you’re looking for an easy way to put your family’s vacation movie online you can stop reading now and head their way. However, I’m not interested in putting my movies on someone else’s servers, partly because I’m stubborn, and partly because I don’t like my movies served with advertising.

Coincidentally, Mark Pilgrim published his Gentle Introduction to Video Encoding just about now, so head that way if you’re looking for a concise overview. These are just my observations:

  1. mp4 has won. Back in 2005 when I wrote The Joy of Web Development, the battle was between .mp4 (only playable by Quicktime back then) and Windows Media (.wmv). This old page still kind of acknowledges that battle. Flash video (.flv) was and is a strong contender but the good On2 VP6 codec is expensive and kind of hard to get.1 Plus, flash video does not integrate nicely into a Quicktime based workflow and .flv-files are basically unplayable once downloaded.

    The ubuquitous availability of iPod’s, PSP’s and other MP4-capable portable media players helped a lot, but the final nail in .wmv‘s (and .flv‘s) coffin was the decision of Adobe to put mp4 playback into Flash Player. Early versions of the mp4-capable Flash Player were too slow but as of Flash Player 10 the performance is sufficient for most computers, although Quicktime still is much faster on my old PowerMac G4.

    Bottom line: if you want to compress your movie for the web, choose .mp4 with h.264-compression and check wether it plays in Quicktime Player.2

  2. Flash has won. This may look like a contradiction with the previous observation but as an embedded player in a website, Flash technology is unbeatable (see Youtube and Vimeo and countless others). Flash has the 90%+ install base, it loads fast, is cross platform (Windows, Mac OS X and Linux) and there’s a really nice free movieplayer3 in the form of Jeroen Wijering’s JW FLV Player.
  3. Embedding movies has become even more horrible. Due to blatant patent abuse by Eolas, Internet Explorer ceased playing flash applications (and other <object>‘s) in a webpage from february 2006 until april 2008. Users had to click to activate the embedded object, but only if it was embedded directly in the page, not if the player object was programmatically inserted via JavaScript.

    This means that from then on, the best way to insert a movie is to do it by JavaScript, preferably by using something like swfobject. Luckily, swfobject hides the <object> and <embed>-mess (still not solved!) that was the source of my troubles in The Joy of Web Development. But not so luckily, swfobject brings another dependency to the table: now your viewers must not only have the right version of flash but JavaScript needs to be enabled too, and you must test for both.

    Thus, we’ve gone from this mess:

    <OBJECT CLASSID="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B"
     CODEBASE="http://www.apple.com/qtactivex/qtplugin.cab"
     HEIGHT=yy
     WIDTH=xx>
      <PARAM NAME="src" VALUE="MyMovie.mov" />
      <EMBED SRC="MyMovie.mov"
       HEIGHT=yy WIDTH=xx
       TYPE="video/quicktime"
       PLUGINSPAGE="http://www.apple.com/quicktime/download/" />
    </OBJECT>

    to this

    <html>
      <head>
        <title>My movie</title>
        <script type="text/javascript" src="swfobject.js"></script>
        <script type="text/javascript">
        swfobject.embedSWF("jwplayer.swf", "myMovieID", 512, 288 + 16, "9.0.98", false,
                           { file: "mymovie.mp4", image: "mymovie.jpg" },
                           { allowfullscreen: true });
        </script>
      </head>
      <body>
        <div id="myMovieID">
          <p>Please enable JavaScript to view my movie</p>
        </div>
      </body>
    </html>

    All of your movies need placeholders in the body and the actual movie files in the header of the page and you need id‘s to keep them all apart.4

So, what’s a man got to do? I’m not going to implement that mess in item #3. Besides, posting a video online is simple in principle: all you need is a movie file (the .mp4) and a poster file; an image that describes your movie and serves as placeholder while your viewer waits for the movie to download. So here’s what’s my markup is going to look like:

<a href="mymovie.mp4"><img src="mymovie.jpg" width="512" height="288"
   alt="Click to download my movie" /></a>

Other than that, I’ll use even more JavaScript — jQuery to the rescue — to pull out all of these .mp4-links, invent ids for swfobject and display the movie with JW FLV Player (and some more)…

  1. The bad old Sorenson 3 based flv codec is widely available but gives horrible results.
  2. I believe Quicktime is the lowest common denominator of all mp4 capable apps and players, i.e. if an mp4 plays in Quicktime it will play everywhere else. Please correct me if I’m wrong.
  3. JW FLV Player is free as in beer for strict non-commercial use only.
  4. I know you can still do static publishing but this is the recommended swfobject way. Besides, conditional html comments are evil.

Today’s Apple Keynote* sure feels like an early funeral.

I’m sure that when (not if) Steve Jobs dies, we’re all going to get three beautiful materials (horse shit, fake grass and real oak veneer) for our Keynote charts, an iPhone Memorial app (“carry your our loved ones near your heart”) and a DRM-free Beatles tune for $1.29

* I watch this stuff for theatrical value. Steve Jobs’ keynotes are among the best in the industry, whether you like Apple or not. This one feels fake from the very start and drags on and on.

Bij het bekendmaken van de prijs van de jury van de Europese competitie dacht ik even dat 2 Birds (Smáfuglar) genomineerd ging worden, maar het relaas van de jury over “een optimistische en vrolijke film over de eerste keer” ging over Love You More van Sam Taylor-Wood (UK). Heel goed gemaakt, alleen het nadrukkelijke tijdsframe is er voor mij teveel aan (of zoals Nand Buyl het zo mooi zegt in Joséphine van Joël Vanhoebrouck: “Weet je wat ik zo haat aan u? Die godverdomde nostalgie.”) Het publiek koos voor Ripple van Paul Gowers (ook UK). Ook goed gemaakt: het is de beste variant op het thema “man moet op tijd bij zijn lief zijn maar alles zit tegen” die ik tot hiertoe gezien heb.

Aan de Vlaamse kant ging Plan B van Robin Pront met zowel de juryprijs als de publieksprijs lopen. Ook goed gemaakt, alleen vind ik A Day in a Life van Nicolas Daenens, dat ook over lowlife criminals gaat die dringend aan geld moeten komen, veel beter. En aangezien ik Plan B heb gezien met Nicolas naast mij kan ik niet bepaald objectief zijn :-)

Over de rest zeg ik niets omdat competities waar ik als DKO-student niet aan mag deelnemen niet relevant zijn (u merkt daar terecht enige frustratie…) maar ik wil wel vermelden dat ik het kan begrijpen dat de mensen die de prijzen schenken niet alles kunnen zien. Desalniettemin is het vrij treurig om op een prijsuitreiking de ene na de andere meneer of mevrouw op het podium te horen bekennen dat ze geen enkele kortfilm hebben gezien.

Persoonlijk ben ik vooral blij met de 5de plaats bij de publieksprijs voor Het verhaal van de drol. Ik had al gemerkt en gehoord dat de film werkte bij het publiek, maar toch…

Voor mensen die de vijfde plaats op negentien films nogal gemiddeld vinden wil ik erop wijzen dat ik mezelf ongeveer tien percent kans gaf om überhaupt geselecteerd te raken. Ik ben dat ook heel blij dat de film werkte en niet ten onder ging aan de zee aan vage beelden en storende ruis waarover ik hier nog wil berichten…

Het kijken zit erop voor mij. De laatste blok die ik zag was qua publiek en films het leukste, maar 2 Birds (Smáfuglar) blijft de beste film die ik zag. Maar deze zijn zeker het vermelden waard:

  • Puppetboy van Johannes Nyholm (Zweden): over een obsessieve jongeman die genadeloos wordt gebruikt door een TV-reporter. Het beste stuk waren de animaties waar de obsessie en frustratie van afdroop. (Europese competitie 3)
  • Love is dead van Eric Capitaine (Frankrijk): een soort franse praatfilm, maar dan met tempo en een heel goed concept: relaties afbreken als economisch rendabele activiteit. (Europese competitie 3)
Verder heb ik nog een zweedse film gezien over anale sex (Something in the air in Scandinavia?) en moet ik nog iedereen bedanken die naar Het verhaal van de drol is komen kijken. Vanavond om 22u30 de laatste vertoning op Leuven Kort…

Na meer dan twaalf uur kortfilm op het Internationaal Kortfilmfestival Leuvende gelegenheid maakt de man — zijn een aantal kortfilms bij mij blijven hangen. Ik weet niet waarom, objectief gezien zijn ze niet allemaal de beste en alles begint zo stilaan wat doorheen te lopen.

Maar eerst nog een aantal opmerkingen: de europese competitie is over het algemeen een pak sterker dan de vlaamse (een selectie uit 2000 films tegen 200), engelse ondertiteling mag ook op Britse films want mijn kennis van Britse dialecten is heel beperkt en uiteindelijk, alle postmodernisme ten spijt, blijven de klassieke films met een beperkt aantal locaties en eenvoudige plot bij mij het best hangen.

Afin, moest ik nu (met nog een hoop sessies te gaan) een programma samenstellen zouden deze films er zeker inzitten:

  • Between Walls van Ana-Felicia Scutelnicu (Duitsland): een eenvoudig maar spannend verhaal over illegale Poolse (?) bouwvakkers in Duitsland. (Europese competitie 1)
  • 2 Birds (Smáfuglar) van Rúnar Rúnarsson (IJsland): voor mij tot hiertoe de topper van het festival. Over een angelieke jongen en het meisje van zijn dromen die op een party terechtkomen waar ze eigenlijk nog te jong voor zijn. (Europese competitie 5)
  • A Mate (Kaveri) van Teemu Nikki (Finland): kurkdroge comedy over aarsneuken. Ik moet toegeven, ik was al aan het lachen vanaf de opening met de bassist die het niet laten kan om maar wat noten te blijven spelen. (Europese competitie 5)
  • Last Farm in the Valley van Rúnar Rúnarsson (IJsland): eenvoudig verhaal over een oude man die zijn eenzame boerderij in een magnifiek landschap niet wil verlaten. Ik wil zo graag naar IJsland op vakantie… (Focus op IJsland 1)
  • Wrestling van Grímur Hákonarson (IJsland): homoseksuele worstelaars. Het einde is een ode aan de kracht van suggestie, door heel de zaal klonk “Ew” terwijl er niets te zien was. (Focus op IJsland 1)
  • We are so happy van Wannes Destoop (België): stylistisch zwalpt de film wat tussen realité op z’n Dardennes en postmoderne ironie maar het spel tussen Benny Claessens en Berdien Dewaele maakt heel veel goed. Benny Claessens is echt fantastisch. (Vlaamse competitie 3)
  • Passages van Johann Van Gerwen (België): een heel klassieke film maar goed gespeeld en vooral heel mooi gefotografeerd in de Universiteitsbibliotheek van Gent. Je haalt de films van DOP Nicolas Karatsanis er echt wel uit. Ik vraag me wel af hoe je dat moet monteren als je geen referentiemonitor hebt die door de schaduwen kan kijken. (Vlaamse competitie 4)
  • Above All Things van Stien De Vrieze (België): echtelijk drama omtrent een vrouw met een extreme kinderwens. Er wrong iets aan het scenario maar Bert Haelvoet brak mijn hart. (Vlaamse competitie 1)

Afin, na het maken van deze al bij al willekeurige lijst valt me toch wel mijn voorkeur voor Scandinavië op. Ik ben daar niet alleen in, Scandinavië doet het al lang heel goed op Leuven Kort. Voor mij heeft dit veel te maken met hun onderkoelde speel- en vertelstijl, maar de vaak magnifieke landschappen (Brakkvann) en prachtige licht helpen zeker. Last Farm in the Valley en 2 Birds maken blijkbaar deel uit van een trilogie over de liefde door Rúnar Rúnarsson. Ik ben benieuwd naar deel drie.

Niet alles is rozegeur en maneschijn: in ongeveer iedere blok zit wel een film die op mijn zenuwen werkt. Vaak zijn dit de films die naar een half uur lengte gaan. Maar ja, de gustibus et coloris…

Het verhaal van de drolMet gepaste trots wil ik aankondigen dat mijn kortfilm, waarvan eerder sprake, geselecteerd is voor Leuven Kort. Ik ben hier echt heel blij mee, want ik had nooit gedacht dat we met onze low-budget productie van de Academie konden opboksen tegen de grote Vlaamse subsidiekanonnen.

Het verhaal van de drol is gebaseerd op het fantastisch kortverhaal The Tale of the Turd van Hanif Kureishi. De film is te zien op zondag 30 nov om 22:30, dinsdag 2 dec om 18:30, donderdag 4 dec om 18:30 en vrijdag 5 dec om 22:30. Na Leuven Kort wil ik hier nog het verhaal achter Het verhaal van de drol neerpoten, dus stay tuned

Gelukkig is hij nooit “chanteur pour femmes finissantes” geworden. Marc Almond daarentegen… (Niet op de link klikken als u nog van uw middagmaal wil genieten)

Als u dit leest, zit u op een andere server, die waarschijnlijk een beetje sneller zal zijn. Voor de rest is er (nog) niks veranderd, buiten wat technisch gerommel

If you have an old WordPress blog like me, you’ll notice all kinds of problems with accented letters in late WordPress’ versions. The trouble is that WordPress was once young and foolish and created its MySQL database in the default latin-1 character set. Which was all fine and dandy, except the fact that WordPress dumped UTF-8 encoded unicode data into this database.

MySQL didn’t mind and PHP didn’t know anything about Unicode, so no harm done. The trouble began when WordPress actually started requesting UTF-8 data from MySQL. MySQL notices that the data in the tables is in latin-1 format and converts the latin-1 data to UTF-8.

That means that your data is double-encoded. één becomes één and so on. One possible way to solve this problem is to leave the communication between WordPress and MySQL in latin-1. (DB_charset = 'latin1'). The best solution, however, is to fix the database: mark all fields, tables, and the database charset as UTF-8. Trouble is, whenever you do this in for instance phpMyAdmin, MySQL converts the actual data to UTF-8, thus double-encoding the data once and for good.

The solution for this new problem is an intermediate step: mark all latin-1 fields as blobs (binary data) and then change them back again to UTF-8 encoded text fields. This solution works because MySQL doesn’t convert anything from latin-1 to blob, nor from blob to UTF-8. But is is quite labourous and you have to delete and recreate all indexes.

So here’s my solution:

#!/usr/bin/python

utf8 = [ unichr(i).encode('utf-8') for i in range(256) ]
double_utf8 = [ c.decode('latin1').encode('utf8') for c in utf8 ]

f = open('dbwordpress.sql', 'rb')
data = f.read()
f.close()

for i in range(256):
    data = data.replace(double_utf8[i], utf8[i])

data = data.replace ('DEFAULT CHARSET=latin1', 'DEFAULT CHARSET=utf8')

f = open('dbwordpress2.sql', 'wb')
f.write(data)
f.close()

A little explanation:

I took a database backup, dbwordpress.sql, from my provider (in SQL format). The script changes all double-encoded UTF-8 values back to single encoded UTF-8 values. After that it changes the default charset of all tables to UTF-8. I restored the database from my modified backup and all was fine and dandy.

Technical note: utf8 is a table of all latin-1 characters in UTF-8 format. double_utf8 is table of these characters, but encoded to UTF-8 once again. The script replaces all double-encoded latin-1 characters by their single encoded version.

This means that this solution won’t work if any of your posts or comments contain anything other than latin-1-characters, like Chinese or Japanese. In theory you should be able to just do:

data = data.decode('utf-8').encode('latin-1')

but somehow there are other, real Unicode characters (# > 0xff) in the mix, which means that the straight downconvert to 8-bit characters won’t work (the encode('latin-1') part). I don’t know how this is even possible since any 8 bit value converted to UTF-8 yields a valid Unicode character in the latin-1 range… It’s either a bug in MySQL’s latin-1-to-UTF-8 conversion, or, more likely, WordPress shoves some real binary data into text-fields…

Mijn lieve leraar heeft zich bezig gehouden met een heleboel films van dit jaar op de website van de school te zetten. De film links gaat over niets — of een raadselachtige nacht in een dorp in Portugal — maar er zijn ook fijne animaties bij, een goeie videoclip (opgenomen op twee dagen!) en een vreemd relaas in een kempisch accent, een oudere maar nog steeds heel goede film.