Skip to content

Commit f5b9c2d

Browse files
committed
default subtitle track selection supported
1 parent 6faac54 commit f5b9c2d

File tree

1 file changed

+77
-10
lines changed

1 file changed

+77
-10
lines changed

ASFMKV_dev.py

Lines changed: 77 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2157,7 +2157,7 @@ def getSubName(v: str, sub: str) -> tuple[str, str]:
21572157
bVideo = basenameNoEXT(v)
21582158
return sub, bSub[bSub.find(bVideo) + len(bVideo):]
21592159

2160-
def ffASFMKV(file: str, outfile: str = '', asslangs: list = [], asspaths: list = [], fontpaths: list = []) -> int:
2160+
def ffASFMKV(file: str, outfile: str = '', asslangs: list = [], asspaths: list = [], fontpaths: list = [], forceSubTrack: str = '?') -> int:
21612161
"""
21622162
ffASFMKV,将媒体文件、字幕、字体封装到一个MKV文件,需要ffmpeg、ffprobe命令行支持
21632163
@@ -2216,11 +2216,16 @@ def ffASFMKV(file: str, outfile: str = '', asslangs: list = [], asspaths: list =
22162216
firstIdx -= 1
22172217
elif '-map 0:s' not in mapList:
22182218
mapList.append('-map 0:s')
2219+
if not rmAssIn and f['disposition']['default'] == 1:
2220+
copyList.append('-disposition:{} 0'.format(f['index']))
22192221
ffargs.append('-i \"{}\"'.format(file))
22202222

22212223
fn = path.splitext(path.basename(file))[0]
22222224
metaList.append('-metadata:g title=\"{}\"'.format(fn))
22232225
if len(asspaths) > 0:
2226+
2227+
defaultSet = False
2228+
22242229
for i in range(0, len(asspaths)):
22252230
s = asspaths[i]
22262231
assfn = path.splitext(path.basename(s))[0]
@@ -2242,6 +2247,13 @@ def ffASFMKV(file: str, outfile: str = '', asslangs: list = [], asspaths: list =
22422247

22432248
ffargs.append('-i \"{}\"'.format(s))
22442249
mapList.append('-map {}'.format(i + 1))
2250+
2251+
if not defaultSet and (assnote.lower() == forceSubTrack.lower() or forceSubTrack == '?'):
2252+
copyList.append('-disposition:{} default'.format(firstIdx))
2253+
defaultSet = True
2254+
else:
2255+
copyList.append('-disposition:{} 0'.format(firstIdx))
2256+
22452257
firstIdx += 1
22462258

22472259
if len(fontpaths) > 0:
@@ -2284,7 +2296,7 @@ def ffASFMKV(file: str, outfile: str = '', asslangs: list = [], asspaths: list =
22842296
return ffmr
22852297

22862298

2287-
def ASFMKV(file: str, outfile: str = '', asslangs: dict = {}, asspaths: list = [], fontpaths: list = []) -> int:
2299+
def ASFMKV(file: str, outfile: str = '', asslangs: dict = {}, asspaths: list = [], fontpaths: list = [], forceSubTrack: str = '?') -> int:
22882300
"""
22892301
ASFMKV,将媒体文件、字幕、字体封装到一个MKV文件,需要mkvmerge命令行支持
22902302
@@ -2322,6 +2334,7 @@ def ASFMKV(file: str, outfile: str = '', asslangs: dict = {}, asspaths: list = [
23222334
mkvargs.extend(['(', file, ')'])
23232335
fn = path.splitext(path.basename(file))[0]
23242336
if len(asspaths) > 0:
2337+
defaultSet = False
23252338
for i in range(0, len(asspaths)):
23262339
s = asspaths[i]
23272340
assfn = path.splitext(path.basename(s))[0]
@@ -2338,6 +2351,12 @@ def ASFMKV(file: str, outfile: str = '', asslangs: dict = {}, asspaths: list = [
23382351
mkvargs.append('0:{0}'.format(asslangs[assnote.lower()]))
23392352
else:
23402353
mkvargs.append('0:und')
2354+
2355+
if not defaultSet and (assnote.lower() == forceSubTrack.lower() or forceSubTrack == '?'):
2356+
mkvargs.extend(['--default-track-flag', '0:1'])
2357+
defaultSet = True
2358+
else:
2359+
mkvargs.extend(['--default-track-flag', '0:0'])
23412360

23422361
mkvargs.extend(['(', s, ')'])
23432362
if len(fontpaths) > 0:
@@ -2782,7 +2801,7 @@ def namePosition(files: list):
27822801

27832802

27842803
def main(font_info: list, asspath: list, outdir: list = ['', '', ''], mux: bool = False, vpath: str = '',
2785-
asslangs: dict = {}, FFmuxer: int = 0, fontline: int = -1):
2804+
asslangs: dict = {}, FFmuxer: int = 0, fontline: int = -1, forceSubTrack: str = '?'):
27862805
"""
27872806
主函数,负责调用各函数走完完整的处理流程
27882807
@@ -2891,10 +2910,10 @@ def main(font_info: list, asspath: list, outdir: list = ['', '', ''], mux: bool
28912910
outdir[2] = path.dirname(outdir[2])
28922911
if FFmuxer == 1:
28932912
mkvr = ffASFMKV(vpath, path.join(outdir[2], path.splitext(path.basename(vpath))[0] + '.mkv'),
2894-
asslangs=asslangs, asspaths=newasspath, fontpaths=list(set([f[0] for f in newfont_name.values()])))
2913+
asslangs=asslangs, asspaths=newasspath, fontpaths=list(set([f[0] for f in newfont_name.values()])), forceSubTrack=forceSubTrack)
28952914
elif FFmuxer == 0:
28962915
mkvr = ASFMKV(vpath, path.join(outdir[2], path.splitext(path.basename(vpath))[0] + '.mkv'),
2897-
asslangs=asslangs, asspaths=newasspath, fontpaths=list(set([f[0] for f in newfont_name.values()])))
2916+
asslangs=asslangs, asspaths=newasspath, fontpaths=list(set([f[0] for f in newfont_name.values()])), forceSubTrack=forceSubTrack)
28982917
else:
28992918
mkvr = 0
29002919
if not notfont:
@@ -3271,15 +3290,12 @@ def showMessageSubset(newasspaths: list, newfont_name: dict):
32713290

32723291
translationLang = {}
32733292

3274-
def getSubsLangsV2(media_ass: dict) -> list:
3275-
'''获取字幕语言代码的用户交互部分'''
3276-
global langlist, no_mkvm, iso639_all, preferLang, translationLang, subName2Lang
3293+
def getAllSubName(media_ass: dict) -> tuple[dict, dict]:
32773294
# 从Pre23开始,sublangs改为匹配注释
32783295
# 特殊键「Key」:无注释名称的字幕
32793296
sublangs = {}
32803297
# 与sublangs对应的字幕示例
32813298
subExp = {}
3282-
32833299
for m in media_ass.keys():
32843300
for sub in media_ass[m]:
32853301
subName = getSubName(m, sub)[1]
@@ -3289,6 +3305,55 @@ def getSubsLangsV2(media_ass: dict) -> list:
32893305
else:
32903306
sublangs.setdefault('', '')
32913307
subExp.setdefault('', (m, sub))
3308+
return sublangs, subExp
3309+
3310+
3311+
def getForceSub(media_ass: dict) -> str:
3312+
'''选择默认字幕的用户交互部分'''
3313+
sublangs, subExp = getAllSubName(media_ass)
3314+
3315+
maxNum = len(str(len(sublangs)))
3316+
3317+
def showFocusSub(i: str):
3318+
print('【字幕示例】')
3319+
for index, ii in enumerate(sublangs.keys()):
3320+
3321+
highlightSet = getSubName(subExp[ii][0], subExp[ii][1])
3322+
highlightStr = path.basename(highlightSet[0]).replace(highlightSet[1], f'\033[1;31m{highlightSet[1]}\033[1;33m')
3323+
normalStr = path.basename(highlightSet[0]).replace(highlightSet[1], f'\033[1;31m{highlightSet[1]}\033[0m')
3324+
3325+
if ii == i:
3326+
print('[{1}] \"\033[1;33m{0}\033[0m\" \033[1;34m默认轨道\033[0m'.format(highlightStr, str(index).rjust(maxNum)))
3327+
else:
3328+
print('[{1}] \"{0}\"'.format(normalStr, str(index).rjust(maxNum)))
3329+
3330+
reStart = True
3331+
while(reStart):
3332+
reStart = False
3333+
showFocusSub('?')
3334+
print('')
3335+
select = input('请输入字幕文件名前括号内的序号以选择默认字幕轨道: ')
3336+
selectCount = 0
3337+
while((not select.strip(' ').isnumeric() or int(select.strip(' ')) not in range(0, len(sublangs))) and selectCount < 3):
3338+
selectCount+=1
3339+
select = input('请输入字幕文件名前括号内的序号以选择默认字幕轨道: ')
3340+
3341+
if selectCount >= 3: return '?'
3342+
3343+
cls()
3344+
showFocusSub(list(sublangs.keys())[int(select)])
3345+
print('')
3346+
isFin = input('确定选择这个字幕为默认轨道吗?[输入Y并回车确认]: ')
3347+
if isFin.lower().strip(' ') != 'y': reStart = True
3348+
3349+
return list(sublangs.keys())[int(select)]
3350+
3351+
3352+
def getSubsLangsV2(media_ass: dict) -> list:
3353+
'''获取字幕语言代码的用户交互部分'''
3354+
global langlist, no_mkvm, iso639_all, preferLang, translationLang, subName2Lang
3355+
3356+
sublangs, subExp = getAllSubName(media_ass)
32923357

32933358
cls()
32943359
if len(iso639_all) == 0:
@@ -3766,12 +3831,14 @@ def cFontSubset(font_info):
37663831
if len(media_ass.values()) > 0:
37673832
sublangs = None
37683833
sublangs = {}
3834+
forceSubTrack = '?'
37693835
muxer = 0
37703836
cls()
37713837
if domux:
37723838
print('您需要为字幕轨道添加语言信息吗?')
37733839
if os.system('choice') == 1:
37743840
sublangs = getSubsLangsV2(media_ass)
3841+
forceSubTrack = getForceSub(media_ass)
37753842
# print(media_ass)
37763843
if work == 20 or (work == 2 and no_mkvm):
37773844
muxer = 1
@@ -3790,7 +3857,7 @@ def cFontSubset(font_info):
37903857
outdir=[assout_cache, fontout_cache, mkvout_cache],
37913858
vpath=k,
37923859
asslangs=sublangs,
3793-
FFmuxer = muxer)
3860+
FFmuxer = muxer, forceSubTrack=forceSubTrack)
37943861
if mkvr != -2:
37953862
showMessageSubset(newasspaths, newfont_name)
37963863
else:

0 commit comments

Comments
 (0)