@bebranded/bb-contents 1.1.2 → 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bb-contents.js +29 -13
- package/package.json +1 -1
package/bb-contents.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* BeBranded Contents
|
|
3
3
|
* Contenus additionnels français pour Webflow
|
|
4
|
-
* @version 1.1.
|
|
4
|
+
* @version 1.1.3
|
|
5
5
|
* @author BeBranded
|
|
6
6
|
* @license MIT
|
|
7
7
|
* @website https://www.bebranded.xyz
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
'use strict';
|
|
11
11
|
|
|
12
12
|
// Version du script
|
|
13
|
-
const BB_CONTENTS_VERSION = '1.1.
|
|
13
|
+
const BB_CONTENTS_VERSION = '1.1.3';
|
|
14
14
|
|
|
15
15
|
// Créer l'objet temporaire pour la configuration si il n'existe pas
|
|
16
16
|
if (!window._bbContentsConfig) {
|
|
@@ -2588,33 +2588,38 @@
|
|
|
2588
2588
|
if (data.error) {
|
|
2589
2589
|
throw new Error(data.error.message || 'Erreur API YouTube');
|
|
2590
2590
|
}
|
|
2591
|
-
return data.items || [];
|
|
2591
|
+
return { success: true, items: data.items || [] };
|
|
2592
2592
|
})
|
|
2593
2593
|
.catch(error => {
|
|
2594
|
-
// En cas d'erreur pour une chaîne, retourner un
|
|
2594
|
+
// En cas d'erreur pour une chaîne, retourner un objet avec success: false
|
|
2595
2595
|
// Les autres chaînes continueront à fonctionner
|
|
2596
|
-
return [];
|
|
2596
|
+
return { success: false, items: [] };
|
|
2597
2597
|
});
|
|
2598
2598
|
});
|
|
2599
2599
|
|
|
2600
|
-
return Promise.all(promises).then(
|
|
2600
|
+
return Promise.all(promises).then(allResults => {
|
|
2601
|
+
// Vérifier si toutes les chaînes ont échoué
|
|
2602
|
+
const allChannelsFailed = allResults.every(result => !result.success);
|
|
2603
|
+
|
|
2601
2604
|
// Fusionner tous les items de toutes les chaînes
|
|
2602
|
-
const mergedItems = [].concat(...
|
|
2605
|
+
const mergedItems = [].concat(...allResults.map(result => result.items));
|
|
2603
2606
|
|
|
2604
2607
|
// Trier par date (publishedAt) - du plus récent au plus ancien
|
|
2608
|
+
// Protection contre publishedAt manquant
|
|
2605
2609
|
mergedItems.sort((a, b) => {
|
|
2606
|
-
const dateA = new Date(a.snippet
|
|
2607
|
-
const dateB = new Date(b.snippet
|
|
2610
|
+
const dateA = new Date(a.snippet?.publishedAt || 0);
|
|
2611
|
+
const dateB = new Date(b.snippet?.publishedAt || 0);
|
|
2608
2612
|
return dateB - dateA;
|
|
2609
2613
|
});
|
|
2610
2614
|
|
|
2611
|
-
// Retourner dans le format attendu
|
|
2615
|
+
// Retourner dans le format attendu avec flag d'erreur
|
|
2612
2616
|
return {
|
|
2613
2617
|
items: mergedItems,
|
|
2614
2618
|
pageInfo: {
|
|
2615
2619
|
totalResults: mergedItems.length,
|
|
2616
2620
|
resultsPerPage: mergedItems.length
|
|
2617
|
-
}
|
|
2621
|
+
},
|
|
2622
|
+
allChannelsFailed: allChannelsFailed
|
|
2618
2623
|
};
|
|
2619
2624
|
});
|
|
2620
2625
|
},
|
|
@@ -2639,7 +2644,12 @@
|
|
|
2639
2644
|
|
|
2640
2645
|
generateYouTubeFeed: function(container, template, data, allowShorts, language = 'fr') {
|
|
2641
2646
|
if (!data || !data.items || data.items.length === 0) {
|
|
2642
|
-
|
|
2647
|
+
// Distinguer "aucune vidéo" de "toutes les chaînes ont échoué"
|
|
2648
|
+
if (data && data.allChannelsFailed) {
|
|
2649
|
+
container.innerHTML = '<div style="padding: 20px; background: #fef2f2; border: 1px solid #fecaca; border-radius: 8px; color: #dc2626; text-align: center;"><strong>Erreur de chargement</strong><br>Impossible de récupérer les vidéos des chaînes YouTube</div>';
|
|
2650
|
+
} else {
|
|
2651
|
+
container.innerHTML = '<div style="padding: 20px; text-align: center; color: #6b7280;">Aucune vidéo trouvée</div>';
|
|
2652
|
+
}
|
|
2643
2653
|
return;
|
|
2644
2654
|
}
|
|
2645
2655
|
|
|
@@ -2658,7 +2668,13 @@
|
|
|
2658
2668
|
|
|
2659
2669
|
// Cloner le template pour chaque vidéo
|
|
2660
2670
|
videos.forEach(item => {
|
|
2661
|
-
|
|
2671
|
+
// Validation de videoId avant utilisation
|
|
2672
|
+
const videoId = item.id?.videoId;
|
|
2673
|
+
if (!videoId) {
|
|
2674
|
+
// Ignorer les vidéos sans ID valide
|
|
2675
|
+
return;
|
|
2676
|
+
}
|
|
2677
|
+
|
|
2662
2678
|
const snippet = item.snippet;
|
|
2663
2679
|
|
|
2664
2680
|
// Cloner le template
|