From 9e3079831188c1ad329ce0ba2e69b7dcdfe9f148 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Thu, 11 Jan 2024 20:28:36 +0100 Subject: [PATCH] fix: subscription groups use invalid channel id length --- src/App.vue | 19 ++++++++++++++++++- src/components/ChannelPage.vue | 2 +- src/components/SubscriptionsPage.vue | 28 +++------------------------- src/main.js | 22 ++++++++++++++++++++++ 4 files changed, 44 insertions(+), 27 deletions(-) diff --git a/src/App.vue b/src/App.vue index 735ced1b..c157314b 100644 --- a/src/App.vue +++ b/src/App.vue @@ -36,7 +36,7 @@ export default { }); if ("indexedDB" in window) { - const request = indexedDB.open("piped-db", 5); + const request = indexedDB.open("piped-db", 6); request.onupgradeneeded = ev => { const db = request.result; console.log("Upgrading object store."); @@ -64,6 +64,23 @@ export default { const playlistVideosStore = db.createObjectStore("playlist_videos", { keyPath: "videoId" }); playlistVideosStore.createIndex("videoId", "videoId", { unique: true }); } + // migration to fix an invalid previous length of channel ids: 11 -> 24 + (async () => { + if (ev.oldVersion < 6) { + const subscriptions = await this.fetchSubscriptions(); + const channelGroups = await this.getChannelGroups(); + for (let group of channelGroups) { + for (let i = 0; i < group.channels.length; i++) { + const tooShortChannelId = group.channels[i]; + const foundChannel = subscriptions.find( + channel => channel.url.substr(-11) == tooShortChannelId, + ); + if (foundChannel) group.channels[i] = foundChannel.url.substr(-24); + } + this.createOrUpdateChannelGroup(group); + } + } + })(); }; request.onsuccess = e => { window.db = e.target.result; diff --git a/src/components/ChannelPage.vue b/src/components/ChannelPage.vue index 1bc71548..664a7eaf 100644 --- a/src/components/ChannelPage.vue +++ b/src/components/ChannelPage.vue @@ -79,7 +79,7 @@ /> - + diff --git a/src/components/SubscriptionsPage.vue b/src/components/SubscriptionsPage.vue index 85b49050..568eccf9 100644 --- a/src/components/SubscriptionsPage.vue +++ b/src/components/SubscriptionsPage.vue @@ -107,7 +107,7 @@ @@ -140,7 +140,7 @@ export default { filteredSubscriptions(_this) { return _this.selectedGroup.groupName == "" ? _this.subscriptions - : _this.subscriptions.filter(channel => _this.selectedGroup.channels.includes(channel.url.substr(-11))); + : _this.subscriptions.filter(channel => _this.selectedGroup.channels.includes(channel.url.substr(-24))); }, }, mounted() { @@ -159,28 +159,6 @@ export default { document.title = "Subscriptions - Piped"; }, methods: { - async fetchSubscriptions() { - if (this.authenticated) { - return await this.fetchJson(this.authApiUrl() + "/subscriptions", null, { - headers: { - Authorization: this.getAuthToken(), - }, - }); - } else { - const channels = this.getUnauthenticatedChannels(); - const split = channels.split(","); - if (split.length > 100) { - return await this.fetchJson(this.authApiUrl() + "/subscriptions/unauthenticated", null, { - method: "POST", - body: JSON.stringify(split), - }); - } else { - return await this.fetchJson(this.authApiUrl() + "/subscriptions/unauthenticated", { - channels: this.getUnauthenticatedChannels(), - }); - } - } - }, async loadChannelGroups() { const groups = await this.getChannelGroups(); this.channelGroups.push(...groups); @@ -256,7 +234,7 @@ export default { this.selectedGroup = this.channelGroups[0]; }, checkedChange(subscription) { - const channelId = subscription.url.substr(-11); + const channelId = subscription.url.substr(-24); this.selectedGroup.channels = this.selectedGroup.channels.includes(channelId) ? this.selectedGroup.channels.filter(channel => channel != channelId) : this.selectedGroup.channels.concat(channelId); diff --git a/src/main.js b/src/main.js index 9d6f8382..b3cc9f1e 100644 --- a/src/main.js +++ b/src/main.js @@ -236,6 +236,28 @@ const mixin = { const localSubscriptions = this.getLocalSubscriptions() ?? []; return localSubscriptions.join(","); }, + async fetchSubscriptions() { + if (this.authenticated) { + return await this.fetchJson(this.authApiUrl() + "/subscriptions", null, { + headers: { + Authorization: this.getAuthToken(), + }, + }); + } else { + const channels = this.getUnauthenticatedChannels(); + const split = channels.split(","); + if (split.length > 100) { + return await this.fetchJson(this.authApiUrl() + "/subscriptions/unauthenticated", null, { + method: "POST", + body: JSON.stringify(split), + }); + } else { + return await this.fetchJson(this.authApiUrl() + "/subscriptions/unauthenticated", { + channels: this.getUnauthenticatedChannels(), + }); + } + } + }, /* generate a temporary file and ask the user to download it */ download(text, filename, mimeType) { var file = new Blob([text], { type: mimeType });