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);
|
|||
|
// 错误处理
|
|||
|
}
|
|||
|
});
|
|||
|
},
|
|||
|
});
|