@@ -2157,7 +2157,7 @@ def getSubName(v: str, sub: str) -> tuple[str, str]:
2157
2157
bVideo = basenameNoEXT (v )
2158
2158
return sub , bSub [bSub .find (bVideo ) + len (bVideo ):]
2159
2159
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 :
2161
2161
"""
2162
2162
ffASFMKV,将媒体文件、字幕、字体封装到一个MKV文件,需要ffmpeg、ffprobe命令行支持
2163
2163
@@ -2216,11 +2216,16 @@ def ffASFMKV(file: str, outfile: str = '', asslangs: list = [], asspaths: list =
2216
2216
firstIdx -= 1
2217
2217
elif '-map 0:s' not in mapList :
2218
2218
mapList .append ('-map 0:s' )
2219
+ if not rmAssIn and f ['disposition' ]['default' ] == 1 :
2220
+ copyList .append ('-disposition:{} 0' .format (f ['index' ]))
2219
2221
ffargs .append ('-i \" {}\" ' .format (file ))
2220
2222
2221
2223
fn = path .splitext (path .basename (file ))[0 ]
2222
2224
metaList .append ('-metadata:g title=\" {}\" ' .format (fn ))
2223
2225
if len (asspaths ) > 0 :
2226
+
2227
+ defaultSet = False
2228
+
2224
2229
for i in range (0 , len (asspaths )):
2225
2230
s = asspaths [i ]
2226
2231
assfn = path .splitext (path .basename (s ))[0 ]
@@ -2242,6 +2247,13 @@ def ffASFMKV(file: str, outfile: str = '', asslangs: list = [], asspaths: list =
2242
2247
2243
2248
ffargs .append ('-i \" {}\" ' .format (s ))
2244
2249
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
+
2245
2257
firstIdx += 1
2246
2258
2247
2259
if len (fontpaths ) > 0 :
@@ -2284,7 +2296,7 @@ def ffASFMKV(file: str, outfile: str = '', asslangs: list = [], asspaths: list =
2284
2296
return ffmr
2285
2297
2286
2298
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 :
2288
2300
"""
2289
2301
ASFMKV,将媒体文件、字幕、字体封装到一个MKV文件,需要mkvmerge命令行支持
2290
2302
@@ -2322,6 +2334,7 @@ def ASFMKV(file: str, outfile: str = '', asslangs: dict = {}, asspaths: list = [
2322
2334
mkvargs .extend (['(' , file , ')' ])
2323
2335
fn = path .splitext (path .basename (file ))[0 ]
2324
2336
if len (asspaths ) > 0 :
2337
+ defaultSet = False
2325
2338
for i in range (0 , len (asspaths )):
2326
2339
s = asspaths [i ]
2327
2340
assfn = path .splitext (path .basename (s ))[0 ]
@@ -2338,6 +2351,12 @@ def ASFMKV(file: str, outfile: str = '', asslangs: dict = {}, asspaths: list = [
2338
2351
mkvargs .append ('0:{0}' .format (asslangs [assnote .lower ()]))
2339
2352
else :
2340
2353
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' ])
2341
2360
2342
2361
mkvargs .extend (['(' , s , ')' ])
2343
2362
if len (fontpaths ) > 0 :
@@ -2782,7 +2801,7 @@ def namePosition(files: list):
2782
2801
2783
2802
2784
2803
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 = '?' ):
2786
2805
"""
2787
2806
主函数,负责调用各函数走完完整的处理流程
2788
2807
@@ -2891,10 +2910,10 @@ def main(font_info: list, asspath: list, outdir: list = ['', '', ''], mux: bool
2891
2910
outdir [2 ] = path .dirname (outdir [2 ])
2892
2911
if FFmuxer == 1 :
2893
2912
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 )
2895
2914
elif FFmuxer == 0 :
2896
2915
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 )
2898
2917
else :
2899
2918
mkvr = 0
2900
2919
if not notfont :
@@ -3271,15 +3290,12 @@ def showMessageSubset(newasspaths: list, newfont_name: dict):
3271
3290
3272
3291
translationLang = {}
3273
3292
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 ]:
3277
3294
# 从Pre23开始,sublangs改为匹配注释
3278
3295
# 特殊键「Key」:无注释名称的字幕
3279
3296
sublangs = {}
3280
3297
# 与sublangs对应的字幕示例
3281
3298
subExp = {}
3282
-
3283
3299
for m in media_ass .keys ():
3284
3300
for sub in media_ass [m ]:
3285
3301
subName = getSubName (m , sub )[1 ]
@@ -3289,6 +3305,55 @@ def getSubsLangsV2(media_ass: dict) -> list:
3289
3305
else :
3290
3306
sublangs .setdefault ('' , '' )
3291
3307
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 )
3292
3357
3293
3358
cls ()
3294
3359
if len (iso639_all ) == 0 :
@@ -3766,12 +3831,14 @@ def cFontSubset(font_info):
3766
3831
if len (media_ass .values ()) > 0 :
3767
3832
sublangs = None
3768
3833
sublangs = {}
3834
+ forceSubTrack = '?'
3769
3835
muxer = 0
3770
3836
cls ()
3771
3837
if domux :
3772
3838
print ('您需要为字幕轨道添加语言信息吗?' )
3773
3839
if os .system ('choice' ) == 1 :
3774
3840
sublangs = getSubsLangsV2 (media_ass )
3841
+ forceSubTrack = getForceSub (media_ass )
3775
3842
# print(media_ass)
3776
3843
if work == 20 or (work == 2 and no_mkvm ):
3777
3844
muxer = 1
@@ -3790,7 +3857,7 @@ def cFontSubset(font_info):
3790
3857
outdir = [assout_cache , fontout_cache , mkvout_cache ],
3791
3858
vpath = k ,
3792
3859
asslangs = sublangs ,
3793
- FFmuxer = muxer )
3860
+ FFmuxer = muxer , forceSubTrack = forceSubTrack )
3794
3861
if mkvr != - 2 :
3795
3862
showMessageSubset (newasspaths , newfont_name )
3796
3863
else :
0 commit comments