migrate to docker
This commit is contained in:
14
.env.example
Normal file
14
.env.example
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
BOT_TOKEN =
|
||||||
|
FILES_CHAT =
|
||||||
|
ADMIN_ID =
|
||||||
|
|
||||||
|
DB_PATH = /app/data/db.db
|
||||||
|
|
||||||
|
SPOTIFY_CLIENT_ID =
|
||||||
|
SPOTIFY_CLIENT_SECRET =
|
||||||
|
|
||||||
|
DEEZER_ARL =
|
||||||
|
|
||||||
|
SOUNDCLOUD_CLIENT_ID =
|
||||||
|
|
||||||
|
GENIUS_CLIENT_ACCESS =
|
||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,7 +1,7 @@
|
|||||||
/.idea/
|
/.idea/
|
||||||
/tests/
|
/tests/
|
||||||
|
|
||||||
poetry.lock
|
.env
|
||||||
config.toml
|
config.toml
|
||||||
|
|
||||||
**/__pycache__/
|
**/__pycache__/
|
||||||
|
|||||||
14
Dockerfile
Normal file
14
Dockerfile
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
FROM ghcr.io/astral-sh/uv:python3.12-alpine
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY pyproject.toml uv.lock ./
|
||||||
|
COPY lib ./lib
|
||||||
|
RUN uv sync --frozen
|
||||||
|
|
||||||
|
ENV PATH="/app/.venv/bin:$PATH"
|
||||||
|
|
||||||
|
COPY . /app/src
|
||||||
|
WORKDIR /app/src
|
||||||
|
|
||||||
|
CMD ["python3", "-m", "bot"]
|
||||||
@@ -3,11 +3,11 @@ from rich.console import Console
|
|||||||
|
|
||||||
from bot.modules.fsm import InDbStorage
|
from bot.modules.fsm import InDbStorage
|
||||||
|
|
||||||
from .utils.config import config
|
from .utils import env
|
||||||
|
|
||||||
bot = Bot(token=config.telegram.bot_token)
|
bot = Bot(token=env.BOT_TOKEN)
|
||||||
dp = Dispatcher(storage=InDbStorage())
|
dp = Dispatcher(storage=InDbStorage())
|
||||||
console = Console()
|
console = Console()
|
||||||
|
|
||||||
|
|
||||||
__all__ = ["bot", "dp", "config", "console"]
|
__all__ = ["bot", "dp", "console"]
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ from aiogram.types import (
|
|||||||
|
|
||||||
from bot.modules.database import db
|
from bot.modules.database import db
|
||||||
from bot.modules.deezer import DeezerBytestream, deezer
|
from bot.modules.deezer import DeezerBytestream, deezer
|
||||||
from bot.utils.config import config
|
from bot.utils import env
|
||||||
|
|
||||||
router = Router()
|
router = Router()
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@ async def on_new_chosen(chosen_result: ChosenInlineResult, bot: Bot):
|
|||||||
).to_bytestream()
|
).to_bytestream()
|
||||||
|
|
||||||
audio = await bot.send_audio(
|
audio = await bot.send_audio(
|
||||||
chat_id=config.telegram.files_chat,
|
chat_id=env.FILES_CHAT,
|
||||||
audio=BufferedInputFile(
|
audio=BufferedInputFile(
|
||||||
file=bytestream.file,
|
file=bytestream.file,
|
||||||
filename=bytestream.filename,
|
filename=bytestream.filename,
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ from aiogram.types import BufferedInputFile, ChosenInlineResult, InputMediaAudio
|
|||||||
from bot.modules.database import db
|
from bot.modules.database import db
|
||||||
from bot.modules.settings import UserSettings
|
from bot.modules.settings import UserSettings
|
||||||
from bot.modules.youtube.downloader import YouTubeBytestream
|
from bot.modules.youtube.downloader import YouTubeBytestream
|
||||||
from bot.utils.config import config
|
from bot.utils import env
|
||||||
|
|
||||||
router = Router()
|
router = Router()
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@ async def on_cached_chosen(
|
|||||||
)
|
)
|
||||||
|
|
||||||
message = await bot.forward_message(
|
message = await bot.forward_message(
|
||||||
config.telegram.files_chat, config.telegram.files_chat, db.recoded[song_id]
|
env.FILES_CHAT, env.FILES_CHAT, db.recoded[song_id]
|
||||||
)
|
)
|
||||||
|
|
||||||
song_io: BytesIO = await bot.download( # type: ignore
|
song_io: BytesIO = await bot.download( # type: ignore
|
||||||
@@ -60,7 +60,7 @@ async def on_cached_chosen(
|
|||||||
await bytestream.rerender()
|
await bytestream.rerender()
|
||||||
|
|
||||||
audio = await bot.send_audio(
|
audio = await bot.send_audio(
|
||||||
chat_id=config.telegram.files_chat,
|
chat_id=env.FILES_CHAT,
|
||||||
audio=BufferedInputFile(
|
audio=BufferedInputFile(
|
||||||
file=bytestream.file,
|
file=bytestream.file,
|
||||||
filename=bytestream.filename,
|
filename=bytestream.filename,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ from aiogram.types import (
|
|||||||
|
|
||||||
from bot.modules.database import db
|
from bot.modules.database import db
|
||||||
from bot.modules.soundcloud import SoundCloudBytestream, soundcloud
|
from bot.modules.soundcloud import SoundCloudBytestream, soundcloud
|
||||||
from bot.utils.config import config
|
from bot.utils import env
|
||||||
|
|
||||||
router = Router()
|
router = Router()
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@ async def on_new_chosen(chosen_result: ChosenInlineResult, bot: Bot):
|
|||||||
).to_bytestream()
|
).to_bytestream()
|
||||||
|
|
||||||
audio = await bot.send_audio(
|
audio = await bot.send_audio(
|
||||||
chat_id=config.telegram.files_chat,
|
chat_id=env.FILES_CHAT,
|
||||||
audio=BufferedInputFile(
|
audio=BufferedInputFile(
|
||||||
file=bytestream.file,
|
file=bytestream.file,
|
||||||
filename=bytestream.filename,
|
filename=bytestream.filename,
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ from bot.modules.settings import UserSettings
|
|||||||
from bot.modules.spotify import spotify
|
from bot.modules.spotify import spotify
|
||||||
from bot.modules.youtube import AgeRestrictedError, youtube
|
from bot.modules.youtube import AgeRestrictedError, youtube
|
||||||
from bot.modules.youtube.song import SongItem
|
from bot.modules.youtube.song import SongItem
|
||||||
from bot.utils.config import config
|
from bot.utils import env
|
||||||
|
|
||||||
router = Router()
|
router = Router()
|
||||||
|
|
||||||
@@ -55,7 +55,7 @@ async def on_new_chosen(
|
|||||||
bytestream = await yt_song.to_bytestream()
|
bytestream = await yt_song.to_bytestream()
|
||||||
|
|
||||||
audio = await bot.send_audio(
|
audio = await bot.send_audio(
|
||||||
chat_id=config.telegram.files_chat,
|
chat_id=env.FILES_CHAT,
|
||||||
audio=BufferedInputFile(
|
audio=BufferedInputFile(
|
||||||
file=bytestream.file,
|
file=bytestream.file,
|
||||||
filename=bytestream.filename,
|
filename=bytestream.filename,
|
||||||
@@ -87,7 +87,7 @@ async def on_new_chosen(
|
|||||||
).to_bytestream()
|
).to_bytestream()
|
||||||
|
|
||||||
audio = await bot.send_audio(
|
audio = await bot.send_audio(
|
||||||
chat_id=config.telegram.files_chat,
|
chat_id=env.FILES_CHAT,
|
||||||
audio=BufferedInputFile(
|
audio=BufferedInputFile(
|
||||||
file=bytestream.file,
|
file=bytestream.file,
|
||||||
filename=bytestream.filename,
|
filename=bytestream.filename,
|
||||||
@@ -130,7 +130,7 @@ async def on_new_chosen(
|
|||||||
await bytestream.rerender()
|
await bytestream.rerender()
|
||||||
|
|
||||||
audio = await bot.send_audio(
|
audio = await bot.send_audio(
|
||||||
chat_id=config.telegram.files_chat,
|
chat_id=env.FILES_CHAT,
|
||||||
audio=BufferedInputFile(
|
audio=BufferedInputFile(
|
||||||
file=bytestream.file,
|
file=bytestream.file,
|
||||||
filename=bytestream.filename,
|
filename=bytestream.filename,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ from aiogram.types import (
|
|||||||
from bot.modules.database import db
|
from bot.modules.database import db
|
||||||
from bot.modules.settings import UserSettings
|
from bot.modules.settings import UserSettings
|
||||||
from bot.modules.youtube import AgeRestrictedError, youtube
|
from bot.modules.youtube import AgeRestrictedError, youtube
|
||||||
from bot.utils.config import config
|
from bot.utils import env
|
||||||
|
|
||||||
router = Router()
|
router = Router()
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ async def on_new_chosen(
|
|||||||
return
|
return
|
||||||
|
|
||||||
audio = await bot.send_audio(
|
audio = await bot.send_audio(
|
||||||
chat_id=config.telegram.files_chat,
|
chat_id=env.FILES_CHAT,
|
||||||
audio=BufferedInputFile(
|
audio=BufferedInputFile(
|
||||||
file=bytestream.file,
|
file=bytestream.file,
|
||||||
filename=bytestream.filename,
|
filename=bytestream.filename,
|
||||||
@@ -61,7 +61,7 @@ async def on_new_chosen(
|
|||||||
await bytestream.rerender()
|
await bytestream.rerender()
|
||||||
|
|
||||||
audio = await bot.send_audio(
|
audio = await bot.send_audio(
|
||||||
chat_id=config.telegram.files_chat,
|
chat_id=env.FILES_CHAT,
|
||||||
audio=BufferedInputFile(
|
audio=BufferedInputFile(
|
||||||
file=bytestream.file,
|
file=bytestream.file,
|
||||||
filename=bytestream.filename,
|
filename=bytestream.filename,
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
from sqlitedict import SqliteDict
|
from sqlitedict import SqliteDict
|
||||||
|
|
||||||
from bot.utils.config import config
|
from bot.utils import env
|
||||||
|
|
||||||
|
|
||||||
class DBDict(SqliteDict):
|
class DBDict(SqliteDict):
|
||||||
def __init__(self, tablename: str):
|
def __init__(self, tablename: str):
|
||||||
super().__init__(config.local.db_path, tablename=tablename, autocommit=True)
|
super().__init__(env.DB_PATH, tablename=tablename, autocommit=True)
|
||||||
|
F
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
from bot.utils.config import config
|
from bot.utils import env
|
||||||
|
|
||||||
from .deezer import Deezer
|
from .deezer import Deezer
|
||||||
from .downloader import DeezerBytestream
|
from .downloader import DeezerBytestream
|
||||||
|
|
||||||
deezer = Deezer(
|
deezer = Deezer(
|
||||||
arl=config.tokens.deezer.arl,
|
arl=env.DEEZER_ARL,
|
||||||
)
|
)
|
||||||
|
|
||||||
__all__ = ["deezer", "DeezerBytestream"]
|
__all__ = ["deezer", "DeezerBytestream"]
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
from bot.utils.config import config
|
from bot.utils import env
|
||||||
|
|
||||||
from .downloader import SoundCloudBytestream
|
from .downloader import SoundCloudBytestream
|
||||||
from .soundcloud import SoundCloud
|
from .soundcloud import SoundCloud
|
||||||
|
|
||||||
soundcloud = SoundCloud(
|
soundcloud = SoundCloud(
|
||||||
client_id=config.tokens.soundcloud.client_id,
|
client_id=env.SOUNDCLOUD_CLIENT_ID,
|
||||||
)
|
)
|
||||||
|
|
||||||
__all__ = ["soundcloud", "SoundCloudBytestream"]
|
__all__ = ["soundcloud", "SoundCloudBytestream"]
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
from bot.utils.config import config
|
from bot.utils import env
|
||||||
|
|
||||||
from .spotify import Spotify
|
from .spotify import Spotify
|
||||||
|
|
||||||
spotify = Spotify(
|
spotify = Spotify(
|
||||||
client_id=config.tokens.spotify.client_id,
|
client_id=env.SPOTIFY_CLIENT_ID,
|
||||||
client_secret=config.tokens.spotify.client_secret,
|
client_secret=env.SPOTIFY_CLIENT_SECRET,
|
||||||
)
|
)
|
||||||
|
|
||||||
__all__ = ["spotify"]
|
__all__ = ["spotify"]
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
from .config import config
|
||||||
|
|||||||
26
bot/utils/env.py
Normal file
26
bot/utils/env.py
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
try:
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
BOT_TOKEN = os.environ["BOT_TOKEN"]
|
||||||
|
FILES_CHAT = os.environ["FILES_CHAT"]
|
||||||
|
ADMIN_ID = os.environ["ADMIN_ID"]
|
||||||
|
|
||||||
|
DB_PATH = os.environ["DB_PATH"]
|
||||||
|
|
||||||
|
SPOTIFY_CLIENT_ID = os.environ["SPOTIFY_CLIENT_ID"]
|
||||||
|
SPOTIFY_CLIENT_SECRET = os.environ["SPOTIFY_CLIENT_SECRET"]
|
||||||
|
|
||||||
|
DEEZER_ARL = os.environ["DEEZER_ARL"]
|
||||||
|
|
||||||
|
SOUNDCLOUD_CLIENT_ID = os.environ["SOUNDCLOUD_CLIENT_ID"]
|
||||||
|
|
||||||
|
GENIUS_CLIENT_ACCESS = os.environ["GENIUS_CLIENT_ACCESS"]
|
||||||
|
|
||||||
|
except KeyError as e:
|
||||||
|
print("Can't parse environment", e)
|
||||||
|
sys.exit(1)
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
[telegram]
|
|
||||||
bot_token = ''
|
|
||||||
files_chat = 0
|
|
||||||
admin_id = 0
|
|
||||||
|
|
||||||
[local]
|
|
||||||
db_path = 'db.db'
|
|
||||||
app_id = 'ANY-MUSIC-BOT'
|
|
||||||
|
|
||||||
[tokens.spotify]
|
|
||||||
client_id = ''
|
|
||||||
client_secret = ''
|
|
||||||
|
|
||||||
[tokens.deezer]
|
|
||||||
arl = ''
|
|
||||||
|
|
||||||
[tokens.soundcloud]
|
|
||||||
client_id = ''
|
|
||||||
|
|
||||||
[tokens.genius]
|
|
||||||
client_acces = ''
|
|
||||||
14
docker-compose.yml
Normal file
14
docker-compose.yml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
services:
|
||||||
|
bot:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
command: "python3 -m bot"
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
volumes:
|
||||||
|
- ./:/app/src
|
||||||
|
- data:/app/data
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
data:
|
||||||
@@ -20,6 +20,7 @@ dependencies = [
|
|||||||
"m3u8>=5.1.0,<6",
|
"m3u8>=5.1.0,<6",
|
||||||
"cryptography>=43.0.0,<44",
|
"cryptography>=43.0.0,<44",
|
||||||
"pytubefix>=8.2.0,<9",
|
"pytubefix>=8.2.0,<9",
|
||||||
|
"python-dotenv>=1.0.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[tool.uv.sources]
|
[tool.uv.sources]
|
||||||
|
|||||||
143
uv.lock
generated
143
uv.lock
generated
@@ -1,12 +1,12 @@
|
|||||||
version = 1
|
version = 1
|
||||||
requires-python = ">=3.11, <4"
|
requires-python = ">=3.11"
|
||||||
resolution-markers = [
|
resolution-markers = [
|
||||||
"python_full_version < '3.11.3' and platform_python_implementation != 'PyPy'",
|
"python_full_version < '3.11.3' and platform_python_implementation != 'PyPy'",
|
||||||
"python_full_version >= '3.11.3' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'",
|
"python_full_version >= '3.11.3' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'",
|
||||||
"python_full_version >= '3.13' and platform_python_implementation != 'PyPy'",
|
"python_full_version >= '3.13' and python_full_version < '4' and platform_python_implementation != 'PyPy'",
|
||||||
"python_full_version < '3.11.3' and platform_python_implementation == 'PyPy'",
|
"python_full_version < '3.11.3' and platform_python_implementation == 'PyPy'",
|
||||||
"python_full_version >= '3.11.3' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'",
|
"python_full_version >= '3.11.3' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'",
|
||||||
"python_full_version >= '3.13' and platform_python_implementation == 'PyPy'",
|
"python_full_version >= '3.13' and python_full_version < '4' and platform_python_implementation == 'PyPy'",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -23,12 +23,12 @@ name = "aiogram"
|
|||||||
version = "3.13.1"
|
version = "3.13.1"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "aiofiles" },
|
{ name = "aiofiles", marker = "python_full_version < '4'" },
|
||||||
{ name = "aiohttp" },
|
{ name = "aiohttp", marker = "python_full_version < '4'" },
|
||||||
{ name = "certifi" },
|
{ name = "certifi", marker = "python_full_version < '4'" },
|
||||||
{ name = "magic-filter" },
|
{ name = "magic-filter", marker = "python_full_version < '4'" },
|
||||||
{ name = "pydantic" },
|
{ name = "pydantic", marker = "python_full_version < '4'" },
|
||||||
{ name = "typing-extensions" },
|
{ name = "typing-extensions", marker = "python_full_version < '4'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/ea/34/192e1166d9dbb5c53a4654a0dbf69a3c6e91d0f9e0d77adbb0544ff23dda/aiogram-3.13.1.tar.gz", hash = "sha256:2674640ae74501ae30e68a5354e03f12e10db3adbcbd475bb56904536288c9c9", size = 1347281 }
|
sdist = { url = "https://files.pythonhosted.org/packages/ea/34/192e1166d9dbb5c53a4654a0dbf69a3c6e91d0f9e0d77adbb0544ff23dda/aiogram-3.13.1.tar.gz", hash = "sha256:2674640ae74501ae30e68a5354e03f12e10db3adbcbd475bb56904536288c9c9", size = 1347281 }
|
||||||
wheels = [
|
wheels = [
|
||||||
@@ -49,12 +49,12 @@ name = "aiohttp"
|
|||||||
version = "3.10.10"
|
version = "3.10.10"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "aiohappyeyeballs" },
|
{ name = "aiohappyeyeballs", marker = "python_full_version < '4'" },
|
||||||
{ name = "aiosignal" },
|
{ name = "aiosignal", marker = "python_full_version < '4'" },
|
||||||
{ name = "attrs" },
|
{ name = "attrs", marker = "python_full_version < '4'" },
|
||||||
{ name = "frozenlist" },
|
{ name = "frozenlist", marker = "python_full_version < '4'" },
|
||||||
{ name = "multidict" },
|
{ name = "multidict", marker = "python_full_version < '4'" },
|
||||||
{ name = "yarl" },
|
{ name = "yarl", marker = "python_full_version < '4'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/17/7e/16e57e6cf20eb62481a2f9ce8674328407187950ccc602ad07c685279141/aiohttp-3.10.10.tar.gz", hash = "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a", size = 7542993 }
|
sdist = { url = "https://files.pythonhosted.org/packages/17/7e/16e57e6cf20eb62481a2f9ce8674328407187950ccc602ad07c685279141/aiohttp-3.10.10.tar.gz", hash = "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a", size = 7542993 }
|
||||||
wheels = [
|
wheels = [
|
||||||
@@ -110,7 +110,7 @@ name = "aiosignal"
|
|||||||
version = "1.3.1"
|
version = "1.3.1"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "frozenlist" },
|
{ name = "frozenlist", marker = "python_full_version < '4'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/ae/67/0952ed97a9793b4958e5736f6d2b346b414a2cd63e82d05940032f45b32f/aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc", size = 19422 }
|
sdist = { url = "https://files.pythonhosted.org/packages/ae/67/0952ed97a9793b4958e5736f6d2b346b414a2cd63e82d05940032f45b32f/aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc", size = 19422 }
|
||||||
wheels = [
|
wheels = [
|
||||||
@@ -131,8 +131,8 @@ name = "anyio"
|
|||||||
version = "3.7.1"
|
version = "3.7.1"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "idna" },
|
{ name = "idna", marker = "python_full_version < '4'" },
|
||||||
{ name = "sniffio" },
|
{ name = "sniffio", marker = "python_full_version < '4'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/28/99/2dfd53fd55ce9838e6ff2d4dac20ce58263798bd1a0dbe18b3a9af3fcfce/anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780", size = 142927 }
|
sdist = { url = "https://files.pythonhosted.org/packages/28/99/2dfd53fd55ce9838e6ff2d4dac20ce58263798bd1a0dbe18b3a9af3fcfce/anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780", size = 142927 }
|
||||||
wheels = [
|
wheels = [
|
||||||
@@ -144,22 +144,23 @@ name = "anymusicbot"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = { virtual = "." }
|
source = { virtual = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "aiogram" },
|
{ name = "aiogram", marker = "python_full_version < '4'" },
|
||||||
{ name = "aiohttp" },
|
{ name = "aiohttp", marker = "python_full_version < '4'" },
|
||||||
{ name = "attrs" },
|
{ name = "attrs", marker = "python_full_version < '4'" },
|
||||||
{ name = "cryptography" },
|
{ name = "cryptography", marker = "python_full_version < '4'" },
|
||||||
{ name = "icecream" },
|
{ name = "icecream", marker = "python_full_version < '4'" },
|
||||||
{ name = "m3u8" },
|
{ name = "m3u8", marker = "python_full_version < '4'" },
|
||||||
{ name = "nest-asyncio" },
|
{ name = "nest-asyncio", marker = "python_full_version < '4'" },
|
||||||
{ name = "pydub" },
|
{ name = "pydub", marker = "python_full_version < '4'" },
|
||||||
{ name = "pytubefix" },
|
{ name = "python-dotenv", marker = "python_full_version < '4'" },
|
||||||
{ name = "rich" },
|
{ name = "pytubefix", marker = "python_full_version < '4'" },
|
||||||
{ name = "setuptools" },
|
{ name = "rich", marker = "python_full_version < '4'" },
|
||||||
{ name = "shazamio" },
|
{ name = "setuptools", marker = "python_full_version < '4'" },
|
||||||
{ name = "spotipy" },
|
{ name = "shazamio", marker = "python_full_version < '4'" },
|
||||||
{ name = "sqlitedict" },
|
{ name = "spotipy", marker = "python_full_version < '4'" },
|
||||||
{ name = "wheel" },
|
{ name = "sqlitedict", marker = "python_full_version < '4'" },
|
||||||
{ name = "ytmusicapi" },
|
{ name = "wheel", marker = "python_full_version < '4'" },
|
||||||
|
{ name = "ytmusicapi", marker = "python_full_version < '4'" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.metadata]
|
[package.metadata]
|
||||||
@@ -172,6 +173,7 @@ requires-dist = [
|
|||||||
{ name = "m3u8", specifier = ">=5.1.0,<6" },
|
{ name = "m3u8", specifier = ">=5.1.0,<6" },
|
||||||
{ name = "nest-asyncio", specifier = ">=1.5.8,<2" },
|
{ name = "nest-asyncio", specifier = ">=1.5.8,<2" },
|
||||||
{ name = "pydub", specifier = ">=0.25.1,<0.26" },
|
{ name = "pydub", specifier = ">=0.25.1,<0.26" },
|
||||||
|
{ name = "python-dotenv", specifier = ">=1.0.1" },
|
||||||
{ name = "pytubefix", specifier = ">=8.2.0,<9" },
|
{ name = "pytubefix", specifier = ">=8.2.0,<9" },
|
||||||
{ name = "rich", specifier = ">=13.6.0,<14" },
|
{ name = "rich", specifier = ">=13.6.0,<14" },
|
||||||
{ name = "setuptools", specifier = ">=72.1.0,<73" },
|
{ name = "setuptools", specifier = ">=72.1.0,<73" },
|
||||||
@@ -187,7 +189,7 @@ name = "asttokens"
|
|||||||
version = "2.4.1"
|
version = "2.4.1"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "six" },
|
{ name = "six", marker = "python_full_version < '4'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/45/1d/f03bcb60c4a3212e15f99a56085d93093a497718adf828d050b9d675da81/asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0", size = 62284 }
|
sdist = { url = "https://files.pythonhosted.org/packages/45/1d/f03bcb60c4a3212e15f99a56085d93093a497718adf828d050b9d675da81/asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0", size = 62284 }
|
||||||
wheels = [
|
wheels = [
|
||||||
@@ -226,7 +228,7 @@ name = "cffi"
|
|||||||
version = "1.17.1"
|
version = "1.17.1"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "pycparser", marker = "platform_python_implementation != 'PyPy'" },
|
{ name = "pycparser", marker = "python_full_version < '4' and platform_python_implementation != 'PyPy'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 }
|
sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 }
|
||||||
wheels = [
|
wheels = [
|
||||||
@@ -334,7 +336,7 @@ name = "cryptography"
|
|||||||
version = "43.0.3"
|
version = "43.0.3"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "cffi", marker = "platform_python_implementation != 'PyPy'" },
|
{ name = "cffi", marker = "python_full_version < '4' and platform_python_implementation != 'PyPy'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/0d/05/07b55d1fa21ac18c3a8c79f764e2514e6f6a9698f1be44994f5adf0d29db/cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805", size = 686989 }
|
sdist = { url = "https://files.pythonhosted.org/packages/0d/05/07b55d1fa21ac18c3a8c79f764e2514e6f6a9698f1be44994f5adf0d29db/cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805", size = 686989 }
|
||||||
wheels = [
|
wheels = [
|
||||||
@@ -434,10 +436,10 @@ name = "icecream"
|
|||||||
version = "2.1.3"
|
version = "2.1.3"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "asttokens" },
|
{ name = "asttokens", marker = "python_full_version < '4'" },
|
||||||
{ name = "colorama" },
|
{ name = "colorama", marker = "python_full_version < '4'" },
|
||||||
{ name = "executing" },
|
{ name = "executing", marker = "python_full_version < '4'" },
|
||||||
{ name = "pygments" },
|
{ name = "pygments", marker = "python_full_version < '4'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/1c/8b/ae6ebc9fc423f9397a0982990c86f1fe94077df729ef452c9a847fb16ae6/icecream-2.1.3.tar.gz", hash = "sha256:0aa4a7c3374ec36153a1d08f81e3080e83d8ac1eefd97d2f4fe9544e8f9b49de", size = 14722 }
|
sdist = { url = "https://files.pythonhosted.org/packages/1c/8b/ae6ebc9fc423f9397a0982990c86f1fe94077df729ef452c9a847fb16ae6/icecream-2.1.3.tar.gz", hash = "sha256:0aa4a7c3374ec36153a1d08f81e3080e83d8ac1eefd97d2f4fe9544e8f9b49de", size = 14722 }
|
||||||
wheels = [
|
wheels = [
|
||||||
@@ -476,7 +478,7 @@ name = "markdown-it-py"
|
|||||||
version = "3.0.0"
|
version = "3.0.0"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "mdurl" },
|
{ name = "mdurl", marker = "python_full_version < '4'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 }
|
sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 }
|
||||||
wheels = [
|
wheels = [
|
||||||
@@ -650,9 +652,9 @@ name = "pydantic"
|
|||||||
version = "2.9.2"
|
version = "2.9.2"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "annotated-types" },
|
{ name = "annotated-types", marker = "python_full_version < '4'" },
|
||||||
{ name = "pydantic-core" },
|
{ name = "pydantic-core", marker = "python_full_version < '4'" },
|
||||||
{ name = "typing-extensions" },
|
{ name = "typing-extensions", marker = "python_full_version < '4'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/a9/b7/d9e3f12af310e1120c21603644a1cd86f59060e040ec5c3a80b8f05fae30/pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f", size = 769917 }
|
sdist = { url = "https://files.pythonhosted.org/packages/a9/b7/d9e3f12af310e1120c21603644a1cd86f59060e040ec5c3a80b8f05fae30/pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f", size = 769917 }
|
||||||
wheels = [
|
wheels = [
|
||||||
@@ -664,7 +666,7 @@ name = "pydantic-core"
|
|||||||
version = "2.23.4"
|
version = "2.23.4"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "typing-extensions" },
|
{ name = "typing-extensions", marker = "python_full_version < '4'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/e2/aa/6b6a9b9f8537b872f552ddd46dd3da230367754b6f707b8e1e963f515ea3/pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863", size = 402156 }
|
sdist = { url = "https://files.pythonhosted.org/packages/e2/aa/6b6a9b9f8537b872f552ddd46dd3da230367754b6f707b8e1e963f515ea3/pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863", size = 402156 }
|
||||||
wheels = [
|
wheels = [
|
||||||
@@ -724,6 +726,15 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", size = 1205513 },
|
{ url = "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", size = 1205513 },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "python-dotenv"
|
||||||
|
version = "1.0.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pytubefix"
|
name = "pytubefix"
|
||||||
version = "8.2.0"
|
version = "8.2.0"
|
||||||
@@ -750,10 +761,10 @@ name = "requests"
|
|||||||
version = "2.32.3"
|
version = "2.32.3"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "certifi" },
|
{ name = "certifi", marker = "python_full_version < '4'" },
|
||||||
{ name = "charset-normalizer" },
|
{ name = "charset-normalizer", marker = "python_full_version < '4'" },
|
||||||
{ name = "idna" },
|
{ name = "idna", marker = "python_full_version < '4'" },
|
||||||
{ name = "urllib3" },
|
{ name = "urllib3", marker = "python_full_version < '4'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 }
|
sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 }
|
||||||
wheels = [
|
wheels = [
|
||||||
@@ -765,8 +776,8 @@ name = "rich"
|
|||||||
version = "13.9.4"
|
version = "13.9.4"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "markdown-it-py" },
|
{ name = "markdown-it-py", marker = "python_full_version < '4'" },
|
||||||
{ name = "pygments" },
|
{ name = "pygments", marker = "python_full_version < '4'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 }
|
sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 }
|
||||||
wheels = [
|
wheels = [
|
||||||
@@ -787,13 +798,13 @@ name = "shazamio"
|
|||||||
version = "0.0.6"
|
version = "0.0.6"
|
||||||
source = { directory = "lib/ShazamIO" }
|
source = { directory = "lib/ShazamIO" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "aiofiles" },
|
{ name = "aiofiles", marker = "python_full_version < '4'" },
|
||||||
{ name = "aiohttp" },
|
{ name = "aiohttp", marker = "python_full_version < '4'" },
|
||||||
{ name = "anyio" },
|
{ name = "anyio", marker = "python_full_version < '4'" },
|
||||||
{ name = "dataclass-factory" },
|
{ name = "dataclass-factory", marker = "python_full_version < '4'" },
|
||||||
{ name = "numpy" },
|
{ name = "numpy", marker = "python_full_version < '4'" },
|
||||||
{ name = "pydantic" },
|
{ name = "pydantic", marker = "python_full_version < '4'" },
|
||||||
{ name = "pydub" },
|
{ name = "pydub", marker = "python_full_version < '4'" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.metadata]
|
[package.metadata]
|
||||||
@@ -830,9 +841,9 @@ name = "spotipy"
|
|||||||
version = "2.24.0"
|
version = "2.24.0"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "redis" },
|
{ name = "redis", marker = "python_full_version < '4'" },
|
||||||
{ name = "requests" },
|
{ name = "requests", marker = "python_full_version < '4'" },
|
||||||
{ name = "urllib3" },
|
{ name = "urllib3", marker = "python_full_version < '4'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/9b/10/145a649207a9d4067846045cca71262b8ea2140d1df3fa78581fbf1b9ec0/spotipy-2.24.0.tar.gz", hash = "sha256:396af81e642086551af157270cdfe742c1739405871ba9dac1fa651b8649ef0d", size = 41708 }
|
sdist = { url = "https://files.pythonhosted.org/packages/9b/10/145a649207a9d4067846045cca71262b8ea2140d1df3fa78581fbf1b9ec0/spotipy-2.24.0.tar.gz", hash = "sha256:396af81e642086551af157270cdfe742c1739405871ba9dac1fa651b8649ef0d", size = 41708 }
|
||||||
wheels = [
|
wheels = [
|
||||||
@@ -877,9 +888,9 @@ name = "yarl"
|
|||||||
version = "1.17.1"
|
version = "1.17.1"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "idna" },
|
{ name = "idna", marker = "python_full_version < '4'" },
|
||||||
{ name = "multidict" },
|
{ name = "multidict", marker = "python_full_version < '4'" },
|
||||||
{ name = "propcache" },
|
{ name = "propcache", marker = "python_full_version < '4'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/54/9c/9c0a9bfa683fc1be7fdcd9687635151544d992cccd48892dc5e0a5885a29/yarl-1.17.1.tar.gz", hash = "sha256:067a63fcfda82da6b198fa73079b1ca40b7c9b7994995b6ee38acda728b64d47", size = 178163 }
|
sdist = { url = "https://files.pythonhosted.org/packages/54/9c/9c0a9bfa683fc1be7fdcd9687635151544d992cccd48892dc5e0a5885a29/yarl-1.17.1.tar.gz", hash = "sha256:067a63fcfda82da6b198fa73079b1ca40b7c9b7994995b6ee38acda728b64d47", size = 178163 }
|
||||||
wheels = [
|
wheels = [
|
||||||
@@ -939,7 +950,7 @@ name = "ytmusicapi"
|
|||||||
version = "1.8.2"
|
version = "1.8.2"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "requests" },
|
{ name = "requests", marker = "python_full_version < '4'" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/28/d2/c94548a3c29cf24a2e5c85cd95e86b1808803882b7835c37bfeab1ea9530/ytmusicapi-1.8.2.tar.gz", hash = "sha256:454facdf5907c32b77cb035f54c76d5a9d3fb0316933b1a1cecd06110ff85ecf", size = 284079 }
|
sdist = { url = "https://files.pythonhosted.org/packages/28/d2/c94548a3c29cf24a2e5c85cd95e86b1808803882b7835c37bfeab1ea9530/ytmusicapi-1.8.2.tar.gz", hash = "sha256:454facdf5907c32b77cb035f54c76d5a9d3fb0316933b1a1cecd06110ff85ecf", size = 284079 }
|
||||||
wheels = [
|
wheels = [
|
||||||
|
|||||||
Reference in New Issue
Block a user