Raddzor788, в func делается print 2 раза: сначала в начале функции (до рекурсии), потом в конце функции (после рекурсии). В итоге каждая функция при значениях x меньше 4 делает два print, вставляя посередине рекурсию. Итог вполне очевиден.
Дмитрий Кузнецов, один из простейших способов - детектить, что пользователь подключается из сети хостера. Это обойти можно только через использование малоизвестного хостера либо через VPN не у хостера, а у обычного пользователя либо у организации из нужной страны.
rPman, для того, чтобы с помощью debootstrap что-то адекватное собрать, нужно всё-таки некий багаж знаний и навыков. Иначе проще всё то же самое в докере и намного быстрее.
https://t.me/uxfromhell/714
Не знаю уж насчёт того, схоже ли отношение к поисковой выдаче с отношением к списку писем, но среди меня шансы на открытие таких ссылок точно будут сильно понижены.
Bot API нельзя использовать для рассылки сообщений пользователям по имени. Только для ответа явно написавшим входящее сообщение. Там специально всё так продумано, чтобы использовать API как канал неконтролируемого спама было невозможно.
Ну вот можно оформить вызов bot.get_chat_member в отдельную функцию и вызывать её в начале методов бота.
Недостаток - будет слишком много вызовов этого метода. Можно их кэшировать для оптимизации, в том числе сохраняя в базу и обновляя время от времени, но поначалу и так сойдёт.
Можно даже исхитриться и сделать декоратор, тогда можно писать что-то типа:
@dp....
@check_subscription
def some_handler(...)
чтобы это делалось красиво без написания лишнего кода.
В целом, можно не особо сложно к любой CMS приладить аудиофайлы к контентным страницам. И прослушивание с помощью тэга audio. Можно вместо готовой CMS взять какой-нить фреймворк, хоть django, и дописать необходимый функционал самому.
Но можно и готовые решения типа jellyfin использовать. Правда, у них ниша немного другая.
Александр +, зачем вообще всё это нужно? Весь смысл наследования в ООП как раз в том состоит, что дочерний класс обладает всеми свойствами родительского. Не нужно специально генерировать экземпляр родительского, можно просто обращаться к именам и методам дочернего.
А если методы или семантика полей дочернего перепреоделены, то это верный признак того, что что-то делается неправильно и не по делу.
Если дело только в сериализации, то можно сделать отдельный метод типа dump_as_bookshelref(), который вернёт только нужную информацию и не вернёт ненужную.