import vuex from "vuex" import axios from "axios" import {ElMessage} from "element-plus" import qs from "qs" import moment from 'moment' const BaseUrl = "http://downloader.lionwebsite.xyz/" const GalleryManageUrl = BaseUrl + "GalleryManage/" const VideoManageUrl = BaseUrl + "VideoManage/" const actions = { updateGalleryTasks(context){ const AuthCode = context.state.AuthCode axios.get(GalleryManageUrl, { params:{ param:"", type:"all", AuthCode } }).then((res) => { context.commit("_emptyGalleryTasks") context.commit("_updateGalleryTasks", JSON.parse(res.data.data)) }) }, updateVideoTasks(context){ const AuthCode = context.state.AuthCode axios.get(VideoManageUrl, { params:{ param:"123", type:"all", AuthCode } }).then(res => { context.commit("_emptyVideoTasks") context.commit("_updateVideoTasks", JSON.parse(res.data.data)) }) }, postGalleryTask(context, data){ axios.post(GalleryManageUrl, qs.stringify({ AuthCode:context.state.AuthCode, link:data.link, targetResolution:data.targetResolution })).then((res) => { if(res.data.result === "success") { ElMessage("提交成功") context.commit("_setChosenGallery", {gallery:false, resolution:data.targetResolution}) } else{ if(res.data.data) ElMessage(res.data.data) else{ ElMessage("提交失败") } } }) }, postVideoTask(context, data){ axios.post(VideoManageUrl, qs.stringify({ AuthCode:context.state.AuthCode, link: data.link, targetResolution: data.targetResolution })).then((res) => { if(res.data.result === "success") { ElMessage("提交成功") context.commit("_setChosenVideo", {video:false, resolution:data.targetResolution}) } else{ if(res.data.data) ElMessage(res.data.data) else{ ElMessage("提交失败") } } }) }, queryGalleryTask(context, link){ const AuthCode = context.state.AuthCode axios.get(GalleryManageUrl, { params:{ param:link, type:'link', AuthCode } }).then((res) => { if(res.data.result === 'success'){ const gallery = JSON.parse(res.data.data) context.commit("_setChosenGallery", {gallery}) } else ElMessage("查询失败") }) }, queryVideoTask(context, link){ const AuthCode = context.state.AuthCode axios.get(VideoManageUrl, { params:{ param: link, type:"link", AuthCode } }).then((res) => { if(res.data.result === 'success'){ const video = JSON.parse(res.data.data) context.commit("_setChosenVideo", {video}) } else ElMessage("查询失败") }) }, validate(context, AuthCode){ axios.post(BaseUrl + "validate?AuthCode=" + AuthCode).then((res)=>{ if(res.data.result === 'success'){ context.commit("_authed", AuthCode, context) context.dispatch("updateGalleryTasks").then() context.dispatch("updateVideoTasks").then() context.dispatch("loadMaskDomain").then() context.dispatch("loadWeekUsedAmount").then() setInterval(() => { context.dispatch("update").then() }, 30000) } else{ context.commit("_unAuthed") } }) }, update(context){ if(context.state.showType === "video") context.dispatch("updateVideoTasks").then() else context.dispatch("updateGalleryTasks").then() }, loadMaskDomain(context){ axios.get(BaseUrl + "maskDomain").then((res) => { if(res.data.result === "success"){ context.commit("_setMaskDomain", JSON.parse(res.data.data)) } }) }, loadWeekUsedAmount(context){ axios.get(GalleryManageUrl + "weekUsedAmount", { params: { AuthCode: context.state.AuthCode } }).then((res) => { if(res.data.result === "success"){ context.state.weekUsed = JSON.parse(res.data.data) ElMessage("查询用量成功") }else{ ElMessage("查询用量失败") } }) }, searchByLink(context, link){ context.commit("_searchByLink", link) }, searchLocalByKeyword(context, keyword){ context.commit("_searchLocalByKeyword", keyword) }, searchRemoteByKeyword(context, keyword){ if(context.state.showType === "gallery"){ axios.get(GalleryManageUrl, { params:{ type:"name", param:keyword } }).then((res) => { if(res.data.result === 'success'){ context.commit("_setChosenGallery", {'gallery':JSON.parse(res.data.data)}) } else{ ElMessage(res.data.data) } }) } else{ axios.get(VideoManageUrl, { params:{ type:"name", param:keyword } }).then((res) => { if(res.data.result === 'success'){ context.commit("_setChosenVideo", {'video': JSON.parse(res.data.data)}) } else{ ElMessage(res.data.data) } }) } }, deleteGallery(context, gid){ axios.delete(GalleryManageUrl, { params:{ AuthCode:state.AuthCode, gid }}).then((res) => { if(res.data.result === "success"){ ElMessage("删除成功") context.commit("_deleteGallery", gid) } else{ ElMessage(res.data.data) } }) }, deleteVideo(context, id){ axios.delete(VideoManageUrl, { params:{ AuthCode:state.AuthCode, id } }).then((res) => { if(res.data.result === "success"){ ElMessage("删除成功") context.commit("_deleteVideo", id) } else{ ElMessage(res.data.data) } }) } } const mutations = { _emptyGalleryTasks(state){ state.totalGalleryTask.splice(0) }, _emptyVideoTasks(state){ state.totalVideoTask.splice(0) }, _updateGalleryTasks(state, tasks){ tasks.forEach((task) => { if(task.name.includes("[")) { let name = task.name let lastIndex = name.lastIndexOf("[") name = name.substring(0, lastIndex) while (name.includes("[") && name.includes("]")) { let start = name.indexOf("[") let end = name.indexOf("]") + 1 let temp = name.substring(start, end) name = name.replace(temp, "") } while (name.includes("(") && name.includes(")")) { let start = name.indexOf("(") let end = name.indexOf(")") + 1 let temp = name.substring(start, end) name = name.replace(temp, "") } task.shortName = name.trim() } else{ task.shortName = task.name } if(task.status === "已提交"){ task.progress = "已提交" } else if(task.status === "下载中"){ task.progress = (Math.round((task.proceeding / task.pages)*100)).toString() + "%" } else if(task.status === "下载完成"){ task.progress = "下载完成" let tempLink let url = new URL(task.link) state.maskDomain.forEach((mask) => { if(url.host === mask['raw']) tempLink = task.link.replace(mask['raw'], mask['mask']) }) task.download = GalleryManageUrl + "file/" + encodeURI(task.name) + "?link=" + tempLink + "&AuthCode=" + state.AuthCode } task.createTimeDisplay = moment(task.createTime * 1000).format("YYYY-MM-DD HH:mm:ss") state.totalGalleryTask.push(task) }) state.totalGalleryTask = state.totalGalleryTask.sort((before, after) => { if(state.sortType === 'name') return before.name > after.name ? 1: -1 else return before.createTime - after.createTime }) if(state.isAuth && !state.loadComplete){ state.loadComplete = true ElMessage("加载完成") } }, _updateVideoTasks(state, tasks){ tasks.forEach((task) => { task.progress = task.status if(task.status === "下载完成"){ let tempLink let url = new URL(task.link) state.maskDomain.forEach((mask) => { if(url.host === mask['raw']) tempLink = task.link.replace(mask['raw'], mask['mask']) }) task.download = VideoManageUrl + "file/" + encodeURI(task.name) + "?link=" + tempLink + "&AuthCode=" + state.AuthCode task.createTimeDisplay = moment(task.createTime * 1000).format("YYYY-MM-DD HH:mm:ss") } state.totalVideoTask.push(task) }) state.totalVideoTask = state.totalVideoTask.sort((before, after) => { if(state.sortType === 'name') return before.name > after.name ? 1: -1 else return before.createTime - after.createTime }) }, _changePage(state, targetPage){ state.page = targetPage }, _authed(state, AuthCode){ state.AuthCode = AuthCode state.isAuth = true ElMessage("验证成功,加载中") }, _unAuthed(state){ state.isAuth = false state.AuthCode = "" ElMessage("授权码错误") localStorage.removeItem("auth") }, _searchByLink(state, link){ let tasks if(state.showType === "gallery") { tasks = state.totalGalleryTask } else tasks = state.totalVideoTask let i = 0 let found = false for (i = 0; i < tasks.length; i++) { if (tasks[i].link === link) { state.page = Math.floor(i / state.length) + 1 found = true break } } if(!found){ ElMessage("未找到此任务") } else{ ElMessage("已跳转到该任务所在页数") } }, _searchLocalByKeyword(state, keyword){ state.searchTask.splice(0) if(keyword.trim() !== '') { state.page = 1 let tasks if (state.showType === "video") tasks = state.totalVideoTask else tasks = state.totalGalleryTask tasks.forEach((task) => { if (task.name.includes(keyword)) state.searchTask.push(task) }) if (state.searchTask.length === 0) { ElMessage("未找到该关键字的任务") } } }, _deleteGallery(state, gid){ state.totalGalleryTask.forEach((item, index, arr) => { if(item.gid === gid){ arr.splice(index, 1) } }) }, _deleteVideo(state, id){ state.totalVideoTask.forEach((item, index, arr) => { if(item.id === id) arr.splice(index, 1) }) }, _setChosenGallery(state,data){ if(data.gallery === false) { state.chosenGallery.resolution = data.resolution state.chosenGallery.fileSize = "等待下载完成后再查看" state.chosenGallery.createTimeDisplay = "等待下载完成后再查看" state.chosenGallery.progress = "已提交" state.totalGalleryTask.push(state.chosenGallery) } state.chosenGallery = data.gallery }, _setChosenVideo(state,data){ if(data.video === false) { state.chosenVideo.resolution = data.resolution state.chosenVideo.fileSize = "下载完成后再查看" state.chosenVideo.duration = "下载完成后再查看" state.chosenVideo.createTimeDisplay = "下载完成后再查看" state.chosenVideo.progress = "已提交" state.totalVideoTask.push(state.chosenVideo) } state.chosenVideo = data.video }, _setShowType(state, showType){ state.showType = showType }, _setSortType(state, sortType){ state.sortType = sortType switch (sortType) { case "fullName": state.totalGalleryTask = state.totalGalleryTask.sort((before, after) => { return before.name > after.name ? 1: -1 }) state.totalVideoTask = state.totalVideoTask.sort((before, after) => { return before.name > after.name ? 1: -1 }) break case "shortName": state.totalGalleryTask = state.totalGalleryTask.sort((before, after) => { return before.shortName > after.shortName ? 1: -1 }) break case "createTime": state.totalGalleryTask = state.totalGalleryTask.sort((before, after) => { return before.createTime - after.createTime }) state.totalVideoTask = state.totalVideoTask.sort((before, after) => { return before.createTime - after.createTime }) } }, _setShowNameType(state, type){ if(type === "shortName") state.length = state.shortLength else state.length = state.defaultLength }, _setMaskDomain(state, maskDomain){ state.maskDomain = maskDomain }, _changeThumbnailGallery(state, gallery){ state.thumbnailGallery = gallery state.thumbnailGallery.url = GalleryManageUrl + "thumbnail/" + encodeURIComponent(gallery.name) + ".webp?AuthCode="+state.AuthCode } } const state = { totalGalleryTask:[], //存放本子数据的数组 chosenGallery:false, //准备下载的本子 thumbnailGallery:{}, totalVideoTask:[], //存放视频数据的数组 chosenVideo:false, //准备下载的视频 page:1, //当前页数 length:10, //每页能有多少个链接 defaultLength:7, //默认个数 shortLength:10, //简洁个数 isAuth:false, //是否授权 AuthCode:'', //授权码 loadComplete:false, //是否加载完成 isInclude:false, //是否搜索到任务 searchTask:[], //搜索到的任务 showHistory:'', //是否打开面板 showType:'gallery', //展示类型 sortType:'name', //排序类型 weekUsed:{}, //每周用量 maskDomain:[] //伪装域名 } const getters = { galleryTasks(state){ if(state.searchTask.length !== 0) return state.searchTask.slice((state.page-1)*state.length, state.page*state.length) if(state.totalGalleryTask.length !== 0) return state.totalGalleryTask.slice((state.page-1)*state.length, state.page*state.length) return null }, videoTasks(state){ if(state.searchTask.length !== 0) return state.searchTask.slice((state.page-1)*state.length, state.page*state.length) if(state.totalVideoTask.length !== 0) return state.totalVideoTask.slice((state.page-1)*state.length, state.page*state.length) return null }, min(){ return 1 }, max(state){ let max = 0 let tasks if(state.searchTask.length !== 0){ tasks = state.searchTask } else if(state.showType === "gallery") if(state.totalGalleryTask.length !== 0) tasks = state.totalGalleryTask else if(state.showType === "video") if(state.totalVideoTask.length) tasks = state.totalVideoTask if(!tasks) return 1 max = Math.floor(tasks.length/state.length) if(tasks.length % state.length !== 0){ max += 1 } return max } } export default new vuex.Store({ actions, mutations, state, getters })