Перейти к содержанию

Примеры

Здесь собраны практические примеры использования url-media-probe.

Определение видео по URL

import asyncio
from url_media_probe import MediaProbe

async def main():
    probe = MediaProbe()
    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.fps)       # 25.0
    print(info.status)    # "ok"

    # Сколько данных было скачано
    print(f"Скачано: {probe.downloaded_human}")

    # Если нужно скачать файл целиком — используем уже скачанные данные
    if info.status == "ok":
        path = await probe.download_file("./downloads")
        print(f"Сохранён: {path}")

asyncio.run(main())

Определение локального файла

Локальные файлы по умолчанию читаются целиком (до 20 МБ) — для анимированных GIF/WebP длительность определяется точно, без экстраполяции.

import asyncio
from url_media_probe import MediaProbe

async def main():
    probe = MediaProbe()
    info = await probe.from_file("/path/to/photo.jpg")

    print(info.format)    # "JPEG"
    print(info.width)     # 4032
    print(info.height)    # 3024
    print(info.is_image)  # True

asyncio.run(main())

Определение из байтов

import asyncio
from url_media_probe import MediaProbe

async def main():
    probe = MediaProbe()

    # Из bytes
    data = open("audio.mp3", "rb").read()
    info = await probe.from_bytes(data)
    print(info.format)  # "MP3"

    # Из BytesIO
    from io import BytesIO
    buf = BytesIO(data)
    buf.name = "audio.mp3"
    info = await probe.from_bytes(buf)
    print(info.format)  # "MP3"

asyncio.run(main())

Парсинг по готовым head/tail

Если у вас уже скачаны начало и конец файла:

import asyncio
from url_media_probe import MediaProbe

async def main():
    probe = MediaProbe()

    head = b"..."  # первые байты файла
    tail = b"..."  # последние байты файла
    file_size = 1_048_576  # 1 MB

    info = await probe.from_bytes_range(head, tail, file_size, file_name="video.mp4")
    print(info.format)  # "MP4"

asyncio.run(main())

Кастомные HTTP-заголовки

import asyncio
import aiohttp
from url_media_probe import MediaProbe

async def main():
    probe = MediaProbe()

    # Создаём сессию с кастомными заголовками
    headers = {"Authorization": "Bearer token123"}
    async with aiohttp.ClientSession(headers=headers) as session:
        info = await probe.from_url(
            "https://example.com/protected/video.mp4",
            session=session,
            timeout=15,
            max_total=512_000,  # максимум 512 KB для определения параметров
            max_ratio=0.1,      # относительный лимит: не больше 10% размера файла (итог — минимум с max_total); head всегда 4 KB
        )
        print(info.format)

asyncio.run(main())

Режим «только заголовки» (без скачивания тела)

Если нужны только Content-Type, размер и имя файла — без скачивания тела:

import asyncio
from url_media_probe import MediaProbe

async def main():
    probe = MediaProbe()

    info = await probe.from_url(
        "https://example.com/video.mp4",
        max_ratio=0,  # или max_total=0
    )
    print(info.mime_type)  # "video/mp4"
    print(info.file_size)  # 1048576
    print(info.status)     # "ok"

asyncio.run(main())

Проверка типа файла

info = await probe.from_url("https://example.com/file.bin")

if info.is_image:
    print(f"Изображение: {info.width}x{info.height}")
elif info.is_video:
    print(f"Видео: {info.duration} сек, {info.fps} FPS")
elif info.is_audio:
    print(f"Аудио: {info.duration} сек, {info.sample_rate} Гц")
else:
    print(f"Неизвестный тип: {info.mime_type}")

Использование с aiohttp session

import asyncio
import aiohttp
from url_media_probe import MediaProbe

async def main():
    probe = MediaProbe()

    async with aiohttp.ClientSession() as session:
        info = await probe.from_url(
            "https://example.com/video.mp4",
            session=session,
        )
        print(info.format)

        # Сессия остаётся доступной — можно использовать повторно
        info2 = await probe.from_url(
            "https://example.com/audio.mp3",
            session=session,
        )
        print(info2.format)

asyncio.run(main())

Обработка ошибок

Библиотека никогда не бросает исключения — все ошибки попадают в MediaInfo.status / parse_note.

Проверка статуса

info = await probe.from_url("https://example.com/video.mp4")

if info.status == "ok":
    print(info)
elif info.status == "partial":
    print(f"Частичные данные: {info.parse_note}")
elif info.status == "error":
    print(f"Ошибка: {info.parse_note}")

Типичные ошибки и их parse_note

info = await probe.from_url("https://example.com/file.bin")

match info.parse_note:
    case note if "Сетевая ошибка" in note:
        print("Нет доступа к серверу или таймаут")
    case note if "не является медиа" in note:
        print("По ссылке оказалась HTML-страница, а не медиафайл")
    case note if "не поддерживается" in note:
        print("Формат файла не распознан парсером")
    case note if "Недостаточно данных" in note:
        print("Файл слишком мал, данные не извлечены")
    case note if "не найден" in note:
        print("Локальный файл не существует")
    case _:
        print(f"Другая ошибка: {info.parse_note}")

Проброс сетевых ошибок (raise_on_network)

Если удобнее работать с исключениями — включите raise_on_network:

import aiohttp
import url_media_probe.media_probe as cfg
from url_media_probe import MediaProbe

# Глобально — ко всем экземплярам по умолчанию
cfg.raise_on_network = True

probe = MediaProbe()
try:
    info = await probe.from_url("https://example.com/video.mp4")
except aiohttp.ClientError as e:
    print(f"Сетевая ошибка: {e}")
    # при необходимости — отключить для следующего вызова
    probe_fallback = MediaProbe(raise_on_network=False)
    info = await probe_fallback.from_url("https://backup.example.com/video.mp4")

Пакетная проверка URLs

import asyncio
from url_media_probe import MediaProbe

async def check_url(probe, url):
    info = await probe.from_url(url)
    return url, info.status, info.format

async def main():
    probe = MediaProbe()
    urls = [
        "https://example.com/video.mp4",
        "https://example.com/audio.mp3",
        "https://example.com/missing.jpg",
    ]

    results = await asyncio.gather(
        *(check_url(probe, url) for url in urls),
        return_exceptions=True,
    )

    for result in results:
        if isinstance(result, Exception):
            print(f"Исключение: {result}")
        else:
            url, status, fmt = result
            print(f"{url}: {status} ({fmt})")

asyncio.run(main())