Инструкция по интеграции вашего сервера обложек в любые приложения на Python.
Для начала работы вам необходимо зарегистрироваться на сайте и получить свой персональный API-ключ.
Перейдите в Личный кабинет, скопируйте ваш токен (он начинается с pm_) и сохраните его в надежном месте.
Вам понадобится библиотека requests для отправки HTTP-запросов.
pip install requests
Вы можете использовать этот класс в любом вашем проекте. Он автоматически кэширует ссылки в локальный файл .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
# Инициализируем наш загрузчик
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}")
Для этого вам понадобится библиотека 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("В этом файле нет обложки")
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}")
Как прикрутить это к статусу 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)
Каждый API-ключ имеет свой лимит загрузок (по умолчанию 5000). Если сервер вернет ошибку 429 Too Many Requests, значит, квота исчерпана.
Чтобы удалить свои загруженные обложки и вернуть потраченную квоту, вы можете воспользоваться страницей Мои обложки в личном кабинете.