qiushang 2 luni în urmă
părinte
comite
b3ac9342bc
5 a modificat fișierele cu 662 adăugiri și 449 ștergeri
  1. 0 5
      package-lock.json
  2. 1 1
      package.json
  3. 105 0
      src/renderer/components/header.vue
  4. 217 134
      src/renderer/components/home.vue
  5. 339 309
      yarn.lock

+ 0 - 5
package-lock.json

@@ -1,5 +0,0 @@
-{
-	"name": "XYPinyin",
-	"version": "1.4.0.0",
-	"lockfileVersion": 1
-}

+ 1 - 1
package.json

@@ -95,4 +95,4 @@
 		"webpack-hot-middleware": "^2.22.2",
 		"webpack-merge": "^4.1.3"
 	}
-}
+}

+ 105 - 0
src/renderer/components/header.vue

@@ -36,6 +36,7 @@
 						        <el-dropdown-item command="update">检查更新</el-dropdown-item>
 						        <el-dropdown-item command="help"><a href="https://www.xingyousoft.com/help2" style="color: inherit;">使用教程</a></el-dropdown-item>
 						        <el-dropdown-item command="setting">软件设置</el-dropdown-item>
+								<el-dropdown-item command="developer">开发者模式</el-dropdown-item>
 						        <el-dropdown-item command="out" v-if="userInfo.username || userInfo.avatar">退出登录</el-dropdown-item>
 						    </el-dropdown-menu>
 						</el-dropdown>
@@ -154,6 +155,46 @@
 				<el-button type="primary" @click="saveSetting" :loading="saveLoading">保存设置</el-button>
 			</span>
 		</el-dialog>
+		
+		<!-- 开发者模式 -->
+		<el-dialog title="开发者模式" :visible.sync="developerModal" width="400px" :close-on-click-modal="false" :close-on-press-escape="false">
+			<div>
+				<p style="text-align: center; color: #F56C6C;">开发者参数设置,软件退出后会重置</p>
+				<p style="text-align: center; color: #F56C6C;">(无头模式:true|网络连接:networkidle2)</p>
+				<el-divider content-position="left">
+					无头模式
+				</el-divider>
+				<el-row style="text-align: center;">
+					<el-radio-group v-model="headless">
+					    <el-radio :label="1">true</el-radio>
+					    <el-radio :label="2">false</el-radio>
+					</el-radio-group>
+				</el-row>
+				<el-divider content-position="left">网络连接</el-divider>
+				<el-row style="text-align: center;">
+					<el-radio-group v-model="waitUntil">
+						<el-radio style="margin-bottom: 20px;" label="load">load</el-radio>
+						<el-radio style="margin-bottom: 20px;" label="domcontentloaded">domcontentloaded</el-radio>
+						<el-radio style="margin-bottom: 20px;" label="networkidle0">networkidle0</el-radio>
+						<el-radio style="margin-bottom: 20px;" label="networkidle2">networkidle2</el-radio>
+					</el-radio-group>
+				</el-row>
+			</div>
+			<span slot="footer" class="dialog-footer">
+				<el-button type="primary" @click="saveDevelop" :loading="saveDevelopLoading">保存设置</el-button>
+			</span>
+		</el-dialog>
+		
+		<!-- 通知 -->
+		<el-dialog title="软件通知" :visible.sync="noticeModel" width="400px">
+			<div style="padding-left: 20px; line-height: 1.8;" v-html="noticeValue.desc">
+
+			</div>
+			<span slot="footer" class="dialog-footer">
+				<el-checkbox v-model="isRead" style="float:left">我已知晓,7天内不再提醒</el-checkbox>
+				<el-button type="primary" size="small" @click="readClose">确定</el-button>
+			</span>
+		</el-dialog>
 
 	</div>
 </template>
@@ -227,6 +268,15 @@
 				weiboLoading: false,
 				cacheLoading: false,
 				saveLoading: false,
+				
+				saveDevelopLoading: false,
+				developerModal: false,
+				headless: 1,
+				waitUntil: 'networkidle2',
+				
+				isRead: false,
+				noticeValue: {},
+				noticeModel: false,
 			}
 		},
         props: {
@@ -396,6 +446,14 @@
 				}
 				
 			},
