From eeed27ffcfc43c2e3eb0e94cb62fb2ea9ea896c7 Mon Sep 17 00:00:00 2001 From: ThaUnknown <6506529+ThaUnknown@users.noreply.github.com> Date: Sun, 18 Aug 2024 10:22:15 +0200 Subject: [PATCH] feat: better debug tooling, debug mode fix: make account related buttons disabled when not signed in fix: improve DTS exclusions fix: softlock on navigation in androidTV --- capacitor/package.json | 1 + capacitor/src/capacitor.js | 11 ++ common/components/Menubar.svelte | 16 ++ common/components/Navbar.svelte | 153 ++---------------- common/components/NavbarLink.svelte | 101 ++++++++++++ common/components/Sidebar.svelte | 147 ++++------------- common/components/SidebarLink.svelte | 129 +++++++++++++++ common/components/banner/FullBanner.svelte | 5 +- common/components/cards/PreviewCard.svelte | 5 +- common/modules/click.js | 2 +- common/modules/rss.js | 2 +- common/modules/webtorrent.js | 5 + common/package.json | 1 + common/views/Settings/AppSettings.svelte | 110 +++++++++++-- .../Settings/HomeSectionsSettings.svelte | 24 +-- common/views/Settings/Settings.svelte | 2 +- common/views/ViewAnime/ViewAnime.svelte | 9 +- electron/package.json | 2 +- electron/src/main/app.js | 5 +- electron/src/main/debugger.js | 29 ++++ electron/src/main/updater.js | 4 - pnpm-lock.yaml | 31 +++- web/src/lib/components/PreviewCard.svelte | 5 +- 23 files changed, 488 insertions(+), 311 deletions(-) create mode 100644 common/components/NavbarLink.svelte create mode 100644 common/components/SidebarLink.svelte create mode 100644 electron/src/main/debugger.js diff --git a/capacitor/package.json b/capacitor/package.json index 6dc6e1f..0b2860b 100644 --- a/capacitor/package.json +++ b/capacitor/package.json @@ -30,6 +30,7 @@ "@capacitor/app": "^6.0.0", "@capacitor/browser": "^6.0.1", "@capacitor/core": "^6.1.1", + "@capacitor/device": "^6.0.1", "@capacitor/ios": "^6.1.1", "@capacitor/local-notifications": "^6.0.0", "@capacitor/status-bar": "^6.0.0", diff --git a/capacitor/src/capacitor.js b/capacitor/src/capacitor.js index 17d7cae..d190e3b 100644 --- a/capacitor/src/capacitor.js +++ b/capacitor/src/capacitor.js @@ -4,6 +4,7 @@ import { SafeArea } from 'capacitor-plugin-safe-area' import { App } from '@capacitor/app' import { Browser } from '@capacitor/browser' import { LocalNotifications } from '@capacitor/local-notifications' +import { Device } from '@capacitor/device' import IPC from './ipc.js' IPC.on('open', url => Browser.open({ url })) @@ -40,6 +41,16 @@ IPC.on('notification', noti => { if (canShowNotifications) LocalNotifications.schedule({ notifications: [notification] }) }) +IPC.on('get-device-info', async () => { + const deviceInfo = { + features: {}, + info: await Device.getInfo(), + cpu: {}, + ram: {} + } + IPC.emit('device-info', JSON.stringify(deviceInfo)) +}) + // schema: miru://key/value const protocolMap = { auth: token => sendToken(token), diff --git a/common/components/Menubar.svelte b/common/components/Menubar.svelte index ba8ff30..d327cb9 100644 --- a/common/components/Menubar.svelte +++ b/common/components/Menubar.svelte @@ -1,4 +1,5 @@ +{#if $debug} +
Debug Mode!
+{/if} diff --git a/common/components/NavbarLink.svelte b/common/components/NavbarLink.svelte new file mode 100644 index 0000000..f12ee41 --- /dev/null +++ b/common/components/NavbarLink.svelte @@ -0,0 +1,101 @@ + + + + + diff --git a/common/components/Sidebar.svelte b/common/components/Sidebar.svelte index 45da2d1..2ea1241 100644 --- a/common/components/Sidebar.svelte +++ b/common/components/Sidebar.svelte @@ -5,143 +5,56 @@ import { platformMap } from '@/views/Settings/Settings.svelte' import { settings } from '@/modules/settings.js' import { toast } from 'svelte-sonner' - import { click } from '@/modules/click.js' import { logout } from './Logout.svelte' import IPC from '@/modules/ipc.js' + import SidebarLink from './SidebarLink.svelte' - let wasUpdated = false - - globalThis.dd = IPC + let updateState = '' IPC.on('update-available', () => { - console.log('uwu') - if (!wasUpdated) { - // insert icon in 2nd to last position - links.splice(links.length - 1, 0, { - click: () => { - toast('Update is downloading...') - }, - icon: 'download', - text: 'Update Downloading...' - }) - links = links - } - wasUpdated = true + updateState = 'downloading' }) IPC.on('update-downloaded', () => { - links[links.length - 2].css = 'update' - links[links.length - 2].text = 'Update Ready!' - links[links.length - 2].click = () => { - IPC.emit('quit-and-install') - } - links = links + updateState = 'ready' }) const view = getContext('view') export let page - let links = [ - { - click: () => { - if (anilistClient.userID?.viewer?.data?.Viewer) { - $logout = true - } else { - IPC.emit('open', 'https://anilist.co/api/v2/oauth/authorize?client_id=4254&response_type=token') // Change redirect_url to miru://auth - if (platformMap[window.version.platform] === 'Linux') { - toast('Support Notification', { - description: "If your linux distribution doesn't support custom protocol handlers, you can simply paste the full URL into the app.", - duration: 300000 - }) - } - } - }, - icon: 'login', - text: 'Login With AniList', - css: 'mt-auto' - }, - { - click: () => { - page = 'home' - }, - page: 'home', - icon: 'home', - text: 'Home' - }, - { - click: () => { - page = 'search' - }, - page: 'search', - icon: 'search', - text: 'Search' - }, - { - click: () => { - page = 'schedule' - }, - page: 'schedule', - icon: 'schedule', - text: 'Schedule' - }, - { - click: () => { - if ($media) $view = $media.media - }, - icon: 'queue_music', - text: 'Now Playing' - }, - { - click: () => { - page = 'watchtogether' - }, - page: 'watchtogether', - icon: 'groups', - text: 'Watch Together' - }, - { - click: () => { - IPC.emit('open', 'https://github.com/sponsors/ThaUnknown/') - }, - icon: 'favorite', - text: 'Support This App', - css: 'mt-auto donate' - }, - { - click: () => { - page = 'settings' - }, - page: 'settings', - icon: 'settings', - text: 'Settings' + function handleAlLogin () { + if (anilistClient.userID?.viewer?.data?.Viewer) { + $logout = true + } else { + IPC.emit('open', 'https://anilist.co/api/v2/oauth/authorize?client_id=4254&response_type=token') // Change redirect_url to miru://auth + if (platformMap[window.version.platform] === 'Linux') { + toast('Support Notification', { + description: "If your linux distribution doesn't support custom protocol handlers, you can simply paste the full URL into the app.", + duration: 300000 + }) + } } - ] - if (anilistClient.userID?.viewer?.data?.Viewer) { - links[0].image = anilistClient.userID.viewer.data.Viewer.avatar.medium - links[0].text = 'Logout' } diff --git a/common/components/cards/PreviewCard.svelte b/common/components/cards/PreviewCard.svelte index fb561ae..fb4d601 100644 --- a/common/components/cards/PreviewCard.svelte +++ b/common/components/cards/PreviewCard.svelte @@ -2,6 +2,7 @@ import { formatMap, setStatus, playMedia } from '@/modules/anime.js' import { anilistClient } from '@/modules/anilist.js' import { click } from '@/modules/click.js' + import { alToken } from '@/modules/settings.js' /** @type {import('@/modules/al.d.ts').Media} */ export let media @@ -93,10 +94,10 @@ {playButtonText} - - diff --git a/common/modules/click.js b/common/modules/click.js index 3f6b1ea..9368626 100644 --- a/common/modules/click.js +++ b/common/modules/click.js @@ -111,7 +111,7 @@ const DirectionKeyMap = { ArrowDown: 'down', ArrowUp: 'up', ArrowLeft: 'left', A * @returns {number} - The direction between the two points. */ function getDirection (anchor, relative) { - return Math.round((Math.atan2(relative.y - anchor.y, relative.x - anchor.x) * 180 / Math.PI + 180) / 90) + return Math.round((Math.atan2(relative.y - anchor.y, relative.x - anchor.x) * 180 / Math.PI + 180) / 90) || 4 } /** diff --git a/common/modules/rss.js b/common/modules/rss.js index 5c608f6..2118a27 100644 --- a/common/modules/rss.js +++ b/common/modules/rss.js @@ -7,7 +7,7 @@ import AnimeResolver from '@/modules/animeresolver.js' import { hasNextPage } from '@/modules/sections.js' import IPC from '@/modules/ipc.js' -export const exclusions = ['DTS', '[EMBER]'] +export const exclusions = ['DTS', 'TrueHD', '[EMBER]'] const isDev = location.hostname === 'localhost' const video = document.createElement('video') diff --git a/common/modules/webtorrent.js b/common/modules/webtorrent.js index cfacf50..f7c1942 100644 --- a/common/modules/webtorrent.js +++ b/common/modules/webtorrent.js @@ -1,4 +1,5 @@ import { spawn } from 'node:child_process' +import Debug from 'debug' import WebTorrent from 'webtorrent' import querystring from 'querystring' import HTTPTracker from 'bittorrent-tracker/lib/client/http-tracker.js' @@ -333,6 +334,10 @@ export default class TorrentClient extends WebTorrent { this.addTorrent(data.data) break } + case 'debug': { + Debug.disable() + if (data.data) Debug.enable(data.data) + } } } diff --git a/common/package.json b/common/package.json index 63aa5d6..2f6268a 100644 --- a/common/package.json +++ b/common/package.json @@ -21,6 +21,7 @@ "svelte-keybinds": "^1.0.6", "svelte-loader": "^3.1.9", "svelte-miniplayer": "^1.0.5", + "svelte-persisted-store": "^0.11.0", "svelte-sonner": "^0.3.19", "video-deband": "^1.0.5", "webpack-merge": "^5.10.0" diff --git a/common/views/Settings/AppSettings.svelte b/common/views/Settings/AppSettings.svelte index 8a7b418..aef09c0 100644 --- a/common/views/Settings/AppSettings.svelte +++ b/common/views/Settings/AppSettings.svelte @@ -4,10 +4,19 @@ import { resetSettings } from '@/modules/settings.js' import IPC from '@/modules/ipc.js' import { SUPPORTS } from '@/modules/support.js' + import SettingCard from './SettingCard.svelte' async function importSettings () { - localStorage.setItem('settings', await navigator.clipboard.readText()) - location.reload() + try { + const settings = JSON.parse(await navigator.clipboard.readText()) + localStorage.setItem('settings', JSON.stringify(settings)) + location.reload() + } catch (error) { + toast.error('Failed to import settings', { + description: 'Failed to import settings from clipboard, make sure the copied data is valid JSON.', + duration: 5000 + }) + } } function exportSettings () { navigator.clipboard.writeText(localStorage.getItem('settings')) @@ -24,31 +33,102 @@ IPC.emit('update') } setInterval(checkUpdate, 1200000) + + IPC.on('log-contents', log => { + navigator.clipboard.writeText(log) + toast.success('Copied to clipboard', { + description: 'Copied log contents to clipboard', + duration: 5000 + }) + }) + + + +

Debug Settings

+ + + + + + + + +{#if !SUPPORTS.isAndroid} + + + + + + + + + + + +{/if} + +

App Settings

- - {#if SUPPORTS.update} - {/if} diff --git a/common/views/Settings/Settings.svelte b/common/views/Settings/Settings.svelte index bc9fb97..543f78e 100644 --- a/common/views/Settings/Settings.svelte +++ b/common/views/Settings/Settings.svelte @@ -147,7 +147,7 @@
- +
diff --git a/common/views/ViewAnime/ViewAnime.svelte b/common/views/ViewAnime/ViewAnime.svelte index bfd1771..4d9f7ab 100644 --- a/common/views/ViewAnime/ViewAnime.svelte +++ b/common/views/ViewAnime/ViewAnime.svelte @@ -11,6 +11,7 @@ import Following from './Following.svelte' import smoothScroll from '@/modules/scroll.js' import IPC from '@/modules/ipc.js' + import { alToken } from '@/modules/settings.js' const view = getContext('view') function close () { @@ -125,10 +126,10 @@ {playButtonText}
- -
-
+
@@ -218,7 +219,7 @@ aspect-ratio: 7/10; } - button.bg-dark:hover { + button.bg-dark:not([disabled]):hover { background: #292d33 !important; } diff --git a/electron/package.json b/electron/package.json index 8e2aad3..78038a9 100644 --- a/electron/package.json +++ b/electron/package.json @@ -1,6 +1,6 @@ { "name": "Miru", - "version": "5.2.16", + "version": "5.3.0", "private": true, "author": "ThaUnknown_ ", "description": "Stream anime torrents, real-time with no waiting for downloads.", diff --git a/electron/src/main/app.js b/electron/src/main/app.js index 5ae3bc7..8d5880a 100644 --- a/electron/src/main/app.js +++ b/electron/src/main/app.js @@ -10,6 +10,7 @@ import Protocol from './protocol.js' import Updater from './updater.js' import Dialog from './dialog.js' import store from './store.js' +import Debug from './debugger.js' export default class App { webtorrentWindow = new BrowserWindow({ @@ -50,6 +51,7 @@ export default class App { protocol = new Protocol(this.mainWindow) updater = new Updater(this.mainWindow, this.webtorrentWindow) dialog = new Dialog(this.webtorrentWindow) + debug = new Debug() constructor () { this.mainWindow.setMenuBarVisibility(false) @@ -57,7 +59,8 @@ export default class App { this.mainWindow.once('ready-to-show', () => this.mainWindow.show()) this.mainWindow.on('minimize', () => this.mainWindow.webContents.postMessage('visibilitychange', 'hidden')) this.mainWindow.on('restore', () => this.mainWindow.webContents.postMessage('visibilitychange', 'visible')) - ipcMain.on('devtools', () => this.webtorrentWindow.webContents.openDevTools()) + ipcMain.on('torrent-devtools', () => this.webtorrentWindow.webContents.openDevTools()) + ipcMain.on('ui-devtools', ({ sender }) => sender.openDevTools()) this.mainWindow.on('closed', () => this.destroy()) ipcMain.on('close', () => this.destroy()) diff --git a/electron/src/main/debugger.js b/electron/src/main/debugger.js new file mode 100644 index 0000000..0d8b6e3 --- /dev/null +++ b/electron/src/main/debugger.js @@ -0,0 +1,29 @@ +import { readFile } from 'node:fs/promises' +import os from 'node:os' +import { app, ipcMain } from 'electron' +import log from 'electron-log' +import { autoUpdater } from 'electron-updater' + +log.initialize({ spyRendererConsole: true }) +log.transports.file.level = 'info' +log.transports.file.maxSize = 10485760 // 10MB +autoUpdater.logger = log + +export default class Debug { + constructor () { + ipcMain.on('get-log-contents', async ({ sender }) => { + sender.send('log-contents', await readFile(log.transports.file.getFile().path, 'utf8')) + }) + + ipcMain.on('get-device-info', async ({ sender }) => { + const { model, speed } = os.cpus()[0] + const deviceInfo = { + features: app.getGPUFeatureStatus(), + info: await app.getGPUInfo('complete'), + cpu: { model, speed }, + ram: os.totalmem() + } + sender.send('device-info', JSON.stringify(deviceInfo)) + }) + } +} diff --git a/electron/src/main/updater.js b/electron/src/main/updater.js index a619706..b1ebf20 100644 --- a/electron/src/main/updater.js +++ b/electron/src/main/updater.js @@ -1,10 +1,6 @@ -import log from 'electron-log' import { autoUpdater } from 'electron-updater' import { ipcMain, shell } from 'electron' -log.initialize({ spyRendererConsole: true }) -log.transports.file.level = 'info' -autoUpdater.logger = log ipcMain.on('update', () => { autoUpdater.checkForUpdatesAndNotify() }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 38c7622..4c67cab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -75,6 +75,9 @@ importers: '@capacitor/core': specifier: ^6.1.1 version: 6.1.1 + '@capacitor/device': + specifier: ^6.0.1 + version: 6.0.1(@capacitor/core@6.1.1) '@capacitor/ios': specifier: ^6.1.1 version: 6.1.1(@capacitor/core@6.1.1) @@ -156,7 +159,7 @@ importers: version: 4.4.1 jassub: specifier: latest - version: 1.7.15 + version: 1.7.16 js-levenshtein: specifier: ^1.1.6 version: 1.1.6 @@ -187,6 +190,9 @@ importers: svelte-miniplayer: specifier: ^1.0.5 version: 1.0.5 + svelte-persisted-store: + specifier: ^0.11.0 + version: 0.11.0(svelte@4.2.12) svelte-sonner: specifier: ^0.3.19 version: 0.3.19(svelte@4.2.12) @@ -400,6 +406,14 @@ packages: tslib: 2.6.3 dev: false + /@capacitor/device@6.0.1(@capacitor/core@6.1.1): + resolution: {integrity: sha512-Tlz67DAO5GKb5YAfupXiENZxDww6mHnG9iKI+8D5SVF82VLpEv5r9qwKtiounuQB2y2HWiHV8tlOk7DqnLVUqQ==} + peerDependencies: + '@capacitor/core': ^6.0.0 + dependencies: + '@capacitor/core': 6.1.1 + dev: false + /@capacitor/ios@6.1.1(@capacitor/core@6.1.1): resolution: {integrity: sha512-he6+Fhj6x1dSnOzM98xaPvioOU8MNO+qpodCJwnHE3mIRonTpFutXJK8DP8fnNhjDPk2km9VafLSfOeiZXNv3Q==} peerDependencies: @@ -1383,7 +1397,7 @@ packages: vite: ^5.0.0 dependencies: '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.12)(vite@5.1.5) - debug: 4.3.4 + debug: 4.3.6 svelte: 4.2.12 vite: 5.1.5 transitivePeerDependencies: @@ -6017,8 +6031,8 @@ packages: minimatch: 3.1.2 dev: true - /jassub@1.7.15: - resolution: {integrity: sha512-8yKAJc++Y1gNfATOPRo3APk0JUhshKl5l7bRkT6WkJ8XP4RvYfVPb6ieH6WDxsMq523exwGzNvjjPEEWT+Z1nQ==} + /jassub@1.7.16: + resolution: {integrity: sha512-JDzKtGqQeApqQtEDWM5KzuGs5HKvUOWS35HXKaka6MuHV8HxLfW/F77HDE6gsZVn+Vuhh8omzXv6THevF6z5Jg==} dependencies: rvfc-polyfill: 1.0.7 dev: false @@ -8705,6 +8719,15 @@ packages: resolution: {integrity: sha512-jzYqqBuXcSH5KzoPDlYQL6CQVbpY2LQB4/wBPG4T5R75wE8Dqu4auMU6NnJxHBRhgNCGlH+XBQvxy9G6yX/XQw==} dev: false + /svelte-persisted-store@0.11.0(svelte@4.2.12): + resolution: {integrity: sha512-9RgJ5DrawGyyfK22A80cfu8Jose3CV8YjEZKz9Tn94rQ0tWyEmYr+XI+wrVF6wjRbW99JMDSVcFRiM3XzVJj/w==} + engines: {node: '>=0.14'} + peerDependencies: + svelte: ^3.48.0 || ^4.0.0 || ^5.0.0-next.0 + dependencies: + svelte: 4.2.12 + dev: false + /svelte-preprocess@5.1.4(postcss@8.4.38)(svelte@4.2.12)(typescript@5.3.3): resolution: {integrity: sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==} engines: {node: '>= 16.0.0'} diff --git a/web/src/lib/components/PreviewCard.svelte b/web/src/lib/components/PreviewCard.svelte index 23a5fa1..e976f66 100644 --- a/web/src/lib/components/PreviewCard.svelte +++ b/web/src/lib/components/PreviewCard.svelte @@ -1,6 +1,7 @@