import os import tempfile import requests import sentry_sdk from django.db import models from djconfig import config from telebot import TeleBot from telebot.types import InputMediaPhoto from vk_api import VkApi from vk_api.audio import VkAudio from feeds.models import FeedModuleConfig from feeds.utils import DatabaseConfig def get_vk_photo(attachment): for size in (2560, 1280, 807, 604, 130, 75): if f'photo_{size}' in attachment: return attachment[f'photo_{size}'] return None def get_file(url, session=None): if session is None: session = requests fname = '?'.join(url.split('?')[:-1]) extension = os.path.basename(fname).split('.')[-1] f = tempfile.NamedTemporaryFile(suffix=f'.{extension}' if extension else None) r = session.get(url, stream=True) for chunk in r.iter_content(1024 * 1024): if chunk: f.write(chunk) f.seek(0) return f class VKMusicFeedModuleConfig(FeedModuleConfig): owner_id = models.IntegerField() MODULE_NAME = 'VK music' def execute(self, bot: TeleBot, chat_id, last_id): config._reload_maybe() if last_id is None: last_id = 0 vk_session = VkApi(login=config.vk_username, password=config.vk_password, config=DatabaseConfig, api_version='5.60') if config.russian_proxy_string: vk_session.http.proxies = { 'http': config.russian_proxy_string, 'https': config.russian_proxy_string, } vk_session.auth() vk_audio = VkAudio(vk_session) lst = [] for audio in vk_audio.get_iter(self.owner_id): if audio['id'] > last_id: lst = [audio] + lst else: break for track in lst: f = get_file(track['url'], vk_session.http) bot.send_audio(chat_id, f, duration=track['duration'], performer=track['artist'], title=track['title']) last_id = track['id'] return last_id