Update deps versions, minor spotify fix, removed db sync, suppress deprecationwarning

This commit is contained in:
hhh
2024-07-03 20:49:10 +03:00
parent 9b47a74523
commit f26bc7429a
16 changed files with 19 additions and 254 deletions

2
.gitignore vendored
View File

@@ -7,4 +7,4 @@ config.toml
*/__pycache__/ */__pycache__/
.cache .cache
db db.db

View File

@@ -8,6 +8,3 @@ router = Router()
@router.startup() @router.startup()
async def startup(bot: Bot): async def startup(bot: Bot):
print(f'[green]Started as[/] @{(await bot.me()).username}') print(f'[green]Started as[/] @{(await bot.me()).username}')
from bot.modules.database import pull
await pull()

View File

@@ -36,5 +36,3 @@ async def on_new_chosen(chosen_result: ChosenInlineResult, bot: Bot):
media=InputMediaAudio(media=audio.audio.file_id), media=InputMediaAudio(media=audio.audio.file_id),
reply_markup=None reply_markup=None
) )
await db.occasionally_write()

View File

@@ -98,4 +98,3 @@ async def on_cached_chosen(chosen_result: ChosenInlineResult, bot: Bot,
else: else:
db.youtube[song_id] = audio.audio.file_id db.youtube[song_id] = audio.audio.file_id
db.recoded[song_id] = True db.recoded[song_id] = True
await db.occasionally_write()

View File

@@ -35,5 +35,3 @@ async def on_new_chosen(chosen_result: ChosenInlineResult, bot: Bot):
media=InputMediaAudio(media=audio.audio.file_id), media=InputMediaAudio(media=audio.audio.file_id),
reply_markup=None reply_markup=None
) )
await db.occasionally_write()

View File

@@ -156,5 +156,3 @@ async def on_new_chosen(chosen_result: ChosenInlineResult, bot: Bot,
db.recoded[yt_song.id] = audio.message_id db.recoded[yt_song.id] = audio.message_id
if settings['exact_spotify_search'].value == 'yes': if settings['exact_spotify_search'].value == 'yes':
db.recoded[song.id] = audio.message_id db.recoded[song.id] = audio.message_id
await db.occasionally_write()

View File

@@ -79,5 +79,3 @@ async def on_new_chosen(chosen_result: ChosenInlineResult, bot: Bot,
) )
else: else:
db.recoded[song.id] = audio.message_id db.recoded[song.id] = audio.message_id
await db.occasionally_write()

View File

@@ -1,7 +1,6 @@
from .db import Db from .db import Db
from .pull_db import pull
db = Db() db = Db()
__all__ = ['db', 'pull'] __all__ = ['db']

View File

@@ -1,13 +1,4 @@
from .db_model import DBDict from .db_model import DBDict
import os.path
from bot.utils.config import config
from random import randint
DB = os.path.join(config.local.db_path, 'db')
if not os.path.isfile(DB):
open('sync', 'w')
class Db(object): class Db(object):
@@ -22,10 +13,3 @@ class Db(object):
self.youtube = DBDict('youtube') self.youtube = DBDict('youtube')
self.soundcloud = DBDict('soundcloud') self.soundcloud = DBDict('soundcloud')
self.recoded = DBDict('recoded') self.recoded = DBDict('recoded')
async def write(self):
await self.config.write()
async def occasionally_write(self, chance: int = 5):
if randint(1, chance) == 1:
await self.write()

View File

@@ -1,49 +1,7 @@
from sqlitedict import SqliteDict from sqlitedict import SqliteDict
from bot.utils.config import config from bot.utils.config import config
from aiogram.types import FSInputFile, InputMediaDocument
from aiogram import exceptions
from pydantic import ValidationError
import time
from .meta import DBMeta
import os.path
DB = os.path.join(config.local.db_path, 'db')
DB_CHAT = config.telegram.db_chat
class DBDict(SqliteDict): class DBDict(SqliteDict):
def __init__(self, tablename: str): def __init__(self, tablename: str):
super().__init__(DB, tablename=tablename, autocommit=True) super().__init__(config.local.db_path, tablename=tablename, autocommit=True)
async def write(self):
from bot.common import bot
try:
DBMeta().update_time = time.time_ns()
await bot.edit_message_media(
media=InputMediaDocument(media=FSInputFile(DB)),
chat_id=DB_CHAT,
message_id=DBMeta().message_id
)
await bot.edit_message_caption(
caption=str(DBMeta()),
chat_id=DB_CHAT,
message_id=DBMeta().message_id
)
except (ValidationError, exceptions.TelegramBadRequest):
DBMeta().update_time = time.time_ns()
self['db_message_id'] = (
await bot.send_document(
chat_id=DB_CHAT, document=FSInputFile(DB),
disable_notification=True
)
).message_id
DBMeta().message_id = self['db_message_id']
await bot.edit_message_caption(
caption=str(DBMeta()),
chat_id=DB_CHAT, message_id=self.get('db_message_id')
)

View File

