百度影音的bdv格式又有变化。
此次存在2种bdv格式。
格式1:每个文件夹内就一个bdv文件,文件合并后改名avi即可。
格式2:每个文件夹内一个bdv文件作为索引,其他附加guid的文件作为数据。
例如:
#EXTM3U
#EXT-X-TARGETDURATION:30
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10,
所以python脚本有改。
该脚本修正了单个文件在批处理过程名称。
|
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 |
# -*- coding: UTF-8 -*-import
osimport
ioimport
codecsimport
stringimport
shutilimport
moviefmtdef
coroutine(func): def
start(*args,**kwargs): g =
func(*args,**kwargs) g.next() return
g return
start@coroutinedef
enum_movie_file(target): selectedFolder =
(yield) for
fileitem in
os.listdir(selectedFolder): targetFO =
os.path.join(selectedFolder,fileitem) if(os.path.isfile(targetFO) ==
True): continue; target.send(targetFO) @coroutinedef
read_movie_file(funcDisp,target): while(True): filmFolder =
(yield) for
fileitem in
os.listdir(filmFolder): targetfile =
os.path.join(filmFolder,fileitem) if(os.path.isfile(targetfile) ==
False): continue; filebasename , fext =
os.path.splitext(fileitem); if(funcDisp.has_key(string.lower(fext))): pfn =
funcDisp[string.lower(fext)]; outputs =
filmFolder,filebasename, pfn(targetfile); target.send(outputs) break def
getWindowsText(orgText): try: return
orgText.encode(‘gbk‘) except
Exception as exc: print("%s"
% exc); return
orgText @coroutinedef
create_report(outputfile): objTar =
codecs.open(outputfile,"w+") while(1): filmFolder,filebasename,(extname,piece_list) =
(yield) if(extname ==
None) : break; objTar.write(‘cd \"%s\"\r\n‘
% filmFolder) if(len(piece_list) >1): objTar.write(‘copy /b ‘) else: objTar.write(‘copy ‘) if(len(piece_list) ==
1): objTar.write(‘\"%s \"‘
%(getWindowsText(piece_list[0]))) else: bFirst =
True for
line in
piece_list: if(bFirst ==
False): objTar.write(‘+\"%s\"‘
%(getWindowsText(line))) else: objTar.write(‘\"%s\"‘
%(getWindowsText(line))) bFirst =
False objTar.write(‘ ..\\"%s\".%s\r\n‘
%(filebasename,extname)) objTar.write(‘cd ..\r\n‘) objTar.close() if __name__ ==
‘__main__‘: funcDisp =
dict() funcDisp[‘.bdv_0000‘]=
moviefmt.read_bdv_file; funcDisp[‘.rmvb_0000‘]=
moviefmt.read_rmvb_file; funcDisp[‘.mkv_0000‘]=
moviefmt.read_mkv_file; funcDisp[‘.bdv‘]=
moviefmt.read_bdv_index; funcDisp[‘.mp4_0000‘]=
moviefmt.read_mp4_file; funcDisp[‘‘]=
moviefmt.read_mkv_2_file; try: rmf =
enum_movie_file(read_movie_file(funcDisp,create_report(‘film.bat‘))) rmf.send(os.getcwd()) rmf.close() except
Exception as exc: print("%s"
% exc); print("done"); |
该脚本增加单个文件read_bdv_index_V3和bdv新格式支持read_bdv_index_V4。
|
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 |
# -*- coding: UTF-8 -*-import
osimport
ioimport
sysimport
stringimport
shutilimport
codecsdef
read_bdv_index_V1(objFile): piece_list=
list() for
line in
objFile: if(line[0:4] !=
‘file‘): continue; strings =
string.split(line,‘/‘) tarfile =
strings[len(strings)-1] tempText =
string.strip(tarfile) piece_list.append(tempText) return
"avi",piece_listdef
read_bdv_index_V2(objFile): piece_list=
list() for
line in
objFile: nPos =
line.count(‘bdv‘) if( nPos <=0): continue; tarfile =
line[0:len(line)-2] piece_list.append(tarfile) return
"mpeg",piece_listdef
read_bdv_index_V3(objFile): piece_list=
list() oneFile=
os.path.basename(objFile) piece_list.append(oneFile) return
"avi",piece_listdef
read_bdv_index_V4(objFile): piece_list=
list() #skip #EXT-X-MEDIA-SEQUENCE objFile.readline(); for
line in
objFile: if(line.startswith(‘#‘)==True): continue; piece_list.append(line.replace(‘\r\n‘,‘‘)) return
"avi",piece_list def
count_file_item(objFile,extText): cItem =
0; folderName =
os.path.dirname(objFile) for
fileitem in
os.listdir(folderName): filebasename , fext =
os.path.splitext(fileitem); if(fext ==
extText): cItem =
cItem +1 return
cItem def
read_bdv_index(filename): piece_list=
list() ext_type =
None # total file count cItem =
count_file_item(filename,".bdv") if(cItem ==
1): ext_type,piece_list =
read_bdv_index_V3(filename) else: objFile =
codecs.open(filename,‘r‘,‘utf-8‘) topline =
objFile.readline(); bdv_ver =
topline.replace("\r\n","") if(bdv_ver ==
‘#EXTM3U‘): v3Text =
objFile.readline(); if(v3Text.startswith(‘#EXT-X-TARGETDURATION‘) ==
False): ext_type,piece_list =
read_bdv_index_V2(objFile) else: ext_type,piece_list =
read_bdv_index_V4(objFile) else: ext_type,piece_list =
read_bdv_index_V1(objFile) objFile.close() return
(ext_type ,piece_list) def
read_bdv_file(filename): piece_list=
list() piece_list.append(‘*.bdv_*‘) return
(‘avi‘,piece_list)def
read_rmvb_file(filename): piece_list=
list() piece_list.append(‘*.rmvb_*‘) return
(‘rmvb‘,piece_list)def
read_mkv_file(filename): piece_list=
list() piece_list.append(‘*.mkv_*‘) return
(‘mkv‘,piece_list)def
read_mp4_file(filename): piece_list=
list() piece_list.append(‘*.mp4_*‘) return
(‘mp4‘,piece_list)def
read_mkv_2_file(filename): piece_list=
list() piece_list.append(‘video_*‘) return
(‘mkv‘,piece_list) |
合并百度影音的离线数据 with python 2.2 bdv格式的更新,布布扣,bubuko.com
合并百度影音的离线数据 with python 2.2 bdv格式的更新
原文:http://www.cnblogs.com/febwave/p/3664206.html