diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/AUTHORS trunk/AUTHORS
--- griffith-0.13/AUTHORS	2011-02-08 23:10:58.000000000 +0200
+++ trunk/AUTHORS	2013-07-27 18:37:04.380157205 +0300
@@ -32,3 +32,6 @@
 
 Ivo Nunes <netherblood@gmail.com>
 * Programmer
+
+Elan Ruusamäe <glen@delfi.ee>
+* Tellico import plugin
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/ChangeLog trunk/ChangeLog
--- griffith-0.13/ChangeLog	2011-12-18 22:46:20.000000000 +0200
+++ trunk/ChangeLog	2014-01-06 22:10:52.548344780 +0200
@@ -1,10 +1,123 @@
-# $Id: ChangeLog 1604 2011-12-18 20:46:19Z piotrek $ vim: ts=4
+# $Id: ChangeLog 1659 2013-12-16 21:39:36Z mikej06 $ vim: ts=4
 
 Griffith ChangeLog
 ------------------
-(c) 2005-2011  Vasco Nunes, Piotr Ożarowski
+(c) 2005-2013  Vasco Nunes, Piotr Ożarowski
 
 
+2013-12-16  Michael Jahn
+	* better handling of temporary poster files
+	
+2013-12-09  Michael Jahn
+	* IMDb plugin updated
+
+2013-12-03  Michael Jahn
+	* IMDb plugin updated
+
+2013-11-17  Michael Jahn
+	* [#1251923] poster not loaded from CSFD
+
+2013-11-12  Michael Jahn
+	* [#1250013] Allocine plugin do not populate the fields
+
+2013-10-17  Michael Jahn
+	* IMDb plugin updated
+	  [#1235747] IMDB fields not populating
+	  [#1239178] IMDB fails to populate some fields
+	  [#1236093] IMDB failure starting around 25 Sept 2013
+	  [#1240477] IMDB not Downloading All Fields in 0.13 for Linux
+
+2013-10-04  Michael Jahn
+	* FilmeAffinity movie plugin updated
+	  [#1210828] FilmAffinity
+	  [#1216572] [FilmAffinity plugin] doesn't show the list of movies
+
+2013-09-27  Michael Jahn
+	* FilmeVonAZ movie plugin updated
+
+2013-06-26  Michael Jahn
+	* [1194709] DVDEmpire plugin stopped returning results
+
+2013-06-24  Michael Jahn
+	* [1174569] FilmAffinity plugin does not work since today
+
+2013-06-01  Michael Jahn
+	* PDF export plugin updated
+	
+2013-05-24  Michael Jahn
+	* Allocine movie plugin updated
+
+2013-04-02  Michael Jahn
+	* [1039068] Return the list of films sorted; added sorting by title for result lists
+
+2013-02-21  Michael Jahn
+	* IMDb and Cinemovies movies plugin updated
+
+2013-01-30  Michael Jahn
+	* FilmeVonAZ and OFDb movie plugins updated
+
+2013-01-28  Michael Jahn
+	* Kino.de and Cineteka movie plugins updated
+
+2012-12-29  Michael Jahn
+	* remove movie plugin FilmDb (site doesn't exists anymore)
+
+2012-12-16  Michael Jahn
+	* fixed backup for databases other than sqlite
+
+2012-12-06  Michael Jahn
+	* fixed IMDb plugins for direct search results
+
+2012-11-29  Michael Jahn
+	* [1084608] IMDB does not work from November 28, 2012; fixed IMDb plugins
+
+2012-11-20  Michael Jahn
+	* fixed Allocine plugin [663709]
+	
+2012-08-30  Michael Jahn
+	* [1043263] importing GriffithXML fails: posters are not added
+
+2012-08-29  Michael Jahn
+	* [1037249] typo in tellico spelling
+	
+2012-07-03  Michael Jahn
+	* DVD Palace movie plugin updated
+	
+2012-06-09  Michael Jahn
+	* DVD Palace movie plugin updated
+
+2012-06-07  Michael Jahn
+	* [#1010073] The MoviePosterDB seems to have quit working properly.
+
+2012-04-10  Vasco Nunes
+	* [#669431] Spell checker doesn't work
+
+2012-04-02  Michael Jahn
+	* fixed Allocine plugin (V3 API) (thanks to CinéphOli)
+
+2012-01-29  Michael Jahn
+	* [#923416] Connection failed. (Amazon plugin)
+	* [#913299] importing covers gives list index out of range
+	* [#913283] importer: 'poster' overwritten by 'image'
+
+2012-01-10  Piotr Ożarowski
+	* Filmweb movie plugin updated (thanks to mariusz2806)
+
+2012-01-08  Piotr Ożarowski
+	* Tellico import plugin added (thanks to Elan Ruusamäe)
+
+2012-01-07  Ivo Nunes
+	* Added a plugin for the portuguese website www.dvdpt.com
+
+2012-01-02  Michael Jahn
+	* [#909513] code errors in import plugins
+
+2011-12-27  Michael Jahn
+	* better error handling for PDF export plugin
+
+2011-12-26  Piotr Ożarowski
+	* Restoring database from backup fixed
+
 ---- 0.13 ----
 
 2011-12-18  Piotr Ożarowski
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/NEWS trunk/NEWS
--- griffith-0.13/NEWS	2011-12-19 00:30:41.000000000 +0200
+++ trunk/NEWS	2013-07-27 18:37:07.490294405 +0300
@@ -2,7 +2,7 @@
 =============
 * New movie plugins: AllRovi, IMDB-pt, Interfilmes
 * Most movie plugins updated, 
-  - AniDB plugin requires lxml module now (new 4rd party dependency)
+  - AniDB plugin requires lxml module now (new 3rd party dependency)
 * New extensions: Database Cleanup and Maintenance
 * MacOSX integration improved
 * Many bug fixes
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/README trunk/README
--- griffith-0.13/README	2010-10-18 22:55:15.000000000 +0300
+++ trunk/README	2013-07-27 18:37:04.400158088 +0300
@@ -1,4 +1,4 @@
-Griffith 0.12.1 README
+Griffith 0.13.0 README
 ======================
 
 This document was last updated on Thu Jun 10 2009.
Only in trunk/: debian
Only in griffith-0.13/glade: exporthtml.glade.h
Only in griffith-0.13/glade: griffith.glade.h
Only in griffith-0.13/glade: import.glade.h
Only in griffith-0.13/glade: importcsv.glade.h
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/add.py trunk/lib/add.py
--- griffith-0.13/lib/add.py	2011-10-03 21:34:23.000000000 +0300
+++ trunk/lib/add.py	2014-01-06 22:10:52.551678262 +0200
@@ -1,7 +1,7 @@
 # -*- coding: UTF-8 -*-
 # vim: fdm=marker
 
-__revision__ = '$Id: add.py 1595 2011-10-02 19:25:14Z mikej06 $'
+__revision__ = '$Id: add.py 1659 2013-12-16 21:39:36Z mikej06 $'
 
 # Copyright (c) 2005-2011 Vasco Nunes, Piotr Ożarowski
 #
@@ -245,19 +245,23 @@
     if total > 1:
         self.widgets['results']['window'].show()
         self.widgets['results']['window'].set_keep_above(True)
+        movieslist = []
         row = None
         key = 0
-        self.treemodel_results.clear()
         for row in self.search_movie.ids:
             if (str(row) != ''):
                 if isinstance(self.search_movie.titles[key], unicode):
                     title = self.search_movie.titles[key]
                 else:
                     title = str(self.search_movie.titles[key]).decode(self.search_movie.encode)
-                myiter = self.treemodel_results.insert_before(None, None)
-                self.treemodel_results.set_value(myiter, 0, str(row))
-                self.treemodel_results.set_value(myiter, 1, title)
+                movieslist.append((row, title))
             key += 1
+        movieslist = sorted(movieslist, key=lambda titel: titel[1])
+        self.treemodel_results.clear()
+        for entry in movieslist:
+            myiter = self.treemodel_results.insert_before(None, None)
+            self.treemodel_results.set_value(myiter, 0, str(entry[0]))
+            self.treemodel_results.set_value(myiter, 1, entry[1])
         self.widgets['results']['treeview'].show()
     elif total == 1:
         self.widgets['results']['treeview'].set_cursor(total-1)
@@ -301,7 +305,7 @@
                 self.search_movie.title = unicode(title, 'utf-8')
         # check if internet connection is available
         try:
-            urllib2.urlopen(self.search_movie.url)
+            urllib2.urlopen("http://www.griffith.cc")
             if self.search_movie.search_movies(self.widgets['add']['window']):
                 self.search_movie.get_searches()
             if len(self.search_movie.ids) == 1 and o_title and title:
@@ -684,26 +688,31 @@
 
     new_poster_md5 = None
     if details['image']:
-        tmp_image_path = details['image']
+        tmp_image_path = original_image_path = details['image']
         if not os.path.isfile(tmp_image_path):
             tmp_image_path = os.path.join(self.locations['temp'], "poster_%s.jpg" % details['image'])
         if os.path.isfile(tmp_image_path):
-            new_poster_md5 = gutils.md5sum(file(tmp_image_path, 'rb'))
+            file_object = file(tmp_image_path, 'rb')
+            try:
+                new_poster_md5 = gutils.md5sum(file_object)
 
-            if session.query(db.Poster).filter_by(md5sum=new_poster_md5).count() == 0:
-                try:
-                    data = file(tmp_image_path, 'rb').read()
-                except Exception, e:
-                    log.warning("cannot read poster data")
+                if session.query(db.Poster).filter_by(md5sum=new_poster_md5).count() == 0:
+                    try:
+                        file_object.seek(0, 0);
+                        data = file_object.read()
+                    except Exception, e:
+                        log.warning("cannot read poster data")
+                    else:
+                        poster = db.Poster(md5sum=new_poster_md5, data=data)
+                        del details["image"]
+                        details["poster_md5"] = new_poster_md5
+                        session.add(poster)
                 else:
-                    poster = db.Poster(md5sum=new_poster_md5, data=data)
-                    del details["image"]
                     details["poster_md5"] = new_poster_md5
-                    session.add(poster)
-            else:
-                details["poster_md5"] = new_poster_md5
+            finally:
+                file_object.close()
             try:
-                if not tmp_image_path == details['image']:
+                if not tmp_image_path == original_image_path:
                     os.remove(tmp_image_path)
             except Exception, e:
                 log.warn("cannot remove temporary file %s", tmp_image_path)
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/backup.py trunk/lib/backup.py
--- griffith-0.13/lib/backup.py	2011-02-17 19:17:36.000000000 +0200
+++ trunk/lib/backup.py	2013-07-27 18:37:06.320242790 +0300
@@ -1,6 +1,6 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: backup.py 1539 2011-02-17 00:31:19Z iznogoud $'
+__revision__ = '$Id: backup.py 1632 2012-12-16 21:15:57Z mikej06 $'
 
 # Copyright (c) 2005-2009 Vasco Nunes, Piotr Ożarowski
 #
@@ -85,10 +85,12 @@
                 file_path = os.path.join(self.locations['home'], db_file_name).encode('utf-8')
                 mzip.write(file_path, arcname=db_file_name)
             else:
+                tmp_engine = None
                 try:
                     tmp_dir = mkdtemp()
-                    tmp_config = copy.deepcopy(self.config)
-                    tmp_config._file = os.path.join(tmp_dir, 'griffith.cfg')
+                    tmp_config_file = os.path.join(tmp_dir, 'griffith.cfg')
+                    self.config.save(tmp_config_file)
+                    tmp_config = config.Config(file=tmp_config_file)
                     tmp_config.set('type', 'sqlite', section='database')
                     tmp_config.set('file', 'griffith.db', section='database')
                     tmp_config.set('name', 'griffith', section='database')
@@ -114,7 +116,8 @@
                     mzip.write(tmp_file, arcname='griffith.db')
                 finally:
                     # disposing the temporary db connection before rmtree and in finally block to avoid locked db file
-                    tmp_engine.dispose()
+                    if tmp_engine:
+                        tmp_engine.dispose()
                     rmtree(tmp_dir)
             gutils.info(_("Backup has been created"), self.widgets['window'])
 
@@ -200,7 +203,7 @@
     * SQLite3 *.db file
     """
     # let user select a backup file
-    filename = gutils.file_chooser(_("Restore Griffith backup"), \
+    filename, path = gutils.file_chooser(_("Restore Griffith backup"), \
                 action=gtk.FILE_CHOOSER_ACTION_OPEN, backup=True, \
                 buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
     if not filename:
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/config.py trunk/lib/config.py
--- griffith-0.13/lib/config.py	2011-01-19 17:53:44.000000000 +0200
+++ trunk/lib/config.py	2013-07-27 18:37:06.323576270 +0300
@@ -1,6 +1,6 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: config.py 1502 2011-01-19 15:52:19Z mikej06 $'
+__revision__ = '$Id: config.py 1632 2012-12-16 21:15:57Z mikej06 $'
 
 # Copyright © 2005-2011 Vasco Nunes, Piotr Ożarowski
 #
@@ -85,10 +85,12 @@
             d[i] = j
         return d
 
-    def save(self):
-        if not os.path.exists(os.path.split(self._file)[0]):
-            os.makedirs(os.path.split(self._file)[0])
-        self._cfg.write(open(self._file, 'w'))
+    def save(self, file = None):
+        if not file:
+            file = self._file
+        if not os.path.exists(os.path.split(file)[0]):
+            os.makedirs(os.path.split(file)[0])
+        self._cfg.write(open(file, 'w'))
 
     def load(self):
         if os.path.isfile(self._file):
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/db/validators.py trunk/lib/db/validators.py
--- griffith-0.13/lib/db/validators.py	2011-06-14 23:02:24.000000000 +0300
+++ trunk/lib/db/validators.py	2013-07-27 18:37:06.076898722 +0300
@@ -23,7 +23,13 @@
 
 import logging
 
-from sqlalchemy.orm.interfaces import AttributeExtension, InstrumentationManager
+from sqlalchemy.orm.interfaces import AttributeExtension
+try:
+    # sql alchemy 0.8 (and above)
+    from sqlalchemy.ext.instrumentation import InstrumentationManager
+except:
+    # sql alchemy 0.7
+    from sqlalchemy.orm.interfaces import InstrumentationManager
 from sqlalchemy.orm import ColumnProperty
 from sqlalchemy.types import String
 
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/edit.py trunk/lib/edit.py
--- griffith-0.13/lib/edit.py	2011-08-23 23:51:34.000000000 +0300
+++ trunk/lib/edit.py	2013-07-27 18:37:06.326909751 +0300
@@ -1,6 +1,6 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: edit.py 1572 2011-08-23 18:47:22Z mikej06 $'
+__revision__ = '$Id: edit.py 1619 2012-01-29 19:11:45Z mikej06 $'
 
 # Copyright © 2005-2011 Vasco Nunes, Piotr Ożarowski
 
@@ -152,5 +152,5 @@
 def update_tree_thumbnail(self, t_image_path):
     self.Image.set_from_file(t_image_path)
     pixbuf = self.Image.get_pixbuf()
-    if self.selected_iter[0]:
+    if len(self.selected_iter) > 0 and self.selected_iter[0]:
         self.treemodel.set_value(self.selected_iter[0], 1, pixbuf)
\ No newline at end of file
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/initialize.py trunk/lib/initialize.py
--- griffith-0.13/lib/initialize.py	2011-12-04 17:59:11.000000000 +0200
+++ trunk/lib/initialize.py	2013-07-27 18:37:06.320242790 +0300
@@ -1,6 +1,6 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: initialize.py 1600 2011-12-02 20:30:27Z mikej06 $'
+__revision__ = '$Id: initialize.py 1622 2012-04-10 17:07:16Z iznogoud $'
 
 # Copyright © 2005-2011 Vasco Nunes, Piotr Ożarowski
 #
@@ -50,14 +50,11 @@
     if defaultEnc is None:
         defaultEnc = 'UTF-8'
     locations = {}
-    locations['exec'] = os.path.abspath(os.path.dirname(sys.argv[0])) # deprecated
+    locations['exec'] = os.path.abspath(os.path.dirname(sys.argv[0]))  # deprecated
     locations['lib'] = os.path.dirname(__file__)
     locations['home'] = home_dir
 
-    if os.name == 'nt' or os.name.startswith('win'): # win32, win64
-        import winshell
-        from win32com.shell import shellcon, shell
-
+    if os.name == 'nt' or os.name.startswith('win'):  # win32, win64
         locations['movie_plugins'] = "%s\\lib\\plugins\\movie" % locations['exec']
         locations['export_plugins'] = "%s\\lib\\plugins\\export" % locations['exec']
         locations['images'] = "%s\\images" % locations['exec']
@@ -165,6 +162,7 @@
         self.widgets['extensions']['toolbar_hb'].show()
         self.widgets['menu']['ext_toolbar'].set_active(True)
 
+
 def treeview(self):
     import main_treeview
     # set up the treeview to do multiple selection
@@ -174,7 +172,7 @@
     tree.set_headers_visible(True)
     tree.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
     self.widgets['treeview'].get_selection().connect("changed", main_treeview.on_tree_selection, self)
-    
+
     # number column
     renderer = gtk.CellRendererText()
     self.number_column = gtk.TreeViewColumn(_('No.'), renderer, text=0)
@@ -280,6 +278,7 @@
     self.updated_column.set_alignment(0.5)
     self.updated_column.set_reorderable(True)
     self.widgets['treeview'].append_column(self.updated_column)
+
     # reflect saved column order and column sizes
     columnorder = self.config.get('columnorder', None, section='mainlist')
     if columnorder:
@@ -319,7 +318,7 @@
     self.total = self.db.session.query(db.Movie).count()
     self.widgets['treeview'].set_search_equal_func(search_func_treeview)
     self.widgets['treeview'].show()
-    
+
     # adding some completion fields - TODO: move it to initialize
     self.completion = gtk.EntryCompletion()
     self.widgets['add']['o_title'].set_completion(self.completion)
@@ -331,14 +330,15 @@
     self.completion_t.set_model(self.treemodel)
     self.completion_t.set_text_column(4)
 
+
 def search_func_treeview(model, column, key, iter):
-    return not (str(model.get_value(iter, 0)).startswith(key) or 
-        str(model.get_value(iter, 2)).lower().startswith(key.lower()) or 
+    return not (str(model.get_value(iter, 0)).startswith(key) or
+        str(model.get_value(iter, 2)).lower().startswith(key.lower()) or
         str(model.get_value(iter, 3)).lower().startswith(key.lower()))
 
 
 def loans_treeview(self):
-    self.loans_treemodel = gtk.TreeStore(str, str, str) # move to self.widgets
+    self.loans_treemodel = gtk.TreeStore(str, str, str)  # move to self.widgets
     self.widgets['movie']['loan_history'].set_model(self.loans_treemodel)
     self.widgets['movie']['loan_history'].set_headers_visible(True)
     # loan date
@@ -540,7 +540,7 @@
     for i in fields_to_import:
         j = j + 1
         w['fields'][i] = gtk.CheckButton(self.field_names[i])
-        w['fields'][i].set_active(True) # TODO: get from config
+        w['fields'][i].set_active(True)  # TODO: get from config
         if j <= k:
             w['box_import_1'].add(w['fields'][i])
         elif j <= 2 * k:
@@ -583,7 +583,6 @@
 def extension_preferences(self, module, enabled):
     # preferences window
     p_vbox = self.widgets['extensions']['preferences_vbox']
-
     configwidgets = {}
 
     label = "%s v%s <i>(%s &lt;%s&gt;)</i>" % (module.name, module.version, module.author, module.email)
@@ -615,6 +614,9 @@
             w.insert_text(value)
             # TODO: min, max
         # elif type is int: # TODO
+        elif type_ is bool:
+            w = gtk.CheckButton()
+            w.set_active(bool(value))
         elif isinstance(type_, (list, tuple, dict)):
             model = gtk.TreeStore(str, str)
             if isinstance(type_, dict):
@@ -665,7 +667,7 @@
     if hasattr(self, 'extensions'):
         for ext in self.extensions:
             ext.clear()
-    self.extensions = [] # deletes previous instances
+    self.extensions = []  # deletes previous instances
 
     for ext_name in plugins.extensions.by_name:
         ext_module = plugins.extensions.by_name[ext_name]
@@ -730,7 +732,7 @@
     pos_to_activate = 0
     selected_criteria = self.config.get('criteria', None, section='mainlist')
     self.search_criteria_sorted = sorted((self.field_names[criteria], criteria) for criteria in self.search_criteria)
-    self.search_criteria_sorted.insert( 0, ( _('Any'), 'any' ) ) 
+    self.search_criteria_sorted.insert(0, (_('Any'), 'any'))
     for (criterianame, criteria) in self.search_criteria_sorted:
         self.widgets['filter']['criteria'].insert_text(i, criterianame)
         if selected_criteria == criterianame:
@@ -745,12 +747,12 @@
             self.widgets['preferences']['sortby'].insert_text(i, _('Last added'))
         i += 1
     self.widgets['preferences']['sortby'].set_wrap_width(3)
-    self.widgets['preferences']['sortby'].set_active(0) # Number
+    self.widgets['preferences']['sortby'].set_active(0)  # Number
 
 
 def dictionaries(self):
     """initializes data filled dynamically by users"""
-    self.am_tags = {} # dictionary for tag CheckBoxes
+    self.am_tags = {}  # dictionary for tag CheckBoxes
     update_volume_combo_ids(self)
     update_collection_combo_ids(self)
     fill_volumes_combo(self)
@@ -765,7 +767,7 @@
     vcodec_combos(self)
     media_combos(self)
     create_tag_vbox(self, widget=self.widgets['add']['tag_vbox'], tab=self.am_tags)
-    self.sort_criteria = [ # "[]" because of index()
+    self.sort_criteria = [  # "[]" because of index()
         'number', 'o_title', 'title', 'director', 'year', 'runtime', 'country',
         'genre', 'studio', 'media_num', 'rating', 'classification', 'collection_id',
         'volume_id', 'cond', 'layers', 'region', 'movie_id']
@@ -851,9 +853,9 @@
     spell_error = False
     if self.posix and spell_support:
         if self.config.get('gtkspell', False, section='spell') == True:
-            if self.config.get('notes', True, section='spell') == True and self.config.get('lang', section='spell') != '':
+            if self.config.get('notes', True, section='spell') is True and self.config.get('lang', section='spell') != '':
                 try:
-                    self.notes_spell = gtkspell.Spell(self.widgets['add']['cast'], self.config.get('lang', section='spell'))
+                    self.notes_spell = gtkspell.Spell(self.widgets['add']['notes'], self.config.get('lang', section='spell'))
                 except:
                     spell_error = True
             if self.config.get('plot', True, section='spell') is True and self.config.get('lang', section='spell') != '':
@@ -921,7 +923,7 @@
 
 def fill_volumes_combo(self, default=0):
     _tmp = self.initialized
-    self.initialized = False # don't refresh main treeview
+    self.initialized = False  # don't refresh main treeview
     self.widgets['add']['volume'].get_model().clear()
     for i in self.volume_combo_ids:
         vol_id = self.volume_combo_ids[i]
@@ -940,7 +942,7 @@
 
 def fill_collections_combo(self, default=0):
     _tmp = self.initialized
-    self.initialized = False # don't refresh main treeview
+    self.initialized = False  # don't refresh main treeview
     self.widgets['add']['collection'].get_model().clear()
     self.widgets['filter']['collection'].get_model().clear()
     for i in self.collection_combo_ids:
@@ -964,9 +966,9 @@
 
 def fill_advfilter_combo(self):
     _tmp = self.initialized
-    self.initialized = False # don't refresh main treeview
+    self.initialized = False  # don't refresh main treeview
     self.widgets['filter']['advfilter'].get_model().clear()
-    self.widgets['filter']['advfilter'].insert_text(0, '') # empty one
+    self.widgets['filter']['advfilter'].insert_text(0, '')  # empty one
     for i, item in enumerate(self.db.session.query(db.Filter.name).order_by(db.Filter.name).all()):
         # add some white spaces to prevent scrollbar hides parts of the names
         self.widgets['filter']['advfilter'].insert_text(i + 1, item.name + '   ')
@@ -977,7 +979,7 @@
 
 def fill_preferences_tags_combo(self):
     _tmp = self.initialized
-    self.initialized = False # don't refresh main treeview
+    self.initialized = False  # don't refresh main treeview
     self.widgets['preferences']['tag_name'].get_model().clear()
     self.tags_ids = {}
     for i, tag in enumerate(self.db.session.query(db.Tag.name, db.Tag.tag_id).all()):
@@ -990,7 +992,7 @@
 
 def fill_resolutions_combo(self, default=0):
     _tmp = self.initialized
-    self.initialized = False # don't refresh main treeview
+    self.initialized = False  # don't refresh main treeview
     self.widgets['add']['resolution'].get_model().clear()
     #resolutions = [names[0] for names in db._movie.res_aliases.values()]
     resolutions = [names[0] for (res, names) in db._movie.res_aliases.iteritems()]
@@ -1086,7 +1088,7 @@
     self.widgets['preferences']['media'].show_all()
     if self.config.has_key('media', section='defaults'):
         pos = gutils.findKey(self.config.get('media', section='defaults'), self.media_ids)
-        if pos  is not None:
+        if pos is not None:
             self.widgets['preferences']['media'].set_active(int(pos))
         else:
             self.widgets['preferences']['media'].set_active(0)
@@ -1138,7 +1140,7 @@
 
 
 def remove_hbox(self, widget, tab):
-    number = len(widget.get_children())-1    # last box number
+    number = len(widget.get_children()) - 1  # last box number
     try:
         tab.pop()
         widget.remove(widget.get_children().pop())
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/main_treeview.py trunk/lib/main_treeview.py
--- griffith-0.13/lib/main_treeview.py	2011-08-23 23:51:34.000000000 +0300
+++ trunk/lib/main_treeview.py	2013-07-27 18:37:06.076898722 +0300
@@ -1,6 +1,6 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: main_treeview.py 1572 2011-08-23 18:47:22Z mikej06 $'
+__revision__ = '$Id: main_treeview.py 1616 2012-01-23 21:07:53Z piotrek $'
 
 # Copyright (c) 2005-2011 Vasco Nunes, Piotr Ożarowski
 
@@ -24,7 +24,6 @@
 import logging
 import os
 import gtk
-from sqlalchemy import select, desc
 from sqlalchemy.sql.expression import Select
 import db
 import gutils
@@ -32,12 +31,13 @@
 
 log = logging.getLogger("Griffith")
 
+
 def on_tree_selection(tree_selection, self):
     counts = tree_selection.count_selected_rows()
     treeview_selection_on_event(self, self.widgets['treeview'])
     treemodel, selected = tree_selection.get_selected_rows()
     self.selected_iter = [treemodel.get_iter(path) for path in selected]
-    
+
     if counts == 1:
         # TODO: rewrite me
         self.widgets['menu']['clone'].set_sensitive(True)
@@ -62,14 +62,17 @@
         self.widgets['popups']['print_cover'].set_sensitive(False)
     treeview_clicked(self)
 
+
 def foreach_treeview_selected(model, path, iter, selected):
     selected.append(model.get_value(iter, 0))
 
-def treeview_selection_on_event(self, treeview, iter = False):
+
+def treeview_selection_on_event(self, treeview, iter=False):
     self.selected = []
     treeview.get_selection().selected_foreach(foreach_treeview_selected, self.selected)
     #return selected
 
+
 def treeview_clicked(self):
     if self.initialized is False:
         return False
@@ -89,7 +92,8 @@
     else:
         return False
 
-def set_details(self, item=None):#{{{
+
+def set_details(self, item=None):  # {{{
     if item is None:
         item = {}
     if 'movie_id' in item and item['movie_id']:
@@ -127,7 +131,7 @@
             w['resolution'].set_text(item['resolution'])
         elif 'height' in item and item['height'] and 'width' in item and item['width']:
             w['resolution'].set_text("%dx%d" % (item['width'], item['height']))
-        else: # fallback to 'resolution'
+        else:  # fallback to 'resolution'
             w['resolution'].set_text(item['resolution'])
     else:
         w['resolution'].set_text('')
@@ -172,10 +176,10 @@
         else:
             log.info("Wrong value in 'region' field (movie_id=%s, region=%s)" % (item['movie_id'], item['region']))
             w['region'].set_text('')
-            self.widgets['tooltips'].set_tip(w['region'], self._regions[0]) # N/A
+            self.widgets['tooltips'].set_tip(w['region'], self._regions[0])  # N/A
     else:
         w['region'].set_text('')
-        self.widgets['tooltips'].set_tip(w['region'], self._regions[0]) # N/A
+        self.widgets['tooltips'].set_tip(w['region'], self._regions[0])  # N/A
     if 'layers' in item and item['layers']:
         if str(item['layers']) in [str(i) for i in range(len(self._layers))]:
             w['layers'].set_markup("<i>%s</i>" % self._layers[item['layers']])
@@ -303,7 +307,7 @@
             self.loan_date = str(item.loan_details.date)
             w['loan_info'].set_use_markup(False)
             w['loan_info'].set_label(_("This movie has been loaned to %s on %s") % (self.person_name, self.loan_date[:10]))
-    if 'loaned' in item and not item['loaned']: # "loaned" status can be changed above, so don't use "else:" in this line
+    if 'loaned' in item and not item['loaned']:  # "loaned" status can be changed above, so don't use "else:" in this line
         self.widgets['popups']['loan'].set_sensitive(True)
         self.widgets['popups']['email'].set_sensitive(False)
         self.widgets['popups']['return'].set_sensitive(False)
@@ -358,7 +362,7 @@
         i.destroy()
     if 'languages' in item and len(item['languages']) > 0:
         for i in item['languages']:
-            if i.type == 3: # subtitles
+            if i.type == 3:  # subtitles
                 if i.subformat:
                     tmp = "%s - %s" % (i.language.name, i.subformat.name)
                 else:
@@ -390,21 +394,21 @@
         tmp = ''
         for tag in item['tags']:
             tmp += "%s, " % tag.name
-        tmp = tmp[:-2] # cut last comma
+        tmp = tmp[:-2]  # cut last comma
         w['tags'].set_text(tmp)
     #}}}
 
 
-def populate(self, movies=None, where=None, qf=True):#{{{
-    if self.initialized is False: # dont try to fill movie list if Griffith is not initialized yet
+def populate(self, movies=None, where=None, qf=True):  # {{{
+    if self.initialized is False:  # dont try to fill movie list if Griffith is not initialized yet
         return False
 
-    if qf and movies is None or isinstance(movies, Select): # if ".execute().fetchall()" not invoked on movies yet
-        if not where: # due to possible 'seen', 'loaned', 'collection_id' in where
+    if qf and movies is None or isinstance(movies, Select):  # if ".execute().fetchall()" not invoked on movies yet
+        if not where:  # due to possible 'seen', 'loaned', 'collection_id' in where
             import advfilter
 
             # saved in advfilter
-            name = self.widgets['filter']['advfilter'].get_active_text()[:-3].decode('utf-8') # :-3 due to additional '   ' in the name
+            name = self.widgets['filter']['advfilter'].get_active_text()[:-3].decode('utf-8')  # :-3 due to additional '   ' in the name
             if name:
                 cond = self.db.session.query(db.Filter).filter_by(name=name).first()
                 if not cond:
@@ -529,13 +533,15 @@
     self.count_statusbar()
 #}}}
 
-def addmovie(self, movie): #{{{
+
+def addmovie(self, movie):  # {{{
     myiter = self.treemodel.append(None)
     setmovie(self, movie, myiter)
     return myiter
 #}}}
 
-def setmovie(self, movie, iter, treemodel = None): #{{{
+
+def setmovie(self, movie, iter, treemodel=None):  # {{{
     if not treemodel:
         treemodel = self.treemodel
 
@@ -573,7 +579,8 @@
     return iter
 #}}}
 
-def select(self, iter, ensurevisible = True): #{{{
+
+def select(self, iter, ensurevisible=True):  # {{{
     if iter:
         self.widgets['treeview'].get_selection().select_iter(iter)
         if ensurevisible:
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/movie.py trunk/lib/movie.py
--- griffith-0.13/lib/movie.py	2011-09-13 20:30:22.000000000 +0300
+++ trunk/lib/movie.py	2014-01-06 22:10:52.595013531 +0200
@@ -1,6 +1,6 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: movie.py 1585 2011-09-12 20:43:18Z mikej06 $'
+__revision__ = '$Id: movie.py 1655 2013-11-12 21:52:22Z mikej06 $'
 
 # Copyright (c) 2005-2009 Vasco Nunes, Piotr Ożarowski
 #
@@ -321,6 +321,7 @@
     remove_accents = True
     progress = None
     useurllib2 = False
+    usepostrequest = False
 
     def __init__(self):
         pass
@@ -348,13 +349,18 @@
             self.url = self.url % self.title
             self.url = string.replace(self.url, ' ', '%20')
         else:
-            self.url = string.replace(self.url + self.title, ' ', '%20')
+            if not self.usepostrequest:
+                self.url = string.replace(self.url + self.title, ' ', '%20')
         try:
             url = self.url.encode(self.encode)
         except UnicodeEncodeError:
             url = self.url.encode('utf-8')
         self.progress.set_data(parent_window, _("Searching"), _("Wait a moment"), True)
-        retriever = Retriever(url, parent_window, self.progress, destination, useurllib2=self.useurllib2)
+        if self.usepostrequest:
+            postdata = self.get_postdata()
+            retriever = Retriever(url, parent_window, self.progress, destination, useurllib2=self.useurllib2, postdata=postdata)
+        else:
+            retriever = Retriever(url, parent_window, self.progress, destination, useurllib2=self.useurllib2)
         retriever.start()
         while retriever.isAlive():
             self.progress.pulse()
@@ -389,11 +395,16 @@
         finally:
             urlcleanup()
         return True
+    
+    def get_postdata(self):
+        # sample, depends on target site
+        #return {'title' : self.Title, 'category' : 'movieTitel' }
+        return {}
 
 
 class Retriever(threading.Thread):
 
-    def __init__(self, URL, parent_window, progress, destination=None, useurllib2=False):
+    def __init__(self, URL, parent_window, progress, destination=None, useurllib2=False, postdata=None):
         self.URL = URL
         self.html = None
         self.exception = None
@@ -402,14 +413,23 @@
         self.progress = progress
         self._stopevent = threading.Event()
         self._sleepperiod = 1.0
+        self.postdata = postdata
         threading.Thread.__init__(self, name="Retriever")
 
     def run(self):
         try:
             if self.useurllib2:
-                self.html = urlretrieve2(self.URL, self.destination, self.hook)
+                if self.postdata:
+                    encodedpostdata = urlencode(self.postdata)
+                    self.html = urlretrieve2(self.URL, self.destination, self.hook, encodedpostdata)
+                else:
+                    self.html = urlretrieve2(self.URL, self.destination, self.hook)
             else:
-                self.html = urlretrieve(self.URL, self.destination, self.hook)
+                if self.postdata:
+                    encodedpostdata = urlencode(self.postdata)
+                    self.html = urlretrieve(self.URL, self.destination, self.hook, encodedpostdata)
+                else:
+                    self.html = urlretrieve(self.URL, self.destination, self.hook)
             if self.progress.status:
                 self.html = []
         except Exception, e:
@@ -447,7 +467,9 @@
 def urlretrieve2(url, filename=None, reporthook=None, data=None):
     global _tempfilecleanup
     headers = {
-        'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7',
+        #'User-Agent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0; MSAppHost/1.0)',
+        #'User-Agent': 'Dalvik/1.6.0 (Linux; U; Android 4.2.2; Nexus 4 Build/JDQ39E)'
+        'User-Agent': 'Dalvik/1.2.0 (Linux; U; Android 2.2.2; Huawei U8800-51 Build/HWU8800B635)',
         'Cache-Control': 'no-cache',
         'Pragma': 'no-cache',
         'Accept-Encoding': 'gzip'}
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/export/PluginExportPDF.py trunk/lib/plugins/export/PluginExportPDF.py
--- griffith-0.13/lib/plugins/export/PluginExportPDF.py	2011-02-08 23:10:58.000000000 +0200
+++ trunk/lib/plugins/export/PluginExportPDF.py	2013-07-27 18:37:05.820220732 +0300
@@ -1,8 +1,8 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: PluginExportPDF.py 1533 2011-02-08 21:04:38Z iznogoud $'
+__revision__ = '$Id: PluginExportPDF.py 1648 2013-06-01 18:25:04Z mikej06 $'
 
-# Copyright (c) 2005-2010 Vasco Nunes
+# Copyright (c) 2005-2013 Vasco Nunes
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -42,20 +42,34 @@
 import gutils
 import version
 from plugins.export import Base
+import logging
+
+log = logging.getLogger("Griffith")
 
 class ExportPlugin(Base):
     name = "PDF"
     description = _("PDF export plugin")
     author = "Vasco Nunes"
     email = "<vasco.m.nunes@gmail.com>"
-    version = "0.6"
+    version = "0.7"
 
-    fields_to_export = ('number', 'o_title', 'title', 'director', 'genre', 'cast', 'plot', 'runtime', 'year', 'notes', 'poster_md5')
+    fields_to_export = ('number', 'o_title', 'title', 'director', 'genre', 'cast', 'plot', 'runtime', 'year', 'notes', 'poster_md5', 'width', 'height', 'volumes.name', 'collections.name')
 
     def initialize(self):
         self.fontName = ''
         return True
 
+    def _get_resolution(self, movie):
+        if not movie.movies_width or not movie.movies_height:
+            return ''
+        from db._movie import res_aliases
+        resolution = (movie.movies_width, movie.movies_height)
+        if resolution in res_aliases:
+            return res_aliases[resolution][0]
+        else:
+            res_string = "%dx%d" % resolution
+            return res_string
+    
     def run(self):
         """exports a simple movie list to a pdf file"""
 
@@ -79,124 +93,142 @@
                     overwrite = False
 
             if overwrite == True or overwrite is None:
-                # filename encoding
-                defaultLang, defaultEnc = getdefaultlocale()
-                if defaultEnc is None:
-                    defaultEnc = 'UTF-8'
-                c = SimpleDocTemplate(pdffilename.encode(defaultEnc), \
-                    author = 'Griffith', \
-                    title = _('List of films').encode('utf-8'), \
-                    subject = _('List of films').encode('utf-8'))
-                # data encoding
-                #if defaultEncoding == 'WinAnsiEncoding':
-                #    defaultEnc = 'cp1252'
-                #else:
-                defaultEnc = 'utf-8'
-
-                pdf_elements = self.config.get('pdf_elements', 'image,director,genre,cast').split(',')
-
-                self.create_styles()
-                style = self.styles["Normal"]
-                Story = [Spacer(1,2*inch)]
-
-                # select sort column - FIXME
-                sort_column_name = self.config.get('sortby', 'number', section='mainlist')
-                sort_reverse = self.config.get('sortby_reverse', False, section='mainlist')
-                do_grouping = True
-                for i in sort_column_name.split(','):
-                    if i != 'title' and i != 'o_title':
-                        do_grouping = False
-
-                # build the query
-                query = self.get_query()
-                movies = query.execute().fetchall()
-
-                # define some custom stylesheetfont
-                total = len(movies)
-                p = Paragraph(saxutils.escape((_("List of films")).encode('utf-8')), self.styles["Heading1"] )
-                Story.append(p)
-                Story.append(Paragraph(" ",style))
-                p = Paragraph(saxutils.escape((_("Total Movies: %s") % str(total)).encode('utf-8')), self.styles["Heading3"])
-                Story.append(p)
-                Story.append(Paragraph(" ",style))
-                # output movies
-                first_letter = ''
-                for movie in movies:
-                    number = movie.number
-                    if movie.o_title:
-                        original_title = movie.o_title.encode(defaultEnc)
-                    else:
-                        original_title = ''
-                    if movie.title:
-                        title = movie.title.encode(defaultEnc)
-                    else:
-                        title = ''
-                    grouping_title = movie.title
-                    if grouping_title is None:
-                        grouping_title = u'None'
-                    if movie.director:
-                        director = ' - ' + movie.director.encode(defaultEnc)
-                    else:
-                        director = ""
-                    # group by first letter
-                    # use movie.title/grouping_title for grouping because of encoding problems !!!
-                    if do_grouping and grouping_title[0] != first_letter:
-                        if grouping_title[0] in '0123456789':
-                            # Group Numbers
-                            if first_letter != '0-9':
-                                first_letter = '0-9'
+                try:
+                    # filename encoding
+                    defaultLang, defaultEnc = getdefaultlocale()
+                    if defaultEnc is None:
+                        defaultEnc = 'UTF-8'
+                    c = SimpleDocTemplate(pdffilename.encode(defaultEnc), \
+                        author = 'Griffith', \
+                        title = _('List of films').encode('utf-8'), \
+                        subject = _('List of films').encode('utf-8'), \
+                        allowSplitting = False)
+                    # data encoding
+                    #if defaultEncoding == 'WinAnsiEncoding':
+                    #    defaultEnc = 'cp1252'
+                    #else:
+                    defaultEnc = 'utf-8'
+
+                    pdf_elements = self.config.get('pdf_elements', 'image,director,genre,cast').split(',')
+
+                    self.create_styles()
+                    style = self.styles["Normal"]
+                    Story = [Spacer(1,2*inch)]
+
+                    # select sort column - FIXME
+                    sort_column_name = self.config.get('sortby', 'number', section='mainlist')
+                    sort_reverse = self.config.get('sortby_reverse', False, section='mainlist')
+                    do_grouping = True
+                    for i in sort_column_name.split(','):
+                        if i != 'title' and i != 'o_title':
+                            do_grouping = False
+
+                    # build the query
+                    query = self.get_query()
+                    movies = query.execute().fetchall()
+
+                    # define some custom stylesheetfont
+                    total = len(movies)
+                    p = Paragraph(saxutils.escape((_("List of films")).encode('utf-8')), self.styles["Heading1"] )
+                    Story.append(p)
+                    Story.append(Paragraph(" ",style))
+                    p = Paragraph(saxutils.escape((_("Total Movies: %s") % str(total)).encode('utf-8')), self.styles["Heading3"])
+                    Story.append(p)
+                    Story.append(Paragraph(" ",style))
+                    # output movies
+                    first_letter = ''
+                    for movie in movies:
+                        number = movie.movies_number
+                        if movie.movies_o_title:
+                            original_title = movie.movies_o_title.encode(defaultEnc)
+                        else:
+                            original_title = ''
+                        if movie.movies_title:
+                            title = movie.movies_title.encode(defaultEnc)
+                        else:
+                            title = ''
+                        grouping_title = movie.movies_title
+                        if grouping_title is None:
+                            grouping_title = u'None'
+                        if movie.movies_director:
+                            director = ' - ' + movie.movies_director.encode(defaultEnc)
+                        else:
+                            director = ""
+                        # group by first letter
+                        # use movie.title/grouping_title for grouping because of encoding problems !!!
+                        if do_grouping and grouping_title[0] != first_letter:
+                            if grouping_title[0] in '0123456789':
+                                # Group Numbers
+                                if first_letter != '0-9':
+                                    first_letter = '0-9'
+                                    paragraph_text = saxutils.escape(first_letter)
+                                    p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Heading2'])
+                                    Story.append(p)
+                            else:
+                                first_letter = grouping_title[0]
                                 paragraph_text = saxutils.escape(first_letter)
                                 p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Heading2'])
                                 Story.append(p)
-                        else:
-                            first_letter = grouping_title[0]
-                            paragraph_text = saxutils.escape(first_letter)
-                            p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Heading2'])
-                            Story.append(p)
-                    # add movie title
-                    paragraph_text = '<b>'+ saxutils.escape(title) + '</b>' + \
-                        saxutils.escape(' (' + original_title + ') | ' + str(number))
-                    p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Heading3'])
-                    if 'image' in pdf_elements:
-                        image_filename = None
-                        if movie.poster_md5:
-                            image_filename = gutils.get_image_fname(movie.poster_md5, self.db, 'm')
-                        if image_filename:
-                            p = ParagraphAndImage(p, Image(image_filename, width = 30, height = 40), side = 'left')
-                            # wrap call needed because of a bug in reportlab flowables.py - ParagraphAndImage::split(self,availWidth, availHeight)
-                            # AttributeError: ParagraphAndImage instance has no attribute 'wI'
-                            p.wrap(30, 40)
-                    Story.append(p)
-                    if 'year' in pdf_elements and movie.year:
-                        paragraph_text = '<b>' + _('Year') + ': </b>' + saxutils.escape(str(movie.year))
-                        p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Normal'])
-                        Story.append(p)
-                    if 'runtime' in pdf_elements and movie.runtime:
-                        paragraph_text = '<b>' + _('Runtime') + ': </b>' + saxutils.escape(str(movie.runtime))
-                        p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Normal'])
-                        Story.append(p)
-                    if 'genre' in pdf_elements and movie.genre:
-                        paragraph_text = '<b>' + _('Genre') + ': </b>' + saxutils.escape(movie.genre.encode(defaultEnc))
-                        p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Normal'])
-                        Story.append(p)
-                    if 'director' in pdf_elements and movie.director:
-                        paragraph_text = '<i><b>' + _('Director') + ': </b>' + saxutils.escape(movie.director.encode(defaultEnc)) + '</i>'
-                        p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Normal'])
-                        Story.append(p)
-                    if 'cast' in pdf_elements and movie.cast:
-                        paragraph_text = '<i><b>' + _('Cast') + ': </b>' + saxutils.escape('; '.join(movie.cast.encode(defaultEnc).split("\n")[0:2])) + '</i>'
-                        p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Normal'])
+                        # add movie title
+                        paragraph_text = '<b>'+ saxutils.escape(title) + '</b>' + \
+                            saxutils.escape(' (' + original_title + ') | ' + str(number))
+                        p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Heading3'])
+                        if 'image' in pdf_elements:
+                            image_filename = None
+                            if movie.movies_poster_md5:
+                                image_filename = gutils.get_image_fname(movie.movies_poster_md5, self.db, 'm')
+                            if image_filename:
+                                p = ParagraphAndImage(p, Image(image_filename, width = 30, height = 40), side = 'left')
+                                # wrap call needed because of a bug in reportlab flowables.py - ParagraphAndImage::split(self,availWidth, availHeight)
+                                # AttributeError: ParagraphAndImage instance has no attribute 'wI'
+                                p.wrap(30, 40)
                         Story.append(p)
-                    if 'plot' in pdf_elements and movie.plot:
-                        paragraph_text = '<i><b>' + _('Plot') + ': </b>' + saxutils.escape(movie.plot.encode(defaultEnc)) + '</i>'
-                        p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Normal'])
-                        Story.append(p)
-                    if 'notes' in pdf_elements and movie.notes:
-                        paragraph_text = '<i><b>' + _('Notes') + ': </b>' + saxutils.escape(movie.notes.encode(defaultEnc)) + '</i>'
-                        p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Normal'])
-                        Story.append(p)
-                c.build(Story, onFirstPage=self.page_template, onLaterPages=self.page_template)
-                gutils.info(_('PDF has been created.'), self.parent_window)
+                        if 'year' in pdf_elements and movie.movies_year:
+                            paragraph_text = '<b>' + _('Year') + ': </b>' + saxutils.escape(str(movie.movies_year))
+                            p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Normal'])
+                            Story.append(p)
+                        if 'runtime' in pdf_elements and movie.movies_runtime:
+                            paragraph_text = '<b>' + _('Runtime') + ': </b>' + saxutils.escape(str(movie.movies_runtime))
+                            p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Normal'])
+                            Story.append(p)
+                        if 'genre' in pdf_elements and movie.movies_genre:
+                            paragraph_text = '<b>' + _('Genre') + ': </b>' + saxutils.escape(movie.movies_genre.encode(defaultEnc))
+                            p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Normal'])
+                            Story.append(p)
+                        if 'director' in pdf_elements and movie.movies_director:
+                            paragraph_text = '<i><b>' + _('Director') + ': </b>' + saxutils.escape(movie.movies_director.encode(defaultEnc)) + '</i>'
+                            p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Normal'])
+                            Story.append(p)
+                        if 'cast' in pdf_elements and movie.movies_cast:
+                            paragraph_text = '<i><b>' + _('Cast') + ': </b>' + saxutils.escape('; '.join(movie.movies_cast.encode(defaultEnc).split("\n")[0:2])) + '</i>'
+                            p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Normal'])
+                            Story.append(p)
+                        if 'plot' in pdf_elements and movie.movies_plot:
+                            paragraph_text = '<i><b>' + _('Plot') + ': </b>' + saxutils.escape(movie.movies_plot.encode(defaultEnc)) + '</i>'
+                            p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Normal'])
+                            Story.append(p)
+                        if 'notes' in pdf_elements and movie.movies_notes:
+                            paragraph_text = '<i><b>' + _('Notes') + ': </b>' + saxutils.escape(movie.movies_notes.encode(defaultEnc)) + '</i>'
+                            p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Normal'])
+                            Story.append(p)
+                        resolution = self._get_resolution(movie)
+                        if resolution:
+                            paragraph_text = '<i><b>' + _('Resolution') + ': </b>' + saxutils.escape(resolution.encode(defaultEnc)) + '</i>'
+                            p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Normal'])
+                            Story.append(p)
+                        if movie.volumes_name:
+                            paragraph_text = '<i><b>' + _('Volume') + ': </b>' + saxutils.escape(movie.volumes_name.encode(defaultEnc)) + '</i>'
+                            p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Normal'])
+                            Story.append(p)
+                        if movie.collections_name:
+                            paragraph_text = '<i><b>' + _('Collection') + ': </b>' + saxutils.escape(movie.collections_name.encode(defaultEnc)) + '</i>'
+                            p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Normal'])
+                            Story.append(p)
+                    c.build(Story, onFirstPage=self.page_template, onLaterPages=self.page_template)
+                    gutils.info(_('PDF has been created.'), self.parent_window)
+                except Exception, e:
+                    log.exception('')
+                    gutils.error(str(e))
 
     def create_styles(self):
         self.styles = getSampleStyleSheet()
@@ -206,18 +238,23 @@
             fontfilename = self.config.get('font', '')
             (fontfilenamebase, fontfilenameextension) = os.path.splitext(fontfilename)
 
-            pdfmetrics.registerFont(TTFont(self.fontName, fontfilename))
-            addMapping(self.fontName, 0, 0, self.fontName)
-            # build font family if available to support <b> and <i>
-            if os.path.isfile(fontfilenamebase + 'bd' + fontfilenameextension):
-                pdfmetrics.registerFont(TTFont(self.fontName + '-bold', fontfilenamebase + 'bd' + fontfilenameextension))
-                addMapping(self.fontName, 1, 0, self.fontName + '-bold')
-            if os.path.isfile(fontfilenamebase + 'bi' + fontfilenameextension):
-                pdfmetrics.registerFont(TTFont(self.fontName + '-bolditalic', fontfilenamebase + 'bi' + fontfilenameextension))
-                addMapping(self.fontName, 1, 1, self.fontName + '-bolditalic')
-            if os.path.isfile(fontfilenamebase + 'i' + fontfilenameextension):
-                pdfmetrics.registerFont(TTFont(self.fontName + '-italic', fontfilenamebase + 'i' + fontfilenameextension))
-                addMapping(self.fontName, 0, 1, self.fontName + '-italic')
+            try:
+                pdfmetrics.registerFont(TTFont(self.fontName, fontfilename))
+            except:
+                log.exception('')
+                self.fontName = "Helvetica"
+            else:
+                addMapping(self.fontName, 0, 0, self.fontName)
+                # build font family if available to support <b> and <i>
+                if os.path.isfile(fontfilenamebase + 'bd' + fontfilenameextension):
+                    pdfmetrics.registerFont(TTFont(self.fontName + '-bold', fontfilenamebase + 'bd' + fontfilenameextension))
+                    addMapping(self.fontName, 1, 0, self.fontName + '-bold')
+                if os.path.isfile(fontfilenamebase + 'bi' + fontfilenameextension):
+                    pdfmetrics.registerFont(TTFont(self.fontName + '-bolditalic', fontfilenamebase + 'bi' + fontfilenameextension))
+                    addMapping(self.fontName, 1, 1, self.fontName + '-bolditalic')
+                if os.path.isfile(fontfilenamebase + 'i' + fontfilenameextension):
+                    pdfmetrics.registerFont(TTFont(self.fontName + '-italic', fontfilenamebase + 'i' + fontfilenameextension))
+                    addMapping(self.fontName, 0, 1, self.fontName + '-italic')
         else:
             self.fontName = "Helvetica"
 
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/extensions/ge_movieposterdb.py trunk/lib/plugins/extensions/ge_movieposterdb.py
--- griffith-0.13/lib/plugins/extensions/ge_movieposterdb.py	2011-08-11 22:35:36.000000000 +0300
+++ trunk/lib/plugins/extensions/ge_movieposterdb.py	2013-07-27 18:37:05.103522449 +0300
@@ -1,6 +1,6 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: ge_movieposterdb.py 1568 2011-08-10 20:08:12Z mikej06 $'
+__revision__ = '$Id: ge_movieposterdb.py 1624 2012-06-07 19:07:22Z mikej06 $'
 
 # Copyright © 2010 Michael Jahn
 #
@@ -77,23 +77,23 @@
                 if movie.year:
                     url = self.baseurltitleyear % (o_title, movie.year)
                     data = self._get(url, self.widgets['window'])
-                    if data:
+                    if data and data.find('movie/0000000') < 0:
                         largeurl = gutils.trim(data, 'src=\\"', '\\"').replace('/t_', '/l_')
                 if not data or not largeurl:
                     url = self.baseurltitle % o_title
                     data = self._get(url, self.widgets['window'])
-                    if data:
+                    if data and data.find('movie/0000000') < 0:
                         largeurl = gutils.trim(data, 'src=\\"', '\\"').replace('/t_', '/l_')
             if not data or not largeurl and title and title != o_title:
                 if movie.year:
                     url = self.baseurltitleyear % (title, movie.year)
                     data = self._get(url, self.widgets['window'])
-                    if data:
+                    if data and data.find('movie/0000000') < 0:
                         largeurl = gutils.trim(data, 'src=\\"', '\\"').replace('/t_', '/l_')
                 if not data or not largeurl:
                     url = self.baseurltitle % title
                     data = self._get(url, self.widgets['window'])
-                    if data:
+                    if data and data.find('movie/0000000') < 0:
                         largeurl = gutils.trim(data, 'src=\\"', '\\"').replace('/t_', '/l_')
         except:
             log.exception('')
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/imp/DVDProfiler.py trunk/lib/plugins/imp/DVDProfiler.py
--- griffith-0.13/lib/plugins/imp/DVDProfiler.py	2011-12-19 00:35:26.000000000 +0200
+++ trunk/lib/plugins/imp/DVDProfiler.py	2013-07-27 18:37:06.030229996 +0300
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-__revision__ = '$Id: DVDProfiler.py 1605 2011-12-18 22:35:25Z piotrek $'
+__revision__ = '$Id: DVDProfiler.py 1612 2012-01-02 21:14:32Z mikej06 $'
 
 # Copyright (c) 2009
 
@@ -205,11 +205,11 @@
                                         details['screenplay'] = details['screenplay'] + lastName + ', '
                                     elif firstName:
                                         details['screenplay'] = details['screenplay'] + firstName + ', '
-                        if len(details['director']) > 2:
+                        if len(details['director']) > 1:
                             details['director'] = details['director'][:-2]
-                        if len(details['cameraman']) > 2:
+                        if len(details['cameraman']) > 1:
                             details['cameraman'] = details['cameraman'][:-2]
-                        if len(details['screenplay']) > 2:
+                        if len(details['screenplay']) > 1:
                             details['screenplay'] = details['screenplay'][:-2]
                     elif node.nodeName == 'Actors':
                         details['cast'] = ''
@@ -260,7 +260,7 @@
                         for genreElement in genreElements:
                             if len(genreElement.childNodes) > 0:
                                 details['genre'] = details['genre'] + genreElement.childNodes[0].data.strip() + ', '
-                        if details['genre'] > 2:
+                        if len(details['genre']) > 1:
                             details['genre'] = details['genre'][:-2]
                     elif node.nodeName == 'Studios':
                         details['studio'] = ''
@@ -268,7 +268,7 @@
                         for studioElement in studioElements:
                             if len(studioElement.childNodes) > 0:
                                 details['studio'] = details['studio'] + studioElement.childNodes[0].data.strip() + ', '
-                        if details['studio'] > 2:
+                        if len(details['studio']) > 1:
                             details['studio'] = details['studio'][:-2]
                     elif node.nodeName == 'Regions':
                         regionElements = node.getElementsByTagName('Region')
Only in trunk/lib/plugins/imp: Tellico.py
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/imp/__init__.py trunk/lib/plugins/imp/__init__.py
--- griffith-0.13/lib/plugins/imp/__init__.py	2011-01-18 12:25:50.000000000 +0200
+++ trunk/lib/plugins/imp/__init__.py	2013-07-27 18:37:06.026896516 +0300
@@ -1,6 +1,6 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: __init__.py 1497 2011-01-16 13:09:52Z mikej06 $'
+__revision__ = '$Id: __init__.py 1628 2012-08-30 21:23:02Z mikej06 $'
 
 # Copyright (c) 2006-2011 Piotr Ożarowski
 #
@@ -181,14 +181,11 @@
                             tags = details.pop('tags')
                         else:
                             tags = None
+                        poster = None
                         if 'poster' in details:
                             poster = details.pop('poster')
-                        else:
-                            poster = None
-                        if 'image' in details:
+                        elif 'image' in details:
                             poster = details.pop('image')
-                        else:
-                            poster = None
                         try:
                             # optional: do mapping of lookup data
                             if not self.foreignkeymaps:
@@ -229,6 +226,7 @@
                                         db.tables.movie_tag.insert(bind=self.db.session.bind).execute({'movie_id': movie.lastrowid, 'tag_id': tag_id})
                                     except:
                                         pass
+                            self.db.session.commit()
                             # adding poster
                             if poster:
                                 if len(poster) > 4:
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieAllRovi.py trunk/lib/plugins/movie/PluginMovieAllRovi.py
--- griffith-0.13/lib/plugins/movie/PluginMovieAllRovi.py	2011-12-19 00:35:26.000000000 +0200
+++ trunk/lib/plugins/movie/PluginMovieAllRovi.py	2013-07-27 18:37:05.690214997 +0300
@@ -1,6 +1,6 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: PluginMovieAllRovi.py 1605 2011-12-18 22:35:25Z piotrek $'
+__revision__ = '$Id: PluginMovieAllRovi.py 1633 2012-12-28 23:11:42Z mikej06 $'
 
 # Copyright (c) 2009-2011
 #
@@ -151,7 +151,7 @@
     # dict { movie_id -> [ expected result count for original url, expected result count for translated url ] }
     #
     test_configuration = {
-        'Rocky' : [ 57, 57 ],
+        'Rocky' : [ 100, 100 ],
     }
 
 class PluginTest:
@@ -195,7 +195,7 @@
             'country'             : 'USA',
             'genre'               : 'Drama',
             'classification'      : False,
-            'studio'              : 'Columbia Pictures, MGM, Revolution Studios, Chartoff Winkler Productions',
+            'studio'              : 'Chartoff Winkler Productions, Columbia Pictures, MGM, Revolution Studios',
             'o_site'              : False,
             'site'                : 'http://www.allrovi.com/movies/movie/rocky-balboa-v337682',
             'trailer'             : False,
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieAllocine.py trunk/lib/plugins/movie/PluginMovieAllocine.py
--- griffith-0.13/lib/plugins/movie/PluginMovieAllocine.py	2011-09-04 23:51:29.000000000 +0300
+++ trunk/lib/plugins/movie/PluginMovieAllocine.py	2014-01-06 22:10:52.551678262 +0200
@@ -1,8 +1,8 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: PluginMovieIMDB.py 176 2006-02-01 12:07:26Z iznogoud $'
+__revision__ = '$Id: PluginMovieAllocine.py 1655 2013-11-12 21:52:22Z mikej06 $'
 
-# Copyright (c) 2005-2011 Vasco Nunes, Piotr Ozarowski
+# Copyright (c) 2005-2012 Vasco Nunes, Piotr Ozarowski
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -21,6 +21,11 @@
 # You may use and distribute this software under the terms of the
 # GNU General Public License, version 2 or later
 
+from datetime import date
+import hashlib
+import base64
+import string
+import urllib
 import movie
 try:
     import simplejson as json
@@ -35,15 +40,25 @@
 plugin_language     = _("French")
 plugin_author       = "Pierre-Luc Levy, Michael Jahn (JSON api)"
 plugin_author_email = ""
-plugin_version      = "1.0"
+plugin_version      = "1.2"
 
 
 class Plugin(movie.Movie):
     def __init__(self, id):
         self.movie_id = id
-        self.url      = "http://api.allocine.fr/xml/movie?partner=3&json=1&profile=large&code=%s" % str(self.movie_id)
+        self.query    = "partner=100043982026&format=json&profile=large&code=%s" % str(self.movie_id)
+        self.url      = "http://api.allocine.fr/rest/v3/movie?"
         self.encode   = 'utf-8'
+        self.useurllib2 = True
 
+    def open_page(self, parent_window=None, url=None):
+        query = self.query + '&sed=' + date.today().strftime("%Y%m%d")
+        to_signature = '29d185d98c984a359e6e6f26a0474269' + query
+        signature = urllib.quote_plus(base64.b64encode(hashlib.sha1(to_signature).digest()))
+        url = self.url + query + '&sig=' + signature
+        self.page = movie.Movie.open_page(self, parent_window, url)
+        return self.page
+        
     def initialize(self):
         self.movie = json.JSONDecoder().decode(self.page)['movie']
 
@@ -101,14 +116,14 @@
                     if 'code' in activity:
                         if activity['code'] == 8001:
                             if 'role' in cast:
-                                self.cast = self.cast + cast['person']['$'] + _(' as ') + cast['role'] + '\n'
+                                self.cast = self.cast + cast['person']['name'] + _(' as ') + cast['role'] + '\n'
                             else:
-                                self.cast = self.cast + cast['person']['$'] + '\n'
+                                self.cast = self.cast + cast['person']['name'] + '\n'
 
     def get_classification(self):
         self.classification = ""
         if 'movieCertificate' in self.movie:
-            self.classification = self.movie['movieCertificate']['$']
+            self.classification = self.movie['movieCertificate']['certificate']['$']
 
     def get_studio(self):
         self.studio = ""
@@ -159,7 +174,7 @@
                     activity = cast['activity']
                     if 'code' in activity:
                         if activity['code'] == code:
-                            result = result + cast['person']['$'] + ', '
+                            result = result + cast['person']['name'] + ', '
         if result:
             result = result[:-2]
         return result
@@ -168,12 +183,22 @@
 class SearchPlugin(movie.SearchMovie):
 
     def __init__(self):
-        self.original_url_search   = "http://api.allocine.fr/xml/search?partner=3&json=1&count=100&profile=small&q="
-        self.translated_url_search = "http://api.allocine.fr/xml/search?partner=3&json=1&count=100&profile=small&q="
+        self.search_query = "partner=100043982026&format=json&q=%s&filter=movie&count=100&page=1&profile=small"
+        self.search_url = "http://api.allocine.fr/rest/v3/search?"
+        
+        self.original_url_search   = "http://api.allocine.fr/rest/v3/search?partner=YW5kcm9pZC12M3M&count=100&profile=small&format=json&filter=movie&q="
+        self.translated_url_search = "http://api.allocine.fr/rest/v3/search?partner=YW5kcm9pZC12M3M&count=100&profile=small&format=json&filter=movie&q="
         self.encode                = 'utf-8'
         self.remove_accents        = True
+        self.useurllib2 = True
 
     def search(self, parent_window):
+        query = string.replace(self.search_query % self.title, ' ', '%20')
+        query = query + '&sed=' + date.today().strftime("%Y%m%d")
+        to_signature = '29d185d98c984a359e6e6f26a0474269' + query
+        signature = urllib.quote_plus(base64.b64encode(hashlib.sha1(to_signature).digest()))
+        self.title = self.search_url + query + '&sig=' + signature
+        self.url = ''
         if not self.open_search(parent_window):
             return None
         return self.page
@@ -198,6 +223,7 @@
                     log.exception('')
         except:
             log.exception('')
+            log.error(self.page)
 
 
 #
@@ -258,7 +284,7 @@
             'o_title'             : u'Terminator, The',
             'director'            : u'James Cameron',
             'plot'                : True,
-            'cast'                : u'Arnold Schwarzenegger' + _(' as ') + 'le Terminator\n\
+            'cast'                : u'Arnold Schwarzenegger' + _(' as ') + 'Le Terminator\n\
 Michael Biehn' + _(' as ') + 'Kyle Reese\n\
 Linda Hamilton' + _(' as ') + 'Sarah Connor\n\
 Lance Henriksen' + _(' as ') + 'l\'inspecteur Vukovich\n\
@@ -268,7 +294,7 @@
 Earl Boen' + _(' as ') + 'le Dr Peter Silberman\n\
 Dick Miller' + _(' as ') + 'le marchand d\'armes\n\
 Shawn Schepps' + _(' as ') + 'Nancy\n\
-Bill Paxton' + _(' as ') + 'le chef des punks\n\
+Bill Paxton' + _(' as ') + 'Le chef des punks\n\
 Brian Thompson' + _(' as ') + 'un punk\n\
 Marianne Muellerleile' + _(' as ') + 'la \'mauvaise\' Sarah Connor\n\
 Franco Columbu' + _(' as ') + 'le Terminator infiltrant le bunker dans le futur\n\
@@ -306,7 +332,7 @@
             'notes'               : False,
             'runtime'             : 108,
             'image'               : True,
-            'rating'              : 8,
+            'rating'              : 7,
             'cameraman'           : u'Adam Greenberg',
             'screenplay'          : u'James Cameron, Gale Anne Hurd, Harlan Ellison, William Wisher',
             'barcode'             : False
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieAmazon.py trunk/lib/plugins/movie/PluginMovieAmazon.py
--- griffith-0.13/lib/plugins/movie/PluginMovieAmazon.py	2011-12-04 17:59:11.000000000 +0200
+++ trunk/lib/plugins/movie/PluginMovieAmazon.py	2013-07-27 18:37:05.670214115 +0300
@@ -1,8 +1,8 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id$'
+__revision__ = '$Id: PluginMovieAmazon.py 1633 2012-12-28 23:11:42Z mikej06 $'
 
-# Copyright (c) 2006-2009
+# Copyright (c) 2006-2012
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -125,7 +125,9 @@
             if hasattr(self.page.EditorialReviews, 'EditorialReview'):
                 if isSequenceType(self.page.EditorialReviews.EditorialReview):
                     for review in self.page.EditorialReviews.EditorialReview:
-                        if string.find(review.Source, 'Amazon') > -1:
+                        if hasattr(review, 'Source') and \
+                            hasattr(review, 'Content') and \
+                            string.find(review.Source, 'Amazon') > -1:
                             self.plot = review.Content
                 else:
                     if hasattr(self.page.EditorialReviews.EditorialReview, 'Source') and \
@@ -398,8 +400,8 @@
     # dict { movie_id -> [ expected result count for original url, expected result count for translated url ] }
     #
     test_configuration = {
-        'Rocky Balboa' : [  22,  22 ],
-        'Arahan'       : [   9,   9 ],
+        'Rocky Balboa' : [  23,  23 ],
+        'Arahan'       : [  10,  10 ],
         'Glück'        : [ 100, 100 ]
     }
 
@@ -428,11 +430,11 @@
             'o_site'              : False,
             'site'                : 'http://www.amazon.de/dp/B000TIQMMI',
             'trailer'             : False,
-            'year'                : 2006,
+            'year'                : 2007,
             'notes'               : 'EAN: 4045167004504',
             'runtime'             : 97,
             'image'               : True,
-            'rating'              : 8,
+            'rating'              : False,
             'barcode'             : '4045167004504'
         },
         'B0009NSASM' : {
@@ -450,11 +452,11 @@
             'o_site'              : False,
             'site'                : 'http://www.amazon.de/dp/B0009NSASM',
             'trailer'             : False,
-            'year'                : 1973,
+            'year'                : 2008,
             'notes'               : 'EAN: 7321921998843',
             'runtime'             : 110,
             'image'               : True,
-            'rating'              : 10,
+            'rating'              : False,
             'barcode'             : '7321921998843'
         },
         'B000BSNOD6' : {
@@ -475,7 +477,7 @@
             'notes'               : 'EAN: 4013549871105',
             'runtime'             : 108,
             'image'               : True,
-            'rating'              : 8,
+            'rating'              : False,
             'barcode'             : '4013549871105'
         }
     }
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieAniDB.py trunk/lib/plugins/movie/PluginMovieAniDB.py
--- griffith-0.13/lib/plugins/movie/PluginMovieAniDB.py	2011-09-26 22:36:40.000000000 +0300
+++ trunk/lib/plugins/movie/PluginMovieAniDB.py	2013-07-27 18:37:05.666880634 +0300
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-__revision__ = '$Id: PluginMovieAniDB.py 1594 2011-09-22 21:00:44Z mikej06 $'
+__revision__ = '$Id: PluginMovieAniDB.py 1633 2012-12-28 23:11:42Z mikej06 $'
 
 # Copyright © 2005-2011 Piotr Ożarowski
 #
@@ -256,7 +256,7 @@
 [Seras Victoria] voiced by Orikasa Fumiko\n\
 [Incognito] voiced by Yamazaki Takumi',
             'country'             : False,
-            'genre'               : 'Law and Order, Alternative Present, Horror, Vampires, Gunfights, Action, Contemporary Fantasy, United Kingdom, Earth, Europe, Special Squads, Cops, Manga, Seinen, Violence, Fantasy, Present',
+            'genre'               : 'Law and Order, Alternative Present, Horror, Vampires, Gunfights, Action, Contemporary Fantasy, United Kingdom, Earth, Europe, Special Squads, Cops, Manga, Seinen, Violence, Fantasy, Present, London, Zombies',
             'classification'      : False,
             'studio'              : False,
             'o_site'              : 'http://www.gonzo.co.jp/works/0102.html',
@@ -266,7 +266,7 @@
             'notes'               : True,
             'runtime'             : 0,
             'image'               : True,
-            'rating'              : 8,
+            'rating'              : 6,
             'cameraman'           : False,
             'screenplay'          : False
         },
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieCSFD.py trunk/lib/plugins/movie/PluginMovieCSFD.py
--- griffith-0.13/lib/plugins/movie/PluginMovieCSFD.py	2011-12-04 17:59:11.000000000 +0200
+++ trunk/lib/plugins/movie/PluginMovieCSFD.py	2014-01-06 22:10:52.551678262 +0200
@@ -41,9 +41,9 @@
         self.url = "http://www.csfd.cz" + str(id)
 
     def get_image(self):
-        self.image_url = re.search(r"content=\"http://img.csfd.cz/posters/([^\"]*)\"", self.page)
+        self.image_url = re.search(r"content=\"http://img.csfd.cz/files/images/film/posters/([^\"]*)\"", self.page)
         if self.image_url:
-            self.image_url = "http://img.csfd.cz/posters/" + gutils.strip_tags(self.image_url.group(1))
+            self.image_url = "http://img.csfd.cz/files/images/film/posters/" + gutils.strip_tags(self.image_url.group(1))
         else:
             self.image_url = ""
 
@@ -130,7 +130,7 @@
         a = re.sub("\n", "", a)
         a = re.sub("<BR>", "", a)
         try:
-            self.plot = re.search(r'ka"([^<]*)', a).group(0)[6:]
+            self.plot = gutils.after(re.search(r'ka"([^<]*)', a).group(0), '>')
         except:
             self.plot = ""
 
@@ -178,6 +178,18 @@
     def get_classification(self):
         self.classification = ""
 
+    def get_screenplay(self):
+        self.screenplay = ''
+        tmp = gutils.trim(self.page, '>Scénář:<', '</div>')
+        if tmp:
+            tmp = string.split(tmp, "href=")
+            for item in tmp:
+                item = gutils.clean(gutils.trim(item, '>', '<'))
+                if item:
+                    self.screenplay = self.screenplay + item + ', '
+            if self.screenplay:
+                self.screenplay = self.screenplay[:-2]
+
 
 class SearchPlugin(movie.SearchMovie):
     def __init__(self):
@@ -214,7 +226,7 @@
     #
     test_configuration = {
         'Cliffhanger' : [ 1, 1 ],
-        'Rocky' : [ 38, 38 ]
+        'Rocky' : [ 41, 41 ]
     }
 
 
@@ -245,10 +257,10 @@
 Michael Ahl\n\
 Dean Maur',
             'country'        : 'USA',
-            'genre'          : 'Sportovní / Drama',
+            'genre'          : 'Sportovní / Drama / Akční / Romantický',
             'classification' : False,
             'studio'         : False,
-            'o_site'         : 'http://www.mgm.com/view/movie/1667/Rocky-Balboa/',
+            'o_site'         : False,
             'site'           : 'http://www.imdb.com/title/tt0479143/',
             'trailer'        : 'http://www.csfd.cz/film/221900-rocky-balboa/videa',
             'year'           : 2006,
@@ -275,11 +287,13 @@
 Gregory Scott Cummins\n\
 Max Perlich\n\
 Paul Winfield\n\
+Ralph Waite\n\
 Zach Grenier\n\
 Don S. Davis\n\
 Bruce McGill\n\
 Jeff Blynn\n\
-John Fin',
+John Finn\n\
+Rosemary Dunsmor',
             'country'        : 'USA / Itálie / Francie',
             'genre'          : 'Akční / Dobrodružný / Thriller',
             'classification' : False,
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieCineMovies.py trunk/lib/plugins/movie/PluginMovieCineMovies.py
--- griffith-0.13/lib/plugins/movie/PluginMovieCineMovies.py	2011-08-31 09:40:41.000000000 +0300
+++ trunk/lib/plugins/movie/PluginMovieCineMovies.py	2013-07-27 18:37:05.673547595 +0300
@@ -1,6 +1,6 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: PluginMovieCineMovies.py 1577 2011-08-30 21:13:26Z mikej06 $'
+__revision__ = '$Id: PluginMovieCineMovies.py 1644 2013-02-21 20:37:27Z mikej06 $'
 
 # Copyright (c) 2005-2011 Vasco Nunes, Piotr Ożarowski
 #
@@ -30,66 +30,64 @@
 plugin_language     = _("French")
 plugin_author       = "Vasco Nunes"
 plugin_author_email = "<vasco.m.nunes@gmail.com>"
-plugin_version      = "0.4"
+plugin_version      = "0.5"
 
 class Plugin(movie.Movie):
     def __init__(self, id):
-        self.encode   = 'iso-8859-1'
+        self.encode   = 'utf-8'
         self.movie_id = id
-        self.url      = "http://www.cinemovies.fr/fiche_film.php?IDfilm=" + str(self.movie_id)
-
-    def initialize(self):
-        self.page_cast = self.open_page(self.parent_window, url = 'http://www.cinemovies.fr/fiche_cast.php?IDfilm='+ str(self.movie_id))
+        self.url      = "http://www.cinemovies.fr/film/" + str(self.movie_id)
+        print self.url
 
     def get_image(self):
-        self.image_url = gutils.trim(self.page, '<link rel="image_src" href="', '">')
+        self.image_url = gutils.trim(gutils.trim(self.page, 'property="og:image"', '>'), '"', '"')
 
     def get_o_title(self):
-        self.o_title = gutils.trim(self.page, 'Titre original :', '</tr>')
+        self.o_title = gutils.trim(self.page, 'Titre original :', '</span>')
 
     def get_title(self):
-        self.title = gutils.trim(self.page, '<h1 class="h1artist" property="v:name">', '</h1>')
+        self.title = gutils.trim(gutils.trim(self.page, 'property="og:title"', '>'), '"', '"')
 
     def get_director(self):
-        self.director = gutils.clean(gutils.trim(self.page_cast, u'Réalisé par</h2> :', '<div id="cast_film">'))
+        self.director = gutils.clean(gutils.trim(self.page, u'Réalisé par', '</span>'))
         self.director = re.sub('[\n|\t]+', ', ', self.director)
 
     def get_plot(self):
-        self.plot = gutils.trim(gutils.after(self.page, '>L\'histoire<'), '<div id="story_fiche" property="v:summary">', '</div>')
+        self.plot = gutils.after(gutils.trim(self.page, 'class="synopsis"', '</div>'), '>')
 
     def get_year(self):
-        self.year = gutils.trim(self.page, 'Date(s) de Sortie(s)', '</a>')
-        if len(self.year) > 4:
-            self.year = self.year[len(self.year) - 4:len(self.year)]
+        self.year = gutils.trim(gutils.trim(self.page, 'Date de sortie :', '</span>'), 'content="', '-')
 
     def get_runtime(self):
-        self.runtime = gutils.clean(gutils.trim(self.page, u'>Durée :', '</tr>'))
+        self.runtime = gutils.clean(gutils.trim(self.page, u'Durée : ', '</span>'))
         if self.runtime:
-           if self.runtime.find('h') > 0:
-              self.runtime = str (int(gutils.before(self.runtime,'h'))*60 + int(gutils.after(self.runtime,'h')))
+           if self.runtime.find('H') > 0:
+              self.runtime = str (int(gutils.before(self.runtime,'H'))*60 + int(gutils.after(self.runtime,'H')))
            else:
               self.runtime = gutils.before(self.runtime,' mn')
 
     def get_genre(self):
-        self.genre = gutils.trim(self.page, 'Genre :', '</tr>')
+        self.genre = gutils.trim(self.page, 'Genre :', '</span>')
         self.genre = re.sub('[,][^,]*$', '', self.genre)
         self.genre = self.genre.replace(',', ', ')
 
     def get_cast(self):
-        self.cast = gutils.trim(self.page_cast, u'Comédiens</h2> :', '<div id="cast_film">')
-        self.cast = self.cast.replace('\n', '')
-        self.cast = self.cast.replace('</tr>', '\n')
-        self.cast = re.sub('</a></h5>', _(' as '), self.cast)
-        self.cast = gutils.clean(self.cast)
-        self.cast = re.sub(_(' as ') + '[ \t]*(\n|$)', '\n', self.cast)
-        self.cast = re.sub('[ \t]*\n[ \t]+', '\n', self.cast)
+        self.cast = ''
+        tmp = self.page.split('itemprop="actor"')
+        for element in tmp[1:]:
+            actor = gutils.trim(element, '>', '</span>')
+            role = gutils.after(gutils.trim(element, u'Rôle', '</span>'), ': ')
+            if role:
+                self.cast = self.cast + actor + _(' as ') + role + '\n'
+            else:
+                self.cast = self.cast + actor + '\n'
 
     def get_classification(self):
         # not available on this site
         self.classification = ''
 
     def get_studio(self):
-        self.studio = string.strip(gutils.trim(self.page, 'Distributeur :', '</tr>'))
+        self.studio = string.strip(gutils.trim(self.page, 'Distributeur :', '</span>'))
 
     def get_o_site(self):
         self.o_site = gutils.after(gutils.after(gutils.trim(self.page, '>Site(s) Officiel(s)<', '</a'), '<a '), '>')
@@ -108,35 +106,33 @@
         self.rating = gutils.clean(gutils.trim(self.page, '<div class=number3>', '</div>'))
 
     def get_screenplay(self):
-        self.screenplay = gutils.clean(gutils.trim(self.page_cast, u'Scénario de</h2> :', '<div id="cast_film">'))
+        self.screenplay = gutils.clean(gutils.trim(self.page, u'Scénario de</h2> :', '<div id="cast_film">'))
         self.screenplay = re.sub('[\n|\t]+', ', ', self.screenplay)
 
 
 class SearchPlugin(movie.SearchMovie):
     def __init__(self):
-        self.encode                = 'iso-8859-1'
-        self.original_url_search   = "http://www.cinemovies.fr/resultat_recherche.php?typsearch=11&cherche="
-        self.translated_url_search = "http://www.cinemovies.fr/resultat_recherche.php?typsearch=11&cherche="
+        self.encode                = 'utf-8'
+        self.original_url_search   = 'http://www.cinemovies.fr/rechercher/?e=m&page=1&q='
+        self.translated_url_search = 'http://www.cinemovies.fr/rechercher/?e=m&page=1&q='
 
     def search(self,parent_window):
         if not self.open_search(parent_window):
             return None
-        self.sub_search()
         return self.page
 
-    def sub_search(self):
-        self.page = gutils.trim(self.page, '<div class=searchban>Les film', '<div class=spaceblank>')
-
     def get_searches(self):
-        elements = string.split(self.page, '<tr')
+        elements = string.split(self.page, '"><a href="http://www.cinemovies.fr/film/')
         self.number_results = elements[-1]
 
         if (elements[0]<>''):
             for element in elements:
-                self.ids.append(gutils.trim(element, 'IDfilm=', '"'))
-                title = gutils.convert_entities(gutils.strip_tags(gutils.after(gutils.trim(element, 'IDfilm=', '</a>'), '>')))
-                year = gutils.after(gutils.trim(element, '<td valign="bottom"', '</td>'), '>')
-                self.titles.append(title + ' (' + year + ')')
+                id = gutils.before(element, '"')
+                title = gutils.clean(gutils.trim(element, '>', '<'))
+                if id and title:
+                    self.ids.append(id)
+                    year = gutils.trim(element, '">Sortie le', '<')
+                    self.titles.append(title + ' (' + year + ')')
         else:
             self.number_results = 0
 
@@ -149,7 +145,7 @@
     # dict { movie_id -> [ expected result count for original url, expected result count for translated url ] }
     #
     test_configuration = {
-        'Rocky Balboa' : [ 2, 2 ],
+        'Rocky Balboa' : [ 4, 4 ],
     }
 
 class PluginTest:
@@ -161,7 +157,7 @@
     #        * or the expected value
     #
     test_configuration = {
-        '6065' : { 
+        'rocky-balboa_e54849' : { 
             'title'               : 'Rocky Balboa',
             'o_title'             : 'Rocky VI',
             'director'            : 'Sylvester Stallone',
@@ -186,7 +182,7 @@
             'classification'      : False,
             'studio'              : 'Twentieth Century Fox France',
             'o_site'              : 'http://www.sonypictures.com/movies/rocky/',
-            'site'                : 'http://www.cinemovies.fr/fiche_film.php?IDfilm=6065',
+            'site'                : 'http://www.cinemovies.fr/film/rocky-balboa_e54849',
             'trailer'             : 'http://www.cinemovies.fr/fiche_multimedia.php?IDfilm=6065',
             'year'                : 2007,
             'notes'               : False,
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieCineteka.py trunk/lib/plugins/movie/PluginMovieCineteka.py
--- griffith-0.13/lib/plugins/movie/PluginMovieCineteka.py	2011-08-31 09:40:41.000000000 +0300
+++ trunk/lib/plugins/movie/PluginMovieCineteka.py	2013-07-27 18:37:05.676881075 +0300
@@ -134,7 +134,7 @@
 class SearchPlugin(movie.SearchMovie):
     """A movie search object"""
     def __init__(self):
-        self.original_url_search   = "http://www.cineteka.com/index.php?op=MovieSearch&s="
+        self.original_url_search   = "http://www.cineteka.com/index.php?op=MovieSearch&perfil_display=0&ordby=3&s="
         self.translated_url_search = self.original_url_search
         self.encode                = 'iso-8859-1'
 
@@ -142,7 +142,7 @@
         """Perform the web search"""
         if not self.open_search(parent_window):
             return None
-        self.page = gutils.trim(self.page, 'tulo(s): ', '<div class="menuright">')
+        self.page = gutils.after(self.page, '"Resultados Ordenados por:"')
         return self.page
 
     def get_searches(self):
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieDVDEmpire.py trunk/lib/plugins/movie/PluginMovieDVDEmpire.py
--- griffith-0.13/lib/plugins/movie/PluginMovieDVDEmpire.py	2009-12-08 23:53:02.000000000 +0200
+++ trunk/lib/plugins/movie/PluginMovieDVDEmpire.py	2013-07-27 18:37:05.670214115 +0300
@@ -1,6 +1,6 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: PluginMovieDVDEmpire.py 1327 2009-12-08 20:38:46Z mikej06 $'
+__revision__ = '$Id: PluginMovieDVDEmpire.py 1650 2013-06-26 20:59:58Z mikej06 $'
 
 # Copyright (c) 2007-2009
 #
@@ -24,6 +24,7 @@
 import gutils
 import movie
 import re
+import string
 
 plugin_name         = "DVD Empire"
 plugin_description  = "International Retailer of DVD Movies"
@@ -31,57 +32,68 @@
 plugin_language     = _("English")
 plugin_author       = "Michael Jahn"
 plugin_author_email = "<mikej06@hotmail.com>"
-plugin_version      = "1.1"
+plugin_version      = "1.2"
 
 class Plugin(movie.Movie):
     def __init__(self, id):
         self.encode   = 'iso-8859-1'
         self.movie_id = id
-        self.url      = "http://www.dvdempire.com/Exec/v4_item.asp?item_id=" + str(self.movie_id)
+        self.url      = "http://www.dvdempire.com" + str(self.movie_id)
 
     def get_image(self):
-        tmp_page = gutils.trim(self.page, '<td align="center" valign="top" class="fontsmall">', '</td>')
-        self.image_url = gutils.trim(tmp_page, '<img src=\'', '\' ')
+        tmp_page = gutils.trim(self.page, 'id="Boxcover"', '</div>')
+        self.image_url = gutils.trim(tmp_page, 'href="', '"')
 
     def get_o_title(self):
-        self.o_title = gutils.strip_tags(gutils.trim(self.page,'<td class="fontxlarge" valign="top" align="left">', '<nobr>'))
+        self.o_title = gutils.strip_tags(gutils.trim(self.page, '<title>', '('))
 
     def get_title(self):
-        self.title = gutils.strip_tags(gutils.trim(self.page,'<td class="fontxlarge" valign="top" align="left">', '<nobr>'))
+        self.title = gutils.strip_tags(gutils.trim(self.page, '<title>', '('))
 
     def get_director(self):
-        self.director = gutils.strip_tags(gutils.trim(self.page,">Directors:","</a>"))
+        self.director = gutils.trim(self.page, '<h3>Director</h3>', '</div>')
+        self.director = self.director.replace('</li><li', '</li>, <li')
         self.director = self.director.replace('&nbsp;', '')
         self.director = self.director.replace('&#149;', '')
 
     def get_plot(self):
-        self.plot = gutils.strip_tags(gutils.trim(self.page, '<td width="100%" valign="top" class="fontsmall3">', '</td>'))
+        self.plot = gutils.strip_tags(gutils.trim(self.page, 'Synopsis</h2>', '</div>'))
         self.plot = self.plot.replace(u'\x93', '"')
         self.plot = self.plot.replace(u'\x84', '"')
 
     def get_year(self):
-        self.year = gutils.strip_tags(gutils.trim(self.page, '>Production Year:', '<br />'))
+        self.year = gutils.strip_tags(gutils.after(gutils.trim(self.page, 'Production Year', '<br'), '>'))
 
     def get_runtime(self):
-        self.runtime = gutils.strip_tags(gutils.trim(self.page, '>Length:', '<br />'))
+        self.runtime = ''
+        tmp = gutils.strip_tags(gutils.trim(self.page, 'Length', '<br'))
+        #1 hrs. 59 mins.
+        try:
+            self.runtime = int(gutils.before(tmp, 'hrs')) * 60 + int(gutils.trim(tmp, '.', 'mins'))
+        except:
+            self.runtime = ''
 
     def get_genre(self):
-        self.genre = gutils.strip_tags(gutils.trim(self.page, '>Genre</b>:', '</tr>'))
+        tmp = gutils.strip_tags(gutils.trim(self.page, '<h2>Categories</h2>', '</p>'))
+        tmp = tmp.replace('\r\n', '')
+        self.genre = re.sub('[ \t]+', ' ', tmp)
 
     def get_cast(self):
-        self.cast = gutils.trim(self.page, '>Actors:', '</td><td')
+        self.cast = gutils.trim(self.page, '<h3>Cast</h3>', '</div>')
         self.cast = self.cast.replace('<br>', '\n')
         self.cast = self.cast.replace('<br />', '\n')
         self.cast = self.cast.replace('&nbsp;', '')
         self.cast = self.cast.replace('&#8226;', '')
         self.cast = self.cast.replace('&#149;', '')
+        self.cast = self.cast.replace('</li><li', '</li>\n<li')
+        self.cast = self.cast.replace('</li><!-- non-headliners --><li', '</li>\n<li')
         self.cast = gutils.strip_tags(self.cast)
 
     def get_classification(self):
-        self.classification = gutils.strip_tags(gutils.trim(self.page, '>Rating:', '<br />'))
+        self.classification = gutils.strip_tags(gutils.trim(self.page, 'Rating</strong>', '<br'))
 
     def get_studio(self):
-        self.studio = gutils.strip_tags(gutils.trim(self.page, '>Studio:', '<br />'))
+        self.studio = gutils.strip_tags(gutils.trim(self.page, 'Studio</strong>', '<br'))
 
     def get_o_site(self):
         self.o_site = ""
@@ -96,7 +108,7 @@
         self.country = ""
 
     def get_rating(self):
-        self.rating = gutils.clean(gutils.trim(self.page, '>Overall Rating:', ' out of'))
+        self.rating = gutils.clean(gutils.trim(self.page, 'Overall Rating:', ' out of'))
         try:
             tmp_float = float(self.rating)
             tmp_float = round(2 * tmp_float, 0)
@@ -106,90 +118,65 @@
 
     def get_notes(self):
         self.notes = ''
-        tmp_page = gutils.trim(self.page, 'Features:', '<b>')
+        tmp_page = gutils.trim(self.page, '<h3>Features</h3>', '</p>')
         tmp_page = tmp_page.replace('<br>', '\n')
         tmp_page = tmp_page.replace('<br />', '\n')
         tmp_page = gutils.strip_tags(tmp_page)
         if tmp_page <> '':
-            tmp_page = re.sub('[\r\n]+', '\n', tmp_page)
-            self.notes = self.notes + '\nFeatures:' + tmp_page + '\n'
-        tmp_page = gutils.trim(self.page, 'Video:', '<b>')
+            self.notes = self.notes + 'Features:\n' + tmp_page + '\n\n'
+        tmp_page = gutils.trim(self.page, 'Video</strong>', '<strong>')
+        tmp_page = tmp_page.replace('\r\n', '')
+        tmp_page = re.sub('[ \t]+', ' ', tmp_page)
         tmp_page = tmp_page.replace('<br>', '\n')
         tmp_page = tmp_page.replace('<br />', '\n')
         tmp_page = gutils.strip_tags(tmp_page)
         if tmp_page <> '':
-            tmp_page = re.sub('[\r\n]+', '\n', tmp_page)
-            self.notes = self.notes + '\nVideo:' + tmp_page + '\n'
-        tmp_page = gutils.trim(self.page, 'Audio:', '<b>')
+            self.notes = self.notes + 'Video:' + tmp_page
+        tmp_page = gutils.trim(self.page, 'Audio</strong>', '</div>')
+        tmp_page = tmp_page.replace('\r\n', '')
+        tmp_page = re.sub('[ \t]+', ' ', tmp_page)
         tmp_page = tmp_page.replace('<br>', '\n')
         tmp_page = tmp_page.replace('<br />', '\n')
         tmp_page = tmp_page.replace('(more info)', '\n')
         tmp_page = gutils.strip_tags(tmp_page)
         if tmp_page <> '':
-            tmp_page = re.sub('[\r\n]+', '\n', tmp_page)
-            self.notes = self.notes + '\nAudio:' + tmp_page
-        tmp_page = gutils.trim(self.page, 'Subtitles:', '<b>')
-        tmp_page = gutils.strip_tags(tmp_page)
-        if tmp_page <> '':
-            tmp_page = re.sub('[\r\n]+', '\n', tmp_page)
-            self.notes = self.notes + '\nSubtitles:\n' + tmp_page + '\n'
+            self.notes = self.notes + 'Audio:' + tmp_page
 
     def get_screenplay(self):
-        self.screenplay = gutils.strip_tags(gutils.trim(self.page, '>Writers:', '</a>'))
+        self.screenplay = gutils.strip_tags(gutils.trim(self.page, 'Writers</strong>', '<br'))
         self.screenplay = self.screenplay.replace('&nbsp;', '')
         self.screenplay = self.screenplay.replace('&#149;', '')
 
     def get_barcode(self):
-        self.barcode = gutils.trim(self.page, '<b>UPC Code:</b>', '<')
+        self.barcode = gutils.trim(self.page, 'UPC Code</strong>', '<br')
+
 
 class SearchPlugin(movie.SearchMovie):
     def __init__(self):
-        self.original_url_search   = "http://www.dvdempire.com/Exec/v1_search_all.asp?&site_media_id=0&pp=&search_refined=32&used=0&string="
-        self.translated_url_search = "http://www.dvdempire.com/Exec/v1_search_all.asp?&site_media_id=0&pp=&search_refined=32&used=0&string="
+        self.original_url_search   = "http://www.dvdempire.com/allsearch/search?pageSize=100&q="
+        self.translated_url_search = "http://www.dvdempire.com/allsearch/search?pageSize=100&q="
         self.encode                = 'iso-8859-1'
 
     def search(self,parent_window):
         if not self.open_search(parent_window):
             return None
-        # short the content
-        tmp_page = gutils.trim(self.page,'<select name="sort"', 'Click Here to make a Suggestion</a>')
-        #
-        # try to get all result pages (not so nice, but it works)
-        #
-        tmp_pagecount = gutils.trim(self.page, '<div id="Search_Container" name="Search_Container">', '</table>')
-        tmp_pagecountintuse = 1
-        elements = tmp_pagecount.split("&page=")
-        for element in elements:
-            try:
-                tmp_pagecountint = int(gutils.before(element, '\''))
-            except:
-                tmp_pagecountint = 0
-            if tmp_pagecountint > tmp_pagecountintuse:
-                tmp_pagecountintuse = tmp_pagecountint
-        tmp_pagecountintcurrent = 1
-        while tmp_pagecountintuse > tmp_pagecountintcurrent and tmp_pagecountintuse < 4:
-            tmp_pagecountintcurrent = tmp_pagecountintcurrent + 1
-            self.url = "http://www.dvdempire.com/Exec/v1_search_all.asp?&site_media_id=0&pp=&search_refined=32&used=0&page=" + str(tmp_pagecountintcurrent) + "&string="
-            self.open_search(parent_window)
-            if self.open_search(parent_window):
-                tmp_page2 = gutils.trim(self.page,'<select name="sort"', 'Click Here to make a Suggestion</a>')
-                tmp_page = tmp_page + tmp_page2
-
-        self.page = tmp_page
         return self.page
 
     def get_searches(self):
-        split_pattern = re.compile('<a[\t ]+href=["\']/Exec/v4_item[.]asp[?](?:userid=[-0-9]+[&]amp;)*item_id=([0-9]+)\'')
+        split_pattern = re.compile('class="title"')
         elements = split_pattern.split(self.page)
-        for index in range(1, len(elements), 2):
-            title_element = elements[index + 1]
-            tmp_title = gutils.strip_tags(gutils.trim(title_element, '>', '</a>'))
+        for index in range(1, len(elements), 1):
+            title_element = elements[index]
+            tmp_title = gutils.clean(gutils.strip_tags(gutils.trim(title_element, '>', '</a>')))
+            tmp_title = string.replace(tmp_title, '&nbsp;', ' ')
+            tmp_title = string.replace(tmp_title, '&amp;', '&')
+            tmp_title = string.replace(tmp_title, '&quot;', '"')
             if tmp_title <> '':
-                self.ids.append(elements[index])
-                type = re.search('<b>Blu-ray</b>', title_element)
+                self.ids.append(gutils.trim(elements[index], 'href="', '"'))
+                type = re.search('>Blu-ray</span>', title_element)
                 if type:
                     tmp_title = tmp_title + ' (Blu-ray)'
-                type = re.search('<b>DVD-Video</b>', title_element)
+                type = re.search('>DVD-Video</span>', title_element)
                 if type:
                     tmp_title = tmp_title + ' (DVD)'
                 self.titles.append(tmp_title)
@@ -203,7 +190,7 @@
     # dict { movie_id -> [ expected result count for original url, expected result count for translated url ] }
     #
     test_configuration = {
-        'Rocky Balboa' : [ 2, 2 ],
+        'Rocky Balboa' : [ 30, 30 ],
     }
 
 class PluginTest:
@@ -215,45 +202,45 @@
     #        * or the expected value
     #
     test_configuration = {
-        '1300280' : { 
-            'title'               : 'Rocky Balboa',
-            'o_title'             : 'Rocky Balboa',
-            'director'            : 'Sylvester Stallone',
+        '/1402424/meet-the-spartans-unrated-pit-of-death-edition-blu-ray.html' : { 
+            'title'               : 'Meet The Spartans: Unrated Pit Of Death Edition',
+            'o_title'             : 'Meet The Spartans: Unrated Pit Of Death Edition',
+            'director'            : 'Jason Friedberg, Aaron Seltzer',
             'plot'                : True,
-            'cast'                : 'Sylvester Stallone\n\
-Burt Young\n\
-Geraldine Hughes\n\
-Milo Ventimiglia\n\
-Antonio Tarver',
+            'cast'                : 'Carmen Electra\n\
+Sean Maguire\n\
+Ken Davitian',
             'country'             : False,
-            'genre'               : 'Sports, Boxing, Drama',
-            'classification'      : 'PG',
-            'studio'              : 'Sony Pictures Home Entertainment',
+            'genre'               : 'Blu-ray, Comedy, Movies, Spoofs & Parodies',
+            'classification'      : 'NR',
+            'studio'              : '20th Century Fox',
             'o_site'              : False,
-            'site'                : 'http://www.dvdempire.com/Exec/v4_item.asp?item_id=1300280',
+            'site'                : 'http://www.dvdempire.com/1402424/meet-the-spartans-unrated-pit-of-death-edition-blu-ray.html',
             'trailer'             : False,
-            'year'                : 2006,
+            'year'                : 2008,
             'notes'               : 'Features:\n\
-Deleted Scenes & Alternate Ending\n\
-Boxing\'s Bloopers\n\
-Skill Vs. Will: The Making of Rocky Balboa\n\
-Reality in the Ring: Filming Rocky\'s Final Fight\n\
-Virtual Champion: Creating the Computer Fight\n\
-Audio Commentary with Sylvester Stallone\n\
+Audio Commentary By Cast And Crew\n\
+Prepare For Thrusting Featurette\n\
+Tour The Set With Ike Barinholtz Featurette\n\
+Gag Reel\n\
+Know Your Spartans Pop Culture Trivia Game\n\
+Celebrity Kickoff Game\n\
+Super Pit-Of-Death Ultimate Tactical Battle Challange Game\n\
+Meet The Spartans: The Music\n\
+Trivial Track\n\
+Theatrical Trailers\n\
 \n\
 Video:\n\
-Widescreen 1.85:1 Color (Anamorphic) \n\
-\n\
-Audio: \n\
-ENGLISH: Dolby Digital 5.1 [CC]\n\
-FRENCH: Dolby Digital 5.1\n\
+ Widescreen 1.85:1 Color \n\
 \n\
-Subtitles:\n\
-English, Spanish, French',
-            'runtime'             : 102,
+Audio:\n\
+ French Dolby Digital Surround \n\
+ Spanish Dolby Digital Surround \n\
+ English DTS-HD MA 5.1',
+            'runtime'             : 87,
             'image'               : True,
-            'rating'              : 9,
-            'screenplay'          : 'Sylvester Stallone',
-            'barcode'             : '043396161900'
+            'rating'              : 5,
+            'screenplay'          : False,
+            'barcode'             : '024543522614'
         },
     }
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieDVDPalace.py trunk/lib/plugins/movie/PluginMovieDVDPalace.py
--- griffith-0.13/lib/plugins/movie/PluginMovieDVDPalace.py	2010-03-18 15:19:24.000000000 +0200
+++ trunk/lib/plugins/movie/PluginMovieDVDPalace.py	2013-07-27 18:37:05.676881075 +0300
@@ -1,8 +1,8 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: PluginMovieDVDPalace.py 1409 2010-03-12 21:22:28Z mikej06 $'
+__revision__ = '$Id: PluginMovieDVDPalace.py 1626 2012-07-03 20:45:58Z mikej06 $'
 
-# Copyright (c) 2006-2009
+# Copyright (c) 2006-2012
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -32,14 +32,14 @@
 plugin_language     = _("German")
 plugin_author       = "Michael Jahn"
 plugin_author_email = "<mikej06@hotmail.com>"
-plugin_version      = "1.2"
+plugin_version      = "1.3"
 
 class Plugin(movie.Movie):
 
     def __init__(self, id):
         self.encode   = 'iso-8859-1'
         self.movie_id = id
-        self.url      = 'http://www.dvd-palace.de/dvd-datenbank/' + self.movie_id
+        self.url      = 'http://www.dvd-palace.de/datenbank/medien/' + self.movie_id
 
     def get_image(self):
         self.image_url = gutils.trim(self.page, 'src="/showcover.php?', '"')
@@ -85,7 +85,9 @@
         self.classification = string.replace(gutils.trim(self.page, 'Altersfreigabe (FSK)', '</TR>'), '&nbsp;', '')
 
     def get_studio(self):
-        self.studio = string.replace(string.replace(gutils.trim(self.page, 'Label', '</td>'), '&nbsp;', ''), ':', '')
+        self.studio = string.replace(string.replace(gutils.trim(self.page, 'Label</b>', '</td>'), '&nbsp;', ''), ':', '')
+        if not self.studio:
+            self.studio = string.replace(string.replace(gutils.trim(self.page, 'Vertrieb</b>', '</td>'), '&nbsp;', ''), ':', '')
 
     def get_o_site(self):
         self.o_site = ""
@@ -132,14 +134,34 @@
         if (tmp_notes != ""):
             self.notes = self.notes + "Untertitel:" + tmp_notes + "\n\n"
 
+    def get_barcode(self):
+        self.barcode = gutils.trim(self.page, 'EAN', '</b>')
+
+
 class SearchPlugin(movie.SearchMovie):
 
+    translations = (
+        ('ü', 'ue'),
+        ('ä', 'ae'),
+        ('ö', 'oe'),
+        ('Ü', 'UE'),
+        ('Ä', 'AE'),
+        ('Ö', 'OE'),
+        ('ß', 'ss')
+    )
+
     def __init__(self):
         self.original_url_search   = "http://www.dvd-palace.de/dvddatabase/dbsearch.php?action=1&suchbegriff="
         self.translated_url_search = "http://www.dvd-palace.de/dvddatabase/dbsearch.php?action=1&suchbegriff="
         self.encode='iso-8859-1'
+        self.remove_accents = False
 
     def search(self,parent_window):
+        # replace some standard german umlauts
+        for from_str, to_str in self.translations:
+            self.title = self.title.replace(from_str, to_str)
+        # AFTER that remove accents
+        self.title = gutils.remove_accents(str(self.title))
         if not self.open_search(parent_window):
             return None
         tmp_pagemovie = self.page
@@ -161,16 +183,17 @@
         return self.page
 
     def get_searches(self):
-        elements = re.split('&nbsp;<a title="[^"]+" href="(/dvd-datenbank/|/datenbank/blu-ray/)', self.page)
+        elements = re.split('&nbsp;<a title="[^"]+" href="(/datenbank/medien/dvd/|/datenbank/medien/blu-ray/)', self.page)
         elements[0] = None
         for index in range(1, len(elements), 2):
             element = elements[index + 1]
-            if elements[index] == '/datenbank/blu-ray/':
-                medium = 'Blu-Ray'
-            else:
-                medium = 'DVD'
             if element <> None:
-                self.ids.append(gutils.before(element,'"'))
+                if elements[index] == '/datenbank/medien/blu-ray/':
+                    medium = 'Blu-Ray'
+                    self.ids.append('blu-ray/' + gutils.before(element,'"'))
+                else:
+                    medium = 'DVD'
+                    self.ids.append('dvd/' + gutils.before(element,'"'))
                 self.titles.append(
                     gutils.trim(element, '>', '</a>') +
                     gutils.clean(
Only in trunk/lib/plugins/movie: PluginMovieDVDpt.py
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieE-Pipoca.py trunk/lib/plugins/movie/PluginMovieE-Pipoca.py
--- griffith-0.13/lib/plugins/movie/PluginMovieE-Pipoca.py	2011-05-18 20:11:58.000000000 +0300
+++ trunk/lib/plugins/movie/PluginMovieE-Pipoca.py	2013-07-27 18:37:05.673547595 +0300
@@ -1,6 +1,6 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: PluginMovieE-Pipoca.py 1548 2011-05-18 11:36:17Z mikej06 $'
+__revision__ = '$Id: PluginMovieE-Pipoca.py 1633 2012-12-28 23:11:42Z mikej06 $'
 
 # Copyright (c) 2005-2009 Vasco Nunes, Piotr Ożarowski
 #
@@ -242,7 +242,7 @@
 Kevin King Templeton' + _(' as ') + 'Amigo de Robert\n\
 Robert Michael Kelly' + _(' as ') + 'Senhor Tomilson\n\
 Rick Buchborn' + _(' as ') + 'Fã de Rocky\n\
-Nick Baker' + _(' as ') + 'Bartender do pub irlandês\n\
+Nick Baker (1)' + _(' as ') + 'Bartender do pub irlandês\n\
 Don Sherman' + _(' as ') + 'Andy\n\
 Stu Nahan' + _(' as ') + 'Comentarista da luta pelo computador\n\
 Gary Compton' + _(' as ') + 'Segurança\n\
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieFilmAffinity.py trunk/lib/plugins/movie/PluginMovieFilmAffinity.py
--- griffith-0.13/lib/plugins/movie/PluginMovieFilmAffinity.py	2011-12-04 17:59:11.000000000 +0200
+++ trunk/lib/plugins/movie/PluginMovieFilmAffinity.py	2014-01-06 22:10:52.551678262 +0200
@@ -31,7 +31,7 @@
 plugin_language     = _('Spanish')
 plugin_author       = 'Pedro D. S�nchez'
 plugin_author_email = '<pedrodav@gmail.com>'
-plugin_version      = '0.6'
+plugin_version      = '0.7'
 
 class Plugin(movie.Movie):
     def __init__(self, id):
@@ -51,43 +51,41 @@
             self.image_url = 'http://' + gutils.before(self.page[tmp.start():], '"')
 
     def get_o_title(self):
-        self.o_title = gutils.trim(self.page, u'<th>T&Iacute;TULO ORIGINAL</th>', '</strong></td>')
-        self.o_title = gutils.after(self.o_title, '<strong>')
+        self.o_title = gutils.trim(self.page, u'<dt>T&iacute;tulo original</dt>', '</dd>')
         self.o_title = re.sub('[ ]+', ' ', self.o_title)
         self.o_title = re.sub('([(]Serie de TV[)]|[(]TV[)]|[(]TV Series[)])', '', self.o_title)
 
     def get_title(self):
-        self.title = gutils.trim(self.page, 'www.filmaffinity.com/images/movie.gif" border="0"> ', '</span>')
+        self.title = gutils.after(gutils.trim(self.page, 'id="main-title"', '</a>'), '>')
         self.title = re.sub('[ ]+', ' ', self.title)
         self.title = re.sub('([(]Serie de TV[)]|[(]TV[)]|[(]TV Series[)])', '', self.title)
 
     def get_director(self):
-        self.director = gutils.trim(self.page,'<th>DIRECTOR</th>', '</td>')
+        self.director = gutils.trim(self.page,'<dt>Director</dt>', '</dd>')
 
     def get_plot(self):
-        self.plot = gutils.trim(self.page, '<th>SINOPSIS</th>', '</td>')
+        self.plot = gutils.trim(self.page, '<dt>Sinopsis</dt>', '</dd>')
         self.plot = string.replace(self.plot, ' (FILMAFFINITY)', '')
         self.plot = string.replace(self.plot, '(FILMAFFINITY)', '')
 
     def get_year(self):
-        self.year = gutils.trim(self.page, '<th>A&Ntilde;O</th>', '</td>')
+        self.year = gutils.trim(self.page, '<dt>A&ntilde;o</dt>', '</dd>')
         self.year = gutils.clean(self.year)
 
     def get_runtime(self):
-        self.runtime = gutils.trim(self.page, '<th>DURACI&Oacute;N</th>', ' min.')
-        self.runtime = gutils.after(self.runtime[-10:], '<td>')
+        self.runtime = gutils.trim(self.page, '<dt>Duraci&oacute;n</dt>', 'min.')
+        self.runtime = gutils.clean(self.runtime)
 
     def get_genre(self):
         self.genre = ''
-        tmp = gutils.trim(self.page, '<th>G&Eacute;NERO</th>', '</tr>')
-        tmp = gutils.after(tmp, '<td>')
+        tmp = gutils.trim(self.page, '<dt>G&eacute;nero</dt>', '</dd>')
         if tmp:
             self.genre = gutils.clean(string.replace(tmp, ' | ', '. '))
             self.genre = re.sub('[.][ \t]+', '. ', self.genre)
 
     def get_cast(self):
         self.cast = ''
-        self.cast = gutils.trim(self.page, '<th>REPARTO</th>', '</td>')
+        self.cast = gutils.trim(self.page, '<dt>Reparto</dt>', '</dd>')
         self.cast = re.sub('</a>,[ ]*', '\n', self.cast)
         self.cast = string.strip(gutils.strip_tags(self.cast))
         self.cast = re.sub('[ ]+', ' ', self.cast)
@@ -97,11 +95,10 @@
         self.classification = ''
 
     def get_studio(self):
-        self.studio = gutils.trim(self.page, '<th>PRODUCTORA</th>', '</td>')
-        self.studio = gutils.after(self.studio, '<td>')
+        self.studio = gutils.trim(self.page, '<dt>Productora</dt>', '</dd>')
 
     def get_o_site(self):
-        self.o_site = gutils.trim(self.page, '<th>WEB OFICIAL</th>', '</a>')
+        self.o_site = gutils.trim(self.page, '<dt>Web Oficial</dt>', '</a>')
         self.o_site = gutils.after(self.o_site, '">')
 
     def get_site(self):
@@ -111,23 +108,19 @@
         self.trailer = ''
 
     def get_country(self):
-        self.country = gutils.trim(self.page, '<b>PA&Iacute;S</th>', '</td>')
-        tmp = gutils.trim(self.country, 'alt="', '"')
-        if tmp == '':
-            self.country = gutils.trim(self.country, 'title="', '"')
-        else:
-            self.country = tmp
+        self.country = gutils.trim(self.page, '<dt>Pa&iacute;s</dt>', '</dd>')
 
     def get_rating(self):
-        self.rating = gutils.trim(self.page, '<div style="margin: 4px 0; color:#990000; font-size:22px; font-weight: bold;">', '</div>')
+        self.rating = gutils.after(gutils.trim(self.page, 'id="movie-rat-avg"', '</div>'), '>')
         if self.rating:
             self.rating = str(round(float(gutils.clean(string.replace(self.rating, ',', '.')))))
 
     def get_cameraman(self):
-        self.cameraman = gutils.trim(self.page, '<th>FOTOGRAF&Iacute;A</th>','</td>')
+        self.cameraman = gutils.trim(self.page, '<dt>Fotograf&iacute;a</dt>','</dd>')
 
     def get_screenplay(self):
-        self.screenplay = gutils.trim(self.page, '<th>GUI&Oacute;N</th>', '</td>')
+        self.screenplay = gutils.trim(self.page, '<dt>Gui&oacute;n</dt>', '</dd>')
+
 
 class SearchPlugin(movie.SearchMovie):
 
@@ -143,17 +136,17 @@
         self.sub_search(parent_window)
         if self.page <> '':
             return self.page
-        auxPage = gutils.trim(auxPage, u'<b>TU CR�TICA</b></div>', '</a>')
-        self.page = gutils.trim(auxPage, 'movie_id=', '">')
+        auxPage = gutils.trim(auxPage, 'id="main-title"', '</a>')
+        self.page = gutils.trim(auxPage, 'es/film', '.html')
         return self.page
 
     def sub_search(self, parent_window):
-        moviepage = gutils.trim(self.page, u'Resultados por t�tulo</span>', '<div id="bpanel">')
+        moviepage = gutils.trim(self.page, u'Resultados por t�tulo</h1>', '<div id="bpanel">')
         nextpage = self.get_nextpage_url()
         while nextpage:
             self.url = nextpage
             self.open_search(parent_window)
-            moviepage = moviepage + gutils.trim(self.page, u'Resultados por t�tulo</span>', '<div id="bpanel">')
+            moviepage = moviepage + gutils.trim(self.page, u'Resultados por t�tulo</h1>', '<div id="bpanel">')
             nextpage = self.get_nextpage_url()
         self.page = moviepage
 
@@ -173,18 +166,13 @@
             self.ids.append(self.page)
             self.titles.append(self.url)
         else:            # multiple matches
-            elements = string.split(self.page, '</a></b>')
-
-            if (elements[0]<>''):
-                for index in range(0, len(elements) - 1, 1):
-                    element = elements[index]
-                    nextelement = elements[index + 1]
-                    id = gutils.trim(element, '<b><a href="/es/film', '.html')
-                    if id:
-                        self.ids.append(id)
-                        title = gutils.clean(gutils.after(element, '<b><a href="/es/film')).replace("\n", "")
-                        title = gutils.strip_tags(gutils.convert_entities(gutils.after(title, '>'))) + ' ' + string.strip(gutils.before(nextelement, '<'))
-                        self.titles.append(title)
+            elements = string.split(self.page, 'class="mc-title"')
+            for element in elements[1:]:
+                id = gutils.trim(element, 'href="/es/film', '.html')
+                title = gutils.clean(gutils.trim(element, '>', '</div>'))
+                if id:
+                    self.ids.append(id)
+                    self.titles.append(title)
 
 #
 # Plugin Test
@@ -195,8 +183,8 @@
     # dict { movie_id -> [ expected result count for original url, expected result count for translated url ] }
     #
     test_configuration = {
-        'Rocky' : [ 17, 17 ],
-        'Darkness' : [59, 59 ]
+        'Rocky' : [ 18, 18 ],
+        'Darkness' : [74, 74 ]
     }
 
 class PluginTest:
@@ -220,7 +208,6 @@
 Milo Ventimiglia\n\
 Tony Burton\n\
 James Francis Kelly III\n\
-Talia Shire\n\
 Angela Boyd\n\
 A.J. Benza\n\
 Mike Tyson',
Only in griffith-0.13/lib/plugins/movie: PluginMovieFilmDb.py
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieFilmeVonAZ.py trunk/lib/plugins/movie/PluginMovieFilmeVonAZ.py
--- griffith-0.13/lib/plugins/movie/PluginMovieFilmeVonAZ.py	2010-07-18 22:23:16.000000000 +0300
+++ trunk/lib/plugins/movie/PluginMovieFilmeVonAZ.py	2014-01-06 22:10:52.551678262 +0200
@@ -1,8 +1,8 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: PluginMovieFilmeVonAZ.py 1437 2010-07-18 11:37:02Z mikej06 $'
+__revision__ = '$Id: PluginMovieFilmeVonAZ.py 1651 2013-09-27 19:48:00Z mikej06 $'
 
-# Copyright (c) 2006-2010 Michael Jahn
+# Copyright (c) 2006-2013 Michael Jahn
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -32,7 +32,7 @@
 plugin_language = _("German")
 plugin_author = "Michael Jahn"
 plugin_author_email = "<mikej06@hotmail.com>"
-plugin_version = "1.4"
+plugin_version = "1.6"
 
 class Plugin(movie.Movie):
     def __init__(self, id):
@@ -40,64 +40,50 @@
         self.movie_id = id
         self.url = 'http://www.zweitausendeins.de/filmlexikon/?sucheNach=titel&wert=' + str(self.movie_id)
 
-    def initialize(self):
-        url = 'http://www.zweitausendeins.de/getimage/?imageNo=0&movieNo=' + str(self.movie_id)
-        self.imagelinks = self.open_page(self.parent_window, url=url)
-
     def get_image(self):
-        if string.find(self.imagelinks, '|') > 0:
-            self.image_url = gutils.before(self.imagelinks, '|')
+        self.image_url = ''
+        url = url = gutils.trim(gutils.trim(self.page, 'class="film-image"', '>'), 'http://', ')')
+        if url:
+            self.image_url = 'http://' + url
 
     def get_o_title(self):
-        self.o_title = gutils.clean(gutils.after(
-            gutils.regextrim(self.page, 'class="text_ergebniss_faz_3"', '[ \t]+[(]Originaltitel[)]'), '</a>'))
-        p1 = string.rfind(self.o_title, ',')
-        if p1 > 0:
-            self.o_title = self.o_title[p1 + 1:]
-        self.o_title = string.capwords(self.o_title)
-        if self.o_title == '':
-            self.o_title = gutils.after(gutils.trim(self.page, 'class="text_ergebniss_faz_3"', '</a>'), '>')
+        self.o_title = string.capwords(gutils.clean(gutils.regextrim(self.page, '<b>Originaltitel:', '(</p>|<b>)')))
+        if not self.o_title:
+            self.o_title = gutils.after(gutils.trim(self.page, 'class=\'film-titel\'', '</h1>'), '>')
 
     def get_title(self):
-        self.title = gutils.after(gutils.trim(self.page, 'class="text_ergebniss_faz_3"', '</a>'), '>')
+        self.title = gutils.after(gutils.trim(self.page, 'class=\'film-titel\'', '</h1>'), '>')
 
     def get_director(self):
-        self.director = gutils.after(gutils.trim(self.page, '(Regie)', '</span>'), '>')
-        self.director = re.sub(',[ ]*$', '', self.director)
+        self.director = gutils.trim(self.page, '<b>Regie:', '</p>')
 
     def get_plot(self):
-        self.plot = gutils.after(gutils.trim(self.page, 'Inhalt des Films:', '</td>'), '</div>')
+        self.plot = gutils.after(gutils.trim(self.page, 'class=\'film-text\'', '</p>'), '>')
 
     def get_year(self):
-        self.year = gutils.after(gutils.trim(self.page, 'sucheNach=produktionsjahr', '</a>'), '>')
+        self.year = gutils.after(gutils.trim(self.page, '<b>Produktionsjahr:', '<br/>'), '>')
 
     def get_runtime(self):
-        self.runtime = gutils.trim(self.page, 'L&auml;nge: ', ' Minuten')
+        self.runtime = gutils.trim(self.page, '<b>Länge:', '<br/>')
 
     def get_genre(self):
-        elements = string.split(self.page, 'sucheNach=genre')
-        if (elements[0]<>''):
-            elements[0] = ''
-            self.delimiter = ''
+        self.genre = gutils.after(gutils.trim(self.page, 'class=\'film-angaben\'', '</p>'), '>')
+        if ':' in self.genre:
             self.genre = ''
-            for element in elements:
-                if (element <> ''):
-                    self.genre += self.delimiter + gutils.trim(element, '>', '</a>')
-                    self.delimiter = ", "
 
     def get_cast(self):
-        self.cast = gutils.regextrim(self.page, '[(]Darsteller[)]', '(</td>|<br><span[^>]+>)')
+        self.cast = gutils.trim(self.page, '<b>Darsteller:', '</p>')
         self.cast = gutils.clean(self.cast)
-        self.cast = self.cast.replace(' als ', _(' as '))
-        self.cast = re.sub('( \t|\t|\r|\n)', '', self.cast)
-        self.cast = self.cast.replace(',', '\n')
+        self.cast = self.cast.replace(' (', _(' as '))
+        self.cast = self.cast.replace('), ', '\n')
+        self.cast = self.cast.replace(')', '')
 
     def get_classification(self):
-        self.classification = gutils.regextrim(self.page, 'FSK:[ ]+', '[,;]')
+        self.classification = gutils.regextrim(self.page, '<b>FSK:[ ]*', '(<br/>|[,;])')
 
     def get_studio(self):
-        self.studio = gutils.after(gutils.trim(self.page, 'sucheNach=produktionsfirma', '</span>'), '>')
-        self.studio = string.replace(self.studio, '/', ',')
+        self.studio = gutils.after(gutils.trim(self.page, '<b>Produktionsfirma:', '<br/>'), '>')
+        self.studio = string.replace(self.studio, '/', ', ')
         self.studio = re.sub(',[ ]*$', '', self.studio)
 
     def get_o_site(self):
@@ -110,64 +96,64 @@
         self.trailer = ''
 
     def get_country(self):
-        self.country = gutils.after(gutils.trim(self.page, 'sucheNach=produktionsland', '</span>'), '>')
+        self.country = gutils.after(gutils.trim(self.page, '<b>Produktionsland:', '<br/>'), '>')
         self.country = re.sub(',[ ]*$', '', self.country)
-        self.country = string.replace(self.country, '/', ',')
+        self.country = string.replace(self.country, '/', ', ')
 
     def get_rating(self):
         self.rating = 0
 
     def get_screenplay(self):
-        self.screenplay = gutils.trim(self.page, '(Drehbuch)', '</span>')
+        self.screenplay = gutils.trim(self.page, '<b>Drehbuch:', '</p>')
         self.screenplay = re.sub(',[ ]*$', '', self.screenplay)
 
     def get_cameraman(self):
-        self.cameraman = gutils.trim(self.page, '(Kamera)', '</span>')
+        self.cameraman = gutils.trim(self.page, '<b>Kamera:', '</p>')
         self.cameraman = re.sub(',[ ]*$', '', self.cameraman)
 
 class SearchPlugin(movie.SearchMovie):
     def __init__(self):
-        self.original_url_search = "http://www.zweitausendeins.de/filmlexikon/?sucheNach=Titel&wert="
-        self.translated_url_search = "http://www.zweitausendeins.de/filmlexikon/?sucheNach=Titel&wert="
+        self.original_url_search = "http://www.zweitausendeins.de/filmlexikon/"
+        self.translated_url_search = "http://www.zweitausendeins.de/filmlexikon/"
         self.encode = 'utf-8'
+        self.useurllib2 = True
+        self.usepostrequest = True
 
     def search(self,parent_window):
         if not self.open_search(parent_window):
             return None
         # used for looking for subpages
-        tmp_page = gutils.trim(self.page, '<span class="trefferliste">', '</span>')
+        tmp_page = gutils.trim(self.page, '<li>Treffer', '</div>')
         elements = string.split(tmp_page, 'cp=')
         # first results
-        tmp_page = gutils.after(gutils.trim(self.page, 'Alle Treffer aus der Kategorie', '<span class="trefferliste">'), "Titel:")
+        tmp_page = gutils.trim(self.page, '<ul class=\'film-liste\'>', '</ul>')
         # look for subpages
         for element in elements:
-            element = gutils.before(element, '"')
+            element = gutils.before(element, '\'')
             try:
                 tmp_element = int(element)
             except:
                 tmp_element = 1
             if tmp_element != 1:
-                self.url = 'http://www.zweitausendeins.de/filmlexikon/?sucheNach=Titel&cp=' + str(tmp_element) + "&wert="
+                self.url = 'http://www.zweitausendeins.de/filmlexikon/?sucheNach=filmtitel&cp=' + str(tmp_element) + "&wert="
                 if self.open_search(parent_window):
-                    tmp_page2 = gutils.trim(self.page, 'Alle Treffer aus der Kategorie', '<span class="trefferliste">')
+                    tmp_page2 = gutils.trim(self.page, '<ul class=\'film-liste\'>', '</ul>')
                     tmp_page = tmp_page + tmp_page2
         self.page = tmp_page
 
         return self.page
 
     def get_searches(self):
-        elements = string.split(self.page, '<div class="text_ergebniss_faz_3"')
+        elements = string.split(self.page, '<h2 class=\'film-titel\'>')
         i = 1
         while i < len(elements):
             element = elements[i]
             i = i + 1
-            self.ids.append(gutils.trim(element, 'filmlexikon/?wert=', '&'))
-            self.titles.append(string.strip(gutils.clean(
-                        gutils.trim(element, '>', '</a>') + ' (' +
-                        string.capwords(gutils.trim(element, '</a>', '(Originaltitel)')) + ', ' +
-                        gutils.after(gutils.trim(element, 'sucheNach=produktionsland', '</a>'), '>') + ', ' +
-                        gutils.after(gutils.trim(element, 'sucheNach=produktionsjahr', '</a>'), '>') +
-                        ')')))
+            self.ids.append(gutils.trim(element, 'wert=', '\''))
+            self.titles.append(gutils.trim(element, '>', '</a>'))
+
+    def get_postdata(self):
+        return {'sucheNach' : 'filmtitel', 'wert' : self.title }
 
 #
 # Plugin Test
@@ -178,9 +164,9 @@
     # dict { movie_id -> [ expected result count for original url, expected result count for translated url ] }
     #
     test_configuration = {
-        'Rocky'                : [ 15, 15 ],
+        'Rocky'                : [ 17, 17 ],
         'Arahan'               : [ 1, 1 ],
-        'Ein glückliches Jahr' : [ 0, 0 ]
+        'Ein glückliches Jahr' : [ 1, 1 ]
     }
 
 class PluginTest:
@@ -197,13 +183,13 @@
             'o_title'           : 'Rocky Balboa',
             'director'          : 'Sylvester Stallone',
             'plot'              : True,
-            'cast'              : 'A.J. Benza' + _(' as ') + 'L.C.\n\
-Milo Ventimiglia' + _(' as ') + 'Rocky jr.\n\
+            'cast'              : 'Sylvester Stallone' + _(' as ') + 'Rocky Balboa\n\
+Burt Young' + _(' as ') + 'Paulie\n\
 Antonio Tarver' + _(' as ') + 'Mason \'The Line\' Dixon\n\
 Geraldine Hughes' + _(' as ') + 'Marie\n\
-Sylvester Stallone' + _(' as ') + 'Rocky Balboa\n\
-Burt Young' + _(' as ') + 'Paulie\n\
-Tony Burton' + _(' as ') + 'Duke',
+Milo Ventimiglia' + _(' as ') + 'Rocky jr.\n\
+Tony Burton' + _(' as ') + 'Duke\n\
+A.J. Benza' + _(' as ') + 'L.C.',
             'country'           : 'USA',
             'genre'             : 'Boxerfilm',
             'classification'    : 'ab 12',
@@ -217,25 +203,25 @@
             'image'             : True,
             'rating'            : False,
             'screenplay'        : 'Sylvester Stallone',
-            'cameraman'         : 'J. Clark Mathis',
+            'cameraman'         : 'Clark Mathis',
         },
         '26956' : { 
             'title'             : 'Bürgschaft für ein Jahr',
             'o_title'           : 'Bürgschaft für ein Jahr',
             'director'          : 'Herrmann Zschoche',
             'plot'              : True,
-            'cast'              : 'Heide Kipp' + _(' as ') + 'Frau Braun\n\
-Jan Spitzer' + _(' as ') + 'Werner Horn\n\
+            'cast'              : 'Katrin Saß' + _(' as ') + 'Nina\n\
 Monika Lennartz' + _(' as ') + 'Irmgard Behrend\n\
-Katrin Saß' + _(' as ') + 'Nina\n\
-Ursula Werner' + _(' as ') + 'Frau Müller\n\
-Christian Steyer' + _(' as ') + 'Heiner Menk\n\
 Jaecki Schwarz' + _(' as ') + 'Peter Müller\n\
-Barbara Dittus' + _(' as ') + 'Heimleiterin',
+Christian Steyer' + _(' as ') + 'Heiner Menk\n\
+Jan Spitzer' + _(' as ') + 'Werner Horn\n\
+Heide Kipp' + _(' as ') + 'Frau Braun\n\
+Barbara Dittus' + _(' as ') + 'Heimleiterin\n\
+Ursula Werner' + _(' as ') + 'Frau Müller',
             'country'           : 'DDR',
             'genre'             : 'Arbeiterfilm, Frauenfilm, Literaturverfilmung',
             'classification'    : 'ab 6',
-            'studio'            : 'DEFA, Gruppe "Berlin"',
+            'studio'            : 'DEFA, Gruppe Berlin""',
             'o_site'            : False,
             'site'              : 'http://www.zweitausendeins.de/filmlexikon/?sucheNach=titel&wert=26956',
             'trailer'           : False,
@@ -254,9 +240,9 @@
             'plot'              : True,
             'cast'              : 'Ryu Seung-beom' + _(' as ') + 'Sang-hwan\n\
 Yoon So-yi' + _(' as ') + 'Wi-jin\n\
-Yun Ju-sang' + _(' as ') + 'Mu-woon\n\
 Ahn Sung-kee' + _(' as ') + 'Ja-woon\n\
-Jung Doo-hong' + _(' as ') + 'Heukwoon',
+Jung Doo-hong' + _(' as ') + 'Heukwoon\n\
+Yun Ju-sang' + _(' as ') + 'Mu-woon',
             'country'           : 'Südkorea',
             'genre'             : False,
             'classification'    : 'ab 16',
@@ -269,7 +255,7 @@
             'runtime'           : 108,
             'image'             : False,
             'rating'            : False,
-            'screenplay'        : 'Ryoo Seung-wan',
+            'screenplay'        : 'Eun Ji-hie, Ryoo Seung-wan, Yu Seon-dong',
             'cameraman'         : 'Lee Jun-gyu',
         }
     }
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieFilmtipset.py trunk/lib/plugins/movie/PluginMovieFilmtipset.py
--- griffith-0.13/lib/plugins/movie/PluginMovieFilmtipset.py	2011-05-18 20:11:58.000000000 +0300
+++ trunk/lib/plugins/movie/PluginMovieFilmtipset.py	2013-07-27 18:37:05.673547595 +0300
@@ -70,7 +70,7 @@
     def get_genre(self):
         self.genre = string.strip(gutils.trim(self.page, 'Nyckelord:', '</tr>'))
         if self.genre == '':
-            self.genre = string.strip(gutils.trim(self.page, 'Genre:', '</tr>'))
+            self.genre = string.strip(gutils.trim(self.page, 'Genre:</h2>', '</tr>'))
 
     def get_cast(self):
         self.cast = gutils.regextrim(self.page, 'Sk&aring;despelare[^:]*[:]', '</tr>')
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieFilmweb.py trunk/lib/plugins/movie/PluginMovieFilmweb.py
--- griffith-0.13/lib/plugins/movie/PluginMovieFilmweb.py	2011-12-18 21:11:57.000000000 +0200
+++ trunk/lib/plugins/movie/PluginMovieFilmweb.py	2013-07-27 18:37:05.670214115 +0300
@@ -1,8 +1,8 @@
 ﻿# -*- coding: utf-8 -*-
 
-__revision__ = '$Id: PluginMovieFilmweb.py 1602 2011-12-18 19:11:55Z piotrek $'
+__revision__ = '$Id: PluginMovieFilmweb.py 1615 2012-01-10 20:58:15Z piotrek $'
 
-# Copyright (c) 2005-2011 Piotr Ożarowski
+# Copyright (c) 2005-2012 Piotr Ożarowski
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -27,12 +27,12 @@
 plugin_name = 'Filmweb'
 plugin_description = 'Web pełen filmów'
 plugin_url = 'filmweb.pl'
-plugin_url_other = 'm.filmweb.pl'
+plugin_url_other = 'filmweb.pl'
 plugin_server = '193.200.227.13'
 plugin_language = _('Polish')
 plugin_author = 'Piotr Ożarowski, Bartosz Kurczewski, Mariusz Szczepanek'
 plugin_author_email = '<mariusz2806@gmail.com>'
-plugin_version = '1.28'
+plugin_version = '1.29'
 
 
 class Plugin(movie.Movie):
@@ -50,11 +50,14 @@
 
     def get_o_title(self):
         self.url = self.url.replace(plugin_server, plugin_url)
-        self.o_title = gutils.trim(self.page, '<title>', '</title>')
-        if self.o_title.find('/') > -1:
-            self.o_title = gutils.trim(self.o_title, '/', '(')
-        if self.o_title.find('(') > -1:
-            self.o_title = gutils.before(self.o_title, '(')
+        self.o_title = gutils.trim(self.page, '<h2 class=origTitle>', '</h2>')
+        self.o_title = gutils.after(self.o_title, '</span>')
+        if self.o_title == '':
+            self.o_title = gutils.trim(self.page, '<title>', '</title>')
+            if self.o_title.find('(') > -1:
+                self.o_title = gutils.before(self.o_title, '(')
+            if self.o_title.find('/') > -1:
+                self.o_title = gutils.before(self.o_title, '/')
 
     def get_title(self):
         self.url = self.url.replace(plugin_server, plugin_url)
@@ -68,20 +71,12 @@
         self.director = gutils.trim(self.page, "reżyseria:", '</tr>')
         self.director = gutils.after(self.director, '</th>')
         self.director = self.director.replace("(więcej...)", '')
-        self.director = self.director.replace('  ', '\t')
-        self.director = self.director.replace("\t ", '')
-        self.director = self.director.replace("\t", '')
-        self.director = self.director.replace(',', ', ')
         self.director = gutils.strip_tags(self.director)
 
     def get_screenplay(self):
         self.screenplay = gutils.trim(self.page, "scenariusz:", '</tr>')
         self.screenplay = gutils.after(self.screenplay, '</th>')
         self.screenplay = self.screenplay.replace("(więcej...)", '')
-        self.screenplay = self.screenplay.replace('  ', '\t')
-        self.screenplay = self.screenplay.replace("\t ", '')
-        self.screenplay = self.screenplay.replace("\t", '')
-        self.screenplay = self.screenplay.replace(',', ', ')
         self.screenplay = gutils.strip_tags(self.screenplay)
 
     def get_plot(self):
@@ -114,26 +109,16 @@
 
     def get_genre(self):
         self.genre = gutils.trim(self.page, "gatunek:", '</tr>')
-        self.genre = self.genre.replace("\t", '')
-        self.genre = self.genre.replace("\n", '')
-        self.genre = self.genre.replace('  ', '')
-        self.genre = self.genre.replace(',', ', ')
 
     def get_cast(self):
         self.cast = gutils.trim(self.page, '<div class="castListWrapper cl">', '<div class="additional-info comBox">')
-        url = gutils.after(self.cast, '</ul>')
-        url = gutils.trim(url, 'href="', '"')
         self.cast = gutils.before(self.cast, '</ul>')
-        self.cast = self.cast.replace(chr(13), '')
-        self.cast = self.cast.replace(chr(10), '')
-        self.cast = self.cast.replace("  ", '\t')
-        self.cast = self.cast.replace("\t ", '')
-        self.cast = self.cast.replace('\t', '')
-        self.cast = self.cast.replace(" (", '(')
-        self.cast = self.cast.replace('(', " (")
+        self.cast = self.cast.replace('</span> ', '')
         self.cast = self.cast.replace('<div>', _(" as "))
         self.cast = self.cast.replace('</li>', "\n")
-        self.cast = self.cast.replace('</span> ', '')
+        self.cast = gutils.strip_tags(self.cast)
+        self.cast = self.cast.replace('   ', '')
+        self.cast = self.cast.replace('  ', ' ')
 
     def get_classification(self):
         self.classification = ''
@@ -151,11 +136,7 @@
         self.trailer = ''
 
     def get_country(self):
-        self.country = gutils.trim(self.page, '<dt>kraj', '</dd>')
-        self.country = self.country.replace('  ', '')
-        self.country = self.country.replace("e:", '')
-        self.country = self.country.replace(":", '')
-        self.country = self.country.replace("\t", '')
+        self.country = gutils.trim(self.page, 'produkcja:', '</tr>')
 
     def get_rating(self):
         self.rating = gutils.trim(self.page, '<div class=rates>', '</div>')
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieHKMDB.py trunk/lib/plugins/movie/PluginMovieHKMDB.py
--- griffith-0.13/lib/plugins/movie/PluginMovieHKMDB.py	2011-12-19 00:35:27.000000000 +0200
+++ trunk/lib/plugins/movie/PluginMovieHKMDB.py	2013-07-27 18:37:05.686881516 +0300
@@ -1,6 +1,6 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: PluginMovieHKMDB.py 1605 2011-12-18 22:35:25Z piotrek $'
+__revision__ = '$Id: PluginMovieHKMDB.py 1633 2012-12-28 23:11:42Z mikej06 $'
 
 # Copyright (c) 2010 Michael Jahn
 #
@@ -183,25 +183,26 @@
             'director'          : 'Ting Chung (1)',
             'plot'              : False,
             'cast'              : 'John Liu Chung-Liang' + _(' as ') + 'Ma Tien Lang\n\
-Phillip Ko Fei' + _(' as ') + 'Fang Kang and his brother\n\
 Stephen Tung Wai\n\
+Tong Bo-Wan' + _(' as ') + 'Ma\'s wife\n\
 Suen Yuet\n\
-Wong Chi-Sang' + _(' as ') + 'Henchman\n\
+Phillip Ko Fei' + _(' as ') + 'Fang Kang and his brother\n\
 Ga Hoi\n\
-Tong Bo-Wan' + _(' as ') + 'Ma\'s wife\n\
+Wong Kwok-Fai (2)' + _(' as ') + 'Fei Hu\n\
 Peng Kong' + _(' as ') + 'Fei Lung\n\
 Wong Hoi (3)\n\
-Chen Chin-Hai' + _(' as ') + 'extra\n\
-Mau Ging-Shun' + _(' as ') + 'extra\n\
-Wong Kwok-Fai (2)\n\
-Peter Chang\n\
-Cheung Chung-Kwai\n\
-Lui Wan-Biu' + _(' as ') + 'extra\n\
-Hung Ji-Yue\n\
+Wong Chi-Sang' + _(' as ') + 'Henchman\n\
 Ho Szu-Yuan\n\
+Hung Ji-Yue\n\
+San Bao\n\
+Cheung Chung-Kwai (1)\n\
+Peter Chang Chi-Long\n\
 Mark Lung Goon-Mo\n\
-Chan Jan (1)' + _(' as ') + 'extra\n\
-Fan Fung-San' + _(' as ') + 'extra',
+Fan Fung-San' + _(' as ') + '[Extra]\n\
+Chan Jan (1)' + _(' as ') + '[Extra]\n\
+Chen Chin-Hai' + _(' as ') + '[Extra]\n\
+Mau Ging-Shun' + _(' as ') + '[Extra]\n\
+Lui Wan-Biu' + _(' as ') + '[Extra]',
             'country'           : 'Taiwan',
             'genre'             : 'Martial Arts',
             'classification'    : False,
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieIMDB-de.py trunk/lib/plugins/movie/PluginMovieIMDB-de.py
--- griffith-0.13/lib/plugins/movie/PluginMovieIMDB-de.py	2011-08-31 09:40:41.000000000 +0300
+++ trunk/lib/plugins/movie/PluginMovieIMDB-de.py	2013-07-27 18:37:05.673547595 +0300
@@ -1,8 +1,8 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: PluginMovieIMDB-de.py 1577 2011-08-30 21:13:26Z mikej06 $'
+__revision__ = '$Id: PluginMovieIMDB-de.py 1638 2013-01-29 21:36:08Z mikej06 $'
 
-# Copyright (c) 2007-2011 Michael Jahn
+# Copyright (c) 2007-2012 Michael Jahn
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -30,7 +30,7 @@
 plugin_language     = _('German')
 plugin_author       = 'Michael Jahn'
 plugin_author_email = 'mikej06@hotmail.com'
-plugin_version      = '1.8'
+plugin_version      = '1.9'
 
 class Plugin(movie.Movie):
     def __init__(self, id):
@@ -247,42 +247,35 @@
         return data
 
 class SearchPlugin(movie.SearchMovie):
-    PATTERN = re.compile(r"""<a href=['"]/title/tt([0-9]+)/["'](.*?)</tr>""", re.IGNORECASE)
-    PATTERN_POWERSEARCH = re.compile(r"""Here are the [0-9]+ matching titles""")
+    PATTERN = re.compile(r"""<a href=['"]/title/tt([0-9]+)/[^>]+[>](.*?)</td>""")
+    PATTERN_DIRECT = re.compile(r"""value="/title/tt([0-9]+)""")
 
     def __init__(self):
-        self.original_url_search   = 'http://www.imdb.de/find?more=tt&q='
-        self.translated_url_search = 'http://www.imdb.de/find?more=tt&q='
+        self.original_url_search   = 'http://www.imdb.de/find?s=tt&q='
+        self.translated_url_search = 'http://www.imdb.de/find?s=tt&q='
         self.encode                = 'utf8'
         self.remove_accents        = False
 
     def search(self,parent_window):
         if not self.open_search(parent_window):
             return None
-        tmp = gutils.trim(self.page, ' angezeigt)', ' Treffergenauigkeit')
-        if tmp == '':
-            if self.PATTERN_POWERSEARCH.search(self.page) is None:
-                self.page = ''
-        else:
-            self.page = tmp
-        # correction of all &#xxx entities
-        self.page = self.page.decode('iso8859-1')
-        self.page = gutils.convert_entities(self.page)
-        #self.page = self.page.encode(self.encode)
         return self.page
-
+    
     def get_searches(self):
-        elements = string.split(self.page, '<tr>')
-        if len(elements) < 2:
-            elements = string.split(self.page, '<TR>')
-
+        elements = string.split(self.page, '<tr')
         if len(elements):
             for element in elements[1:]:
                 match = self.PATTERN.findall(element)
-                for entry in match:
-                    tmp  = re.sub('^[0-9]+[.]', '', gutils.clean(gutils.after(entry[1], '>')))
-                    self.ids.append(entry[0])
+                if len(match) > 1:
+                    tmp = re.sub('^[0-9]+[.]', '', gutils.clean(match[1][1]))
+                    self.ids.append(match[1][0])
                     self.titles.append(tmp)
+        if len(self.ids) < 2:
+            # try to find a direct result
+            match = self.PATTERN_DIRECT.findall(self.page)
+            if len(match) > 0:
+                self.ids.append(match[0])
+
 
 #
 # Plugin Test
@@ -293,8 +286,8 @@
     # dict { movie_id -> [ expected result count for original url, expected result count for translated url ] }
     #
     test_configuration = {
-        'Rocky Balboa'         : [ 25, 25 ],
-        'Ein glückliches Jahr' : [ 47, 47 ]
+        'Rocky Balboa'         : [ 10, 10 ],
+        'Ein glückliches Jahr' : [ 3, 3 ]
     }
 
 class PluginTest:
@@ -377,6 +370,7 @@
 D.T. Carney' + _(' as ') + 'High Roller (nicht im Abspann)\n\
 Ricky Cavazos' + _(' as ') + 'Boxing Spectator (nicht im Abspann)\n\
 Rennie Cowan' + _(' as ') + 'Boxing Spectator (nicht im Abspann)\n\
+Kevin Deon' + _(' as ') + 'Jeno (nicht im Abspann)\n\
 Deon Derrico' + _(' as ') + 'High Roller at Limo (nicht im Abspann)\n\
 Jacob \'Stitch\' Duran' + _(' as ') + 'Dixon\'s Trainer (nicht im Abspann)\n\
 Simon P. Edwards' + _(' as ') + 'Crowd Member (nicht im Abspann)\n\
@@ -390,6 +384,7 @@
 Dean Mauro' + _(' as ') + 'Sports Journalist (nicht im Abspann) (unbestätigt)\n\
 Burgess Meredith' + _(' as ') + 'Mickey Goldmill (Archivmaterial) (nicht im Abspann)\n\
 Dan Montero' + _(' as ') + 'Boxing Spectator (nicht im Abspann)\n\
+Babs Moran' + _(' as ') + 'Obnoxious Fan (nicht im Abspann)\n\
 Keith Moyer' + _(' as ') + 'Bargast (nicht im Abspann)\n\
 Mr. T' + _(' as ') + 'Clubber Lang (Archivmaterial) (nicht im Abspann)\n\
 Carol Anne Mueller' + _(' as ') + 'Restaurant Patron (nicht im Abspann)\n\
@@ -400,8 +395,8 @@
 Ryan Tygh' + _(' as ') + 'Ring Photographer (nicht im Abspann)\n\
 Kimberly Villanova' + _(' as ') + 'Businesswoman (nicht im Abspann)',
             'country'           : 'USA',
-            'genre'             : 'Action | Drama | Romanze | Sport',
-            'classification'    : False,
+            'genre'             : 'Drama | Sport',
+            'classification'    : '12',
             'studio'            : 'Metro-Goldwyn-Mayer (MGM) (presents) (copyright owner), Columbia Pictures (presents) (copyright owner), Revolution Studios (presents) (copyright owner), Rogue Marble',
             'o_site'            : False,
             'site'              : 'http://www.imdb.de/title/tt0479143',
@@ -443,7 +438,7 @@
 Jacques Villedieu\n\
 Harry Walter übrige Besetzung in alphabetischer Reihenfolge:\n\
 Anouk Aimée' + _(' as ') + 'Une femme (Archivmaterial) (nicht im Abspann)\n\
-Elie Chouraqui' + _(' as ') + ' (nicht im Abspann)\n\
+Élie Chouraqui' + _(' as ') + ' (nicht im Abspann)\n\
 Rémy Julienne' + _(' as ') + 'Chauffeur de taxi (nicht im Abspann)\n\
 Jean-Louis Trintignant' + _(' as ') + 'Un homme (Archivmaterial) (nicht im Abspann)',
             'country'            : 'Frankreich | Italien',
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieIMDB-es.py trunk/lib/plugins/movie/PluginMovieIMDB-es.py
--- griffith-0.13/lib/plugins/movie/PluginMovieIMDB-es.py	2011-08-31 09:40:41.000000000 +0300
+++ trunk/lib/plugins/movie/PluginMovieIMDB-es.py	2013-07-27 18:37:05.673547595 +0300
@@ -32,7 +32,7 @@
 plugin_language     = _('Spanish')
 plugin_author       = 'Pedro D. S�nchez'
 plugin_author_email = '<pedrodav@gmail.com>'
-plugin_version      = '0.3'
+plugin_version      = '0.4'
 
 class Plugin(movie.Movie):
     def __init__(self, id):
@@ -207,37 +207,34 @@
         return data
 
 class SearchPlugin(movie.SearchMovie):
-    PATTERN = re.compile(r"""<a href=['"]/title/tt([0-9]+)/["'](.*?)</tr>""", re.IGNORECASE)
+    PATTERN = re.compile(r"""<a href=['"]/title/tt([0-9]+)/[^>]+[>](.*?)</td>""")
+    PATTERN_DIRECT = re.compile(r"""value="/title/tt([0-9]+)""")
 
     def __init__(self):
-        self.original_url_search = 'http://www.imdb.es/find?more=tt;q='
-        self.translated_url_search = 'http://www.imdb.es/find?more=tt;q='
-        self.encode = 'iso-8859-15'
+        self.original_url_search = 'http://www.imdb.es/find?s=tt&q='
+        self.translated_url_search = 'http://www.imdb.es/find?s=tt&q='
+        self.encode = 'utf8'
 
     def search(self,parent_window):
         if not self.open_search(parent_window):
             return None
-        self.sub_search()
         return self.page
 
-    def sub_search(self):
-        self.page = gutils.regextrim(self.page, ' resultado[s]*[)]', 'Sugerencias Para Mejorar Sus Resultados');
-        self.page = self.page.decode('iso-8859-15')
-        # correction of all &#xxx entities
-        self.page = gutils.convert_entities(self.page)
-
     def get_searches(self):
-        elements = string.split(self.page, '<tr>')
-        if len(elements) < 2:
-            elements = string.split(self.page, '<TR>')
-
+        elements = string.split(self.page, '<tr')
         if len(elements):
             for element in elements[1:]:
                 match = self.PATTERN.findall(element)
-                for entry in match:
-                    tmp  = re.sub('^[0-9]+[.]', '', gutils.clean(gutils.after(entry[1], '>')))
-                    self.ids.append(entry[0])
+                if len(match) > 1:
+                    tmp = re.sub('^[0-9]+[.]', '', gutils.clean(match[1][1]))
+                    self.ids.append(match[1][0])
                     self.titles.append(tmp)
+        if len(self.ids) < 2:
+            # try to find a direct result
+            match = self.PATTERN_DIRECT.findall(self.page)
+            if len(match) > 0:
+                self.ids.append(match[0])
+
 
 #
 # Plugin Test
@@ -248,7 +245,7 @@
     # dict { movie_id -> [ expected result count for original url, expected result count for translated url ] }
     #
     test_configuration = {
-        'Rocky Balboa'         : [ 25, 25 ]
+        'Rocky Balboa'         : [ 10, 10 ]
     }
 
 class PluginTest:
@@ -331,6 +328,7 @@
 D.T. Carney' + _(' as ') + 'High Roller (sin acreditar)\n\
 Ricky Cavazos' + _(' as ') + 'Boxing Spectator (sin acreditar)\n\
 Rennie Cowan' + _(' as ') + 'Boxing Spectator (sin acreditar)\n\
+Kevin Deon' + _(' as ') + 'Jeno (sin acreditar)\n\
 Deon Derrico' + _(' as ') + 'High Roller at Limo (sin acreditar)\n\
 Jacob \'Stitch\' Duran' + _(' as ') + 'Dixon\'s Trainer (sin acreditar)\n\
 Simon P. Edwards' + _(' as ') + 'Crowd Member (sin acreditar)\n\
@@ -344,6 +342,7 @@
 Dean Mauro' + _(' as ') + 'Sports Journalist (sin acreditar) (sin confirmar)\n\
 Burgess Meredith' + _(' as ') + 'Mickey Goldmill (tomas de archivo) (sin acreditar)\n\
 Dan Montero' + _(' as ') + 'Boxing Spectator (sin acreditar)\n\
+Babs Moran' + _(' as ') + 'Obnoxious Fan (sin acreditar)\n\
 Keith Moyer' + _(' as ') + 'Administrador del Bar (sin acreditar)\n\
 Mr. T' + _(' as ') + 'Clubber Lang (tomas de archivo) (sin acreditar)\n\
 Carol Anne Mueller' + _(' as ') + 'Restaurant Patron (sin acreditar)\n\
@@ -354,8 +353,8 @@
 Ryan Tygh' + _(' as ') + 'Ring Photographer (sin acreditar)\n\
 Kimberly Villanova' + _(' as ') + 'Businesswoman (sin acreditar)',
             'country'           : 'Estados Unidos',
-            'genre'             : u'Acci�n | Drama | Romance | Deporte',
-            'classification'    : u'Estados Unidos:PG  | Singapur:PG  | Finlandia:K-11  | Reino Unido:12A  | Canad�:G (British Columbia) | Australia:M  | Irlanda:PG  | Hong Kong:IIA  | M�xico:A  | Noruega:11  | Suiza:12 (canton of Geneva) | Suiza:12 (canton of Vaud) | Brasil:12  | Argentina:Atp  | Malasia:U  | Filipinas:PG-13 (MTRCB) | Portugal:M/12  | Corea del Sur:12  | Suecia:11  | Nueva Zelanda:M',
+            'genre'             : u'Drama | Deporte',
+            'classification'    : u'Estados Unidos:PG  | Singapur:PG  | Finlandia:K-11  | Reino Unido:12A  | Canad�:G (British Columbia) | Australia:M  | Irlanda:PG  | Hong Kong:IIA  | M�xico:A  | Noruega:11  | Suiza:12 (canton of Vaud) | Suiza:12 (canton of Geneva) | Brasil:12  | Argentina:Atp  | Malasia:U  | Filipinas:PG-13 (MTRCB) | Portugal:M/12  | Corea del Sur:12  | Suecia:11  | Nueva Zelanda:M  | Italia:T  | Alemania:12  | Francia:U',
             'studio'            : 'Metro-Goldwyn-Mayer (MGM) (presents) (copyright owner), Columbia Pictures (presents) (copyright owner), Revolution Studios (presents) (copyright owner), Rogue Marble',
             'o_site'            : False,
             'site'              : 'http://www.imdb.es/title/tt0479143',
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieIMDB-it.py trunk/lib/plugins/movie/PluginMovieIMDB-it.py
--- griffith-0.13/lib/plugins/movie/PluginMovieIMDB-it.py	2011-06-21 19:17:35.000000000 +0300
+++ trunk/lib/plugins/movie/PluginMovieIMDB-it.py	2013-07-27 18:37:05.670214115 +0300
@@ -31,14 +31,14 @@
 plugin_language     = _('Italian')
 plugin_author       = 'Enrico Carlesso, Filippo Valsorda'
 plugin_author_email = 'enrico@ecarlesso.org, filosottile.wiki -at- gmail com'
-plugin_version      = '0.2'
+plugin_version      = '0.3'
 
 class Plugin(movie.Movie):
     def __init__(self, id):
         self.encode   = 'iso8859-1'
         self.movie_id = id
         self.url      = "http://www.imdb.it/title/tt%s" % self.movie_id
-        self.o_url      = "http://www.imdb.com/title/tt%s" % self.movie_id
+        self.o_url    = "http://www.imdb.com/title/tt%s" % self.movie_id
 
     def initialize(self):
         self.cast_page = self.open_page(url=self.url + '/fullcredits')
@@ -107,13 +107,13 @@
         self.studio = gutils.trim(self.page, '<h5>Compagnia:</h5>', '</a>')
 
     def get_o_site(self):
-        self.o_site = "http://italian.imdb.com/title/tt%s/officialsites" % self.movie_id
+        self.o_site = "http://www.imdb.it/title/tt%s/officialsites" % self.movie_id
 
     def get_site(self):
-        self.site = "http://italian.imdb.com/title/tt%s" % self.movie_id
+        self.site = "http://www.imdb.it/title/tt%s" % self.movie_id
 
     def get_trailer(self):
-        self.trailer = "http://italian.imdb.com/title/tt%s/trailers" % self.movie_id
+        self.trailer = "http://www.imdb.it/title/tt%s/trailers" % self.movie_id
 
     def get_country(self):
         self.country = gutils.trim(self.page, '<h5>Nazionalit&#xE0;:</h5>', '</div>')
@@ -181,50 +181,30 @@
         return data
 
 class SearchPlugin(movie.SearchMovie):
-    PATTERN = re.compile(r"""<A HREF=['"]/title/tt([0-9]+)/["']>(.*?)</LI>""")
-    PATTERN2 = re.compile(r"""<a href=['"]/title/tt([0-9]+)/["'](.*?)</tr>""")
+    PATTERN = re.compile(r"""<a href=['"]/title/tt([0-9]+)/[^>]+[>](.*?)</td>""")
+    PATTERN_DIRECT = re.compile(r"""value="/title/tt([0-9]+)""")
 
     def __init__(self):
-        self.original_url_search   = 'http://italian.imdb.com/find?s=tt;q='
-        self.translated_url_search = 'http://italian.imdb.com/find?s=tt;q='
-        self.encode                = 'iso8859-1'
+        self.original_url_search   = 'http://www.imdb.it/find?s=tt&q='
+        self.translated_url_search = 'http://www.imdb.it/find?s=tt&q='
+        self.encode                = 'utf8'
 
-    def search(self, parent_window):
+    def search(self,parent_window):
         if not self.open_search(parent_window):
             return None
-        tmp_page = gutils.trim(self.page, 'Titoli popolari', '</table>')
-        if not tmp_page:
-            has_results = re.match('[(]Visualizza [1-9][0-7]* risultat[io]*[)]', self.page)
-            if not has_results:
-                # nothing or one result found, try another url which looks deeper in the imdb database
-                # example: Adventures of Falcon -> one result, jumps directly to the movie page
-                # which isn't supported by this plugin
-                self.url = 'http://italian.imdb.com/find?more=tt;q='
-                if not self.open_search(parent_window):
-                    return None
-            self.page = gutils.trim(self.page, '(Visualizza', '>Suggerimenti per migliorare i tuoi risultati<')
-        else:
-            self.page = tmp_page
-        self.page = self.page.decode('iso-8859-1')
-        # correction of all &#xxx entities
-        self.page = gutils.convert_entities(self.page)
         return self.page
 
     def get_searches(self):
-        elements = re.split('<LI>', self.page)
-        if len(elements) < 2:
-            elements = string.split(self.page, '<tr>')
-            if len(elements):
-                for element in elements[1:]:
-                    match = self.PATTERN2.findall(element)
-                    if len(match):
-                        tmp = re.sub('^[0-9]+[.]', '', gutils.clean(gutils.after(match[0][1], '>')))
-                        self.ids.append(match[0][0])
-                        self.titles.append(tmp)
-        else:
+        elements = string.split(self.page, '<tr')
+        if len(elements):
             for element in elements[1:]:
                 match = self.PATTERN.findall(element)
-                if len(match):
-                    tmp = gutils.clean(match[0][1])
-                    self.ids.append(match[0][0])
+                if len(match) > 1:
+                    tmp = re.sub('^[0-9]+[.]', '', gutils.clean(match[1][1]))
+                    self.ids.append(match[1][0])
                     self.titles.append(tmp)
+        if len(self.ids) < 2:
+            # try to find a direct result
+            match = self.PATTERN_DIRECT.findall(self.page)
+            if len(match) > 0:
+                self.ids.append(match[0])
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieIMDB-pt.py trunk/lib/plugins/movie/PluginMovieIMDB-pt.py
--- griffith-0.13/lib/plugins/movie/PluginMovieIMDB-pt.py	2011-02-08 23:10:58.000000000 +0200
+++ trunk/lib/plugins/movie/PluginMovieIMDB-pt.py	2013-07-27 18:37:05.673547595 +0300
@@ -39,14 +39,14 @@
     def __init__(self, id):
         self.encode   ='iso-8859-1'
         self.movie_id = id
-        self.url      = "http://www.imdb.pt/title/" + str(self.movie_id)
+        self.url      = "http://www.imdb.pt/title/tt" + str(self.movie_id)
 
     def initialize(self):
         self.page = gutils.convert_entities(self.page)
-	self.cast_page = self.open_page(url=self.url + '/fullcredits')
-	self.cast_page = gutils.convert_entities(self.cast_page)
-	self.plot_page = self.open_page(url=self.url + '/plotsummary')
-	self.plot_page = gutils.convert_entities(self.plot_page)
+        self.cast_page = self.open_page(url=self.url + '/fullcredits')
+        self.cast_page = gutils.convert_entities(self.cast_page)
+        self.plot_page = self.open_page(url=self.url + '/plotsummary')
+        self.plot_page = gutils.convert_entities(self.plot_page)
 
     def get_image(self):
         self.image_url = gutils.trim(self.page, u'src="http://ia.media-imdb.com/images/', u'.jpg" /></a>')
@@ -65,8 +65,8 @@
         self.director = gutils.strip_tags(self.director)
 
     def get_plot(self):
-	self.plot = gutils.trim(self.plot_page, u'<div id="swiki.2.1">', u'</div>')
-	self.plot = gutils.strip_tags(self.plot)
+        self.plot = gutils.trim(self.plot_page, u'<div id="swiki.2.1">', u'</div>')
+        self.plot = gutils.strip_tags(self.plot)
         self.plot = self.plot.encode(self.encode)
 
     def get_year(self):
@@ -103,8 +103,8 @@
 
     def get_studio(self):
         self.studio = gutils.trim(self.page, u'<h5>Companhia :</h5><div class="info-content">', u'Exibir mais</a>')
-	self.studio = gutils.strip_tags(self.studio)
-	self.studio = self.studio.encode(self.encode)
+        self.studio = gutils.strip_tags(self.studio)
+        self.studio = self.studio.encode(self.encode)
 
     def get_o_site(self):
         self.o_site = ""
@@ -125,11 +125,12 @@
 
     def get_rating(self):
         self.rating = gutils.trim(self.page, u'<div class="starbar-meta">', '/10')
-    	self.rating = gutils.strip_tags(self.rating)
-    	self.rating = string.replace(self.rating, ",", ".")
-        self.rating = float(self.rating)
-    	self.rating = round(self.rating)
-	
+        self.rating = gutils.strip_tags(self.rating)
+        self.rating = string.replace(self.rating, ",", ".")
+        if self.rating:
+            self.rating = float(self.rating)
+            self.rating = round(self.rating)
+
     def get_screenplay(self):
         self.screenplay = ''
         parts = re.split('<a href=', gutils.trim(self.cast_page, u'>Créditos como roteirista<', '</table>'))
@@ -143,10 +144,10 @@
                 self.screenplay = self.screenplay + screenplay + ', '
             if len(self.screenplay) > 2:
                 self.screenplay = self.screenplay[0:len(self.screenplay) - 2]
-		
+
     def get_cameraman(self):
         self.cameraman = string.replace('<' + gutils.trim(self.cast_page, u'>Direção de Fotografia de<', '</table>'), u'(diretor de fotografia) ', '')
-	
+
     def __before_more(self, data):
         for element in [u'>Exibir mais<', '>Full summary<', '>Full synopsis<']:
             tmp = string.find(data, element)
@@ -155,32 +156,26 @@
         return data
 
 class SearchPlugin(movie.SearchMovie):
+    PATTERN = re.compile(r"""<a href=['"]/title/tt([0-9]+)/[^>]+[>](.*?)</td>""")
+
     def __init__(self):
-        self.original_url_search   = 'http://www.imdb.pt/find?s=all&q='
-        self.translated_url_search = 'http://www.imdb.pt/find?s=all&q='
-        self.encode                = 'iso-8859-1'
+        self.original_url_search   = 'http://www.imdb.pt/find?s=tt&q='
+        self.translated_url_search = 'http://www.imdb.pt/find?s=tt&q='
+        self.encode                = 'utf8'
 
     def search(self, parent_window):
         """Perform the web search"""
         if not self.open_search(parent_window):
             return None
-            self.sub_search()
         return self.page
 
-    def sub_search(self):
-        """Isolating just a portion (with the data we want) of the results"""
-        self.page = gutils.trim(self.page, \
-            "Resultado)<table>", "<p><b>Nomes (Coincid")
-
     def get_searches(self):
         """Try to find both id and film title for each search result"""
-        elements = string.split(self.page, 'height="6"><br><a href="')
-        self.number_results = elements[-1]
-
-        if (len(elements[0])):
-            for element in elements:
-                self.ids.append(gutils.trim(element, "title/", '/" onclick="'))
-                self.titles.append(gutils.convert_entities \
-                    (gutils.trim(element, """/';">""", "</a> ")))
-        else:
-            self.number_results = 0
\ No newline at end of file
+        elements = string.split(self.page, '<tr')
+        if len(elements):
+            for element in elements[1:]:
+                match = self.PATTERN.findall(element)
+                if len(match) > 1:
+                    tmp = re.sub('^[0-9]+[.]', '', gutils.clean(match[1][1]))
+                    self.ids.append(match[1][0])
+                    self.titles.append(tmp)
\ No newline at end of file
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieIMDB.py trunk/lib/plugins/movie/PluginMovieIMDB.py
--- griffith-0.13/lib/plugins/movie/PluginMovieIMDB.py	2011-12-19 00:35:27.000000000 +0200
+++ trunk/lib/plugins/movie/PluginMovieIMDB.py	2014-01-06 22:10:52.551678262 +0200
@@ -1,8 +1,8 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: PluginMovieIMDB.py 1605 2011-12-18 22:35:25Z piotrek $'
+__revision__ = '$Id: PluginMovieIMDB.py 1658 2013-12-09 20:33:24Z mikej06 $'
 
-# Copyright (c) 2005-2011 Vasco Nunes, Piotr Ożarowski
+# Copyright (c) 2005-2013 Vasco Nunes, Piotr Ożarowski
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -30,11 +30,11 @@
 plugin_language     = _('English')
 plugin_author       = 'Vasco Nunes, Piotr Ożarowski'
 plugin_author_email = 'griffith@griffith.cc'
-plugin_version      = '1.12'
+plugin_version      = '1.15'
 
 class Plugin(movie.Movie):
     def __init__(self, id):
-        self.encode   = 'iso8859-1'
+        self.encode   = 'utf-8'
         self.movie_id = id
         self.url      = "http://imdb.com/title/tt%s" % self.movie_id
 
@@ -49,11 +49,12 @@
         self.image_url = gutils.trim(tmp, 'src="', '"')
 
     def get_o_title(self):
-        self.o_title = gutils.regextrim(self.page, 'class="title-extra">', '<')
+        self.o_title = gutils.regextrim(self.page, 'class="title-extra"[^>]*>', '<')
         if not self.o_title:
             self.o_title = gutils.regextrim(self.page, '<h1>', '([ ]|[&][#][0-9]+[;])<span')
         if not self.o_title:
             self.o_title = re.sub(' [(].*', '', gutils.trim(self.page, '<title>', '</title>'))
+        self.o_title = re.sub('"', '', self.o_title)
 
     def get_title(self):    # same as get_o_title()
         self.title = gutils.regextrim(self.page, '<h1>', '([ ]|[&][#][0-9]+[;])<span')
@@ -62,46 +63,55 @@
 
     def get_director(self):
         self.director = ''
-        parts = re.split('<a href=', gutils.trim(self.cast_page, '>Directed by<', '</table>'))
+        parts = re.split('<a href=', gutils.trim(self.cast_page, '>Directed by', '</table>'))
         if len(parts) > 1:
             for part in parts[1:]:
-                director = gutils.trim(part, '>', '<')
+                director = string.strip(string.replace(gutils.trim(part, '>', '<'), '\n', ''))
                 self.director = self.director + director + ', '
             self.director = self.director[0:len(self.director) - 2]
 
     def get_plot(self):
-        self.plot = gutils.regextrim(self.page, '<h5>Plot:</h5>', '(</div>|<a href.*)')
-        self.plot = self.__before_more(self.plot)
+        self.plot = gutils.regextrim(self.page, 'itemprop="description"', '<')
+        self.plot = gutils.after(self.plot, '>')
         elements = string.split(self.plot_page, '<p class="plotpar">')
+        if len(elements) < 2:
+            elements = re.split('<li class="(?:odd|even)">', self.plot_page)
         if len(elements) > 1:
             self.plot = self.plot + '\n\n'
             elements[0] = ''
-            for element in elements:
+            for element in elements[1:]:
                 if element <> '':
                     self.plot = self.plot + gutils.strip_tags(gutils.before(element, '</a>')) + '\n\n'
 
     def get_year(self):
         self.year = gutils.trim(self.page, '<a href="/year/', '</a>')
-        self.year = gutils.after(self.year, '">')
+        self.year = gutils.after(self.year, '>')
+        if not self.year:
+            tmp = gutils.trim(self.page, '<title>', '</title>')
+            tmp = re.search('([0-9]{4})[)]', tmp)
+            if tmp:
+                self.year = tmp.group(0)
 
     def get_runtime(self):
         self.runtime = gutils.regextrim(self.page, 'Runtime:<[^>]+>', ' min')
 
     def get_genre(self):
-        self.genre = gutils.regextrim(self.page, 'Genre[s]*:<[^>]+>', '</div>')
+        self.genre = string.replace(gutils.regextrim(self.page, 'Genre[s]*:<[^>]+>', '</div>'), '\n', '')
         self.genre = self.__before_more(self.genre)
 
     def get_cast(self):
         self.cast = ''
-        self.cast = gutils.trim(self.cast_page, '<table class="cast">', '</table>')
+        self.cast = gutils.trim(self.cast_page, '<table class="cast_list">', '</table>')
         if self.cast == '':
             self.cast = gutils.trim(self.page, '<table class="cast">', '</table>')
         self.cast = string.replace(self.cast, ' ... ', _(' as '))
         self.cast = string.replace(self.cast, '...', _(' as '))
-        self.cast = string.replace(self.cast, '</tr><tr>', "\n")
-        self.cast = re.sub('</tr>[ \t]*<tr[ \t]*class="even">', "\n", self.cast)
-        self.cast = re.sub('</tr>[ \t]*<tr[ \t]*class="odd">', "\n", self.cast)
+        self.cast = string.replace(self.cast, "\n", '')
+        self.cast = string.replace(self.cast, '</tr>', "\n")
         self.cast = self.__before_more(self.cast)
+        self.cast = gutils.clean(self.cast)
+        self.cast = re.sub('[ \t]+', ' ', self.cast)
+        self.cast = re.sub(' \n ', '\n', self.cast)
 
     def get_classification(self):
         self.classification = gutils.trim(self.page, '(<a href="/mpaa">MPAA</a>)', '</div>')
@@ -109,14 +119,15 @@
 
     def get_studio(self):
         self.studio = ''
-        tmp = gutils.regextrim(self.comp_page, 'Production Companies<[^>]+', '</ul>')
+        tmp = gutils.regextrim(self.comp_page, 'name="production"', '</ul>')
         tmp = string.split(tmp, 'href="')
-        for entry in tmp:
-            entry = gutils.trim(entry, '>', '<')
-            if entry:
-                self.studio = self.studio + entry + ', '
-        if self.studio:
-            self.studio = self.studio[:-2]
+        if len(tmp)>1:
+            for entry in tmp[1:]:
+                entry = string.strip(string.replace(gutils.trim(entry, '>', '<'), '\n', ''))
+                if entry:
+                    self.studio = self.studio + entry + ', '
+            if self.studio:
+                self.studio = self.studio[:-2]
 
     def get_o_site(self):
         self.o_site = ''
@@ -129,7 +140,7 @@
 
     def get_country(self):
         self.country = '<' + gutils.trim(self.page, 'Country:<', '</div>')
-        self.country = re.sub('[\n]+', '', self.country)
+        self.country = re.sub('[ ]+', ' ', re.sub('[\n]+', '', self.country))
 
     def get_rating(self):
         pattern = re.compile('>([0-9]([.][0-9])*)(<[^>]+>)+[/](<[^>]+>)[0-9][0-9]<')
@@ -161,17 +172,14 @@
         sound = re.sub('[\n]+', '', sound)
         sound = re.sub('[ ]+', ' ', sound)
         sound = sound.strip()
-        tagline = gutils.regextrim(self.tagl_page, 'Taglines for', 'Related Links')
-        index = string.rfind(tagline, '</div>')
-        if index > -1:
-            taglines = string.split(tagline[index:], '<hr')
-            tagline = ''
-            for entry in taglines:
-                entry = gutils.clean(gutils.after(entry, '>'))
+        tagline = gutils.regextrim(self.tagl_page, '>Taglines', '>See also')
+        taglines = re.split('<div[^>]+class="soda[^>]*>', tagline)
+        tagline = ''
+        if len(taglines)>1:
+            for entry in taglines[1:]:
+                entry = gutils.clean(gutils.before(entry, '</div>'))
                 if entry:
                     tagline = tagline + entry + '\n'
-        else:
-            tagline = ''
         if len(language)>0:
             self.notes = "%s: %s\n" %(_('Language'), language)
         if len(sound)>0:
@@ -183,10 +191,10 @@
 
     def get_screenplay(self):
         self.screenplay = ''
-        parts = re.split('<a href=', gutils.trim(self.cast_page, '>Writing credits<', '</table>'))
+        parts = re.split('<a href=', gutils.trim(self.cast_page, '>Writing Credits', '</table>'))
         if len(parts) > 1:
             for part in parts[1:]:
-                screenplay = gutils.trim(part, '>', '<')
+                screenplay = string.strip(string.replace(gutils.trim(part, '>', '<'), '\n', ''))
                 if screenplay == 'WGA':
                     continue
                 screenplay = screenplay.replace(' (written by)', '')
@@ -194,17 +202,19 @@
                 self.screenplay = self.screenplay + screenplay + ', '
             if len(self.screenplay) > 2:
                 self.screenplay = self.screenplay[0:len(self.screenplay) - 2]
+                self.screenplay = re.sub('[ \t]+', ' ', self.screenplay)
 
     def get_cameraman(self):
         self.cameraman = ''
-        tmp = gutils.regextrim(self.cast_page, 'Cinematography by<[^>]+', '</table>')
+        tmp = gutils.regextrim(self.cast_page, '>Cinematography by', '</table>')
         tmp = string.split(tmp, 'href="')
-        for entry in tmp:
-            entry = gutils.trim(entry, '>', '<')
-            if entry:
-                self.cameraman = self.cameraman + entry + ', '
-        if self.cameraman:
-            self.cameraman = self.cameraman[:-2]
+        if len(tmp) > 1:
+            for entry in tmp[1:]:
+                entry = string.strip(string.replace(gutils.trim(entry, '>', '<'), '\n', ''))
+                if entry:
+                    self.cameraman = self.cameraman + entry + ', '
+            if self.cameraman:
+                self.cameraman = self.cameraman[:-2]
 
     def __before_more(self, data):
         for element in ['>See more<', '>more<', '>Full summary<', '>Full synopsis<']:
@@ -214,8 +224,8 @@
         return data
 
 class SearchPlugin(movie.SearchMovie):
-    PATTERN = re.compile(r"""<A HREF=['"]/title/tt([0-9]+)/["']>(.*?)</LI>""")
-    PATTERN2 = re.compile(r"""<a href=['"]/title/tt([0-9]+)/["'](.*?)</tr>""")
+    PATTERN = re.compile(r"""<a href=['"]/title/tt([0-9]+)/[^>]+[>](.*?)</td>""")
+    PATTERN_DIRECT = re.compile(r"""value="/title/tt([0-9]+)""")
 
     def __init__(self):
         # http://www.imdb.com/List?words=
@@ -225,49 +235,31 @@
         # finds a whole bunch of results. if you look for "Rocky" you will get 903 results.
         # http://www.imdb.com/find?s=tt;q=
         # seems to give the best results. 88 results for "Rocky", popular titles first.
-        self.original_url_search   = 'http://www.imdb.com/find?s=tt;q='
-        self.translated_url_search = 'http://www.imdb.com/find?s=tt;q='
-        self.encode                = 'iso8859-1'
+        self.original_url_search   = 'http://www.imdb.com/find?s=tt&q='
+        self.translated_url_search = 'http://www.imdb.com/find?s=tt&q='
+        self.encode                = 'utf8'
 
     def search(self,parent_window):
         if not self.open_search(parent_window):
             return None
-        tmp_page = gutils.trim(self.page, 'Here are the', '</TABLE>')
-        if not tmp_page:
-            has_results = re.match('[(]Displaying [1-9][0-7]* Result[s]*[)]', self.page)
-            if not has_results:
-                # nothing or one result found, try another url which looks deeper in the imdb database
-                # example: Adventures of Falcon -> one result, jumps directly to the movie page
-                # which isn't supported by this plugin
-                self.url = 'http://www.imdb.com/find?more=tt;q='
-                if not self.open_search(parent_window):
-                    return None
-            self.page = gutils.trim(self.page, '(Displaying', '>Suggestions For Improving Your Results<')
-        else:
-            self.page = tmp_page
-        self.page = self.page.decode('iso-8859-1')
-        # correction of all &#xxx entities
-        self.page = gutils.convert_entities(self.page)
         return self.page
 
     def get_searches(self):
-        elements = re.split('<LI>', self.page)
-        if len(elements) < 2:
-            elements = string.split(self.page, '<tr>')
-            if len(elements):
-                for element in elements[1:]:
-                    match = self.PATTERN2.findall(element)
-                    if len(match):
-                        tmp = re.sub('^[0-9]+[.]', '', gutils.clean(gutils.after(match[0][1], '>')))
-                        self.ids.append(match[0][0])
-                        self.titles.append(tmp)
-        else:
+        elements = string.split(self.page, '<tr')
+        if len(elements):
             for element in elements[1:]:
                 match = self.PATTERN.findall(element)
-                if len(match):
-                    tmp = gutils.clean(match[0][1])
-                    self.ids.append(match[0][0])
+                if len(match) > 1:
+                    tmp = re.sub('^[0-9]+[.]', '', gutils.clean(match[1][1]))
+                    self.ids.append(match[1][0])
                     self.titles.append(tmp)
+        if len(self.ids) < 2:
+            # try to find a direct result
+            match = self.PATTERN_DIRECT.findall(self.page)
+            if len(match) > 0:
+                self.ids.append(match[0])
+
+
 #
 # Plugin Test
 #
@@ -277,8 +269,8 @@
     # dict { movie_id -> [ expected result count for original url, expected result count for translated url ] }
     #
     test_configuration = {
-        'Rocky Balboa'         : [ 25, 25 ],
-        'Ein glückliches Jahr' : [ 47, 47 ]
+        'Rocky Balboa'         : [ 10, 10 ],
+        'Ein glückliches Jahr' : [ 3, 3 ]
     }
 
 class PluginTest:
@@ -346,14 +338,14 @@
 Patricia Potter' + _(' as ') + 'Third Whore\n\
 John Ramm' + _(' as ') + 'Makepeace\'s Neighbor\n\
 Martin Neely' + _(' as ') + 'Paris / Lady Montague (as Martin Neeley)\n\
-The Choir of St. George\'s School in Windsor' + _(' as ') + 'Choir (as The Choir of St. George\'s School, Windsor) rest of cast listed alphabetically:\n\
+The Choir of St. George\'s School in Windsor' + _(' as ') + 'Choir (as The Choir of St. George\'s School Windsor) rest of cast listed alphabetically:\n\
 Jason Canning' + _(' as ') + 'Nobleman (uncredited)\n\
 Kelley Costigan' + _(' as ') + 'Theatregoer (uncredited)\n\
 Rupert Everett' + _(' as ') + 'Christopher Marlowe (uncredited)\n\
-John Inman' + _(' as ') + 'Character player (uncredited)',
-            'country'           : 'USA | UK',
+John Inman' + _(' as ') + 'Character Player (uncredited)',
+            'country'           : 'USA',
             'genre'             : 'Comedy | Drama | Romance',
-            'classification'    : 'R',
+            'classification'    : False,
             'studio'            : 'Universal Pictures, Miramax Films, Bedford Falls Productions',
             'o_site'            : False,
             'site'              : 'http://www.imdb.com/title/tt0138097',
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieKinoDe.py trunk/lib/plugins/movie/PluginMovieKinoDe.py
--- griffith-0.13/lib/plugins/movie/PluginMovieKinoDe.py	2011-12-04 17:59:11.000000000 +0200
+++ trunk/lib/plugins/movie/PluginMovieKinoDe.py	2013-07-27 18:37:05.673547595 +0300
@@ -1,6 +1,6 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: PluginMovieKinoDe.py 1599 2011-12-02 19:52:02Z mikej06 $'
+__revision__ = '$Id: PluginMovieKinoDe.py 1643 2013-02-21 19:51:43Z mikej06 $'
 
 # Copyright (c) 2006-2011
 #
@@ -67,33 +67,34 @@
             self.videopage = None
 
     def get_image(self):
-        self.image_url = ''
-        tmpdata = gutils.regextrim(self.page, '<div class="cover-area">', '</div>')
-        if tmpdata:
-            # video page
-            tmpdata = re.search('(http[:][/][/][^/]+[/]flbilder[/][^"\']+)', tmpdata)
-            if tmpdata:
-                self.image_url = tmpdata.group(1)
-        else:
-            # kino page
-            tmpdata = gutils.before(self.page, '<span style="line-height: 15px;">')
-            if tmpdata:
-                tmpparts = re.split('http://images.kino.de/s/', tmpdata)
-                if len(tmpparts) > 2:
-                    self.image_url = 'http://images.kino.de/s/' + gutils.before(tmpparts[2], '"')
-                elif len(tmpparts) > 1:
-                    self.image_url = 'http://images.kino.de/s/' + gutils.before(tmpparts[1], '"')
-        if not self.image_url and self.videopage:
-            tmpdata = gutils.regextrim(self.videopage, '<div class="cover-area">', '</div>')
+        self.image_url = string.replace(string.replace(gutils.trim(self.page, '"picture":', ','), '"', ''), '\\', '')
+        if not self.image_url:
+            tmpdata = gutils.regextrim(self.page, '<div class="cover-area">', '</div>')
             if tmpdata:
                 # video page
                 tmpdata = re.search('(http[:][/][/][^/]+[/]flbilder[/][^"\']+)', tmpdata)
                 if tmpdata:
                     self.image_url = tmpdata.group(1)
+            else:
+                # kino page
+                tmpdata = gutils.before(self.page, '<span style="line-height: 15px;">')
+                if tmpdata:
+                    tmpparts = re.split('http://images.kino.de/s/', tmpdata)
+                    if len(tmpparts) > 2:
+                        self.image_url = 'http://images.kino.de/s/' + gutils.before(tmpparts[2], '"')
+                    elif len(tmpparts) > 1:
+                        self.image_url = 'http://images.kino.de/s/' + gutils.before(tmpparts[1], '"')
+            if not self.image_url and self.videopage:
+                tmpdata = gutils.regextrim(self.videopage, '<div class="cover-area">', '</div>')
+                if tmpdata:
+                    # video page
+                    tmpdata = re.search('(http[:][/][/][^/]+[/]flbilder[/][^"\']+)', tmpdata)
+                    if tmpdata:
+                        self.image_url = tmpdata.group(1)
 
 
     def get_o_title(self):
-        self.o_title = gutils.trim(self.page, '<p>Originaltitel: ', '</p>')
+        self.o_title = gutils.regextrim(self.page, '(<p>Originaltitel[:] |Originaltitel<[^>]+>)', '(</tr>|</p>)')
         if not self.o_title:
             self.o_title = gutils.trim(self.page, '<h1(', ')')
             if not self.o_title:
@@ -102,23 +103,23 @@
                     if self.videopage:
                         self.o_title = gutils.trim(self.videopage, '<p>Originaltitel: ', '</p>')
                     if not self.o_title:
-                        self.o_title = gutils.regextrim(self.page, '<h1>', '</h1>')
+                        self.o_title = gutils.regextrim(self.page, '<h1>', '(</h1>|</span>)')
 
     def get_title(self):
         self.title = gutils.trim(self.page, '<div class="teaser">', '</')
         if not self.title:
-            self.title = gutils.regextrim(self.page, '<h1>', '</h1>')
+            self.title = gutils.regextrim(self.page, '<h1>', '(</h1>|</span>)')
 
     def get_director(self):
         self.director = gutils.trim(self.page, '<th>Regie:', '<th>')
         if not self.director:
-            self.director = gutils.trim(self.creditspage, 'Regie&nbsp;', '</tr>')
+            self.director = gutils.trim(self.creditspage, 'Regie:', '</li>')
 
     def get_plot(self):
         self.plot = gutils.trim(self.page, '<div class="yui-content">', '<div class="footer">')
         if not self.plot:
             # kino page
-            self.plot = gutils.trim(self.page, '<span style="line-height: 15px;">', '<table')
+            self.plot = gutils.after(gutils.trim(self.page, 'Filmhandlung & Hintergrund', '</div>'), '</h2>')
         if not self.plot and self.videopage:
             self.plot = gutils.trim(self.videopage, '<div class="yui-content">', '<div class="footer">')
         if self.plot:
@@ -140,11 +141,15 @@
 
     def get_year(self):
         self.year = ''
-        tmp = gutils.trim(self.page, '<div class="description">', '</div>')
+        tmp = gutils.trim(gutils.trim(self.page, '"releaseDate":', ','), ':"', '"')
         if tmp:
-            searchyearandcountry = re.search('([0-9]{4})<br', tmp)
-            if searchyearandcountry:
-                self.year = searchyearandcountry.group(1)
+            self.year = tmp
+        else:
+            tmp = gutils.trim(self.page, '<div class="description">', '</div>')
+            if tmp:
+                searchyearandcountry = re.search('([0-9]{4})<br', tmp)
+                if searchyearandcountry:
+                    self.year = searchyearandcountry.group(1)
         if not self.year:
             tmp = gutils.trim(self.page, '<span class="standardsmall"><strong>', '<br')
             if tmp:
@@ -161,21 +166,24 @@
                     self.year = searchyearandcountry.group(1)
 
     def get_runtime(self):
-        self.runtime = ''
-        srchresult = re.search('Laufzeit: ([0-9]+)[ \t]Min[.]<', self.page)
-        if srchresult <> None:
-            self.runtime = srchresult.group(1)
+        self.runtime = gutils.trim(self.page, '"runtime":', ',')
         if not self.runtime:
-            srchresult = re.search('>([0-9]+)[ \t]Min[.]<', self.page)
-            if srchresult <> None:
-                self.runtime = srchresult.group(1)
-        if not self.runtime and self.videopage:
-            srchresult = re.search('Laufzeit: ([0-9]+)[ \t]Min[.]<', self.videopage)
+            srchresult = re.search('Laufzeit: ([0-9]+)[ \t]Min[.]<', self.page)
             if srchresult <> None:
                 self.runtime = srchresult.group(1)
+            if not self.runtime:
+                srchresult = re.search('>([0-9]+)[ \t]Min[.]<', self.page)
+                if srchresult <> None:
+                    self.runtime = srchresult.group(1)
+            if not self.runtime and self.videopage:
+                srchresult = re.search('Laufzeit: ([0-9]+)[ \t]Min[.]<', self.videopage)
+                if srchresult <> None:
+                    self.runtime = srchresult.group(1)
 
     def get_genre(self):
-        self.genre = gutils.trim(self.page,'<p class="genre">', '</p>')
+        self.genre = string.replace(gutils.trim(self.page, '"genre":', ','), '"', '')
+        if not self.genre:
+            self.genre = gutils.trim(self.page,'<p class="genre">', '</p>')
         if not self.genre:
             self.genre = gutils.trim(self.page, 'title="Zur Genreliste: Drama">', '<')
         if not self.genre and self.videopage:
@@ -195,19 +203,20 @@
                     else:
                         self.cast = self.cast + name + '\n'
         if not self.cast:
-            tmp = gutils.trim(self.creditspage, '>Cast<br />', '>Crew<')
-            if tmp:
-                castparts = re.split('width="50%"><a href="/star/', tmp)
-                for index in range(1, len(castparts), 1):
-                    role = gutils.clean(gutils.trim(castparts[index - 1], 'width="50%">', '</td>'))
-                    name = gutils.clean(gutils.trim(castparts[index], '">', '<'))
-                    if role:
-                        self.cast = self.cast + name + _(' as ') + role + '\n'
-                    else:
-                        self.cast = self.cast + name + '\n'
+            elements = re.split('<h3>Darsteller</h3>', self.page)
+            for element in elements[1:]:
+                actor = gutils.trim(element, 'itemprop="name">', '<')
+                if actor:
+                    self.cast = self.cast + actor
+                    role = gutils.trim(element, 'itemprop="title">', '<')
+                    if role and role <> 'Darsteller':
+                        self.cast = self.cast + _(' as ') + role
+                    self.cast = self.cast + '\n'
 
     def get_classification(self):
-        self.classification = gutils.regextrim(self.page, 'FSK: ', '<')
+        self.classification = string.replace(gutils.trim(self.page, '"fsk":', ','), '"', '')
+        if not self.classification:
+            self.classification = gutils.regextrim(self.page, 'FSK: ', '<')
         if not self.classification and self.videopage:
             self.classification = gutils.regextrim(self.videopage, 'FSK: ', '<')
 
@@ -220,6 +229,8 @@
                 self.studio = string.replace(gutils.after(tmp, '<br/>'), 'Verleih: ', '')
         if not self.studio:
             self.studio = gutils.trim(self.page, 'Verleih: ', '<')
+        if not self.studio:
+            self.studio = gutils.trim(self.page, 'Verleih:', '</li>')
         if not self.studio and self.videopage:
             tmp = gutils.trim(self.videopage, '<div class="description">', '</div>')
             if tmp:
@@ -258,6 +269,8 @@
                 tmp = gutils.trim(tmp, '<strong>', '</strong>')
                 if tmp:
                     self.country = gutils.before(tmp, ' ')
+        if not self.country:
+            self.country = gutils.trim(self.page, 'itemprop="contentLocation">', '<')
         if not self.country and self.videopage:
             tmp = gutils.trim(self.videopage, '<div class="description">', '</div>')
             if tmp:
@@ -298,11 +311,23 @@
         self.screenplay = gutils.regextrim(self.page, '<th>Buch:', '<th>')
         if not self.screenplay:
             self.screenplay= gutils.trim(self.creditspage, 'Drehbuch:&nbsp;', '</tr>')
+        if not self.screenplay:
+            elements = re.split('<h3>Drehbuch</h3>', self.page)
+            delimiter = ''
+            for element in elements[1:]:
+                self.screenplay = self.screenplay + delimiter + gutils.trim(element, 'itemprop="name">', '<')
+                delimiter = ', '
 
     def get_cameraman(self):
         self.cameraman = gutils.regextrim(self.page, '<th>Kamera:', '(<th>|</table>)')
         if not self.cameraman:
             self.cameraman= gutils.trim(self.creditspage, 'Kamera&nbsp;', '</tr>')
+        if not self.cameraman:
+            elements = re.split('"function-title">Kamera</span>', self.page)
+            delimiter = ''
+            for element in elements[1:]:
+                self.cameraman = self.cameraman + delimiter + gutils.trim(element, 'itemprop="name">', '<')
+                delimiter = ', '
 
 class SearchPlugin(movie.SearchMovie):
 
@@ -340,7 +365,7 @@
         for element in elements2:
             if element <> None:
                 title = gutils.clean(gutils.trim(element,'>','</a>')) + string.replace(' (' +
-                            gutils.clean(gutils.trim(element, '<p>', "<br />")) + ')', '()', '')
+                            gutils.clean(gutils.trim(gutils.before(element, '</li>'), '<p>', "<br />")) + ')', '()', '')
                 if title != ' ':
                     id = re.sub('[?].*', '', gutils.before(element,'"'))
                     self.ids.append("V_" + id)
@@ -364,7 +389,7 @@
     # dict { movie_id -> [ expected result count for original url, expected result count for translated url ] }
     #
     test_configuration = {
-        'Rocky Balboa'         : [ 9, 9 ],
+        'Rocky Balboa'         : [ 10, 10 ],
         'Arahan'               : [ 10, 10 ],
         'Ein glückliches Jahr' : [ 4, 4 ]
     }
@@ -393,12 +418,12 @@
 A.J. Benza' + _(' as ') + 'L.C.',
             'country'             : 'USA',
             'genre'               : 'Drama',
-            'classification'      : 'ab 12 Jahre',
+            'classification'      : '12',
             'studio'              : 'Fox',
             'o_site'              : False,
             'site'                : 'http://www.kino.de/kinofilm/rocky-balboa/96132.html',
             'trailer'             : 'http://www.kino.de/kinofilm/rocky-balboa/trailer/96132.html',
-            'year'                : 2006,
+            'year'                : 2007,
             'notes'               : False,
             'runtime'             : 102,
             'image'               : True,
@@ -417,14 +442,14 @@
 André Falcon',
             'country'             : 'Frankreich/Italien',
             'genre'               : 'Drama',
-            'classification'      : 'ab 12',
-            'studio'              : 'Black Hill Pictures',
+            'classification'      : '12',
+            'studio'              : 'Columbia TriStar',
             'o_site'              : False,
             'site'                : 'http://www.kino.de/kinofilm/ein-glueckliches-jahr/28675.html',
             'trailer'             : 'http://www.kino.de/kinofilm/ein-glueckliches-jahr/trailer/28675.html',
             'year'                : 1973,
             'notes'               : False,
-            'runtime'             : 110,
+            'runtime'             : 115,
             'image'               : True,
             'rating'              : False,
             'cameraman'           : 'Jean Collomb',
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieOFDb.py trunk/lib/plugins/movie/PluginMovieOFDb.py
--- griffith-0.13/lib/plugins/movie/PluginMovieOFDb.py	2011-12-04 17:59:11.000000000 +0200
+++ trunk/lib/plugins/movie/PluginMovieOFDb.py	2013-07-27 18:37:05.666880634 +0300
@@ -1,6 +1,6 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: PluginMovieOFDb.py 1599 2011-12-02 19:52:02Z mikej06 $'
+__revision__ = '$Id: PluginMovieOFDb.py 1641 2013-01-30 12:24:47Z mikej06 $'
 
 # Written by Christian Sagmueller <christian@sagmueller.net>
 # based on PluginMovieIMDB.py, Copyright (c) 2005 Vasco Nunes
@@ -16,7 +16,7 @@
 plugin_language     = _("German")
 plugin_author       = "Christian Sagmueller, Jessica Katharina Parth"
 plugin_author_email = "Jessica.K.P@women-at-work.org"
-plugin_version      = "0.10"
+plugin_version      = "0.11"
 
 class Plugin(movie.Movie):
     def __init__(self, id):
@@ -65,7 +65,7 @@
 
     def get_runtime(self):
         # from imdb
-        self.runtime = gutils.regextrim(self.imdb_page, '<h5>(L&auml;nge|L&#xE4;nge|Runtime):</h5>', ' (min|Min)')
+        self.runtime = gutils.after(gutils.regextrim(self.imdb_page, 'itemprop="duration"', ' (min|Min)'), '>')
 
     def get_genre(self):
         self.genre = gutils.trim(self.page,"Genre(s):","</table>")
@@ -94,10 +94,10 @@
 
     def get_studio(self):
         # from imdb
-        self.studio = gutils.regextrim(self.imdb_page, '<h5>(Firma|Company):</h5>', '</a>')
+        self.studio = gutils.regextrim(self.imdb_page, 'Production Co:', '(<span|</span>)')
 
     def get_o_site(self):
-        self.o_site = ""
+        self.o_site = gutils.trim(gutils.regextrim(self.imdb_page, 'Official Sites:', '(<span|</span>)'), 'href="', '"')
 
     def get_site(self):
         self.site = self.url
@@ -175,63 +175,90 @@
             'plot'                : True,
             'cast'                : 'Sylvester Stallone' + _(' as ') + 'Rocky Balboa\n\
 Burt Young' + _(' as ') + 'Paulie\n\
-Milo Ventimiglia' + _(' as ') + 'Robert Jr.\n\
+Antonio Tarver' + _(' as ') + 'Mason \'The Line\' Dixon\n\
 Geraldine Hughes' + _(' as ') + 'Marie\n\
-James Francis Kelly III' + _(' as ') + 'Steps\n\
+Milo Ventimiglia' + _(' as ') + 'Robert Jr.\n\
 Tony Burton' + _(' as ') + 'Duke\n\
-A.J. Benza\n\
+A.J. Benza' + _(' as ') + 'L.C.\n\
+James Francis Kelly III' + _(' as ') + 'Steps\n\
+Lou DiBella' + _(' as ') + 'Himself\n\
+Mike Tyson' + _(' as ') + 'Himself\n\
 Henry G. Sanders' + _(' as ') + 'Martin\n\
-Antonio Tarver' + _(' as ') + 'Mason \'The Line\' Dixon\n\
 Pedro Lovell' + _(' as ') + 'Spider Rico\n\
-Ana Gerena\n\
-Angela Boyd\n\
+Ana Gerena' + _(' as ') + 'Isabel\n\
+Angela Boyd' + _(' as ') + 'Angie\n\
 Louis Giansante\n\
 Maureen Schilling\n\
+Lahmard J. Tate\n\
+Woody Paige\n\
+Skip Bayless\n\
+Jay Crawford\n\
+Brian Kenny\n\
+Dana Jacobson\n\
+Charles Johnson\n\
+James Binns\n\
+Johnnie Hobbs Jr.\n\
+Barney Fitzpatrick\n\
+Jim Lampley\n\
+Larry Merchant\n\
+Max Kellerman\n\
+LeRoy Neiman\n\
+Bert Randolph Sugar\n\
+Bernard Fernández\n\
+Gunnar Peterson\n\
+Yahya\n\
+Marc Ratner\n\
+Anthony Lato Jr.\n\
+Jack Lazzarado\n\
+Michael Buffer' + _(' as ') + 'Ring Announcer\n\
+Joe Cortez' + _(' as ') + 'Referee\n\
 Carter Mitchell\n\
 Vinod Kumar\n\
+Fran Pultro\n\
+Frank Stallone als Frank Stallone Jr.' + _(' as ') + 'Dinner Patron \n\
+Jody Giambelluca\n\
 Tobias Segal' + _(' as ') + 'Robert\'s Friend\n\
 Tim Carr' + _(' as ') + 'Robert\'s Friend \n\
+Matt Frack\n\
 Paul Dion Monte' + _(' as ') + 'Robert\'s Friend\n\
 Kevin King Templeton\n\
 Robert Michael Kelly\n\
-Don Sherman' + _(' as ') + 'Andy\n\
-Nick Baker\n\
 Rick Buchborn\n\
+Nick Baker\n\
+Don Sherman' + _(' as ') + 'Andy\n\
 Gary Compton\n\
-Jody Giambelluca\n\
-Frank Stallone als Frank Stallone Jr.' + _(' as ') + 'Dinner Patron \n\
-Fran Pultro\n\
-Michael Buffer' + _(' as ') + 'Ring Announcer\n\
-Jack Lazzarado\n\
-Marc Ratner\n\
-Anthony Lato Jr.\n\
-Yahya\n\
-Gunnar Peterson\n\
-Bernard Fernández\n\
-Bert Randolph Sugar\n\
-Jim Lampley\n\
-Larry Merchant\n\
-Max Kellerman\n\
-James Binns\n\
-Johnnie Hobbs Jr.\n\
-Barney Fitzpatrick\n\
-Brian Kenny\n\
-Dana Jacobson\n\
-Skip Bayless\n\
-Charles Johnson\n\
-Matt Frack\n\
-Woody Paige\n\
-Jay Crawford\n\
-Lahmard J. Tate\n\
-LeRoy Neiman\n\
-Mike Tyson' + _(' as ') + 'Himself\n\
-Lou DiBella\n\
-Joe Cortez\n\
-Ricky Cavazos' + _(' as ') + 'Boxing Spectator (uncredited)',
+Vale Anoai\n\
+Sikander Malik\n\
+Michael Ahl\n\
+Andrew Aninsman\n\
+Ben Bachelder\n\
+Lacy Bevis\n\
+Tim Brooks\n\
+D.T. Carney\n\
+Ricky Cavazos' + _(' as ') + 'Boxing Spectator (uncredited)\n\
+Rennie Cowan\n\
+Deon Derrico\n\
+Jacob \'Stitch\' Duran\n\
+Simon P. Edwards\n\
+Ruben Fischman' + _(' as ') + 'High-Roller in Las Vegas (uncredited)\n\
+David Gere\n\
+Noah Jacobs\n\
+Mark J. Kilbane\n\
+Zach Klinefelter\n\
+David Kneeream\n\
+Dan Montero\n\
+Keith Moyer' + _(' as ') + 'Bar Patron (uncredited)\n\
+Carol Anne Mueller\n\
+Jacqueline Olivia\n\
+Brian H. Scott\n\
+Keyon Smith\n\
+Frank Traynor\n\
+Ryan Tygh\n\
+Kimberly Villanova',
             'country'             : 'USA',
             'genre'               : 'Action, Drama, Sportfilm',
             'classification'      : False,
-            'studio'              : 'Metro-Goldwyn-Mayer (MGM)',
+            'studio'              : 'Metro-Goldwyn-Mayer (MGM), Columbia Pictures, Revolution Studios',
             'o_site'              : False,
             'site'                : 'http://www.ofdb.de/film/103013,Rocky%20Balboa',
             'trailer'             : False,
@@ -246,7 +273,7 @@
             'o_title'             : 'Bonne année, La',
             'director'            : 'Claude Lelouch',
             'plot'                : False,
-            'cast'                : 'Lino Ventura' + _(' as ') + 'Simon \n\
+            'cast'                : 'Lino Ventura' + _(' as ') + 'Simon\n\
 Françoise Fabian' + _(' as ') + 'Françoise\n\
 Charles Gérard' + _(' as ') + 'Charlot\n\
 André Falcon' + _(' as ') + 'Le bijoutier\n\
@@ -255,7 +282,7 @@
 Claude Mann\n\
 Frédéric de Pasquale\n\
 Gérard Sire\n\
-Silvano Tranquilli' + _(' as ') + 'L\'amant italien \n\
+Silvano Tranquilli' + _(' as ') + 'L\'amant italien\n\
 André Barello\n\
 Michel Bertay\n\
 Norman de la Chesnaye\n\
@@ -270,14 +297,14 @@
 Elie Chouraqui',
             'country'             : 'Frankreich',
             'genre'               : 'Komödie, Krimi',
-            'classification'      : '12 (f)',
-            'studio'              : 'Les Films 13',
+            'classification'      : False,
+            'studio'              : 'Les Films 13, Rizzoli Film',
             'o_site'              : False,
             'site'                : 'http://www.ofdb.de/film/22489,Ein-Gl%C3%BCckliches-Jahr',
             'trailer'             : False,
             'year'                : 1973,
             'notes'               : False,
-            'runtime'             : 90,
+            'runtime'             : 115,
             'image'               : True,
             'rating'              : 6
         },
@@ -318,9 +345,9 @@
 Lee Oi-soo',
             'country'             : 'Südkorea',
             'genre'               : 'Action, Fantasy, Komödie',
-            'classification'      : '16',
-            'studio'              : 'Fun and Happiness',
-            'o_site'              : False,
+            'classification'      : False,
+            'studio'              : 'Fun and Happiness, Good Movie Company',
+            'o_site'              : 'http://www.arahan.co.kr/',
             'site'                : 'http://www.ofdb.de/film/54088,Arahan',
             'trailer'             : False,
             'year'                : 2004,
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/plugins/movie/PluginMovieZelluloid.py trunk/lib/plugins/movie/PluginMovieZelluloid.py
--- griffith-0.13/lib/plugins/movie/PluginMovieZelluloid.py	2011-12-04 17:59:11.000000000 +0200
+++ trunk/lib/plugins/movie/PluginMovieZelluloid.py	2013-07-27 18:37:05.673547595 +0300
@@ -1,6 +1,6 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: PluginMovieZelluloid.py 1599 2011-12-02 19:52:02Z mikej06 $'
+__revision__ = '$Id: PluginMovieZelluloid.py 1633 2012-12-28 23:11:42Z mikej06 $'
 
 # Copyright (c) 2007-2011 Michael Jahn
 #
@@ -224,11 +224,13 @@
 Talia Shire' + _(' as ') + 'Adrian\n\
 Lou DiBella' + _(' as ') + 'Lou DiBella\n\
 Mike Tyson' + _(' as ') + 'Mike Tyson\n\
-Henry G. Sanders' + _(' as ') + 'Martin',
+Henry G. Sanders' + _(' as ') + 'Martin\n\
+Kevin King Templeton' + _(' as ') + '\n\
+Frank Stallone as',
             'country'           : 'USA',
-            'genre'             : 'Drama, Sport',
+            'genre'             : 'Drama, Action, Sport',
             'classification'    : 'ab 12',
-            'studio'            : 'Chartoff-Winkler Productions, Columbia Pictures Corporation, Metro-Goldwyn-Mayer, Revolution Studios, Rogue Marble',
+            'studio'            : 'Chartoff-Winkler Productions, Columbia Pictures Corporation, MGM, Revolution Studios, Rogue Marble',
             'o_site'            : False,
             'site'              : 'http://www.zelluloid.de/filme/details.php3?id=2835',
             'trailer'           : False,
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/lib/test_movieplugins.py trunk/lib/test_movieplugins.py
--- griffith-0.13/lib/test_movieplugins.py	2011-12-04 17:59:11.000000000 +0200
+++ trunk/lib/test_movieplugins.py	2014-01-06 22:10:52.595013531 +0200
@@ -1,6 +1,6 @@
 # -*- coding: UTF-8 -*-
 
-__revision__ = '$Id: test_movieplugins.py 1599 2011-12-02 19:52:02Z mikej06 $'
+__revision__ = '$Id: test_movieplugins.py 1651 2013-09-27 19:48:00Z mikej06 $'
 
 # Copyright (c) 2006-2011
 #
@@ -82,8 +82,7 @@
         'PluginMovieDVDEmpire',
         'PluginMovieE-Pipoca',
         'PluginMovieFilmAffinity',
-        'PluginMovieFilmDb',
-        #'PluginMovieFilmeVonAZ',
+        'PluginMovieFilmeVonAZ',
         'PluginMovieFilmtipset',
         'PluginMovieHKMDB',
         'PluginMovieIMDB',
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/winpackage.iss trunk/winpackage.iss
--- griffith-0.13/winpackage.iss	2011-05-06 11:05:48.000000000 +0300
+++ trunk/winpackage.iss	2013-07-27 18:37:06.386912398 +0300
@@ -3,7 +3,7 @@
 
 [Setup]
 AppName=Griffith
-AppVerName=Griffith 0.12.1
+AppVerName=Griffith 0.13.0
 AppPublisher=Vasco Nunes, Piotr Ożarowski
 AppPublisherURL=http://www.griffith.cc/
 AppSupportURL=http://www.griffith.cc/
@@ -14,7 +14,7 @@
 LicenseFile=COPYING
 InfoAfterFile=README
 OutputDir=installer
-OutputBaseFilename=griffith-0.12.1-win32.1
+OutputBaseFilename=griffith-0.13-win32
 SetupIconFile=images\griffith.ico
 UninstallDisplayIcon={app}\griffith.exe
 Compression=lzma
@@ -23,8 +23,8 @@
 InternalCompressLevel=ultra
 AppCopyright=Vasco Nunes/Piotr Ożarowski
 DisableStartupPrompt=false
-AppVersion=0.12.1
-VersionInfoVersion=0.12.1
+AppVersion=0.13.0
+VersionInfoVersion=0.13.0
 
 [Languages]
 Name: eng; MessagesFile: compiler:Default.isl
@@ -66,7 +66,7 @@
 Source: dist\lib\*;    DestDir: {app}\lib;    Flags: ignoreversion
 ; use recursion, no components
 Source: dist\lib\db\*;           DestDir: {app}\lib\db;           Flags: ignoreversion recursesubdirs createallsubdirs
-Source: dist\lib\gettext\*;      DestDir: {app}\lib\gettext;      Flags: ignoreversion recursesubdirs createallsubdirs
+;Source: dist\lib\gettext\*;      DestDir: {app}\lib\gettext;      Flags: ignoreversion recursesubdirs createallsubdirs
 Source: dist\lib\glade3\*;       DestDir: {app}\lib\glade3;       Flags: ignoreversion recursesubdirs createallsubdirs
 ;Source: dist\lib\glib-2.0\*;     DestDir: {app}\lib\glib-2.0;     Flags: ignoreversion recursesubdirs createallsubdirs
 Source: dist\lib\gtk-2.0\*;      DestDir: {app}\lib\gtk-2.0;      Flags: ignoreversion recursesubdirs createallsubdirs
@@ -97,7 +97,6 @@
 Source: dist\lib\plugins\movie\PluginMovieE-Pipoca.py;      DestDir: {app}\lib\plugins\movie; Flags: ignoreversion; Components: Movie_Import_Plugins\Brazilian_Portuguese\E_Pipoca
 Source: dist\lib\plugins\movie\PluginMovieFDb.py;           DestDir: {app}\lib\plugins\movie; Flags: ignoreversion; Components: Movie_Import_Plugins\Polish\FDb
 Source: dist\lib\plugins\movie\PluginMovieFilmAffinity.py;  DestDir: {app}\lib\plugins\movie; Flags: ignoreversion; Components: Movie_Import_Plugins\Spanish\FilmAffinity
-Source: dist\lib\plugins\movie\PluginMovieFilmDb.py;        DestDir: {app}\lib\plugins\movie; Flags: ignoreversion; Components: Movie_Import_Plugins\German\FilmDb
 Source: dist\lib\plugins\movie\PluginMovieFilmeVonAZ.py;    DestDir: {app}\lib\plugins\movie; Flags: ignoreversion; Components: Movie_Import_Plugins\German\Filme_von_A_bis_Z
 Source: dist\lib\plugins\movie\PluginMovieFilmtipset.py;    DestDir: {app}\lib\plugins\movie; Flags: ignoreversion; Components: Movie_Import_Plugins\Swedish\Film_tip_set
 Source: dist\lib\plugins\movie\PluginMovieFilmweb.py;       DestDir: {app}\lib\plugins\movie; Flags: ignoreversion; Components: Movie_Import_Plugins\Polish\Filmweb
@@ -182,7 +181,6 @@
 
 Name: Movie_Import_Plugins\German;                   Description: German Import Plugins; Types: full
 Name: Movie_Import_Plugins\German\DVD_Palace;        Description: DVD-Palace / www.dvd-palace.de; Types: full
-Name: Movie_Import_Plugins\German\FilmDb;            Description: FilmDb / www.filmdb.de; Types: full
 Name: Movie_Import_Plugins\German\Filme_von_A_bis_Z; Description: Filme von A-Z / www.filmevona-z.de; Types: full
 Name: Movie_Import_Plugins\German\IMDBde;            Description: IMDB.de / german.imdb.com; Types: full
 Name: Movie_Import_Plugins\German\OFDb;              Description: OFDb / www.ofdb.de; Types: full
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/winsetup.bat trunk/winsetup.bat
--- griffith-0.13/winsetup.bat	2010-10-11 13:41:36.000000000 +0300
+++ trunk/winsetup.bat	2013-07-27 18:37:04.380157205 +0300
@@ -52,6 +52,8 @@
 if not "%ERRORLEVEL%" == "0" (pause)
 xcopy "%GTKDIR%\bin\jpeg62.dll"   "%GRIFFITHDIR%\dist\" /s /e
 if not "%ERRORLEVEL%" == "0" (pause)
+xcopy "%GTKDIR%\bin\libxml2-2.dll"   "%GRIFFITHDIR%\dist\" /s /e
+if not "%ERRORLEVEL%" == "0" (pause)
 
 copy "%GRIFFITHDIR%\AUTHORS"     "%GRIFFITHDIR%\dist\"
 copy "%GRIFFITHDIR%\COPYING"     "%GRIFFITHDIR%\dist\"
diff -ur -x .svn -x .git -x .bzr -x CVS griffith-0.13/winsetup.py trunk/winsetup.py
--- griffith-0.13/winsetup.py	2011-12-19 00:35:26.000000000 +0200
+++ trunk/winsetup.py	2013-07-27 18:37:05.046853282 +0300
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-__revision__ = '$Id: winsetup.py 1605 2011-12-18 22:35:25Z piotrek $'
+__revision__ = '$Id: winsetup.py 1623 2012-04-10 21:41:37Z mikej06 $'
 
 # Copyright © 2005-2010 Vasco Nunes, Piotr Ożarowski
 # This program is free software; you can redistribute it and/or modify
@@ -45,7 +45,7 @@
 
 opts = {
     "py2exe": {
-        "includes": "pygtk,cairo,pangocairo,gobject,cgi,PIL,pysqlite2,pysqlite2.*,pango,atk,gobject,tempfile,csv,xml.dom,xml.dom.minidom,xml.sax,threading,htmlentitydefs,sqlalchemy,sqlalchemy.*,sqlalchemy.databases.*,sqlalchemy.engine.*,sqlalchemy.ext.*,sqlalchemy.orm.*,sqlalchemy.sql.*,zipfile,webbrowser,shutil,reportlab,reportlab.pdfgen,reportlab.pdfgen.canvas,reportlab.platypus,reportlab.pdfbase.ttfonts,smtplib,win32com,platform,winshell,psycopg2,MySQLdb,chardet,gzip,commands,encodings,encodings.*,ConfigParser,gtk.glade,xmlrpclib,gio",
+        "includes": "pygtk,cairo,pangocairo,gobject,cgi,PIL,pysqlite2,pysqlite2.*,pango,atk,gobject,tempfile,csv,xml.dom,xml.dom.minidom,xml.sax,threading,htmlentitydefs,sqlalchemy,sqlalchemy.*,sqlalchemy.databases.*,sqlalchemy.engine.*,sqlalchemy.ext.*,sqlalchemy.orm.*,sqlalchemy.sql.*,zipfile,webbrowser,shutil,reportlab,reportlab.pdfgen,reportlab.pdfgen.canvas,reportlab.platypus,reportlab.pdfbase.ttfonts,reportlab.pdfbase.*,smtplib,win32com,platform,winshell,psycopg2,MySQLdb,chardet,gzip,commands,encodings,encodings.*,ConfigParser,gtk.glade,xmlrpclib,gio,lxml.*,simplejson",
         "optimize": 2,
         "dist_dir": "dist",
     }
