Example #1
0
def add_movie_db(self, close):
    session = self.db.Session()
    details = get_details(self)

    if not details['o_title'] and not details['title']:
        gutils.error(
            _("You should fill the original title\nor the movie title."),
            parent=self.widgets['add']['window'])
        return False

    asked = False
    if details['o_title']:
        if session.query(
                db.Movie).filter_by(o_title=details['o_title']).count() > 0:
            asked = True
            if not gutils.question(
                    _('Movie with that title already exists, are you sure you want to add?'
                      ), self.widgets['add']['window']):
                return False
    if not asked and details['title']:
        if session.query(
                db.Movie).filter_by(title=details['title']).count() > 0:
            if not gutils.question(
                    _('Movie with that title already exists, are you sure you want to add?'
                      ), self.widgets['add']['window']):
                return False

    new_poster_md5 = None
    if details['image']:
        tmp_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'))

            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")
                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
            try:
                if not tmp_image_path == details['image']:
                    os.remove(tmp_image_path)
            except Exception, e:
                log.warn("cannot remove temporary file %s", tmp_image_path)
Example #2
0
def add_movie_db(self, close):
    session = self.db.Session()
    details = get_details(self)
    
    if not details['o_title'] and not details['title']:
        gutils.error(_("You should fill the original title\nor the movie title."),
            parent=self.widgets['add']['window'])
        return False

    asked = False
    if details['o_title']:
        if session.query(db.Movie).filter_by(o_title=details['o_title']).count() > 0:
            asked = True
            if not gutils.question(_('Movie with that title already exists, are you sure you want to add?'), self.widgets['add']['window']):
                return False
    if not asked and details['title']:
        if session.query(db.Movie).filter_by(title=details['title']).count() > 0:
            if not gutils.question(_('Movie with that title already exists, are you sure you want to add?'), self.widgets['add']['window']):
                return False

    new_poster_md5 = None
    if details['image']:
        tmp_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'))

            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")
                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
            try:
                if not tmp_image_path == details['image']:
                    os.remove(tmp_image_path)
            except Exception, e:
                log.warn("cannot remove temporary file %s", tmp_image_path)
Example #3
0
def add_movie_db(self, close):
    details = get_details(self)
    if not details['o_title'] and not details['title']:
        gutils.error(self.widgets['results']['window'],
            _("You should fill the original title\nor the movie title."),
            parent=self.widgets['add']['window'])
        return False

    if details['o_title']:
        tmp_movie = self.db.session.query(db.Movie).filter_by(o_title=details['o_title']).first()
        if tmp_movie is not None:
            response = gutils.question(_('Movie with that title already exists, are you sure you want to add?'), \
                                       False, self.widgets['add']['window'])
            if response == gtk.RESPONSE_NO:
                return False
    if details['title']:
        tmp_movie = self.db.session.query(db.Movie).filter_by(title=details['title']).first()
        if tmp_movie is not None:
            response = gutils.question(_('Movie with that title already exists, are you sure you want to add?'), \
                                       False, self.widgets['add']['window'])
            if response == gtk.RESPONSE_NO:
                return False
    
    if details['image']:
        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'))

            poster = self.db.session.query(db.Poster).filter_by(md5sum=new_poster_md5).first()
            if not poster:
                try:
                    data = file(tmp_image_path, 'rb').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
                    self.db.session.add(poster)
            try:
                os.remove(tmp_image_path)
            except Exception, e:
                log.warn("cannot remove temporary file %s", tmp_image_path)
