42 lines
1.7 KiB
Python
42 lines
1.7 KiB
Python
"""Пример расширения: файлы Google Drive по ссылке-«просмотру».
|
|
|
|
Образец для своих экстракторов. Здесь резолв чисто строковый (URL -> прямая
|
|
ссылка), без скрейпинга — поэтому тестируется офлайн.
|
|
|
|
https://drive.google.com/file/d/<ID>/view
|
|
-> https://drive.google.com/uc?export=download&id=<ID>
|
|
|
|
Оговорка: для больших файлов Drive отдаёт HTML-страницу с подтверждением
|
|
антивирусной проверки (нужны confirm-токен и cookie) — здесь не покрыто;
|
|
для небольших файлов прямая ссылка работает сразу.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import re
|
|
|
|
from app.services.downloader import Resolved, SiteExtractor, register
|
|
|
|
_FILE_ID = re.compile(r"drive\.google\.com/file/d/([\w-]+)")
|
|
|
|
|
|
@register
|
|
class GoogleDriveExtractor(SiteExtractor):
|
|
"""Google Drive: ссылка-просмотр файла -> прямая загрузка."""
|
|
|
|
priority = 100
|
|
label = "Google Drive"
|
|
|
|
@classmethod
|
|
def matches(cls, url: str) -> bool:
|
|
return bool(_FILE_ID.search(url))
|
|
|
|
async def resolve(self, url: str) -> Resolved:
|
|
match = _FILE_ID.search(url)
|
|
if not match: # matches() уже проверил, но без него resolve честно падает
|
|
raise ValueError(f"Не ссылка на файл Google Drive: {url}")
|
|
file_id = match.group(1)
|
|
return Resolved(
|
|
download_url=f"https://drive.google.com/uc?export=download&id={file_id}"
|
|
)
|