Feat: impl source plugin

This commit is contained in:
zijiren233 2024-05-10 13:35:32 +08:00
parent 3a6d40f5f2
commit 536d6f40af
4 changed files with 89 additions and 66 deletions

View File

@ -5,28 +5,23 @@ interface artplayPluginSource {
html: string;
}
function artplayPluginSource(option: [artplayPluginSource]) {
export function artplayPluginSource(option: artplayPluginSource[]) {
return (art: Artplayer) => {
const storageSource = art.storage.get("source");
art.controls.add({
position: "right",
html: storageSource || "源",
html: "源",
selector: option,
onSelect: function (item: artplayPluginSource) {
art.switchQuality(item.url);
art.storage.set("source", item.html);
return item.html;
const status = art.plugins["syncPlugin"].currentStatus();
art.once("video:canplay", () => {
art.plugins["syncPlugin"].setAndNoPublishStatus(status);
});
art.url = item.url;
return "源";
}
});
if (storageSource) {
const source = option.find((item) => item.html === storageSource);
if (source) {
art.url = source.url;
} else {
art.url = option[0].url;
}
} else {
art.url = option[0].url;
}
return {
name: "source"
};
};
}

View File

@ -37,6 +37,8 @@ interface syncPlugin {
setAndNoPublishPlay: () => void;
setAndNoPublishPause: () => void;
setAndNoPublishRate: (rate: number) => void;
setAndNoPublishStatus: (status: MovieStatus) => void;
currentStatus: () => MovieStatus;
}
const debounceTime = 500;
@ -202,6 +204,22 @@ export const newSyncPlugin = (
);
};
const setAndNoPublishStatus = async (status: MovieStatus) => {
if (!art.option.isLive) {
setAndNoPublishRate(status.rate);
setAndNoPublishSeek(status.seek);
}
status.playing ? await setAndNoPublishPlay() : setAndNoPublishPause();
};
const currentStatus = (): MovieStatus => {
return {
playing: art.playing,
seek: art.currentTime,
rate: art.playbackRate
};
};
if (!art.option.isLive) {
art.once("ready", async () => {
console.log("同步进度中...");
@ -265,7 +283,9 @@ export const newSyncPlugin = (
setAndNoPublishSeek,
setAndNoPublishPlay,
setAndNoPublishPause,
setAndNoPublishRate
setAndNoPublishRate,
setAndNoPublishStatus,
currentStatus
};
};
};

View File

@ -28,6 +28,7 @@ import type { Subtitles } from "@/types/Movie";
import { RoomMemberPermission } from "@/types/Room";
import artplayerPluginAss from "@/plugins/artplayer-plugin-ass";
import { newSyncPlugin } from "@/plugins/sync";
import { artplayPluginSource } from "@/plugins/source";
const Player = defineAsyncComponent(() => import("@/components/Player.vue"));

View File

@ -1,6 +1,6 @@
import { fileURLToPath, URL } from "node:url";
import { defineConfig, loadEnv } from "vite";
import { defineConfig, loadEnv, type UserConfigFnObject, UserConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
@ -9,52 +9,59 @@ import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
const env = loadEnv("", process.cwd());
// https://vitejs.dev/config/
export default defineConfig({
server: {
host: true,
proxy: {
"/api": {
target: env.VITE_SERVER_TARGET || "http://127.0.0.1:8088",
changeOrigin: true,
ws: true
},
"/oauth2": {
target: env.VITE_SERVER_TARGET || "http://127.0.0.1:8088",
changeOrigin: true,
ws: false
const config: UserConfigFnObject = ({ command, mode, ssrBuild }): UserConfig => {
let c: UserConfig = {
server: {
host: true,
proxy: {
"/api": {
target: env.VITE_SERVER_TARGET || "http://127.0.0.1:8088",
changeOrigin: true,
ws: true
},
"/oauth2": {
target: env.VITE_SERVER_TARGET || "http://127.0.0.1:8088",
changeOrigin: true,
ws: false
}
}
}
},
plugins: [
AutoImport({
resolvers: [ElementPlusResolver()]
}),
Components({
resolvers: [ElementPlusResolver()]
}),
vue()
],
resolve: {
alias: {
"@": fileURLToPath(new URL("./src", import.meta.url))
}
},
build: {
cssCodeSplit: true,
minify: "esbuild",
cssMinify: "lightningcss",
reportCompressedSize: false,
assetsInlineLimit: 0 // 禁止内敛为base64
},
esbuild: {
drop: ["console", "debugger"]
},
base: env.VITE_BASEURL,
css: {
lightningcss: {}
},
json: {
stringify: true
},
envPrefix: "VITE_"
});
},
plugins: [
AutoImport({
resolvers: [ElementPlusResolver()]
}),
Components({
resolvers: [ElementPlusResolver()]
}),
vue()
],
resolve: {
alias: {
"@": fileURLToPath(new URL("./src", import.meta.url))
}
},
build: {
cssCodeSplit: true,
minify: "esbuild",
cssMinify: "lightningcss",
reportCompressedSize: false,
assetsInlineLimit: 0 // 禁止内敛为base64
},
base: env.VITE_BASEURL,
css: {
lightningcss: {}
},
json: {
stringify: true
},
envPrefix: "VITE_"
};
if (mode !== "development") {
c.esbuild = {
drop: ["console", "debugger"]
};
}
return c;
};
export default defineConfig(config);