def execute(): print 'Connecting to MySQL...' db = DB('mymusic32') print 'Loading data...' paths = db.perform_sql('select distinct(strPath) from songview;') print 'Scanning dirs...' dirs = [] for path in paths: for key, value in REPLACEMENTS.iteritems(): local_path = path.replace(key, value) if not any(directory in path for directory in EXCLUDE): try: dirs.append({'time': os.path.getctime(local_path), 'orig_path': path}) except Exception: pass dirs = sorted(dirs, key=lambda k: k['time']) i = 0 start_id = int(db.perform_sql( 'SELECT idAlbum from songview ORDER BY idAlbum DESC LIMIT 1;')[0]) print 'Beginning to re-order album IDs, beginning with idAlbum={0}'.format(start_id + 1) for directory in dirs: i += 1 new_id = start_id + i strPath = db.escape_string(directory['orig_path']) sql = 'select idAlbum from songview where strPath="{0}";' strPath_album_ids = db.perform_sql(sql.format(strPath)) try: assert(all(strPath_album_ids[0] == album_id for album_id in strPath_album_ids)) except AssertionError: print 'Multiple album IDs for media in {0}'.format(strPath) continue for table in ['album', 'albuminfo', 'album_artist', 'album_genre', 'song']: sql = 'update {table} set idAlbum={new} where idAlbum={old};' db.perform_sql(sql.format(table=table, new=new_id, old=strPath_album_ids[0])) sql = 'update {table} set media_id={new} where media_id={old};' db.perform_sql(sql.format(table='art', new=new_id, old=strPath_album_ids[0])) if i % 100 == 0: print 'Processed {0} of {1} albums'.format(i, len(dirs)) db.perform_sql('alter table album auto_increment={0};'.format(i+start_id+1)) print 'Done!'
update_data = {} if rating > 0: update_data['rating'] = int(rating) if play_count > 0: update_data['play_count'] = play_count if last_played != 'N/A': update_data['last_played'] = last_played if update_data and update_data != last_sync.get(path, {}): path_split = path.split('/') del path_split[0] strPath = u'smb://192.168.92.20/' + u'/'.join(path_split[:-1]).replace('"', '\\"') + '/' strFileName = path_split[-1].replace('"', '\\"') sqlstrings = [] if update_data.get('rating'): sqlstrings.append(u'rating = {0}'.format(update_data['rating'])) if update_data.get('play_count'): plays_since_last_sync = update_data['play_count'] - last_sync.get(path, {}).get('play_count', 0) if plays_since_last_sync: sqlstrings.append(u'iTimesPlayed = IF(iTimesPlayed IS NULL, {plays}, iTimesPlayed + {plays})'.format(plays=plays_since_last_sync)) if update_data.get('last_played'): sqlstrings.append(u'lastplayed = IF(lastplayed IS NULL OR lastplayed < "{lp}", "{lp}", lastplayed)'.format(lp=update_data['last_played'])) if sqlstrings: sql = u'UPDATE songview SET {0} WHERE strPath = "{1}" and strFileName = "{2}";' sql = sql.format(', '.join(sqlstrings), strPath, strFileName).encode('utf-8') db.perform_sql(sql) results[path] = update_data print 'Dumping sync to last_sync.json' with open('last_sync.json', 'w') as f: json.dump(results, f, indent=4)
sql += '{0} from {1};'.format(column, table) rows = db.perform_sql(sql) sql = "update {table} set `{column}`='{new}' where `{column}`='{old}';" for row in rows: old_value = row.replace('\\', '\\\\').replace("'", "\\'") db.perform_sql(sql.format( table=table, column=column, new=old_value.replace('\\\\\\\\', 'smb://').replace('\\\\', '/'), old=old_value)) if __name__ == '__main__': VIDEOS_FIXES = [ # List of (table, column) tuples to be fixed ('movieview', 'strPath'), ('episodeview', 'strPath'), ('movieview', 'c22'), ('episodeview', 'strShowPath'), ('episode', 'c18'), ('path', 'strPath'), ('tvshow', 'c16'), ('tvshowview', 'strPath') ] for entry in VIDEOS_FIXES: perform_fix(videos_db, entry[0], entry[1]) rows = videos_db.perform_sql('select strFileName from movieview where strFileName like "stack://\\\\\\\\%";') perform_fix(videos_db, 'movieview', 'strFileName', rows=rows) perform_fix(music_db, 'songview', 'strPath', distinct=True) perform_fix(music_db, 'path', 'strPath', distinct=True)