import vuex from "vuex" import axios from "axios" import {ElMessage} from "element-plus" import qs from "qs" const BaseUrl = "http://downloader.lionwebsite.xyz/" const GalleryTaskHandlerUrl = BaseUrl + "GalleryTaskHandler/" const VideoTaskHandlerUrl = BaseUrl + "VideoTaskHandler/" const actions = { updateGalleryTasks(context){ const AuthCode = context.state.AuthCode axios.get(GalleryTaskHandlerUrl, { params:{ param:"", type:"all", AuthCode } }).then((res) => { let temp = [] context.commit("_emptyGalleryTasks") JSON.parse(res.data.data).forEach((task) => { temp.push(task) }) context.commit("_updateGalleryTasks", temp) }) }, updateVideoTasks(context){ const AuthCode = context.state.AuthCode axios.get(VideoTaskHandlerUrl, { params:{ param:"123", type:"all", AuthCode } }).then(res => { let temp = [] context.commit("_emptyVideoTasks") JSON.parse(res.data.data).forEach(task => { temp.push(task) }) context.commit("_updateVideoTasks", temp) }) }, postGalleryTask(context, data){ axios.post(GalleryTaskHandlerUrl, qs.stringify({ AuthCode:context.state.AuthCode, link:data.link, targetResolution:data.targetResolution })).then((res) => { if(res.data.result === "success") { ElMessage("提交成功") context.commit("_setPreDownloadGallery", {gallery:false, resolution:data.targetResolution}) } else{ if(res.data.data) ElMessage(res.data.data) else{ ElMessage("提交失败") } } }) }, postVideoTask(context, data){ axios.post(VideoTaskHandlerUrl, qs.stringify({ AuthCode:context.state.AuthCode, link: data.link, targetResolution: data.targetResolution })).then((res) => { if(res.data.result === "success") { ElMessage("提交成功") context.commit("_setPreDownloadVideo", {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(GalleryTaskHandlerUrl, { params:{ param:link, type:'link', AuthCode } }).then((res) => { if(res.data.result === 'success'){ const gallery = JSON.parse(res.data.data) context.commit("_setPreDownloadGallery", {gallery}) } else ElMessage("查询失败") }) }, queryVideoTask(context, link){ const AuthCode = context.state.AuthCode axios.get(VideoTaskHandlerUrl, { params:{ param: link, type:"link", AuthCode } }).then((res) => { if(res.data.result === 'success'){ const video = JSON.parse(res.data.data) context.commit("_setPreDownloadVideo", {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() 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)) } }) }, searchByLink(context, link){ context.commit("_searchByLink", link) }, searchByKeyword(context, keyword){ context.commit("_searchByKeyword", keyword) }, deleteGallery(context, gid){ axios.delete(GalleryTaskHandlerUrl, { 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(VideoTaskHandlerUrl, { 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){ const downloadUrl = GalleryTaskHandlerUrl + "file?link=" tasks.forEach((task) => { 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 = downloadUrl + tempLink + "&AuthCode=" + state.AuthCode } state.totalGalleryTask.push(task) }) if(state.isAuth && !state.loadComplete){ state.loadComplete = true ElMessage("加载完成") } }, _updateVideoTasks(state, tasks){ const downloadUrl = VideoTaskHandlerUrl + "file?link=" 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 = downloadUrl + tempLink + "&AuthCode=" + state.AuthCode } state.totalVideoTask.push(task) }) }, _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("已跳转到该任务所在页数") } }, _searchByKeyword(state, keyword){ state.searchTask.splice(0) 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) }) }, _setPreDownloadGallery(state,data){ if(data.gallery === false) { state.preDownloadGallery.resolution = data.resolution state.preDownloadGallery.fileSize = "等待下载完成后再查看" state.totalGalleryTask.push(state.preDownloadGallery) } state.preDownloadGallery = data.gallery }, _setPreDownloadVideo(state,data){ if(data.video === false) { state.preDownloadVideo.resolution = data.resolution state.preDownloadVideo.fileSize = "下载完成后再查看" state.preDownloadVideo.duration = "下载完成后再查看" state.totalVideoTask.push(state.preDownloadVideo) } state.preDownloadVideo = data.video }, _setShowType(state, showType){ state.showType = showType }, _setMaskDomain(state, maskDomain){ state.maskDomain = maskDomain }, _openHistoryPanel(state){ state.showHistory = true }, _closeHistoryPanel(state){ state.showHistory = false } } const state = { totalGalleryTask:[], //存放本子数据的数组 preDownloadGallery:false, //准备下载的本子 totalVideoTask:[], //存放视频数据的数组 preDownloadVideo:false, //准备下载的视频 page:1, //当前页数 length:8, //每页能有多少个链接 isAuth:false, //是否授权 AuthCode:'', //授权码 loadComplete:false, //是否加载完成 isInclude:false, //是否搜索到任务 searchTask:[], //搜索到的任务 showHistory:'', //是否打开面板 showType:"gallery", 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.showHistory === "gallery") if(state.totalGalleryTask.length !== 0) tasks = state.totalGalleryTask else if(state.showHistory === "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 }, isAuth(state){ return state.isAuth }, page(state){ return state.page }, loadComplete(state){ return state.loadComplete }, preDownloadGallery(state){ return state.preDownloadGallery }, preDownloadVideo(state){ return state.preDownloadVideo }, showHistory(state){ return state.showHistory }, showType(state){ return state.showType }, maskDomain(state){ return state.maskDomain } } export default new vuex.Store({ actions, mutations, state, getters })