python版本网易云音乐ncm文件格式转换(mirror from https://github.com/nondanee/ncmdump)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
2.7 KiB
100 lines
2.7 KiB
# -*- coding: utf-8 -*-
|
|
"""
|
|
Created on Fri Sep 28 13:32:51 2018
|
|
|
|
@author: Nzix
|
|
"""
|
|
|
|
import argparse, os, sys, re
|
|
import ncmdump
|
|
|
|
parser = argparse.ArgumentParser(
|
|
prog = 'ncmdump'
|
|
)
|
|
parser.add_argument(
|
|
'input', metavar = 'input', nargs = '*', default = ['.'],
|
|
help = 'ncm file or folder path'
|
|
)
|
|
parser.add_argument(
|
|
'-f', metavar = 'format', dest = 'format', default = '',
|
|
help = 'customize naming format'
|
|
)
|
|
parser.add_argument(
|
|
'-o', metavar = 'output', dest = 'output',
|
|
help = 'customize saving folder'
|
|
)
|
|
parser.add_argument(
|
|
'-d', dest = 'delete', action='store_true',
|
|
help = 'delete source after conversion'
|
|
)
|
|
args = parser.parse_args()
|
|
|
|
def validate_name(file_name):
|
|
pattern = {u'\\': u'\', u'/': u'/', u':': u':', u'*': u'*', u'?': u'?', u'"': u'"', u'<': u'<', u'>': u'>', u'|': u'|'}
|
|
for character in pattern:
|
|
file_name = file_name.replace(character, pattern[character])
|
|
return file_name
|
|
|
|
def validate_collision(file_path):
|
|
index = 1
|
|
while os.path.exists(file_path):
|
|
file_path = '({})'.format(index).join(os.path.splitext(file_path))
|
|
index += 1
|
|
return file_path
|
|
|
|
def name_format(path, meta):
|
|
information = {
|
|
'artist': ','.join([artist[0] for artist in meta['artist']]),
|
|
'title': meta['musicName'],
|
|
'album': meta['album']
|
|
}
|
|
|
|
def substitute(matched):
|
|
key = matched.group(1)
|
|
if key in information:
|
|
return information[key]
|
|
else:
|
|
return key
|
|
|
|
name = re.sub(r'%(.+?)%', substitute, args.format)
|
|
name = os.path.splitext(os.path.split(path)[1])[0] if not name else name
|
|
name = validate_name(name)
|
|
name += '.' + meta['format']
|
|
folder = args.output if args.output else os.path.dirname(path)
|
|
save = os.path.join(folder, name)
|
|
save = validate_collision(save)
|
|
return save
|
|
|
|
if args.output:
|
|
args.output = os.path.abspath(args.output)
|
|
if not os.path.exists(args.output):
|
|
print('output does not exist')
|
|
exit()
|
|
if not os.path.isdir(args.output):
|
|
print('output is not a folder')
|
|
exit()
|
|
|
|
files = []
|
|
for item in args.input:
|
|
item = os.path.abspath(item)
|
|
if not os.path.exists(item):
|
|
continue
|
|
if os.path.isdir(item):
|
|
files += [os.path.join(item, _file) for _file in os.listdir(item) if os.path.splitext(_file)[-1] == '.ncm']
|
|
else:
|
|
files += [item]
|
|
|
|
if sys.version[0] == '2':
|
|
files = [file_name.decode(sys.stdin.encoding) for file_name in files]
|
|
|
|
if not files:
|
|
print('empty input')
|
|
exit()
|
|
|
|
for _file in files:
|
|
try:
|
|
_save = ncmdump.dump(_file, name_format)
|
|
print(os.path.split(_save)[-1])
|
|
if args.delete: os.remove(_file)
|
|
except KeyboardInterrupt:
|
|
exit()
|