mirror of
https://github.com/Zagrios/bs-manager.git
synced 2026-07-03 14:08:25 +02:00
create one click install playlist window
This commit is contained in:
Generated
+16
-14
@@ -1845,6 +1845,8 @@
|
||||
},
|
||||
"@tippyjs/react": {
|
||||
"version": "4.2.6",
|
||||
"resolved": "https://registry.npmjs.org/@tippyjs/react/-/react-4.2.6.tgz",
|
||||
"integrity": "sha512-91RicDR+H7oDSyPycI13q3b7o4O60wa2oRbjlz2fyRLmHImc4vyDwuUP8NtZaN0VARJY5hybvDYrFzhY9+Lbyw==",
|
||||
"requires": {
|
||||
"tippy.js": "^6.3.1"
|
||||
}
|
||||
@@ -1887,7 +1889,7 @@
|
||||
},
|
||||
"@types/archiver": {
|
||||
"version": "5.3.1",
|
||||
"resolved": "https://npm.zone51.tf/@types%2farchiver/-/archiver-5.3.1.tgz",
|
||||
"resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-5.3.1.tgz",
|
||||
"integrity": "sha512-wKYZaSXaDvTZuInAWjCeGG7BEAgTWG2zZW0/f7IYFcoHB2X2d9lkVFnrOlXl3W6NrvO6Ml3FLLu8Uksyymcpnw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
@@ -2389,7 +2391,7 @@
|
||||
},
|
||||
"@types/yargs": {
|
||||
"version": "17.0.13",
|
||||
"resolved": "https://registry.npmjs.org/@types%2fyargs/-/yargs-17.0.13.tgz",
|
||||
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz",
|
||||
"integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
@@ -2991,7 +2993,7 @@
|
||||
},
|
||||
"archiver": {
|
||||
"version": "5.3.1",
|
||||
"resolved": "https://npm.zone51.tf/archiver/-/archiver-5.3.1.tgz",
|
||||
"resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz",
|
||||
"integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==",
|
||||
"requires": {
|
||||
"archiver-utils": "^2.1.0",
|
||||
@@ -3005,7 +3007,7 @@
|
||||
},
|
||||
"archiver-utils": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://npm.zone51.tf/archiver-utils/-/archiver-utils-2.1.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz",
|
||||
"integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
|
||||
"requires": {
|
||||
"glob": "^7.1.4",
|
||||
@@ -4039,7 +4041,7 @@
|
||||
},
|
||||
"compress-commons": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://npm.zone51.tf/compress-commons/-/compress-commons-4.1.1.tgz",
|
||||
"resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz",
|
||||
"integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==",
|
||||
"requires": {
|
||||
"buffer-crc32": "^0.2.13",
|
||||
@@ -4257,12 +4259,12 @@
|
||||
},
|
||||
"crc-32": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://npm.zone51.tf/crc-32/-/crc-32-1.2.2.tgz",
|
||||
"resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
|
||||
"integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="
|
||||
},
|
||||
"crc32-stream": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://npm.zone51.tf/crc32-stream/-/crc32-stream-4.0.2.tgz",
|
||||
"resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz",
|
||||
"integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==",
|
||||
"requires": {
|
||||
"crc-32": "^1.2.0",
|
||||
@@ -6880,7 +6882,7 @@
|
||||
},
|
||||
"fs-constants": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://npm.zone51.tf/fs-constants/-/fs-constants-1.0.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
|
||||
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
|
||||
},
|
||||
"fs-extra": {
|
||||
@@ -9432,7 +9434,7 @@
|
||||
},
|
||||
"lazystream": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://npm.zone51.tf/lazystream/-/lazystream-1.0.1.tgz",
|
||||
"resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
|
||||
"integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
|
||||
"requires": {
|
||||
"readable-stream": "^2.0.5"
|
||||
@@ -11763,7 +11765,7 @@
|
||||
},
|
||||
"readdir-glob": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://npm.zone51.tf/readdir-glob/-/readdir-glob-1.1.2.tgz",
|
||||
"resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz",
|
||||
"integrity": "sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==",
|
||||
"requires": {
|
||||
"minimatch": "^5.1.0"
|
||||
@@ -11771,7 +11773,7 @@
|
||||
"dependencies": {
|
||||
"brace-expansion": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://npm.zone51.tf/brace-expansion/-/brace-expansion-2.0.1.tgz",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
|
||||
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
|
||||
"requires": {
|
||||
"balanced-match": "^1.0.0"
|
||||
@@ -11779,7 +11781,7 @@
|
||||
},
|
||||
"minimatch": {
|
||||
"version": "5.1.0",
|
||||
"resolved": "https://npm.zone51.tf/minimatch/-/minimatch-5.1.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz",
|
||||
"integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
|
||||
"requires": {
|
||||
"brace-expansion": "^2.0.1"
|
||||
@@ -12944,7 +12946,7 @@
|
||||
},
|
||||
"tar-stream": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://npm.zone51.tf/tar-stream/-/tar-stream-2.2.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
|
||||
"integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
|
||||
"requires": {
|
||||
"bl": "^4.0.3",
|
||||
@@ -14124,7 +14126,7 @@
|
||||
},
|
||||
"zip-stream": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://npm.zone51.tf/zip-stream/-/zip-stream-4.1.0.tgz",
|
||||
"resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz",
|
||||
"integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==",
|
||||
"requires": {
|
||||
"archiver-utils": "^2.1.0",
|
||||
|
||||
Generated
+9
-1227
File diff suppressed because it is too large
Load Diff
@@ -35,4 +35,15 @@ ipcMain.on("bsv-get-map-details-by-id", async (event, request: IpcRequest<string
|
||||
}).catch(e => {
|
||||
utlis.ipcSend(request.responceChannel, {success: false, error: e});
|
||||
})
|
||||
});
|
||||
|
||||
ipcMain.on("bsv-get-playlist-details-by-id", async (event, request: IpcRequest<string>) => {
|
||||
const utlis = UtilsService.getInstance();
|
||||
const bsvService = BeatSaverService.getInstance();
|
||||
|
||||
bsvService.getPlaylistPage(request.args).then(maps => {
|
||||
utlis.ipcSend(request.responceChannel, {success: true, data: maps});
|
||||
}).catch(e => {
|
||||
utlis.ipcSend(request.responceChannel, {success: false, error: e});
|
||||
})
|
||||
});
|
||||
@@ -1,6 +1,5 @@
|
||||
import path from "path";
|
||||
import { BehaviorSubject } from "rxjs";
|
||||
import { Observable } from "rxjs";
|
||||
import { BehaviorSubject, Observable } from "rxjs";
|
||||
import { BSVersion } from "shared/bs-version.interface";
|
||||
import { BsvPlaylist, BsvPlaylistPage } from "shared/models/maps/beat-saver.model";
|
||||
import { BSLocalVersionService } from "../bs-local-version.service";
|
||||
@@ -47,12 +46,12 @@ export class LocalPlaylistsManagerService {
|
||||
this.windows = WindowManagerService.getInstance();
|
||||
|
||||
this.deepLink.addLinkOpenedListener(this.DEEP_LINKS.BeatSaver, link => {
|
||||
|
||||
log.info("DEEP-LINK RECEIVED FROM", this.DEEP_LINKS.BeatSaver, link);
|
||||
const url = new URL(link);
|
||||
const bplistUrl = url.host === "playlist" ? url.pathname.replace("/", "") : "";
|
||||
const playlistId = this.getPlaylistIdFromDownloadUrl(bplistUrl);
|
||||
|
||||
this.openOneClickDownloadPlaylistWindow(playlistId);
|
||||
this.openOneClickDownloadPlaylistWindow(bplistUrl);
|
||||
|
||||
});
|
||||
|
||||
@@ -91,10 +90,10 @@ export class LocalPlaylistsManagerService {
|
||||
// TODO
|
||||
}
|
||||
|
||||
private openOneClickDownloadPlaylistWindow(playlistId: string): void{
|
||||
private openOneClickDownloadPlaylistWindow(downloadUrl: string): void{
|
||||
|
||||
ipcMain.once("one-click-playlist-info", async (event, req: IpcRequest<void>) => {
|
||||
this.utils.ipcSend(req.responceChannel, {success: true, data: playlistId});
|
||||
ipcMain.on("one-click-playlist-info", async (event, req: IpcRequest<void>) => {
|
||||
this.utils.ipcSend(req.responceChannel, {success: true, data: {bpListUrl: downloadUrl, id: this.getPlaylistIdFromDownloadUrl(downloadUrl)}});
|
||||
});
|
||||
|
||||
this.windows.openWindow("oneclick-download-playlist.html");
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { ApiResult } from "renderer/models/api/api.model";
|
||||
import { BsvMapDetail } from "shared/models/maps";
|
||||
import { BsvPlaylistPage, MapFilter, SearchParams, SearchResponse } from "shared/models/maps/beat-saver.model";
|
||||
import { BsvPlaylist, BsvPlaylistPage, MapFilter, SearchParams, SearchResponse } from "shared/models/maps/beat-saver.model";
|
||||
import fetch from "node-fetch"
|
||||
|
||||
export class BeatSaverApiService {
|
||||
@@ -121,13 +121,13 @@ export class BeatSaverApiService {
|
||||
|
||||
}
|
||||
|
||||
public async getPlaylistDetails(id: number): Promise<ApiResult<BsvPlaylistPage>>{
|
||||
public async getPlaylistDetails(id: string): Promise<ApiResult<BsvPlaylist>>{
|
||||
|
||||
const res = await fetch(`${this.bsaverApiUrl}/playlists/id/${id}`);
|
||||
const res = await fetch(`${this.bsaverApiUrl}/playlists/id/${id}/0`);
|
||||
|
||||
const data = await res.json() as BsvPlaylistPage;
|
||||
|
||||
return {status: res.status, data};
|
||||
return {status: res.status, data: data.playlist};
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ export class BeatSaverService {
|
||||
|
||||
}
|
||||
|
||||
public async getPlaylistPage(id: number): Promise<BsvPlaylistPage>{
|
||||
public async getPlaylistPage(id: string): Promise<BsvPlaylist>{
|
||||
|
||||
const res = await this.bsaverApi.getPlaylistDetails(id);
|
||||
return res.data;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { BsvMapDetail } from "shared/models/maps";
|
||||
import { SearchParams } from "shared/models/maps/beat-saver.model";
|
||||
import { BsvPlaylist, BsvPlaylistPage, SearchParams } from "shared/models/maps/beat-saver.model";
|
||||
import { IpcService } from "../ipc.service";
|
||||
|
||||
export class BeatSaverService {
|
||||
@@ -32,6 +32,11 @@ export class BeatSaverService {
|
||||
return res.data ?? []
|
||||
}
|
||||
|
||||
public async getPlaylistDetailsById(id: string): Promise<BsvPlaylist>{
|
||||
const res = await this.ipc.send<BsvPlaylist>("bsv-get-playlist-details-by-id", {args: id});
|
||||
return res.data ?? null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -1,5 +1,58 @@
|
||||
import { useEffect, useState } from "react"
|
||||
import { BsmProgressBar } from "renderer/components/progress-bar/bsm-progress-bar.component";
|
||||
import { BsmImage } from "renderer/components/shared/bsm-image.component";
|
||||
import TitleBar from "renderer/components/title-bar/title-bar.component";
|
||||
import { IpcService } from "renderer/services/ipc.service"
|
||||
import { ProgressBarService } from "renderer/services/progress-bar.service";
|
||||
import { ThemeService } from "renderer/services/theme.service";
|
||||
import { BeatSaverService } from "renderer/services/thrird-partys/beat-saver.service";
|
||||
import { BsvPlaylist } from "shared/models/maps/beat-saver.model";
|
||||
import defaultImage from '../../../../assets/images/default-version-img.jpg';
|
||||
|
||||
export default function OneClickDownloadPlaylist() {
|
||||
return (
|
||||
<div>OneClickDownloadPlaylist</div>
|
||||
)
|
||||
|
||||
const ipc = IpcService.getInstance();
|
||||
const bSaver = BeatSaverService.getInstance();
|
||||
const progress = ProgressBarService.getInstance();
|
||||
const themeService = ThemeService.getInstance();
|
||||
|
||||
const [playlist, setPlaylist] = useState<BsvPlaylist>(null);
|
||||
|
||||
const cover = playlist ? playlist.playlistImage : null;
|
||||
const title = playlist ? playlist.name : null
|
||||
|
||||
useEffect(() => {
|
||||
|
||||
const sub = themeService.theme$.subscribe(() => {
|
||||
if(themeService.isDark || (themeService.isOS && window.matchMedia('(prefers-color-scheme: dark)').matches)){ document.documentElement.classList.add('dark'); }
|
||||
else { document.documentElement.classList.remove('dark'); }
|
||||
});
|
||||
|
||||
progress.open();
|
||||
|
||||
ipc.send<{bpListUrl: string, id: string}>("one-click-playlist-info").then(res => {
|
||||
|
||||
console.log(res);
|
||||
|
||||
const playlistId = res.data.id;
|
||||
const downloadUrl = res.data.bpListUrl;
|
||||
|
||||
bSaver.getPlaylistDetailsById(playlistId).then(playlist => setPlaylist(() => playlist));
|
||||
|
||||
});
|
||||
|
||||
}, []);
|
||||
|
||||
|
||||
return (
|
||||
<div className="relative w-screen h-screen overflow-hidden">
|
||||
{playlist && <BsmImage className="absolute top-0 left-0 w-full h-full" image={playlist.playlistImage}/>}
|
||||
<div className="w-full h-full backdrop-brightness-50 backdrop-blur-md flex flex-col justify-start items-center gap-10">
|
||||
<TitleBar template="oneclick-download-map.html"/>
|
||||
<BsmImage className="aspect-square w-1/2 object-cover rounded-md shadow-black shadow-lg" placeholder={defaultImage} image={cover} errorImage={defaultImage}/>
|
||||
<h1 className="overflow-hidden font-bold italic text-xl text-gray-200 tracking-wide w-full text-center whitespace-nowrap text-ellipsis px-2">{title}</h1>
|
||||
</div>
|
||||
<BsmProgressBar/>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user