musipy/musipy.py
Khoa Nguyen Anh ccf26a8079 init
2018-03-02 22:52:48 +07:00

108 lines
3.1 KiB
Python

import os
from parser import Parser
from common import same_name_alert, get_content
from tinytag import TinyTag
class musipy:
def __init__(self):
# prepare data
self.data = {}
self.parser = Parser()
# run
self.run()
def run(self):
if self.parser.mode == 'sort':
self.collect()
self.move_files()
else:
pass
return
# sort files bases on attribute
def sort(self, f, tag):
# get attribute from tag
# using self.attr
tag = getattr(tag, self.parser.attr)
if tag in self.data:
self.data[tag].append(f)
else:
self.data[tag] = []
self.data[tag].append(f)
return
# move files to new destination based on attribute
def move_files(self):
for folder, tracks in self.data.items():
if folder is None:
folder = "Undefined"
if not folder:
folder = "Undefined"
new_folder = self.parser.output + '/' + folder
if not os.path.exists(new_folder):
os.makedirs(new_folder)
print("Folder: {}".format(folder))
moved_files = 0
total_files = len(tracks)
for track in tracks:
moved_files += 1
percent = int(moved_files / total_files * 100)
print("Processing ... {:3d}%".format(percent), end='\r')
new_file = new_folder + '/' + os.path.basename(track)
if track == new_file:
# after sort, stay the same
continue
if os.path.exists(new_file):
same_name_alert(track, new_file)
else:
os.rename(track, new_file)
print("")
return
# collect all files and store in self.data
def collect(self):
folder_queue = [self.parser.source]
home_path_len = len(folder_queue[0])
while (len(folder_queue) > 0):
current_folder = folder_queue[0]
folder_queue = folder_queue[1:]
if len(current_folder[home_path_len:]) == 0:
print("[+] Scan /")
else:
print("[+] Scan {}".format(current_folder[home_path_len:]))
files, folders = get_content(current_folder)
# skip folder named '.folder'
# generate full path
for folder in folders:
if folder[0] != '.':
full_path = current_folder + '/' + folder
folder_queue.append(full_path)
# work with files
for f in files:
try:
fp = current_folder + '/' + f # full path to file
tag = TinyTag.get(fp)
except LookupError:
continue
except:
print("Cannot get tag from file --> Skip\n\t{}".format(fp))
continue
self.sort(fp, tag)
if __name__ == "__main__":
muse = musipy()