Add download by url

This commit is contained in:
BarsTiger
2023-10-25 18:18:11 +03:00
parent 1f38c42908
commit 2ae18aacae
10 changed files with 160 additions and 0 deletions

View File

@@ -0,0 +1,2 @@
from .recognise import recognise_music_service, RecognisedService
from .id_getter import get_id

View File

@@ -0,0 +1,30 @@
from .recognise import RecognisedService
import aiohttp
async def get_url_after_redirect(url: str) -> str:
async with aiohttp.ClientSession() as session:
async with session.head(url, allow_redirects=True) as resp:
return str(resp.url)
async def get_id(recognised: RecognisedService):
if recognised.name == 'yt':
return recognised.parse_result.path.replace('/', '') if (
recognised.parse_result.netloc.endswith('youtu.be')
) else recognised.parse_result.query.split('=')[1].split('&')[0]
elif recognised.name == 'spot':
if recognised.parse_result.netloc.endswith('open.spotify.com'):
return recognised.parse_result.path.split('/')[2]
else:
url = await get_url_after_redirect(recognised.parse_result.geturl())
return url.split('/')[-1].split('?')[0]
elif recognised.name == 'deez':
if recognised.parse_result.netloc.endswith('deezer.com'):
return recognised.parse_result.path.split('/')[-1]
else:
url = await get_url_after_redirect(recognised.parse_result.geturl())
return url.split('/')[-1].split('?')[0]

View File

@@ -0,0 +1,46 @@
from urllib.parse import urlparse, ParseResult
from dataclasses import dataclass
from typing import Callable, Awaitable, Literal
from bot.modules.database import db
from bot.modules.database.db import DBDict
from bot.modules.youtube import youtube
from bot.modules.spotify import spotify
from bot.modules.deezer import deezer
@dataclass
class RecognisedService:
name: Literal['yt', 'spot', 'deez']
db_table: DBDict
by_id_func: Callable | Awaitable
parse_result: ParseResult
def recognise_music_service(url: str) -> RecognisedService | None:
url = urlparse(url)
if url.netloc.endswith('youtube.com') or url.netloc.endswith('youtu.be'):
return RecognisedService(
name='yt',
db_table=db.youtube,
by_id_func=youtube.songs.from_id,
parse_result=url
)
elif url.netloc.endswith('open.spotify.com') or url.netloc.endswith('spotify.link'):
return RecognisedService(
name='spot',
db_table=db.spotify,
by_id_func=spotify.songs.from_id,
parse_result=url
)
elif url.netloc.endswith('deezer.page.link') or url.netloc.endswith('deezer.com'):
return RecognisedService(
name='deez',
db_table=db.deezer,
by_id_func=deezer.songs.from_id,
parse_result=url
)
else:
return None