diff --git a/NUXT/pages/watch.vue b/NUXT/pages/watch.vue index f87658b..cd93fb6 100644 --- a/NUXT/pages/watch.vue +++ b/NUXT/pages/watch.vue @@ -160,6 +160,7 @@ export default { }, }, mounted() { + this.$youtube.saveApiStats("detailpage", this.$route.query.v, "streamingstats") this.getVideo(); }, methods: { diff --git a/NUXT/plugins/constants.js b/NUXT/plugins/constants.js index 97425c4..81d03cb 100644 --- a/NUXT/plugins/constants.js +++ b/NUXT/plugins/constants.js @@ -6,6 +6,7 @@ const url = { YT_MUSIC_URL: "https://music.youtube.com", YT_BASE_API: "https://www.youtube.com/youtubei/v1", YT_SUGGESTIONS: "https://suggestqueries.google.com/complete", + YT_API_STATS: "https://www.youtube.com/api/stats/atr", VT_GITHUB: "https://api.github.com/repos/Frontesque/VueTube", }; diff --git a/NUXT/plugins/innertube.js b/NUXT/plugins/innertube.js index 637e258..87de071 100644 --- a/NUXT/plugins/innertube.js +++ b/NUXT/plugins/innertube.js @@ -152,6 +152,23 @@ class Innertube { }; } + // WARNING: This is tracking the user's activity, but is required for recommendations to properly work + async apiStats(currentPageType, id, event) { + const params = { + key: this.key, + el: currentPageType, + ns: "yt", + docid: id, + event: event, + feature: "g-high-rec", + c: this.context.client.clientName, + volume: 100, + cver: this.context.client.clientVersion, + hl: this.context.client.hl, + }; + await Http.post({ url: constants.URLS.YT_API_STATS, params: params }); + } + // Static methods static getThumbnail(id, resolution) { diff --git a/NUXT/plugins/youtube.js b/NUXT/plugins/youtube.js index 90dcc53..1fbe8bd 100644 --- a/NUXT/plugins/youtube.js +++ b/NUXT/plugins/youtube.js @@ -4,6 +4,7 @@ import Innertube from "./innertube"; import constants from "./constants"; import rendererUtils from "./renderers"; import { Buffer } from "buffer"; +import iconv from "iconv-lite"; //--- Logger Function ---// function logger(func, data, isError = false) { @@ -19,15 +20,7 @@ function getEncoding(contentType) { const re = /charset=([^()<>@,;:\"/[\]?.=\s]*)/i; const content = re.exec(contentType); console.log(content); - if (!content || content[1].toLowerCase() == "utf-8") { - return "utf8"; - } - if (content[1].toLowerCase() == "iso-8859-1") { - return "latin1"; - } - if (content[1].toLowerCase() == "utf16le") { - return "utf16le"; - } + return content[1].toLowerCase(); } const searchModule = { @@ -45,7 +38,7 @@ const searchModule = { // make a new buffer object from res.data const buffer = Buffer.from(res.data, "base64"); // convert res.data from iso-8859-1 to utf-8 - const data = buffer.toString(getEncoding(contentType)); + const data = iconv.decode(buffer, getEncoding(contentType)); logger(constants.LOGGER_NAMES.autoComplete, data); callback(data); }) @@ -137,6 +130,10 @@ const innertubeModule = { logger(constants.LOGGER_NAMES.search, err, true); } }, + + async saveApiStats(currentPageType, id, event) { + await InnertubeAPI.apiStats(currentPageType, id, event); + }, }; //--- Start ---// diff --git a/package.json b/package.json index 8cb9db5..ac4df6c 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "@capacitor/share": "^1.1.2", "@capacitor/splash-screen": "^1.2.2", "@capacitor/status-bar": "^1.0.8", - "@hugotomazi/capacitor-navigation-bar": "^1.1.1" + "@hugotomazi/capacitor-navigation-bar": "^1.1.1", + "iconv-lite": "^0.6.3" } }