Example #4
0
def update_movie(self):
    session = self.db.Session()

    if self._am_movie_id is not None:
        movie = session.query(
            db.Movie).filter_by(movie_id=self._am_movie_id).one()
    else:
        movie = session.query(
            db.Movie).filter_by(movie_id=self._movie_id).one()
    if movie is None:  # movie was deleted in the meantime
        return add_movie_db(self, True)

    details = get_details(self)

    old_poster_md5 = movie.poster_md5
    new_poster_md5 = old_poster_md5
    if details['image']:
        if old_poster_md5 != details[
                'image']:  # details["image"] can contain MD5 or file path
            new_image_path = details['image']
            if not os.path.isfile(new_image_path):
                new_image_path = os.path.join(
                    self.locations['temp'], "poster_%s.jpg" % details['image'])
            if not os.path.isfile(new_image_path):
                log.warn("cannot read temporary file: %s", new_image_path)
            else:
                new_poster_md5 = gutils.md5sum(file(new_image_path, 'rb'))
                if session.query(db.Poster).filter_by(
                        md5sum=new_poster_md5).count() == 0:
                    try:
                        data = file(new_image_path, 'rb').read()
                    except Exception, e:
                        log.warning("cannot read poster data")
                        old_poster_md5 = new_poster_md5
                    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
Example #5
0
def update_movie(self):
    session = self.db.Session()

    if self._am_movie_id is not None:
        movie = session.query(db.Movie).filter_by(movie_id=self._am_movie_id).one()
    else:
        movie = session.query(db.Movie).filter_by(movie_id=self._movie_id).one()
    if movie is None: # movie was deleted in the meantime
        return add_movie_db(self, True)

    details = get_details(self)

    old_poster_md5 = movie.poster_md5
    new_poster_md5 = None
    if details['image'] and old_poster_md5 != details['image']: # details["image"] can contain MD5 or file path
        new_image_path = os.path.join(self.locations['temp'], "poster_%s.jpg" % details['image'])
        if not os.path.isfile(new_image_path):
            log.warn("cannot read temporary file: %s", new_image_path)
        else:
            new_poster_md5 = gutils.md5sum(file(new_image_path, 'rb'))
            if session.query(db.Poster).filter_by(md5sum=new_poster_md5).count() == 0:
                try:
                    data = file(new_image_path, 'rb').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)

                    # delete old image
                    import delete
                    old_poster = session.query(db.Poster).filter_by(md5sum=old_poster_md5).first()
                    if old_poster and len(old_poster.movies) == 1: # other movies are not using the same poster
                        session.delete(old_poster)
                        delete.delete_poster_from_cache(old_poster_md5, self.locations['posters'])
            else:
                details['poster_md5'] = new_poster_md5
Example #6
0
def update_image_from_memory(self, number, data):
    session = self.db.Session()
    try:
        loader = gtk.gdk.PixbufLoader()
        loader.write(data, len(data))
        loader.close()
        self.widgets["movie"]["picture"].set_from_pixbuf(
            loader.get_pixbuf().scale_simple(100, 140, gtk.gdk.INTERP_BILINEAR)
        )
    except Exception, e:
        log.error(str(e))
        gutils.error(_("Image is not valid."), self.widgets["window"])
        return False

    poster_md5 = gutils.md5sum(data)

    movie = session.query(db.Movie).filter_by(number=number).one()
    if poster_md5 == movie.poster_md5:
        log.debug("same MD5 sum, no need to update poster")
        return False

    old_poster_md5 = movie.poster_md5

    if session.query(db.Poster).filter_by(md5sum=poster_md5).count() == 0:
        poster = db.Poster(md5sum=poster_md5, data=data)
        session.add(poster)

    # update the md5 *after* all other queries (so that UPDATE will not be invoked)
    movie.poster_md5 = poster_md5
def upgrade_database(self, version, config):
    """Create new db or update existing one to current format"""
    b = self.session.bind
    if version == 0 or version is None:
        log.info('Creating new database...')
        # version is 0 or none only for new databases
        db.metadata.create_all(b)
        db.configuration_table.insert(bind=b).execute(param=u'version', value=unicode(self.version))
        db.media_table.insert(bind=b).execute(name=u'DVD')
        db.media_table.insert(bind=b).execute(name=u'DVD-R')
        db.media_table.insert(bind=b).execute(name=u'DVD-RW')
        db.media_table.insert(bind=b).execute(name=u'DVD+R')
        db.media_table.insert(bind=b).execute(name=u'DVD+RW')
        db.media_table.insert(bind=b).execute(name=u'DVD-RAM')
        db.media_table.insert(bind=b).execute(name=u'CD')
        db.media_table.insert(bind=b).execute(name=u'CD-RW')
        db.media_table.insert(bind=b).execute(name=u'VCD')
        db.media_table.insert(bind=b).execute(name=u'SVCD')
        db.media_table.insert(bind=b).execute(name=u'VHS')
        db.media_table.insert(bind=b).execute(name=u'BETACAM')
        db.media_table.insert(bind=b).execute(name=u'LaserDisc')
        db.media_table.insert(bind=b).execute(name=u'HD DVD')
        db.media_table.insert(bind=b).execute(name=u'Blu-ray')
        db.ratios_table.insert(bind=b).execute(name=u'16:9')
        db.ratios_table.insert(bind=b).execute(name=u'4:3')
        db.acodecs_table.insert(bind=b).execute(name=u'AC-3 Dolby audio')
        db.acodecs_table.insert(bind=b).execute(name=u'OGG')
        db.acodecs_table.insert(bind=b).execute(name=u'MP3')
        db.acodecs_table.insert(bind=b).execute(name=u'MPEG-1')
        db.acodecs_table.insert(bind=b).execute(name=u'MPEG-2')
        db.acodecs_table.insert(bind=b).execute(name=u'AAC')
        db.acodecs_table.insert(bind=b).execute(name=u'Windows Media Audio')
        db.vcodecs_table.insert(bind=b).execute(name=u'MPEG-1')
        db.vcodecs_table.insert(bind=b).execute(name=u'MPEG-2')
        db.vcodecs_table.insert(bind=b).execute(name=u'XviD')
        db.vcodecs_table.insert(bind=b).execute(name=u'DivX')
        db.vcodecs_table.insert(bind=b).execute(name=u'H.264')
        db.vcodecs_table.insert(bind=b).execute(name=u'RealVideo')
        db.vcodecs_table.insert(bind=b).execute(name=u'QuickTime')
        db.vcodecs_table.insert(bind=b).execute(name=u'Windows Media Video')
        db.achannels_table.insert(bind=b).execute(name=u'mono')
        db.achannels_table.insert(bind=b).execute(name=u'stereo')
        db.achannels_table.insert(bind=b).execute(name=u'5.1')
        db.achannels_table.insert(bind=b).execute(name=u'7.1')
        db.subformats_table.insert(bind=b).execute(name=u'DVD VOB')
        db.subformats_table.insert(bind=b).execute(name=u'MPL2 (.txt)')
        db.subformats_table.insert(bind=b).execute(name=u'MicroDVD (.sub)')
        db.subformats_table.insert(bind=b).execute(name=u'SubRip (.srt)')
        db.subformats_table.insert(bind=b).execute(name=u'SubViewer2 (.sub)')
        db.subformats_table.insert(bind=b).execute(name=u'Sub Station Alpha (.ssa)')
        db.subformats_table.insert(bind=b).execute(name=u'Advanced Sub Station Alpha (.ssa)')
        db.languages_table.insert(bind=b).execute(name=_('Brazilian Portuguese'))
        db.languages_table.insert(bind=b).execute(name=_('Bulgarian'))
        db.languages_table.insert(bind=b).execute(name=_('Catalan'))
        db.languages_table.insert(bind=b).execute(name=_('Czech'))
        db.languages_table.insert(bind=b).execute(name=_('Danish'))
        db.languages_table.insert(bind=b).execute(name=_('Dutch'))
        db.languages_table.insert(bind=b).execute(name=_('English'))
        db.languages_table.insert(bind=b).execute(name=_('Estonian'))
        db.languages_table.insert(bind=b).execute(name=_('French'))
        db.languages_table.insert(bind=b).execute(name=_('German'))
        db.languages_table.insert(bind=b).execute(name=_('Greek'))
        db.languages_table.insert(bind=b).execute(name=_('Hungarian'))
        db.languages_table.insert(bind=b).execute(name=_('Indonesian'))
        db.languages_table.insert(bind=b).execute(name=_('Italian'))
        db.languages_table.insert(bind=b).execute(name=_('Japanese'))
        db.languages_table.insert(bind=b).execute(name=_('Korean'))
        db.languages_table.insert(bind=b).execute(name=_('Norwegian Bokmal'))
        db.languages_table.insert(bind=b).execute(name=_('Occitan'))
        db.languages_table.insert(bind=b).execute(name=_('Pashto'))
        db.languages_table.insert(bind=b).execute(name=_('Polish'))
        db.languages_table.insert(bind=b).execute(name=_('Portuguese'))
        db.languages_table.insert(bind=b).execute(name=_('Russian'))
        db.languages_table.insert(bind=b).execute(name=_('Simplified Chinese'))
        db.languages_table.insert(bind=b).execute(name=_('Slovak'))
        db.languages_table.insert(bind=b).execute(name=_('Spanish'))
        db.languages_table.insert(bind=b).execute(name=_('Swedish'))
        db.languages_table.insert(bind=b).execute(name=_('Turkish'))
        db.tags_table.insert(bind=b).execute(name=_('Favourite'))
        db.tags_table.insert(bind=b).execute(name=_('Buy me'))
        return True # upgrade process finished
    #
    # next steps are only for existing databases with an outdated structure
    # not for new created databases
    #
    if version == 1: # fix changes between v1 and v2
        version += 1
        log.info("Upgrading database to version %d...", version)
        b.execute("UPDATE loans SET return_date='2007-01-01' WHERE return_date='None';")
        db_version = self.session.query(db.Configuration).filter_by(param=u'version').one()
        db_version.value = unicode(version)
        self.session.add(db_version)
        self.session.commit()
    if version == 2:    # fix changes between v2 and v3
        #e_type = self.session.bind.engine.dialect.name
        e_type = self.session.bind.name
        version += 1
        log.info("Upgrading database to version %d...", version)

        # create new table
        db.posters_table.create(checkfirst=True, bind=b)
        db.filters_table.create(checkfirst=True, bind=b)
        db.ratios_table.create(checkfirst=True, bind=b)
        db.ratios_table.insert(bind=b).execute(name=u'16:9')
        db.ratios_table.insert(bind=b).execute(name=u'4:3')

        log.info('... adding new columns')
        # common SQL statements
        queries = {'poster_md5': 'ALTER TABLE movies ADD poster_md5 VARCHAR(32) NULL REFERENCES posters(md5sum);',
                   'ratio_id'  : 'ALTER TABLE movies ADD ratio_id INTEGER NULL REFERENCES ratios(ratio_id);',
                   'screenplay': 'ALTER TABLE movies ADD screenplay VARCHAR(256) NULL;',
                   'cameraman' : 'ALTER TABLE movies ADD cameraman VARCHAR(256) NULL;'}
        # if needed some db specific SQL statements
        if e_type == 'mysql':
            pass
        elif e_type == 'mssql':
            pass
        for key, query in queries.items():
            try:
                self.session.bind.execute(query)
            except Exception, e:
                log.error("Cannot add '%s' column: %s", key, e)
                return False
        
        log.info('... saving posters in database')
        posters_dir = get_old_posters_location(self.data_dir, config, clean_config=True)
        updated = {}
        movies_table = db.metadata.tables['movies']
        for movie in self.session.query(db.Movie.image).all():
            poster_file_name = os.path.join(posters_dir, "%s.jpg" % movie.image)
            if poster_file_name in updated:
                continue
            if os.path.isfile(poster_file_name):
                poster_md5  = gutils.md5sum(file(poster_file_name, 'rb'))
                poster = self.session.query(db.Poster).filter_by(md5sum=poster_md5).first()
                if not poster:
                    poster = db.Poster(md5sum=poster_md5, data=file(poster_file_name, 'rb').read())
                    self.session.add(poster)

                update_query = movies_table.update(movies_table.c.image==movie.image, {'poster_md5': poster_md5, 'image': None}, bind=b)

                try:
                    # yeah, we're commiting inside the loop,
                    # it slows down the process a lot, but at least we can skip buggy posters
                    update_query.execute()
                    self.session.commit()
                except Exception, e:
                    self.session.rollback()
                    log.error(e)
                else:
                    updated[poster_file_name] = True
                    try:
                        os.remove(poster_file_name)
                    except:
                        log.warn("cannot remove %s", poster_file_name)
            else:
                log.warn("file not found: %s)", movie.image)
                update_query = movies_table.update(movies_table.c.image==movie.image, {'image': None}, bind=b)
                update_query.execute()
                updated[poster_file_name] = True
                    log.error("Cannot add '%s' column: %s", key, e)
                    return False
            except Exception, e:
                log.error("Cannot add '%s' column: %s", key, e)
                return False

        log.info('... saving posters in database')
        posters_dir = get_old_posters_location(self.data_dir, config, clean_config=True)
        updated = {}
        movies_table = db.metadata.tables['movies']
        for movie in self.session.query(db.Movie.image).all():
            poster_file_name = os.path.join(posters_dir, "%s.jpg" % movie.image)
            if poster_file_name in updated:
                continue
            if os.path.isfile(poster_file_name):
                poster_md5 = gutils.md5sum(file(poster_file_name, 'rb'))
                poster = self.session.query(db.Poster).filter_by(md5sum=poster_md5).first()
                if not poster:
                    poster = db.Poster(md5sum=poster_md5, data=file(poster_file_name, 'rb').read())
                    self.session.add(poster)

                update_query = movies_table.update(movies_table.c.image == movie.image, {'poster_md5': poster_md5, 'image': None}, bind=b)
                # deactivating a 0.12 feature
                save_update_onupdated = movies_table.c['updated'].onupdate
                movies_table.c['updated'].onupdate = None

                try:
                    # yeah, we're commiting inside the loop,
                    # it slows down the process a lot, but at least we can skip buggy posters
                    update_query.execute()
                    self.session.commit()
Example #9
0
    filename = gutils.file_chooser(_("Select image"), action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK), name="", folder=self.locations['desktop'], picture=True)
    if filename and filename[0]:
        filename = filename[0].decode('UTF-8')
        update_image(self, number, filename)

def update_image(self, number, filename):
    session = self.db.Session()
    try:
        self.widgets['movie']['picture'].set_from_pixbuf(\
                gtk.gdk.pixbuf_new_from_file(filename).scale_simple(100, 140, gtk.gdk.INTERP_BILINEAR))
    except Exception, e:
        log.error(str(e))
        gutils.error(self, _("Image is not valid."), self.widgets['window'])
        return False

    poster_md5 = gutils.md5sum(file(filename, 'rb'))

    movie = session.query(db.Movie).filter_by(number=number).one()
    old_poster_md5 = movie.poster_md5

    if session.query(db.Poster).filter_by(md5sum=poster_md5).count() == 0:
        poster = db.Poster(md5sum=poster_md5, data=file(filename, 'rb').read())
        session.add(poster)

    # update the md5 *after* all other queries (so that UPDATE will not be invoked)
    movie.poster_md5 = poster_md5
    
    if old_poster_md5:
        delete.delete_poster(self, old_poster_md5)

    session.add(movie)
Example #10
0

def update_image_from_memory(self, number, data):
    session = self.db.Session()
    try:
        loader = gtk.gdk.PixbufLoader()
        loader.write(data, len(data))
        loader.close()
        self.widgets['movie']['picture'].set_from_pixbuf(\
                loader.get_pixbuf().scale_simple(100, 140, gtk.gdk.INTERP_BILINEAR))
    except Exception, e:
        log.error(str(e))
        gutils.error(_("Image is not valid."), self.widgets['window'])
        return False

    poster_md5 = gutils.md5sum(data)

    movie = session.query(db.Movie).filter_by(number=number).one()
    if poster_md5 == movie.poster_md5:
        log.debug('same MD5 sum, no need to update poster')
        return False

    old_poster_md5 = movie.poster_md5

    if session.query(db.Poster).filter_by(md5sum=poster_md5).count() == 0:
        poster = db.Poster(md5sum=poster_md5, data=data)
        session.add(poster)

    # update the md5 *after* all other queries (so that UPDATE will not be invoked)
    movie.poster_md5 = poster_md5
Example #11
0
        filename = filename[0].decode("UTF-8")
        update_image(self, number, filename)


def update_image(self, number, filename):
    session = self.db.Session()
    try:
        self.widgets["movie"]["picture"].set_from_pixbuf(
            gtk.gdk.pixbuf_new_from_file(filename).scale_simple(100, 140, gtk.gdk.INTERP_BILINEAR)
        )
    except Exception, e:
        log.error(str(e))
        gutils.error(self, _("Image is not valid."), self.widgets["window"])
        return False

    poster_md5 = gutils.md5sum(file(filename, "rb"))

    movie = session.query(db.Movie).filter_by(number=number).one()
    old_poster_md5 = movie.poster_md5

    if session.query(db.Poster).filter_by(md5sum=poster_md5).count() == 0:
        poster = db.Poster(md5sum=poster_md5, data=file(filename, "rb").read())
        session.add(poster)

    # update the md5 *after* all other queries (so that UPDATE will not be invoked)
    movie.poster_md5 = poster_md5

    if old_poster_md5:
        delete.delete_poster(self, old_poster_md5)

    session.add(movie)
