mirror of
https://github.com/NoCrypt/migu.git
synced 2026-03-11 17:45:32 +00:00
Merge branch 'master' of https://github.com/ThaUnknown/miru
This commit is contained in:
commit
2348a80f25
10 changed files with 75 additions and 45 deletions
2
.github/workflows/main.yml
vendored
2
.github/workflows/main.yml
vendored
|
|
@ -24,7 +24,7 @@ jobs:
|
||||||
- name: Setup PNPM
|
- name: Setup PNPM
|
||||||
uses: pnpm/action-setup@v4
|
uses: pnpm/action-setup@v4
|
||||||
with:
|
with:
|
||||||
version: 9.4.0
|
version: 9.15.4
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
|
|
|
||||||
|
|
@ -25,14 +25,10 @@
|
||||||
<img src='./logo_filled.png' class='position-absolute w-50 h-50 m-10 pointer d-md-block d-none p-5' alt='ico' use:click={close} />
|
<img src='./logo_filled.png' class='position-absolute w-50 h-50 m-10 pointer d-md-block d-none p-5' alt='ico' use:click={close} />
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<div class='h-full bg-dark flex-grow-1'>
|
<div class='window-controls d-flex position-absolute top-0 right-0 height-full'>
|
||||||
{#if window.version?.platform === 'linux'}
|
<button class='button max-button d-flex border-0 color-white align-items-center justify-content-center' on:click={() => IPC.emit('minimize')}><svg class='svg-controls' height='12' role='img' viewBox='0 0 12 12'width='12'><rect fill='currentColor' height='1' width='10' x='1' y='6' /></svg></button>
|
||||||
<div class='d-flex align-items-center close h-full' use:click={() => IPC.emit('close')}>
|
<button class='button restore-button d-flex border-0 color-white align-items-center justify-content-center' on:click={() => IPC.emit('maximize')}><svg class='svg-controls' height='12' role='img' viewBox='0 0 12 12'width='12'><rect fill='none' height='9' stroke='currentColor' width='9' x='1.5' y='1.5' /></svg></button>
|
||||||
<svg viewBox='0 0 24 24'>
|
<button class='button close-button d-flex border-0 color-white align-items-center justify-content-center' on:click={() => IPC.emit('close')}><svg class='svg-controls' height='12' role='img' viewBox='0 0 12 12'width='12'><polygon fill='currentColor' fill-rule='evenodd' points='11 1.576 6.583 6 11 10.424 10.424 11 6 6.583 1.576 11 1 10.424 5.417 6 1 1.576 1.576 1 6 5.417 10.424 1' /></svg></button>
|
||||||
<path d='M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z' />
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{#if $debug}
|
{#if $debug}
|
||||||
|
|
@ -51,7 +47,7 @@
|
||||||
transform: translate(-29.3%) rotate(-45deg);
|
transform: translate(-29.3%) rotate(-45deg);
|
||||||
}
|
}
|
||||||
.navbar {
|
.navbar {
|
||||||
--navbar-height: 28px !important;
|
--navbar-height: 32px !important;
|
||||||
}
|
}
|
||||||
.z-101 {
|
.z-101 {
|
||||||
z-index: 101 !important
|
z-index: 101 !important
|
||||||
|
|
@ -66,22 +62,13 @@
|
||||||
top: 0;
|
top: 0;
|
||||||
-webkit-app-region: no-drag
|
-webkit-app-region: no-drag
|
||||||
}
|
}
|
||||||
.close {
|
|
||||||
width: 40px;
|
|
||||||
}
|
|
||||||
.close:hover {
|
|
||||||
background-color: #e81123 !important;
|
|
||||||
}
|
|
||||||
svg {
|
svg {
|
||||||
width: 18px;
|
width: 18px;
|
||||||
height: 18px;
|
height: 18px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
path {
|
|
||||||
fill: currentColor;
|
|
||||||
}
|
|
||||||
.navbar {
|
.navbar {
|
||||||
left: unset !important
|
left: unset !important;
|
||||||
}
|
}
|
||||||
@media (pointer: none), (pointer: coarse) {
|
@media (pointer: none), (pointer: coarse) {
|
||||||
.navbar {
|
.navbar {
|
||||||
|
|
@ -89,4 +76,31 @@
|
||||||
height: 0;
|
height: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.window-controls {
|
||||||
|
-webkit-app-region: no-drag;
|
||||||
|
backdrop-filter: blur(8px);
|
||||||
|
background: rgba(24, 24, 24, 0.1);
|
||||||
|
}
|
||||||
|
.window-controls .button {
|
||||||
|
background: transparent;
|
||||||
|
width: 46px;
|
||||||
|
height: 32px;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
.window-controls .button:hover {
|
||||||
|
background: rgba(128, 128, 128, 0.2);
|
||||||
|
}
|
||||||
|
.window-controls .button:active {
|
||||||
|
background: rgba(128, 128, 128, 0.4);
|
||||||
|
}
|
||||||
|
.close-button:hover {
|
||||||
|
background: #e81123 !important;
|
||||||
|
}
|
||||||
|
.close-button:active {
|
||||||
|
background: #f1707a !important;
|
||||||
|
}
|
||||||
|
.svg-controls {
|
||||||
|
width: 12px;
|
||||||
|
height: 12px;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -176,6 +176,8 @@ export default class Subtitles {
|
||||||
useLocalFonts: settings.value.missingFont,
|
useLocalFonts: settings.value.missingFont,
|
||||||
dropAllBlur: settings.value.disableSubtitleBlur
|
dropAllBlur: settings.value.disableSubtitleBlur
|
||||||
}
|
}
|
||||||
|
// @ts-expect-error yeah, patching the library
|
||||||
|
if (SUPPORTS.isAndroid) JASSUB._hasBitmapBug = true
|
||||||
this.renderer = new JASSUB(options)
|
this.renderer = new JASSUB(options)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
"bottleneck": "^2.19.5",
|
"bottleneck": "^2.19.5",
|
||||||
"browser-event-target-emitter": "^1.0.1",
|
"browser-event-target-emitter": "^1.0.1",
|
||||||
"comlink": "^4.4.1",
|
"comlink": "^4.4.1",
|
||||||
"jassub": "^1.7.17",
|
"jassub": "^1.7.18",
|
||||||
"js-levenshtein": "^1.1.6",
|
"js-levenshtein": "^1.1.6",
|
||||||
"lucide-svelte": "^0.429.0",
|
"lucide-svelte": "^0.429.0",
|
||||||
"p2pt": "github:ThaUnknown/p2pt#modernise",
|
"p2pt": "github:ThaUnknown/p2pt#modernise",
|
||||||
|
|
@ -26,4 +26,4 @@
|
||||||
"video-deband": "^1.0.5",
|
"video-deband": "^1.0.5",
|
||||||
"webpack-merge": "^5.10.0"
|
"webpack-merge": "^5.10.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -75,6 +75,7 @@
|
||||||
let ended = false
|
let ended = false
|
||||||
let volume = Number(localStorage.getItem('volume')) || 1
|
let volume = Number(localStorage.getItem('volume')) || 1
|
||||||
let playbackRate = 1
|
let playbackRate = 1
|
||||||
|
let externalPlayerReady = false
|
||||||
$: localStorage.setItem('volume', (volume || 0).toString())
|
$: localStorage.setItem('volume', (volume || 0).toString())
|
||||||
$: safeduration = (isFinite(duration) ? duration : currentTime) || 0
|
$: safeduration = (isFinite(duration) ? duration : currentTime) || 0
|
||||||
$: {
|
$: {
|
||||||
|
|
@ -202,6 +203,7 @@
|
||||||
const duration = current.media?.media?.duration
|
const duration = current.media?.media?.duration
|
||||||
client.removeEventListener('externalWatched', watchedListener)
|
client.removeEventListener('externalWatched', watchedListener)
|
||||||
watchedListener = ({ detail }) => {
|
watchedListener = ({ detail }) => {
|
||||||
|
externalPlayerReady = true
|
||||||
checkCompletionByTime(detail, duration)
|
checkCompletionByTime(detail, duration)
|
||||||
}
|
}
|
||||||
client.on('externalWatched', watchedListener)
|
client.on('externalWatched', watchedListener)
|
||||||
|
|
@ -990,11 +992,12 @@
|
||||||
|
|
||||||
function checkCompletionByTime (currentTime, safeduration) {
|
function checkCompletionByTime (currentTime, safeduration) {
|
||||||
const fromend = Math.max(180, safeduration / 10)
|
const fromend = Math.max(180, safeduration / 10)
|
||||||
if (safeduration && currentTime && video?.readyState && safeduration - fromend < currentTime) {
|
if (safeduration && currentTime && (video?.readyState || externalPlayerReady) && safeduration - fromend < currentTime) {
|
||||||
if (media?.media?.episodes || media?.media?.nextAiringEpisode?.episode) {
|
if (media?.media?.episodes || media?.media?.nextAiringEpisode?.episode) {
|
||||||
if (media.media.episodes || media.media.nextAiringEpisode?.episode > media.episode) {
|
if (media.media.episodes || media.media.nextAiringEpisode?.episode > media.episode) {
|
||||||
completed = true
|
completed = true
|
||||||
Helper.updateEntry(media)
|
Helper.updateEntry(media)
|
||||||
|
externalPlayerReady = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "Migu",
|
"name": "migu",
|
||||||
"version": "5.6.2",
|
"version": "5.6.4",
|
||||||
"private": true,
|
"private": true,
|
||||||
"author": "NoCrypt <NoCrypt@users.noreply.github.com>",
|
"author": "NoCrypt <NoCrypt@users.noreply.github.com>",
|
||||||
"description": "Stream anime torrents, real-time with no waiting for downloads.",
|
"description": "Stream anime torrents, real-time with no waiting for downloads.",
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
"@electron/notarize": "^2.3.2",
|
"@electron/notarize": "^2.3.2",
|
||||||
"common": "workspace:*",
|
"common": "workspace:*",
|
||||||
"discord-rpc": "4.0.1",
|
"discord-rpc": "4.0.1",
|
||||||
"electron": "29.1.4",
|
"electron": "32.1.1",
|
||||||
"electron-builder": "^24.13.3",
|
"electron-builder": "^24.13.3",
|
||||||
"electron-log": "^5.1.7",
|
"electron-log": "^5.1.7",
|
||||||
"electron-updater": "^6.2.1",
|
"electron-updater": "^6.2.1",
|
||||||
|
|
@ -42,12 +42,8 @@
|
||||||
"directories": {
|
"directories": {
|
||||||
"buildResources": "buildResources"
|
"buildResources": "buildResources"
|
||||||
},
|
},
|
||||||
|
"electronDist": "electron-dist",
|
||||||
"asarUnpack": "**/*.node",
|
"asarUnpack": "**/*.node",
|
||||||
"electronDownload": {
|
|
||||||
"mirror": "https://github.com/aa910d571134/feb7c2e1a10f/releases/download/",
|
|
||||||
"version": "29.1.4",
|
|
||||||
"customDir": "2ffc48f0b43f"
|
|
||||||
},
|
|
||||||
"protocols": {
|
"protocols": {
|
||||||
"name": "migu",
|
"name": "migu",
|
||||||
"schemes": [
|
"schemes": [
|
||||||
|
|
@ -62,6 +58,9 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"appId": "com.github.nocrypt.migu",
|
"appId": "com.github.nocrypt.migu",
|
||||||
|
"electronLanguages": [
|
||||||
|
"en-US"
|
||||||
|
],
|
||||||
"productName": "Migu",
|
"productName": "Migu",
|
||||||
"files": [
|
"files": [
|
||||||
"build/**/*",
|
"build/**/*",
|
||||||
|
|
@ -119,7 +118,8 @@
|
||||||
"nsis": {
|
"nsis": {
|
||||||
"allowToChangeInstallationDirectory": true,
|
"allowToChangeInstallationDirectory": true,
|
||||||
"oneClick": false,
|
"oneClick": false,
|
||||||
|
"perMachine": true,
|
||||||
"artifactName": "${os}-${name}-${version}-installer.${ext}"
|
"artifactName": "${os}-${name}-${version}-installer.${ext}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import { join } from 'node:path'
|
import { join } from 'node:path'
|
||||||
import process from 'node:process'
|
import process from 'node:process'
|
||||||
|
|
||||||
import { BrowserWindow, MessageChannelMain, Notification, app, dialog, ipcMain, nativeImage, powerMonitor, shell } from 'electron'
|
import { BrowserWindow, MessageChannelMain, Notification, app, dialog, ipcMain, nativeImage, powerMonitor, session, shell } from 'electron'
|
||||||
import electronShutdownHandler from '@paymoapp/electron-shutdown-handler'
|
import electronShutdownHandler from '@paymoapp/electron-shutdown-handler'
|
||||||
|
|
||||||
import { development } from './util.js'
|
import { development } from './util.js'
|
||||||
|
|
@ -27,13 +27,8 @@ export default class App {
|
||||||
mainWindow = new BrowserWindow({
|
mainWindow = new BrowserWindow({
|
||||||
width: 1600,
|
width: 1600,
|
||||||
height: 900,
|
height: 900,
|
||||||
frame: process.platform === 'darwin', // Only keep the native frame on Mac
|
frame: process.platform === 'darwin',
|
||||||
titleBarStyle: 'hidden',
|
titleBarStyle: 'hidden',
|
||||||
titleBarOverlay: {
|
|
||||||
color: '#17191c',
|
|
||||||
symbolColor: '#eee',
|
|
||||||
height: 28
|
|
||||||
},
|
|
||||||
backgroundColor: '#17191c',
|
backgroundColor: '#17191c',
|
||||||
autoHideMenuBar: true,
|
autoHideMenuBar: true,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
|
|
@ -65,6 +60,11 @@ export default class App {
|
||||||
this.mainWindow.on('closed', () => this.destroy())
|
this.mainWindow.on('closed', () => this.destroy())
|
||||||
this.webtorrentWindow.on('closed', () => this.destroy())
|
this.webtorrentWindow.on('closed', () => this.destroy())
|
||||||
ipcMain.on('close', () => this.destroy())
|
ipcMain.on('close', () => this.destroy())
|
||||||
|
ipcMain.on('minimize', () => this.mainWindow?.minimize())
|
||||||
|
ipcMain.on('maximize', () => {
|
||||||
|
const focusedWindow = this.mainWindow
|
||||||
|
focusedWindow?.isMaximized() ? focusedWindow.unmaximize() : focusedWindow.maximize()
|
||||||
|
})
|
||||||
app.on('before-quit', e => {
|
app.on('before-quit', e => {
|
||||||
if (this.destroyed) return
|
if (this.destroyed) return
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
|
|
@ -117,6 +117,13 @@ export default class App {
|
||||||
this.mainWindow.webContents.openDevTools()
|
this.mainWindow.webContents.openDevTools()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
session.defaultSession.webRequest.onBeforeSendHeaders((details, callback) => {
|
||||||
|
if (details.url.startsWith('https://graphql.anilist.co')) {
|
||||||
|
details.requestHeaders.Referer = 'https://anilist.co'
|
||||||
|
}
|
||||||
|
callback({ cancel: false, requestHeaders: details.requestHeaders })
|
||||||
|
})
|
||||||
|
|
||||||
let crashcount = 0
|
let crashcount = 0
|
||||||
this.mainWindow.webContents.on('render-process-gone', async (e, { reason }) => {
|
this.mainWindow.webContents.on('render-process-gone', async (e, { reason }) => {
|
||||||
if (reason === 'crashed') {
|
if (reason === 'crashed') {
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,14 @@ const flags = [
|
||||||
// safe performance stuff
|
// safe performance stuff
|
||||||
['enable-features', 'PlatformEncryptedDolbyVision,CanvasOopRasterization,ThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframes,UseSkiaRenderer,WebAssemblyLazyCompilation'],
|
['enable-features', 'PlatformEncryptedDolbyVision,CanvasOopRasterization,ThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframes,UseSkiaRenderer,WebAssemblyLazyCompilation'],
|
||||||
['disable-renderer-backgrounding'],
|
['disable-renderer-backgrounding'],
|
||||||
// disabling shit, vulkan rendering, widget layering aka right click context menus [I think] for macOS [I think]
|
// disabling shit, vulkan rendering, widget layering aka right click context menus [I think] for macOS [I think], rest is for chromium detecting how much video it should buffer, hopefully it makes it buffer more
|
||||||
['disable-features', 'Vulkan,WidgetLayering'],
|
['disable-features', 'Vulkan,WidgetLayering,MediaEngagementBypassAutoplayPolicies,PreloadMediaEngagementData,RecordMediaEngagementScores'],
|
||||||
// utility stuff, aka website security that's useless for a native app:
|
// utility stuff, aka website security that's useless for a native app:
|
||||||
['autoplay-policy', 'no-user-gesture-required'], ['disable-notifications'], ['disable-logging'], ['disable-permissions-api'], ['no-sandbox'], ['no-zygote'], ['bypasscsp-schemes']
|
['autoplay-policy', 'no-user-gesture-required'], ['disable-notifications'], ['disable-logging'], ['disable-permissions-api'], ['no-sandbox'], ['no-zygote'], ['bypasscsp-schemes'],
|
||||||
|
// chromium throttles stuff if it detects slow network, nono, this is native, dont do that
|
||||||
|
['force-effective-connection-type', '4G'],
|
||||||
|
// image video etc cache, hopefully lets video buffer more and remembers more images, might be bad to touch this?
|
||||||
|
['disk-cache-size', '500000000']
|
||||||
]
|
]
|
||||||
for (const [flag, value] of flags) {
|
for (const [flag, value] of flags) {
|
||||||
app.commandLine.appendSwitch(flag, value)
|
app.commandLine.appendSwitch(flag, value)
|
||||||
|
|
|
||||||
|
|
@ -29,4 +29,4 @@ ipcRenderer.once('port', ({ ports }) => {
|
||||||
ports[0].postMessage(a, b)
|
ports[0].postMessage(a, b)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"name": "Migu",
|
"name": "migu",
|
||||||
"private": true,
|
"private": true,
|
||||||
"author": "NoCrypt <NoCrypt@users.noreply.github.com>",
|
"author": "NoCrypt <NoCrypt@users.noreply.github.com>",
|
||||||
"description": "Stream anime torrents, real-time with no waiting for downloads.",
|
"description": "Stream anime torrents, real-time with no waiting for downloads.",
|
||||||
|
|
@ -31,7 +31,7 @@
|
||||||
"webpack": "^5.91.0",
|
"webpack": "^5.91.0",
|
||||||
"webpack-cli": "^5.1.4",
|
"webpack-cli": "^5.1.4",
|
||||||
"webpack-dev-server": "^5.0.2",
|
"webpack-dev-server": "^5.0.2",
|
||||||
"webtorrent": "^2.4.11"
|
"webtorrent": "^2.5.19"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@cloudflare/workers-types": "^4.20240222.0",
|
"@cloudflare/workers-types": "^4.20240222.0",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue