微信小程序免费《短视频去水印》

news2024/11/13 18:46:51

分享一个uniapp开发的微信小程序免费《短视频去水印》小程序

请添加图片描述
在这里插入图片描述

<template>
	<view class="content">
		<view class="area-wrap">
			<textarea name="" v-model="state.content" maxlength="800" id="" cols="30" rows="10" placeholder-class="plc"
				placeholder="请输入分享链接/分享内容"></textarea>
			<view class="count">
				{{state.content.length}}/800
			</view>
		</view>
		<uv-row customStyle="margin-bottom: 10px" justify="end">
			<uv-col span="3">
				<uv-button :text="state.content?'清空':'粘贴'" @click="clearOrpaste"></uv-button>
			</uv-col>
			<uv-col span="3" offset="1">
				<uv-button :disabled="state.resolved" :text="state.content?'开始解析':'粘贴并解析'" type="primary"
					@click="startAnalyzing"></uv-button>
			</uv-col>
		</uv-row>
		<view class="wrap">
			<view v-if="state.result.video_url">
				<view class="title">无水印视频</view>
				<video :src="state.result.video_url"></video>
				<uv-button style="margin-top: 20rpx;" type="primary" text="" @click="saveVideo(state.result.video_url)">
					<text class="iconfont icon-download"></text>
					<text>保存视频</text>
				</uv-button>
			</view>
			<view v-if="state.result.title">
				<view class="title">标题</view>
				<view class="title-content">{{state.result.title}}</view>
				<uv-button style="margin-top: 20rpx;" type="primary" text="" @click="copy(state.result.title)">
					<text class="iconfont icon-copy"></text>
					<text>复制标题</text>
				</uv-button>
			</view>
			<view v-if="state.result.cover_url">
				<view class="title">封面</view>
				<image @click="preview(state.result.cover_url)" class="cover_url" :src="state.result.cover_url"
					mode="aspectFill"></image>
				<uv-button icon-color="#fff" style="margin-top: 20rpx;" type="primary" text=""
					@click="saveImg(state.result.cover_url)">
					<text class="iconfont icon-download"></text>
					<text>保存封面</text>
				</uv-button>
			</view>

		</view>
	</view>
