Dispatcharr/apps/m3u
SergeantPanda bfec229ca9 Enhancements:
- Rewrote the M3U line parser as an `iter_m3u_entries` generator that owns the full per-entry state machine. Intermediate directive lines between `#EXTINF` and the stream URL are now handled correctly rather than corrupting the pending entry or being silently misassigned. A `#EXTINF` with no following URL is discarded with a warning instead of carrying over a `url`-less entry into batch processing. Attribute keys are normalised to lowercase during parsing (provider attribute names remain case-insensitive end-to-end). The `#EXTINF` attribute regex is pre-compiled at module load, and attribute lookups use O(1) `dict.get()` instead of linear scans — approximately 10% faster parsing on large M3U files.
- Added support for the `#EXTGRP` directive in M3U files. When a `group-title` attribute is absent from the `#EXTINF` line, the value from a following `#EXTGRP:` line is used as the group. An explicit `group-title` attribute always takes priority. (Closes #1088)
- Added accumulation of `#EXTVLCOPT` directives per entry. Options are stored as a list under `vlc_opts` inside the stream's `custom_properties`, available for downstream use (e.g. passing VLC-specific options to the player). This is for a planned future enhancement and can also be utlized with the API.
2026-04-11 14:57:52 -05:00
..
migrations Enhancement: Account expiration tracking and notifications for M3U profiles 2026-03-14 18:38:59 -05:00
tests tests: Add backend test for expiration feature. 2026-03-15 16:42:11 -05:00
__init__.py Initial commit 2025-02-18 11:14:09 -06:00
admin.py Add custom properties to M3UAccountProfile and implement account info retrieval 2025-09-09 16:05:58 -05:00
api_urls.py Ability to refresh account info from account info modal and provide notification on results. 2025-09-09 18:15:33 -05:00
api_views.py security: Fixed path traversal vulnerability in file uploads. The M3U account upload (apps/m3u/api_views.py), logo upload (apps/channels/api_views.py), and backup upload (apps/backups/api_views.py) all used the uploaded filename directly without sanitization. os.path.join() discards all preceding components when it encounters an absolute path segment, and pathlib's / operator behaves identically; a relative ../ sequence also escapes via OS path resolution at open() time. All three upload paths now strip directory components via Path(name).name and validate the resolved path remains within the intended upload directory. Exploiting any of these required admin credentials. 2026-04-09 21:32:36 -05:00
apps.py Initial commit 2025-02-18 11:14:09 -06:00
forms.py Convert custom_properties to jsonb in the backend. 2025-09-02 09:41:51 -05:00
models.py Enhancement: Account expiration tracking and notifications for M3U profiles 2026-03-14 18:38:59 -05:00
serializers.py Update expiration date handling in M3U components to ensure UTC format 2026-03-15 16:00:23 -05:00
signals.py Enhancement: Account expiration tracking and notifications for M3U profiles 2026-03-14 18:38:59 -05:00
tasks.py Enhancements: 2026-04-11 14:57:52 -05:00
urls.py Initial commit 2025-02-18 11:14:09 -06:00
utils.py Enhancement: Adds support for UDP streams. Closes #617 2025-11-11 18:30:59 -06:00
views.py Add ability to scan for vods during m3u refresh. 2025-08-02 12:01:26 -05:00