pogodastatusbar
Возвращение плагина PogodaStatusBar
У меня есть традиция — время от времени чинить мой старенький и порядком уже поднадоевший мне плагин для редактора «Саблайм 3». Плагин называется PogodaStatusBar, потому что он
Эпоха бесплатных сервисов кончилась и «Яндекс» постепенно стал закрывал все те ходы, которыми я пользовался, чтобы получать эти данные. Я искал новые,
Всё нормально работало,
После новогоднего отдыха появились время и силы и я решил их часть израсходовать на плагин.
Надо сказать, что я не знаю как правильно отлаживать плагины в «Саблайме». В документации ничего не нашёл, поэтому написал небольшую обвязку и запускаю свой плагин просто из командной строки. Но в этот раз этот способ не сработал — в обвязке плагин работал, а внутри «Сайблайма» — нет.
Я уже с таким сталкивался. У «Саблайма» внутри две версии «Пайтона» — 3.3 и 3.8. Обе,
Таким образом между «Пайтоном» у меня в командной строке и внутри «Сайблайма» — десять версий. Иногда я использую в коде
И вот непонятно как об этом узнавать. Можно, думаю, раздобыть старенький «Пайтон» в контейнере, но лень.
Обычно я просто пристально смотрю на код, пока не понимаю как его исправить. А в этот раз так не вышло. Мне несколько раз казалось, что я понимаю в чём дело, я коммитил новый код, собирал релиз, дожидался, пока тулчейн репозитория плагинов «Саблайма» увидит новую версию, обновлялся и не получал положительного результата.
В итоге, мне это надоело. Я нашёл в какой папке «Саблайм» держит плагины, они там лежат, к слову, в архивированном виде, и попытался подсунуть туда свой код — паковал папку с модифицированным кодом и заменял файл плагина. Но гадкий «Саблайм»
С этим я опять поленился разбираться, вместо этого попытался отредактировать код прямо в архиве через консольный файловый менеджер mc. Неожиданно это сработало. Так я узнал, что ошибка была в том, что я использую вызов html.unescape, который появился только в «Пайтоне» 3.4. Пришлось заменить его на вполне устроивший меня в этом месте replace('"', '"') и всё заработало.
Опять чинил PogodaStatusBar
Сегодня участвовал в довольно скучной видеоконференции. Моё участие там было хоть и необходимое, но небольшое. А чтобы не одуреть от безделья, пока я слушал всю эту скуку, решил
Плагин в строке статуса показывает текущую погоду и пробки в вашем городе. Много лет данные для этого я брал с неофициального урла «Яндекса», но компания решила коммерциализировать погоду и, сколько я не искал новый способ получить её бесплатно, так и не нашёл.
Пробки, кстати, тоже перестали нормально работать.
Я перебрал несколько малоизвестных сервисов, пока, наконец, не увидел, что страница yandex.ru/tune/geo/ содержит в себе необходимый номер. Этого хватило, чтобы починить показ пробок.
С «Гисметео» пришлось повозиться. Не нашёл официальную информацию
Определить номер города в формате «Гисметео» помогает сервис www.gismeteo.ru/rmq/search/{название}/1/, куда я подставляю название, полученное от «Яндекс.Пробок» — там он возвращается вместе с остальными данными.
Оставалось только расшифровать иконку погоды. В документации есть часть описания (остаток можно понять, скачав с «Гисметео» значки погоды), выглядит всё несложно. Например, d.r3 означает «день» (day) и «дождь максимальной интенсивности» (rain 3).
Поскольку у меня Юникод, в нём есть не все необходимые значки, я сделал вот такой объект, содержащий признаки, которые позволяют мне выбрать какую иконку показать:
_icons = {
"🌞": {"d"}, # day
"🌙": {"n"}, # nite
"☁️": {"n", "c"}, # night, cloud
"🌧": {"rs", "c", "r"}, # rain+snow, cloud, rain
"🌤": {"d", "c"}, # day, cloud
"🌦": {"d", "r"}, # day, rain
"🌩️": {"c", "st"}, # #day, storm
"⛈️": {"c", "st", "r"}, # cloud, storm, rain
"🌨": {"c", "s"}, # cloud, storm
"💨": {"mist"}, # mist
"⚡️": {"st"}, # storm
}И вот такой простой алгоритм для выбора иконки:
def _getStatus(self, coded_weather):
codes = {x.strip("0123456789") for x in coded_weather.split(".")}
max_icon = None
max_score = 0
for icon, code in self._icons.items():
result = codes & code
score = sum(len(x) for x in result)
if score > max_score:
max_icon, max_score = icon, score
return max_iconИдея простая — чем больше значков совпало, тем лучше; если совпал значок с более длинным названием (st, mist), считаем его более конкретным и важным.
Починил PogodaStatusBar
Обратил внимание, что мой
Пришлось исправить две вещи —
Остался ещё один баг — если «Яндекс» не отдаёт информацию о пробках (в некоторых небольших городах такой информации нет), то плагин работать не будет. Не знаю, стоит ли это править,
Погодный плагин для «Sublime Text» ★
Написал свой первый плагин для «Саблайма» — для отображения в строке состояния погоды и пробок «Яндекса». Заодно немного повспоминал «Пайтон», давно на нём ничего не писал.
Удивительно, но факт — другого работоспособного плагина на эту тему не обнаружилось. Единственный конкурент использует старое АПИ «Яху», которое уже не работает, потому не работает и плагин.
Отдельное спасибо «Яндексу» за то, что их АПИ умеет определять текущее местоположение — ничего задавать в конфиге не надо, удобно.
Поскольку в строке состояния можно выводить только буквы, воспользовался Юникодом для вывода погодных значков, для уровня пробок не нашлось ничего лучше фруктов, так что индикатором загруженности дорог у меня служат зелёное яблоко, жёлтый лимон и красный помидор. Не знаю будут ли видны эти символы пользователям Линукса или Виндоуза, мне негде посмотреть.
Пришлось повозиться с АПИ самого «Саблайма».
В настройках есть шаблон вывода, можно убрать пробки или погоду, если они не нужны.
Подал пул реквест на включение в саблаймовский пакетный менеджер, но особо упорствовать не буду, если откажут.