</template>
<script setup>
import {
		getCurrentInstance,
		reactive,
		watch
	} from "vue"
	import {
		onLoad,
		onShareAppMessage,
		onShareTimeline
	} from "@dcloudio/uni-app"
	const {
		proxy,
		appContext
	} = getCurrentInstance()
	const {
		req
	} = appContext.config.globalProperties;
	const {
		toast,
		containsURL
	} = appContext.config.globalProperties._;
	const state = reactive({
		content: "",
		result: {
			cover_url: "",
			title: "",
			video_url: "",
			resolved: false
		}
	})
	watch(() => state.content, val => {
		if (val == "") {
			state.resolved = false
		}
	})
	onShareAppMessage(() => {
		return {
			title: "轻便短视频去水印",
			path: "/pages/index/index"
		}
	})
	onShareTimeline(() => {
		return {
			title: "轻便短视频去水印",
			path: "/pages/index/index"
		}
	})

	async function startAnalyzing() {
		if (state.resolved) return
		if (!state.content) {
			let data = await getClipboardData()
			if (data) {
				state.content = data
			}
		}
		if (!state.content) return toast("分享内容不能为空")
		const isUrl = containsURL(state.content)
		if (!isUrl) return toast("分享地址格式错误")
		uni.showLoading({
			title: "解析中...",
			mask: true
		})
		req.get("/video/share/url/parse", {
				params: {
					url: state.content
				}
			})
			.then(res => {
				uni.hideLoading()
				state.resolved = true
				const {
					cover_url,
					title,
					video_url
				} = res
				state.result.cover_url = cover_url
				state.result.title = title
				state.result.video_url = video_url
			})
	}

	function getClipboardData() {
		return new Promise((resolve, reject) => {
			uni.getClipboardData({
				success: function(res) {
					resolve(res.data)
				},
				fail() {
					reject(data)
				}
			});
		})

	}

	function clearOrpaste() {
		if (state.content) {
			// 清除操作
			state.content = ""
			state.resolved = false
		} else {
			// 粘贴操作
			uni.getClipboardData({
				success: function(res) {
					state.content = res.data
				}
			});
		}

	}

	function copy(content) {
		uni.setClipboardData({
			data: content,
			success() {
				toast("已复制")
			}
		})
	}

	function saveVideo(val) {
		uni.showLoading({
			title: "保存中..."
		})
		const downloadTask = uni.downloadFile({
			url: val,
			success(res) {
				uni.saveVideoToPhotosAlbum({
					filePath: res.tempFilePath,
					success(e) {
						toast("保存成功", "success")
					},
					fail(err) {
						if (err.errMsg == "saveVideoToPhotosAlbum:fail auth deny") {
							uni.showModal({
								title: "提示",
								content: "需要您授权保存相册",
								confirmText: "点击授权",
								success(res) {
									if (res.confirm) {
										uni.openSetting({
											success: setting => {
												if (setting.authSetting['scope.writePhotosAlbum']) {
													uni.showModal({
														title: '提示',
														content: '获取权限成功,再次点击下载即可保存',
														showCancel: false,
													})
												} else {
													uni.showModal({
														title: '提示',
														content: '获取权限失败,将无法保存到相册哦',
														showCancel: false,
													})
												}
											}
										})
									}
								},
							})
						} else {
							toast("保存失败")
						}
						req.post("/bugReport", {
							method: "saveVideoToPhotosAlbum",
							data: res.tempFilePath,
							error: JSON.stringify(err),
						})
					}
				})
			},
			fail(err) {
				req.post("/bugReport", {
					method: "downloadFile",
					data: val,
					error: JSON.stringify(err)
				})
				toast("保存失败")
			}
		})
		downloadTask.onProgressUpdate((res) => {
			// console.log('下载进度' + res.progress);
			if (res.progress >= 100) {
				uni.hideLoading()
			}
		});
	}

	function saveImg(val) {
		uni.downloadFile({
			url: val,
			success(res) {
				uni.saveImageToPhotosAlbum({
					filePath: res.tempFilePath,
					success() {
						toast("保存成功", "success")
					},
					fail(err) {
						if (err.errMsg == "saveImageToPhotosAlbum:fail auth deny") {
							uni.showModal({
								title: "提示",
								content: "需要您授权保存相册",
								confirmText: "点击授权",
								success(res) {
									if (res.confirm) {
										uni.openSetting({
											success: setting => {
												if (setting.authSetting['scope.writePhotosAlbum']) {
													uni.showModal({
														title: '提示',
														content: '获取权限成功,再次点击下载即可保存',
														showCancel: false,
													})
												} else {
													uni.showModal({
														title: '提示',
														content: '获取权限失败,将无法保存到相册哦',
														showCancel: false,
													})
												}
											}
										})
									}
								},
							})
						} else {
							toast("保存失败")
						}
						req.post("/bugReport", {
							method: "saveImageToPhotosAlbum",
							data: res.tempFilePath,
							error: JSON.stringify(err)
						})
					}
				})
			},
			fail(err) {
				req.post("/bugReport", {
					method: "downloadFile",
					data: val,
					error: JSON.stringify(err)
				})
				toast("保存失败")
			}
		})
	}

	function preview(url) {
		uni.previewImage({
			urls: [url]
		})
	}
	</script>
