Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- # MythKiwi Bulk Meta Grabber
- # Version: 0.3
- # Author: Hayden Lovett
- # Website: mythkiwi.com
- #TODO Show which movie is being worked on
- #TODO if MPlayer is not installed and is needed, prompt for install
- #TODO create folder.jpg posters for each folder
- #TODO make password last on the string when calling programs incase they are empty
- import sys
- import os
- import datetime
- import pygtk
- pygtk.require("2.0")
- import gtk
- import gtk.glade
- import MySQLdb
- import fileinput
- import os.path
- #import fnmatch
- #import time
- #import vte
- #import types
- #import csv
- ####################################################################
- class metaupdate:
- def __init__(self):
- #Define some variable defaults
- self.getAll = 0
- self.getMissing = 1
- self.defaultsw = 1
- self.defaultswitch = "-Default"
- self.backupmysql = 1
- self.includeMovies = 1
- self.includeTVshows = 1
- self.homepath = os.getenv("HOME")
- #Set the Glade file
- if os.path.exists('MythKiwi Bulk Meta Grabber/data/GUI.glade'):
- self.gladefile = "MythKiwi Bulk Meta Grabber/data/GUI.glade"
- else:
- self.gladefile = "data/GUI.glade"
- self.wTree = gtk.glade.XML(self.gladefile)
- #Define glade objects to use in script
- #Make Video List editable
- self.videolistText = self.wTree.get_widget("videolist")
- #Make TV Show list editable
- self.tvlistText = self.wTree.get_widget("tvlist")
- self.quit = gtk.main_quit
- #Define text entry boxes
- self.mysqlUsername = gtk.Entry(max=0)
- self.mysqlPassword = gtk.Entry(max=0)
- self.mysqlHost = gtk.Entry(max=0)
- self.mysqlDatabase = gtk.Entry(max=0)
- #mysql test images for mysql page and tab
- self.testsuccess = self.wTree.get_widget("testsuccess")
- self.testfailed = self.wTree.get_widget("testfailed")
- self.testsuccess1 = self.wTree.get_widget("testsuccess1")
- self.testfailed1 = self.wTree.get_widget("testfailed1")
- #Save Mysql Window
- self.saveWindow = self.wTree.get_widget("saveWindow")
- self.chooseSave = self.wTree.get_widget("chooseSave")
- #Restore MysqlWindow
- self.restoreWindow = self.wTree.get_widget("restoreWindow")
- self.chooseRestore = self.wTree.get_widget("chooseRestore")
- #Create our dictionary and connect it
- dic = { #"on_skywizard_clicked" : self.skywizard,
- "on_backupmysql_toggled" : self.backupmysql_toggle,
- "on_getmysql_clicked" : self.getmysql,
- "on_testmysql_clicked" : self.testmysql,
- "on_closeAbout_clicked" : self.close_about,
- "on_about1_clicked" : self.about_clicked,
- "on_apply_clicked" : self.startProgram,
- "on_usefirst_toggled" : self.usefirst_toggled,
- "on_scanVideos_clicked" : self.scanVideos,
- "on_allVideos_toggled" : self.getallvideos,
- "on_missingVideos_toggled" : self.getvideoswithout,
- "on_movies_toggled" : self.includemovies_toggled,
- "on_tvshow_toggled" : self.includeTVshows_toggled,
- "on_restoreMysql_clicked" : self.restoreMysql_clicked,
- "on_closeRestoreMysql_clicked" : self.close_restoreWindow,
- "on_closeSaveMysql_clicked" : self.close_saveWindow,
- "on_restoreApply_clicked" : self.restoreApply,
- "on_backupMysql_clicked" : self.backupMysql,
- "on_saveApply_clicked" : self.saveApply,
- "on_ProgClose_clicked" : self.ProgClose_clicked,
- "on_quit_clicked" : self.quit,
- "on_MainWindow_destroy" : self.quit,}
- self.wTree.signal_autoconnect(dic)
- #Call Subroutines to Get MySQL Login Info and test it
- self.getmysql(self)
- self.testmysql(self)
- #As default load all videos without data
- self.getvideos(self)
- self.gettvshows(self)
- ###############################################################################
- # default option toggled
- def usefirst_toggled(self, widget):
- if (self.defaultsw == 1):
- print "Default Option Disabled"
- self.defaultsw = 0
- self.defaultswitch = " "
- else:
- print "Using Default option"
- self.defaultsw = 1
- self.defaultswitch = "-Default"
- # Get ALL
- def getallvideos(self, widget):
- if (self.getAll == 1):
- self.getAll = 0
- else:
- self.getAll = 1
- print "Will get Metadata for ALL titles selected"
- # Get without
- def getvideoswithout(self, widget):
- if (self.getMissing == 1):
- self.getMissing = 0
- else:
- self.getMissing = 1
- print "Will get Metadata only for titles that don't already have data"
- # Include Movies
- def includemovies_toggled(self, widget):
- if (self.includeMovies == 1):
- self.includeMovies = 0
- print "Movies not included"
- else:
- self.includeMovies = 1
- print "Movies included"
- # Include TV shows
- def includeTVshows_toggled(self, widget):
- if (self.includeTVshows == 1):
- self.includeTVshows = 0
- print "TV Shows not included"
- else:
- self.includeTVshows = 1
- print "TV Shows included"
- # Scan for new videos added to MythVideo
- def scanVideos(self, widget):
- print "Checking for new videos to add to the database"
- os.system('python data/newvideo.py %s %s %s %s &'% (self.mysqlUsername, self.mysqlDatabase, self.mysqlHost, self.mysqlPassword))
- #TODO check and remove deleted files
- # Quit the program and close the database
- def quit(self, widget):
- print "Disconnected from database"
- self.cursor.close()
- self.db.close()
- self.quit
- ######################################################################
- # Get list of videos
- def getvideos(self, widget):
- #fill in Videos missing data area
- self.videolistText.get_buffer().insert(self.videolistText.get_buffer().get_end_iter(), "Videos Missing Data")
- self.cursor.execute("SELECT title FROM videometadata WHERE inetref='00000000' AND (filename NOT LIKE '% s__e__%' or filename NOT Like '%.s__e__%' or filename NOT Like '%/s__e__%')")
- row = self.cursor.fetchone()
- while row is not None:
- row = ", ".join([str(c) for c in row])
- self.videolistText.get_buffer().insert(self.videolistText.get_buffer().get_end_iter(), "\n" + row)
- row = self.cursor.fetchone()
- #Fill in Already has metadata area
- self.videolistText.get_buffer().insert(self.videolistText.get_buffer().get_end_iter(), "\n\n" + "====================\nTitles Already with Data")
- self.cursor.execute("SELECT title FROM videometadata WHERE inetref!='00000000' AND not (filename LIKE '% s__e__%' or filename Like '%.s__e__%' or filename Like '%/s__e__%')")
- row = self.cursor.fetchone()
- while row is not None:
- row = ", ".join([str(c) for c in row])
- self.videolistText.get_buffer().insert(self.videolistText.get_buffer().get_end_iter(), "\n" + row)
- row = self.cursor.fetchone()
- # Get list of TV Shows without data
- def gettvshows(self, widget):
- self.cursor.execute("SELECT title FROM videometadata WHERE plot LIKE 'None' AND (filename LIKE '% s__e__%' or filename Like '%.s__e__%' or filename Like '%/s__e__%')")
- row = self.cursor.fetchone()
- self.tvlistText.get_buffer().insert(self.tvlistText.get_buffer().get_end_iter(), "Titles Missing Data")
- while row is not None:
- row = ", ".join([str(c) for c in row])
- self.tvlistText.get_buffer().insert(self.tvlistText.get_buffer().get_end_iter(), "\n" + row)
- row = self.cursor.fetchone()
- #TV shows with data
- self.cursor.execute("SELECT title FROM videometadata WHERE plot NOT LIKE 'None' AND (filename LIKE '% s__e__%' or filename Like '%.s__e__%' or filename Like '%/s__e__%')")
- row = self.cursor.fetchone()
- self.tvlistText.get_buffer().insert(self.tvlistText.get_buffer().get_end_iter(), "\n\n" + "====================\nTitles Already with Data")
- while row is not None:
- row = ", ".join([str(c) for c in row])
- self.tvlistText.get_buffer().insert(self.tvlistText.get_buffer().get_end_iter(), "\n" + row)
- row = self.cursor.fetchone()
- ##########################################
- ######### MySQL Login Section ############
- # Get Mysql Login info from either 1 of 3 locations used by different distros
- def getmysql(self, widget):
- if os.path.exists('%s/.mythtv/mysql.txt' % (self.homepath)):
- mysqllogin = file('%s/.mythtv/mysql.txt' % (self.homepath))
- elif os.path.exists('/usr/share/mythtv/mysql.txt'):
- mysqllogin = file('/usr/share/mythtv/mysql.txt')
- else: mysqllogin = file('/etc/mythtv/mysql.txt')
- for line in mysqllogin:
- if 'DBHostName=' in line:
- self.mysqlHost = line.replace('DBHostName=','')
- self.mysqlHost = self.mysqlHost.replace('\n','')
- lbl = self.wTree.get_widget('mysqlHost')
- lbl.set_text(self.mysqlHost)
- if 'DBUserName=' in line:
- self.mysqlUsername = line.replace('DBUserName=','')
- self.mysqlUsername = self.mysqlUsername.replace('\n','')
- lbl = self.wTree.get_widget('mysqlUsername')
- lbl.set_text(self.mysqlUsername)
- if 'DBName=' in line:
- self.mysqlDatabase = line.replace('DBName=','')
- self.mysqlDatabase = self.mysqlDatabase.replace('\n','')
- lbl = self.wTree.get_widget('mysqlDatabase')
- lbl.set_text(self.mysqlDatabase)
- if 'DBPassword=' in line:
- self.mysqlPassword = line.replace('DBPassword=','')
- self.mysqlPassword = self.mysqlPassword.replace('\n','')
- lbl = self.wTree.get_widget('mysqlPassword')
- lbl.set_text(self.mysqlPassword)
- # Make initial connectin to database and Test MySQL connection
- def testmysql(self, widget):
- #Get connection details from gui
- self.mysqlUsername = self.wTree.get_widget("mysqlUsername").get_text()
- self.mysqlPassword = self.wTree.get_widget("mysqlPassword").get_text()
- self.mysqlDatabase = self.wTree.get_widget("mysqlDatabase").get_text()
- self.mysqlHost = self.wTree.get_widget("mysqlHost").get_text()
- try:
- self.db = MySQLdb.connect(host=self.mysqlHost, user=self.mysqlUsername, passwd=self.mysqlPassword,db=self.mysqlDatabase)
- self.cursor = self.db.cursor()
- self.cursor.execute("SELECT NULL")
- result = self.cursor.fetchone()
- lbl = self.wTree.get_widget('testresult')
- lbl.set_text('SUCCESS')
- self.testsuccess.show()
- self.testsuccess1.show()
- self.testfailed.hide()
- self.testfailed1.hide()
- except:
- lbl = self.wTree.get_widget('testresult')
- lbl.set_text('Failed')
- self.testsuccess.hide()
- self.testsuccess1.hide()
- self.testfailed.show()
- self.testfailed1.show()
- # Toggle Backup MySQL option
- def backupmysql_toggle(self, widget):
- if (self.backupmysql == 1):
- self.backupmysql=0
- else:
- self.backupmysql=1
- # Open Backup window
- def backupMysql(self, widget):
- self.saveWindow.show()
- # Apply on Mysql backup window clicked
- def saveApply(self, widget):
- saveFile = self.chooseSave.get_filename()
- os.system("""mysqldump -u %s -p%s %s > '%s';""" % (self.mysqlUsername, self.mysqlPassword, self.mysqlDatabase, saveFile))
- os.system("""chmod 777 '%s'""" % (saveFile))
- print "Saved database as %s" % (saveFile)
- self.saveWindow.hide()
- # Close Save Window
- def close_saveWindow(self, widget):
- self.saveWindow.hide()
- # Open Restore Mysql window
- def restoreMysql_clicked(self, widget):
- self.restoreWindow.show()
- # Apply on Restore window clicked
- def restoreApply(self, widget):
- restoreFile = self.chooseRestore.get_filename()
- os.system("""mysql -u %s -p%s %s < '%s';""" % (self.mysqlUsername, self.mysqlPassword, self.mysqlDatabase, restoreFile))
- print "Restored MySQL Database file %s"% (restoreFile)
- self.restoreWindow.hide()
- # Close Restore window
- def close_restoreWindow(self, widget):
- self.restoreWindow.hide()
- ####################################################################################
- # Open About Window
- def about_clicked(self, widget):
- about = self.wTree.get_widget("aboutWindow")
- about.show ()
- # Close About Window
- def close_about(self, widget):
- about = self.wTree.get_widget("aboutWindow")
- about.hide()
- # Close Progress screen clicked
- def ProgClose_clicked(self, widget):
- progress = self.wTree.get_widget("Progress")
- progress.hide()
- ############################################################################################
- # When APPLY is pressed
- def startProgram(self, widget):
- # Opening Progress Window
- #progress = self.wTree.get_widget("Progress")
- #progress.show()
- #Create Datestamp Variable
- now = datetime.datetime.now()
- datestamp = "%s:%s-%s-%s"% (now.date(), now.hour, now.minute, now.second)
- #Backup Mysql Database
- if (self.backupmysql == 1):
- print "Backing up database to %s/%s.sql" % (self.homepath, datestamp)
- os.system('mysqldump -u %s -p%s %s > %s/%s.sql;' % (self.mysqlUsername, self.mysqlPassword, self.mysqlDatabase, self.homepath, datestamp))
- else:
- print "MySQL Database is not being backed up"
- #Make MythVideo Poster folder if it doesnt exist
- self.cursor.execute("SELECT data FROM settings WHERE value='VideoArtworkDir'")
- result = self.cursor.fetchone()
- VideoArtworkDir = ", ".join([str(c) for c in result])
- if os.path.exists('%s' % (VideoArtworkDir)):
- print 'Using Video Poster Path %s'% (VideoArtworkDir)
- else:
- print 'Creating new Video Poster Folder at %s'% (VideoArtworkDir)
- os.system("mkdir %s" % (VideoArtworkDir))
- if not os.path.exists('%s' % (VideoArtworkDir)):
- print "\n\nThe Video Poster folder is not writable. \ntype in a terminal \nsudo mkdir %s\n\n" % (VideoArtworkDir)
- sys.exit()
- #Get MythVideo storage directory
- self.cursor.execute("SELECT data FROM settings WHERE value='VideoStartupDir'")
- result = self.cursor.fetchone()
- VideoDir = ", ".join([str(c) for c in result])
- # Get Metadata for selected videos
- if (self.includeMovies == 1):
- if (self.getMissing == 1):
- self.cursor.execute("SELECT title FROM videometadata WHERE inetref='00000000' AND title NOT LIKE '% s__e__%' and title Not Like '%.s__e__%' and title Not Like '%/s__e__%'")
- elif (self.getAll == 1):
- self.cursor.execute("SELECT title FROM videometadata WHERE title not Like '% s__e__%' and title Not Like '%.s__e__%' and title Not Like '%/s__e__%'")
- row = self.cursor.fetchone()
- while row is not None:
- row = ", ".join([str(c) for c in row])
- if os.path.exists('scripts/imdb-bulk-update.pl'):
- os.system('perl scripts/imdb-bulk-update.pl -A -Host %s -User %s -Password %s -Title "%s" %s' % (self.mysqlHost, self.mysqlUsername, self.mysqlPassword, row, self.defaultswitch))
- else:
- os.system("perl 'Mythkiwi Bulk Meta Grabber/scripts/imdb-bulk-update.pl' -A -Host %s -User %s -Password %s -Title '%s' %s" % (self.mysqlHost, self.mysqlUsername, self.mysqlPassword, row, self.defaultswitch))
- row = self.cursor.fetchone()
- #Get data for TV shows
- if (self.includeTVshows == 1):
- if (self.getMissing == 1):
- self.cursor.execute("SELECT filename FROM videometadata WHERE inetref='00000000' AND (filename LIKE '% s__e__%' or filename Like '%.s__e__%' or filename Like '%/s__e__%')")
- elif (self.getAll == 1):
- self.cursor.execute("SELECT filename FROM videometadata WHERE filename LIKE '% s__e__%' or filename Like '%.s__e__%' or filename Like '%/s__e__%'")
- row = self.cursor.fetchone()
- while row is not None:
- row = ", ".join([str(c) for c in row])
- (dirName, fileName) = os.path.split(row)
- (fileBaseName, fileExtension) = os.path.splitext(fileName)
- #make poster first using MPlayer
- os.system("mplayer -ss 00:6:20 -nosound -frames 1 -vf scale=400:-2 -vo jpeg:quality=95 '%s'"% (row))
- os.system("mv -f 00000001.jpg '%s/%s.jpg'"% (VideoArtworkDir, fileBaseName))
- if os.path.exists('MythKiwi Bulk Meta Grabber/scripts/ragetvgrab-0.7.pl'):
- os.system("perl 'MythKiwi Bulk Meta Grabber/scripts/ragetvgrab-0.7.pl' -import -mythvideo -F '%s' -coverfile '%s/%s.jpg'" % (row, VideoArtworkDir, fileBaseName))
- else:
- os.system("perl scripts/ragetvgrab-0.7.pl -import -mythvideo -F '%s' -coverfile '%s/%s.jpg'" % (row, VideoArtworkDir, fileBaseName))
- row = self.cursor.fetchone()
- print "\n\n============================================================================="
- print "All tasks completed"
- print "\nFor updates or to check out our other MythTV software head to mythkiwi.com"
- print "Any questions or feedback post on the forum\n\n"
- if __name__ == "__main__":
- hwg = metaupdate()
- gtk.main()
Advertisement
Add Comment
Please, Sign In to add comment