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, type){ axios.get(GalleryManageUrl, { params:{ type, AuthCode: state.AuthCode } }).then((res) => { if(res.data.result === "success") context.commit("_updateGalleryTasks", {tasks:JSON.parse(res.data.data), type}) else if(type === 'undone') { context.dispatch("updateGalleryTasks", "all").then() clearInterval(state.refreshTimer) state.refreshTimer = 0 } }) }, updateVideoTasks(context, type){ axios.get(VideoManageUrl, { params:{ type, AuthCode: state.AuthCode } }).then(res => { if(res.data.result === "success") context.commit("_updateVideoTasks", {tasks:JSON.parse(res.data.data), type}) else if(type === 'undone') { clearInterval(state.refreshTimer) state.refreshTimer = 0 context.dispatch("updateVideoTasks", "all").then() } }) }, postGalleryTask(context, data){ axios.post(GalleryManageUrl, qs.stringify({ AuthCode: state.AuthCode, link: data.link, targetResolution: data.targetResolution })).then((res) => { if(res.data.result === "success") { ElMessage("提交成功") context.commit("_setChosenGallery", {gallery: false, resolution:data.targetResolution}) if(state.refreshTimer === 0) state.refreshTimer = setInterval(() => { context.dispatch("updateGalleryTasks", "undone").then() }, 20000) } else{ if(res.data.data) ElMessage(res.data.data) else ElMessage("提交失败") } }) }, postVideoTask(context, data){ axios.post(VideoManageUrl, qs.stringify({ AuthCode: state.AuthCode, link: data.link, targetResolution: data.targetResolution })).then((res) => { if(res.data.result === "success") { ElMessage("提交成功") context.commit("_setChosenVideo", {video: false, resolution: data.targetResolution}) if(state.refreshTimer === 0) state.refreshTimer = setInterval(() => { context.dispatch("updateVideoTasks", "undone").then() }, 20000) } else{ if(res.data.data) ElMessage(res.data.data) else ElMessage("提交失败") } }) }, queryGalleryTask(context, link){ axios.get(GalleryManageUrl, { params:{ param: link, type:'link', AuthCode: state.AuthCode } }).then((res) => { if(res.data.result === 'success') context.commit("_setChosenGallery", {gallery: JSON.parse(res.data.data)}) else ElMessage("查询失败") }) }, queryVideoTask(context, link){ axios.get(VideoManageUrl, { params:{ param: link, type: "link", AuthCode: state.AuthCode } }).then((res) => { if(res.data.result === 'success') context.commit("_setChosenVideo", {video: JSON.parse(res.data.data)}) else ElMessage("查询失败") }) }, validate(context, AuthCode){ axios.post(BaseUrl + "validate?AuthCode=" + AuthCode).then((res)=>{ if(res.data.result === 'success'){ context.commit("_authed", AuthCode) context.dispatch("loadMaskDomain").then() context.dispatch("loadWeekUsedAmount").then() context.dispatch("updateGalleryTasks", "all").then() context.dispatch("updateVideoTasks", "all").then() } else context.commit("_unAuthed") }) }, 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: 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) } }) }, alterAuthCode(context, AuthCode){ axios.put(BaseUrl + "AuthCode?" + qs.stringify({'AuthCode': state.AuthCode, 'newAuthCode': AuthCode})) .then((res) => { if(res.data.result === 'success') { ElMessage("修改成功") if(localStorage.getItem("auth") === state.AuthCode) localStorage.setItem("auth", AuthCode) context.state.AuthCode = AuthCode } else ElMessage(res.data.data) }) } } const mutations = { _updateGalleryTasks(state, data){ let {tasks, type} = data if(type === 'all') { state.totalGalleryTask.splice(0) 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 } switch (task.status) { case "已提交": task.progress = "已提交" break; case "下载中": task.progress = (Math.round((task.proceeding / task.pages) * 100)).toString() + "%" break; case "下载完成": 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 break; } task.createTimeDisplay = moment(task.createTime * 1000).format("YYYY-MM-DD HH:mm:ss") state.totalGalleryTask.push(task) }) } else { let tempArray = Array.from(state.totalGalleryTask) state.totalGalleryTask.splice(0) let preDeleteIndex tempArray.forEach((task) => { preDeleteIndex = -1 if(task.status !== "下载完成") tasks.forEach((newTask, index) => { if(newTask.name === task.name){ preDeleteIndex = index task.status = newTask.status task.proceeding = newTask.proceeding if(task.proceeding === 0) task.progress = task.status else task.progress = (Math.round((task.proceeding / task.pages) * 100)).toString() + "%" } }) if(preDeleteIndex !== -1) delete tasks[preDeleteIndex] state.totalGalleryTask.push(task) }) } switch (state.sortType) { case "name": state.totalGalleryTask = state.totalGalleryTask.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 }) } if(state.isAuth && !state.loadComplete){ state.loadComplete = true ElMessage("加载完成") } }, _updateVideoTasks(state, data){ let {tasks, type} = data if(type === 'all') { state.totalVideoTask.splice(0) 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) }) } else{ let tempArray = Array.from(state.totalVideoTask) state.totalVideoTask.splice(0) let preDeleteIndex tempArray.forEach((task) => { preDeleteIndex = -1 if(task.status !== "下载完成") tasks.forEach((newTask, index) => { if(newTask.name === task.name){ task.progress = task.status preDeleteIndex = index } }) if(preDeleteIndex !== -1) delete tasks[preDeleteIndex] 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.shortName = getShortName(state.chosenGallery.name) 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 "name": 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, //是否加载完成 refreshTimer:0, //更新计时器id isInclude:false, //是否搜索到任务 searchTask:[], //搜索到的任务 showHistory:'', //是否打开面板 showType:'gallery', //展示类型 sortType:'shortName', //排序类型 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 })