feat: 优化更新检查 下载 功能

This commit is contained in:
alger
2025-01-04 16:13:37 +08:00
parent 3d3992154a
commit 11ced6b418
6 changed files with 91 additions and 26 deletions

View File

@@ -44,10 +44,11 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, ref, computed } from 'vue'; import { onMounted, ref, computed, watch } from 'vue';
import { marked } from 'marked'; import { marked } from 'marked';
import { checkUpdate, UpdateResult } from '@/utils/update'; import { checkUpdate, UpdateResult } from '@/utils/update';
import config from '../../../../package.json'; import config from '../../../../package.json';
import { useStore } from 'vuex';
// 配置 marked // 配置 marked
marked.setOptions({ marked.setOptions({
@@ -64,6 +65,25 @@ const updateInfo = ref<UpdateResult>({
releaseInfo: null releaseInfo: null
}); });
const store = useStore()
// 添加计算属性
const showUpdateModalState = computed({
get: () => store.state.showUpdateModal,
set: (val) => store.commit('SET_SHOW_UPDATE_MODAL', val)
})
// 替换原来的 watch
watch(showUpdateModalState, (newVal) => {
if (newVal) {
showModal.value = true
}
})
watch(() => showModal.value, (newVal) => {
showUpdateModalState.value = newVal
})
// 解析 Markdown // 解析 Markdown
const parsedReleaseNotes = computed(() => { const parsedReleaseNotes = computed(() => {
if (!updateInfo.value.releaseInfo?.body) return ''; if (!updateInfo.value.releaseInfo?.body) return '';
@@ -96,12 +116,30 @@ const checkForUpdates = async () => {
} }
}; };
const handleUpdate = async () => { const handleUpdate = async () => {
const assets = updateInfo.value.releaseInfo?.assets || []; const assets = updateInfo.value.releaseInfo?.assets || [];
const platform = window.electron.process.platform; const platform = window.electron.process.platform;
const arch = window.electron.ipcRenderer.sendSync('get-arch'); const arch = window.electron.ipcRenderer.sendSync('get-arch');
console.log(arch); console.log('arch',arch)
console.log(platform); console.log('platform',platform)
const version = updateInfo.value.latestVersion
const downUrls = {
win32: {
all: `https://github.com/algerkong/AlgerMusicPlayer/releases/download/v${version}/AlgerMusicPlayer-${version}-win.exe`,
x64: `https://github.com/algerkong/AlgerMusicPlayer/releases/download/v${version}/AlgerMusicPlayer-${version}-win-x64.exe`,
ia32: `https://github.com/algerkong/AlgerMusicPlayer/releases/download/v${version}/AlgerMusicPlayer-${version}-win-ia32.exe`,
},
darwin: {
all: `https://github.com/algerkong/AlgerMusicPlayer/releases/download/v${version}AlgerMusicPlayer-${version}-mac-universal.dmg`,
},
linux: {
AppImage: `https://github.com/algerkong/AlgerMusicPlayer/releases/download/v${version}/AlgerMusicPlayer-${version}-linux-x64.AppImage`,
deb: `https://github.com/algerkong/AlgerMusicPlayer/releases/download/v${version}/AlgerMusicPlayer-${version}-linux-x64.deb`,
}
}
let downloadUrl = ''; let downloadUrl = '';
@@ -111,30 +149,29 @@ const handleUpdate = async () => {
const macAsset = assets.find(asset => const macAsset = assets.find(asset =>
asset.name.includes('mac') asset.name.includes('mac')
); );
downloadUrl = macAsset?.browser_download_url || ''; downloadUrl = macAsset?.browser_download_url || downUrls.darwin.all || '';
} else if (platform === 'win32') { } else if (platform === 'win32') {
// Windows // Windows
const winAsset = assets.find(asset => const winAsset = assets.find(asset =>
asset.name.includes('win') && asset.name.includes('win') &&
(arch === 'x64' ? asset.name.includes('x64') : asset.name.includes('ia32')) (arch === 'x64' ? asset.name.includes('x64') : asset.name.includes('ia32'))
); );
downloadUrl = winAsset?.browser_download_url || ''; downloadUrl = winAsset?.browser_download_url || downUrls.win32[arch] || downUrls.win32.all || '';
} else if (platform === 'linux') { } else if (platform === 'linux') {
// Linux // Linux
const linuxAsset = assets.find(asset => const linuxAsset = assets.find(asset =>
(asset.name.endsWith('.AppImage') || asset.name.endsWith('.deb')) && (asset.name.endsWith('.AppImage') || asset.name.endsWith('.deb')) &&
asset.name.includes('x64') asset.name.includes('x64')
); );
downloadUrl = linuxAsset?.browser_download_url || ''; downloadUrl = linuxAsset?.browser_download_url || downUrls.linux[arch] || '';
} }
if (downloadUrl) { if (downloadUrl) {
window.open(`https://ghproxy.cn/${downloadUrl}`, '_blank'); window.open(`https://www.ghproxy.cn/${downloadUrl}`, '_blank');
} else { } else {
// 如果没有找到对应的安装包,跳转到 release 页面 // 如果没有找到对应的安装包,跳转到 release 页面
window.open('https://github.com/algerkong/AlgerMusicPlayer/releases/latest', '_blank'); window.open('https://github.com/algerkong/AlgerMusicPlayer/releases/latest', '_blank');
} }
closeModal();
}; };
onMounted(() => { onMounted(() => {

View File

@@ -28,7 +28,7 @@
<play-bar v-if="isPlay" :style="isMobile && store.state.musicFull ? 'bottom: 0;' : ''" /> <play-bar v-if="isPlay" :style="isMobile && store.state.musicFull ? 'bottom: 0;' : ''" />
</div> </div>
<install-app-modal v-if="!isElectron"></install-app-modal> <install-app-modal v-if="!isElectron"></install-app-modal>
<update-modal /> <update-modal v-if="isElectron"/>
</div> </div>
</template> </template>

View File

@@ -237,7 +237,7 @@ const checkForUpdates = async () => {
const toGithubRelease = () => { const toGithubRelease = () => {
if (updateInfo.value.hasUpdate) { if (updateInfo.value.hasUpdate) {
window.open(updateInfo.value.releaseInfo?.html_url || 'https://github.com/algerkong/AlgerMusicPlayer/releases/latest', '_blank'); store.commit('SET_SHOW_UPDATE_MODAL', true)
} else { } else {
window.open('https://github.com/algerkong/AlgerMusicPlayer/releases', '_blank'); window.open('https://github.com/algerkong/AlgerMusicPlayer/releases', '_blank');
} }

View File

@@ -38,6 +38,7 @@ interface State {
playMode: number; playMode: number;
theme: ThemeType; theme: ThemeType;
musicFull: boolean; musicFull: boolean;
showUpdateModal: boolean;
} }
const state: State = { const state: State = {
@@ -57,7 +58,8 @@ const state: State = {
favoriteList: getLocalStorageItem('favoriteList', []), favoriteList: getLocalStorageItem('favoriteList', []),
playMode: getLocalStorageItem('playMode', 0), playMode: getLocalStorageItem('playMode', 0),
theme: getCurrentTheme(), theme: getCurrentTheme(),
musicFull: false musicFull: false,
showUpdateModal: false
}; };
const { handlePlayMusic, nextPlay, prevPlay } = useMusicListHook(); const { handlePlayMusic, nextPlay, prevPlay } = useMusicListHook();
@@ -117,6 +119,9 @@ const mutations = {
toggleTheme(state: State) { toggleTheme(state: State) {
state.theme = state.theme === 'dark' ? 'light' : 'dark'; state.theme = state.theme === 'dark' ? 'light' : 'dark';
applyTheme(state.theme); applyTheme(state.theme);
},
SET_SHOW_UPDATE_MODAL(state, value) {
state.showUpdateModal = value
} }
}; };

View File

@@ -1,7 +1,6 @@
import axios from 'axios'; import axios from 'axios';
import config from '../../../package.json'; import config from '../../../package.json';
import { useDateFormat } from '@vueuse/core'; import { useDateFormat } from '@vueuse/core';
interface GithubReleaseInfo { interface GithubReleaseInfo {
tag_name: string; tag_name: string;
body: string; body: string;
@@ -36,20 +35,41 @@ export const getLatestReleaseInfo = async (): Promise<GithubReleaseInfo | null>
try { try {
const token = import.meta.env.VITE_GITHUB_TOKEN; const token = import.meta.env.VITE_GITHUB_TOKEN;
const headers = {}; const headers = {};
if (token) {
headers['Authorization'] = `token ${token}`; const apiUrls = [
} // 原始地址
const response = await axios.get(
'https://api.github.com/repos/algerkong/AlgerMusicPlayer/releases/latest', 'https://api.github.com/repos/algerkong/AlgerMusicPlayer/releases/latest',
{
headers // 使用 ghproxy.com 代理
} 'https://www.ghproxy.cn/https://raw.githubusercontent.com/algerkong/AlgerMusicPlayer/dev_electron/package.json',
);
// 使用 gitee 镜像(如果有的话)
if (response.data) { // 'https://gitee.com/api/v5/repos/[用户名]/AlgerMusicPlayer/releases/latest'
return response.data; ];
if (token) {
headers['Authorization'] = `token ${token}`;
} }
return null;
for (const url of apiUrls) {
try {
const response = await axios.get(url, { headers });
if (url.includes('package.json')) {
// 如果是 package.json直接读取版本号
return {
tag_name: response.data.version,
body:(await axios.get('https://raw.githubusercontent.com/algerkong/AlgerMusicPlayer/dev_electron/CHANGELOG.md')).data,
html_url: 'https://github.com/algerkong/AlgerMusicPlayer/releases/latest',
assets: []
} as unknown as GithubReleaseInfo;
}
return response.data;
} catch (err) {
console.warn(`尝试访问 ${url} 失败:`, err);
continue;
}
}
throw new Error('所有 API 地址均无法访问');
} catch (error) { } catch (error) {
console.error('获取 GitHub Release 信息失败:', error); console.error('获取 GitHub Release 信息失败:', error);
return null; return null;
@@ -69,6 +89,7 @@ const formatDate = (dateStr: string): string => {
export const checkUpdate = async (currentVersion: string = config.version): Promise<UpdateResult | null> => { export const checkUpdate = async (currentVersion: string = config.version): Promise<UpdateResult | null> => {
try { try {
const releaseInfo = await getLatestReleaseInfo(); const releaseInfo = await getLatestReleaseInfo();
console.log('releaseInfo',releaseInfo)
if (!releaseInfo) { if (!releaseInfo) {
return null; return null;
} }
@@ -77,6 +98,8 @@ export const checkUpdate = async (currentVersion: string = config.version): Prom
if (latestVersion === currentVersion) { if (latestVersion === currentVersion) {
return null; return null;
} }
console.log('latestVersion',latestVersion)
console.log('currentVersion',currentVersion)
return { return {
hasUpdate: true, hasUpdate: true,
@@ -84,7 +107,7 @@ export const checkUpdate = async (currentVersion: string = config.version): Prom
currentVersion, currentVersion,
releaseInfo: { releaseInfo: {
tag_name: latestVersion, tag_name: latestVersion,
body: `## 更新内容\n\n- 版本: ${latestVersion}\n- 发布时间: ${formatDate(releaseInfo.published_at)}\n\n${releaseInfo.body}`, body: `## 更新内容\n\n- 版本: ${latestVersion}\n${releaseInfo.body}`,
html_url: releaseInfo.html_url, html_url: releaseInfo.html_url,
assets: releaseInfo.assets.map(asset => ({ assets: releaseInfo.assets.map(asset => ({
browser_download_url: asset.browser_download_url, browser_download_url: asset.browser_download_url,

View File

@@ -290,7 +290,7 @@ const checkForUpdates = async (isClick = false) => {
}; };
const openReleasePage = () => { const openReleasePage = () => {
window.open(updateInfo.value.releaseInfo?.html_url || 'https://github.com/algerkong/AlgerMusicPlayer/releases/latest', '_blank'); store.commit('SET_SHOW_UPDATE_MODAL', true)
}; };
const selectDownloadPath = async () => { const selectDownloadPath = async () => {