Forwarded from 14:36 (🇰irill Grinchu🇰)
Ладно, можете кидать свои результаты в @grinrillik
У меня, например, 94 с половиной
У меня, например, 94 с половиной
Представляете, когда я начинал деволопить бота для яндух музыки, то знал только об одном, а тут оказывается еще один есть! Умеет в загрузку треков, поиск и вообще активно живёт в чатиках, а не в личке, а ещеее, а еще у него есть классная фича, о которой я уже думал в связи с отправой войсов в чатик моего бота. Да-да, распознование треков!
https://t.me/yamdbot
https://t.me/yamdbot
Telegram
Yandex.Music Bot
Неофициальный бот Яндекс.Музыки для загрузки треков.
Unofficial Yandex.Music bot.
Donate: @donate_alowave
Unofficial Yandex.Music bot.
Donate: @donate_alowave
Forwarded from Alowave Dev Blog via @like
This media is not supported in your browser
VIEW IN TELEGRAM
YM Update Beta 0.1.7
- Добавлено распознавание треков
- Добавлено распознавание треков
Marshal's channel
Остыл, теперь можно и рассказать. Дело в том, что я соглашаюсь на все конкурсы, что мне предлагают (в рамках учебного заведения), вот уже третий год. Пару дней назад отказался от очередного, да, возможно чутка поздно заявил об этом, но отказался. Как только…
Обязательно прочитайте прошлый пост!
Ну что же. Продолжение... Тогда я принял участие в каком-то там этапе, да. Всё же не предупредил заранее, а только в последние дни. Ок, пошел просто, не собирался напрягаться. Просто сидел, чиллил и делал по тиху, надеясь на то, что у других ребят выйдет больше. Ушел минут за 20 до конца, когда поставил определенную точку в прогрессе и понимал, что след. фичу уже делать времени нет. Всё это вообще не суть, я занял первое место, к сожалению.
И вот пошла речь о республике, я вновь (еще до НГ) сказал, что не буду принимать участие. Мне сообщили, что после НГ поговорим. Поговорили... Сегодня...
То, что там опять говорили про мою обязанность уже писать не буду. Просто запишу мелкими (постараюсь) пунктами.
- Как я не пытался объяснить, что мне нафиг не нужен C#, WPF, Entity Framework, что я ПИТОНИСТ - администрация ни в какую не понимает.
- Продолжают рассказывать как могут послать в жопу при распределении и что на вызов меня с компании всем будет насрать (я уже думаю о выплате средств).
- Не хотят рассматривать другие кандидатуры (2 и 3 место), хотя я топлю за этих ребят и им это надо больше, чем мне. Да и C# это их, прокачают себя, что есть хорошо.
- Завтра нужно дать ответ, ибо будут отправлять какой-то там индивидуальный план по подготовки учащегося и уж очень хотят вписать мою фамилию туда.
- Завтра дать ответ, а только в 20х числах сообщат конкретно, что будет за стэк технологий. Поговаривают, что там вообще добавится 1С, а по скорости разработки понятно что будет лидировать. Ну уж в это говнище я лезть не буду! Т.е. мне ща надо согласиться на хрен пойми что!
- В прошлом сообщении я там за принцип сказал, но чета опять на меня давят, а мне бы дожить до выпуска отсюда. Тогда я был на эмоциях, да и сейчас. В общем, я допускаю, что забью на то, что написал в конце.
Теперь посмотрим чутка с другой стороны.
- Я работаю не только на работе, но и над личными проектами. Если сюда еще влетит этот бесполезный C#, то спать я буду еще меньше, а пар пропускать больше. Поэтому я намекнул им на поблажку в посещении пар.
- Если подготовлюсь и выиграю (опыт, да и всё для этого есть, кроме желания), то имею шанс попасть в банк талантливой молодежи Беларуси.
- Зачем мне этот банк? Проскочила инфа, что скоро примут закон (как раз до моего призыва), что тех, кто в этом банке, не будут призывать в армию. К сожалению, это пока только проект и даже не закон. Инфы в интернете не нашел, риск на это надеяться трында какой!
Не знаю, очень скверно. В деревню по расределению попасть не хочу, за шанс избавиться от армии (хоть и временно) нужно браться. Не хочу учить говно бесполезное на один раз. Я шо, шлюпка? Да и в целом представлять это УО уже желания нет (ибо им плевать на моё мнение и заботятся только о своей репутации)
А, еще. Если согласиться, тип, "чего тебе стоит?", то это надо готовиться, учить. Не могу просто взять и поехать с нифига (я так сделал два года назад и сказал, что больше так не поступлю).
UPD. Если попасть в банк, то опять не останут. Дальше мучать будут. Отправят на межнар
Айда опросик?
Ну что же. Продолжение... Тогда я принял участие в каком-то там этапе, да. Всё же не предупредил заранее, а только в последние дни. Ок, пошел просто, не собирался напрягаться. Просто сидел, чиллил и делал по тиху, надеясь на то, что у других ребят выйдет больше. Ушел минут за 20 до конца, когда поставил определенную точку в прогрессе и понимал, что след. фичу уже делать времени нет. Всё это вообще не суть, я занял первое место, к сожалению.
И вот пошла речь о республике, я вновь (еще до НГ) сказал, что не буду принимать участие. Мне сообщили, что после НГ поговорим. Поговорили... Сегодня...
То, что там опять говорили про мою обязанность уже писать не буду. Просто запишу мелкими (постараюсь) пунктами.
- Как я не пытался объяснить, что мне нафиг не нужен C#, WPF, Entity Framework, что я ПИТОНИСТ - администрация ни в какую не понимает.
- Продолжают рассказывать как могут послать в жопу при распределении и что на вызов меня с компании всем будет насрать (я уже думаю о выплате средств).
- Не хотят рассматривать другие кандидатуры (2 и 3 место), хотя я топлю за этих ребят и им это надо больше, чем мне. Да и C# это их, прокачают себя, что есть хорошо.
- Завтра нужно дать ответ, ибо будут отправлять какой-то там индивидуальный план по подготовки учащегося и уж очень хотят вписать мою фамилию туда.
- Завтра дать ответ, а только в 20х числах сообщат конкретно, что будет за стэк технологий. Поговаривают, что там вообще добавится 1С, а по скорости разработки понятно что будет лидировать. Ну уж в это говнище я лезть не буду! Т.е. мне ща надо согласиться на хрен пойми что!
- В прошлом сообщении я там за принцип сказал, но чета опять на меня давят, а мне бы дожить до выпуска отсюда. Тогда я был на эмоциях, да и сейчас. В общем, я допускаю, что забью на то, что написал в конце.
Теперь посмотрим чутка с другой стороны.
- Я работаю не только на работе, но и над личными проектами. Если сюда еще влетит этот бесполезный C#, то спать я буду еще меньше, а пар пропускать больше. Поэтому я намекнул им на поблажку в посещении пар.
- Если подготовлюсь и выиграю (опыт, да и всё для этого есть, кроме желания), то имею шанс попасть в банк талантливой молодежи Беларуси.
- Зачем мне этот банк? Проскочила инфа, что скоро примут закон (как раз до моего призыва), что тех, кто в этом банке, не будут призывать в армию. К сожалению, это пока только проект и даже не закон. Инфы в интернете не нашел, риск на это надеяться трында какой!
Не знаю, очень скверно. В деревню по расределению попасть не хочу, за шанс избавиться от армии (хоть и временно) нужно браться. Не хочу учить говно бесполезное на один раз. Я шо, шлюпка? Да и в целом представлять это УО уже желания нет (ибо им плевать на моё мнение и заботятся только о своей репутации)
А, еще. Если согласиться, тип, "чего тебе стоит?", то это надо готовиться, учить. Не могу просто взять и поехать с нифига (я так сделал два года назад и сказал, что больше так не поступлю).
UPD. Если попасть в банк, то опять не останут. Дальше мучать будут. Отправят на межнар
Айда опросик?
Я хотел начать орать, но рано. Тип яндух сохраняет и отдает не экранированные данные, а потом вспомнил, ШО ТАК И НАДО!
Знаете же какая лучшая практика против XSS всяких? Экранировать при ВЫВОДЕ, а не ВВОДЕ!
Почему? Да потому что если выйдет найти место без фильтра на ввод (ну или тупо в базу запись вставить), то пассивная XSS начнёт работать везде, где есть вывод этих данных.
С другой стороны, такой подход обязывает всех использующих API экранировать у себя локально и вероятность того, что где-нить прогер забудет это сделать высока.
Короче я бы зарофлил и пошёл фигачить ХСС в приложухи яндуха)0))
UPD. Они в своих прилах вообще юзают HTML вставки для банеров там всяких и прочей лабуды)))
UPD2. Норм люди обёртку над выводом пилят, я тоже адекватным стараюсь быть
Держите еще ссылку на вики шо это, некоторым полезно Межсайтовый скриптинг
Знаете же какая лучшая практика против XSS всяких? Экранировать при ВЫВОДЕ, а не ВВОДЕ!
Почему? Да потому что если выйдет найти место без фильтра на ввод (ну или тупо в базу запись вставить), то пассивная XSS начнёт работать везде, где есть вывод этих данных.
С другой стороны, такой подход обязывает всех использующих API экранировать у себя локально и вероятность того, что где-нить прогер забудет это сделать высока.
Короче я бы зарофлил и пошёл фигачить ХСС в приложухи яндуха)0))
UPD. Они в своих прилах вообще юзают HTML вставки для банеров там всяких и прочей лабуды)))
UPD2. Норм люди обёртку над выводом пилят, я тоже адекватным стараюсь быть
Держите еще ссылку на вики шо это, некоторым полезно Межсайтовый скриптинг
text = TextBuilder()Сойдёёёёт, так давно с
text.add(f'Моя музыка')
text.add('<b>{display_name}</b>', display_name=context.client.account.display_name)
def add(self, line='', **values):
escaped_values = {key: escape(value) for key, value in values.items()}
.format не работал, ужас.escape из пакета htmlИ тут я понял, что не шарю вообще за ООП, особенно в питоне. Или спать уже хочу. Кооороооочеее
Хочу замутить несколько синглтон классов (3). Возьмем изи пример:
Если вынести выше и унаследоваться, то каждый класс будет юзать один экземляр родителя и будет полная белеберда. У всех будет доступ к инстансу обобщённого класса-родителя, а не текущего класса
UPD. Офигенно объяснил. Короче поле
Хочу замутить несколько синглтон классов (3). Возьмем изи пример:
class Singleton:
__singleton = None
@classmethod
def get_instance(cls):
if cls.__singleton is not None:
return cls.__singleton
else:
raise RuntimeError(f'{cls.__name__} not initialized')
Вооопрооос, если я хочу несколько синглтон классов и не хочу дублировать get_instance в каждом из нём, то как обобщить? Если вынести выше и унаследоваться, то каждый класс будет юзать один экземляр родителя и будет полная белеберда. У всех будет доступ к инстансу обобщённого класса-родителя, а не текущего класса
UPD. Офигенно объяснил. Короче поле
__singleton будет иметь общее значение у всех классов, что унаследовались от Singleton
UPD2. Ну точнее как, get_instance будет возвращать общее поле родителя, а не текущего класса. А как сделать так, чтоб с текущего класса( не хооочууу в каждом классе get_instance иметь(
Marshal's channel
И тут я понял, что не шарю вообще за ООП, особенно в питоне. Или спать уже хочу. Кооороооочеее Хочу замутить несколько синглтон классов (3). Возьмем изи пример: class Singleton: __singleton = None @classmethod def get_instance(cls): …
Что-то я уснул по щелку пальцев без задней мысли об этом, утром начали приходить нотификейты, разбудившие меня. Увлекательно предисловие.
Это мне писали "нафига тебе аж 3 синглтона?".
Мне что-то в голову ударило, что создать класс и там в полях инициализировать свои сервисы (которые я хотел переделать на синглтон) и потом шарить один экземляр этого класса с сервисами на всё приложение не оч хорошо.
Надо доразобраться с DI
UPD. Собсна видос покрывает чуть ли не всё, что надо знать.
Dependency Injection - Jakob Jenkov
Пока без понятия как более правильно такое делать в питоне и делают ли. Вон кто-то аж либу юзает: Inject - PyPi, которая в своём описании "тонко" намекает
Это мне писали "нафига тебе аж 3 синглтона?".
Мне что-то в голову ударило, что создать класс и там в полях инициализировать свои сервисы (которые я хотел переделать на синглтон) и потом шарить один экземляр этого класса с сервисами на всё приложение не оч хорошо.
class Services:
def __init__(track_watcher=TrackWatcher()):
self.track_watcher = track_watcher
services = Services()
А потом где надо from services import services
services.track_watcher.subscribe(update, context, track)
Когда мне сказали, что это Dependency injection - я ушёл гуглить. То, что нагуглил, вроде подходит под моё. Можно не переписывать ✨Надо доразобраться с DI
UPD. Собсна видос покрывает чуть ли не всё, что надо знать.
Dependency Injection - Jakob Jenkov
Пока без понятия как более правильно такое делать в питоне и делают ли. Вон кто-то аж либу юзает: Inject - PyPi, которая в своём описании "тонко" намекает
the python way, the good wayYouTube
Dependency Injection
Dependency injection is a design technique where dependencies are injected into an object from the outside, instead of being created by the object itself on the inside. A dependency is an object that is needed by another object for that object to do its job.…
Навигация
Так как в тележке можно редачить древние сообщения, то можно завести сборник постов. Там где не просто круги рисовать, покекать, а почитать что-то можно.
- CORS в FF
- Узнаем откуда отбрэнчевались (не всегда правильно выводит)
- Какие-то вкусности с спринта на работе (Джанго)
- Моя статейка на Habr'e после конкурса "IT-Планета"
- Офигенно-годные подкасты с англ фразами на яндух музыке (больше 900 шт)
- Докер и его кэша всякие
- Моё знакомство с GitHub Actions
- Про Headless CMS
- Очепчятка в янух апи
- Офигел с алхимии
- Разобрался когда документ должен быть встроенным, а когда нет (MongoDB)
- Эмоции после перехода на MongoDB
- Счастливый я с 100+ звёздами на GitHub'e у моей либы
- Про бинарные данные, передачу их в JSON, размер utf-8
- О самозагруженных треках в яндух музыке
- Немного о проблеме бота, которую я потом пытался решить (причины проблемы)
- Юзаем последний PyPy на Heroku
- Мой кэш запросов для API Яндекс.Музыки в ТГ боте
- PyPy, тайп хинты, жирные запросы у яндуха, моя вторая статья на Habr'e
- Про новую версию pytest и как засаппортить python3.6
- Вся активность на гитхабе за 2019 с приватными репами
- Мои итоги 2019 года
- Репорт бага в Telegram Desktop в URI
- XSS, не эскейпнутые данные у яндуха
- Dependency Injection
- Статистика и аналитика для ботов на примере бота Яндекс.Музыки и сервиса Chatbase.
Так как в тележке можно редачить древние сообщения, то можно завести сборник постов. Там где не просто круги рисовать, покекать, а почитать что-то можно.
- CORS в FF
- Узнаем откуда отбрэнчевались (не всегда правильно выводит)
- Какие-то вкусности с спринта на работе (Джанго)
- Моя статейка на Habr'e после конкурса "IT-Планета"
- Офигенно-годные подкасты с англ фразами на яндух музыке (больше 900 шт)
- Докер и его кэша всякие
- Моё знакомство с GitHub Actions
- Про Headless CMS
- Очепчятка в янух апи
- Офигел с алхимии
- Разобрался когда документ должен быть встроенным, а когда нет (MongoDB)
- Эмоции после перехода на MongoDB
- Счастливый я с 100+ звёздами на GitHub'e у моей либы
- Про бинарные данные, передачу их в JSON, размер utf-8
- О самозагруженных треках в яндух музыке
- Немного о проблеме бота, которую я потом пытался решить (причины проблемы)
- Юзаем последний PyPy на Heroku
- Мой кэш запросов для API Яндекс.Музыки в ТГ боте
- PyPy, тайп хинты, жирные запросы у яндуха, моя вторая статья на Habr'e
- Про новую версию pytest и как засаппортить python3.6
- Вся активность на гитхабе за 2019 с приватными репами
- Мои итоги 2019 года
- Репорт бага в Telegram Desktop в URI
- XSS, не эскейпнутые данные у яндуха
- Dependency Injection
- Статистика и аналитика для ботов на примере бота Яндекс.Музыки и сервиса Chatbase.
Большое спасибо @olegkovalov за публикацию в подборке каналов в @oleg_log! Вас сейчас уже приличное количество, но, надеюсь, меня это никак не смутит. Поэтому я в очередной раз выкладываю ночную какулю, а утром смотрю на неё и чуть что исправляю ✨
Я из принципа уже не хочу хранить callback дату инлайн кнопок в монго. Продолжаю страдать с бинарными данными.
Раньше было так: указывался формат, по нему шла распаковка. Всё жестко ограничено до безобразия. Из-за этого я не мог поддерживать самозагруженные треки (ибо они у яндуха UUID, а не просто ID). Т.е. формат был
Поэтому, было решено чутка улучшить encode&decode данных:
1. Добавить поддержку строк (для UUID'a).
2. Распаковывать динамически (если есть еще байты, то брать слайс по размеру последнего формата и анпакать).
Решения вродь классные, но то, что вышло, мне особо не нрав (код ниже).
Вышло так, что строки оказались заифаны. Столкнулся с проблемой указания их длины. Вариантов так-то не много.
1. Указать длину перед строкой. Так-то да, но какие-то манипуляции с тем, что мы распаковали число, а это оказалось не часть данных которую надо будет передать дальше, а часть формата. Лабуда. Хотя, если принять
2. Паковать строку без указания длинны. Распаковка тогда от первой встреченной
С продолжением формата всё понятно вродь. Я заюзал итератор по формату, с дефолтным значением на последний элемент, чтобы продлить его. Храню текущую позицию и прибавляю к ней
В общем пока писал пост, уже понял, что надо переписывать строки на указание длины.
А еще я уже потерял весь смысл от этих байтов, нафига (вообще интересно :D)? Просто бы положил в кнопку да и не парился. Раньше было необходимо, чтобы влезть в огрань телеги (64 байта utf-8 в callback дату кнопки влазит) , а сейчас я всё у себя кэширую и мне не надо много хранить у клиента, так, пару чиселок, юидик один
Я из принципа уже не хочу хранить callback дату инлайн кнопок в монго. Продолжаю страдать с бинарными данными.
Раньше было так: указывался формат, по нему шла распаковка. Всё жестко ограничено до безобразия. Из-за этого я не мог поддерживать самозагруженные треки (ибо они у яндуха UUID, а не просто ID). Т.е. формат был
l, а для UUID'a надо s в определённое кол-во символов (36?). Более того, из-за жесткой прописи формата "пакета" я не мог передавать неопределённое кол-во тех же треков. Из-за этого на последних страницах плейлиста (при пагинации ведь округляем вверх), отсутствовала кнопка "скачать текущую страницу". Списал это на фичу, хотя был костыль. Ибо в кнопке хранились все 7 ID'ов треков (на одной странице столько) и никак не меньше!Поэтому, было решено чутка улучшить encode&decode данных:
1. Добавить поддержку строк (для UUID'a).
2. Распаковывать динамически (если есть еще байты, то брать слайс по размеру последнего формата и анпакать).
Решения вродь классные, но то, что вышло, мне особо не нрав (код ниже).
Вышло так, что строки оказались заифаны. Столкнулся с проблемой указания их длины. Вариантов так-то не много.
1. Указать длину перед строкой. Так-то да, но какие-то манипуляции с тем, что мы распаковали число, а это оказалось не часть данных которую надо будет передать дальше, а часть формата. Лабуда. Хотя, если принять
ls за пару и никак иначе, то вроде ничего так.2. Паковать строку без указания длинны. Распаковка тогда от первой встреченной
s до конца. Сразу к минусам этого способа: нельзя указать несколько строк, нельзя вообще что-либо передать после s. UPD. На самом деле можно, идя с конца, зная форматы и их размер, но тогда только одна s может быть.С продолжением формата всё понятно вродь. Я заюзал итератор по формату, с дефолтным значением на последний элемент, чтобы продлить его. Храню текущую позицию и прибавляю к ней
step, где step - это calcsize() формата, что продлил.В общем пока писал пост, уже понял, что надо переписывать строки на указание длины.
А еще я уже потерял весь смысл от этих байтов, нафига (вообще интересно :D)? Просто бы положил в кнопку да и не парился. Раньше было необходимо, чтобы влезть в огрань телеги (64 байта utf-8 в callback дату кнопки влазит) , а сейчас я всё у себя кэширую и мне не надо много хранить у клиента, так, пару чиселок, юидик один