freeflix-cli 2.3.0__tar.gz → 2.3.1__tar.gz
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.
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/CHANGELOG.md +10 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/PKG-INFO +5 -3
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/README.md +4 -2
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/pyproject.toml +1 -1
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/handlers/match.py +7 -2
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/install_health.py +1 -1
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/scraping/yacine_match.py +4 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_yacine_match.py +26 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/uv.lock +1 -1
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/.github/workflows/binaries.yml +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/.github/workflows/ci.yml +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/.github/workflows/macos.yml +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/.github/workflows/release.yml +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/.gitignore +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/CONTRIBUTING.md +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/LICENSE +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/SECURITY.md +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/assets/logo.png +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/config/freeflix_position.lua +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/config/input.conf +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/config/mpv.conf +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/data/selectors.jsonc +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/data/source_portal.jsonc +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/docs/ARCHITECTURE.md +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/docs/AUDIT-FREEFLIX-2.0-2026-11-04.md +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/docs/CORRECTIONS-2.1.0.md +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/docs/README.md +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/docs/RELEASE.md +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/docs/SCORECARD-2.1.0.md +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/docs/TROUBLESHOOTING.md +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/docs/USAGE.md +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/scripts/build-binary.sh +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/scripts/install-mac.sh +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/scripts/install.ps1 +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/scripts/install.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/scripts/install.sh +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/scripts/wrappers/mpv +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/__init__.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/__main__.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/anilist.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/cli.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/cli_utils.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/cloudflare.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/config_loader.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/defaults.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/doctor.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/handlers/__init__.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/handlers/anilist.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/handlers/anime_sama.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/handlers/coflix.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/handlers/french_manga.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/handlers/french_stream.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/handlers/goldenanime.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/handlers/goldenms.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/handlers/hianime.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/handlers/nyaa.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/handlers/papystreaming.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/handlers/playback.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/handlers/yts.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/health.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/history_ui.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/httpcache.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/i18n.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/icons.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/languages.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/logsetup.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/main.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/motion.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/mpv_ipc.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/neon.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/net_config.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/notifications.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/platform_android.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/player_manager.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/preview_picker.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/progress.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/providers_registry.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/proxy.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/recent.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/scraping/__init__.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/scraping/anime_sama.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/scraping/anime_sama_planning.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/scraping/coflix.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/scraping/config.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/scraping/deobfuscate.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/scraping/eztv.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/scraping/french_manga.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/scraping/french_stream.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/scraping/goldenanime.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/scraping/goldenms.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/scraping/nyaa.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/scraping/objects.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/scraping/papystreaming.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/scraping/player.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/scraping/resilient.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/scraping/subtitles.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/scraping/utils.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/scraping/yts.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/setup_assistant.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/splash.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/subtitles.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/terminal_image.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/themes.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/tracker.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/ui.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/update_checker.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/src/freeflix_cli/yacine_live_proxy.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/conftest.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_android_setup.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_anilist_errors.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_anilist_token_input.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_anime_sama_planning.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_audit_fixes.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_batch_download.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_coflix_parse.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_core_units.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_cover_cache.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_decoy_stream.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_download_fixes.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_download_integration.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_download_robustness.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_episode_parsing.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_fsvid_decode.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_health.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_httpcache.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_i18n_complete.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_keyboard.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_managed_binaries.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_mouse.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_mpv_ipc.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_navigation.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_nerd_font.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_nyaa.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_pack_a_polish.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_performance.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_platform_android.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_player_dash.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_polish.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_premium_players.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_providers_repair.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_proxy_endpoint.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_proxy_integration.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_proxy_resilient.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_proxy_ssrf.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_recent_new_episodes.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_release_config.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_resilient.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_scraper_resilience.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_search_parity.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_sendvid.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_stream_analysis.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_stream_integrity.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_system_deps_cache.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_terminal_image.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_update_prompt.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_v1105_improvements.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tests/test_v2_aesthetic.py +0 -0
- {freeflix_cli-2.3.0 → freeflix_cli-2.3.1}/tools/audit_providers.py +0 -0
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.3.1
|
|
4
|
+
|
|
5
|
+
- **Qualités Match prêtes pour le futur** : 4K/2160p (≥ 15,0 Mbps,
|
|
6
|
+
~6,75 Go/h) et 1440p (≥ 8,0 Mbps, ~3,60 Go/h) ; une qualité inconnue
|
|
7
|
+
garde une estimation prudente au lieu de casser l'affichage.
|
|
8
|
+
- Tests supplémentaires avec des équipes/compétitions arbitraires
|
|
9
|
+
(Al Ahly / Zamalek) et des chaînes hors beIN : la traduction et
|
|
10
|
+
l'affichage restent dynamiques.
|
|
11
|
+
- 607 tests au vert, ruff OK.
|
|
12
|
+
|
|
3
13
|
## 2.3.0
|
|
4
14
|
|
|
5
15
|
- **Match** : la chaîne est affichée entre parenthèses **devant** le match,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: freeflix-cli
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.1
|
|
4
4
|
Summary: Watch movies, series, and anime from your terminal — multi-language, multi-source, no browser required. A maintained fork of autoflix-cli.
|
|
5
5
|
Project-URL: Homepage, https://github.com/freedy237/freeflix-cli
|
|
6
6
|
Project-URL: Repository, https://github.com/freedy237/freeflix-cli.git
|
|
@@ -121,7 +121,7 @@ Description-Content-Type: text/markdown
|
|
|
121
121
|
| 🆕 | **Nouveautés** : new episodes of the shows you follow, cleared once watched |
|
|
122
122
|
| 🖱 | **Full mouse control** : hover, click, wheel, right-click back, clickable pagination |
|
|
123
123
|
| 🎨 | **Cinema Noir** (2.0) design system, 12 themes, reduced-motion support |
|
|
124
|
-
| ⚽ | **Match** : live football from YacineTV, Cameroon time, HD/SD/Low + Auto, mpv/VLC |
|
|
124
|
+
| ⚽ | **Match** : live football from YacineTV, Cameroon time, B1–B4 channel badges, HD/SD/Low/4K + Auto, minimum bitrate + GB/h estimate, mpv/VLC |
|
|
125
125
|
| 🎬 | **Browse Films, Séries & Anime** : the provider list, grouped as before |
|
|
126
126
|
| 🎮 | **4 player backends** : mpv, VLC, browser, download-only |
|
|
127
127
|
| 🇫🇷 | **French UI** : the whole CLI is in French when language is set to FR |
|
|
@@ -247,7 +247,9 @@ That's it. The menu walks you through everything.
|
|
|
247
247
|
|
|
248
248
|
- **Films, Séries & Anime** opens the provider list (unchanged grouping).
|
|
249
249
|
- **Match** shows live/upcoming football with kick-off in Cameroon time
|
|
250
|
-
(UTC+1)
|
|
250
|
+
(UTC+1), the channel badge (B1–B4), and quality rows with resolution,
|
|
251
|
+
minimum bitrate and estimated GB/hour; pick **Auto** or a quality, then
|
|
252
|
+
mpv or VLC.
|
|
251
253
|
- Player settings are isolated: FreeFlix never edits your global mpv/VLC
|
|
252
254
|
configuration.
|
|
253
255
|
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
| 🆕 | **Nouveautés** : new episodes of the shows you follow, cleared once watched |
|
|
90
90
|
| 🖱 | **Full mouse control** : hover, click, wheel, right-click back, clickable pagination |
|
|
91
91
|
| 🎨 | **Cinema Noir** (2.0) design system, 12 themes, reduced-motion support |
|
|
92
|
-
| ⚽ | **Match** : live football from YacineTV, Cameroon time, HD/SD/Low + Auto, mpv/VLC |
|
|
92
|
+
| ⚽ | **Match** : live football from YacineTV, Cameroon time, B1–B4 channel badges, HD/SD/Low/4K + Auto, minimum bitrate + GB/h estimate, mpv/VLC |
|
|
93
93
|
| 🎬 | **Browse Films, Séries & Anime** : the provider list, grouped as before |
|
|
94
94
|
| 🎮 | **4 player backends** : mpv, VLC, browser, download-only |
|
|
95
95
|
| 🇫🇷 | **French UI** : the whole CLI is in French when language is set to FR |
|
|
@@ -215,7 +215,9 @@ That's it. The menu walks you through everything.
|
|
|
215
215
|
|
|
216
216
|
- **Films, Séries & Anime** opens the provider list (unchanged grouping).
|
|
217
217
|
- **Match** shows live/upcoming football with kick-off in Cameroon time
|
|
218
|
-
(UTC+1)
|
|
218
|
+
(UTC+1), the channel badge (B1–B4), and quality rows with resolution,
|
|
219
|
+
minimum bitrate and estimated GB/hour; pick **Auto** or a quality, then
|
|
220
|
+
mpv or VLC.
|
|
219
221
|
- Player settings are isolated: FreeFlix never edits your global mpv/VLC
|
|
220
222
|
configuration.
|
|
221
223
|
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "freeflix-cli"
|
|
7
|
-
version = "2.3.
|
|
7
|
+
version = "2.3.1"
|
|
8
8
|
description = "Watch movies, series, and anime from your terminal — multi-language, multi-source, no browser required. A maintained fork of autoflix-cli."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.9.2"
|
|
@@ -61,7 +61,8 @@ def _sort_events(events: list[ym.MatchEvent], now_ts: int) -> list[ym.MatchEvent
|
|
|
61
61
|
|
|
62
62
|
|
|
63
63
|
# Conservative live HLS minimums (Mbps) used for the GB/hour estimate.
|
|
64
|
-
_MIN_MBPS = {
|
|
64
|
+
_MIN_MBPS = {2160: 15.0, 1440: 8.0, 1080: 5.0, 720: 2.5,
|
|
65
|
+
480: 1.0, 360: 0.7}
|
|
65
66
|
|
|
66
67
|
|
|
67
68
|
def _quality_metrics(stream: dict) -> tuple[int | None, float, float]:
|
|
@@ -71,7 +72,11 @@ def _quality_metrics(stream: dict) -> tuple[int | None, float, float]:
|
|
|
71
72
|
m = re.search(r"(\d{3,4})p", low)
|
|
72
73
|
if m:
|
|
73
74
|
height = int(m.group(1))
|
|
74
|
-
elif "
|
|
75
|
+
elif any(k in low for k in ("4k", "uhd", "2160")):
|
|
76
|
+
height = 2160
|
|
77
|
+
elif any(k in low for k in ("1440", "2k")):
|
|
78
|
+
height = 1440
|
|
79
|
+
elif "hd" in low or "fhd" in low:
|
|
75
80
|
height = 1080
|
|
76
81
|
elif "sd" in low:
|
|
77
82
|
height = 720
|
|
@@ -220,6 +220,10 @@ def fetch_events(timeout: int = 10) -> tuple[list[MatchEvent], bool]:
|
|
|
220
220
|
|
|
221
221
|
def _quality_rank(name: str) -> int:
|
|
222
222
|
n = (name or "").lower()
|
|
223
|
+
if any(k in n for k in ("4k", "2160", "uhd")):
|
|
224
|
+
return 4
|
|
225
|
+
if any(k in n for k in ("1440", "2k")):
|
|
226
|
+
return 3
|
|
223
227
|
if any(k in n for k in ("hd", "fhd", "1080", "full")):
|
|
224
228
|
return 3
|
|
225
229
|
if any(k in n for k in ("sd", "720", "medium")):
|
|
@@ -295,3 +295,29 @@ def test_match_channel_and_quality_estimates():
|
|
|
295
295
|
assert "5.0" in hd and "2.25" in hd
|
|
296
296
|
low = mh._quality_label({"name": "Low"})
|
|
297
297
|
assert "1.0" in low and "0.45" in low
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def test_channel_aliases_and_other_channels():
|
|
301
|
+
from freeflix_cli.handlers import match as mh
|
|
302
|
+
assert mh._channel_label("beIN SPORTS 1") == "B1"
|
|
303
|
+
assert mh._channel_label("beIN SPORTS 4") == "B4"
|
|
304
|
+
assert mh._channel_label("beIN SPORTS 5") == "beIN SPORTS 5"
|
|
305
|
+
assert mh._channel_label("Canal+ Sport") == "Canal+ Sport"
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
def test_future_4k_quality_estimate():
|
|
309
|
+
from freeflix_cli.handlers import match as mh
|
|
310
|
+
label = mh._quality_label({"name": "4K"})
|
|
311
|
+
assert "2160p" in label and "15.0" in label and "6.75" in label
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
def test_other_teams_are_dynamic(monkeypatch, tmp_path):
|
|
315
|
+
monkeypatch.setattr(ym, "_cache_dir", lambda: tmp_path)
|
|
316
|
+
monkeypatch.setattr(ym, "_translate_one",
|
|
317
|
+
lambda text, lang, timeout=5:
|
|
318
|
+
{"الأهلي": "Al Ahly", "الزمالك": "Zamalek"}.get(text, text))
|
|
319
|
+
ev = ym.MatchEvent("x", "الدوري المصري", "Canal+ Sport", 1, 2,
|
|
320
|
+
"الأهلي", "الزمالك")
|
|
321
|
+
out = ym.localize_events([ev], "fr")[0]
|
|
322
|
+
assert out.home == "Al Ahly" and out.away == "Zamalek"
|
|
323
|
+
assert out.championship == "الدوري المصري"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|