CI / build-and-test (push) Successful in 14m10s
Barre de recherche - Panneau de filtres unifié (remplace le ProviderPicker) : sources, type (vidéos/shorts/direct/chaînes), période (heure/jour/semaine/mois/année), durée (<4 / 4-20 / >20 min) et tri. Pastilles + roving tabindex (←/→ dans un groupe, ↑/↓ entre groupes), focus trap, Échap, Ctrl/⌘+Maj+F, recherches récentes, « mémoriser par défaut », « Réinitialiser ». - Pastilles des filtres actifs sous la barre (retrait en un clic) + compteur. - Typeahead : un seul keydown (fin du double Enter), ↑/↓ bouclants, Home/End, PageUp/PageDown, Entrée valide la ligne surlignée (sinon recherche brute), Tab complète sans chercher, Échap ferme puis vide, ligne « Rechercher <q> », défilement de l'option active, aria à jour. - Focus : le panneau se referme dès que le focus quitte la barre (focusout + relatedTarget + activeElement), pointerdown neutralisé sur les lignes pour garder le focus dans l'input (plus de scintillement). - Opérateurs en clair : `linux live:`, `tuto today: long:` deviennent des filtres et sont retirés de la requête (autocomplétion après le `:`). Filtres côté serveur - Modèle partagé : src/app/search/filters.ts + server/search-filters.mjs. - /api/search?type=&duration=&period=&sort= : InnerTube (upload_date, type, duration, features), Data API v3 (type, videoDuration, publishedAfter), yt-dlp --dateafter ; post-filtrage pour les providers sans filtre natif. Un champ manquant ne fait jamais disparaître un résultat. - Filtres dans l'URL (partageables) + adapters + SearchService (clé de cache). - Correction : la recherche Shorts renvoyait 0 (ShortsLockupView/GridShelfView non mappés, id/titre dans l'endpoint) -> mappage + shelf + vignette/vues. Tests / docs - 23 tests unitaires (clavier, focus, opérateurs, panneau de filtres), server/tests/search-filters.test.mjs (npm run test:filters) + CI, scénarios e2e des filtres, README/api/README/todo/MCP à jour.
60 lines
1.3 KiB
YAML
60 lines
1.3 KiB
YAML
name: CI
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
pull_request:
|
|
|
|
jobs:
|
|
build-and-test:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: 22
|
|
cache: npm
|
|
|
|
- name: Install dependencies
|
|
run: npm ci
|
|
|
|
- name: Typecheck (front + shared tsconfig)
|
|
run: npx tsc --noEmit
|
|
|
|
- name: Build Angular app
|
|
run: npm run build
|
|
|
|
- name: Server tests (playlists visibility)
|
|
run: npm run test:playlists
|
|
|
|
- name: Server tests (download jobs)
|
|
run: npm run test:downloads
|
|
|
|
- name: Server tests (preferences)
|
|
run: npm run test:preferences
|
|
|
|
- name: Server tests (telemetry)
|
|
run: npm run test:telemetry
|
|
|
|
- name: Unit tests (search UX)
|
|
run: npm run test:search
|
|
|
|
- name: Search filters (offline)
|
|
run: npm run test:filters
|
|
|
|
- name: E2E scenarios (search UX)
|
|
run: npm run test:search-e2e
|
|
|
|
- name: Suggest typeahead (Step 15)
|
|
run: npm run test:suggest
|
|
|
|
- name: Transcripts (Step 16)
|
|
run: npm run test:transcript
|
|
|
|
- name: YouTube scrape-first (Step 17, offline)
|
|
run: npm run test:ytscrape
|
|
|
|
- name: YouTube InnerTube (Step 18, offline)
|
|
run: npm run test:ytinnertube
|