@@ -1,109 +0,0 @@
import os.path
from bot.utils.config import config
from aiogram.exceptions import TelegramBadRequest
import asyncio
from typing import Coroutine
loop = asyncio.get_event_loop()
DBMETA = os.path.join(config.local.db_path, 'dbmeta')
APP_ID = config.local.app_id
DB_CHAT = config.telegram.db_chat
def meta_property(prop_name):
def getter(self):
return self[prop_name]
def setter(self, value):
self[prop_name] = value
return property(getter, setter)
class DBMeta:
app_id = meta_property('app_id')
message_id = meta_property('message_id')
update_time = meta_property('update_time')
def __init__(self):
if not os.path.isfile(DBMETA):
open(DBMETA, 'w').write(f'{APP_ID}|None|0')
def __getitem__(self, item):
try:
return open(DBMETA).read().split('|')[{
"app_id": 0,
"message_id": 1,
"update_time": 2
}.get(item)]
except TypeError:
return None
def __setitem__(self, key, value):
meta = open(DBMETA).read().split('|')
meta[{
"app_id": 0,
"message_id": 1,
"update_time": 2
}[key]] = value
open(DBMETA, 'w').write('|'.join(str(x) for x in meta))
def __str__(self):
return open(DBMETA).read()
def cloud_meta_property(self, prop_name):
async def getter():
return await self.get(prop_name)
return getter()
class CloudMeta:
def __init__(self):
def prop_generator(name) -> Coroutine:
return cloud_meta_property(self, name)
self.app_id = prop_generator('app_id')
self.message_id = prop_generator('message_id')
self.update_time = prop_generator('update_time')
@staticmethod
async def get(item):
from bot.common import bot
try:
if not DBMeta().update_time or not bot.cloudmeta_message_text:
raise AttributeError
except AttributeError:
try:
message = await bot.forward_message(
DB_CHAT, DB_CHAT,
DBMeta().message_id
)
bot.cloudmeta_message_text = message.caption
await message.delete()
except TelegramBadRequest:
print('Cannot get CloudMeta - writing DBDict')
from .db_model import DBDict
await DBDict('config').write()
message = await bot.forward_message(
DB_CHAT, DB_CHAT,
DBMeta().message_id
)
bot.cloudmeta_message_text = message.caption
await message.delete()
cloudmeta = bot.cloudmeta_message_text.split('|')
return cloudmeta[{
"app_id": 0,
"message_id": 1,
"update_time": 2
}.get(item)]

View File

@@ -1,60 +0,0 @@
import os
from .meta import DBMeta, CloudMeta
from bot.utils.config import config
from sqlitedict import SqliteDict
DB = os.path.join(config.local.db_path, 'db')
DB_CHAT = config.telegram.db_chat
async def pull():
from bot.common import bot
if DBMeta().message_id == 'None':
from . import db
print('No dbmeta file')
if msg_id := db.config.get('db_message_id'):
print('Found message id in in-db config')
DBMeta().message_id = msg_id
await db.write()
if not os.path.isfile('sync'):
try:
if not bot.cloudmeta_message_text:
print('Cloudmeta initialized incorrectly')
raise AttributeError
else:
return
except AttributeError:
if int(DBMeta().update_time) >= int(await CloudMeta().update_time):
print('DB is up-to-date')
return
else:
print('Database file is new. Trying to download cloud data')
os.remove('sync')
print('DB is not up-to-date')
message = await bot.forward_message(DB_CHAT, DB_CHAT, DBMeta().message_id)
await message.delete()
await bot.download(
message.document,
destination=DB + 'b'
)
from . import db
for table in db.__dict__.keys():
new_table = SqliteDict(DB + 'b', tablename=table)
for key in new_table.keys():
if key is not None:
try:
getattr(db, table)[key] = new_table[key]
except Exception as e:
assert e
new_table.close()
await db.write()
print('Synced')

View File

@@ -1,5 +1,5 @@
# https://pypi.org/project/music-helper/ # https://pypi.org/project/music-helper/
import warnings
import re import re
import hashlib import hashlib
@@ -64,6 +64,8 @@ class ChunkDecrypter:
@classmethod @classmethod
def from_track_id(cls, track_id: str): def from_track_id(cls, track_id: str):
with warnings.catch_warnings():
warnings.filterwarnings("ignore")
cipher = Cipher( cipher = Cipher(
algorithms.Blowfish(get_blowfish_key(track_id)), algorithms.Blowfish(get_blowfish_key(track_id)),
modes.CBC(bytes([i for i in range(8)])), modes.CBC(bytes([i for i in range(8)])),

View File

@@ -10,7 +10,9 @@ class Spotify(object):
client_credentials_manager=SpotifyClientCredentials( client_credentials_manager=SpotifyClientCredentials(
client_id=client_id, client_id=client_id,
client_secret=client_secret client_secret=client_secret
) ),
backoff_factor=0.1,
retries=10
) )
self.songs = Songs(self.spotify) self.songs = Songs(self.spotify)

View File

@@ -1,11 +1,10 @@
[telegram] [telegram]
bot_token = '' bot_token = ''
db_chat = 0
files_chat = 0 files_chat = 0
admin_id = 0 admin_id = 0
[local] [local]
db_path = 'db/' db_path = 'db.db'
app_id = 'ANY-MUSIC-BOT' app_id = 'ANY-MUSIC-BOT'
[tokens.spotify] [tokens.spotify]

View File

@@ -6,6 +6,8 @@ authors = ["BarsTiger"]
readme = "README.md" readme = "README.md"
[tool.poetry.dependencies] [tool.poetry.dependencies]
wheel = "^0.43.0"
setuptools = "^70.2.0"
python = "^3.11" python = "^3.11"
aiogram = "^3.1.1" aiogram = "^3.1.1"
rich = "^13.6.0" rich = "^13.6.0"
@@ -19,8 +21,8 @@ pydub = "^0.25.1"
aiohttp = "^3.8.6" aiohttp = "^3.8.6"
nest-asyncio = "^1.5.8" nest-asyncio = "^1.5.8"
icecream = "^2.1.3" icecream = "^2.1.3"
m3u8 = "^3.6.0" m3u8 = "^5.1.0"
cryptography = "^41.0.7" cryptography = "^42.0.8"
[build-system] [build-system]