chore: update Angular cache and TypeScript build info
This commit is contained in:
+28
-26
@@ -309,46 +309,48 @@ async function scrapeRumbleList({ q, page = 1, limit = 24, sort = 'viral' }) {
|
||||
if (thumb && thumb.startsWith('//')) thumb = 'https:' + thumb;
|
||||
|
||||
// Essayer plusieurs sélecteurs pour la durée, y compris les attributs data-
|
||||
let durationText = '';
|
||||
// Ajout de plus de sélecteurs spécifiques à Rumble
|
||||
// Ajout de plus de sélecteurs spécifiques à Rumble pour la durée
|
||||
const durationElement = card.find(
|
||||
'.video-item--duration, .video-duration, .duration, .video-item__duration, ' +
|
||||
'[data-duration], .videoDuration, .video-time, .time, ' +
|
||||
'.video-card__duration, .media__duration, .thumb-time, ' +
|
||||
'.video-listing-entry__duration, .video-item__duration'
|
||||
'.video-listing-entry__duration, .video-item__duration, time'
|
||||
).first();
|
||||
|
||||
|
||||
const durationCandidates = [];
|
||||
if (durationElement.length) {
|
||||
// Essayer d'abord les attributs data-
|
||||
durationText = durationElement.attr('data-duration') ||
|
||||
durationElement.attr('data-time') ||
|
||||
// Essayer aussi les attributs style ou autres qui pourraient contenir la durée
|
||||
durationElement.attr('aria-label') ||
|
||||
durationElement.attr('title') ||
|
||||
// Essayer le contenu textuel
|
||||
durationElement.text().trim();
|
||||
durationCandidates.push(
|
||||
durationElement.attr('data-duration'),
|
||||
durationElement.attr('data-time'),
|
||||
durationElement.attr('datetime'),
|
||||
durationElement.attr('aria-label'),
|
||||
durationElement.attr('title'),
|
||||
durationElement.text()?.trim()
|
||||
);
|
||||
}
|
||||
|
||||
// Si on n'a pas trouvé de durée, essayer de la trouver dans le contenu de la card
|
||||
if (!durationText) {
|
||||
// Chercher un élément qui ressemble à une durée (mm:ss ou hh:mm:ss)
|
||||
const timeMatch = card.html().match(/>\s*([0-9]+:[0-9]{2}(?::[0-9]{2})?)\s*</);
|
||||
if (timeMatch && timeMatch[1]) {
|
||||
durationText = timeMatch[1];
|
||||
|
||||
// Chercher dans le HTML de la carte un motif HH:MM(:SS)
|
||||
try {
|
||||
const htmlSnippet = card.html() || '';
|
||||
const match = />\s*([0-9]+:[0-9]{2}(?::[0-9]{2})?)\s*</.exec(htmlSnippet);
|
||||
if (match && match[1]) durationCandidates.push(match[1]);
|
||||
} catch {}
|
||||
|
||||
let durationSeconds = 0;
|
||||
for (const candidate of durationCandidates) {
|
||||
const parsed = parseDurationToSeconds(candidate);
|
||||
if (parsed > 0) {
|
||||
durationSeconds = parsed;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Nettoyer le texte de durée avant de le parser
|
||||
const cleanDurationText = durationText.replace(/[^0-9:]/g, '').trim();
|
||||
|
||||
|
||||
// Extraire les vues
|
||||
const viewsText =
|
||||
card.find('.video-item--views, .rumbles-views, .views, .video-item__views, [data-views]').first()
|
||||
.attr('data-views') ||
|
||||
card.find('.video-item--views, .rumbles-views, .views, .video-item__views, .video-views').first().text().trim();
|
||||
|
||||
// Parser la durée
|
||||
const duration = parseDurationToSeconds(cleanDurationText);
|
||||
const views = parseInt((viewsText || '').replace(/[^\d]/g, ''), 10) || 0;
|
||||
|
||||
// Important: on renvoie TOUJOURS une URL canonique cohérente
|
||||
@@ -372,7 +374,7 @@ async function scrapeRumbleList({ q, page = 1, limit = 24, sort = 'viral' }) {
|
||||
thumbnail: thumb,
|
||||
uploaderName: '',
|
||||
views,
|
||||
duration,
|
||||
duration: durationSeconds,
|
||||
uploadedDate: '',
|
||||
url,
|
||||
type: 'video'
|
||||
|
||||
Reference in New Issue
Block a user