header bugfix
This commit is contained in:
@@ -229,10 +229,7 @@ App.feed = App.feed || {};
|
||||
|
||||
const resolved = App.videos.resolveStreamSource(videoData);
|
||||
if (!resolved.url) return;
|
||||
const refererParam = resolved.referer ? `&referer=${encodeURIComponent(resolved.referer)}` : '';
|
||||
const userAgentParam = resolved.userAgent ? `&User-Agent=${encodeURIComponent(resolved.userAgent)}` : '';
|
||||
const liveParam = resolved.isLive ? '&live=1' : '';
|
||||
const streamUrl = `/api/stream?url=${encodeURIComponent(resolved.url)}${refererParam}${userAgentParam}${liveParam}`;
|
||||
const streamUrl = App.videos.buildStreamUrlFromSource(resolved);
|
||||
const isHls = resolved.isLive ? true : /\.m3u8($|\?)/i.test(resolved.url);
|
||||
|
||||
video.muted = state.feedMuted;
|
||||
|
||||
@@ -157,10 +157,7 @@ App.player = App.player || {};
|
||||
if (entry.direct) {
|
||||
streamUrl = resolved.url;
|
||||
} else {
|
||||
const refererParam = resolved.referer ? `&referer=${encodeURIComponent(resolved.referer)}` : '';
|
||||
const userAgentParam = resolved.userAgent ? `&User-Agent=${encodeURIComponent(resolved.userAgent)}` : '';
|
||||
const liveParam = resolved.isLive ? '&live=1' : '';
|
||||
streamUrl = `/api/stream?url=${encodeURIComponent(resolved.url)}${refererParam}${userAgentParam}${liveParam}`;
|
||||
streamUrl = App.videos.buildStreamUrlFromSource(resolved);
|
||||
}
|
||||
let isHls = /\.m3u8($|\?)/i.test(resolved.url);
|
||||
let isDirectMedia = /\.(mp4|m4v|m4s|webm|ts|mov)($|\?)/i.test(resolved.url);
|
||||
|
||||
@@ -860,6 +860,23 @@ App.videos = App.videos || {};
|
||||
return headers[name] || headers[name.toLowerCase()] || '';
|
||||
};
|
||||
|
||||
// Merge the resource-level (meta) and format-level http_headers into a single
|
||||
// map so every upstream header the extractor attached (Referer, User-Agent,
|
||||
// Cookie, etc.) can be relayed to the stream proxy. Format-level headers win
|
||||
// on conflict since they describe the specific media URL.
|
||||
const mergeHeaders = function(metaHeaders, fmtHeaders) {
|
||||
const merged = {};
|
||||
[metaHeaders, fmtHeaders].forEach((headers) => {
|
||||
if (!headers || typeof headers !== 'object') return;
|
||||
Object.keys(headers).forEach((name) => {
|
||||
const value = headers[name];
|
||||
if (value === undefined || value === null || value === '') return;
|
||||
merged[name] = String(value);
|
||||
});
|
||||
});
|
||||
return merged;
|
||||
};
|
||||
|
||||
const deriveReferer = function(url) {
|
||||
if (!url) return '';
|
||||
try {
|
||||
@@ -958,7 +975,8 @@ App.videos = App.videos || {};
|
||||
const explicitReferer = headerValue(fmt.http_headers, 'Referer') || metaReferer;
|
||||
const referer = explicitReferer || deriveReferer(fmt.url);
|
||||
const userAgent = headerValue(fmt.http_headers, 'User-Agent') || metaUserAgent;
|
||||
return { url: fmt.url, referer, userAgent, isLive, refererRequired: !!explicitReferer };
|
||||
const headers = mergeHeaders(meta.http_headers, fmt.http_headers);
|
||||
return { url: fmt.url, referer, userAgent, headers, isLive, refererRequired: !!explicitReferer };
|
||||
});
|
||||
|
||||
if (!sources.length) {
|
||||
@@ -968,6 +986,7 @@ App.videos = App.videos || {};
|
||||
url: fallbackUrl,
|
||||
referer: metaReferer || deriveReferer(fallbackUrl),
|
||||
userAgent: metaUserAgent,
|
||||
headers: mergeHeaders(meta.http_headers, null),
|
||||
isLive,
|
||||
refererRequired: !!metaReferer
|
||||
});
|
||||
@@ -1131,10 +1150,28 @@ App.videos = App.videos || {};
|
||||
// by the backend as request headers, so use real header names here.
|
||||
App.videos.buildStreamUrlFromSource = function(resolved) {
|
||||
if (!resolved || !resolved.url) return '';
|
||||
const refererParam = resolved.referer ? `&referer=${encodeURIComponent(resolved.referer)}` : '';
|
||||
const userAgentParam = resolved.userAgent ? `&User-Agent=${encodeURIComponent(resolved.userAgent)}` : '';
|
||||
const liveParam = resolved.isLive ? '&live=1' : '';
|
||||
return `/api/stream?url=${encodeURIComponent(resolved.url)}${refererParam}${userAgentParam}${liveParam}`;
|
||||
const params = [];
|
||||
// Referer keeps its dedicated lowercase param (the backend maps it back to
|
||||
// `Referer`) so the derived-referer fallback in resolveStreamSources is
|
||||
// honoured even when no explicit Referer header was present.
|
||||
if (resolved.referer) params.push(`referer=${encodeURIComponent(resolved.referer)}`);
|
||||
if (resolved.userAgent) params.push(`User-Agent=${encodeURIComponent(resolved.userAgent)}`);
|
||||
// Relay every other upstream header the extractor attached (e.g. Cookie).
|
||||
// Referer/User-Agent are already emitted above, so skip them here to avoid
|
||||
// duplicating the same header under two query keys.
|
||||
const headers = resolved.headers;
|
||||
if (headers && typeof headers === 'object') {
|
||||
Object.keys(headers).forEach((name) => {
|
||||
const lower = name.toLowerCase();
|
||||
if (lower === 'referer' || lower === 'user-agent') return;
|
||||
const value = headers[name];
|
||||
if (value === undefined || value === null || value === '') return;
|
||||
params.push(`${encodeURIComponent(name)}=${encodeURIComponent(value)}`);
|
||||
});
|
||||
}
|
||||
if (resolved.isLive) params.push('live=1');
|
||||
const query = params.length ? `&${params.join('&')}` : '';
|
||||
return `/api/stream?url=${encodeURIComponent(resolved.url)}${query}`;
|
||||
};
|
||||
|
||||
App.videos.buildStreamUrl = function(videoOrUrl, options) {
|
||||
|
||||
Reference in New Issue
Block a user