<style lang="scss">
	.iconfont {
		margin-right: 20rpx;
		font-size: 40rpx;
	}

	.title-content {
		border-radius: 5rpx;
		padding: 10rpx;
		width: 100%;
		box-sizing: border-box;
		border: 1rpx dashed #999;
		margin-bottom: 20rpx;
	}

	.cover_url {
		width: 100%;
		height: 600rpx;
	}

	video {
		width: 100%;
	}

	.title {
		font-size: 36rpx;
		font-weight: bold;
		margin: 40rpx 0;
		padding-left: 30rpx;
		position: relative;

		&::before {
			content: "";
			position: absolute;
			width: 14rpx;
			height: 40rpx;
			background-color: $theme-color;
			left: 0;
			top: 50%;
			border-radius: 10rpx;
			transform: translateY(-50%);
		}
	}

	.plc {
		font-size: 28rpx;
	}

	.area-wrap {
		background-color: #fff;
		width: 100%;
		padding: 20rpx;
		padding-bottom: 10rpx;
		border-radius: 5rpx;
		box-sizing: border-box;
		margin-bottom: 20rpx;

		textarea {![请添加图片描述](https://i-blog.csdnimg.cn/direct/714d26ef190e4715a33978b157197fd3.png)

			font-size: 28rpx;
			width: 100%;
		}

		.count {
			margin-top: 10rpx;
			font-size: 24rpx;
			color: #999;
			text-align: right;
		}
	}

	page {
		padding: 24rpx;
		box-sizing: border-box;
	}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2047429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

接口自动化测试怎么做?该怎么学习

一. 什么是接口测试 顾名思义&#xff0c;接口测试是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及相互逻辑依赖关系。其中接口协议分为HTTP,WebService,Dubbo,Thrift,Socket等类型&#xff0c;测试类型又主…

《黑神话:悟空》媒体评分解禁 M站均分82

《黑神话&#xff1a;悟空》媒体评分现已解禁&#xff0c;截止发稿时&#xff0c;M站共有43家媒体评测&#xff0c;均分为82分。 部分媒体评测&#xff1a; God is a Geek 100&#xff1a; 毫无疑问&#xff0c;《黑神话&#xff1a;悟空》是今年最好的动作游戏之一&#xff…

linux系统安装mysql服务

linux系统安装mysql服务 1.下载安装包2.下载压缩文件解压安装3. 安装完启动服务4.查看安装密码5.使用上述密码登录6.修改密码7.创建一个root可以在任意主机远程连接数据库8.远程登录成功 1.下载安装包 https://downloads.mysql.com/archives/community/ mysql下载地址 2.下载…

【AI安防】YOLOv8 + OpenVINO2023 + QT5 电子围栏预警系统

引言 电子围栏是一种利用无线通信技术和地理信息系统实现的虚拟边界&#xff0c;用于监控和控制被监控对象的位置。它可以帮助我们实现对特定区域内的自定义对象进行实时检测、定位与跟踪。本文介绍了一种基于YOLOv8 OpenVINO2023 QT5 联合打造的实时高效、多线程、自定义对…

Keepalived简介以及常见用途

一、Keepalived 简介 Keepalived 是一个高可用性&#xff08;HA&#xff09;解决方案&#xff0c;主要用于实现 Linux 系统的负载均衡和故障转移。它最初设计用于与 LVS&#xff08;Linux Virtual Server&#xff09;一起使用&#xff0c;但也可以独立使用&#xff0c;主要功能…

0815,析构函数,拷贝构造函数,赋值运算符函数

来自同济医院的问候 目录 01&#xff1a;对象创建 001.cc 003size.cc 02&#xff1a;对象销毁 004pointer.cc 005destroytime.cc 03&#xff1a;本类型对象的复制 3.1 拷贝构造函数 006cp.cc 007cptime.cc 008recursion.cc 009rightleft.cc 3.2 赋值运算符函数 …

8.15 Day20 Windows服务器(Windows service 2008 R2)上域的搭建 (3)

1、域策略配置 1.1 DC服务端的策略配置 1.1.1 下放权限 由于各部门经理的电脑上并不存在对应的工具&#xff0c;即便授予权限也无法对各自部门进行管理 如果经理只有几个&#xff0c;管理员可以一一为其配置&#xff0c;但如果一个公司有几十个经理&#xff0c;则会变得相当冗…

测试用例的设计

*涉及概念来源于《软件测试的艺术》 目录 一、为什么要设计测试用例&#xff1f; 二、黑盒测试与白盒测试介绍 三、测试用例常见设计方法 1.黑盒测试(功能测试) 2.白盒测试(结构测试) 四、测试策略 五、测试用例怎么写 一、为什么要设计测试用例&#xff1f; 由于时间…

C语言传递指针给函数

C 语言允许您传递指针给函数&#xff0c;只需要简单地声明函数参数为指针类型即可。 下面的实例中&#xff0c;我们传递一个无符号的 long 型指针给函数&#xff0c;并在函数内改变这个值 实例1&#xff1a;获取系统的时间值 能接受指针作为参数的函数&#xff0c;也能接受数…

【Vue3】路由Params传参

【Vue3】路由Params传参 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日…

Vue2移动端(H5项目)项目基于vant封装图片上传组件(支持批量上传、单个上传、回显、删除、预览、最大上传数等功能)---解决批量上传问题

一、最终效果 二、参数配置 1、代码示例&#xff1a; <t-uploadfileList"fileList":showFileList"showFileList"showFile"showFile":showFileUrl"showFileUrl"/>2、配置参数&#xff08;TUpload Attributes&#xff09;继承va…

vulnhub系列:DC-1

vulnhub系列&#xff1a;DC-1 靶机下载 一、信息收集 nmap 扫描存活&#xff0c;根据 mac 地址寻找 IP nmap 192.168.23.0/24nmap 扫描端口 nmap 192.168.23.141 -p- -Pn -sV -Odirsearch 目录扫描 python3 dirsearch.py -u http://192.168.23.141/访问80端口 查看 wappa…

数据资产三次入表理论

数据资产三次入表理论 数据资产入表三大阶段详见图。 初次入表&#xff1a;底层资产入表 初次入表主要指的是企业将已实际形成的底层原始数据资源&#xff0c;按照《企业数据资源相关会计处理暂行规定》的要求&#xff0c;首次纳入会计层面的企业资产库。这一阶段工作的完成&am…

8.16 day bug

bug1 题目没看仔细 额外知识 在 Bash shell 中&#xff0c;! 符号用于历史扩展功能。当你在命令行中输入 ! 后跟一些文本时&#xff0c;Bash 会尝试从你的命令历史中查找与该文本相匹配的命令。这是一种快速重用之前执行过的命令的方法。 如何使用历史扩展 基本用法: !strin…

进程间通信—无名管道

gg shiftg快速对齐 加锁顺序问题时&#xff0c;如果解锁了&#xff0c;两个同时申请抢锁&#xff0c;谁抢到了运行谁&#xff0c;循环迭代时释放锁也是同时申请锁&#xff0c;循环部分如果没抢到锁就进入循环等待 总结: IPC 进程间通信 interprocess communicate //signal…

【阿卡迈防护分析】Vueling航空Akamai破盾实战

文章目录 1. 写在前面2. 风控分析3. 破盾实战 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…

Elasticsearch新增和删除索引中的字段

在ES中&#xff0c;增加字段相对比较容易&#xff0c;因为ES支持动态映射&#xff08;Dynamic Mapping&#xff09;。 当索引中新增文档时&#xff0c;ES可以根据文档中的字段自动创建对应的映射关系。如果新字段类型与已有字段类型不同&#xff0c;ES会自动将已有字段类型转换…

2024-2025年最值得选的Java计算机毕业设计选题大全:800个热门选题

一、前言 博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ…

选择排序(附动图)

1.思路 基本思想&#xff1a; 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完 。 1.1双向选择排序&#xff08;升序&#xff09; 头尾指针&#xff08;索引&#xf…

Excel求和方法之

一 SUM&#xff08;&#xff09;&#xff0c;选择要相加的数,回车即可 二 上面的方法还不够快。用下面这个 就成功了 三 还有一种一样快的 选中之后&#xff0c;按下Alt键和键&#xff08;即Alt&#xff09;