+			readClose(){
+				if(this.isRead == true){
+					this.$utils.setStorage('isRead', {token: true, expire: 60*60*24*7});
+				}else{
+					this.$utils.setStorage('isRead', false);
+				}
+				this.noticeModel = false;
+			},
 			// 保存设置
 			saveSetting(){
 				this.saveLoading = true;
@@ -407,6 +465,16 @@
 					this.settingModal = false;
 				}, 800)
 			},
+			// 保存开发者设置
+			saveDevelop(){
+				this.saveDevelopLoading = true;
+				this.$utils.setStorage('headless', this.headless);
+				this.$utils.setStorage('waitUntil', this.waitUntil);
+				setTimeout(() => {
+					this.saveDevelopLoading = false;
+					this.developerModal = false;
+				}, 800)
+			},
 			// 
 			getAdv() {
 				// 非会员广告接口
@@ -450,6 +518,19 @@
 					this.memberUrl = "https://www.xingyousoft.com/soft/reminder2/"+pjson.softInfo.softMid+"?p_mid="+pjson.softInfo.softMid+"&agent_mid="+this.sysInfo.agentMid+"&uuid="+windows_uuid+"&soft_type="+this.sysInfo.softType;
 				});
 				
+				
+				this.$http.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8';
+				this.$http.get(pjson.softInfo.downloadPrefix + '/' + pjson.name + "/notice.json?"+Math.random()).then((response) => {
+					this.noticeValue = response.data || {};
+					let nowTime = new Date().getTime();
+					let isRead = this.$utils.getStorage('isRead');
+					if(this.noticeValue.t > nowTime && !isRead){
+						this.noticeModel = true;
+					}
+				}).catch(function(error){
+					console.log(error);
+				});
+				
 			},
 			// 刷新登录二维码
 			refreshCode() {
@@ -700,6 +781,30 @@
 					if(closeType){
 						this.closeType = closeType;
 					}
+				} else if (e == 'developer'){ //开发者模式
+					let password = '9d0b17e04db20927047de3d09152db0f'; //默认密钥
+					this.$http.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8';
+					this.$http.get(pjson.softInfo.downloadPrefix + '/' + pjson.name + "/developer.json?"+Math.random()).then((response) => {
+						let getResult = response.data || '';
+						if(getResult && typeof(response.data) == 'string'){
+							password = getResult;
+						}
+					}).catch(function(error){
+						console.log(error);
+					});
+					this.$prompt('请输入开发者密钥:', '提示', {
+					  confirmButtonText: '确定',
+					  cancelButtonText: '取消',
+					  inputPlaceholder: '请联系软件底部企业微信客服咨询使用',
+					}).then(({ value }) => {
+						if(value == password){
+							this.developerModal = true;
+						}else{
+							this.$message.error('密钥错误,已退出');
+						}
+					}).catch(() => {      
+					
+					});
 				}
 			},
 		},

+ 217 - 134
src/renderer/components/home.vue

@@ -74,7 +74,7 @@
 								</vxe-column>
 								<vxe-column field="vcodec" title="视频编码" width="120"></vxe-column>
 								<vxe-column field="acodec" title="音频编码" width="120"></vxe-column>
-								<vxe-column field="status" title="下载状态" width="140">
+								<vxe-column field="status" title="状态" width="140">
 									<template #default="{ row }">
 										<template v-if="row.status == '1'">
 											<i class="el-icon-info" style="font-size: 16px; color: #999;"></i>
@@ -94,9 +94,9 @@
 										</template>
 									</template>
 								</vxe-column>
-								<vxe-column title="操作" width="150">
+								<vxe-column title="操作" width="100">
 									<template #default="{ row, rowIndex }">
-										<el-button v-if="row.urlList && row.urlList.length > 0" type="danger" size="mini" plain @click="copy(rowIndex)">复制</el-button>
+										<!-- <el-button v-if="row.urlList && row.urlList.length > 0" type="danger" size="mini" plain @click="copy(rowIndex)">复制</el-button> -->
 										<el-button :loading="row.loading" type="danger" size="mini" plain @click="downloadVideo(rowIndex)">下载</el-button>
 									</template>
 								</vxe-column>
@@ -161,15 +161,15 @@
 				</el-dialog>
 				
 				<!-- 抖音下载 -->
-				<el-dialog title="抖音视频下载" :visible.sync="dyModal" width="300px" :close-on-click-modal="false" :close-on-press-escape="false">
-					<el-divider content-position="left">
-						普通下载
+				<el-dialog title="视频下载" :visible.sync="dyModal" width="300px" :close-on-click-modal="false" :close-on-press-escape="false">
+					<el-divider content-position="left" v-if="commonUrl">
+						浏览器下载
 						<el-popover placement="bottom" popper-class="popper-open" trigger="hover" content="点击复制地址到浏览器中打开">
 							<i class="el-icon-info" slot="reference" style="margin-left: 10px; color: #F56C6C;"></i>
 						</el-popover>
 					</el-divider>
 					<div style="text-align: center;">
-						<el-button v-if="commonUrl" size="small" round type="primary" @click="copyText(commonUrl)">下载地址</el-button>
+						<el-button v-if="commonUrl" size="small" round type="primary" @click="copyText(commonUrl)">复制下载地址</el-button>
 					</div>
 					
 					<el-divider content-position="left">
@@ -180,10 +180,20 @@
 					</el-divider>
 					<div style="text-align: center;">
 						<div v-for="(item, index) in thunderUrl" :key="index">
-							<el-button size="small" round type="primary" @click="copyText(item)" style="margin-bottom: 15px;">下载地址{{index+1}}</el-button>
+							<el-button size="small" round type="primary" @click="copyText(item)" style="margin-bottom: 15px;">复制下载地址{{index+1}}</el-button>
 							</br>
 						</div>
 					</div>
+					
+					<el-divider content-position="left">
+						普通下载
+						<el-popover placement="bottom" popper-class="popper-open" trigger="hover" content="使用软件下载可能会失败,建议使用浏览器/迅雷下载">
+							<i class="el-icon-info" slot="reference" style="margin-left: 10px; color: #F56C6C;"></i>
+						</el-popover>
+					</el-divider>
+					<div style="text-align: center;">
+						<el-button v-if="selectIndex > -1" :loading="videoList[selectIndex].loading" size="small" round type="primary" @click="downloadVideo(selectIndex, true)" style="margin-bottom: 15px;">点击下载</el-button>
+					</div>
 				</el-dialog>
 		
 			</el-main>
@@ -211,6 +221,7 @@
 	const axios = require('axios');
 	const StealthPlugin = require('puppeteer-extra-plugin-stealth');
 	const listNameArr = ['douyin','kuaishou','weibo','','','','','', '' ,'common'];
+	import { VxeTooltip } from 'vxe-table';
 	
 	let separator = '';
 	if (os.platform == 'linux') {
@@ -226,7 +237,7 @@
 		},
 		data() {
 			return {
-				selectIndex: 0,
+				selectIndex: -1,
 				usageTimes: 3,
 				tipsModal: false,
 				tipsDesc: "暂无下载权限,请开通VIP会员使用",
@@ -297,9 +308,33 @@
 				});
 			});
 			
+			// 初始化开发者设置
+			this.$utils.setStorage('headless', 1);
+			this.$utils.setStorage('waitUntil', 'networkidle2');
+			
 		},
 		methods: {
-			
+			// 实时获取开发者设置
+			initDevelop(){
+				let develop = {
+					headless: true,
+					waitUntil: 'networkidle2'
+				};
+				let n1 = this.$utils.getStorage('headless');
+				let n2 = this.$utils.getStorage('waitUntil');
+				if(n1){
+					if(n1 == 1){
+						develop.headless = true;
+					}else if(n1 == 2){
+						develop.headless = false;
+					}
+				}
+				if(n2){
+					develop.waitUntil = n2;
+				}
+				
+				return develop;
+			},
 			// 实时获取浏览器路径
 			initPath(){
 				let chromePath = puppeteer.executablePath().replace('win32-1', 'win64-1');
@@ -480,6 +515,7 @@
 					this.parseLoading = true;
 					this.tabLoading = true;
 					this.videoList = [];
+					this.selectIndex = -1;
 					let params = [
 						'--dump-json',
 						formatUrl
@@ -530,12 +566,12 @@
 			},
 			// 点击复制
 			copy(index){
-				let authority = this.$refs.headerRef.authority.isAuthority;
-				if (!authority) {
-					this.tipsModal = true;
-					this.tipsDesc = '暂无下载权限,请开通VIP会员使用';
-					return false;
-				}
+				// let authority = this.$refs.headerRef.authority.isAuthority;
+				// if (!authority) {
+				// 	this.tipsModal = true;
+				// 	this.tipsDesc = '暂无下载权限,请开通VIP会员使用';
+				// 	return false;
+				// }
 				
 				this.commonUrl = '';
 				this.thunderUrl = [];
@@ -555,6 +591,10 @@
 						if(uitem.startsWith('https://www.douyin.com/')){
 							this.commonUrl = uitem;
 						}
+						if(!title){
+							title = '抖音视频';
+						}
+						// console.log(`AA`+uitem +`&filename=`+title+`.mp4ZZ`);
 						let urlBuffer = Buffer.from(`AA`+uitem +`&filename=`+title+`.mp4ZZ`).toString('base64');
 						this.thunderUrl.push('thunder://'+urlBuffer);
 					})
@@ -564,7 +604,7 @@
 			},
 			
 			// 点击下载视频
