mirror of
https://github.com/R0m1k3/xtremflow.git
synced 2026-10-11 17:30:00 +02:00
L'hébergeur des picons du fournisseur (51.158.145.100) répond toujours 503 sur toutes ses URL. Couper le flot de requêtes ne suffisait pas : la grille restait sans logo. Pire, le pixel transparent servi en 200 était pris pour une image valide par Flutter, qui n'affichait plus son icône de repli — d'où des tuiles entièrement vides. - Nouvelle route `/api/logo?src=…&name=…` : URL du panneau d'abord (via le proxy, mêmes protections anti-SSRF et même mémoire des hôtes morts), puis recherche par nom dans le dépôt public tv-logo/tv-logos - Appariement par nom : préfixe pays et suffixes de qualité ignorés, `+` → `plus`, variante plus longue (`bein-sports-1-french`), puis marque sans numéro pour les canaux événementiels. Aucune approximation sur un mot seul - Liste de logos en cache 24 h (API GitHub : 60 requêtes/h non authentifiées), 15 min de recul après échec, images en mémoire - Image indisponible : 410 mis en cache au lieu du pixel. 410 et non 404 : la Cascade du serveur rattrape les 404 et renvoyait celui du handler statique, sans cache-control - Client (grille bureau, mobile, enregistrements) : logo toujours demandé au backend, nom compris, même sans stream_icon. L'onglet Enregistrements chargeait l'URL http brute, bloquée en HTTPS Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
33 lines
1.1 KiB
Dart
33 lines
1.1 KiB
Dart
import 'package:flutter_test/flutter_test.dart';
|
||
import 'package:xtremflow/core/api/channel_logo.dart';
|
||
|
||
void main() {
|
||
group('channelLogoUrl', () {
|
||
test('transmet l’URL panneau et le nom, encodés', () {
|
||
final url = Uri.parse(
|
||
channelLogoUrl(
|
||
streamIcon: 'http://picons.example/logos/1.png?x=1&y=2',
|
||
name: 'FR - CANAL+ SPORT',
|
||
),
|
||
);
|
||
|
||
expect(url.path, '/api/logo');
|
||
expect(
|
||
url.queryParameters['src'],
|
||
'http://picons.example/logos/1.png?x=1&y=2',
|
||
);
|
||
// Le « + » doit survivre à l'encodage : sinon Canal+ devient « Canal ».
|
||
expect(url.queryParameters['name'], 'FR - CANAL+ SPORT');
|
||
});
|
||
|
||
test('envoie le nom seul sans stream_icon exploitable', () {
|
||
// Sans URL panneau, le nom reste le seul moyen de trouver un logo.
|
||
for (final icon in ['', ' ', 'logo.png']) {
|
||
final url = Uri.parse(channelLogoUrl(streamIcon: icon, name: 'TF1'));
|
||
expect(url.queryParameters.containsKey('src'), isFalse);
|
||
expect(url.queryParameters['name'], 'TF1');
|
||
}
|
||
});
|
||
});
|
||
}
|