554 lines
16 KiB
JavaScript
554 lines
16 KiB
JavaScript
var util = require('../../utils/util.js'); // 确保你有这样一个文件
|
||
var app = getApp(),
|
||
n = '';
|
||
Page({
|
||
data: {
|
||
dataUrl: '',
|
||
dataImage: '',
|
||
preview: '',
|
||
type: '',
|
||
wxid: '',
|
||
alias: '',
|
||
videoSize: 0, // 初始化视频大小为0
|
||
totalLength: 0,
|
||
isExtracting: false,
|
||
read_count: 0,
|
||
|
||
},
|
||
onLoad: function (options) {
|
||
console.log(options)
|
||
this.setData({
|
||
dataUrl: decodeURIComponent(options.url), // 视频链接
|
||
dataImage: decodeURIComponent(options.image) || '', // 视频封面
|
||
preview: decodeURIComponent(options.preview), // 视频标题
|
||
type: decodeURIComponent(options.type) || '', // 设置type的值
|
||
wxid: decodeURIComponent(options.wxid) || '', // 设置微信id
|
||
alias: decodeURIComponent(options.alias) || '', // 设置微信号
|
||
read_count: decodeURIComponent(options.read_count) || 0, // 设置微信号
|
||
});
|
||
wx.showShareMenu({
|
||
withShareTicket: true,
|
||
menus: ['shareAppMessage', 'shareTimeline']
|
||
})
|
||
|
||
},
|
||
onShow: function () {
|
||
|
||
app.checkUpdateVersion()
|
||
// 页面显示前更新数据
|
||
console.log('执行video.js onShow')
|
||
app.getPopupConfig()
|
||
.then(() => {
|
||
// 从本地缓存读取数据
|
||
const isEnabled = wx.getStorageSync('popupEnabled');
|
||
const popupType = wx.getStorageSync('popupType');
|
||
const popupContent = wx.getStorageSync('popupContent');
|
||
|
||
if (isEnabled) {
|
||
this.setData({
|
||
showPopup: true,
|
||
popupType: popupType,
|
||
popupContent: popupContent
|
||
});
|
||
}
|
||
})
|
||
.catch((error) => {
|
||
console.error('获取弹窗配置失败:', error);
|
||
});
|
||
console.log(this.data.type)
|
||
app.getUserInfo().then(() => {
|
||
console.log('获取用户信息开始');
|
||
console.log(wx.getStorageSync('defaultDailyFreeParseNum'), )
|
||
// 判断type,并发送提取记录到后端
|
||
if (this.data.type === 'weixin' & wx.getStorageSync('defaultDailyFreeParseNum') > 0) {
|
||
console.log('来源微信')
|
||
this.getVideoSize(decodeURIComponent(this.data.dataUrl))
|
||
//更新次数
|
||
} else {
|
||
this.getVideoSize(app.globalData.downloadPrefix + decodeURIComponent(this.data.dataUrl))
|
||
}
|
||
console.log('获取用户信息结束');
|
||
}).catch(error => {
|
||
console.error('获取用户信息失败:', error);
|
||
}).finally(() => {
|
||
console.log('getUserInfo调用完成');
|
||
});
|
||
wx.showToast({
|
||
title: '提取成功',
|
||
icon: 'success',
|
||
duration: 1500,
|
||
});
|
||
|
||
},
|
||
|
||
updateExtractingStatus: function (status) {
|
||
console.log(status)
|
||
this.setData({
|
||
isExtracting: status,
|
||
});
|
||
},
|
||
|
||
|
||
|
||
getVideoSize: function (url) {
|
||
let that = this;
|
||
wx.request({
|
||
url: url,
|
||
method: 'HEAD', // HEAD请求不会下载资源的body,只请求header信息
|
||
success: function (res) {
|
||
if (res.statusCode === 200 && res.header['CONTENT-LENGTH'] || res.header['X-Content-Length']) {
|
||
let size = res.header['CONTENT-LENGTH'] || res.header['X-Content-Length'];
|
||
let sizeInMb = (size / (1024 * 1024)).toFixed(2); // 将大小转换为MB
|
||
that.setData({
|
||
videoSize: sizeInMb, // 更新页面数据,
|
||
totalLength: size
|
||
});
|
||
}
|
||
},
|
||
fail: function (err) {
|
||
console.log('获取视频大小失败', err);
|
||
}
|
||
});
|
||
},
|
||
//复制
|
||
copyUrl: async function () {
|
||
if (this.data.type == 'weixin') {
|
||
wx.showLoading({
|
||
title: '正在请求复制...',
|
||
});
|
||
if (!await this.CreditLimit()) return
|
||
}
|
||
wx.setClipboardData({
|
||
data: this.data.dataUrl,
|
||
success: () => {
|
||
wx.showToast({
|
||
title: '复制成功',
|
||
duration: 2200,
|
||
});
|
||
},
|
||
});
|
||
},
|
||
|
||
// 扣除额度
|
||
CreditLimit() {
|
||
return new Promise((resolve, reject) => {
|
||
app.apiRequest({
|
||
url: '/myapp/increment-download-count/',
|
||
method: "POST",
|
||
data: {
|
||
uuid: wx.getStorageSync("uuid"),
|
||
openid: wx.getStorageSync("openid")
|
||
},
|
||
success: function (e) {
|
||
console.log(e, !e.data.success)
|
||
if (e.data.success === false) {
|
||
wx.hideLoading()
|
||
wx.showModal({
|
||
title: "提取视频",
|
||
content: '哎呀!去开通会员不限次数使用哦',
|
||
confirmColor: "#00B269",
|
||
cancelColor: "#858585",
|
||
success: function (e) {
|
||
e.confirm ? (console.log("确定"), wx.navigateTo({
|
||
url: "../vip_recharge/vip_recharge?show=true"
|
||
})) : e.cancel && console.log("取消");
|
||
}
|
||
})
|
||
resolve(false)
|
||
}
|
||
resolve(true)
|
||
}
|
||
})
|
||
})
|
||
},
|
||
onAdClick: function() {
|
||
app.广告();
|
||
},
|
||
//提取视频
|
||
download: async function () {
|
||
wx.showLoading({
|
||
title: '正在下载...',
|
||
});
|
||
if (this.data.type == 'weixin') {
|
||
if (!await this.CreditLimit()) return
|
||
}
|
||
var t = this,
|
||
e = t.data.dataUrl;
|
||
if (t.data.type === 'index') {
|
||
e = app.globalData.downloadPrefix + t.data.dataUrl; // 通过nginx中转
|
||
} else {
|
||
e = t.data.dataUrl;
|
||
}
|
||
// 开始实际的下载任务
|
||
const downloadTask = wx.downloadFile({
|
||
url: e,
|
||
success: function (o) {
|
||
wx.hideLoading();
|
||
wx.saveVideoToPhotosAlbum({
|
||
filePath: o.tempFilePath,
|
||
success: function (o) {
|
||
t.showToast('保存成功', 'success');
|
||
setTimeout(function () {
|
||
wx.setClipboardData({
|
||
data: '',
|
||
});
|
||
t.goBack();
|
||
}, 1000);
|
||
},
|
||
fail: function (o) {
|
||
t.showToast('保存失败');
|
||
}
|
||
});
|
||
},
|
||
fail: function (o) {
|
||
wx.hideLoading();
|
||
t.showToast('下载失败');
|
||
}
|
||
});
|
||
|
||
// 监听下载进度并计算百分比
|
||
downloadTask.onProgressUpdate((o) => {
|
||
let percent = this.data.totalLength ? (o.totalBytesWritten / this.data.totalLength) * 100 : o.progress;
|
||
if (percent < 100) {
|
||
wx.showToast({
|
||
title: `保存中 ${Math.round(percent)}%`,
|
||
mask: true, // 添加 mask 参数,保证覆盖式显示
|
||
icon: 'loading'
|
||
});
|
||
} else {
|
||
wx.hideLoading(); // 下载完成后隐藏加载提示
|
||
}
|
||
});
|
||
},
|
||
|
||
// showToast: function (title, icon = 'none') {
|
||
// wx.showToast({
|
||
// title: title,
|
||
// icon: icon,
|
||
// duration: 2000
|
||
// });
|
||
// },
|
||
|
||
|
||
|
||
// 保存到相册
|
||
postSave: function () {
|
||
|
||
var that = this;
|
||
wx.getSetting({
|
||
success(res) {
|
||
// 检查用户是否已授权小程序写入相册的权限
|
||
if (res.authSetting['scope.writePhotosAlbum']) {
|
||
// 用户已授权,下载视频
|
||
that.download();
|
||
} else {
|
||
// 用户未授权,请求相册权限
|
||
wx.authorize({
|
||
scope: 'scope.writePhotosAlbum',
|
||
success() {
|
||
// 用户授权成功,下载视频
|
||
that.download();
|
||
},
|
||
fail() {
|
||
// 用户拒绝授权,显示提示对话框引导用户开启权限
|
||
wx.showModal({
|
||
title: '提示',
|
||
content: '保存视频到相册需要您授权',
|
||
showCancel: false,
|
||
success(modalRes) {
|
||
if (modalRes.confirm) {
|
||
// 引导用户前往设置页面手动开启权限
|
||
wx.openSetting({
|
||
success(settingData) {
|
||
if (settingData.authSetting['scope.writePhotosAlbum']) {
|
||
// 用户在设置页面授权成功,下载视频
|
||
that.download();
|
||
} else {
|
||
// 用户最终未授权,可能需要展示一些提示信息
|
||
wx.showToast({
|
||
title: '授权失败,无法保存视频',
|
||
icon: 'none'
|
||
});
|
||
}
|
||
}
|
||
});
|
||
}
|
||
}
|
||
});
|
||
}
|
||
});
|
||
}
|
||
}
|
||
});
|
||
|
||
},
|
||
|
||
|
||
performDownload: function () {
|
||
// 在这里实现下载视频并保存到相册的逻辑
|
||
this.download();
|
||
},
|
||
|
||
|
||
removeTimestampAndMergeLines: function (textWithTimestamp) {
|
||
let txt = textWithTimestamp.replace(/\[.*\]/g, ""); // 去掉时间前缀
|
||
console.log(txt);
|
||
txt = txt.replace(/\s+/g, ""); // 去掉换行、空格字符
|
||
console.log(txt);
|
||
return txt; // 删除前后的空白字符并返回
|
||
},
|
||
|
||
// 提取文案功能
|
||
extractText: function () {
|
||
// if (this.data.videoSize > 300 || !this.data.videoSize) {
|
||
// wx.showToast({
|
||
// title: '视频太大,无法提取',
|
||
// icon: 'none'
|
||
// })
|
||
// return
|
||
// }
|
||
let openid = wx.getStorageSync('openid') || '';
|
||
let uuid = wx.getStorageSync('uuid') || '';
|
||
let type = this.data.type || '';
|
||
let wxid = this.data.wxid || '';
|
||
let alias = this.data.alias || '';
|
||
let url = this.data.dataUrl;
|
||
console.log('文案提取:' + url);
|
||
wx.showLoading({
|
||
title: '后台处理中',
|
||
});
|
||
var that = this;
|
||
app.apiRequest({
|
||
url: '/myapp/video_to_text/', // 后端接口URL,根据实际情况调整
|
||
method: 'POST',
|
||
header: {
|
||
'content-type': 'application/json',
|
||
},
|
||
data: {
|
||
url: url,
|
||
openid: openid,
|
||
uuid: uuid,
|
||
type: type,
|
||
wxid: wxid,
|
||
alias: alias,
|
||
},
|
||
success(res) {
|
||
if (res.data.success === false) {
|
||
wx.showModal({
|
||
title: "提取视频",
|
||
content: '哎呀!去开通会员不限次数使用哦',
|
||
confirmColor: "#00B269",
|
||
cancelColor: "#858585",
|
||
success: function (e) {
|
||
e.confirm ? (console.log("确定"), wx.navigateTo({
|
||
url: "../vip_recharge/vip_recharge?show=true"
|
||
})) : e.cancel && console.log("取消");
|
||
}
|
||
})
|
||
wx.hideLoading()
|
||
return
|
||
}
|
||
let data = res.data;
|
||
let taskId = (data?.Data?.TaskId) || data.task_id;
|
||
if (data.result) {
|
||
wx.hideLoading();
|
||
let text = that.removeTimestampAndMergeLines(data.result);
|
||
text = encodeURIComponent(text);
|
||
wx.navigateTo({
|
||
url: "../extract/extract?text=" + text + "&type=" + type + "&wxid=" + wxid + "&alias=" + alias,
|
||
});
|
||
|
||
} else if (taskId) {
|
||
that.search_result(taskId, openid, uuid, type, wxid, alias, (result) => {
|
||
wx.hideLoading();
|
||
console.log('处理查询结果:', result);
|
||
if (result != 0) {
|
||
wx.showToast({
|
||
title: '提取成功',
|
||
icon: 'success'
|
||
});
|
||
|
||
let text = that.removeTimestampAndMergeLines(result);
|
||
text = encodeURIComponent(text);
|
||
wx.navigateTo({
|
||
url: "../extract/extract?text=" + text + "&type=" + type + "&wxid=" + wxid + "&alias=" + alias,
|
||
});
|
||
} else {
|
||
wx.showToast({
|
||
title: '异常',
|
||
icon: 'error'
|
||
});
|
||
}
|
||
});
|
||
} else {
|
||
wx.showToast({
|
||
title: '发送文件失败',
|
||
icon: 'none'
|
||
});
|
||
}
|
||
},
|
||
fail(err) {
|
||
wx.hideLoading();
|
||
wx.showToast({
|
||
title: '网络异常',
|
||
icon: 'none'
|
||
});
|
||
}
|
||
});
|
||
},
|
||
|
||
// 查询任务状态
|
||
search_result: function (task_id, openid, uuid, type, wxid, alias, handleResult) {
|
||
console.log('查询任务');
|
||
const checkResult = (maxRetries) => {
|
||
const fetchTaskStatus = () => {
|
||
app.apiRequest({
|
||
url: '/myapp/query_task/',
|
||
method: 'POST',
|
||
header: {
|
||
'content-type': 'application/json',
|
||
},
|
||
data: {
|
||
task_id: task_id,
|
||
openid: openid,
|
||
uuid: uuid,
|
||
type: type,
|
||
wxid: wxid,
|
||
alias: alias,
|
||
},
|
||
success: function (res) {
|
||
const data = res.data;
|
||
console.log('查询任务:', data)
|
||
if (data.result) {
|
||
handleResult(data.result);
|
||
} else if (maxRetries > 0) {
|
||
setTimeout(fetchTaskStatus, 3000); // 每3秒查询一次
|
||
maxRetries--;
|
||
} else {
|
||
wx.hideLoading();
|
||
wx.showToast({
|
||
title: '请稍重试',
|
||
icon: 'error'
|
||
});
|
||
handleResult(0);
|
||
console.log('已达到最大重试次数,停止查询。');
|
||
}
|
||
},
|
||
});
|
||
};
|
||
fetchTaskStatus(); // 启动任务状态查询
|
||
};
|
||
|
||
const maxRetries = 100;
|
||
checkResult(maxRetries);
|
||
},
|
||
|
||
// 去掉时间戳并合并行
|
||
removeTimestampAndMergeLines: function (textWithTimestamp) {
|
||
let txt = textWithTimestamp.replace(/\[.*\]/g, ""); // 去掉时间前缀
|
||
console.log(txt);
|
||
txt = txt.replace(/\s+/g, ""); // 去掉换行、空格字符
|
||
console.log(txt);
|
||
return txt; // 删除前后的空白字符并返回
|
||
},
|
||
|
||
// 更新提取状态
|
||
updateExtractingStatus: function (status) {
|
||
this.setData({
|
||
extracting: status
|
||
});
|
||
},
|
||
onUnload: function () {
|
||
console.log('页面卸载');
|
||
},
|
||
goBack: function () {
|
||
wx.reLaunch({
|
||
url: '/pages/index/index',
|
||
});
|
||
},
|
||
|
||
showToast: function (title, icon = 'none', duration = 2000) {
|
||
wx.showToast({
|
||
title: title,
|
||
icon: icon,
|
||
duration: duration
|
||
});
|
||
},
|
||
|
||
|
||
onShareAppMessage: function () {
|
||
return {
|
||
title: '推荐一款免费又超好用的视频文案创作工具,分享给大家一起使用',
|
||
path: '/pages/index/index?uuid=' + wx.getStorageSync('uuid'),
|
||
imageUrl: '/images/1.png',
|
||
success: function (e) {
|
||
wx.showToast({
|
||
title: "分享成功",
|
||
icon: "success",
|
||
duration: 2e3
|
||
});
|
||
},
|
||
fail: function (e) {
|
||
wx.showToast({
|
||
title: "分享失败",
|
||
icon: "none",
|
||
duration: 2e3
|
||
});
|
||
}
|
||
}
|
||
},
|
||
onShareTimeline: function () {
|
||
return {
|
||
title: '推荐一款免费又超好用的视频文案创作工具,分享给大家一起使用',
|
||
path: '/pages/index/index?uuid=' + wx.getStorageSync('uuid'),
|
||
imageUrl: '/images/1.png',
|
||
success: function (e) {
|
||
wx.showToast({
|
||
title: "分享成功",
|
||
icon: "success",
|
||
duration: 2e3
|
||
});
|
||
},
|
||
fail: function (e) {
|
||
wx.showToast({
|
||
title: "分享失败",
|
||
icon: "none",
|
||
duration: 2e3
|
||
});
|
||
}
|
||
}
|
||
},
|
||
|
||
|
||
// 发送提取记录到后端的方法
|
||
sendExtractionRecordToBackend: function (e) {
|
||
const {
|
||
dataUrl,
|
||
dataImage,
|
||
preview,
|
||
wxid,
|
||
alias
|
||
} = this.data;
|
||
app.apiRequest({
|
||
url: '/myapp/record_extraction/', // 后端接口URL
|
||
method: 'POST',
|
||
data: {
|
||
openid: wx.getStorageSync('openid'),
|
||
uuid: wx.getStorageSync('uuid'),
|
||
videoUrl: dataUrl,
|
||
videoTitle: preview,
|
||
wxid: wxid,
|
||
wechatAlias: alias,
|
||
type: e || 'weixin'
|
||
},
|
||
success(res) {
|
||
console.log('提取记录发送成功', res);
|
||
// 可以在这里处理后端返回的响应
|
||
},
|
||
fail(err) {
|
||
console.error('提取记录发送失败', err);
|
||
// 错误处理
|
||
}
|
||
});
|
||
},
|
||
}); |