[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#700205: pu: libquvi-scripts/0.4.15-1~deb7u1



Cyril Brulebois <kibi@debian.org> writes:
> Ansgar Burchardt <ansgar@debian.org> (09/05/2013):
>> Today upstream released 0.4.15 which includes fixes for various sites:
[...]
>> I uploaded it to unstable. Looking at wheezy can probably wait until it
>> migrated to testing.
>
> This seems to have happened. Should I be looking at the debdiff
> between wheezy and testing? (You'd just append a ~deb7u1 string
> in a new changelog entry, right?)

Yes, that's my plan.  I have also prepared a slightly cleaned up version
of the diff (attached).

Ansgar
Original diffstat:

 192 files changed, 3696 insertions(+), 1530 deletions(-)

Removed uninteresting files (autotools noise, version noise, tests):

  44 files changed, 3146 insertions(+), 367 deletions(-)

About 1900 lines are ChangeLog/NEWS. One diff is wrong: shows rename for yfrog
which was actually removed and a new site added (but the code is similar).

diff --git a/ChangeLog b/ChangeLog
index 199338b..dbbc0ed 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,1794 @@
+commit 780af01
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-05-09
+
+    Update NEWS for v0.4.15
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+NEWS
+
+commit 083e929
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-05-09
+
+    Bump version to 0.4.15
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+m4/version.m4
+
+commit b79c854
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-05-09
+
+    tests: Remove tnaflix.json
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/nsfw/tnaflix.json
+
+commit 5bf649c
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-05-09
+
+    tests: Update videobash.json
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/videobash.json
+
+commit 16065b3
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-05-09
+
+    tests: Remove theonion_2.json
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/theonion_2.json
+
+commit cdfacbc
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-05-09
+
+    tests: Update theonion.json
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/theonion.json
+
+commit 30549f7
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-05-09
+
+    tests: Update imdb.json
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/imdb.json
+
+commit 8d276bd
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-05-09
+
+    tests: Update funnyordie.json
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/funnyordie.json
+
+commit c175c51
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-05-09
+
+    tests: Remove soundcloud-2.json
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/soundcloud-2.json
+
+commit e6375be
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-05-09
+
+    tests: Update soundcloud.json
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/soundcloud.json
+
+commit f21a6ee
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-05-09
+
+    tests: Update gaskrank.json
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/gaskrank.json
+
+commit 3a54aca
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-05-09
+
+    tests: shortened.t: Disable dai.ly test
+    
+    HTTP/404. Need a new test if this service is still even usable.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/t/shortened.t
+
+commit e667492
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-05-09
+
+    Remove website/yfrog.lua
+    
+    This is primarily an image host [?]. The website provides direct links
+    to media. Not really our cup of tea.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/Makefile.am
+share/lua/website/yfrog.lua
+tests/data/format/default/yfrog.json
+
+commit c0e5bc4
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-05-09
+
+    tests: Move golem.json to fixme/
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/fixme/golem.json
+tests/data/format/default/golem.json
+
+commit 51c69b2
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-05-09
+
+    tests: Update clipfish.json
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/clipfish.json
+
+commit 2ede069
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-05-09
+
+    tests: Update xvideos.json
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/nsfw/xvideos.json
+
+commit 8540984
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-05-09
+
+    tests: Update xnxx.json
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/nsfw/xnxx.json
+
+commit bb40acd
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-05-05
+
+    website/clipfish.lua: r.categories: Add proto_rtmp
+    
+    The website now provides both HTTP and RTMP(E) media streams.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/clipfish.lua
+
+commit d98c460
+Merge: 8988585 fccb462
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-05-05
+
+    Merge branch 'tg/0.4__fix_101greatgoals.lua' into maint-0.4
+
+commit fccb462
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-05-05
+
+    tests: redirect.t: Add test for website/101greatgoals.lua
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/resolve/redirect_url_101greatgoals.json
+tests/t/redirect.t
+
+commit b9daced
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-05-05
+
+    FIX: website/101greatgoals.lua: embedded URL patterns
+    
+    Improve the patterns used to parse the embedded media URLs.  Do not
+    attempt to check for the known hosts; leave the determination for
+    libquvi(-scripts) to do.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/101greatgoals.lua
+
+commit 8988585
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-30
+
+    FIX: tests: redirect.t: Update shortened URL
+    
+    The shortened URL points to an old test URL; update the test to use the
+    one in default/vimeo.json.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/t/redirect.t
+
+commit 0ad0cb5
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-30
+
+    tests: redirect_url_tcmag.json: Update expected page_title
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/resolve/redirect_url_tcmag.json
+
+commit aa496bf
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-30
+
+    website/bikeradar.lua: Unmark as "FIXME"
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/Makefile.am
+
+commit a5fe1a2
+Merge: 4927bb9 d58ba50
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-30
+
+    Merge branch 'tg/0.4__fix_ted.lua' into maint-0.4
+
+commit d58ba50
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-30
+
+    tests: format/default: Add ted.json
+    
+    Used to test the media hosted by ted.com
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/ted.json
+
+commit cc0c742
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-30
+
+    tests: resolve: Update redirect_url_ted.json
+    
+    Used to test the content of ted.com that is being hosted elsewhere, e.g.
+    YouTube.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/resolve/redirect_url_ted.json
+
+commit 00f4301
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-30
+
+    FIX: website/ted.lua: Check for extern media
+    
+    * Rewrite `Ted.is_external' func using a new embed URL pattern
+    * Revise `parse' function for minor style changes
+    * Update thumbnail_url pattern
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/ted.lua
+
+commit 4927bb9
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-30
+
+    FIX: tests: redirect.t: Add a missing comma
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/t/redirect.t
+
+commit 5398c2c
+Merge: 4969157 58e3174
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-30
+
+    Merge branch 'tg/0.4__fix_academicearth.lua' into maint-0.4
+
+commit 58e3174
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-30
+
+    tests: resolve: Update redirect_url_academicearth.json
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/resolve/redirect_url_academicearth.json
+
+commit cb19406
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-30
+
+    FIX: website/academicearth.lua: Look for YouTube embed URL
+    
+    This website (exclusively?) now hosts the media at YouTube. Update the
+    embed media URL pattern.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/academicearth.lua
+
+commit 4969157
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-30
+
+    tests: redirect.t: Add a test for website/bikeradar.lua
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/t/redirect.t
+
+commit 9f92f12
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-30
+
+    tests: redirect.t: Comment out dorkly (collegehumor) test
+    
+    website/collegehumor.lua is currently marked as "FIXME".
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/t/redirect.t
+
+commit 85253a3
+Merge: 1db81dc e0bc5a7
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-30
+
+    Merge branch 'tg/0.4__fix_bikeradar.lua' into maint-0.4
+
+commit e0bc5a7
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-30
+
+    tests: resolve/redirect_url_bikeradar.json
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/resolve/redirect_url_bikeradar.json
+
+commit 4d4cebf
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-30
+
+    tests: format/default: Remove bikeradar.json
+    
+    Now that website/bikeradar.lua only sets only the `self.redirect_url',
+    this test has been made obsolete.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/fixme/bikeradar.json
+
+commit 4fe8db9
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-30
+
+    FIX: website/bikeradar.lua: Look for embedURL
+    
+    Check page HTML for embedded URL, since bikeshed apparently uses YouTube
+    to host their media. Set `self.redirect_url' or croak.
+    
+    * ident: Update media URL pattern
+    * parse: Set `self.redirect_url' only, do not parse anything else
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/bikeradar.lua
+
+commit 1db81dc
+Merge: 147ceaa bc33983
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-29
+
+    Merge branch 'tg/0.4__improve_website/spiegel.lua' into maint-0.4
+
+commit bc33983
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-29
+
+    tests: format/default: Update for website/spiegel.lua
+    
+    * Update the old testcase
+    * Add another testcase
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/spiegel-1.json
+tests/data/format/default/spiegel.json
+
+commit c583258
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-29
+
+    FIX: website/spiegel.lua: choose_default
+    
+    Choosing to use the "lowest quality" stream (3gp) as the 'default'
+    stream would cause HTTP/404 when the stream was accessed. Although this
+    stream is listed among those available ones, it appears to be missing
+    for most videos (if not all).
+    
+    Spiegel.choose_default:
+      Return the first available stream as the new 'default' stream.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/spiegel.lua
+
+commit a345ae6
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-29
+
+    website/spiegel.lua: Parse thumbnail URL
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/spiegel.lua
+
+commit 1763969
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-29
+
+    website/spiegel.lua: Parse title from page instead
+    
+    The page HTML gives us the complete media title.
+    * Remove the now obsolete `Spiegel.get_playlist' function
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/spiegel.lua
+
+commit 147ceaa
+Merge: 70a40d3 a612582
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-28
+
+    Merge branch 'tg/0.4__fix_guardian.lua' into maint-0.4
+
+commit a612582
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-28
+
+    tests: format/default: Update tests for guardian.lua
+    
+    Update test cases:
+    * Use a more recent media URL (guardian.json)
+    * Keep the old media URL (guardian_old.json)
+    * Add one for audio (guardian_audio.json)
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/guardian.json
+tests/data/format/default/guardian_audio.json
+tests/data/format/default/guardian_audio2.json
+tests/data/format/default/guardian_old.json
+
+commit 2e73b5b
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-28
+
+    FIX: website/guardian.lua: all patterns
+    
+    * Remove stream interation (only one appears to be available now)
+    * Parse all media properties from the media page
+    * Remove unused Guardian.* functions
+    * Improve thumbnail URL parsing
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/guardian.lua
+
+commit 70a40d3
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-16
+
+    gen-news.sh: Do not print commits with >1 one parent
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+gen-news.sh
+
+commit 23cb49e
+Merge: 1fbb469 973ec5a
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-26
+
+    Merge branch 'tg/0.4__fix_website/sevenload.lua' into maint-0.4
+
+commit 973ec5a
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-26
+
+    tests: format/default: Update sevenload.json
+    
+    * Move from "nlfy" to "regular"
+    * Update test case
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/nlfy/sevenload.json
+tests/data/format/default/sevenload.json
+
+commit 7ea5976
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-26
+
+    FIX: website/sevenload.lua: all patterns
+    
+    * `ident': Use `handles' function of 'quvi/util'
+    * `parse': Update media {title,id,url} patterns
+    * `parse': Parse thumb url
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/sevenload.lua
+
+commit 1fbb469
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-23
+
+    FIX: website/gaskrank.lua: media stream URL pattern
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/gaskrank.lua
+
+commit 4d0fc7c
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-21
+
+    FIX: website/funnyordie.lua: media stream URL pattern
+    
+    * Conform to the standard media property error messages
+    * Fix the pattern for the media stream URLs
+    * Update the pattern for the "quality" and the "container"
+    * Both FunnyOrDie.choose_{best,default} now return the first stream
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/funnyordie.lua
+
+commit 8edbe5c
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-21
+
+    website/golem.lua: Mark as "FIXME"
+    
+    The config URL no longer works (HTTP/404).
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/Makefile.am
+
+commit bd6c931
+Merge: ef9a614 494dcde
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-15
+
+    Merge branch 'tg/maint-0.4__umark_arte_as_fixme' into maint-0.4
+
+commit 494dcde
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-15
+
+    website/arte.lua: Unmark as "FIXME"
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/Makefile.am
+
+commit bd7e323
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-15
+
+    expire.t: Re-enable and revise arte.lua test
+    
+    Re-enable and revise the test for website/arte.lua:
+    * Parse all video URLs from the front page
+    * Pick one URL from the middle of the stack
+      (the first URL seems not to be available everytime: too recent?)
+    
+    Keep pluzz.lua test commented out.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/t/expire.t
+
+commit ef9a614
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-04-02
+
+    FIX: xhamster.lua: title pattern
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/xhamster.lua
+
+commit aafc1ab
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-03-19
+
+    Bump version to 0.4.14
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+m4/version.m4
+
+commit 4caf5a1
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-03-19
+
+    Update NEWS for v0.4.14
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+NEWS
+
+commit 10cd3be
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-03-19
+
+    Change soundcloud test URL
+    
+    Some of the content may be 'protected' in which case the server will
+    return HTTP/401 (unauthorized) when the stream URL is being accessed.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/soundcloud.json
+
+commit e7e882e
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-03-08
+
+    share/Makefile.am: Add wimp.lua
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/Makefile.am
+
+commit b394bc5
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-03-08
+
+    tests: default: add wimp.json
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/wimp.json
+
+commit 3639d67
+Author: Martin Herkt <lachs0r@srsfckn.biz>
+Date:   2013-03-08
+
+    Add website script for wimp.com
+    
+    Signed-off-by: Martin Herkt <lachs0r@srsfckn.biz>
+
+share/lua/website/wimp.lua
+
+commit 0eff56e
+Author: Martin Herkt <lachs0r@srsfckn.biz>
+Date:   2013-03-08
+
+    website utils: add base64 decoder
+    
+    Signed-off-by: Martin Herkt <lachs0r@srsfckn.biz>
+
+share/lua/website/quvi/util.lua
+
+commit 17d11a2
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-03-03
+
+    Bump version to 0.4.13
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+m4/version.m4
+
+commit adcbeb1
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-03-03
+
+    Update NEWS for v0.4.13
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+NEWS
+
+commit 85338c0
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-03-03
+
+    tests: default: Change xvideos test URL
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/nsfw/xvideos.json
+
+commit 7a9bdb1
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-02-16
+
+    Rename ard.lua to ardmediathek.lua
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/Makefile.am
+share/lua/website/ard.lua
+share/lua/website/ardmediathek.lua
+
+commit 64cab0d
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-02-16
+
+    FIX: ard.lua: Assign self.script_dir to package.path
+    
+    Assign the value of the self.script_dir to the package.path so that
+    the 'quvi/*' modules can be found.
+    
+    Reported-by: Fabian Homborg <fhomborg@gmail.com>
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/ard.lua
+
+commit 404ec2e
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-02-10
+
+    Update NEWS for v0.4.12
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+NEWS
+
+commit 9a2270e
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-02-10
+
+    Bump version to 0.4.12
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+m4/version.m4
+
+commit 1912cd7
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-02-10
+
+    Move mgnetwork.lua under FIXME
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/Makefile.am
+tests/data/format/default/fixme/mgnetwork.json
+tests/data/format/default/mgnetwork.json
+
+commit a49bce7
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-02-10
+
+    tests: default: xvideos.json: Update test URL
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/nsfw/xvideos.json
+
+commit e2d1f7f
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-02-10
+
+    Move fastjizz.lua under FIXME
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/Makefile.am
+tests/data/format/default/nsfw/fastjizz.json
+tests/data/format/default/nsfw/fixme/fastjizz.json
+
+commit 2b003f2
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-02-10
+
+    tests: default: videobash.json: Update page_title
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/videobash.json
+
+commit 509db79
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-02-10
+
+    tests: default: tvlux.json: Update
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/tvlux.json
+
+commit 85f1dea
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-02-10
+
+    FIX: tvlux.lua: Update patterns, parse thumb URL
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/tvlux.lua
+
+commit 65ea27d
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-02-10
+
+    soundcloud-2.json: Update test URL
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/soundcloud-2.json
+
+commit dab6469
+Author: Thomas Wei$(D)N(Bschuh <thomas@t-8ch.de>
+Date:   2013-02-08
+
+    ard.lua: cleanup
+    
+    * remove superfluous fsk table from test_availability()
+    * s/films/videos/ in test_availability()
+    * move the call to test_availability() into iter_formats(), so it
+      gets always executed
+    * remove superfluous match in container_from()
+
+share/lua/website/ard.lua
+
+commit 1fb1128
+Merge: c0add2d f34b625
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-02-08
+
+    Merge branch 'tg/next/0.4__ard.lua_misc_improvements' into next
+
+commit f34b625
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-02-08
+
+    ard.lua: Ard.to_s: Use service internal stream ID
+    
+    Since the service provides an ID (1,2,3,...), use it in
+    the media stream ID to make them unique. Otherwise we'll
+    end up with identical media stream IDs in some cases.
+    
+    Use 'i' for the lack of a better prefix. This is similar to
+    that of youtube.lua (0.9) and the use of the "itag" value in
+    YouTube the media stream IDs.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/ard.lua
+
+commit 99b3722
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-02-08
+
+    ard.lua: Cleanup Ard.iter_formats
+    
+    Realign, remove webX extraction which is now done in Ard.quality_from,
+    make the for loop more compact.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/ard.lua
+
+commit 7213e06
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-02-08
+
+    ard.lua: Add Ard.container_from function
+
+share/lua/website/ard.lua
+
+commit 08dff90
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-02-08
+
+    ard.lua: Add Ard.height_from function
+
+share/lua/website/ard.lua
+
+commit c41e5cc
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-02-08
+
+    ard.lua: Add Ard.quality_from function
+    
+    Have the Ard.quality function return a string containing one of the
+    strings 'ld', 'md', 'sd', 'hd'. Other websites.
+    
+    Plenty of guessing going on here, these strings are roughly based on
+    the findings posted here:
+      http://article.gmane.org/gmane.comp.web.flash.quvi/170
+    
+      0 = '256x144' -- ld
+      1 = '512x288' -- md
+      2 = '960x540' -- sd
+      3 ='1280x720' -- hd
+
+share/lua/website/ard.lua
+
+commit f24c168
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-02-08
+
+    ard.lua: Rewrite Ard.to_s for 0.9 compatibility
+    
+    The 0.9 series of libquvi-scripts will attempt to return the media
+    stream IDs as "$quality_$container_$encoding_$height(p)" whenever
+    possible.  Prepare for the foreseeable future.
+
+share/lua/website/ard.lua
+
+commit c0add2d
+Author: Thomas Wei$(D)N(Bschuh <thomas@t-8ch.de>
+Date:   2012-10-14
+
+    Add ard.lua
+    
+    This adds support for the 'ARD mediathek', the movie archive of the
+    primary national television broadcaster of Germany. It's mediathek also
+    servers videos from many smaller german broadcasters.
+    
+    Note: films are only available online for two weeks after airing.
+    Certain films are only available at certain daytimes. In this case an
+    error is raised.
+    
+    Signed-off-by: Thomas Wei$(D)N(Bschuh <thomas@t-8ch.de>
+    Tested-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/Makefile.am
+share/lua/website/ard.lua
+
+commit ef57874
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-02-07
+
+    FIX: wdrmaus.lua:101: invalid escape sequence
+    
+    Fix the "wdrmaus.lua:101: invalid escape sequence near \/" by
+    removing the backslash.
+    
+    Reported-by: Thomas Wei$(D)N(Bschuh <thomas@t-8ch.de>
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/wdrmaus.lua
+
+commit 0791d2d
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-02-01
+
+    Bump version to 0.4.11
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+m4/version.m4
+
+commit 5215745
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-02-01
+
+    Update NEWS for 0.4.11
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+NEWS
+
+commit c798621
+Merge: 7f171b0 d937de7
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-31
+
+    Merge branch 'tg/next/0.4_testrun_fixes' into next
+
+commit d937de7
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-31
+
+    Move pornhub.lua under FIXME
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/Makefile.am
+tests/data/format/default/nsfw/fixme/pornhub.json
+tests/data/format/default/nsfw/pornhub.json
+
+commit da6bd0b
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-31
+
+    tests: default: lego.json: Update
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/lego.json
+
+commit bfb8a9c
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-31
+
+    tests: default: funnyordie.json: Update
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/funnyordie.json
+
+commit fa63c11
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-31
+
+    tests: Retire the "other" test category
+    
+    Often cumbersome at best -- results varying each time with certain
+    hosts. It's time to retire this test category. Tests for "default"
+    format are sufficient.
+    
+    Similar changes will be introduced in libquvi-scripts point-nine.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/other/cbsnews_best.json
+tests/data/format/other/cbsnews_m4v_1100k_480p.json
+tests/data/format/other/cbsnews_m4v_386k_216p.json
+tests/data/format/other/cbsnews_m4v_598k_360p.json
+tests/data/format/other/cbsnews_mp4_1100k_480p.json
+tests/data/format/other/cbsnews_mp4_500k_240p.json
+tests/data/format/other/fixme/blip_best.json
+tests/data/format/other/fixme/blip_m4v_blip_sd_360p.json
+tests/data/format/other/fixme/blip_mov_source_360p.json
+tests/data/format/other/fixme/blip_mp3_web.json
+tests/data/format/other/fixme/collegehumor_best.json
+tests/data/format/other/fixme/collegehumor_mp4_hq.json
+tests/data/format/other/fixme/collegehumor_mp4_sd.json
+tests/data/format/other/foxnews_best.json
+tests/data/format/other/foxnews_high.json
+tests/data/format/other/foxnews_low.json
+tests/data/format/other/foxnews_med.json
+tests/data/format/other/foxnews_med_low.json
+tests/data/format/other/funnyordie_best.json
+tests/data/format/other/funnyordie_mp4_ipad.json
+tests/data/format/other/funnyordie_mp4_wifi.json
+tests/data/format/other/golem_best.json
+tests/data/format/other/golem_m4v_ipod_360p.json
+tests/data/format/other/golem_mp4_high_540p.json
+tests/data/format/other/golem_mp4_medium_270p.json
+tests/data/format/other/ignore/length_bytes/dailymotion_best.json
+tests/data/format/other/ignore/length_bytes/dailymotion_mp4_384p.json
+tests/data/format/other/ignore/length_bytes/dailymotion_mp4_480p.json
+tests/data/format/other/ignore/length_bytes/dailymotion_mp4_720p.json
+tests/data/format/other/imdb_480p.json
+tests/data/format/other/imdb_720p.json
+tests/data/format/other/imdb_SD.json
+tests/data/format/other/imdb_best.json
+tests/data/format/other/mgnetwork_best.json
+tests/data/format/other/mgnetwork_mp4.json
+tests/data/format/other/mgnetwork_xflv.json
+tests/data/format/other/youtube_best.json
+tests/data/format/other/youtube_fmt05_240p.json
+tests/data/format/other/youtube_fmt18_360p.json
+tests/data/format/other/youtube_fmt22_720p.json
+tests/data/format/other/youtube_fmt34_360p.json
+tests/data/format/other/youtube_fmt35_480p.json
+tests/data/format/other/youtube_fmt37_1080p.json
+tests/data/format/other/youtube_fmt38_1536p.json
+
+commit ab25817
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-31
+
+    tests: default: empflix.lua: Update test URL
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/nsfw/empflix.json
+
+commit f3bcb56
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-31
+
+    tests: default: beeg.json: Update page_title
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/nsfw/beeg.json
+
+commit 282a309
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-31
+
+    tests: default: spiegel.json: Update test URL
+    
+    Replace the old test URL (HTTP/404).
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/spiegel.json
+
+commit b118e3c
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-31
+
+    tests: default: audioboo.json: Remove properties
+    
+    Remove the length_bytes, content_type and file_suffix properties so
+    that the test passes.   This fixes nothing.
+    
+    audioboo has gone amaz0nian. The media is accessed using HTTPS,
+    which causes libquvi 0.4 to skip the media stream "verification"
+    step. Even if enabled, sending of HTTP HEAD (through SSL tunnel)
+    results in HTTP/403 (Forbidden).
+    
+    Possibly related:
+      https://forums.aws.amaz0n.com/message.jspa?messageID=378603
+        (replace '0' in 'amaz0n')
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/audioboo.json
+
+commit d4a8a12
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-31
+
+    tests: default: metacafe.json: Update thumbnail_url
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/metacafe.json
+
+commit e1fc4d2
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-31
+
+    tests: default: break.json: Add thumbnail_url value
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/break.json
+
+commit 569ab94
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-31
+
+    tests: default: theonion(_2).json: Update thumbnail_url
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/theonion.json
+tests/data/format/default/theonion_2.json
+
+commit be81501
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-31
+
+    beeg.lua: Update title pattern
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/beeg.lua
+
+commit 787be3d
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-31
+
+    FIX: lego.lua: All patterns
+    
+    Modify the script to extract the media properties using new
+    patterns.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/lego.lua
+
+commit 4735455
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-31
+
+    FIX: metacafe.lua: Key parsing
+    
+    Some of the patterns were outdated due to the changes made to the
+    website.  Have the script extract the 'flashvars' value, unescape
+    it and then extract each individual value from this unescaped value.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/metacafe.lua
+
+commit 8d6ee06
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-31
+
+    FIX: theonion.lua: thumbnail URL pattern
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/theonion.lua
+
+commit 763338c
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-31
+
+    FIX: 1tvru.lua: title and media URL patterns
+    
+    Only some of the (archived?) videos seem to work (now?).
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/1tvru.lua
+
+commit 7f171b0
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-19
+
+    tests: default: gaskrank.json: Add thumbnail_url property
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/gaskrank.json
+
+commit 1e15082
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-19
+
+    gaskrank.lua: Parse thumbnail URL
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/gaskrank.lua
+
+commit 8c067a5
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-19
+
+    FIX: gaskrank.lua: media stream URL pattern
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/gaskrank.lua
+
+commit 3096ff9
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-04
+
+    wdrmaus.lua: fail if required properties cannot be parsed
+    
+    Fail with an error of the required media properties {title,id,url}
+    could not be parsed. Do not set self.default (unused). Cleanup code
+    for improved readability.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/wdrmaus.lua
+
+commit 9266abb
+Merge: 89d31bc 37704a6
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-03
+
+    Merge branch 'tg/next/0.4_add_wdrmaus' into next
+
+commit 37704a6
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-03
+
+    tests: Add default/wdrmaus_*.json
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/wdrmaus_es.json
+tests/data/format/default/wdrmaus_kbbs.json
+tests/data/format/default/wdrmaus_sg.json
+
+commit 03f4cce
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-03
+
+    wdrmaus.lua: fail if URL path patterns do not match
+    
+    Have the script raise an error if none of the URL path patterns.
+    Otherwise the users will only get a cryptic error about missing
+    media property values.
+    
+    Other:
+    * Set "fetch_type=config" for quvi.fetch(non-page_url) calls
+    * Replace if-elseif -block with a lookup table
+    * Trim a long line to fit 72 chars
+    * Remove an extra newline
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/wdrmaus.lua
+
+commit 86d1c64
+Author: Guido Leisker <guido@guido-leisker.de>
+Date:   2013-01-03
+
+    Add support for wdrmaus.de
+    
+    Signed-off-by: Guido Leisker <guido@guido-leisker.de>
+    Tested-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/Makefile.am
+share/lua/website/wdrmaus.lua
+
+commit 89d31bc
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-02
+
+    FIX: gen-news.sh: Find the closest tagname
+    
+    Replaces the buggy tagname extraction.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+gen-news.sh
+
+commit bbd6fd3
+Merge: 4d12ffd 0795470
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-02
+
+    Merge branch 'tg/next/0.4_add_myspass' into next
+
+commit 0795470
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2013-01-02
+
+    tests: Add default/myspass.json
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/myspass.json
+
+commit 2b79f18
+Author: Guido Leisker <guido@guido-leisker.de>
+Date:   2013-01-01
+
+    Add support for myspass.de
+    
+    Signed-off-by: Guido Leisker <guido@guido-leisker.de>
+    Reviewed-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/Makefile.am
+share/lua/website/myspass.lua
+
+commit 4d12ffd
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-11-22
+
+    Bump version to 0.4.10
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+m4/version.m4
+
+commit b0e9f1d
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-11-22
+
+    Update NEWS for v0.4.10
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+NEWS
+
+commit e1d1731
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-11-21
+
+    tests: other/spiegel_*.json: Remove
+    
+    Save some bandwidth. If one stream (the default) checks out OK
+    with this site, that's all we need.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/other/spiegel_best.json
+tests/data/format/other/spiegel_flv_vp6_388k_135p.json
+tests/data/format/other/spiegel_flv_vp6_576k_315p.json
+tests/data/format/other/spiegel_flv_vp6_64k_135p.json
+tests/data/format/other/spiegel_flv_vp6_928k_544p.json
+tests/data/format/other/spiegel_mp4_h264_1400k_544p.json
+
+commit 5fef6dc
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-11-21
+
+    tests: default/spiegel.json: Use a more recent test URL
+    
+    The previously used test URL defaulted to media stream that is listed
+    in the returned XML data but appears to be missing (HTTP/404). The
+    XML does not seem to indicate the stream availability, either.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+tests/data/format/default/spiegel.json
+
+commit b182505
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-11-21
+
+    FIX: audioboo.lua: multiple patterns
+    
+    Fix {title,id,thumbnail,stream} patterns. Parse from the
+    contents of the media URL instead of oembed which no longer
+    appears to provide the media stream URL.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/audioboo.lua
+
+commit bc35f74
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-11-21
+
+    FIX: dailymotion.lua: title pattern
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/dailymotion.lua
+
+commit 6357cd1
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-11-21
+
+    FIX: break.lua: multiple patterns
+    
+    Fix {title,id,filepath,filehash} patterns. Add thumbnail_url.
+    
+    Signed-off-by: Toni Gundogdu <legatvs@gmail.com>
+
+share/lua/website/break.lua
+
+commit 3630a39
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-10-01
+
+    Bump version to 0.4.9
+
+m4/version.m4
+
+commit b0effb8
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-10-01
+
+    Update NEWS for 0.4.9
+
+NEWS
+
+commit 63024cb
+Merge: 5a9928a 57722d1
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-10-01
+
+    Merge branch 'tg/next/0.4_fixme_arte' into next
+
+commit 57722d1
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-10-01
+
+    expire.t: Skip all tests
+    
+    Both pluzz.lua and arte.lua need to be fixed now.
+
+tests/t/expire.t
+
+commit e815821
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-10-01
+
+    website/arte.lua: Mark as FIXME
+
+share/Makefile.am
+
+commit 5a9928a
+Merge: 3bdcec9 6a7dada
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-10-01
+
+    Merge branch 'tg/next/0.4_fix_youjizz' into next
+
+commit 6a7dada
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-10-01
+
+    tests: nsfw/youjizz.json: Update for thumbnail_url
+
+tests/data/format/default/nsfw/youjizz.json
+
+commit ebc42da
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-10-01
+
+    FIX: website/youjizz.lua
+    
+    Fix media {ID,media stream URL} parsing. Parse thumbnail URL.
+    
+    Signed-off-by: anon
+
+share/lua/website/youjizz.lua
+
+commit 3bdcec9
+Merge: c623218 e6f6aa2
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-10-01
+
+    Merge branch 'tg/next/0.4_fixme_collegehumor' into next
+
+commit e6f6aa2
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-10-01
+
+    tests: {default,other}/collegehumor*.json: Mark as FIXME
+
+tests/data/format/default/collegehumor.json
+tests/data/format/default/fixme/collegehumor.json
+tests/data/format/other/collegehumor_best.json
+tests/data/format/other/collegehumor_mp4_hq.json
+tests/data/format/other/collegehumor_mp4_sd.json
+tests/data/format/other/fixme/collegehumor_best.json
+tests/data/format/other/fixme/collegehumor_mp4_hq.json
+tests/data/format/other/fixme/collegehumor_mp4_sd.json
+
+commit 4f65343
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-10-01
+
+    collegehumor.lua: Mark as FIXME
+
+share/Makefile.am
+
+commit c623218
+Merge: c681d03 dbd90b8
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-09-27
+
+    Merge branch 'tg/next/0.4_anon_contrib_nsfw' into next
+
+commit dbd90b8
+Merge: 9696d55 7fb3790
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-09-27
+
+    Merge branch 'tg/next/0.4_anon_contrib_nsfw__xnxx' into tg/next/0.4_anon_contrib_nsfw
+
+commit 7fb3790
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-09-27
+
+    Add tests:/nsfw/xnxx.json
+
+tests/data/format/default/nsfw/xnxx.json
+
+commit ac72d16
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-09-27
+
+    Add website/xnxx.lua (NSFW)
+    
+    Signed-off-by: anon
+
+share/Makefile.am
+share/lua/website/xnxx.lua
+
+commit 9696d55
+Merge: ca7b0e2 1a800a3
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-09-27
+
+    Merge branch 'tg/next/0.4_anon_contrib_nsfw__jizzhut' into tg/next/0.4_anon_contrib_nsfw
+
+commit 1a800a3
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-09-27
+
+    Add tests:/nsfw/jizzhut.json
+
+tests/data/format/default/nsfw/jizzhut.json
+
+commit d509b1b
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-09-27
+
+    Add website/jizzhut.lua (NSFW)
+    
+    Signed-off-by: anon
+
+share/Makefile.am
+share/lua/website/jizzhut.lua
+
+commit ca7b0e2
+Merge: 6dd21a8 dc37f8a
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-09-27
+
+    Merge branch 'tg/next/0.4_anon_contrib_nsfw__fastjizz' into tg/next/0.4_anon_contrib_nsfw
+
+commit dc37f8a
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-09-27
+
+    Add tests:/nsfw/fastjizz.json
+
+tests/data/format/default/nsfw/fastjizz.json
+
+commit 9f1ce8b
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-09-27
+
+    Add website/fastjizz.lua (NSFW)
+    
+    Signed-off-by: anon
+
+share/Makefile.am
+share/lua/website/fastjizz.lua
+
+commit 6dd21a8
+Merge: 871b840 0d8a3ce
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-09-27
+
+    Merge branch 'tg/next/0.4_anon_contrib_nsfw__deviantclip' into tg/next/0.4_anon_contrib_nsfw
+
+commit 0d8a3ce
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-09-27
+
+    Add tests:/nsfw/deviantclip.json
+
+tests/data/format/default/nsfw/deviantclip.json
+
+commit 1b12bc4
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-09-27
+
+    Add website/deviantclip.lua (NSFW)
+    
+    Signed-off-by: anon
+
+share/Makefile.am
+share/lua/website/deviantclip.lua
+
+commit 871b840
+Merge: 9498be7 972fd55
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-09-27
+
+    Merge branch 'tg/next/0.4_anon_contrib_nsfw__beeg' into tg/next/0.4_anon_contrib_nsfw
+
+commit 972fd55
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-09-27
+
+    Add tests:/nsfw/beeg.json
+
+tests/data/format/default/nsfw/beeg.json
+
+commit 5d7233f
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-09-27
+
+    Add website/beeg.lua (NSFW)
+    
+    Signed-off-by: anon
+
+share/Makefile.am
+share/lua/website/beeg.lua
+
+commit 9498be7
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-09-27
+
+    website/keezmovies.lua: Detect encrypted streams
+    
+    Check for encrypted streams.  Move website/keezmovies.lua
+    from WITH_FIXME to WITH_NSFW.
+    
+    Signed-off-by: anon
+
+share/Makefile.am
+share/lua/website/keezmovies.lua
+
+commit c681d03
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-09-27
+
+    FIX: Add quvi/html.lua to DIST_lua
+    
+    Distribute libquvi-scripts with the quvi/html.lua file.
+
+share/Makefile.am
+
+commit 5b1c002
+Author: Martin Herkt <lachs0r@hong-mailing.de>
+Date:   2012-09-27
+
+    Fix youtube.lua
+    
+    YouTube has added a new "signature" parameter to their playback URLs.
+    Append this parameter to the URL if url_encoded_fmt_stream_map contains
+    "sig".
+
+share/lua/website/youtube.lua
+
+commit ef333de
+Merge: e657f45 424f9f1
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-09-03
+
+    Merge branch 'tg/next/0.4_add_tapuz' into next
+
+commit 424f9f1
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-09-03
+
+    tests: format/default: Add tapuz.json
+
+tests/data/format/default/tapuz.json
+
+commit bc24554
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-09-03
+
+    website/tapuz.lua: Add tapuz flix support
+    
+    ref: http://article.gmane.org/gmane.comp.web.flash.quvi/97
+
+share/Makefile.am
+share/lua/website/tapuz.lua
+
+commit e657f45
+Author: Toni Gundogdu <legatvs@gmail.com>
+Date:   2012-08-21
+
+    website/xvideos.lua: Improve title parsing (#109)
+    
+    The page <title> could be a truncated version of a longer description
+    or a title. Grab the media title elsewhere.
+    
+    exu: http://www.xvideos.com/video2389960
+    ref: http://sourceforge.net/apps/trac/quvi/ticket/109
+
+share/lua/website/xvideos.lua
+
 commit 94ac387
 Author: Toni Gundogdu <legatvs@gmail.com>
 Date:   2012-08-19
diff --git a/NEWS b/NEWS
index 788554e..f8d6c2f 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,109 @@
+v0.4.15  (2013-05-09) / Toni Gundogdu
+
+Toni Gundogdu:
+  - FIX: website/101greatgoals.lua: embedded URL patterns [b9daced]
+  - FIX: website/academicearth.lua: Look for YouTube embed URL [cb19406]
+  - FIX: website/bikeradar.lua: Look for embedURL [4fe8db9]
+  - FIX: website/funnyordie.lua: media stream URL pattern [4d0fc7c]
+  - FIX: website/gaskrank.lua: media stream URL pattern [1fbb469]
+  - FIX: website/guardian.lua: all patterns [2e73b5b]
+  - FIX: website/sevenload.lua: all patterns [7ea5976]
+  - FIX: website/spiegel.lua: choose_default [c583258]
+  - FIX: website/ted.lua: Check for extern media [00f4301]
+  - FIX: xhamster.lua: title pattern [ef9a614]
+  - Remove website/yfrog.lua [e667492]
+  - website/arte.lua: Unmark as "FIXME" [494dcde]
+  - website/bikeradar.lua: Unmark as "FIXME" [aa496bf]
+  - website/clipfish.lua: r.categories: Add proto_rtmp [bb40acd]
+  - website/golem.lua: Mark as "FIXME" [8edbe5c]
+  - website/spiegel.lua: Parse thumbnail URL [a345ae6]
+  - website/spiegel.lua: Parse title from page instead [1763969]
+
+ 48 files changed, 365 insertions(+), 501 deletions(-)
+
+
+v0.4.14  (2013-03-19) / Toni Gundogdu
+
+Martin Herkt:
+  - Add website script for wimp.com [3639d67]
+  - website utils: add base64 decoder [0eff56e]
+
+ 5 files changed, 118 insertions(+), 6 deletions(-)
+
+
+v0.4.13  (2013-03-03) / Toni Gundogdu
+
+Toni Gundogdu:
+  - FIX: ard.lua: Assign self.script_dir to package.path [64cab0d]
+  - Rename ard.lua to ardmediathek.lua [7a9bdb1]
+
+ 4 files changed, 174 insertions(+), 173 deletions(-)
+
+
+v0.4.12  (2013-02-10) / Toni Gundogdu
+
+Thomas Wei$(D)N(Bschuh:
+  - Add ard.lua [c0add2d]
+Toni Gundogdu:
+  - FIX: tvlux.lua: Update patterns, parse thumb URL [85f1dea]
+  - FIX: wdrmaus.lua:101: invalid escape sequence [ef57874]
+  - Move fastjizz.lua under FIXME [e2d1f7f]
+  - Move mgnetwork.lua under FIXME [1912cd7]
+
+ 13 files changed, 242 insertions(+), 65 deletions(-)
+
+
+v0.4.11  (2013-02-01) / Toni Gundogdu
+
+Guido Leisker:
+  - Add support for myspass.de [2b79f18]
+  - Add support for wdrmaus.de [86d1c64]
+Toni Gundogdu:
+  - beeg.lua: Update title pattern [be81501]
+  - FIX: 1tvru.lua: title and media URL patterns [763338c]
+  - FIX: gaskrank.lua: media stream URL pattern [8c067a5]
+  - FIX: gen-news.sh: Find the closest tagname [89d31bc]
+  - FIX: lego.lua: All patterns [787be3d]
+  - FIX: metacafe.lua: Key parsing [4735455]
+  - FIX: theonion.lua: thumbnail URL pattern [8d6ee06]
+  - gaskrank.lua: Parse thumbnail URL [1e15082]
+
+ 71 files changed, 398 insertions(+), 821 deletions(-)
+
+
+v0.4.10  (2012-11-22) / Toni Gundogdu
+
+Toni Gundogdu:
+  - FIX: audioboo.lua: multiple patterns [b182505]
+  - FIX: break.lua: multiple patterns [6357cd1]
+  - FIX: dailymotion.lua: title pattern [bc35f74]
+
+ 10 files changed, 28 insertions(+), 127 deletions(-)
+
+
+v0.4.9  (2012-10-01) / Toni Gundogdu
+
+anon:
+  - Add website/beeg.lua (NSFW) [5d7233f]
+  - Add website/deviantclip.lua (NSFW) [1b12bc4]
+  - Add website/fastjizz.lua (NSFW) [9f1ce8b]
+  - Add website/jizzhut.lua (NSFW) [d509b1b]
+  - Add website/xnxx.lua (NSFW) [ac72d16]
+  - FIX: website/youjizz.lua [ebc42da]
+  - website/keezmovies.lua: Detect encrypted streams [9498be7]
+Martin Herkt:
+  - FIX: youtube.lua [5b1c002] (aka. server response code 403 (conncode=0))
+Toni Gundogdu:
+  - FIX: Add quvi/html.lua to DIST_lua [c681d03]
+  - website/arte.lua: Mark as FIXME [e815821]
+  - website/collegehumor.lua: Mark as FIXME [4f65343]
+  - website/xvideos.lua: Improve title parsing (#109) [e657f45]
+Tzafrir Cohen:
+  - website/tapuz.lua: Add tapuz flix support [bc24554]
+
+ 27 files changed, 622 insertions(+), 86 deletions(-)
+
+
 v0.4.8  (2012-08-21) / Toni Gundogdu
 
 anon:
diff --git a/debian/changelog b/debian/changelog
index ae7d8bb..ecf838c 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,46 @@
+libquvi-scripts (0.4.15-1) unstable; urgency=low
+
+  * New upstream release.
+  * Bumped Standards-Version to 3.9.4 (no changes).
+
+ -- Ansgar Burchardt <ansgar@debian.org>  Thu, 09 May 2013 13:28:38 +0200
+
+libquvi-scripts (0.4.14-1) unstable; urgency=low
+
+  * New upstream release.
+  * debian/copyright: Update for new upstream release.
+
+ -- Ansgar Burchardt <ansgar@debian.org>  Thu, 21 Mar 2013 07:46:53 +0100
+
+libquvi-scripts (0.4.13-1) experimental; urgency=low
+
+  * New upstream release.
+
+ -- Ansgar Burchardt <ansgar@debian.org>  Tue, 05 Mar 2013 19:14:30 +0100
+
+libquvi-scripts (0.4.12-1) experimental; urgency=low
+
+  * New upstream release.
+  * debian/copyright: Update for new upstream release.
+
+ -- Ansgar Burchardt <ansgar@debian.org>  Thu, 14 Feb 2013 23:02:39 +0100
+
+libquvi-scripts (0.4.11-1) experimental; urgency=low
+
+  * New upstream release.
+  * debian/copyright: Update for new upstream release.
+
+ -- Ansgar Burchardt <ansgar@debian.org>  Sat, 09 Feb 2013 14:31:20 +0100
+
+libquvi-scripts (0.4.10-1) experimental; urgency=low
+
+  * New upstream release.
+  * Fix d/watch to allow xz|gz|bz2.
+  * Add new entry to d/copyright (share/lua/website/tapuz.lua).
+  * Remove d/patches. Upstream author include patch. 
+
+ -- Alejandro Garrido Mota <garridomota@gmail.com>  Sun, 16 Dec 2012 10:07:38 -0430
+
 libquvi-scripts (0.4.8-3) unstable; urgency=low
 
   * Backport upstream patch for new signature parameter on YouTube.
diff --git a/debian/control b/debian/control
index 0c167c4..99d3b01 100644
--- a/debian/control
+++ b/debian/control
@@ -4,7 +4,7 @@ Priority: extra
 Maintainer: Alejandro Garrido Mota <garridomota@gmail.com>
 Uploaders: Ansgar Burchardt <ansgar@debian.org>
 Build-Depends: debhelper (>= 8.1.3~), dh-autoreconf
-Standards-Version: 3.9.3
+Standards-Version: 3.9.4
 Vcs-Git: git://github.com/mogaal/libquvi-scripts.git
 Vcs-Browser: https://github.com/mogaal/libquvi-scripts
 Homepage: http://quvi.sourceforge.net
diff --git a/debian/copyright b/debian/copyright
index 6b27778..60ad7d2 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -5,10 +5,14 @@ Upstream-Name: libquvi-scripts
 
 Files: *
 Copyright:
- 2009,2010,2011,2012 Toni Gundogdu <legatvs@gmail.com>
+ 2009-2013 Toni Gundogdu <legatvs@gmail.com>
  2010,2011,2012 quvi project
 License: LGPL-2.1+
 
+Files: share/lua/website/ard.lua
+Copyright: 2013, Thomas Wei$(D)N(Bschuh
+License: LGPL-2.1+
+
 Files: share/lua/website/tagtele.lua
        share/lua/website/keezmovies.lua
        share/lua/website/xhamster.lua
@@ -49,6 +53,19 @@ Files: share/lua/website/lego.lua
 Copyright: 2012, Ross Burton <ross@burtonini.com>
 License: LGPL-2.1+
 
+Files: share/lua/website/myspass.lua
+       share/lua/website/wdrmaus.lua
+Copyright: 2013, Guido Leisker <guido@guido-leisker.de>
+License: LGPL-2.1+
+
+Files: share/lua/website/tapuz.lua
+Copyright: 2012, Tzafrir Cohen <tzafrir@cohens.org.il>
+License: LGPL-2.1+
+
+Files: share/lua/website/wimp.lua
+Copyright: 2013, Martin Herkt <lachs0r@srsfckn.bit>
+License: LGPL-2.1+
+
 Files: debian/*
 Copyright: 2011 Alejandro Garrido Mota <garridomota@gmail.com>
 License: GPL-3+
diff --git a/debian/patches/688972-youtube.diff b/debian/patches/688972-youtube.diff
deleted file mode 100644
index 3c6945c..0000000
--- a/debian/patches/688972-youtube.diff
+++ /dev/null
@@ -1,33 +0,0 @@
-From 5b1c00284e1bae3069b51d07d84d3a096ca6bfcf Mon Sep 17 00:00:00 2001
-From: Martin Herkt <lachs0r@hong-mailing.de>
-Date: Thu, 27 Sep 2012 13:45:27 +0200
-Subject: [PATCH] Fix youtube.lua
-Bug-Debian: http://bugs.debian.org/688972
-
-YouTube has added a new "signature" parameter to their playback URLs.
-Append this parameter to the URL if url_encoded_fmt_stream_map contains
-"sig".
----
- share/lua/website/youtube.lua |    6 +++++-
- 1 file changed, 5 insertions(+), 1 deletion(-)
-
-diff --git a/share/lua/website/youtube.lua b/share/lua/website/youtube.lua
-index e7fc60c..39cc31d 100644
---- a/share/lua/website/youtube.lua
-+++ b/share/lua/website/youtube.lua
-@@ -125,7 +125,11 @@ function YouTube.iter_formats(config, U)
-     for f in fmt_stream_map:gmatch('([^,]*),') do
-         local d = U.decode(f)
-         if d['itag'] and d['url'] then
--            urls[U.unescape(d['itag'])] = U.unescape(d['url'])
-+            local uurl = U.unescape(d['url'])
-+            if d['sig'] then
-+                uurl = uurl .. "&signature=" .. U.unescape(d['sig'])
-+            end
-+            urls[U.unescape(d['itag'])] = uurl
-         end
-     end
- 
--- 
-1.7.10.4
-
diff --git a/debian/patches/series b/debian/patches/series
deleted file mode 100644
index 74b736b..0000000
--- a/debian/patches/series
+++ /dev/null
@@ -1 +0,0 @@
-688972-youtube.diff
diff --git a/debian/watch b/debian/watch
index 21f7f8d..6f04864 100644
--- a/debian/watch
+++ b/debian/watch
@@ -1,2 +1,2 @@
 version=3
-http://sf.net/quvi/libquvi-scripts-(\d.*).tar.gz
+http://sf.net/quvi/libquvi-scripts-(.*).tar.(?:xz|gz|bz2)
diff --git a/share/Makefile.am b/share/Makefile.am
index a8d03cf..31ec9fc 100644
--- a/share/Makefile.am
+++ b/share/Makefile.am
@@ -9,32 +9,33 @@ DIST_lua=\
  lua/website/README \
  lua/website/quvi/bit.lua \
  lua/website/quvi/const.lua \
+ lua/website/quvi/html.lua \
  lua/website/quvi/url.lua \
  lua/website/quvi/util.lua \
  lua/website/101greatgoals.lua \
  lua/website/1tvru.lua \
  lua/website/academicearth.lua \
+ lua/website/ardmediathek.lua \
  lua/website/arte.lua \
  lua/website/audioboo.lua \
  lua/website/bbc.lua \
+ lua/website/bikeradar.lua \
  lua/website/break.lua \
  lua/website/canalplus.lua \
  lua/website/cbsnews.lua \
  lua/website/charlierose.lua \
  lua/website/clipfish.lua \
- lua/website/collegehumor.lua \
  lua/website/dailymotion.lua \
  lua/website/foxnews.lua \
  lua/website/funnyordie.lua \
  lua/website/gaskrank.lua \
- lua/website/golem.lua \
  lua/website/guardian.lua \
  lua/website/imdb.lua \
  lua/website/justintv.lua \
  lua/website/lego.lua \
  lua/website/liveleak.lua \
- lua/website/mgnetwork.lua \
  lua/website/metacafe.lua \
+ lua/website/myspass.lua \
  lua/website/publicsenat.lua \
  lua/website/sapo.lua \
  lua/website/senat.lua \
@@ -42,6 +43,7 @@ DIST_lua=\
  lua/website/soundcloud.lua \
  lua/website/spiegel.lua \
  lua/website/tagtele.lua \
+ lua/website/tapuz.lua \
  lua/website/ted.lua \
  lua/website/tvlux.lua \
  lua/website/tvrain.lua \
@@ -50,35 +52,43 @@ DIST_lua=\
  lua/website/videa.lua \
  lua/website/videobash.lua \
  lua/website/vimeo.lua \
- lua/website/yfrog.lua \
+ lua/website/wdrmaus.lua \
+ lua/website/wimp.lua \
  lua/website/youtube.lua
 
 if WITH_NSFW
 DIST_lua+=\
+ lua/website/beeg.lua \
+ lua/website/deviantclip.lua \
  lua/website/empflix.lua \
- lua/website/pornhub.lua \
+ lua/website/jizzhut.lua \
+ lua/website/keezmovies.lua \
  lua/website/redtube.lua \
  lua/website/spankwire.lua \
  lua/website/tcmag.lua \
  lua/website/tnaflix.lua \
  lua/website/totallynsfw.lua \
  lua/website/xhamster.lua \
+ lua/website/xnxx.lua \
  lua/website/xvideos.lua \
  lua/website/youjizz.lua
 endif
 
 if WITH_FIXME
 DIST_lua+=\
- lua/website/bikeradar.lua \
  lua/website/blip.lua \
  lua/website/bloomberg.lua \
+ lua/website/collegehumor.lua \
  lua/website/francetelevisions.lua \
  lua/website/globo.lua \
+ lua/website/golem.lua \
+ lua/website/mgnetwork.lua \
  lua/website/pluzz.lua
 if WITH_NSFW
 DIST_lua+=\
- lua/website/tube8.lua \
- lua/website/keezmovies.lua
+ lua/website/fastjizz.lua \
+ lua/website/pornhub.lua \
+ lua/website/tube8.lua
 endif
 endif # WITH_FIXME
 
diff --git a/share/lua/website/101greatgoals.lua b/share/lua/website/101greatgoals.lua
index c204c04..55f10da 100644
--- a/share/lua/website/101greatgoals.lua
+++ b/share/lua/website/101greatgoals.lua
@@ -20,7 +21,7 @@
 -- 02110-1301  USA
 --
 
--- Hundred and One Great Goals
+-- Hundred and One Great Goals (aggregator)
 local HaOgg = {} -- Utility functions specific to this script
 
 -- Identify the script.
@@ -32,106 +33,71 @@ function ident(self)
     r.formats    = "default"
     r.categories = C.proto_http
     local U      = require 'quvi/util'
-    r.handles    = U.handles(self.page_url, {r.domain}, {"/gvideos/.+"})
+    r.handles    = U.handles(self.page_url, {r.domain}, {"/gvideos/.+/$"})
     return r
 end
 
 -- Query available formats.
 function query_formats(self)
     self.formats = 'default'
-    return HaOgg.check_external_content(self)
+    return HaOgg.chk_ext_content(self)
 end
 
 -- Parse media URL.
 function parse(self)
     self.host_id = "101greatgoals"
-    return HaOgg.check_external_content(self)
+    return HaOgg.chk_ext_content(self)
 end
 
 --
 -- Utility functions
 --
 
-function HaOgg.check_external_content(self)
-    local p = quvi.fetch(self.page_url)
-
-    local m = '<div .- id="space4para" class="post%-type%-gvideos">'
-              ..'.-<script (.-)</script>'
-    local a = p:match(m) or error("no match: article")
-
-    -- Self-hosted, and they use YouTube
-    -- http://www.101greatgoals.com/gvideos/golazo-wanchope-abila-sarmiento-junin-v-merlo-2/
-    if a:match('id="jwplayer%-1%-div"') then -- get the javascript chunk for jwplayer
+function HaOgg.chk_self_hosted(p)
+    --
+    -- Previously referred to as the "self-hosted" media, although according
+    -- to the old notes, these were typically hosted by YouTube.
+    --    http://is.gd/EKKPy2
+    --
+    -- 2013-05-05: The contents of the URL no longer seems to contain the
+    --             "file" value, see chk_embedded for notes; keep this
+    --             function around for now
+    --
+    local d = p:match('%.setup%((.-)%)')
+    if d then
+        local s = d:match('"file":"(.-)"') or error('no match: file')
+        if #s ==0 then
+            error('empty media URL ("file")')
+        end
         local U = require 'quvi/util'
-        local s = p:match('"file":"(.-)"') or error('no match: file location')
-        a = U.unescape(s):gsub("\\/", "/")
-    end
-
-    -- e.g. http://www.101greatgoals.com/gvideos/ea-sports-uefa-euro-2012-launch-trailer/
-    -- or
-    -- http://www.101greatgoals.com/gvideos/golazo-wanchope-abila-sarmiento-junin-v-merlo-2/
-    local s = a:match('http://.*youtube.com/embed/([^/"]+)')
-                or a:match('http://.*youtube.com/v/([^/"]+)')
-                or a:match('http://.*youtube.com/watch%?v=([^/"]+)')
-                or a:match('http://.*youtu%.be/([^/"]+)')
-    if s then
-        self.redirect_url = 'http://youtube.com/watch?v=' .. s
-        return self
+        return (U.slash_unescape(U.unescape(s)))
     end
+end
 
-    -- e.g. http://www.101greatgoals.com/gvideos/leicester-1-west-ham-2/
-    -- or
-    -- http://www.101greatgoals.com/gvideos/golazo-alvaro-negredo-overhead-kick-puts-sevilla-1-0-up-at-getafe/
-    local s = a:match('http://.*dailymotion.com/embed/video/([^?"]+)')
-              or a:match('http://.*dailymotion.com/swf/video/([^?"]+)')
-    if s then
-        self.redirect_url = 'http://dailymotion.com/video/' .. s
-        return self
-    end
-
-    -- e.g. http://www.101greatgoals.com/gvideos/2-0-juventus-arturo-vidal-2-v-roma/
-    local s = a:match('http://.*videa.hu/flvplayer.swf%?v=([^?"]+)')
-    if s then
-        self.redirect_url = 'http://videa.hu/flvplayer.swf?v=' .. s
-        return self
-    end
-
-    -- e.g. http://www.101greatgoals.com/gvideos/golazo-hulk-porto-v-benfica/
-    local s = a:match('http://.*sapo.pt/([^?"/]+)')
-    if s then
-        self.redirect_url = 'http://videos.sapo.pt/' .. s
-        return self
-    end
-
-    -- FIXME rutube support missing
-    -- e.g. http://www.101greatgoals.com/gvideos/allesandro-diamanti-bologna-1-0-golazo-v-cagliari-2/
-    local s = a:match('http://video.rutube.ru/([^?"]+)')
-    if s then
-        self.redirect_url = 'http://video.rutube.ru/' .. s
-        return self
-    end
-
-    -- FIXME svt.se support missing
-    -- e.g. http://www.101greatgoals.com/gvideos/gais-2-norrkoping-0/
-    local s = a:match('http://svt%.se/embededflash/(%d+)/play%.swf')
-    if s then
-        self.redirect_url = 'http://svt.se/embededflash/' .. s .. '/play.swf'
-        return self
-    end
-
-    -- FIXME lamalla.tv support missing
-    -- e.g. http://www.101greatgoals.com/gvideos/golazo-bakary-espanyol-b-vs-montanesa/
-
-    -- FIXME indavideo.hu support missing
-    -- e.g. http://www.101greatgoals.com/gvideos/golazo-michel-bastos-lyon-v-psg-3/
+function HaOgg.chk_embedded(p)
+    --
+    -- 2013-05-05: Most of the content appears to be embedded from elsewhere
+    --
+    -- Instead of trying to check for each, parse the likely embedded source
+    -- and pass it back to libquvi to find a media script that accepts the
+    -- parsed (embedded) media URL.
+    --
+    -- NOTE: This means that those media scripts must unwrangle the embedded
+    --       media URLs passed from this script
+    --
+    local s = p:match('class="post%-type%-gvideos">(.-)</')
+                  or p:match('id="jwplayer%-1">(.-)</>')
+                      or error('unable to determine embedded source')
+    return s:match('value="(.-)"') or s:match('src="(.-)"')
+end
 
-    -- FIXME xtsream.dk support missing
-    -- e.g. http://www.101greatgoals.com/gvideos/golazo-the-ball-doesnt-hit-the-floor-viktor-claesson-elfsborg-v-fc-copenhagen-1-22-mins-in/
+function HaOgg.chk_ext_content(self)
+    local p = quvi.fetch(self.page_url)
 
-    -- FIXME mslsoccer.com support missing
-    -- e.g. http://www.101greatgoals.com/gvideos/thierry-henry-back-heel-assist-mehdi-ballouchy-v-montreal-impact/
+    self.redirect_url = HaOgg.chk_self_hosted(p) or HaOgg.chk_embedded(p)
+                          or error('unable to determine media source')
 
-    error("FIXME: no support: Unable to determine the media host")
+    return self
 end
 
 -- vim: set ts=4 sw=4 tw=72 expandtab:
diff --git a/share/lua/website/1tvru.lua b/share/lua/website/1tvru.lua
index 8ba6f2e..1e626ba 100644
--- a/share/lua/website/1tvru.lua
+++ b/share/lua/website/1tvru.lua
@@ -52,10 +52,10 @@ function parse(self)
 
     local p = quvi.fetch(self.page_url)
 
-    self.title = p:match(OTvRu.pattern('title', '(.-)'))
+    self.title = p:match("'title': '(.-)'")
                   or error("no match: media title")
 
-    self.url = {p:match(OTvRu.pattern('file', '(.-)'))
+    self.url = {p:match("'file': '(.-)'")
                   or error("no match: media stream URL")}
 
     self.thumbnail_url = p:match('"og:image" content="(.-)"') or ''
@@ -63,9 +63,11 @@ function parse(self)
     return self
 end
 
+--[[
 function OTvRu.pattern(key_name, value_pattern)
    return string.format("jwplayer%%('flashvideoportal_1'%%).*'%s': '%s'",
                           key_name, value_pattern)
 end
+]]--
 
 -- vim: set ts=4 sw=4 tw=72 expandtab:
diff --git a/share/lua/website/academicearth.lua b/share/lua/website/academicearth.lua
index 0b9994d..a1d4201 100644
--- a/share/lua/website/academicearth.lua
+++ b/share/lua/website/academicearth.lua
@@ -54,17 +54,8 @@ end
 
 function AcademicEarth.get_redirect_url(self)
     local p = quvi.fetch(self.page_url)
-    local s = p:match('ytID = "(.-)"')
-    if s then
-        self.redirect_url = 'http://youtube.com/e/' .. s
-    else
-        local s = p:match('embed src="(.-)"') -- blip
-        if s then
-            self.redirect_url = s
-        else
-            error('no match: blip or youtube pattern')
-        end
-    end
+    self.redirect_url = p:match('"(http://www%.youtube%.com/watch.-)"')
+                            or error('no match: unrecognized media source')
     return self
 end
 
diff --git a/share/lua/website/ardmediathek.lua b/share/lua/website/ardmediathek.lua
new file mode 100644
index 0000000..167c5c4
--- /dev/null
+++ b/share/lua/website/ardmediathek.lua
@@ -0,0 +1,168 @@
+-- libquvi-scripts v0.4.15
+-- Copyright (C) 2013  Thomas Wei$(D)N(Bschuh
+--
+-- This file is part of libquvi-scripts <http://quvi.sourceforge.net/>.
+--
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public
+-- License as published by the Free Software Foundation; either
+-- version 2.1 of the License, or (at your option) any later version.
+--
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+-- Lesser General Public License for more details.
+--
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+-- 02110-1301  USA
+
+local ArdMediathek = {}
+
+function ident(self)
+    package.path = self.script_dir .. '/?.lua'
+    local C      = require 'quvi/const'
+    local U      = require 'quvi/util'
+    local B      = require 'quvi/bit'
+    local r      = {}
+    r.domain     = 'www%.ardmediathek%.de'
+    r.formats    = 'default|best'
+    r.categories = B.bit_or(C.proto_http, C.proto_rtmp)
+    r.handles    = U.handles(self.page_url, {r.domain},
+                               nil, {"documentId=%d+$"})
+    return r
+end
+
+function query_formats(self)
+    local config = ArdMediathek.get_config(self)
+    local formats = ArdMediathek.iter_formats(config)
+
+    local t = {}
+    for _,v in pairs(formats) do
+        table.insert(t, ArdMediathek.to_s(v))
+    end
+
+    table.sort(t)
+    self.formats = table.concat(t, "|")
+
+    return self
+end
+
+function parse(self)
+
+    local config = ArdMediathek.get_config(self)
+    local Util  = require 'quvi/util'
+
+    self.host_id = 'ard'
+    self.title = config:match(
+                     '<meta property="og:title" content="([^"]*)'
+                 ):gsub(
+                    '%s*%- %w-$', '' -- remove name of station
+                 ):gsub(
+                    '%s*%(FSK.*', '' -- remove FSK nonsense
+                 )
+                 or error('no match: media title')
+    self.thumbnail_url = config:match(
+                             '<meta property="og:image" content="([^"]*)'
+                         ) or ''
+
+    local formats = ArdMediathek.iter_formats(config)
+    local format  = Util.choose_format(self,
+                                       formats,
+                                       ArdMediathek.choose_best,
+                                       ArdMediathek.choose_default,
+                                       ArdMediathek.to_s)
+                    or error('unable to choose format')
+
+    if not format.url then error('no match: media url') end
+    self.url = { format.url }
+
+    return self
+end
+
+function ArdMediathek.test_availability(page)
+    -- some videos are only scrapable at certain times
+    local fsk_pattern =
+        'Der Clip ist deshalb nur von (%d%d?) bis (%d%d?) Uhr verf$(D+d(Bgbar'
+    local from, to = page:match(fsk_pattern)
+    if from and to then
+        error('video only available from ' ..from.. ':00 to '
+              ..to.. ':00 CET')
+    end
+end
+
+function ArdMediathek.get_config(self)
+    local c = quvi.fetch(self.page_url)
+    self.id = self.page_url:match('documentId=(%d*)')
+              or error('no match: media id')
+    if c:match('<title>ARD Mediathek %- Fehlerseite</title>') then
+        error('invalid URL, maybe the media is no longer available')
+    end
+
+    return c
+end
+
+function ArdMediathek.choose_best(t)
+    return t[#t] -- return the last from the array
+end
+
+function ArdMediathek.choose_default(t)
+    return t[1] -- return the first from the array
+end
+
+function ArdMediathek.to_s(t)
+    return string.format("%s_%s_i%02d%s%s",
+              (t.quality) and t.quality or 'sd',
+              t.container, t.stream_id,
+              (t.encoding) and '_'..t.encoding or '',
+              (t.height) and '_'..t.height or '')
+end
+
+function ArdMediathek.quality_from(suffix)
+    local q = suffix:match('%.web(%w)%.') or suffix:match('%.(%w)%.')
+                or suffix:match('[=%.]Web%-(%w)') -- .webs. or Web-S or .s
+    if q then
+        q = q:lower()
+        local t = {s='ld', m='md', l='sd', xl='hd'}
+        for k,v in pairs(t) do
+            if q == k then return v end
+        end
+    end
+    return q
+end
+
+function ArdMediathek.height_from(suffix)
+    local h = suffix:match('_%d+x(%d+)[_%.]')
+    if h then return h..'p' end
+end
+
+function ArdMediathek.container_from(suffix)
+    return suffix:match('^(...):') or suffix:match('%.(...)$') or 'mp4'
+end
+
+function ArdMediathek.iter_formats(page)
+    local r = {}
+    local s = 'mediaCollection%.addMediaStream'
+                .. '%(0, (%d+), "(.-)", "(.-)", "%w+"%);'
+
+    ArdMediathek.test_availability(page)
+
+    for s_id, prefix, suffix in  page:gmatch(s) do
+        local u = prefix .. suffix
+        u = u:match('^(.-)?') or u  -- remove querystring
+        local t = {
+            container = ArdMediathek.container_from(suffix),
+            encoding = suffix:match('%.(h264)%.'),
+            quality = ArdMediathek.quality_from(suffix),
+            height = ArdMediathek.height_from(suffix),
+            stream_id = s_id, -- internally (by service) used stream ID
+            url = u
+        }
+        table.insert(r,t)
+    end
+    if #r == 0 then error('no media urls found') end
+    return r
+end
+
+-- vim: set ts=4 sw=4 sts=4 tw=72 expandtab:
diff --git a/share/lua/website/audioboo.lua b/share/lua/website/audioboo.lua
index 01d3061..89e0c5f 100644
--- a/share/lua/website/audioboo.lua
+++ b/share/lua/website/audioboo.lua
@ -43,22 +43,23 @@ end
 function parse (self)
     self.host_id = "audioboo"
 
-    local oe_url =
-        "http://audioboo.fm/publishing/oembed.json?url="; .. self.page_url
+    self.id = self.page_url:match('/boos/(%d+)%-')
+                or error('no match: media ID')
 
-    local oe = quvi.fetch(oe_url, {fetch_type='config'})
+    local p = quvi.fetch(self.page_url)
 
-    self.title = oe:match('"title":"(.-)"')
-                    or error('no match: media title')
+    self.title =
+        p:match('.+content=[\'"](.-)[\'"]%s+property=[\'"]og:title[\'"]')
+          or error('no match: media title')
 
-    self.thumbnail_url = oe:match('"thumbnail_url":"(.-)"') or ''
-
-    self.id = oe:match('id=."boo_embed_(.-)."')
-                or error('no match: media id')
-
-    self.url = {oe:match('a href=."(.-)."')
-                    or error('no match: media url')}
+    self.thumbnail_url =
+        p:match('.+content=[\'"](.-)[\'"]%s+property=[\'"]og:image[\'"]')
+          or ''
 
+    self.url = {
+        p:match('.+content=[\'"](.-)[\'"]%s+property=[\'"]og:audio[\'"]')
+          or error('no match: media stream URL')
+    }
     return self
 end
 
diff --git a/share/lua/website/yfrog.lua b/share/lua/website/beeg.lua
similarity index 66%
rename from share/lua/website/yfrog.lua
rename to share/lua/website/beeg.lua
index ffeab30..a2be776 100644
--- a/share/lua/website/yfrog.lua
+++ b/share/lua/website/beeg.lua
@@ -25,11 +25,11 @@ function ident(self)
     package.path = self.script_dir .. '/?.lua'
     local C      = require 'quvi/const'
     local r      = {}
-    r.domain     = "yfrog%.com"
+    r.domain     = "beeg%.com"
     r.formats    = "default"
     r.categories = C.proto_http
     local U      = require 'quvi/util'
-    r.handles    = U.handles(self.page_url, {r.domain}, {"/%w+"})
+    r.handles    = U.handles(self.page_url, {r.domain}, {"/%d+"})
     return r
 end
 
@@ -41,21 +41,18 @@ end
 
 -- Parse media URL.
 function parse(self)
-    self.host_id = "yfrog"
+    self.host_id = "beeg"
 
-    self.id = self.page_url:match('%.com/(%w+)')
-                or error('no match: media id')
+    self.id = self.page_url:match('/(%d+)')
+                or error("no match: media ID")
 
-    local page = quvi.fetch(self.page_url)
+    local p = quvi.fetch(self.page_url)
 
-    self.title = page:match('<title>(.-)</title>')
-                    or error('no match: media title')
+    self.title = p:match('<meta name="description" content="(.-)%.')
+                  or error("no match: media title")
 
-    self.thumbnail_url = page:match('"og:image" content="(.-)"')
-                    or ''
-
-    self.url   = {page:match('input class="readonly" value="(.-)"')
-                    or error('no match: media url')}
+    self.url = {p:match("'file': '(http://.-)'")
+                  or error("no match: media stream URL")}
 
     return self
 end
diff --git a/share/lua/website/bikeradar.lua b/share/lua/website/bikeradar.lua
index ce67695..3d3184e 100644
--- a/share/lua/website/bikeradar.lua
+++ b/share/lua/website/bikeradar.lua
@@ -29,7 +30,7 @@ function ident(self)
     r.formats    = "default"
     r.categories = C.proto_http
     local U      = require 'quvi/util'
-    r.handles    = U.handles(self.page_url, {r.domain})
+    r.handles    = U.handles(self.page_url, {r.domain}, {'/videos/.-%-%w+$'})
     return r
 end
 
@@ -43,20 +44,10 @@ end
 function parse(self)
     self.host_id  = "bikeradar"
 
-    self.id = self.page_url:match('bikeradar.com/.+-(%d+)$')
-                or error("no match: media ID")
-
     local p = quvi.fetch(self.page_url)
 
-    self.title = p:match('"og:title" content="(.-)"/>')
-                  or error("no match: media title")
-
-    self.thumbnail_url = p:match('"og:image" content="(.-)"') or ''
-
-    local fn = p:match('<param name="flashvars" value="vcode=(%w+)&')
-                or error("no match: file name")
-
-    self.url = {string.format("http://cdn.video.bikeradar.com/%s.flv",fn)}
+    self.redirect_url = p:match('"embedURL" href="(.-)"')
+                            or error('no match: embedURL')
 
     return self
 end
diff --git a/share/lua/website/break.lua b/share/lua/website/break.lua
index 55be152..a07fc42 100644
--- a/share/lua/website/break.lua
+++ b/share/lua/website/break.lua
@@ -45,19 +45,21 @@ function parse(self)
 
     local p = quvi.fetch(self.page_url)
 
-    self.title = p:match('id="vid_title" content="(.-)"')
+    self.title = p:match("sVidTitle:%s+['\"](.-)['\"]")
                   or error("no match: media title")
 
-    self.id = p:match("ContentID='(.-)'")
+    self.id = p:match("iContentID:%s+'(.-)'")
                 or error("no match: media ID")
 
-    local fn = p:match("FileName='(.-)'")
-                or error("no match: file name")
+    self.thumbnail_url = p:match('"og:image" content="(.-)"') or ''
 
-    local fh = p:match('flashVars.icon = "(.-)"')
+    local n = p:match("videoPath:%s+['\"](.-)['\"]")
+                or error("no match: file path")
+
+    local h = p:match("icon:%s+['\"](.-)['\"]")
                 or error("no match: file hash")
 
-    self.url = {string.format("%s.flv?%s", fn, fh)}
+    self.url = {string.format("%s?%s", n, h)}
 
     return self
 end
diff --git a/share/lua/website/clipfish.lua b/share/lua/website/clipfish.lua
index 914baf2..3161f2e 100644
--- a/share/lua/website/clipfish.lua
+++ b/share/lua/website/clipfish.lua
@@ -24,10 +24,11 @@
 function ident(self)
     package.path = self.script_dir .. '/?.lua'
     local C      = require 'quvi/const'
+    local B      = require 'quvi/bit'
     local r      = {}
     r.domain     = "clipfish%.de"
     r.formats    = "default"
-    r.categories = C.proto_http
+    r.categories = B.bit_or(C.proto_http, C.proto_rtmp)
     local U      = require 'quvi/util'
     r.handles    = U.handles(self.page_url, {r.domain}, {"/video/%d+/"})
     return r
diff --git a/share/lua/website/dailymotion.lua b/share/lua/website/dailymotion.lua
index 5ee6912..459af3e 100644
--- a/share/lua/website/dailymotion.lua
+++ b/share/lua/website/dailymotion.lua
@@ -63,7 +63,7 @@ function parse(self)
     local U = require 'quvi/util'
     local p = Dailymotion.fetch_page(self, U)
 
-    self.title = p:match('title="(.-)"')
+    self.title = p:match('"og:title" content="(.-)"')
                   or error("no match: media title")
 
     self.id = p:match("video/([^%?_]+)")
diff --git a/share/lua/website/deviantclip.lua b/share/lua/website/deviantclip.lua
new file mode 100644
index 0000000..ae440f7
--- /dev/null
+++ b/share/lua/website/deviantclip.lua
@@ -0,0 +1,73 @@
+
+-- libquvi-scripts v0.4.15
+-- Copyright (C) 2012  quvi project
+--
+-- This file is part of libquvi-scripts <http://quvi.sourceforge.net/>.
+--
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public
+-- License as published by the Free Software Foundation; either
+-- version 2.1 of the License, or (at your option) any later version.
+--
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+-- Lesser General Public License for more details.
+--
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+-- 02110-1301  USA
+--
+
+local Deviantclip = {} -- Utility functions unique to this script
+
+-- Identify the script.
+function ident(self)
+    package.path = self.script_dir .. '/?.lua'
+    local C      = require 'quvi/const'
+    local r      = {}
+    r.domain     = "deviantclip%.com"
+    r.formats    = "default"
+    r.categories = C.proto_http
+    local U      = require 'quvi/util'
+    r.handles    = U.handles(self.page_url, {r.domain}, {"/watch/.+"})
+    return r
+end
+
+-- Query available formats.
+function query_formats(self)
+    self.formats = 'default'
+    return self
+end
+
+-- Parse media URL.
+function parse(self)
+    self.host_id = "deviantclip"
+
+    self.id = self.page_url:match('/watch/(.+)')
+                or error("no match: media ID")
+
+    local p = quvi.fetch(self.page_url)
+
+    self.title = p:match('DC%.title" content="(.-)" ')
+                  or error("no match: media title")
+    self.title = self.title:gsub('&#x(%d+);', Deviantclip.to_utf8)
+
+    local U = require 'quvi/util'
+    self.url = {U.unescape (p:match('%[{"file":"(.-)",'))
+                  or error("no match: media stream URL")}
+
+    return self
+end
+
+--
+-- Utility functions
+--
+
+function Deviantclip.to_utf8(a) -- Unescape &#x00; to UTF-8
+    local H = require 'quvi/html'
+    return H.to_utf8("0x" .. a)
+end
+
+-- vim: set ts=4 sw=4 tw=72 expandtab:
diff --git a/share/lua/website/fastjizz.lua b/share/lua/website/fastjizz.lua
new file mode 100644
index 0000000..16a4222
--- /dev/null
+++ b/share/lua/website/fastjizz.lua
@@ -0,0 +1,72 @@
+
+-- libquvi-scripts v0.4.15
+-- Copyright (C) 2012  quvi project
+--
+-- This file is part of libquvi-scripts <http://quvi.sourceforge.net/>.
+--
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public
+-- License as published by the Free Software Foundation; either
+-- version 2.1 of the License, or (at your option) any later version.
+--
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+-- Lesser General Public License for more details.
+--
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+-- 02110-1301  USA
+--
+
+-- Identify the script.
+function ident(self)
+    package.path = self.script_dir .. '/?.lua'
+    local C      = require 'quvi/const'
+    local r      = {}
+    r.domain     = "fastjizz%.com"
+    r.formats    = "default"
+    r.categories = C.proto_http
+    local U      = require 'quvi/util'
+    r.handles    = U.handles(self.page_url, {r.domain}, {"/video/%d+/.*"})
+    if r.handles then return r end
+    -- Handle embedded URLs here
+    r.handles    = U.handles(self.page_url, {r.domain},
+                    {"/embed%.php"}, {"id=%d+"})
+    return r
+end
+
+-- Query available formats.
+function query_formats(self)
+    self.formats = 'default'
+    return self
+end
+
+-- Parse media URL.
+function parse(self)
+    self.host_id = "fastjizz"
+
+    self.id = self.page_url:match('/video/(%d+).*')
+    if not self.id then
+        self.id = self.page_url:match('/embed%.php%?id=(%d+)')
+            or error("no match: media ID")
+    end
+
+    local p =
+      quvi.fetch("http://www.fastjizz.com/media/nuevo/playlist.php?key=";
+                  .. self.id)
+
+    self.title = p:match('<title>(.+)</title>')
+                    or error("no match: media title")
+
+    self.thumbnail_url =
+        p:match('<image>(.+)</image>') or ''
+
+    self.url = {p:match('<file>(.+)</file>')
+                  or error("no match: media stream URL")}
+
+    return self
+end
+
+-- vim: set ts=4 sw=4 tw=72 expandtab:
diff --git a/share/lua/website/funnyordie.lua b/share/lua/website/funnyordie.lua
index f3beb7d..d69cd26 100644
--- a/share/lua/website/funnyordie.lua
+++ b/share/lua/website/funnyordie.lua
@@ -61,7 +61,7 @@ function parse(self)
                     or error ("no match: media title")
 
     self.id = page:match('key:%s+"(.-)"')
-                or error ("no match: media id")
+                or error ("no match: media ID")
 
     self.thumbnail_url = page:match('"og:image" content="(.-)"') or ''
 
@@ -72,7 +72,7 @@ function parse(self)
                                      FunnyOrDie.choose_default,
                                      FunnyOrDie.to_s)
                         or error("unable to choose format")
-    self.url      = {format.url or error('no match: media url')}
+    self.url      = {format.url or error('no match: media stream URL')}
     return self
 end
 
@@ -82,26 +82,24 @@ end
 
 function FunnyOrDie.iter_formats(page)
     local t = {}
-    for u in page:gmatch("'src',%s+'(.-)'") do
-        local q,c = u:match('(%w+)%.(%w+)$')
-        table.insert(t, {url=u, quality=q, container=c})
---        print(u,c)
+    for u in page:gmatch('source src="(.-)"') do
+        table.insert(t,u)
     end
-    return t
-end
-
-function FunnyOrDie.choose_best(formats) -- Last is 'best'
-    local r = FunnyOrDie.choose_default(formats)
-    for _,v in pairs(formats) do
-        r = v
+    table.remove(t,1) -- Remove the first: the URL for segmented videos
+    local r = {}
+    for _,u in pairs(t) do
+        local q,c = u:match('/(%w+)%.(%w+)$')
+        table.insert(r, {url=u, quality=q, container=c})
     end
     return r
 end
 
-function FunnyOrDie.choose_default(formats) -- First is 'default'
-    for _,v in pairs(formats) do
-        return v
-    end
+function FunnyOrDie.choose_best(formats)
+    return FunnyOrDie.choose_default(formats)
+end
+
+function FunnyOrDie.choose_default(formats)
+    return formats[1]
 end
 
 function FunnyOrDie.to_s(t)
diff --git a/share/lua/website/gaskrank.lua b/share/lua/website/gaskrank.lua
index bab03de..412d670 100644
--- a/share/lua/website/gaskrank.lua
+++ b/share/lua/website/gaskrank.lua
@@ -45,10 +45,12 @@ function parse(self)
 
     local p = quvi.fetch(self.page_url)
 
+    self.thumbnail_url = p:match('"og:image" content="(.-)"') or ''
+
     self.title = p:match('"og:title" content="(.-)"')
                   or error('no match: media title')
 
-    local u = p:match("(http://movies.-%.flv)")
+    local u = p:match('(http://movies.-)["\']')
                 or error("no match: media stream URL")
 
     self.id = u:match("/%d+/(%d+)%.%w+") or error("no match: media ID")
diff --git a/share/lua/website/guardian.lua b/share/lua/website/guardian.lua
index cfd8fc1..2e913b8 100644
--- a/share/lua/website/guardian.lua
+++ b/share/lua/website/guardian.lua
@@ -20,22 +20,10 @@
 -- 02110-1301  USA
 --
 
---
--- NOTE: Ignores the m3u8 format. Patches welcome.
---
---   libquvi allows specifying multiple media stream URLs in
---   "self.url" (referred sometimes as "media or video segments"),
---   e.g.
---      self.url = {"http://foo";, "http://bar"}
---
---   Whether the applications using libquvi make any use of this,
---   is a whole different matter.
---
-
 local Guardian = {} -- Utility functions unique to this script
 
 -- Identify the script.
-function ident (self)
+function ident(self)
     package.path = self.script_dir .. '/?.lua'
     local C      = require 'quvi/const'
     local r      = {}
@@ -43,24 +31,13 @@ function ident (self)
     r.formats    = "default"
     r.categories = C.proto_http
     local U      = require 'quvi/util'
-    r.handles    = U.handles(self.page_url,
-                    {r.domain}, {"/video/","/audio"})
+    r.handles    = U.handles(self.page_url, {r.domain}, {"/video/","/audio/"})
     return r
 end
 
 -- Query available formats.
 function query_formats(self)
-    local c = Guardian.get_config(self)
-    local fmts = Guardian.iter_formats(c)
-
-    local t = {}
-    for _,v in pairs(fmts) do
-        table.insert(t, Guardian.to_s(v))
-    end
-
-    table.sort(t)
-    self.formats = table.concat(t, "|")
-
+    self.formats = 'default'
     return self
 end
 
@@ -68,63 +45,26 @@ end
 function parse(self)
     self.host_id = "guardian"
 
-    local c = Guardian.get_config(self)
-
-    local formats = Guardian.iter_formats(c)
-    local U = require 'quvi/util'
-    local format  = U.choose_format(self, formats,
-                                    Guardian.choose_best,
-                                    Guardian.choose_default,
-                                    Guardian.to_s)
-                        or error("unable to choose format")
-    self.url = {format.url or error("no match: media url")}
-
-    self.title = c:match('"headline":%s+"(.-)%s+-%s+video"')
-                    or error("no match: media title")
-
-    self.id = c:match('"video%-id":%s+"(.-)"')
-                    or error ("no match: media id")
+    local p = quvi.fetch(self.page_url)
 
-    self.thumbnail_url = c:match('"thumbnail%-image%-url":%s+"(.-)"') or ''
+    self.title = p:match('"og:title" content="(.-)"')
+                    or error('no match: media title')
 
-    local d = c:match('"duration":%s+(%d+)') or 0
-    self.duration = tonumber(d)*1000 -- to msec
+    self.id = p:match('containerID%s+=%s+["\'](.-)["\']')
+                  or p:match('audioID%s+=%s+["\'](.-)["\']')
+                      or ''
 
-    return self
-end
+    self.id = self.id:match('(%d+)') or error('no match: media ID')
 
---
--- Utility functions
---
+    self.duration = tonumber(p:match('duration%:%s+"?(%d+)"?') or 0) * 1000
 
-function Guardian.get_config(self)
-    return quvi.fetch(self.page_url .. "/json", {fetch_type='config'})
-end
+    self.thumbnail_url = p:match('"thumbnail" content="(.-)"')
+                            or p:match('"og:image" content="(.-)"') or ''
 
-function Guardian.iter_formats(config)
-    local p = '"format":%s+"(.-)".-"video%-file%-url":%s+"(.-)"'
-    local t = {}
-    for c,u in config:gmatch(p) do
---        print(f,u)
-        c = c:gsub("video/", "")
-        c = c:gsub(":", "_")
-        if c ~= "m3u8" then -- http://en.wikipedia.org/wiki/M3U
-            table.insert(t, {container=c, url=u})
-        end
-    end
-    return t
-end
+    self.url = {p:match('file:%s+"(.-)"')
+                  or error('no match: media stream URL')}
 
-function Guardian.choose_best(t) -- Expect the first to be the 'best'
-    return t[1]
-end
-
-function Guardian.choose_default(t) -- Use the first
-  return t[1]
-end
-
-function Guardian.to_s(t)
-    return t.container
+    return self
 end
 
 -- vim: set ts=4 sw=4 tw=72 expandtab:
diff --git a/share/lua/website/jizzhut.lua b/share/lua/website/jizzhut.lua
new file mode 100644
index 0000000..a4f22e8
--- /dev/null
+++ b/share/lua/website/jizzhut.lua
@@ -0,0 +1,68 @@
+
+-- libquvi-scripts v0.4.15
+-- Copyright (C) 2012  quvi project
+--
+-- This file is part of libquvi-scripts <http://quvi.sourceforge.net/>.
+--
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public
+-- License as published by the Free Software Foundation; either
+-- version 2.1 of the License, or (at your option) any later version.
+--
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+-- Lesser General Public License for more details.
+--
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+-- 02110-1301  USA
+--
+
+-- Identify the script.
+function ident(self)
+    package.path = self.script_dir .. '/?.lua'
+    local C      = require 'quvi/const'
+    local r      = {}
+    r.domain     = "jizzhut%.com"
+    r.formats    = "default"
+    r.categories = C.proto_http
+    local U      = require 'quvi/util'
+    r.handles    = U.handles(self.page_url, {r.domain},
+                    {"/videos/.*-%d-%.html", "/videos/embed/%d."})
+    return r
+end
+
+-- Query available formats.
+function query_formats(self)
+    self.formats = 'default'
+    return self
+end
+
+-- Parse media URL.
+function parse(self)
+    self.host_id = "jizzhut"
+
+    self.id = self.page_url:match('/videos/.*%-(%d-)%.html')
+    if not self.id then
+        self.id = self.page_url:match('/videos/embed/(%d+)')
+                    or error("no match: media ID")
+    end
+
+    local p = quvi.fetch("http://www.jizzhut.com/videos/-";
+                .. self.id .. ".html")
+
+    self.title = p:match('<title>(.-)</title>')
+                  or error("no match: media title")
+
+    local p = quvi.fetch("http://www.jizzhut.com/videos/embed/";
+                .. self.id, "config")
+
+    self.url = {p:match('encodeURIComponent%("(http://.-)"%)')
+                  or error("no match: media stream URL")}
+
+    return self
+end
+
+-- vim: set ts=4 sw=4 tw=72 expandtab:
diff --git a/share/lua/website/keezmovies.lua b/share/lua/website/keezmovies.lua
index 0d547ff..3828c4a 100644
--- a/share/lua/website/keezmovies.lua
+++ b/share/lua/website/keezmovies.lua
@@ -51,12 +51,23 @@ function parse (self)
     self.id = p:match("id%%3D(.-)&amp;")
                 or error("no match: media id")
 
-    local s = p:match("video_url=(.-)&amp;")
+    local flashvars = p:match('flashvars" value="(.-)"/>')
+                or error("no match: flashvars")
+
+    local s = flashvars:match("video_url=(.-)&amp;")
                 or error("no match: flv url")
 
     local U  = require 'quvi/util'
     self.url = {U.unescape(s)}
 
+    local encrypted = flashvars:match('encrypted=true')
+    if encrypted ~= nil then
+        local key = flashvars:match("video_title=(-.)&amp;")
+        -- XXX No support for AES encrypted URLs
+        -- AESCounterModeDecrypt(self.url, key, 256)
+        error("No support for encrypted streams")
+    end
+
     return self
 end
 
diff --git a/share/lua/website/lego.lua b/share/lua/website/lego.lua
index fbe28db..e3d884f 100644
--- a/share/lua/website/lego.lua
+++ b/share/lua/website/lego.lua
@@ -29,7 +30,8 @@ function ident(self)
     r.formats    = "default"
     r.categories = C.proto_http
     local U      = require 'quvi/util'
-    r.handles    = U.handles(self.page_url, {r.domain}, {"/.+/Movies/.+$"})
+    r.handles    = U.handles(self.page_url, {r.domain}, {"/.+/movies/.+$"})
+      -- http://city.lego.com/en-gb/movies/mini-movies/gold-run/
     return r
 end
 
@@ -42,19 +44,22 @@ end
 -- Parse video URL.
 function parse(self)
     self.host_id = "lego"
+
     local p = quvi.fetch(self.page_url)
 
-    local s = p:match('<trackingName>(.+)</trackingName>')
-              or error("no match: tracking name")
-    local index = s:find("-")
+    local d = p:match('FirstVideoData = {(.-)};')
+                or error('no match: FirstVideoData')
+
+    self.title = d:match('"Name":"(.-)"')
+                  or error('no match: media title')
 
-    self.title = s:sub(0, index-1)
-    self.id = s:sub(index+1)
+    self.id = d:match('"LikeObjectGuid":"(.-)"') -- Lack of a better.
+                  or error('no match: media ID')
 
-    -- TODO self.thumbnail_url
+    self.url = {d:match('"VideoFlash":%{"Url":"(.-)"')
+                  or error('no match: media stream URL')}
 
-    self.url = {p:match('<movie>(.+)</movie>')
-               or error("no match: media stream URL")}
+    -- TODO: return self.thumbnail_url
 
     return self
 end
diff --git a/share/lua/website/metacafe.lua b/share/lua/website/metacafe.lua
index c75c450..2ebff7c 100644
--- a/share/lua/website/metacafe.lua
+++ b/share/lua/website/metacafe.lua
@@ -55,26 +56,22 @@ function parse(self)
     local U = require 'quvi/util'
     local p = Metacafe.fetch_page(self, U)
 
-    self.title = p:match('"title":"(.-)"')
-                  or error("no match: media title")
+    local v = p:match('name="flashvars" value="(.-)"')
+                or error('no match: flashvars')
 
-    self.title = U.unescape(self.title)
-
-    self.id = p:match('"itemID":"(.-)"')
-                or error('no match: media id')
+    v = U.slash_unescape(U.unescape(v))
 
     self.thumbnail_url = p:match('rel="image_src" href="(.-)"') or ''
 
-    local d = p:match('"mediaData":"(.-)"')
-                or error('no match: media data')
-    d = U.unescape(d)
+    self.title = v:match('title=(.-)&') or error('no match: media title')
+
+    self.id = v:match('itemID=(%d+)') or error('no match: media ID')
 
-    local u = d:match('"mediaURL":"(.-)"')
-                or error('no match: media url')
-    u = U.slash_unescape(u)
+    local u = v:match('"mediaURL":"(.-)"')
+                or error('no match: media stream URL')
 
-    local k = d:match('"key":"(.-)"')
-                or error('no match: gda key')
+    local k = v:match('"key":"__gda__","value":"(.-)"')
+                or error('no match: key')
 
     self.url = {string.format("%s?__gda__=%s", u, k)}
 
diff --git a/share/lua/website/myspass.lua b/share/lua/website/myspass.lua
new file mode 100644
index 0000000..1bc6175
--- /dev/null
+++ b/share/lua/website/myspass.lua
@@ -0,0 +1,89 @@
+
+-- libquvi-scripts v0.4.15
+-- Copyright (C) 2012  Guido Leisker <guido@guido-leisker.de>
+--
+-- This file is part of libquvi-scripts <http://quvi.sourceforge.net/>.
+--
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public
+-- License as published by the Free Software Foundation; either
+-- version 2.1 of the License, or (at your option) any later version.
+--
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+-- Lesser General Public License for more details.
+--
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+-- 02110-1301  USA
+
+-- About
+--  Each video url ends with an id composed of digits.
+--  This id leads us to a metadata xml file (see function
+--  MySpass.getMetadataValue) containing all necessary information
+--  including download link.
+
+local MySpass = {} -- Utility functions unique to this script
+
+-- Identify the script.
+function ident(self)
+  package.path = self.script_dir .. '/?.lua'
+  local C      = require 'quvi/const'
+  local r      = {}
+  r.domain     = "myspass%.de"
+  r.formats    = "default"
+  r.categories = C.proto_http
+  local U      = require 'quvi/util'
+  -- expect all urls ending with digits to be videos
+  r.handles    = U.handles(self.page_url, {r.domain}, {"/myspass/.-/%d+/?$"})
+  return r
+end
+
+-- Query available formats.
+function query_formats(self)
+    self.formats = 'default'
+    return self
+end
+
+-- Parse media URL.
+function parse(self)
+  self.host_id = "myspass"
+
+  self.id = self.page_url:match("(%d+)/?$")
+      or error("no match: media ID")
+
+  local format  = MySpass.getMetadataValue(self, 'format')
+  local title   = MySpass.getMetadataValue(self, 'title')
+  local season  = MySpass.getMetadataValue(self, 'season')
+  local episode = MySpass.getMetadataValue(self, 'episode')
+  self.thumbnail_url = MySpass.getMetadataValue(self, 'imagePreview') or ''
+
+  self.title = string.format("%s %03d %03d %s", format, season,
+                             episode, title)
+
+  self.url = {MySpass.getMetadataValue(self, 'url_flv')}
+
+  return self
+end
+
+--
+-- Utility functions
+--
+
+function MySpass.getMetadataValue(self, key)
+  if self.metadata == nil then
+    self.metadata =  quvi.fetch(
+      'http://www.myspass.de/myspass/'
+          .. 'includes/apps/video/getvideometadataxml.php?id='
+          .. self.id ) or error("cannot fetch meta data xml file")
+  end
+  local p = string.format("<%s>(.-)</%s>", key, key)
+  local temp = self.metadata:match(p) or error("meta data: no match: " .. key)
+  local value = temp:match('<!%[CDATA%[(.+)]]>') or temp
+  return value
+end
+
+-- vim: set ts=2 sw=2 tw=72 expandtab:
+
diff --git a/share/lua/website/quvi/html.lua b/share/lua/website/quvi/html.lua
new file mode 100644
index 0000000..18bd3a6
--- /dev/null
+++ b/share/lua/website/quvi/html.lua
@@ -0,0 +1,73 @@
+
+-- libquvi-scripts v0.4.15
+-- Copyright (C) 2011  Toni Gundogdu <legatvs@gmail.com>
+--
+-- This file is part of libquvi-scripts <http://quvi.sourceforge.net/>.
+--
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public
+-- License as published by the Free Software Foundation; either
+-- version 2.1 of the License, or (at your option) any later version.
+--
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+-- Lesser General Public License for more details.
+--
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+-- 02110-1301  USA
+--
+
+--
+-- A modularized revision of <http://www.hpelbers.org/lua/utf8>
+--
+-- convert numeric html entities to utf8
+-- example:  &#8364;    ->   $(C"f(B
+--
+
+local M    = {}
+local char = string.char
+ 
+function M.tail(n, k)
+    local u, r=''
+    for i=1,k do
+        n,r = math.floor(n/0x40), n%0x40
+        u = char(r+0x80) .. u
+    end
+    return u, n
+end
+ 
+function M.to_utf8(a)
+    local n, r, u = tonumber(a)
+    if n<0x80 then                        -- 1 byte
+        return char(n)
+    elseif n<0x800 then                   -- 2 byte
+        u, n = M.tail(n, 1)
+        return char(n+0xc0) .. u
+    elseif n<0x10000 then                 -- 3 byte
+        u, n = M.tail(n, 2)
+        return char(n+0xe0) .. u
+    elseif n<0x200000 then                -- 4 byte
+        u, n = M.tail(n, 3)
+        return char(n+0xf0) .. u
+    elseif n<0x4000000 then               -- 5 byte
+        u, n = M.tail(n, 4)
+        return char(n+0xf8) .. u
+    else                                  -- 6 byte
+        u, n = M.tail(n, 5)
+        return char(n+0xfc) .. u
+    end
+end
+ 
+--
+--for line in io.lines() do
+--    out =  string.gsub(line, '&#(%d+);', to_utf8)
+--    print(out)
+--end
+--
+
+return M
+
+-- vim: set ts=4 sw=4 tw=72 expandtab:
diff --git a/share/lua/website/quvi/util.lua b/share/lua/website/quvi/util.lua
index 8901626..2085496 100644
--- a/share/lua/website/quvi/util.lua
+++ b/share/lua/website/quvi/util.lua
@@ -46,6 +46,36 @@ function M.slash_unescape (s)
     return s
 end
 
+function M.base64_decode(s)
+    local itbl='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
+
+    s = s:gsub('[^' .. itbl .. '=]', '')
+
+    return (s:gsub('.', function(x)
+        local r = ''
+
+        if (x ~= '=') then
+            local f = (itbl:find(x) - 1)
+
+            for i = 6, 1, -1 do
+                r = r .. (f % 2 ^ i - f % 2 ^ (i - 1) > 0 and '1' or '0')
+            end
+        end
+
+        return r;
+    end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x)
+        local c = 0
+
+        if (#x == 8) then
+            for i = 1, 8 do
+                c = c + (x:sub(i, i) == '1' and 2 ^ (8 - i) or 0)
+            end
+        end
+
+        return string.char(c)
+    end))
+end
+
 -- handles
 --  Check whether a website script can "handle" the specified URL
 -- Params:
diff --git a/share/lua/website/sevenload.lua b/share/lua/website/sevenload.lua
index d539490..f3f9098 100644
--- a/share/lua/website/sevenload.lua
+++ b/share/lua/website/sevenload.lua
@@ -28,9 +28,8 @@ function ident(self)
     r.domain     = "sevenload%.com"
     r.formats    = "default"
     r.categories = C.proto_http
-    -- TODO: Use quvi/util:handles instead
-    r.handles    =
-        (self.page_url ~= nil and self.page_url:match(r.domain) ~= nil)
+    local U      = require 'quvi/util'
+    r.handles    = U.handles(self.page_url, {r.domain}, {'/videos/'})
     return r
 end
 
@@ -44,23 +43,17 @@ end
 function parse(self)
     self.host_id = "sevenload"
 
-    local p = quvi.fetch(self.page_url)
+    local p = quvi.fetch(self.page_url):gsub('&quot;','"')
 
-    local c_url = p:match('configPath=(.-)"')
-                    or error("no match: config URL")
-    local U = require 'quvi/util'
-    c_url = U.unescape(c_url)
+    self.thumbnail_url = p:match('"og:image" content="(.-)"') or ''
 
-    local c = quvi.fetch(c_url, {fetch_type = 'config'})
+    self.title = p:match('"og:title" content="(.-)"')
+                  or error('no match: media title')
 
-    self.title = c:match('<item id=.-<title>(.-)</title>')
-                  or error("no match: media title")
+    self.id = p:match('videoid":"(.-)"') or error("no match: media id")
 
-    self.id = c_url:match("itemId=(%w+)")
-                or error("no match: media id")
-
-    self.url = {c:match('<location seeking="yes">(.-)</')
-                or error("no match: media URL")}
+    self.url = {p:match('src.+"(http://.+%.mp4)"')
+                or error("no match: media stream URL")}
 
     return self
 end
diff --git a/share/lua/website/spiegel.lua b/share/lua/website/spiegel.lua
index 77dcb0d..c28a85f 100644
--- a/share/lua/website/spiegel.lua
+++ b/share/lua/website/spiegel.lua
@@ -61,12 +61,14 @@ end
 function parse(self)
     self.host_id = "spiegel"
 
-    Spiegel.get_media_id(self)
+    local p = quvi.fetch(self.page_url)
+
+    self.title = p:match('"spVideoTitle">(.-)<')
+                    or error('no match: media title')
 
-    local p = Spiegel.get_playlist(self)
+    self.thumbnail_url = p:match('"og:image" content="(.-)"') or ''
 
-    self.title = p:match("<headline>(.-)</")
-                  or error ("no match: media title")
+    Spiegel.get_media_id(self)
 
     local config  = Spiegel.get_config(self)
     local formats = Spiegel.iter_formats(config)
@@ -92,15 +94,6 @@ function Spiegel.get_media_id(self)
                 or error ("no match: media id")
 end
 
-function Spiegel.get_playlist(self)
-    local fmt_s = "http://www1.spiegel.de/active/playlist/fcgi/playlist.fcgi/";
-               .. "asset=flashvideo/mode=id/id=%s"
-
-    local playlist_url = string.format(fmt_s, self.id)
-
-    return quvi.fetch(playlist_url, {fetch_type = 'playlist'})
-end
-
 function Spiegel.get_config(self)
     local fmt_s      = "http://video.spiegel.de/flash/%s.xml";
     local config_url = string.format(fmt_s, self.id)
@@ -138,15 +131,8 @@ function Spiegel.choose_best(formats) -- Highest quality available
     return r
 end
 
-function Spiegel.choose_default(formats) -- Lowest quality available
-    local r = {width=0xffff, height=0xffff, bitrate=0xffff, url=nil}
-    local U = require 'quvi/util'
-    for _,v in pairs(formats) do
-        if U.is_lower_quality(v,r) then
-            r = v
-        end
-    end
-    return r
+function Spiegel.choose_default(formats)
+    return formats[1]
 end
 
 function Spiegel.to_s(t)
diff --git a/share/lua/website/tapuz.lua b/share/lua/website/tapuz.lua
new file mode 100644
index 0000000..15e1bed
--- /dev/null
+++ b/share/lua/website/tapuz.lua
@@ -0,0 +1,74 @@
+
+-- libquvi-scripts v0.4.15
+-- Copyright (C) 2012  Tzafrir Cohen <tzafrir@cohens.org.il>
+--
+-- This file is part of libquvi-scripts <http://quvi.sourceforge.net/>.
+--
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public
+-- License as published by the Free Software Foundation; either
+-- version 2.1 of the License, or (at your option) any later version.
+--
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+-- Lesser General Public License for more details.
+--
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+-- 02110-1301  USA
+--
+
+-- Identify the script.
+function ident(self)
+    package.path = self.script_dir .. '/?.lua'
+    local C      = require 'quvi/const'
+    local r      = {}
+    --- http://flix.tapuz.co.il/v/watch-4158845-.html
+    r.domain     = "flix%.tapuz%.co%.il"
+    r.formats    = "default"
+    r.categories = C.proto_http
+    local U      = require 'quvi/util'
+    r.handles    = U.handles(self.page_url, {r.domain},
+                       {"/v/watch-.*.html", "/showVideo%.asp"})
+    return r
+end
+
+-- Query available formats.
+function query_formats(self)
+    self.formats = 'default'
+    return self
+end
+
+-- Parse media URL.
+function parse(self)
+    self.host_id = 'tapuz-flix'
+
+    self.id = self.page_url:match('/v/watch%-(%d+)%-.*%.html')
+    if not self.id then
+        self.id = self.page_url:match('/showVideo%.asp%?m=(%d+)')
+                    or error("no match: media ID")
+    end
+
+    local xml_url_base = 'v/Handlers/XmlForPlayer.ashx' -- Variable?
+    local mako = 0 -- Does it matter?
+    local playerOptions = '0|1|grey|large|0' -- Does it matter? Format?
+
+    local p = quvi.fetch(self.page_url)
+    self.title = p:match('<meta name="item%-title" content="([^"]*)" />')
+
+    local s_fmt =
+      'http://flix.tapuz.co.il/%s?mediaid=%d&autoplay=0&mako=%d'
+      .. '&playerOptions=%s'
+
+    local xml_url =
+      string.format(s_fmt, xml_url_base, self.id, mako, playerOptions)
+
+    local xml_page = quvi.fetch(xml_url)
+    self.url = { xml_page:match('<videoUrl>.*(http://.*%.flv).*</videoUrl>') }
+
+    return self
+end
+
+-- vim: set ts=4 sw=4 tw=72 expandtab:
diff --git a/share/lua/website/ted.lua b/share/lua/website/ted.lua
index 84c6898..a5f7e87 100644
--- a/share/lua/website/ted.lua
+++ b/share/lua/website/ted.lua
@@ -46,22 +46,17 @@ end
 -- Parse video URL.
 function parse(self)
     self.host_id = "ted"
+
     local p = quvi.fetch(self.page_url)
 
-    if Ted.is_external(self, p) then
-        return self
-    end
+    if Ted.is_external(self, p) then return self end
 
-    self.id = p:match('ti:"(%d+)"')
-                or error("no match: media ID")
+    self.id = p:match('ti:"(%d+)"') or error("no match: media ID")
 
-    self.title = p:match('<title>(.-)%s+|')
-                    or error("no match: media title")
+    self.title = p:match('<title>(.-)%s+|') or error("no match: media title")
 
-    self.thumbnail_url = p:match('rel="image_src" href="(.-)"') or ''
+    self.thumbnail_url = p:match('"og:image" content="(.-)"') or ''
 
-    self.url = {p:match('(http://download.-)"')
-                  or error("no match: media stream URL")}
     return self
 end
 
@@ -69,10 +64,17 @@ end
 -- Utility functions
 --
 
-function Ted.is_external(self, page)
-    -- Some of the videos are hosted elsewhere.
-    self.redirect_url = page:match('name="movie"%s+value="(.-)"') or ''
-    return #self.redirect_url > 0
+function Ted.is_external(self, p)
+    self.url = {p:match('(http://download.-)"') or ''}
+    if #self.url[1] ==0 then  -- Try the first iframe
+        self.redirect_url = p:match('<iframe src="(.-)"') or ''
+        if #self.redirect_url >0 then
+            return true
+        else
+          error('no match: media stream URL')
+        end
+    end
+    return false
 end
 
 -- vim: set ts=4 sw=4 tw=72 expandtab:
diff --git a/share/lua/website/theonion.lua b/share/lua/website/theonion.lua
index 7617fa7..953f8d1 100644
--- a/share/lua/website/theonion.lua
+++ b/share/lua/website/theonion.lua
@@ -53,7 +53,7 @@ function parse(self)
     self.title = c:match('"title":%s+"(.-)"')
                   or error('no match: media title')
 
-    self.thumbnail_url = c:match('"thumbnail":%s+"(.-)"') or ''
+    self.thumbnail_url = c:match('"thumbnail": %["(.-)"%]') or ''
 
     self.url = {c:match('"video_url":%s+"(.-)"')
                   or error('no match: media stream URL')}
diff --git a/share/lua/website/tvlux.lua b/share/lua/website/tvlux.lua
index bd6eb32..5a4fc19 100644
--- a/share/lua/website/tvlux.lua
+++ b/share/lua/website/tvlux.lua
@@ -30,7 +30,7 @@ function ident(self)
     r.categories = C.proto_http
     local U      = require 'quvi/util'
     r.handles    = U.handles(self.page_url,
-                    {r.domain}, {"/joomla/index%.php/"})
+                    {r.domain}, {"/video/.-_%d+%.html"})
     return r
 end
 
@@ -43,13 +43,21 @@ end
 -- Parse media URL.
 function parse(self)
     self.host_id = "tvlux"
-    local page   = quvi.fetch(self.page_url)
-    self.title   = page:match('"title" content="(.-)"')
+
+    self.id = self.page_url:match('/video/.-(%d+)%.html')
+                    or error("no match: media ID")
+
+    local p = quvi.fetch(self.page_url)
+
+    self.thumbnail_url = p:match('"og:image" content="(.-)"') or ''
+
+    self.title = p:match('"title" content="(.-)%s+%-%s+TV')
                     or error("no match: media title")
-    self.id      = self.page_url:match('/(%d+)$')
-                    or error("no match: media id")
-    self.url     = {page:match("'url':'(.-)'")
-                    or error('no match: media')}
+
+    local path = p:match("'file':%s+'(.-)'")
+                    or error('no match: media stream URL')
+
+    self.url = {string.format("http://www.tvlux.be%s";, path)}
     return self
 end
 
diff --git a/share/lua/website/wdrmaus.lua b/share/lua/website/wdrmaus.lua
new file mode 100644
index 0000000..229240b
--- /dev/null
+++ b/share/lua/website/wdrmaus.lua
@@ -0,0 +1,173 @@
+
+-- libquvi-scripts v0.4.15
+-- Copyright (C) 2013  Guido Leisker <guido@guido-leisker.de>
+--
+-- This file is part of libquvi-scripts <http://quvi.sourceforge.net/>.
+--
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public
+-- License as published by the Free Software Foundation; either
+-- version 2.1 of the License, or (at your option) any later version.
+--
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+-- Lesser General Public License for more details.
+--
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+-- 02110-1301  USA
+
+-- About
+--  wrdmaus.de falls into different sections each working
+--  quite differently
+--
+--  elefantenseite:
+--    flash gallery with link target to proper pages for each video
+--    last part of url is id, configuration.php5
+--    http://www.wdrmaus.de/elefantenseite/
+--    http://www.wdrmaus.de/elefantenseite/#/anke_tanzt_zooztiere
+--
+--  kaeptnblaubaerseite:
+--    single flash, users need to use html only page (html gallery)
+--    and copy target links of videos
+--    http://www.wdrmaus.de/kaeptnblaubaerseite/baerchen/tv.php5
+--    http://www.wdrmaus.de/kaeptnblaubaerseite/baerchen/tv.php5?mid=1&dslSrc=rtmp://gffstream.fcod.llnwd.net/a792/e2/blaubaer/flash/oink_web-m.flv&isdnSrc=rtmp://gffstream.fcod.llnwd.net/a792/e2/blaubaer/flash/oink_web-s.flv
+--
+--  sachgeschichten:
+--    html video gallery, users need to copy target links of videos
+--    http://www.wdrmaus.de/sachgeschichten/sachgeschichten/
+--    http://www.wdrmaus.de/sachgeschichten/sachgeschichten/sachgeschichte.php5?id=2702
+--
+--  entenseite (very few videos, not supported!):
+--    http://www.wdrmaus.de/enteseite/index.php5
+--    http://www.wdrmaus.de/enteseite/tuerenauf/index.php5?v=3#v2
+--
+--  There are more sections but they seem to provide no videos.
+
+local WdrMaus = {} -- Utility functions unique to this script
+
+-- Identify the script.
+function ident(self)
+  package.path = self.script_dir .. '/?.lua'
+  local C      = require 'quvi/const'
+  local r      = {}
+  r.domain     = "wdrmaus%.de"
+  r.formats    = "default"
+  r.categories = C.proto_rtmp
+  local U      = require 'quvi/util'
+  -- there seems to be no possiblity to really
+  -- make a decision here: we are using a less
+  -- strict pattern here
+  r.handles    =  U.handles(self.page_url, {r.domain})
+  return r
+end
+
+-- Query available formats.
+function query_formats(self)
+    self.formats = 'default'
+    return self
+end
+
+-- Parse media URL.
+function parse(self)
+  self.host_id = "wdrmaus"
+
+  local a = {
+      {pat='kaeptnblaubaerseite', func=WdrMaus.parseKaeptnblaubaerseite},
+      {pat='sachgeschichten',     func=WdrMaus.parseSachgeschichten},
+      {pat='elefantenseite',      func=WdrMaus.parseElefantenseite}
+  }
+
+  local U = require 'quvi/url'
+  local t = U.parse(self.page_url)
+  local s = {}
+
+  for _,v in pairs(a) do
+      if t.path:match(v.pat) then return v.func(self) end
+      table.insert(s, v.pat)
+  end
+
+  error(string.format("limited support for the {%s} sections only",
+                        table.concat(s, ',')))
+end
+
+--
+-- Utility functions
+--
+
+function WdrMaus.parseElefantenseite(self)
+  self.id = self.page_url:match('/([%w_]-)$')
+                or error('no match: media ID')
+
+  local rooturl = self.page_url:match('(%w+://.+/%w+)/.*')
+                      or error('no match: root url')
+
+  local qo = {fetch_type='config'}
+  local configuration = quvi.fetch(rooturl .. '/data/configuration.php5', qo)
+
+  local streamingServerPath =
+          WdrMaus.getXMLvalue(configuration, 'streamingServerPath')
+
+  local toc = quvi.fetch(rooturl .. '/data/tableOfContents.php5', qo)
+
+  local metadataPath = WdrMaus.getMetadataPathFromToc(toc, self.id)
+  local metadata = quvi.fetch(rooturl .. '/' .. metadataPath, qo);
+
+  streamingServerPath = string.gsub(streamingServerPath, '/$', '')
+  self.url = { streamingServerPath .. WdrMaus.getXMLvalue(metadata, 'file') }
+  self.title = WdrMaus.getXMLvalue(metadata, 'title')
+
+  -- no idea why this url has a diffent host
+  self.thumbnail_url = 'http://www.wdr.de/bilder/mediendb/elefant_online'
+        .. WdrMaus.getXMLvalue(metadata, 'image')
+
+  return self
+end
+
+function WdrMaus.parseKaeptnblaubaerseite(self)
+  self.id = self.page_url:match('/([^/]-)$') or error('no match: media ID')
+
+  local qo = {fetch_type='config'}
+  local metadatasite = quvi.fetch(
+      'http://www.wdrmaus.de/kaeptnblaubaerseite/baerchen/tv.php5', qo)
+
+  local matcher = string.gsub(self.id, '-' , '.')
+  metadata = metadatasite:match('.*(<img.-' .. matcher .. ')')
+                or error('no match: metadata')
+
+  self.title = metadata:match('<p>%s-(.-)%s-<br') or error('no match: title')
+  local thumb_rel = metadata:match('<img src="(.-)"') or ''
+
+  thumb_rel = string.gsub(thumb_rel, '%.%.', '')
+  self.thumbnail_url = 'http://www.wdrmaus.de/kaeptnblaubaerseite' ..thumb_rel
+
+  self.url = { self.page_url:match('.-(rtmp.-flv)')
+                  or error('no match: media stream URL') }
+  return self
+end
+
+function WdrMaus.parseSachgeschichten(self)
+  self.id = self.page_url:match('%d+$') or error('no match: media ID')
+  local metadata = quvi.fetch(self.page_url)
+  self.title = metadata:match('h1_019DCE">(.-)<') or error('no match: title')
+  self.url = { metadata:match('(rtmp.-mp4)')
+                or error('no match: media stream URL') }
+  return self
+end
+
+function WdrMaus.getXMLvalue(str, value)
+  ret = str:match('<' .. value .. '>(.-)</' .. value .. '>')
+            or error('Cannot match ' .. value)
+  return ret:match('<!%[CDATA%[(.+)]]>') or ret
+end
+
+function WdrMaus.getMetadataPathFromToc(toc, id)
+  -- the toc contains all paths for this root (f.i. elefantenkino)
+  local page = toc:match('<id>.-(' .. id .. '.-</xmlPath>)')
+                  or error('no match: metadata path')
+  return WdrMaus.getXMLvalue(page, 'xmlPath')
+end
+
+-- vim: set ts=2 sw=2 tw=72 expandtab:
diff --git a/share/lua/website/wimp.lua b/share/lua/website/wimp.lua
new file mode 100644
index 0000000..27792e9
--- /dev/null
+++ b/share/lua/website/wimp.lua
@@ -0,0 +1,64 @@
+
+-- libquvi-scripts v0.4.15
+-- Copyright (C) 2013  Martin Herkt <lachs0r@srsfckn.bit>
+--
+-- This file is part of libquvi-scripts <http://quvi.sourceforge.net/>.
+--
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public
+-- License as published by the Free Software Foundation; either
+-- version 2.1 of the License, or (at your option) any later version.
+--
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+-- Lesser General Public License for more details.
+--
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+-- 02110-1301  USA
+--
+
+-- Identify the script.
+function ident(self)
+  package.path = self.script_dir .. '/?.lua'
+  local C      = require 'quvi/const'
+  local r      = {}
+  r.domain     = "wimp%.com"
+  r.formats    = "default"
+  r.categories = C.proto_http
+  local U      = require 'quvi/util'
+  r.handles    = U.handles(self.page_url, {r.domain}, {"/.+/"})
+  return r
+end
+
+-- Query available formats.
+function query_formats(self)
+  self.formats = 'default'
+  return self
+end
+
+-- Parse media URL.
+function parse(self)
+  self.host_id = "wimp"
+
+  self.id = self.page_url:match("/(.-)/")
+          or error("no match: media ID")
+
+  local p = quvi.fetch(self.page_url)
+
+  self.title = p:match('"og:title" content="(.-)" />')
+              or error("no match: media title")
+
+  self.thumbnail_url = p:match('"og:image" content="(.-)"') or ''
+
+  local B = require 'quvi/util'
+  local u = B.base64_decode(p:match("googleCode = '(.-)'"))
+            or error("no match: encoded media stream URL")
+
+  self.url = {u:match('"file","(.-)"')
+            or error("no match: media stream URL")}
+
+  return self
+end
diff --git a/share/lua/website/xhamster.lua b/share/lua/website/xhamster.lua
index b31784b..7a24807 100644
--- a/share/lua/website/xhamster.lua
+++ b/share/lua/website/xhamster.lua
@@ -46,7 +46,7 @@ function parse(self)
 
     local p = quvi.fetch(self.page_url)
 
-    self.title = p:match('class="mTitle">.-<h1?.>(.-)</h1>')
+    self.title = p:match('<title>(.-)%s+%-%s+xHamster%.com')
                   or error("no match: media title")
 
     self.id = self.page_url:match("/movies/(.-)/")
diff --git a/share/lua/website/xnxx.lua b/share/lua/website/xnxx.lua
new file mode 100644
index 0000000..bd7a300
--- /dev/null
+++ b/share/lua/website/xnxx.lua
@@ -0,0 +1,64 @@
+
+-- libquvi-scripts v0.4.15
+-- Copyright (C) 2012  quvi project
+--
+-- This file is part of libquvi-scripts <http://quvi.sourceforge.net/>.
+--
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public
+-- License as published by the Free Software Foundation; either
+-- version 2.1 of the License, or (at your option) any later version.
+--
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+-- Lesser General Public License for more details.
+--
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+-- 02110-1301  USA
+--
+
+-- Identify the script.
+function ident(self)
+    package.path = self.script_dir .. '/?.lua'
+    local C      = require 'quvi/const'
+    local r      = {}
+    r.domain     = "xnxx%.com"
+    r.formats    = "default"
+    r.categories = C.proto_http
+    local U      = require 'quvi/util'
+    r.handles    = U.handles(self.page_url, {r.domain}, {"/video%d+.+"})
+    return r
+end
+
+-- Query available formats.
+function query_formats(self)
+    self.formats = 'default'
+    return self
+end
+
+-- Parse media URL.
+function parse(self)
+    self.host_id = "xnxx"
+
+    self.id = self.page_url:match('/video(%d+)')
+                or error("no match: media ID")
+
+    local p = quvi.fetch(self.page_url)
+
+    self.title = p:match('<span class="style5"><strong>(.-)</strong>')
+                  or error("no match: media title")
+
+    self.thumbnail_url =
+        p:match('url_bigthumb=(http://.-)&') or ''
+
+    local U = require 'quvi/util'
+    self.url = {U.unescape (p:match('flv_url=(http.-)&'))
+                  or error("no match: media stream URL")}
+
+    return self
+end
+
+-- vim: set ts=4 sw=4 tw=72 expandtab:
diff --git a/share/lua/website/xvideos.lua b/share/lua/website/xvideos.lua
index 47d6bca..55b091c 100644
--- a/share/lua/website/xvideos.lua
+++ b/share/lua/website/xvideos.lua
@@ -50,7 +50,7 @@ function parse(self)
 
     local p = quvi.fetch(self.page_url)
 
-    self.title = p:match("<title>(.-)%s+-%s+XVID")
+    self.title = p:match('<div id="main">.-<h2>(.-)<')
                   or error("no match: media title")
 
     self.id = self.page_url:match("/video(%d+)/")
diff --git a/share/lua/website/youjizz.lua b/share/lua/website/youjizz.lua
index 47d2046..91569d1 100644
--- a/share/lua/website/youjizz.lua
+++ b/share/lua/website/youjizz.lua
@@ -44,16 +44,21 @@ end
 function parse(self)
     self.host_id = "youjizz"
 
+    self.id = self.page_url:match('%-(%d+)%.html')
+                or error ("no match: media ID")
+
     local p = quvi.fetch(self.page_url)
 
     self.title = p:match("<title>(.-)</")
                   or error ("no match: media title")
 
-    self.id = p:match("%?id=(%d+)")
-                or error ("no match: media ID")
+    self.thumbnail_url = p:match('data%-original="(.-)"') or ''
+
+    local c = quvi.fetch('http://youjizz.com/videos/embed/' .. self.id,
+                          {fetch_type='config'})
 
-    self.url = {p:match('addVariable%("file",encodeURIComponent%("(.-)"')
-                  or error ("no match: media URL")}
+    self.url = {c:match('addVariable%("file",encodeURIComponent%("(.-)"')
+                  or error ("no match: media stream URL")}
 
     return self
 end
diff --git a/share/lua/website/youtube.lua b/share/lua/website/youtube.lua
index de8ac2e..7c35e68 100644
--- a/share/lua/website/youtube.lua
+++ b/share/lua/website/youtube.lua
@@ -125,7 +125,11 @@ function YouTube.iter_formats(config, U)
     for f in fmt_stream_map:gmatch('([^,]*),') do
         local d = U.decode(f)
         if d['itag'] and d['url'] then
-            urls[U.unescape(d['itag'])] = U.unescape(d['url'])
+            local uurl = U.unescape(d['url'])
+            if d['sig'] then
+                uurl = uurl .. "&signature=" .. U.unescape(d['sig'])
+            end
+            urls[U.unescape(d['itag'])] = uurl
         end
     end

Reply to: