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)
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)
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)
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
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
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()
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)
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
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)
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