Example #12
0
                log.error("Cannot add '%s' column: %s", key, e)
                return False

        log.info('... saving posters in database')
        posters_dir = get_old_posters_location(self.data_dir,
                                               config,
                                               clean_config=True)
        updated = {}
        movies_table = db.metadata.tables['movies']
        for movie in self.session.query(db.Movie.image).all():
            poster_file_name = os.path.join(posters_dir,
                                            "%s.jpg" % movie.image)
            if poster_file_name in updated:
                continue
            if os.path.isfile(poster_file_name):
                poster_md5 = gutils.md5sum(file(poster_file_name, 'rb'))
                poster = self.session.query(
                    db.Poster).filter_by(md5sum=poster_md5).first()
                if not poster:
                    poster = db.Poster(md5sum=poster_md5,
                                       data=file(poster_file_name,
                                                 'rb').read())
                    self.session.add(poster)

                update_query = movies_table.update(
                    movies_table.c.image == movie.image, {
                        'poster_md5': poster_md5,
                        'image': None
                    },
                    bind=b)
                # deactivating a 0.12 feature
def upgrade_database(self, version, config):
    """Create new db or update existing one to current format"""
    b = self.engine
    if version == 0 or version is None:
        log.info("Creating new database...")
        # version is 0 or none only for new databases
        db.metadata.create_all(b)
        db.tables.configuration.insert(bind=b).execute(param=u"version", value=unicode(self.version))
        db.tables.media.insert(bind=b).execute(name=u"DVD")
        db.tables.media.insert(bind=b).execute(name=u"DVD-R")
        db.tables.media.insert(bind=b).execute(name=u"DVD-RW")
        db.tables.media.insert(bind=b).execute(name=u"DVD+R")
        db.tables.media.insert(bind=b).execute(name=u"DVD+RW")
        db.tables.media.insert(bind=b).execute(name=u"DVD-RAM")
        db.tables.media.insert(bind=b).execute(name=u"CD")
        db.tables.media.insert(bind=b).execute(name=u"CD-RW")
        db.tables.media.insert(bind=b).execute(name=u"VCD")
        db.tables.media.insert(bind=b).execute(name=u"SVCD")
        db.tables.media.insert(bind=b).execute(name=u"VHS")
        db.tables.media.insert(bind=b).execute(name=u"BETACAM")
        db.tables.media.insert(bind=b).execute(name=u"LaserDisc")
        db.tables.media.insert(bind=b).execute(name=u"HD DVD")
        db.tables.media.insert(bind=b).execute(name=u"Blu-ray")
        db.tables.ratios.insert(bind=b).execute(name=u"16:9")
        db.tables.ratios.insert(bind=b).execute(name=u"16:10")
        db.tables.ratios.insert(bind=b).execute(name=u"4:3")
        db.tables.acodecs.insert(bind=b).execute(name=u"AC-3 Dolby audio")
        db.tables.acodecs.insert(bind=b).execute(name=u"OGG")
        db.tables.acodecs.insert(bind=b).execute(name=u"MP3")
        db.tables.acodecs.insert(bind=b).execute(name=u"MPEG-1")
        db.tables.acodecs.insert(bind=b).execute(name=u"MPEG-2")
        db.tables.acodecs.insert(bind=b).execute(name=u"AAC")
        db.tables.acodecs.insert(bind=b).execute(name=u"Windows Media Audio")
        db.tables.vcodecs.insert(bind=b).execute(name=u"MPEG-1")
        db.tables.vcodecs.insert(bind=b).execute(name=u"MPEG-2")
        db.tables.vcodecs.insert(bind=b).execute(name=u"XviD")
        db.tables.vcodecs.insert(bind=b).execute(name=u"DivX")
        db.tables.vcodecs.insert(bind=b).execute(name=u"H.264")
        db.tables.vcodecs.insert(bind=b).execute(name=u"RealVideo")
        db.tables.vcodecs.insert(bind=b).execute(name=u"QuickTime")
        db.tables.vcodecs.insert(bind=b).execute(name=u"Windows Media Video")
        db.tables.achannels.insert(bind=b).execute(name=u"mono")
        db.tables.achannels.insert(bind=b).execute(name=u"stereo")
        db.tables.achannels.insert(bind=b).execute(name=u"5.1")
        db.tables.achannels.insert(bind=b).execute(name=u"7.1")
        db.tables.subformats.insert(bind=b).execute(name=u"DVD VOB")
        db.tables.subformats.insert(bind=b).execute(name=u"MPL2 (.txt)")
        db.tables.subformats.insert(bind=b).execute(name=u"MicroDVD (.sub)")
        db.tables.subformats.insert(bind=b).execute(name=u"SubRip (.srt)")
        db.tables.subformats.insert(bind=b).execute(name=u"SubViewer2 (.sub)")
        db.tables.subformats.insert(bind=b).execute(name=u"Sub Station Alpha (.ssa)")
        db.tables.subformats.insert(bind=b).execute(name=u"Advanced Sub Station Alpha (.ssa)")
        db.tables.languages.insert(bind=b).execute(name=_("Brazilian Portuguese"))
        db.tables.languages.insert(bind=b).execute(name=_("Bulgarian"))
        db.tables.languages.insert(bind=b).execute(name=_("Catalan"))
        db.tables.languages.insert(bind=b).execute(name=_("Czech"))
        db.tables.languages.insert(bind=b).execute(name=_("Danish"))
        db.tables.languages.insert(bind=b).execute(name=_("Dutch"))
        db.tables.languages.insert(bind=b).execute(name=_("English"))
        db.tables.languages.insert(bind=b).execute(name=_("Estonian"))
        db.tables.languages.insert(bind=b).execute(name=_("French"))
        db.tables.languages.insert(bind=b).execute(name=_("German"))
        db.tables.languages.insert(bind=b).execute(name=_("Greek"))
        db.tables.languages.insert(bind=b).execute(name=_("Hungarian"))
        db.tables.languages.insert(bind=b).execute(name=_("Indonesian"))
        db.tables.languages.insert(bind=b).execute(name=_("Italian"))
        db.tables.languages.insert(bind=b).execute(name=_("Japanese"))
        db.tables.languages.insert(bind=b).execute(name=_("Korean"))
        db.tables.languages.insert(bind=b).execute(name=_("Norwegian Bokmal"))
        db.tables.languages.insert(bind=b).execute(name=_("Occitan"))
        db.tables.languages.insert(bind=b).execute(name=_("Pashto"))
        db.tables.languages.insert(bind=b).execute(name=_("Polish"))
        db.tables.languages.insert(bind=b).execute(name=_("Portuguese"))
        db.tables.languages.insert(bind=b).execute(name=_("Russian"))
        db.tables.languages.insert(bind=b).execute(name=_("Simplified Chinese"))
        db.tables.languages.insert(bind=b).execute(name=_("Slovak"))
        db.tables.languages.insert(bind=b).execute(name=_("Spanish"))
        db.tables.languages.insert(bind=b).execute(name=_("Swedish"))
        db.tables.languages.insert(bind=b).execute(name=_("Turkish"))
        db.tables.tags.insert(bind=b).execute(name=_("Favourite"))
        db.tables.tags.insert(bind=b).execute(name=_("Buy me"))
        return True  # upgrade process finished
    #
    # next steps are only for existing databases with an outdated structure
    # not for new created databases
    #
    if version == 1:  # fix changes between v1 and v2
        version += 1
        log.info("Upgrading database to version %d...", version)
        b.execute("UPDATE loans SET return_date='2007-01-01' WHERE return_date='None';")
        db_version = self.session.query(db.Configuration).filter_by(param=u"version").one()
        db_version.value = unicode(version)
        self.session.add(db_version)
        self.session.commit()
    if version == 2:  # fix changes between v2 and v3
        # e_type = self.session.bind.engine.dialect.name
        e_type = self.session.bind.name
        version += 1
        log.info("Upgrading database to version %d...", version)

        # create new table
        db.tables.posters.create(checkfirst=True, bind=b)
        db.tables.filters.create(checkfirst=True, bind=b)
        db.tables.ratios.create(checkfirst=True, bind=b)
        db.tables.ratios.insert(bind=b).execute(name=u"16:9")
        db.tables.ratios.insert(bind=b).execute(name=u"4:3")

        log.info("... adding new columns")
        # common SQL statements
        queries = {
            "poster_md5": "ALTER TABLE movies ADD poster_md5 VARCHAR(32) NULL REFERENCES posters(md5sum);",
            "ratio_id": "ALTER TABLE movies ADD ratio_id INTEGER NULL REFERENCES ratios(ratio_id);",
            "screenplay": "ALTER TABLE movies ADD screenplay VARCHAR(256) NULL;",
            "cameraman": "ALTER TABLE movies ADD cameraman VARCHAR(256) NULL;",
        }
        # if needed some db specific SQL statements
        if e_type == "mysql":
            pass
        elif e_type == "mssql":
            pass
        for key, query in queries.items():
            try:
                self.session.bind.execute(query)
            except Exception, e:
                log.error("Cannot add '%s' column: %s", key, e)
                return False

        log.info("... saving posters in database")
        posters_dir = get_old_posters_location(self.data_dir, config, clean_config=True)
        updated = {}
        movies_table = db.metadata.tables["movies"]
        for movie in self.session.query(db.Movie.image).all():
            poster_file_name = os.path.join(posters_dir, "%s.jpg" % movie.image)
            if poster_file_name in updated:
                continue
            if os.path.isfile(poster_file_name):
                poster_md5 = gutils.md5sum(file(poster_file_name, "rb"))
                poster = self.session.query(db.Poster).filter_by(md5sum=poster_md5).first()
                if not poster:
                    poster = db.Poster(md5sum=poster_md5, data=file(poster_file_name, "rb").read())
                    self.session.add(poster)

                update_query = movies_table.update(
                    movies_table.c.image == movie.image, {"poster_md5": poster_md5, "image": None}, bind=b
                )

                try:
                    # yeah, we're commiting inside the loop,
                    # it slows down the process a lot, but at least we can skip buggy posters
                    update_query.execute()
                    self.session.commit()
                except Exception, e:
                    self.session.rollback()
                    log.error(e)
                else:
                    updated[poster_file_name] = True
                    try:
                        os.remove(poster_file_name)
                    except:
                        log.warn("cannot remove %s", poster_file_name)
            else:
                log.warn("file not found: %s)", movie.image)
                update_query = movies_table.update(movies_table.c.image == movie.image, {"image": None}, bind=b)
                update_query.execute()
                updated[poster_file_name] = True