forked from twotreeszf/Sony-Walkman-Sorter
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSortFiles.py
154 lines (130 loc) · 4.07 KB
/
SortFiles.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/usr/bin/python3
# -*- coding:utf-8 -*-
import sys
import os
from os import path
import logging
import JKConverter
from mutagen.easyid3 import EasyID3
from mutagen.mp3 import EasyMP3 as MP3
from mutagen.easymp4 import EasyMP4 as MP4
from mutagen.flac import FLAC
from pypinyin import lazy_pinyin, Style
EasyID3.RegisterTextKey('ALBUMARTIST', 'TPE2')
EasyID3.RegisterTextKey('ALBUMARTISTSORT', 'TSO2')
logging.basicConfig(level=logging.INFO)
def beginWithCJK(str):
if u'\u2e80' <= str[0] <= u'\u9fff':
return True
else:
return False
def CJKFirstLetters(str):
pinyins = lazy_pinyin(str, style=Style.FIRST_LETTER, errors=returnJapaneseKoreanPinyin)
firstLetters = ''
for pinyin in pinyins:
firstLetters += pinyin
return firstLetters
def checkTagMakeSort(path, meta, tagName):
sortKey = tagName + 'SORT'
tagSort = meta.get(sortKey)
if tagSort and len(tagSort) and tagSort[0] != '':
tagSort = tagSort[0]
if not beginWithCJK(tagSort):
logging.debug('Not processing tag {0} because its non-CJK'.format(tagSort))
return False
tag = meta.get(tagName)
if (not tag) or (not len(tag)) or (tag[0] == ''):
logging.debug('Not processing tag {0} because its tag is invalid or empty'.format(tag))
return False
else:
tag = tag[0]
if not beginWithCJK(tag):
logging.debug('Not processing tag {0} because its non-CJK'.format(tag))
return False
else:
firstLetters = CJKFirstLetters(tag)
meta[sortKey] = firstLetters
logging.info('{0}: processed [{1}] is \"{2}\", formally \"{3}\"'.format(path, sortKey, firstLetters, tag))
return True
def setSortTags(path):
ext = os.path.splitext(path)[1].lower()
meta = None
try:
if ext == '.mp3':
meta = MP3(path)
elif ext == '.m4a':
meta = MP4(path)
elif ext == '.flac':
meta = FLAC(path)
else:
return
except:
logging.warning('unknown file type:{0}'.format(path))
pass
if meta:
tagsToProcess = ('ALBUM', 'ALBUMARTIST', 'ARTIST', 'TITLE')
save = False
try:
for tag in tagsToProcess:
processed = checkTagMakeSort(path, meta, tag)
if (processed):
save = True
if save:
meta.save()
except Exception as e:
logging.warning('Save tag for {0} failure'.format(path))
logging.exception(e)
pass
def processFilesInFolder(folder):
logging.info('processing folder [{0}]'.format(folder))
dirlist = os.listdir(folder)
for x in dirlist:
abspath = path.join(folder, x)
if(path.isfile(abspath)):
setSortTags(abspath)
elif (path.isdir(abspath)):
processFilesInFolder(abspath)
def isEngAndNum(aChar):
if aChar == ' ':
return True
if aChar < '0':
return False
if aChar <= '9':
return True
if aChar < 'A':
return False
if aChar <= 'Z':
return True
if aChar < 'a':
return False
if aChar <= 'z':
return True
return False
def returnJapaneseKoreanPinyin(unknownStr):
returnedStr = JKConverter.convert(unknownStr)
pinyin = ""
for returnedChar in returnedStr:
if isEngAndNum(returnedChar):
pinyin += returnedChar
return pinyin
if __name__ == '__main__':
message = '''
Walkman file sorter by twotrees, Email:[email protected], QQ:329292657
Usage:
Process in current folder:
./SortFiles
Process in specified folder:
./SortFiles [folder_path]
'''
print(message)
folder = None
if len(sys.argv) < 2 :
logging.info('No folder path specified, will process current folder')
folder = folder = os.getcwd()
else:
folder = sys.argv[1]
if not path.isdir(folder):
logging.error('Target folder does not exist')
folder = None
if folder:
processFilesInFolder(folder)