Документация API

Инструкция по интеграции вашего сервера обложек в любые приложения на Python.

1

Получение API-ключа

Для начала работы вам необходимо зарегистрироваться на сайте и получить свой персональный API-ключ.

Перейдите в Личный кабинет, скопируйте ваш токен (он начинается с pm_) и сохраните его в надежном месте.

2

Установка зависимостей

Вам понадобится библиотека requests для отправки HTTP-запросов.

pip install requests
3

Готовый класс-обертка

Вы можете использовать этот класс в любом вашем проекте. Он автоматически кэширует ссылки в локальный файл .jsonl (чтобы не загружать одну и ту же картинку дважды) и проверяет, не была ли обложка удалена с сервера.

import os
import json
import hashlib
import requests

class CoversUploader:
    def __init__(self, server_url, api_token, cache_file="cover_cache.jsonl"):
        self.server_url = server_url.rstrip('/')
        self.cache_file = cache_file
        self.cache = {}
        
        self.session = requests.Session()
        self.session.headers.update({
            'User-Agent': 'MyApp/1.0',
            'X-Upload-Token': api_token
        })
        self._load_cache()

    def _load_cache(self):
        if os.path.exists(self.cache_file):
            with open(self.cache_file, 'r', encoding='utf-8') as f:
                for line in f:
                    try:
                        obj = json.loads(line)
                        self.cache[obj["hash"]] = obj["url"]
                    except: pass

    def _save_to_cache(self, img_hash, url):
        self.cache[img_hash] = url
        with open(self.cache_file, 'a', encoding='utf-8') as f:
            f.write(json.dumps({"hash": img_hash, "url": url}) + "\n")

    def upload(self, image_bytes, track_name="Unknown"):
        img_hash = hashlib.md5(image_bytes).hexdigest()

        # Проверка кэша
        if img_hash in self.cache:
            url = self.cache[img_hash]
            try:
                # HEAD запрос для проверки, жива ли картинка
                resp = self.session.head(url, timeout=3)
                if resp.status_code == 200:
                    return url
            except Exception: pass
            del self.cache[img_hash]

        # Загрузка
        try:
            files = {'file': ('cover.jpg', image_bytes, 'image/jpeg')}
            response = self.session.post(f"{self.server_url}/upload", files=files, timeout=10)
            if response.status_code == 200:
                url = response.json().get("url")
                if url:
                    self._save_to_cache(img_hash, url)
                    return url
        except requests.RequestException as e:
            print(f"Ошибка сети: {e}")
        return None
4

Примеры использования

Пример 1. Простая загрузка файла с диска
# Инициализируем наш загрузчик
uploader = CoversUploader(
    server_url="https://covers.bormart.ru", 
    api_token="pm_ваш_токен_здесь"
)

# Открываем любую картинку на компьютере
with open("my_image.jpg", "rb") as f:
    img_data = f.read()

# Загружаем и получаем ссылку
url = uploader.upload(img_data, "My Track Name")
print(f"Обложка доступна по ссылке: {url}")
Пример 2. Извлечение обложки из MP3/FLAC файла

Для этого вам понадобится библиотека mutagen (pip install mutagen).

import mutagen
from io import BytesIO

uploader = CoversUploader("https://covers.bormart.ru", "pm_ваш_токен")

audio_path = "music/song.mp3"
audio = mutagen.File(audio_path)

if audio and hasattr(audio, 'pictures') and audio.pictures:
    # Получаем сырые байты картинки из тегов
    image_bytes = audio.pictures[0].data
    
    # Загружаем
    url = uploader.upload(image_bytes, "Song Name")
    print(f"Ссылка на обложку: {url}")
else:
    print("В этом файле нет обложки")
Пример 3. Скачивание картинки из интернета и загрузка на сервер
import requests

uploader = CoversUploader("https://covers.bormart.ru", "pm_ваш_токен")

# Скачиваем картинку по URL
img_resp = requests.get("https://example.com/some_album_art.jpg")
if img_resp.status_code == 200:
    # Передаем байты в наш загрузчик
    url = uploader.upload(img_resp.content, "Downloaded Track")
    print(f"Зеркало картинки: {url}")
Пример 4. Интеграция с pypresence (Discord RPC)

Как прикрутить это к статусу Discord (библиотека pypresence).

from pypresence import Presence
import time

RPC = Presence("твой_client_id")
RPC.connect()

uploader = CoversUploader("https://covers.bormart.ru", "pm_ваш_токен")

with open("cover.png", "rb") as f:
    cover_url = uploader.upload(f.read(), "My Song")

if cover_url:
    RPC.update(
        details="Слушает музыку",
        state="Исполнитель - Трек",
        large_image=cover_url, # <-- Передаем ссылку с нашего сервера
        large_text="Альбом"
    )

while True:
    time.sleep(15)
5

Лимиты и квоты

Каждый API-ключ имеет свой лимит загрузок (по умолчанию 5000). Если сервер вернет ошибку 429 Too Many Requests, значит, квота исчерпана.

Чтобы удалить свои загруженные обложки и вернуть потраченную квоту, вы можете воспользоваться страницей Мои обложки в личном кабинете.