Merge pull request #3325 from Bnyro/fix-channel-id

fix: subscription groups use invalid channel id length
This commit is contained in:
Bnyro 2024-02-23 17:46:47 +01:00 committed by GitHub
commit 55fb472ba2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 44 additions and 27 deletions

View File

@ -36,7 +36,7 @@ export default {
}); });
if ("indexedDB" in window) { if ("indexedDB" in window) {
const request = indexedDB.open("piped-db", 5); const request = indexedDB.open("piped-db", 6);
request.onupgradeneeded = ev => { request.onupgradeneeded = ev => {
const db = request.result; const db = request.result;
console.log("Upgrading object store."); console.log("Upgrading object store.");
@ -64,6 +64,23 @@ export default {
const playlistVideosStore = db.createObjectStore("playlist_videos", { keyPath: "videoId" }); const playlistVideosStore = db.createObjectStore("playlist_videos", { keyPath: "videoId" });
playlistVideosStore.createIndex("videoId", "videoId", { unique: true }); 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 => { request.onsuccess = e => {
window.db = e.target.result; window.db = e.target.result;

View File

@ -79,7 +79,7 @@
/> />
</div> </div>
<AddToGroupModal v-if="showGroupModal" :channel-id="channel.id.substr(-11)" @close="showGroupModal = false" /> <AddToGroupModal v-if="showGroupModal" :channel-id="channel.id.substr(-24)" @close="showGroupModal = false" />
</LoadingIndicatorPage> </LoadingIndicatorPage>
</template> </template>

View File

@ -105,7 +105,7 @@
<input <input
type="checkbox" type="checkbox"
class="checkbox" class="checkbox"
:checked="selectedGroup.channels.includes(subscription.url.substr(-11))" :checked="selectedGroup.channels.includes(subscription.url.substr(-24))"
@change="checkedChange(subscription)" @change="checkedChange(subscription)"
/> />
</div> </div>
@ -138,7 +138,7 @@ export default {
filteredSubscriptions(_this) { filteredSubscriptions(_this) {
return _this.selectedGroup.groupName == "" return _this.selectedGroup.groupName == ""
? _this.subscriptions ? _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() { mounted() {
@ -157,28 +157,6 @@ export default {
document.title = "Subscriptions - Piped"; document.title = "Subscriptions - Piped";
}, },
methods: { 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() { async loadChannelGroups() {
const groups = await this.getChannelGroups(); const groups = await this.getChannelGroups();
this.channelGroups.push(...groups); this.channelGroups.push(...groups);
@ -254,7 +232,7 @@ export default {
this.selectedGroup = this.channelGroups[0]; this.selectedGroup = this.channelGroups[0];
}, },
checkedChange(subscription) { 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 = this.selectedGroup.channels.includes(channelId)
? this.selectedGroup.channels.filter(channel => channel != channelId) ? this.selectedGroup.channels.filter(channel => channel != channelId)
: this.selectedGroup.channels.concat(channelId); : this.selectedGroup.channels.concat(channelId);

View File

@ -236,6 +236,28 @@ const mixin = {
const localSubscriptions = this.getLocalSubscriptions() ?? []; const localSubscriptions = this.getLocalSubscriptions() ?? [];
return localSubscriptions.join(","); 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 */ /* generate a temporary file and ask the user to download it */
download(text, filename, mimeType) { download(text, filename, mimeType) {
var file = new Blob([text], { type: mimeType }); var file = new Blob([text], { type: mimeType });