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__/
.cache
db
db.db

View File

@@ -8,6 +8,3 @@ router = Router()
@router.startup()
async def startup(bot: Bot):
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),
reply_markup=None
)
await db.occasionally_write()

View File

@@ -98,4 +98,3 @@ async def on_cached_chosen(chosen_result: ChosenInlineResult, bot: Bot,
else:
db.youtube[song_id] = audio.audio.file_id
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),
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
if settings['exact_spotify_search'].value == 'yes':
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:
db.recoded[song.id] = audio.message_id
await db.occasionally_write()

View File

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

View File

@@ -1,13 +1,4 @@
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):
@@ -22,10 +13,3 @@ class Db(object):
self.youtube = DBDict('youtube')
self.soundcloud = DBDict('soundcloud')
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 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):
def __init__(self, tablename: str):
super().__init__(DB, 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')
)
super().__init__(config.local.db_path, tablename=tablename, autocommit=True)

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/
import warnings
import re
import hashlib
@@ -64,11 +64,13 @@ class ChunkDecrypter:
@classmethod
def from_track_id(cls, track_id: str):
cipher = Cipher(
algorithms.Blowfish(get_blowfish_key(track_id)),
modes.CBC(bytes([i for i in range(8)])),
default_backend()
)
with warnings.catch_warnings():
warnings.filterwarnings("ignore")
cipher = Cipher(
algorithms.Blowfish(get_blowfish_key(track_id)),
modes.CBC(bytes([i for i in range(8)])),
default_backend()
)
return cls(
cipher=cipher

View File

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

View File

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

View File

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