Files
xtremflow/test/core/channel_logo_test.dart
T
MichaelandClaude Opus 5 9843999809 Logos des chaînes : repli par nom quand l'hébergeur de picons tombe
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>
2026-09-19 13:39:01 +02:00

33 lines
1.1 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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');
}
});
});
}