Skip to content

Commit d693bfa

Browse files
authored
Merge pull request #633 from imsyy/dev-perf
✨ feat: 重构播放器相关逻辑
2 parents 7c315d9 + db1745b commit d693bfa

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+2256
-2462
lines changed

electron.vite.config.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ export default defineConfig(({ command, mode }) => {
2828
rollupOptions: {
2929
input: {
3030
index: resolve(__dirname, "electron/main/index.ts"),
31-
lyric: resolve(__dirname, "web/lyric.html"),
3231
},
3332
},
3433
},

src/api/song.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { isElectron } from "@/utils/env";
22
import { defaultAMLLDbServer, songLevelData } from "@/utils/meta";
3-
import { SongUnlockServer } from "@/utils/songManager";
3+
import { SongUnlockServer } from "@/core/player/SongManager";
44
import { useSettingStore } from "@/stores";
55
import request from "@/utils/request";
66

src/components/Card/SongCard.vue

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,9 @@ import { openJumpArtist } from "@/utils/modal";
162162
import { toLikeSong } from "@/utils/auth";
163163
import { isObject } from "lodash-es";
164164
import { formatTimestamp, msToTime } from "@/utils/time";
165-
import { usePlayer } from "@/utils/player";
165+
import { usePlayerController } from "@/core/player/PlayerController";
166166
import { isElectron } from "@/utils/env";
167-
import blob from "@/utils/blob";
167+
import { useBlobURLManager } from "@/core/resource/BlobURLManager";
168168
169169
const props = defineProps<{
170170
// 歌曲
@@ -178,12 +178,14 @@ const props = defineProps<{
178178
}>();
179179
180180
const router = useRouter();
181-
const player = usePlayer();
182181
const dataStore = useDataStore();
183182
const musicStore = useMusicStore();
184183
const statusStore = useStatusStore();
185184
const settingStore = useSettingStore();
186185
186+
const player = usePlayerController();
187+
const blobURLManager = useBlobURLManager();
188+
187189
// 歌曲数据
188190
const song = toRef(props, "song");
189191
@@ -198,12 +200,25 @@ const qualityColor = computed(() => {
198200
// 加载本地歌曲封面
199201
const localCover = async (show: boolean) => {
200202
if (!isElectron || !show || !song.value.path) return;
201-
if (song.value.cover || song.value.cover === "/images/song.jpg?assest") return;
203+
// 是否还在缓存中
204+
const currentCover = song.value.cover;
205+
if (currentCover && currentCover.startsWith("blob:")) {
206+
// 需要重新获取
207+
if (!blobURLManager.hasBlobURL(song.value.path)) {
208+
song.value.cover = "";
209+
} else {
210+
return;
211+
}
212+
}
213+
// 如果已有非 blob URL 的封面,不需要重新获取
214+
if (song.value.cover && song.value.cover !== "" && song.value.cover !== "/images/song.jpg?assest") {
215+
return;
216+
}
202217
// 获取封面
203218
const coverData = await window.electron.ipcRenderer.invoke("get-music-cover", song.value.path);
204219
if (!coverData) return;
205220
const { data, format } = coverData;
206-
const blobURL = blob.createBlobURL(data, format, song.value.path);
221+
const blobURL = blobURLManager.createBlobURL(data, format, song.value.path);
207222
if (blobURL) song.value.cover = blobURL;
208223
};
209224
</script>

src/components/Layout/Menu.vue

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,14 @@ import { openCreatePlaylist } from "@/utils/modal";
3535
import { debounce } from "lodash-es";
3636
import { isLogin } from "@/utils/auth";
3737
import { isElectron } from "@/utils/env";
38-
import { usePlayer } from "@/utils/player";
38+
import { usePlayerController } from "@/core/player/PlayerController";
3939
4040
const router = useRouter();
41-
const player = usePlayer();
4241
const dataStore = useDataStore();
4342
const musicStore = useMusicStore();
4443
const statusStore = useStatusStore();
4544
const settingStore = useSettingStore();
45+
const player = usePlayerController();
4646
4747
// 菜单数据
4848
const menuRef = ref<MenuInst | null>(null);
@@ -272,8 +272,7 @@ const menuUpdate = (key: string, item: MenuOption) => {
272272
// 更改播放模式
273273
statusStore.personalFmMode = true;
274274
statusStore.playHeartbeatMode = false;
275-
player.resetStatus();
276-
player.initPlayer();
275+
player.playSong();
277276
}
278277
statusStore.showFullPlayer = true;
279278
window.$message.info("已开启私人漫游", { icon: renderIcon("Radio") });

src/components/List/CoverList.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,9 @@ import { formatSongsList } from "@/utils/format";
121121
import { songDetail } from "@/api/song";
122122
import { playlistAllSongs } from "@/api/playlist";
123123
import { radioAllProgram } from "@/api/radio";
124-
import { usePlayer } from "@/utils/player";
125-
import CoverMenu from "@/components/Menu/CoverMenu.vue";
124+
import { usePlayerController } from "@/core/player/PlayerController";
126125
import { formatTimestamp } from "@/utils/time";
126+
import CoverMenu from "@/components/Menu/CoverMenu.vue";
127127
128128
interface Props {
129129
data: CoverType[];
@@ -145,9 +145,9 @@ const emit = defineEmits<{
145145
}>();
146146
147147
const router = useRouter();
148-
const player = usePlayer();
149148
const musicStore = useMusicStore();
150149
const statusStore = useStatusStore();
150+
const player = usePlayerController();
151151
152152
// 右键菜单
153153
const coverMenuRef = ref<InstanceType<typeof CoverMenu> | null>(null);

src/components/List/SongList.vue

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ import { useMusicStore, useStatusStore } from "@/stores";
114114
import { entries, isEmpty } from "lodash-es";
115115
import { sortOptions } from "@/utils/meta";
116116
import { renderIcon } from "@/utils/helper";
117-
import { usePlayer } from "@/utils/player";
117+
import { usePlayerController } from "@/core/player/PlayerController";
118118
import SongListMenu from "@/components/Menu/SongListMenu.vue";
119119
120120
const props = withDefaults(
@@ -168,9 +168,9 @@ const emit = defineEmits<{
168168
removeSong: [id: number[]];
169169
}>();
170170
171-
const player = usePlayer();
172171
const musicStore = useMusicStore();
173172
const statusStore = useStatusStore();
173+
const player = usePlayerController();
174174
175175
// 列表状态
176176
const scrollTop = ref<number>(0);
@@ -316,7 +316,6 @@ const sortSelect = (key: SortType) => {
316316
player.updatePlayList(listData.value, musicStore.playSong, props.playListId, {
317317
showTip: false,
318318
play: false,
319-
scrobble: false,
320319
});
321320
}
322321
// 滚动到当前播放歌曲或顶部

src/components/Menu/SongListMenu.vue

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import type { SongType } from "@/types/main";
2020
import { NAlert, type DropdownOption } from "naive-ui";
2121
import { useStatusStore, useDataStore, useMusicStore } from "@/stores";
22-
import DownloadManager from "@/utils/downloadManager";
22+
import { useDownloadManager } from "@/core/resource/DownloadManager";
2323
import { renderIcon, copyData } from "@/utils/helper";
2424
import { deleteCloudSong, importCloudSong } from "@/api/cloud";
2525
import {
@@ -32,15 +32,17 @@ import { deleteSongs, isLogin } from "@/utils/auth";
3232
import { songUrl } from "@/api/song";
3333
import { dailyRecommendDislike } from "@/api/rec";
3434
import { formatSongsList } from "@/utils/format";
35-
import { usePlayer } from "@/utils/player";
35+
import { usePlayerController } from "@/core/player/PlayerController";
3636
3737
const emit = defineEmits<{ removeSong: [index: number[]] }>();
3838
3939
const router = useRouter();
40-
const player = usePlayer();
4140
const dataStore = useDataStore();
42-
const statusStore = useStatusStore();
4341
const musicStore = useMusicStore();
42+
const statusStore = useStatusStore();
43+
44+
const player = usePlayerController();
45+
const downloadManager = useDownloadManager();
4446
4547
// 右键菜单数据
4648
const dropdownX = ref<number>(0);
@@ -256,7 +258,7 @@ const openDropdown = (
256258
key: "retry-download",
257259
label: "重试下载",
258260
show: isDownloading,
259-
props: { onClick: () => DownloadManager.retryDownload(song.id) },
261+
props: { onClick: () => downloadManager.retryDownload(song.id) },
260262
icon: renderIcon("Refresh"),
261263
},
262264
];

src/components/Modal/AutoClose.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@
6666
<script setup lang="ts">
6767
import { useStatusStore } from "@/stores";
6868
import { convertSecondsToTime } from "@/utils/time";
69-
import { usePlayer } from "@/utils/player";
69+
import { usePlayerController } from "@/core/player/PlayerController";
7070
71-
const player = usePlayer();
71+
const player = usePlayerController();
7272
const statusStore = useStatusStore();
7373
7474
// 自定义时长

src/components/Modal/ChangeRate.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232

3333
<script setup lang="ts">
3434
import { useStatusStore } from "@/stores";
35-
import { usePlayer } from "@/utils/player";
35+
import { usePlayerController } from "@/core/player/PlayerController";
3636
37-
const player = usePlayer();
37+
const player = usePlayerController();
3838
const statusStore = useStatusStore();
3939
</script>

src/components/Modal/DownloadModal.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,9 @@ import { openSetting } from "@/utils/modal";
7878
import { isElectron } from "@/utils/env";
7979
import { songDetail } from "@/api/song";
8080
import { formatSongsList } from "@/utils/format";
81-
import SongDataCard from "@/components/Card/SongDataCard.vue";
8281
import { pick } from "lodash-es";
83-
import DownloadManager from "@/utils/downloadManager";
82+
import { useDownloadManager } from "@/core/resource/DownloadManager";
83+
import SongDataCard from "@/components/Card/SongDataCard.vue";
8484
8585
const props = defineProps<{
8686
songs?: SongType[];
@@ -93,7 +93,7 @@ const emit = defineEmits<{
9393
}>();
9494
9595
const settingStore = useSettingStore();
96-
96+
const downloadManager = useDownloadManager();
9797
const loading = ref<boolean>(false);
9898
const songs = ref<SongType[]>(props.songs || []);
9999
@@ -148,7 +148,7 @@ const handleConfirm = () => {
148148
149149
// 添加到下载队列
150150
songs.value.forEach((song) => {
151-
DownloadManager.addDownload(song, selectedQuality.value);
151+
downloadManager.addDownload(song, selectedQuality.value);
152152
});
153153
154154
emit("close");

0 commit comments

Comments
 (0)