Merge pull request #1025 from Materialious/update/1.9.22

Update/1.9.22
This commit is contained in:
Ward
2025-07-21 15:32:10 +12:00
committed by GitHub
19 changed files with 322 additions and 91 deletions
+2 -2
View File
@@ -4,10 +4,10 @@
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2025-07-08T06:06:15.619274581Z">
<DropdownSelection timestamp="2025-07-21T02:41:45.413890396Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="LocalEmulator" identifier="path=/home/ward/.android/avd/Television_4K.avd" />
<DeviceId pluginId="LocalEmulator" identifier="path=/home/ward/.android/avd/Pixel_7_Pro.avd" />
</handle>
</Target>
</DropdownSelection>
+2 -2
View File
@@ -7,8 +7,8 @@ android {
applicationId "us.materialio.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 137
versionName "1.9.20"
versionCode 138
versionName "1.9.21"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
@@ -55,24 +55,10 @@
<content_attribute id="social-contacts">intense</content_attribute>
</content_rating>
<releases>
<release version="1.9.20" date="2025-7-09">
<release version="1.9.21" date="2025-7-21">
<url>https://github.com/Materialious/Materialious/releases/tag/1.9.21</url>
</release>
<release version="1.9.20" date="2025-7-09">
<url>https://github.com/Materialious/Materialious/releases/tag/1.9.20</url>
</release>
<release version="1.9.19" date="2025-7-08">
@@ -125,7 +111,7 @@
</release>
<release version="1.9.3" date="2025-6-05">
<url>https://github.com/Materialious/Materialious/releases/tag/1.9.3</url>
</release>
</release>
<release version="1.9.2" date="2025-6-05">
<url>https://github.com/Materialious/Materialious/releases/tag/1.9.2</url>
</release>
+6 -6
View File
@@ -1,12 +1,12 @@
{
"name": "Materialious",
"version": "1.9.19",
"version": "1.9.21",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "Materialious",
"version": "1.9.19",
"version": "1.9.21",
"license": "MIT",
"dependencies": {
"@capacitor-community/electron": "^5.0.0",
@@ -22,7 +22,7 @@
"jsonfile": "^6.1.0"
},
"devDependencies": {
"electron": "^37.2.0",
"electron": "^37.2.1",
"electron-builder": "^26.0.12",
"electron-rebuild": "^3.2.9",
"typescript": "^5.7.3"
@@ -2495,9 +2495,9 @@
}
},
"node_modules/electron": {
"version": "37.2.0",
"resolved": "https://registry.npmjs.org/electron/-/electron-37.2.0.tgz",
"integrity": "sha512-dE6+qeg6SBUVd5d8CD2+GH82kh+gF1v40+hs+U+UOno681NMSGmBtgqwldQRpbvtnQDD7V2M9Cpfr3+Abw7aBg==",
"version": "37.2.1",
"resolved": "https://registry.npmjs.org/electron/-/electron-37.2.1.tgz",
"integrity": "sha512-ae2EbzRNqIAHlftfCHtbbt6EgJUW8+zxWLONqNnn2iSrLF0O/pbxbff3xcpZYPpmFBs4uqjoi+s4QS7DQ+zZ/w==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "Materialious",
"version": "1.9.20",
"version": "1.9.21",
"description": "Modern material design for Invidious.",
"author": {
"name": "Ward Pearce",
@@ -35,7 +35,7 @@
"jsonfile": "^6.1.0"
},
"devDependencies": {
"electron": "^37.2.0",
"electron": "^37.2.1",
"electron-builder": "^26.0.12",
"electron-rebuild": "^3.2.9",
"typescript": "^5.7.3"
@@ -44,4 +44,4 @@
"capacitor",
"electron"
]
}
}
+15 -3
View File
@@ -4,7 +4,7 @@ import {
setupElectronDeepLinking
} from '@capacitor-community/electron';
import type { MenuItemConstructorOptions } from 'electron';
import { app, ipcMain, MenuItem, session, webContents } from 'electron';
import { app, ipcMain, MenuItem, session } from 'electron';
import electronIsDev from 'electron-is-dev';
import unhandled from 'electron-unhandled';
import { autoUpdater } from 'electron-updater';
@@ -58,8 +58,6 @@ let allowInsecureSSL = false;
setupContentSecurityPolicy(myCapacitorApp.getCustomURLScheme());
// Initialize our app, build windows, and load content.
await myCapacitorApp.init();
// Check for updates if we are in a packaged app.
autoUpdater.checkForUpdatesAndNotify();
})();
app.on('certificate-error', (event, webContents, url, error, certificate, callback) => {
@@ -167,3 +165,17 @@ ipcMain.handle('setAllowInsecureSSL', async (_, allow) => {
return allowInsecureSSL;
});
ipcMain.handle('doUpdateCheck', async (_, disableAutoUpdate) => {
// Check for updates if we are in a packaged app.
autoUpdater.autoInstallOnAppQuit = !disableAutoUpdate;
if (disableAutoUpdate) {
await autoUpdater.checkForUpdatesAndNotify({
title: 'Update Available',
body: 'A new version is available.'
});
} else {
await autoUpdater.checkForUpdatesAndNotify();
}
});
+3 -1
View File
@@ -8,5 +8,7 @@ contextBridge.exposeInMainWorld('electronAPI', {
ipcRenderer.invoke('generatePoToken', bgChallenge, requestKey, visitorData),
setAllowInsecureSSL: async (allow: boolean) => {
return await ipcRenderer.invoke('setAllowInsecureSSL', allow);
}
},
doUpdateCheck: (disableAutoUpdate: boolean) =>
ipcRenderer.invoke('doUpdateCheck', disableAutoUpdate)
});
+11 -23
View File
@@ -1,12 +1,12 @@
{
"name": "materialious",
"version": "1.9.19",
"version": "1.9.21",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "materialious",
"version": "1.9.19",
"version": "1.9.21",
"hasInstallScript": true,
"dependencies": {
"@capacitor-community/electron": "^5.0.1",
@@ -37,7 +37,7 @@
"sponsorblock-api": "^0.2.4",
"svelte-infinite-loading": "^1.4.0",
"svelte-persisted-store": "^0.12.0",
"youtubei.js": "^14.0.0"
"youtubei.js": "^15.0.0"
},
"devDependencies": {
"@capacitor/assets": "^3.0.5",
@@ -2119,15 +2119,6 @@
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/@fastify/busboy": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
"integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
"license": "MIT",
"engines": {
"node": ">=14"
}
},
"node_modules/@hugotomazi/capacitor-navigation-bar": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/@hugotomazi/capacitor-navigation-bar/-/capacitor-navigation-bar-4.0.1.tgz",
@@ -12037,15 +12028,12 @@
}
},
"node_modules/undici": {
"version": "5.29.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz",
"integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==",
"version": "6.21.3",
"resolved": "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz",
"integrity": "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==",
"license": "MIT",
"dependencies": {
"@fastify/busboy": "^2.0.0"
},
"engines": {
"node": ">=14.0"
"node": ">=18.17"
}
},
"node_modules/undici-types": {
@@ -13748,9 +13736,9 @@
}
},
"node_modules/youtubei.js": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/youtubei.js/-/youtubei.js-14.0.0.tgz",
"integrity": "sha512-KAFttOw+9fwwBUvBc1T7KzMNBLczDOuN/dfote8BA9CABxgx8MPgV+vZWlowdDB6DnHjSUYppv+xvJ4VNBLK9A==",
"version": "15.0.0",
"resolved": "https://registry.npmjs.org/youtubei.js/-/youtubei.js-15.0.0.tgz",
"integrity": "sha512-giPZREn+q0z8Jr45NUcJUXE7QA2+UD2jx5FR+ULdnexvtHg5uQZr9Am8aYcECPKzbBNe6ksBD1yT4SKNbhpRqA==",
"funding": [
"https://github.com/sponsors/LuanRT"
],
@@ -13759,7 +13747,7 @@
"@bufbuild/protobuf": "^2.0.0",
"jintr": "^3.3.1",
"tslib": "^2.5.0",
"undici": "^5.19.1"
"undici": "^6.21.3"
}
},
"node_modules/zimmerframe": {
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "materialious",
"version": "1.9.20",
"version": "1.9.21",
"private": true,
"scripts": {
"dev": "vite dev",
@@ -68,6 +68,6 @@
"sponsorblock-api": "^0.2.4",
"svelte-infinite-loading": "^1.4.0",
"svelte-persisted-store": "^0.12.0",
"youtubei.js": "^14.0.0"
"youtubei.js": "^15.0.0"
}
}
}
+1
View File
@@ -19,6 +19,7 @@ declare global {
visitorData: string
) => Promise<string>;
setAllowInsecureSSL: (allowInsecureSSL: boolean) => Promoise<boolean>;
doUpdateCheck: (disableAutoUpdate: boolean) => Promise<void>;
};
}
}
@@ -590,6 +590,22 @@
playerElement.playbackRate = playerElement.playbackRate + 0.25;
return false;
});
Mousetrap.bind(',', () => {
if (!playerElement) return
const currentTrack = player.getVariantTracks().find(track => track.active)
const frameTime = 1/(currentTrack?.frameRate || 30)
playerElement.currentTime -= frameTime
})
Mousetrap.bind('.', () => {
if (!playerElement) return
const currentTrack = player.getVariantTracks().find(track => track.active)
const frameTime = 1/(currentTrack?.frameRate || 30)
playerElement.currentTime += frameTime
})
playerElement.addEventListener('pause', async () => {
savePlayerPos();
@@ -21,6 +21,7 @@
interfaceAutoExpandComments,
interfaceAutoExpandDesc,
interfaceDefaultPage,
interfaceDisableAutoUpdate,
interfaceForceCase,
interfaceLowBandwidthMode,
interfaceRegionStore,
@@ -110,6 +111,12 @@
}
});
if (Capacitor.getPlatform() === 'electron') {
interfaceDisableAutoUpdate.subscribe((isDisabled) => {
window.electronAPI.doUpdateCheck(isDisabled);
});
}
let pages: Pages = $state([]);
authStore.subscribe(() => {
pages = getPages();
@@ -288,6 +295,24 @@
</nav>
</div>
{#if Capacitor.getPlatform() == 'electron'}
<div class="field no-margin">
<nav class="no-padding">
<div class="max">
<div>{$_('layout.disableAutoUpdate')}</div>
</div>
<label class="switch" tabindex="0" role="switch">
<input
type="checkbox"
bind:checked={$interfaceDisableAutoUpdate}
onclick={() => interfaceDisableAutoUpdate.set(!$interfaceDisableAutoUpdate)}
/>
<span></span>
</label>
</nav>
</div>
{/if}
<div class="field label suffix border">
<select
tabindex="0"
+8 -7
View File
@@ -2,7 +2,7 @@
"enabled": "Aktiviert",
"copyUrl": "URL kopieren",
"loadMore": "Mehr laden",
"views": "Ansichten",
"views": "Aufrufe",
"invidiousBlockWarning": "Invidious wird derzeit von Google blockiert. Wenn Videos für diese Instanz nicht geladen werden, verwende diese Instanz bitte auf Materialious auf {android} oder {desktop}, um dies mit lokalem Video-Fallback zu umgehen.",
"videos": "Videos",
"cancel": "Abbrechen",
@@ -34,7 +34,7 @@
"videoTabs": {
"all": "Alle",
"videos": "Videos",
"playlists": "Wiedergabeliste",
"playlists": "Wiedergabelisten",
"channels": "Kanäle",
"shorts": "Shorts",
"streams": "Streams"
@@ -63,7 +63,7 @@
"playlists": "Wiedergabelisten"
},
"subscribers": "Abonnenten",
"unsubscribe": "Deabonnieren",
"unsubscribe": "Abo beenden",
"loginRequired": "Anmeldung erforderlich",
"player": {
"audioOnly": "Nur Ton",
@@ -80,7 +80,7 @@
"downloadSteps": {
"merging": "Video und Audio zusammenführen",
"video": "Herunterladen des Videos",
"audio": "Herunterladen der Audio",
"audio": "Herunterladen des Tons",
"ffmpeg": "Herunterladen der ffmpeg-Bibliothek und -Komponenten",
"classWorker": "Herunterladen des ffmpeg-Klassenarbeiters",
"core": "Herunterladen der ffmpeg-Kern",
@@ -91,10 +91,10 @@
"unableToLoadComments": "Laden der Kommentare fehlgeschlagen",
"addToPlaylist": "Zur Wiedergabeliste hinzufügen",
"youtubeJsFallBack": "Lokaler Video-Fallback wird verwendet",
"enableYoutubejsPerm": "Lokales Video-Fallback immer erlauben",
"enableYoutubejsPerm": "Lokalen Video-Fallback immer erlauben",
"defaultLanguage": "Standardsprache",
"preferredQuality": "Bevorzugte Qualität",
"enableYoutubejsTemp": "Nutze einmalig lokales Video-Fallback",
"enableYoutubejsTemp": "Nutze einmalig den lokalen Video-Fallback",
"chapters": "Kapitel",
"retryText": "Das Video konnte nicht geladen werden, wie möchtest du weiterfahren?",
"youtubeJsLoading": "Das Video konnte nicht geladen werden, es wird mit lokalem Video-Fallback erneut versucht."
@@ -114,7 +114,7 @@
"customize": "Anpassen",
"lowBandwidthMode": "Modus für geringe Bandbreite",
"theme": {
"theme": "Thema",
"theme": "Erscheinungsbild",
"darkMode": "Dunkler Modus",
"lightMode": "Heller Modus",
"AmoledTheme": "Amoled-Thema",
@@ -124,6 +124,7 @@
"previewVideoOnHover": "Video-Vorschau beim Hovern",
"expandDescription": "Beschreibung standardmäßig erweitern",
"expandComments": "Kommentare standardmäßig erweitern",
"disableAutoUpdate": "Automatische Installation von Updates deaktivieren",
"dataPreferences": {
"content": "Du möchtest Abonnements importieren/exportieren, dein Passwort ändern oder dein Konto löschen? Klicke hier und scrolle bis zum Ende der Seite.",
"dataPreferences": "Dateneinstellungen"
@@ -136,6 +136,7 @@
"expandChapters": "Expand chapters by default",
"expandComments": "Expand comments by default",
"allowInsecureRequests": "Allow insecure requests",
"disableAutoUpdate": "Disable automatic updates",
"dataPreferences": {
"content": "Looking to import/export subscriptions, change password or delete account? Click here and scroll to the bottom of the page.",
"dataPreferences": "Data preferences"
+185
View File
@@ -0,0 +1,185 @@
{
"enabled": "Aktiviert",
"disabled": "Deaktiviert",
"copyUrl": "URL kopiere",
"loadMore": "Meh lade",
"views": "Uufrüef",
"login": "Aameldig",
"recommendedVideos": "Vorgschlagni Videos",
"invidiousBlockWarning": "Invidious wird grad vo Google blockiert. Wenn Videos für die Instanz nöd glade werded, nutz die Instanz bitte uf Materialious uf {android} oder {Desktop}, zum das mit em lokale Video-Fallback z umgah.",
"playlistVideos": "Widergabelischte Videos",
"thumbnail": {
"failedToLoadImage": "Lade vom Bild fehlgschlage",
"live": "LIVE"
},
"layout": {
"companionUrl": "Companion URL",
"player": {
"silenceSkipper": "Schwiigeüberspringer (Experimentell)",
"title": "Player",
"autoPlay": "Video automatisch abspiele",
"alwaysLoopVideo": "Video immer inere Schleife abspiele",
"savePlaybackPosition": "Widergabeposition speichere",
"listenByDefault": "Standardmässig zuelose",
"ccByDefault": "Untertitel standardmässig aa",
"theatreModeByDefault": "Standardmässige Theatermodus",
"autoPlayNextByDefault": "Standardmässigi Widergab vom nächste Video",
"miniPlayer": "Mini-Player",
"proxyVideos": "Videos dur de Proxy leite",
"backgroundPlay": "Ton im Hintergrund abspiele",
"dash": "Dash",
"localVideoFallback": "Lokale Video-Fallback",
"youtubeJsFallback": "Fallback für lokali Videoverarbeitig",
"youtubeJsAlways": "Immer nutze",
"lockOrientation": "Uusrichtig as Siiteverhältnis bunde",
"defaultPlaybackSpeed": "Standardmässigi Widergabegschwindigkeit",
"playerStatistics": "Player-Statistike standardmässig aazeige"
},
"sponsors": {
"intermissionIntroAnimation": "Unterbrechig/Iistigsanimation",
"sponsor": "Sponsor",
"disableToast": "Toast deaktiviere",
"disableTimeline": "Segment uf de Ziitleischte deaktiviere",
"Catagories": "Kategorie",
"unpaidSelfPromotion": "Unbezahlti Werbig/Eigewerbig",
"interactionReminder": "Interaktionsufforderig (Abonniere)",
"credits": "Abspann",
"preViewRecapHook": "Vorschau/Rückblick/Hook",
"tangentJokes": "Füllendi Abwiichler/Witz"
},
"interface": "Benutzeroberflächi",
"star": "Sternli uf GitHub vergeh!",
"syncParty": "Synchronisationsgruppe",
"startSyncParty": "Synchronisationsgruppe starte",
"endSyncParty": "Synchronisationsgruppe stoppe",
"notifications": "Benachrichtigunge",
"noNewNotifications": "Kei neui Benachrichtigunge",
"settings": "Iistellige",
"login": "Aamelde",
"logout": "Abmelde",
"customize": "Aapasse",
"lowBandwidthMode": "Modus für gringi Bandbreiti",
"searchHistory": "Suechverlauf",
"theme": {
"theme": "Erschiinigsbild",
"darkMode": "Dunkle Modus",
"lightMode": "Helle Modus",
"AmoledTheme": "Amoled-Thema",
"color": "Farb"
},
"searchSuggestions": "Suechvorschläg",
"previewVideoOnHover": "Video-Vorschau bim Hovere",
"expandChapters": "Kapitel standardmässig uusklappe",
"expandComments": "Kommentär standardmässig erwiitere",
"allowInsecureRequests": "Unsicheri Aafrage zuelaa",
"dataPreferences": {
"dataPreferences": "Dateiistellige",
"content": "Du möchtsch Abonnements importiere/exportiere, dis Password ändere oder dis Konto lösche? Klick da und scroll bis as Endi vo de Siite."
},
"bookmarklet": "Lesezeiche",
"instanceUrl": "URL vo de Instanz",
"deArrow": {
"title": "DeArrow",
"thumbnailInstanceUrl": "URL vo de Vorschaubilder-Instanz",
"titleOnly": "Nur Titel"
},
"syncPartyWarning": "Bitte denk dra, dass dini IP für die vo dir iigladne Benutzer sichtbar isch.",
"displayThumbnailAvatars": "Vorschaubild-Avatar (Langsam)",
"expandDescription": "Beschriibig standardmässig erwiitere"
},
"videos": "Videos",
"cancel": "Abbreche",
"create": "Erstelle",
"title": "Titel",
"searchPlaceholder": "Sueche",
"delete": "Lösche",
"donate": "Spände",
"deleteAllHistory": "Gsamte Verlauf lösche",
"skipping": "Überspringe",
"comments": "Kommentär",
"reply": "Antwort",
"replies": "Antworte",
"region": "Region",
"noResult": "Kei Ergebnis",
"language": "Spraach",
"channels": "Kanäl",
"transcript": "Transkript",
"noCaptionData": "Untertitel enthalted kei Date.",
"selectLang": "Spraach uuswähle",
"letterCase": "Gross-/Chliischriibig für Titel",
"hideReplies": "Antworte verstecke",
"hideVideo": "Video verstecke",
"defaultPage": "Standardsiite",
"syncParty": {
"userJoined": "En Benutzer isch dinere Widergabegruppe biiträte.",
"userLeft": "En Benutzer het dini Widergabegruppe verlah.",
"userOnPrivatePage": "De Benutzer luegt sich grad e privati Siite a, d Synchronisierig wird grad wieder fortgsetzt."
},
"videoTabs": {
"all": "Alli",
"videos": "Videos",
"playlists": "Widergabelischte",
"channels": "Kanäl",
"shorts": "Shorts",
"streams": "Streams"
},
"subscriptions": {
"manageSubscriptions": "Abonnements verwalte"
},
"playlist": {
"createPlaylist": "Widergabelischte erstelle",
"public": "Öffentlich",
"unlisted": "Unglischtet",
"private": "Privat",
"playVideos": "Videos abspiele",
"loopPlaylist": "Widergabelischte inere Schleife abspiele",
"shuffleVideos": "Videos in zuefälliger Reihefolg abspiele"
},
"pages": {
"home": "Startsiite",
"trending": "Beliebt",
"subscriptions": "Abonnements",
"history": "Verlauf",
"playlists": "Widergabelischte"
},
"subscribers": "Abonnente",
"unsubscribe": "Abo beende",
"player": {
"audioOnly": "Nur Ton",
"theatreMode": "Theatermodus",
"pauseTimer": "Timer pausiere",
"pauseVideoIn": "Video pausiere i ",
"preferredQuality": "Bevorzugti Qualität",
"chapters": "Kapitel",
"share": {
"title": "Teile",
"materialiousLink": "Materialious-Link kopiere",
"youtubeLink": "YouTube-Link kopiere",
"invidiousRedirect": "Invidious-Wiiterleitigslink kopiere"
},
"download": "Abelade",
"downloadSteps": {
"merging": "Video und Audio zemmefüehre",
"video": "Abelade vom Video",
"audio": "Abelade vom Ton",
"ffmpeg": "Abelade vo de ffmpeg-Bibliothek und -Komponente",
"core": "Abelade vom ffmpeg-Chern",
"wasm": "Abelade vom ffmpeg wasm",
"worker": "Abelade vom ffmpeg worker",
"classWorker": "Abelade vom ffmpeg-Klassearbeiter"
},
"noPlaylists": "Kei Widergabelischtene",
"unableToLoadComments": "Lade vo de Kommentär fehlgschlage",
"addToPlaylist": "Zu de Widergabelischte hinzuefüege",
"defaultLanguage": "Standardspraach",
"youtubeJsLoading": "S Video het nöd chönne glade werde, es wird mit lokalem Video-Fallback nomal versuecht.",
"retryText": "S Video het nöd chönne glade werde, wie willsch wiitermache?",
"enableYoutubejsPerm": "Lokale Video-Fallback immer erlaube",
"enableYoutubejsTemp": "Nutz eimalig de lokali Video-Fallback",
"youtubeJsFallBack": "Lokale Video-Fallback wird gnutzt"
},
"subscribe": "Abonniere",
"invidiousLogin": "Bitte meld dich mit dim Invidious-Konto aa",
"invalidInstance": "Bitte prüef d URL. Wenn si korrekt isch, isch d Instanz möglicherwiis usser Betriib oder unterstützt kei Clients vo Drittaabüüter.",
"loginRequired": "Aameldig erforderlich"
}
+12 -10
View File
@@ -98,10 +98,10 @@
"addToPlaylist": "再生リストに追加",
"defaultLanguage": "既定の言語",
"retryText": "動画の読み込みに失敗。どう続けますか?",
"enableYoutubejsTemp": "一度だけ動画への代替接続で直接接続",
"enableYoutubejsPerm": "常に動画への代替接続で直接接続",
"youtubeJsFallBack": "動画への代替接続で直接接続を使用",
"youtubeJsLoading": "動画の読み込みに失敗。動画への代替接続で直接接続を試みます。"
"enableYoutubejsTemp": "一度だけ動画への直接接続に切り替え",
"enableYoutubejsPerm": "常に動画への接続エラーで直接接続を許可",
"youtubeJsFallBack": "動画接続エラー 直接接続に切替",
"youtubeJsLoading": "動画の読み込みに失敗。動画への直接接続に切り替えます。"
},
"layout": {
"interface": "外観",
@@ -132,7 +132,7 @@
"expandComments": "最初からコメント展開",
"allowInsecureRequests": "安全でないリクエストの許可",
"dataPreferences": {
"content": "登録チャンネルのインポート/エクスポート、パスワード変更、アカウント削除ですか?ここをクリックし、ページの一番下までスクロール。",
"content": "登録チャンネルのインポートエクスポート、パスワード変更、アカウント削除ですか?ここをクリックし、ページの一番下までスクロールしてください。",
"dataPreferences": "データ設定"
},
"player": {
@@ -142,19 +142,19 @@
"savePlaybackPosition": "再生位置を記憶",
"ccByDefault": "最初から字幕表示",
"theatreModeByDefault": "最初からシアターモード",
"autoPlayNextByDefault": "最初から自動で次の動画",
"autoPlayNextByDefault": "最初から次の動画を自動再生」を有効化",
"miniPlayer": "ミニプレイヤー",
"proxyVideos": "動画のプロキシ",
"backgroundPlay": "バックグラウンドで音声を再生",
"dash": "DASH",
"listenByDefault": "最初から音声モード",
"silenceSkipper": "無音部分を飛ばす (実験的)",
"localVideoFallback": "動画への代替接続で直接接続",
"localVideoFallback": "動画の接続エラーで直接接続に切替",
"youtubeJsFallback": "失敗時に動画の代替処理を使用",
"youtubeJsAlways": "常に使用",
"lockOrientation": "アスペクト比と向きを固定",
"defaultPlaybackSpeed": "既定の再生速度",
"playerStatistics": "最初かプレイヤー統計情報を表示"
"playerStatistics": "最初かプレイヤー統計情報を表示"
},
"bookmarklet": "ブックマーク",
"instanceUrl": "インスタンスのURL",
@@ -175,9 +175,11 @@
"thumbnailInstanceUrl": "サムネイル用のインスタンスのURL",
"titleOnly": "題名のみ"
},
"noNewNotifications": "新規の通知なし",
"noNewNotifications": "新通知なし",
"customize": "カスタマイズ"
},
"subscribe": "登録",
"invidiousBlockWarning": "Invidious は、現在Googleにブロックされています。このインスタンスで動画が読み込めない場合、{android} 版または {desktop} 版の Materialious でこのインスタンスを使用し、動画取得を直接行う代替接続を使ってください。"
"invidiousBlockWarning": "Invidious は、現在Googleにブロックされています。このインスタンスで動画が読み込めない場合、{android} 版または {desktop} 版の Materialious でこのインスタンスを使用し、動画取得を直接行う代替接続を使ってください。",
"reply": "返信",
"comments": "コメント"
}
+22 -11
View File
@@ -1,7 +1,6 @@
import { androidPoTokenMinter } from '$lib/android/youtube/minter';
import type {
AdaptiveFormats,
Captions,
Image,
StoryBoard,
Thumbnail,
@@ -78,6 +77,8 @@ export async function patchYoutubeJs(videoId: string): Promise<VideoPlay> {
throw new Error('Unable to pull video info from youtube.js');
}
console.log(video);
let dashUri: string | undefined;
if (video.streaming_data) {
@@ -98,7 +99,7 @@ export async function patchYoutubeJs(videoId: string): Promise<VideoPlay> {
? video.streaming_data.hls_manifest_url // HLS is preferred for DVR streams.
: `${video.streaming_data.dash_manifest_url}/mpd_version/7`;
} else {
dashUri = `data:application/dash+xml;base64,${btoa(await video.toDash({ captions_format: 'vtt' }))}`;
dashUri = `data:application/dash+xml;base64,${btoa(await video.toDash({ manifest_options: { captions_format: 'vtt' } }))}`;
}
}
@@ -116,20 +117,30 @@ export async function patchYoutubeJs(videoId: string): Promise<VideoPlay> {
const recommendedVideos: VideoBase[] = [];
video.watch_next_feed?.forEach((recommended: Record<string, any>) => {
if (!recommended.title) {
if (
!recommended.metadata.title.text ||
recommended.content_type !== 'VIDEO' ||
!recommended.metadata.metadata.metadata_rows ||
recommended.metadata.metadata.metadata_rows.length < 2
) {
return;
}
recommendedVideos.push({
videoThumbnails: (recommended?.thumbnails as Thumbnail[]) || [],
videoId: recommended?.id || '',
title: recommended?.title?.toString() || '',
viewCountText: recommended.view_count
? numberWithCommas(Number(recommended?.view_count.toString().replace(/\D/g, ''))) || ''
videoThumbnails: (recommended?.content_image?.image as Thumbnail[]) || [],
videoId: recommended?.content_id || '',
title: recommended.metadata.title?.text || '',
viewCountText: recommended.metadata.metadata.metadata_rows[1]?.metadata_parts[0]
? recommended.metadata.metadata.metadata_rows[1]?.metadata_parts[0]?.text.text?.replace(
'views',
''
)
: '',
lengthSeconds: recommended?.duration?.seconds || 0,
author: recommended?.author?.name || '',
authorId: recommended?.author?.id || ''
author: recommended.metadata.metadata.metadata_rows[0]?.metadata_parts[0]?.text.text || '',
authorId:
recommended.metadata?.image?.renderer_context?.command_context?.on_tap.payload?.browseId ||
''
});
});
@@ -202,7 +213,7 @@ export async function patchYoutubeJs(videoId: string): Promise<VideoPlay> {
videoThumbnails: video.basic_info.thumbnail as Thumbnail[],
author: video.basic_info.author || 'Unknown',
lengthSeconds: video.basic_info.duration || 0,
subCountText: '',
subCountText: video.secondary_info.owner?.subscriber_count.text || '',
keywords: video.basic_info.keywords || [],
allowedRegions: [],
ytjs: {
+1
View File
@@ -92,6 +92,7 @@ export const interfaceDisplayThumbnailAvatars = persisted('disableThumbnailAvata
export const interfaceDefaultPage = persisted('defaultPage', '/');
export const interfaceSearchHistoryEnabled = persisted('searchHistoryEnabled', false);
export const interfaceAllowInsecureRequests = persisted('allowInsecureRequests', false);
export const interfaceDisableAutoUpdate = persisted('disableAutoUpdate', false)
export const sponsorBlockStore = persisted('sponsorBlock', true);
export const sponsorBlockUrlStore: Writable<string | null | undefined> = persisted(
+1 -1
View File
@@ -3,7 +3,7 @@ import os
import re
from datetime import datetime
LATEST_VERSION = "1.9.20"
LATEST_VERSION = "1.9.21"
RELEASE_DATE = datetime.now().strftime("%Y-%-m-%d") # Format: YYYY-M-D
WORKING_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "materialious")