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

# -*- 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()