diff --git a/plexpy/__init__.py b/plexpy/__init__.py index 335eb2b5..1e526a15 100644 --- a/plexpy/__init__.py +++ b/plexpy/__init__.py @@ -333,6 +333,8 @@ def initialize_scheduler(): schedule_job(pmsconnect.refresh_libraries, 'Refresh libraries list', hours=hours, minutes=0, seconds=0) + schedule_job(database.make_backup, 'Backup PlexPy database', hours=6, minutes=0, seconds=0, args=(True,)) + # Start scheduler if start_jobs and len(SCHED.get_jobs()): try: @@ -344,7 +346,7 @@ def initialize_scheduler(): #SCHED.print_jobs() -def schedule_job(function, name, hours=0, minutes=0, seconds=0): +def schedule_job(function, name, hours=0, minutes=0, seconds=0, args=None): """ Start scheduled job if starting or restarting plexpy. Reschedule job if Interval Settings have changed. @@ -359,11 +361,11 @@ def schedule_job(function, name, hours=0, minutes=0, seconds=0): logger.info("Removed background task: %s", name) elif job.trigger.interval != datetime.timedelta(hours=hours, minutes=minutes): SCHED.reschedule_job(name, trigger=IntervalTrigger( - hours=hours, minutes=minutes, seconds=seconds)) + hours=hours, minutes=minutes, seconds=seconds), args=args) logger.info("Re-scheduled background task: %s", name) elif hours > 0 or minutes > 0 or seconds > 0: SCHED.add_job(function, id=name, trigger=IntervalTrigger( - hours=hours, minutes=minutes, seconds=seconds)) + hours=hours, minutes=minutes, seconds=seconds), args=args) logger.info("Scheduled background task: %s", name) diff --git a/plexpy/common.py b/plexpy/common.py index fb2af6c9..22716140 100644 --- a/plexpy/common.py +++ b/plexpy/common.py @@ -64,7 +64,8 @@ SCHEDULER_LIST = ['Check GitHub for updates', 'Check for recently added items', 'Check for Plex remote access', 'Refresh users list', - 'Refresh libraries list' + 'Refresh libraries list', 'Refresh Plex server URLs', 'Refresh Plex server name', + 'Backup PlexPy database' ] \ No newline at end of file diff --git a/plexpy/database.py b/plexpy/database.py index b5f33c21..45dbf695 100644 --- a/plexpy/database.py +++ b/plexpy/database.py @@ -47,7 +47,7 @@ def db_filename(filename="plexpy.db"): def make_backup(cleanup=False): - """ Makes a backup of db, removes all but the last 3 backups """ + """ Makes a backup of db, removes all but the last 5 backups """ backupfolder = plexpy.CONFIG.BACKUP_DIR backup_file = 'plexpy.backup-%s.db' % int(time.time()) @@ -63,22 +63,22 @@ def make_backup(cleanup=False): db.connection.rollback() if cleanup: - # Delete all backup files except from the last 3. + # Delete all backup files except from the last 5. for root, dirs, files in os.walk(backupfolder): - if len(files) > 3: - all_files = [os.path.join(root, f) for f in files] - backups_sorted_on_age = sorted(all_files, key=os.path.getctime, reverse=True) - for file_ in backups_sorted_on_age[3:]: + db_files = [os.path.join(root, f) for f in files if f.endswith('.db')] + if len(db_files) > 5: + backups_sorted_on_age = sorted(db_files, key=os.path.getctime, reverse=True) + for file_ in backups_sorted_on_age[5:]: try: os.remove(file_) except OSError as e: - logger.error('Failed to delete %s from the backup folder %s' % (file_, e)) + logger.error(u"PlexPy Database :: Failed to delete %s from the backup folder: %s" % (file_, e)) if backup_file in os.listdir(backupfolder): - logger.debug('Successfully backup of the %s to %s in %s' % (db_filename(), backup_file, backupfolder)) + logger.debug(u"PlexPy Database :: Successfully backed up %s to %s" % (db_filename(), backup_file)) return True else: - logger.debug('Failed to make backup of %s to %s in %s' % (db_filename(), backup_file, backupfolder)) + logger.warn(u"PlexPy Database :: Failed to backup %s to %s" % (db_filename(), backup_file)) return False @@ -131,15 +131,15 @@ class MonitorDatabase(object): except sqlite3.OperationalError, e: if "unable to open database file" in e.message or "database is locked" in e.message: - logger.warn('Database Error: %s', e) + logger.warn(u"PlexPy Database :: Database Error: %s", e) attempts += 1 time.sleep(1) else: - logger.error('Database error: %s', e) + logger.error(u"PlexPy Database :: Database error: %s", e) raise except sqlite3.DatabaseError, e: - logger.error('Fatal Error executing %s :: %s', query, e) + logger.error(u"PlexPy Database :: Fatal Error executing %s :: %s", query, e) raise return sql_result @@ -183,7 +183,7 @@ class MonitorDatabase(object): try: self.action(insert_query, value_dict.values() + key_dict.values()) except sqlite3.IntegrityError: - logger.info('Queries failed: %s and %s', update_query, insert_query) + logger.info(u"PlexPy Database :: Queries failed: %s and %s", update_query, insert_query) # We want to know if it was an update or insert return trans_type