kuaiying_wx/pages/video/video.js
2025-03-04 15:25:38 +08:00

554 lines
16 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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