mirror of
https://github.com/PR0M3TH3AN/bitvid.git
synced 2026-11-05 12:22:28 +00:00
Hide videos with dead CDN and torrent peers
This commit is contained in:
1 parent
f6fa9daaad
commit
866e4f11fb
5 files changed
+70
-2
No files matched your search
@@ -74,6 +74,10 @@ header img {
|
||||
box-shadow: var(--shadow-md);
|
||||
}
|
||||
|
||||
.video-card[data-owner-is-viewer="false"][data-url-health-state="offline"][data-stream-health-state="unhealthy"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.video-card--enter {
|
||||
opacity: 0;
|
||||
animation: video-card-fade-in 220ms ease-out forwards;
|
||||
|
||||
@@ -3243,6 +3243,10 @@ class bitvidApp {
|
||||
const hadMargin = badgeEl.classList.contains("mt-3");
|
||||
|
||||
badgeEl.dataset.urlHealthState = status;
|
||||
const cardEl = badgeEl.closest(".video-card");
|
||||
if (cardEl) {
|
||||
cardEl.dataset.urlHealthState = status;
|
||||
}
|
||||
badgeEl.setAttribute("aria-live", "polite");
|
||||
badgeEl.setAttribute("role", status === "offline" ? "alert" : "status");
|
||||
badgeEl.textContent = message;
|
||||
@@ -3677,6 +3681,22 @@ class bitvidApp {
|
||||
template.innerHTML = cardHtml.trim();
|
||||
const cardEl = template.content.firstElementChild;
|
||||
if (cardEl) {
|
||||
cardEl.dataset.ownerIsViewer = canEdit ? "true" : "false";
|
||||
if (typeof video.pubkey === "string" && video.pubkey) {
|
||||
cardEl.dataset.ownerPubkey = video.pubkey;
|
||||
} else if (cardEl.dataset.ownerPubkey) {
|
||||
delete cardEl.dataset.ownerPubkey;
|
||||
}
|
||||
|
||||
cardEl.dataset.urlHealthState = trimmedUrl ? "checking" : "absent";
|
||||
if (magnetProvided && magnetSupported) {
|
||||
cardEl.dataset.streamHealthState = "checking";
|
||||
} else if (magnetProvided) {
|
||||
cardEl.dataset.streamHealthState = "unsupported";
|
||||
} else {
|
||||
cardEl.dataset.streamHealthState = "absent";
|
||||
}
|
||||
|
||||
const thumbnailEl = cardEl.querySelector("[data-video-thumbnail]");
|
||||
if (thumbnailEl) {
|
||||
const markThumbnailAsLoaded = () => {
|
||||
|
||||
@@ -360,6 +360,13 @@ async function loadUserVideos(pubkey) {
|
||||
"duration-300"
|
||||
);
|
||||
|
||||
cardEl.dataset.ownerIsViewer = canEdit ? "true" : "false";
|
||||
if (typeof video.pubkey === "string" && video.pubkey) {
|
||||
cardEl.dataset.ownerPubkey = video.pubkey;
|
||||
} else if (cardEl.dataset.ownerPubkey) {
|
||||
delete cardEl.dataset.ownerPubkey;
|
||||
}
|
||||
|
||||
const rawMagnet =
|
||||
typeof video.magnet === "string" ? video.magnet : "";
|
||||
const trimmedMagnet = rawMagnet ? rawMagnet.trim() : "";
|
||||
@@ -433,6 +440,15 @@ async function loadUserVideos(pubkey) {
|
||||
delete cardEl.dataset.torrentSupported;
|
||||
}
|
||||
|
||||
cardEl.dataset.urlHealthState = trimmedUrl ? "checking" : "absent";
|
||||
if (magnetProvided && magnetSupported) {
|
||||
cardEl.dataset.streamHealthState = "checking";
|
||||
} else if (magnetProvided) {
|
||||
cardEl.dataset.streamHealthState = "unsupported";
|
||||
} else {
|
||||
cardEl.dataset.streamHealthState = "absent";
|
||||
}
|
||||
|
||||
if (magnetProvided) {
|
||||
cardEl.dataset.magnet = playbackMagnet;
|
||||
} else if (cardEl.dataset.magnet) {
|
||||
|
||||
+14
-2
@@ -433,11 +433,23 @@ function setBadge(card, state, details) {
|
||||
badge.setAttribute("aria-live", entry.role === "alert" ? "assertive" : "polite");
|
||||
badge.setAttribute("role", entry.role);
|
||||
badge.dataset.streamHealthState = state;
|
||||
if (Number.isFinite(peers)) {
|
||||
badge.dataset.streamHealthPeers = String(peers);
|
||||
const hasPeerCount = Number.isFinite(peers);
|
||||
const peersTextValue = hasPeerCount ? String(peers) : "";
|
||||
if (hasPeerCount) {
|
||||
badge.dataset.streamHealthPeers = peersTextValue;
|
||||
} else if (badge.dataset.streamHealthPeers) {
|
||||
delete badge.dataset.streamHealthPeers;
|
||||
}
|
||||
|
||||
const card = badge.closest(".video-card");
|
||||
if (card) {
|
||||
card.dataset.streamHealthState = state;
|
||||
if (hasPeerCount) {
|
||||
card.dataset.streamHealthPeers = peersTextValue;
|
||||
} else if (card.dataset.streamHealthPeers) {
|
||||
delete card.dataset.streamHealthPeers;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function handleCardVisible({ card, pendingByCard, priority = 0 }) {
|
||||
|
||||
@@ -467,6 +467,22 @@ class SubscriptionsManager {
|
||||
t.innerHTML = cardHtml.trim();
|
||||
const cardEl = t.content.firstElementChild;
|
||||
if (cardEl) {
|
||||
cardEl.dataset.ownerIsViewer = canEdit ? "true" : "false";
|
||||
if (typeof video.pubkey === "string" && video.pubkey) {
|
||||
cardEl.dataset.ownerPubkey = video.pubkey;
|
||||
} else if (cardEl.dataset.ownerPubkey) {
|
||||
delete cardEl.dataset.ownerPubkey;
|
||||
}
|
||||
|
||||
cardEl.dataset.urlHealthState = trimmedUrl ? "checking" : "absent";
|
||||
if (magnetProvided && magnetSupported) {
|
||||
cardEl.dataset.streamHealthState = "checking";
|
||||
} else if (magnetProvided) {
|
||||
cardEl.dataset.streamHealthState = "unsupported";
|
||||
} else {
|
||||
cardEl.dataset.streamHealthState = "absent";
|
||||
}
|
||||
|
||||
// Leave the data-play-* attributes empty in the literal markup so we can
|
||||
// assign the raw URL/magnet strings post-parsing without HTML entity
|
||||
// escaping, mirroring the approach in app.js. The URL is encoded so that
|
||||
|
||||
Reference in new issue
Block a user