From 161e0937cdc981900c0d47f2cc58f5843cc491c3 Mon Sep 17 00:00:00 2001 From: Georgiy Date: Wed, 3 May 2023 13:44:44 +0300 Subject: [PATCH 1/6] Fixed error --- android/app/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index f9245c9..42f4ad7 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -21,7 +21,7 @@ - > + From 3b18789478557dba735215c8789b582d646b84a9 Mon Sep 17 00:00:00 2001 From: Georgiy Date: Wed, 3 May 2023 15:03:39 +0300 Subject: [PATCH 2/6] fix: Fixed player (loading video) --- NUXT/plugins/constants.js | 52 +++++++++++++++++++++++++++++++++++++++ NUXT/plugins/innertube.js | 45 ++++++++++++++++++++++++++++----- 2 files changed, 91 insertions(+), 6 deletions(-) diff --git a/NUXT/plugins/constants.js b/NUXT/plugins/constants.js index bccd461..b0ea3f3 100644 --- a/NUXT/plugins/constants.js +++ b/NUXT/plugins/constants.js @@ -40,6 +40,19 @@ module.exports = { return headers; }, + INNERTUBE_NEW_HEADER: (info) => { + let headers = { + accept: "*/*", + "user-agent": info.userAgent, + "accept-language": `${info.hl}-${info.gl},${info.hl};q=0.9`, + "content-type": "application/json", + "x-goog-authuser": 0, + "x-goog-visitor-id": info.visitorData || "", + "x-youtube-client-name": "2", + "x-youtube-client-version": "2.20230502.01.00", + }; + return headers; + }, INNERTUBE_CLIENT: (info) => { let client = { gl: info.gl, @@ -59,4 +72,43 @@ module.exports = { }; return client; }, + INNERTUBE_VIDEO: (info) => { + let client = { + gl: info.gl, + hl: info.hl, + deviceMake: info.deviceMake, + deviceModel: info.deviceModel, + userAgent: info.userAgent, + clientName: "MWEB", + clientVersion: "2.20230502.01.00", + osName: info.osName, + osVersion: info.osVersion, + platform: "MOBILE", + playerType: "UNIPLAYER", + screenPixelDensity: "3", + originalUrl: info.originalUrl, + configInfo: info.configInfo, + remoteHost: info.remoteHost, + visitorData: info.visitorData, + clientFormFactor: "SMALL_FORM_FACTOR", + screenDensityFloat: "1", + timeZone: info.timeZone, + browserName: info.browserName, + browserVersion: info.browserVersion, + acceptHeader: + "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", + deviceExperimentId: info.deviceExperimentId, + screenWidthPoints: info.screenWidthPoints, + screenHeightPoints: info.screenHeightPoints, + utcOffsetMinutes: info.utcOffsetMinutes, + userInterfaceTheme: "USER_INTERFACE_THEME_LIGHT", + memoryTotalKbytes: "8000000", + clientScreen: "WATCH", + mainAppWebInfo: { + webDisplayMode: "WEB_DISPLAY_MODE_BROWSER", + isWebNativeShareAvailable: true, + }, + }; + return client; + }, }; diff --git a/NUXT/plugins/innertube.js b/NUXT/plugins/innertube.js index 075f628..90ae2ee 100644 --- a/NUXT/plugins/innertube.js +++ b/NUXT/plugins/innertube.js @@ -32,7 +32,7 @@ class Innertube { this.ErrorCallback(html.message, true); try { const data = JSON.parse( - getBetweenStrings(html.data, "ytcfg.set(", ");") + "{" + getBetweenStrings(html.data, "ytcfg.set({", ");") ); if (data.INNERTUBE_CONTEXT) { this.key = data.INNERTUBE_API_KEY; @@ -81,7 +81,11 @@ class Innertube { //--- API Calls ---// async browseAsync(action_type, args = {}) { - let data = { context: this.context }; + let data = { + context: { + client: constants.INNERTUBE_CLIENT(this.context.client), + }, + }; switch (action_type) { case "recommendations": @@ -160,7 +164,12 @@ class Innertube { } async getVidAsync(id) { - let data = { context: this.context, videoId: id }; + let data = { + context: { + client: constants.INNERTUBE_VIDEO(this.context.client), + }, + videoId: id, + }; const responseNext = await Http.post({ url: `${constants.URLS.YT_BASE_API}/next?key=${this.key}`, data: { @@ -179,8 +188,33 @@ class Innertube { const response = await Http.post({ url: `${constants.URLS.YT_BASE_API}/player?key=${this.key}`, - data: data, - headers: constants.INNERTUBE_HEADER(this.context.client), + data: { + ...data, + ...{ + contentCheckOk: false, + mwebCapabilities: { + mobileClientSupportsLivestream: true, + }, + playbackContext: { + contentPlaybackContext: { + currentUrl: "/watch?v=" + id, + vis: 0, + splay: false, + autoCaptionsDefaultOn: false, + autonavState: "STATE_NONE", + html5Preference: "HTML5_PREF_WANTS", + signatureTimestamp: 19473, + referer: "https://m.youtube.com/", + lactMilliseconds: "-1", + watchAmbientModeContext: { + watchAmbientModeEnabled: true, + }, + }, + }, + }, + }, + // headers: constants.INNERTUBE_HEADER(this.context.client), + headers: constants.INNERTUBE_NEW_HEADER(this.context.client), }).catch((error) => error); if (response.error) @@ -336,7 +370,6 @@ class Innertube { const ownerData = vidMetadata.contents.find( (content) => content.slimOwnerRenderer )?.slimOwnerRenderer; - const vidData = { id: details.videoId, title: details.title, From c75ee0d882914751a22cd6389a9221a818027957 Mon Sep 17 00:00:00 2001 From: Georgiy Date: Wed, 3 May 2023 15:06:03 +0300 Subject: [PATCH 3/6] feat(lang): updated Ukrainian language --- NUXT/plugins/languages/ukrainian.js | 214 ++++++++++++++++------------ 1 file changed, 121 insertions(+), 93 deletions(-) diff --git a/NUXT/plugins/languages/ukrainian.js b/NUXT/plugins/languages/ukrainian.js index e65da60..4751c7e 100644 --- a/NUXT/plugins/languages/ukrainian.js +++ b/NUXT/plugins/languages/ukrainian.js @@ -1,93 +1,121 @@ -module.exports = { - name: "Українська", - - global: { - home: "Головна", - subscriptions: "Підписки", - library: "Бібліотека", - restart: "Перезапустити", - later: "Пізніше", - settingRestart: "Зміна цього параметра вимагає перезапуску" - }, - - index: { - connecting: "Підключення", - plugins: "Завантаження плагінів", - launching: "Запуск", - }, - - settings: { - general: "Загальні", - theme: "Тема", - player: "Відеоплеєр", - uitweaker: "Налаштування UI", - startupoptions: "Параметри запуску", - plugins: "Плагіни", - updates: "Оновлення", - logs: "Журнали", - about: "Про додаток", - devmode: "Редактор реєстру", - }, - - mods: { - general: { - language: "Мова", - }, - theme: { - normal: "Звичайна", - adaptive: "Адаптивна", - custom: "Власна", - dark: "Темна", - black: "Чорна", - darkmode: "Темний режим", - darkmodetagline: "Bravo Six, Going Dark.", - }, - tweaks: { - fullscreen: "Повноекранний режим", - navbarblur: "Розмиття навігаційної панелі", - roundedcorners: "Закруглені кути", - roundthumbnails: "Закруглені мініатюри", - roundwatchpagecomponents: "Закруглені компоненти сторінки перегляду", - radius: "Радіус", - }, - startup: { - defaultpage: "Домашня сторінка", - }, - updates: { - install: "Встановити", - view: "Переглянути", - latest: "Остання", - installed: "Встановлена", - }, - logs: { - more: "Більше", - }, - about: { - appinformation: "Інформація про додаток", - appversion: "Версія додатку", - deviceinformation: "Інформація про пристрій", - platform: "Платформа", - os: "Операційна система", - model: "Модель", - manufacturer: "Виробник", - emulator: "Емулятор", - github: "GitHub", - discord: "Discord", - }, - }, - - events: { - welcome: "Ласкаво просимо до VueTube", - tagline: "Майбутнє відео-стрімінгу", - next: "Далі", - updated: "VueTube оновлено!", - awesome: "Добре!", - langsetup: "Давайте виберемо мову!", - featuresetup: "Давайте виберемо деякі функції!", - enableryd: "Увімкнути Return YouTube Dislike", - enablespb: "Увімкнути SponsorBlock", - thanks: "Дякуємо за використання VueTube", - enjoy: "Ми сподіваємося, що вам сподобається!", - packageinstaller: "Виберіть пакет для завантаження" - }, -}; +module.exports = { + name: "Українська", + + global: { + home: "Головна", + subscriptions: "Підписки", + library: "Бібліотека", + restart: "Перезапустити", + later: "Пізніше", + settingRestart: "Зміна цього параметра вимагає перезапуску" + }, + + index: { + connecting: "Підключення", + plugins: "Завантаження плагінів", + launching: "Запуск", + }, + + settings: { + general: "Загальні", + theme: "Тема", + player: "Відеоплеєр", + uitweaker: "Налаштування UI", + startupoptions: "Параметри запуску", + plugins: "Плагіни", + updates: "Оновлення", + logs: "Журнали", + about: "Про додаток", + devmode: "Редактор реєстру", + }, + + mods: { + general: { + language: "Мова", + backup: "Backup", + backupinfo: "Backup or restore your application settings", + restore: "Restore", + personalizedrecommendations: "Персоналізовані рекомендації", + personalizedrecommendationsinfo: + "Отримуйте персоналізовані рекомендації в обмін на надсилання телеметричних даних про час перегляду.", + }, + developer: { + registryeditor: "Registry editor", + registrywarning: "CHANGING ENTRIES MAY CAUSE YOUR APP TO BREAK!", + createentry: "Create entry", + createentryfull: "Create registry entry", + cancel: "Cancel", + create: "Create", + key: "Key", + value: "Value", + confirmdelete: "Confirm delete", + areyousure: "Are you sure that you want to delete?", + delete: "Delete", + change: "Change", + }, + theme: { + normal: "Звичайна", + adaptive: "Адаптивна", + custom: "Власна", + dark: "Темна", + black: "Чорна", + darkmode: "Темний режим", + darkmodetagline: "Bravo Six, Going Dark.", + }, + tweaks: { + fullscreen: "Повноекранний режим", + navbarblur: "Розмиття навігаційної панелі", + roundedcorners: "Закруглені кути", + roundthumbnails: "Закруглені мініатюри", + roundwatchpagecomponents: "Закруглені компоненти сторінки перегляду", + radius: "Радіус", + }, + startup: { + defaultpage: "Домашня сторінка", + }, + updates: { + install: "Встановити", + view: "Переглянути", + latest: "Остання", + installed: "Встановлена", + size: "Розмір", + users: "Завантажень", + published: "Опубліковано", + + okay: "ОК", + refresh: "Оновити", + update: "Завантажити", + later: "Пізніше", + }, + logs: { + more: "Більше", + }, + about: { + appinformation: "Інформація про додаток", + appversion: "Версія додатку", + deviceinformation: "Інформація про пристрій", + platform: "Платформа", + os: "Операційна система", + model: "Модель", + manufacturer: "Виробник", + emulator: "Емулятор", + github: "GitHub", + discord: "Discord", + }, + }, + + events: { + welcome: "Ласкаво просимо до VueTube", + tagline: "Майбутнє відео-стрімінгу", + next: "Далі", + updated: "VueTube оновлено!", + awesome: "Добре!", + langsetup: "Давайте виберемо мову!", + featuresetup: "Давайте виберемо деякі функції!", + enableryd: "Увімкнути Return YouTube Dislike", + enablespb: "Увімкнути SponsorBlock", + thanks: "Дякуємо за використання VueTube", + enjoy: "Ми сподіваємося, що вам сподобається!", + packageinstaller: "Виберіть пакет для завантаження" + }, +}; From 0ddda59c72899d0cac807d9b58cbbaf0e9fd60f7 Mon Sep 17 00:00:00 2001 From: Georgiy Date: Wed, 3 May 2023 15:06:50 +0300 Subject: [PATCH 4/6] fix: Fixed displaying info in Updates menu --- NUXT/pages/mods/updates.vue | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/NUXT/pages/mods/updates.vue b/NUXT/pages/mods/updates.vue index 0a9c385..7667f87 100644 --- a/NUXT/pages/mods/updates.vue +++ b/NUXT/pages/mods/updates.vue @@ -55,13 +55,19 @@ >
{{ lang.published }}: - {{ new Date(update.created_at).toLocaleString() }} + {{ new Date(latestVersion.assets[0].created_at).toLocaleString() }}
{{ lang.size }}: - {{ require("~/plugins/utils").humanFileSize(update.size) }} + {{ + require("~/plugins/utils").humanFileSize( + latestVersion.assets[0].size + ) + }} +
+
+ {{ lang.users }}: {{ latestVersion.assets[0].download_count }}
-
{{ lang.users }}: {{ update.download_count }}
{ + await this.$update(this.latestVersion.assets[0].url).catch(() => { this.downloading = false; }); //window.open(this.update.browser_download_url, '_blank'); From 1b15c6236cd506d8d7b8644d561358c55f0bfb48 Mon Sep 17 00:00:00 2001 From: Georgiy Date: Wed, 3 May 2023 15:10:09 +0300 Subject: [PATCH 5/6] feat(recommends): Changed type of recommends in index.vue --- NUXT/components/Player/index.vue | 5 +++-- NUXT/pages/home.vue | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/NUXT/components/Player/index.vue b/NUXT/components/Player/index.vue index 832a902..57eda1a 100644 --- a/NUXT/components/Player/index.vue +++ b/NUXT/components/Player/index.vue @@ -380,7 +380,7 @@ export default { required: true, }, recommends: { - type: Array, + type: Object, default: () => { return []; }, @@ -416,6 +416,7 @@ export default { mounted() { console.log("sources", this.sources); console.log("recommends", this.recommends); + console.log("video", this.video); this.vid = this.$refs.player; // TODO: this.$store.state.player.quality, check if exists and select the closest one @@ -535,7 +536,7 @@ export default { if (this.xhr) this.xhr.abort(); if (this.isFullscreen) this.exitFullscreen(); if (this.bufferingDetected) clearTimeout(this.bufferingDetected); - screen.orientation.removeEventListener("change"); + // screen.orientation.removeEventListener("change"); this.$refs.player.removeEventListener("loadeddata", this.loadedDataEvent); this.$refs.player.removeEventListener("timeupdate", this.timeUpdateEvent); this.$refs.player.removeEventListener("progress", this.progressEvent); diff --git a/NUXT/pages/home.vue b/NUXT/pages/home.vue index a5bd0fb..50d75e2 100644 --- a/NUXT/pages/home.vue +++ b/NUXT/pages/home.vue @@ -68,7 +68,9 @@ export default { .then((result) => { if (result) this.recommends = [result]; }) - .catch(error => {}); + .catch((error) => { + console.error(error); + }); } }, }; From f0b5cbeaae69c21717bc073283dcbcc75b563a4e Mon Sep 17 00:00:00 2001 From: Pixkk <30828435+pixkk@users.noreply.github.com> Date: Wed, 3 May 2023 15:41:59 +0300 Subject: [PATCH 6/6] Create node.js.yml --- .github/workflows/node.js.yml | 115 ++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 .github/workflows/node.js.yml diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml new file mode 100644 index 0000000..9327cf8 --- /dev/null +++ b/.github/workflows/node.js.yml @@ -0,0 +1,115 @@ +name: CI + +on: + push: + branches: + - main + - dev + +env: + NODE_VERSION: 16 + +jobs: + build: + name: Build web assets + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Set up Node.js ${{ env.NODE_VERSION }} + uses: actions/setup-node@v2 + with: + node-version: ${{ env.NODE_VERSION }} + - name: Install dependencies + run: npm i; cd NUXT; npm i + - name: Set App Version + working-directory: NUXT + run: sed -i 's/dev-local/${{ github.sha }}/' nuxt.config.js + - name: Build web assets + working-directory: NUXT + run: npm run generate + - name: Upload artifacts + uses: actions/upload-artifact@v2 + with: + name: dist + path: dist + android: + name: Build Android platform + runs-on: ubuntu-latest + needs: [build] + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: dist + path: dist + - name: Set up Node.js ${{ env.NODE_VERSION }} + uses: actions/setup-node@v2 + with: + node-version: ${{ env.NODE_VERSION }} + - name: Install dependencies + run: npm i + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: 11 + - name: Copy web assets to native platform + run: npx cap copy android + - name: Update native platform + run: npx cap update android + - name: Build with Gradle + working-directory: android + run: chmod +x gradlew; ./gradlew clean assembleRelease -x test -Pandroid.injected.signing.store.file=/home/runner/work/VueTube/VueTube/android/key.jks -Pandroid.injected.signing.store.password=${{ secrets.ANDROID_STORE_PASSWORD }} -Pandroid.injected.signing.key.alias=${{ secrets.ANDROID_KEY_ALIAS }} -Pandroid.injected.signing.key.password=${{ secrets.ANDROID_KEY_PASSWORD }} + - name: Upload artifacts + uses: actions/upload-artifact@v2 + with: + name: android + path: android/app/build/outputs/apk/release/app-release.apk + + ios: + name: Build iOS platform + runs-on: macos-latest + needs: [build] + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: dist + path: dist + - name: Set up Node.js ${{ env.NODE_VERSION }} + uses: actions/setup-node@v2 + with: + node-version: ${{ env.NODE_VERSION }} + - name: Install dependencies + run: npm i + - name: Copy web assets to native platform + run: npx cap copy ios + - name: Update native platform + run: npx cap update ios + - name: Add empty `GoogleService-Info.plist` + run: echo "$GOOGLE_SERVICE_INFO_PLIST" > ios/App/App/GoogleService-Info.plist + env: + GOOGLE_SERVICE_INFO_PLIST: ${{secrets.GOOGLE_SERVICE_INFO_PLIST}} + - name: Build and archive with xcodebuild + working-directory: ios + run: xcodebuild + -workspace App/App.xcworkspace + -scheme App + -archivePath App/build/App.xarchive + clean build archive + CODE_SIGN_IDENTITY="" + CODE_SIGNING_REQUIRED=NO + CODE_SIGNING_ALLOWED="NO" + CODE_SIGN_ENTITLEMENTS="" + - name: Make IPA + run: mkdir Payload && mv ~/Library/Developer/Xcode/DerivedData/App-*/Build/Products/Debug-iphoneos/App.app/ Payload && zip -r Payload.zip Payload && mv Payload.zip VueTube.ipa + + - name: Upload artifacts + uses: actions/upload-artifact@v2 + with: + name: iOS + path: VueTube.ipa