-			async downloadVideo(index){
+			async downloadVideo(index, flag){
 				this.selectIndex = index;
 				let authority = this.$refs.headerRef.authority.isAuthority;
 				if (!authority) {
@@ -574,75 +614,82 @@
 				}
 				this.tipsModal = false;
 				
-				let item = this.videoList[index];
-				if (!fs.existsSync(this.downloadDir + separator + pjson.softInfo.softName)) {
-					fs.mkdirSync(this.downloadDir + separator + pjson.softInfo.softName);
-				}
-				let newPath = this.downloadDir + separator + pjson.softInfo.softName;
-				
-				if(item.tag){ //抖音下载
-					if(item.title){
-						item.title = item.title.substring(0, 50);
-						if(this.containsAnyChar(item.title)){  //判断是否含有特殊字符
-							item.title = item.title.replace(/[\\|/|:|*|?|"|<|>||#|%|&|\s]/g, "");
-						}
+				if(this.videoList[index].urlList && this.videoList[index].urlList.length > 0 && !flag && this.videoList[index].tag == 'douyin'){ // 浏览器解析出来的下载地址
+					this.copy(index);
+				}else{
+					let item = this.videoList[index];
+					if (!fs.existsSync(this.downloadDir + separator + pjson.softInfo.softName)) {
+						fs.mkdirSync(this.downloadDir + separator + pjson.softInfo.softName);
 					}
-					let outputPath = newPath + separator + item.title + '[' + item.format_id + ']' + '.mp4';
-					let url = item.urlList.length > 0 ? item.urlList[0] : '';
+					let newPath = this.downloadDir + separator + pjson.softInfo.softName;
 					
-					if(item.tag == 'douyin'){
-						item.urlList.map(uitem => {
-							if(uitem.startsWith('https://www.douyin.com/')){
-								url = uitem;
-							}
-						})
-					}
-					
-					item.status = '2';
-					item.loading = true;
-					await this.downloadImage(url, outputPath, item);
-					item.loading = false;
-					this.$forceUpdate();
-					this.$message({message: '恭喜你,下载已完成!', type: 'success'});
-					electronApi.call('showItemInfolder',[this.downloadDir + separator + pjson.softInfo.softName +'\\tty.tty']);
-					return false;
-				}else{
-					// console.log(this.downloadUrl);
-					let params = [
-						'-f',
-						item.format_id,
-						'--force-overwrites',
-						'-o',
-						newPath + separator + '%(title).50s['+item.format_id+'].%(ext)s',
-						this.downloadUrl
-					];
-					item.status = '2';
-					item.loading = true;
-					this.$forceUpdate();
-					electronApi.spawnExec(['dlp.exe', ...params],{
-						stdout:(data) =>{
-							let str = data.toString();
-							const regexDuration = /[download].*? (.*?)%/;
-							const res = regexDuration.exec(str);
-							if(res && res[1]){
-								item.percent = res[1];
-								this.$forceUpdate();
+					if(item.tag){ //抖音下载
+						if(item.title){
+							item.title = item.title.substring(0, 50);
+							if(this.containsAnyChar(item.title)){  //判断是否含有特殊字符
+								item.title = item.title.replace(/[\\/:*?"<>|#%&\s]/g, "");
 							}
 						}
-					}).then(res => {
-						let outData = res.stdout ? res.stdout.toString() : '{}';
-						item.status = '3';
+						let outputPath = newPath + separator + item.title + '[' + item.format_id + ']' + '.mp4';
+						let url = item.urlList.length > 0 ? item.urlList[0] : '';
+						
+						if(item.tag == 'douyin'){
+							item.urlList.map(uitem => {
+								if(uitem.startsWith('https://www.douyin.com/')){
+									url = uitem;
+								}
+							})
+						}
+						
+						item.status = '2';
+						item.loading = true;
+						await this.downloadImage(url, outputPath, item);
 						item.loading = false;
 						this.$forceUpdate();
 						this.$message({message: '恭喜你,下载已完成!', type: 'success'});
 						electronApi.call('showItemInfolder',[this.downloadDir + separator + pjson.softInfo.softName +'\\tty.tty']);
-					}).catch(err =>{
-						item.status = '4';
-						item.loading = false;
+						return false;
+					}else{
+						// console.log(this.downloadUrl);
+						let params = [
+							'-f',
+							item.format_id,
+							'--force-overwrites',
+							'-o',
+							newPath + separator + '%(title).50s['+item.format_id+'].%(ext)s',
+							this.downloadUrl
+						];
+						item.status = '2';
+						item.loading = true;
 						this.$forceUpdate();
-						// console.log(err);
-					})
+						electronApi.spawnExec(['dlp.exe', ...params],{
+							stdout:(data) =>{
+								let str = data.toString();
+								const regexDuration = /[download].*? (.*?)%/;
+								const res = regexDuration.exec(str);
+								if(res && res[1]){
+									item.percent = res[1];
+									this.$forceUpdate();
+								}
+							}
+						}).then(res => {
+							let outData = res.stdout ? res.stdout.toString() : '{}';
+							item.status = '3';
+							item.loading = false;
+							this.$forceUpdate();
+							this.$message({message: '恭喜你,下载已完成!', type: 'success'});
+							electronApi.call('showItemInfolder',[this.downloadDir + separator + pjson.softInfo.softName +'\\tty.tty']);
+						}).catch(err =>{
+							item.status = '4';
+							item.loading = false;
+							this.$forceUpdate();
+							// console.log(err);
+						})
+					}
 				}
+
+				
+				
 			},
 			
 			// 解析抖音视频
@@ -670,8 +717,10 @@
 				let userDataDir = os.tmpdir() + separator + 'chrome-data-capture-video';
 				// 运行不同平台的浏览器
 				puppeteer.use(StealthPlugin());
+				let headless = true;
+				headless = this.initDevelop().headless;
 				this.videoBrowser = await puppeteer.launch({
-					headless: true,
+					headless: headless,
 					executablePath: this.initPath(),
 					userDataDir: userDataDir, 
 					args: [
@@ -691,11 +740,19 @@
 							let responseVideo = [];
 							let responseUrl = [];
 							let responseObj = {};
+							let vtitle = '视频';
 							page.on('response', async(response) => {
 								// 检查响应的 MIME 类型是否以 'video/' 开头
 								if (response.headers()['content-type'] && response.headers()['content-type'].startsWith('video/')) {
 									if(responseVideo.indexOf(response.url()) < 0 && !response.url().startsWith('blob:https://')){
 										responseVideo.push(response.url());
+										vtitle = await page.title();
+										if(vtitle){
+											vtitle = vtitle.substring(0, 50);
+											if(this.containsAnyChar(vtitle)){  //判断是否含有特殊字符
+												vtitle = vtitle.replace(/[\\/:*?"<>|#%&\s]/g, "");
+											}
+										}
 									}
 								}
 								if (response.headers()['content-type'] && response.headers()['content-type'].startsWith('application/json')) {
@@ -714,73 +771,95 @@
 								}
 								
 							});
-							await page.goto(url, {waitUntil : 'networkidle2'});
+							let waitUntil = 'networkidle2';
+							waitUntil = this.initDevelop().waitUntil;
+							await page.goto(url, {waitUntil : waitUntil});
 							await page.waitForTimeout(1000);
-							await page.close();
-							
-							let arr = ['aweme_detail']; //'video' ,'play_addr', 'url_list', '2'];
-							for(let i = 0; i < arr.length; i++){
-								responseObj = responseObj[arr[i]];
-							}
+							await this.videoBrowser.close();
 							
-							if(responseObj.preview_title){
-								responseObj.preview_title = responseObj.preview_title.substring(0, 50);
-								if(this.containsAnyChar(responseObj.preview_title)){  //判断是否含有特殊字符
-									responseObj.preview_title = responseObj.preview_title.replace(/[\\|/|:|*|?|"|<|>||#|%|&|\s]/g, "");
+							if(responseObj['aweme_detail']){ // 返回的接口数据中有aweme_detail参数 才会解析接口数据
+								let arr = ['aweme_detail']; //'video' ,'play_addr', 'url_list', '2'];
+								for(let i = 0; i < arr.length; i++){
+									responseObj = responseObj[arr[i]];
 								}
-							}
-							if(responseObj && responseObj.video && responseObj.video.play_addr){
-								let vinfo = {
-									title: responseObj.preview_title,
-									tag: 'douyin',
-									format_id: 'default',
-									ext: 'mp4',
-									resolution: responseObj.video.play_addr.width + 'x' + responseObj.video.play_addr.height,
-									fps: '-',
-									filesize: responseObj.video.play_addr.data_size, 
-									vcodec: '-',
-									acodec: '-',
-									urlList: responseObj.video.play_addr.url_list,
-									status: '1',
-									loading: false
+								
+								if(responseObj && responseObj.preview_title){
+									responseObj.preview_title = responseObj.preview_title.substring(0, 50);
+									if(this.containsAnyChar(responseObj.preview_title)){  //判断是否含有特殊字符
+										responseObj.preview_title = responseObj.preview_title.replace(/[\\/:*?"<>|#%&\s]/g, "");
+									}
 								}
-								this.videoList.push(vinfo);
-							}
-							if(responseObj && responseObj.video && responseObj.video.play_addr_265){
-								let vinfo = {
-									title: responseObj.preview_title,
-									tag: 'douyin',
-									format_id: 'play_addr_265',
-									ext: 'mp4',
-									resolution: responseObj.video.play_addr_265.width + 'x' + responseObj.video.play_addr_265.height,
-									fps: '-',
-									filesize: responseObj.video.play_addr_265.data_size,
-									vcodec: '-',
-									acodec: '-',
-									urlList: responseObj.video.play_addr_265.url_list,
-									status: '1',
-									loading: false
+								if(responseObj && responseObj.video && responseObj.video.play_addr){
+									let vinfo = {
+										title: responseObj.preview_title,
+										tag: 'douyin',
+										format_id: 'default',
+										ext: 'mp4',
+										resolution: responseObj.video.play_addr.width + 'x' + responseObj.video.play_addr.height,
+										fps: '-',
+										filesize: responseObj.video.play_addr.data_size, 
+										vcodec: '-',
+										acodec: '-',
+										urlList: responseObj.video.play_addr.url_list,
+										status: '1',
+										loading: false
+									}
+									this.videoList.push(vinfo);
 								}
-								this.videoList.push(vinfo);
-							}
-							if(responseObj && responseObj.video && responseObj.video.play_addr_h264){
+								if(responseObj && responseObj.video && responseObj.video.play_addr_265){
+									let vinfo = {
+										title: responseObj.preview_title,
+										tag: 'douyin',
+										format_id: 'play_addr_265',
+										ext: 'mp4',
+										resolution: responseObj.video.play_addr_265.width + 'x' + responseObj.video.play_addr_265.height,
+										fps: '-',
+										filesize: responseObj.video.play_addr_265.data_size,
+										vcodec: '-',
+										acodec: '-',
+										urlList: responseObj.video.play_addr_265.url_list,
+										status: '1',
+										loading: false
+									}
+									this.videoList.push(vinfo);
+								}
+								if(responseObj && responseObj.video && responseObj.video.play_addr_h264){
+									let vinfo = {
+										title: responseObj.preview_title,
+										tag: 'douyin',
+										format_id: 'play_addr_h264',
+										ext: 'mp4',
+										resolution: responseObj.video.play_addr_h264.width + 'x' + responseObj.video.play_addr_h264.height,
+										fps: '-',
+										filesize: responseObj.video.play_addr_h264.data_size,
+										vcodec: '-',
+										acodec: '-',
+										urlList: responseObj.video.play_addr_h264.url_list,
+										status: '1',
+										loading: false
+									}
+									this.videoList.push(vinfo);
+								}
+							}else if(responseVideo.length > 0){ //网页解析到视频地址
 								let vinfo = {
-									title: responseObj.preview_title,
+									title: vtitle,
 									tag: 'douyin',
-									format_id: 'play_addr_h264',
+									format_id: 'video',
 									ext: 'mp4',
-									resolution: responseObj.video.play_addr_h264.width + 'x' + responseObj.video.play_addr_h264.height,
+									resolution: '-',
 									fps: '-',
-									filesize: responseObj.video.play_addr_h264.data_size,
+									filesize: '',
 									vcodec: '-',
 									acodec: '-',
-									urlList: responseObj.video.play_addr_h264.url_list,
+									urlList: responseVideo,
 									status: '1',
 									loading: false
 								}
 								this.videoList.push(vinfo);
 							}
 							
+							
+							
 							this.parseLoading = false;
 							this.tabLoading = false;
 						}catch(e){
@@ -820,8 +899,10 @@
 				let userDataDir = os.tmpdir() + separator + 'chrome-data-capture-video';
 				// 运行不同平台的浏览器
 				puppeteer.use(StealthPlugin());
+				let headless = true;
+				headless = this.initDevelop().headless;
 				this.videoBrowser = await puppeteer.launch({
-					headless: true,
+					headless: headless,
 					executablePath: this.initPath(),
 					userDataDir: userDataDir, 
 					args: [
@@ -848,7 +929,7 @@
 										if(title){
 											title = title.substring(0, 50);
 											if(this.containsAnyChar(title)){  //判断是否含有特殊字符
-												title = title.replace(/[\\|/|:|*|?|"|<|>||#|%|&|\s]/g, "");
+												title = title.replace(/[\\/:*?"<>|#%&\s]/g, "");
 											}
 										}
 										
@@ -872,7 +953,9 @@
 								}
 								
 							});
-							await page.goto(url, {waitUntil : 'networkidle2'});
+							let waitUntil = 'networkidle2';
+							waitUntil = this.initDevelop().waitUntil;
+							await page.goto(url, {waitUntil : waitUntil});
 							await page.waitForTimeout(1000);
 							
 							let pageInfo = await page.evaluate(() => {
@@ -913,7 +996,7 @@
 										if(title){
 											title = title.substring(0, 50);
 											if(this.containsAnyChar(title)){  //判断是否含有特殊字符
-												title = title.replace(/[\\|/|:|*|?|"|<|>||#|%|&|\s]/g, "");
+												title = title.replace(/[\\/:*?"<>|#%&\s]/g, "");
 											}
 										}
 										
@@ -944,7 +1027,7 @@
 											}
 										});
 									}
-									await page.close();
+									await this.videoBrowser.close();
 									this.parseLoading = false;
 									this.tabLoading = false;
 								}
@@ -1035,7 +1118,7 @@
 				if(title){
 					title = title.substring(0, 50);
 					if(this.containsAnyChar(title)){  //判断是否含有特殊字符
-						title = title.replace(/[\\|/|:|*|?|"|<|>||#|%|&|\s]/g, "");
+						title = title.replace(/[\\/:*?"<>|#%&\s]/g, "");
 					}
 					if (fs.existsSync(this.downloadDir + separator + pjson.softInfo.softName + separator + title)) {
 						urlInfo.newPath = this.downloadDir + separator + pjson.softInfo.softName + separator + title;
@@ -1091,7 +1174,7 @@
 			
 			// 是否包含特殊字符
 			containsAnyChar(str) {
-				let charsArray = ['\\', '/', ':', '*', '?', '"', '<', '>', '|', '#', '%' ,'&'];
+				let charsArray = ['\\', '/', ':', '*', '?', '"', '<', '>', '|', '#', '%' ,'&', ' ', '\t', '\n'];
 			    for (let i = 0; i < charsArray.length; i++) {
 			        if (str.includes(charsArray[i])) {  
 			            return true;

Fișier diff suprimat deoarece este prea mare
+ 339 - 309
yarn.lock


Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff