Inspect remote media files via HTTP Range requests — download only what's needed.
Project description
url-media-probe
Просматривайте удаленные медиафайлы с помощью HTTP-запросов - загружайте только то, что необходимо
Минималистичный пакет для определения параметров медиафайла по URL, локальному пути или байтам без полной загрузки. Анализирует сигнатуры и заголовки в первых и последних килобайтах файла. Скачивает минимум данных, докачивает только если не хватило. После принятия решения о скачивании целиком использует уже скачанные данные и докачивает только то, что осталось.
Сравнение
| Характеристика | url-media-probe | tinytag | pymediainfo | hachoir | ffprobe (subprocess) |
|---|---|---|---|---|---|
| Pure Python + серверлес | Да (async, без бинарников) | Да | Нет (требуется libmediainfo) | Да | Нет (требуется ffmpeg binary) |
| Асинхронность | asyncio + aiohttp | Синхронный | Синхронный | Синхронный | Синхронный |
| Источники данных | URL, файл, байты в памяти | Файл | Файл | Файл | URL, файл |
| Оптимизация трафика | от 4 KB + 64 KB tail (контроль максимума) | — | — | — | Да, но может скачать весь файл |
| HTTP Range запросы | Прогрессивные (4→8→..→128 KB) + задаётся парсером | — | — | — | Да, но может скчать весь файл |
| Retry логика | Автоматическая | — | — | — | — |
| Типизация | dataclass (frozen) | — | — | — | JSON/dict |
| Форматы | Популярные аудио, видео и фото форматы (~20) | Только аудио | Все форматы MediaInfo (100+) | 33 формата: аудио, видео, изображения, архивы, шрифты | Все форматы ffmpeg (100+) |
| Информативность | Базовая: format, duration, fps, sample rate, bitrate ... | Базовая: duration, bitrate, sample rate, теги | Полная: codec, profile, level, bitrate, контейнер | Полная: codec, profile, bitrate, пиксели, каналы, теги | Полная: codec, profile, level, пиксели, каналы и т.д. |
| Размер дистрибутива | ~300 KB | ~100 KB | ~15 MB (libmediainfo) | ~650 KB | >100 MB (ffmpeg) |
| Сортировка: | <--- легковесный | тяжеловесный --> |
Установка
pip install url-media-probe
Быстрый старт
import asyncio
from url_media_probe import MediaProbe
async def main():
probe = MediaProbe()
# По URL
info = await probe.from_url("https://example.com/video.mp4")
print(info.format) # "MP4"
print(info.width) # 1920
print(info.height) # 1080
print(info.duration) # 15.0
print(info.status) # "ok"
# Локальный файл
info = await probe.from_file("/path/to/photo.jpg")
print(info.format) # "JPEG"
# Из байтов
info = await probe.from_bytes(b"...")
print(info.format) # определяется по сигнатуре
asyncio.run(main())
Метаданные MediaInfo
info = await probe.from_url("https://example.com/audio.mp3")
# Общее
print(f"Формат: {info.format}") # "MP3"
print(f"Статус: {info.status}") # "ok" | "partial" | "error"
# Изображения
if info.width and info.height:
print(f"Размеры: {info.width}x{info.height}")
# Видео / аудио
if info.duration:
print(f"Длительность: {info.duration} сек")
if info.fps:
print(f"FPS: {info.fps}")
if info.bitrate_avg:
print(f"Битрейт: {info.bitrate_avg} kbps")
if info.sample_rate:
print(f"Sample rate: {info.sample_rate} Hz")
# Красивый вывод
print(info)
Кодеки
info = await probe.from_url("https://example.com/video.mp4")
# Краткие идентификаторы
print(info.video_codec) # "h264"
print(info.audio_codec) # "aac"
# Полные названия (из ffprobe)
print(info.video_codec_long) # "H.264 / AVC / MPEG-4 part 10"
print(info.audio_codec_long) # "Advanced Audio Coding"
Как это работает
-
Загрузка данных --
RangeDownloaderделает HTTP Range запросы:- Начинает с заголовков + первые 4KB данных
- Если парсеру не хватило -- докачивает прогрессивно (4 -> 8 -> 16 -> ... -> 128 KB) или сколько попросит парсер, но не более заданного максимального размера.
- Повторяет при 429/5xx ошибках
- Всё в одном keep-alive соединении, кроме загрузки хвоста файла (tail), для него отдельное соединение.
-
Парсинг -- парсеры анализируют сигнатуры байт и заголовки файлов для определения формата, размеров, длительности, FPS, sample rate, битрейта.
-
Результат -- dataclass
MediaInfoс полями:format,status,width,height,duration,fps,sample_rate,bitrate_nominal,bitrate_avg,video_codec,audio_codec,parse_note.
Поддерживаемые форматы
Изображения: JPEG, PNG, GIF, WebP (VP8/VP8L/VP8X)
Видео: MP4/MOV, AVI, MKV, WebM, OGV
Аудио: MP3, AAC, WAV, WMA, FLAC, OGG, M4A
Лицензия
LGPL-2.1
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file url_media_probe-0.1.0.tar.gz.
File metadata
- Download URL: url_media_probe-0.1.0.tar.gz
- Upload date:
- Size: 955.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b8d2ce22cd86a7e44650115e3855c473934a953b2b201234872d69f7953dac1a
|
|
| MD5 |
eb4a64cad951ea08b7c12489537f9f86
|
|
| BLAKE2b-256 |
d96c3328515d106274ab99dfe60a9a99e85c25b066a5129f06598ddb8d1fd845
|
Provenance
The following attestation bundles were made for url_media_probe-0.1.0.tar.gz:
Publisher:
pypi-publish.yml on Pankovea/url-media-probe
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
url_media_probe-0.1.0.tar.gz -
Subject digest:
b8d2ce22cd86a7e44650115e3855c473934a953b2b201234872d69f7953dac1a - Sigstore transparency entry: 2168396673
- Sigstore integration time:
-
Permalink:
Pankovea/url-media-probe@2548f2d9a604b048d10d225d95adad64b57ea26c -
Branch / Tag:
refs/tags/0.1.0 - Owner: https://github.com/Pankovea
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@2548f2d9a604b048d10d225d95adad64b57ea26c -
Trigger Event:
release
-
Statement type:
File details
Details for the file url_media_probe-0.1.0-py3-none-any.whl.
File metadata
- Download URL: url_media_probe-0.1.0-py3-none-any.whl
- Upload date:
- Size: 51.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b1088fee38735b7653ae28cde21de891f7a7362e085168132025065e396530bb
|
|
| MD5 |
ca3a70e156e2ad5ed6368dd591fedc2e
|
|
| BLAKE2b-256 |
53e875bc865acf2f1a293e9f3cb01fc77d6a8645e2cfb4bf05423a7235514f0c
|
Provenance
The following attestation bundles were made for url_media_probe-0.1.0-py3-none-any.whl:
Publisher:
pypi-publish.yml on Pankovea/url-media-probe
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
url_media_probe-0.1.0-py3-none-any.whl -
Subject digest:
b1088fee38735b7653ae28cde21de891f7a7362e085168132025065e396530bb - Sigstore transparency entry: 2168396736
- Sigstore integration time:
-
Permalink:
Pankovea/url-media-probe@2548f2d9a604b048d10d225d95adad64b57ea26c -
Branch / Tag:
refs/tags/0.1.0 - Owner: https://github.com/Pankovea
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@2548f2d9a604b048d10d225d95adad64b57ea26c -
Trigger Event:
release
-
Statement type: