Для работы использовал FFMPEG.
Как легкий пример для поста выше.
Как легкий пример для поста выше.
import os
import ffmpeg
class VideoToGifConverter:
def __init__(self, source_dir="video", target_dir="gif", frame_rate=2):
self.source_dir = source_dir
self.target_dir = target_dir
self.frame_rate = frame_rate
os.makedirs(self.source_dir, exist_ok=True)
os.makedirs(self.target_dir, exist_ok=True)
def get_video_files(self):
return [
file_name
for file_name in os.listdir(self.source_dir)
if file_name.lower().endswith(".mp4")
]
def convert_videos_to_gif(self):
video_files = self.get_video_files()
for video_file in video_files:
base_name = os.path.splitext(video_file)[0]
gif_file_name = base_name + ".gif"
input_path = os.path.join(self.source_dir, video_file)
output_path = os.path.join(self.target_dir, gif_file_name)
stream = ffmpeg.input(input_path)
stream = stream.filter("fps", fps=self.frame_rate)
stream = ffmpeg.output(stream, output_path)
ffmpeg.run(stream)
def main():
converter = VideoToGifConverter(source_dir="video", target_dir="gif", frame_rate=2)
converter.convert_videos_to_gif()
if __name__ == "__main__":
main()
❤14🤬9😁2👍1
- авто-комент новых видео на указанных каналах;
- учитывается контекст видео, т.к. производится его загрузка и транскрибация;
- учитывается пользовательский промпт - можно рекламировать что угодно;
- мульти-аккаунт;
- поддержка прокси.
P.S. сегодня делаем стрим с отбором заявок, чи шо?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥35❤9🥰3🤬2
1) Поможет скачать последнюю актуальную версию IDE под ОС пользователя;
2) А также Python из последних актуальных релизов.
Будут и рекомендации по правильной установке.
Страничку с choco я еще заполню командами. Сейчас там уже есть вкладки (медиа, разработка, веб-разработка и т.д.) с командами для экспресс-установки рабочих инструментов. В одну строчку можно установить все те же IDE, Python, Node JS, драйвера, кодеки и даже Steam :D
Пока что так. .exe под Windows мб дам сюда сегодня-завтра.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🤬20👍13🥰8❤4🫡2❤🔥1🔥1🤣1
ReelsMaker.rar
146.7 MB
Кстати, код прикола для создания Reel'сов и видосов для ТикТака, с наложением баннеров, эффектов, очисткой мета-данных, форматом под 9:16 и авто-размытием фона.
Посмотрите, кому интересно. Еще буду дорабатывать.
Посмотрите, кому интересно. Еще буду дорабатывать.
❤🔥31🔥8😢4🙈3👍2🤔1🤯1🤪1
Время на такой 40-секундный ролик, около 2-х минут. То есть, серию Берсерка за час обработать получится. Если у вас по-более VRAM, и карта ПОТУЖНЕЕ, то и результат будет лучше. У меня 2070 Super.
Как вам результат
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤42🤬18🔥10
Поэтому потратил вечер и написал свой собственный десктопный конвертер медиафайлов. Полностью на Python + PyQt6, в качестве ядра - FFMPEG.
Главная цель была — сделать быстро, удобно и без рекламы. Никаких подписок (только на мой канал
- кидаешь файлы пачкой (batch processing);
- удобный Drag & Drop;
- фото к фото, видео к видео — без путаницы;
- работает офлайн, никакой интернет не нужен.
Как и сказал, под капотом трудится всеядный FFmpeg, так что на входе можно "скармливать" ему почти всё что угодно, от старых .flv до профессиональных .mov.
😜 Скачать код тут. Много реакций и соберу в .exe с FFMPEG внутри для обычных, не шарящих работяг.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍80🔥13👏13❤5🤯3👾1
two_claps_open-main.rar
7.4 KB
В проекте две реализации:
- открытие ДОТЫ2;
- запуск голосового ассистена Gemini (нужен API-ключ).
Забавно, можно найти применение.
⚙️ Как это работает:
В основе всего лежит технология обнаружения хлопков в реальном времени. Этот процесс реализован как в Python-скриптах, так и в прототипах на MATLAB:
- захват аудио: скрипты непрерывно слушают аудиопоток с микрофона с частотой дискретизации 44100 Гц. Аудио делится на короткие фрагменты (фреймы) длительностью 20 мс;
- фильтрация: хлопок имеет характерный частотный спектр. Чтобы отсеять посторонние шумы (голос, музыку, звуки улицы), каждый фрейм проходит через полосовой фильтр Баттерворта. Фильтр пропускает только частоты в диапазоне от 1400 Гц до 1800 Гц. К фреймам применяется оконная функция Ханна для сглаживания и уменьшения спектральных искажений;
- детекция пиков: в отфильтрованном сигнале скрипт ищет резкие всплески амплитуды (пики), которые превышают заданный порог (например, 0.2);
- защита от ложных срабатываний: Чтобы один громкий хлопок не был засчитан как два, установлена минимальная задержка между обнаруженными пиками — 0.2 секунды.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰19❤13🗿5😁3🤬2💘1
И главный вопрос:
Что лучше для автоматизации — использовать готовый инструмент типа n8n или писать все с нуля, то есть заниматься ручной разработкой?
n8n — это платформа для визуальной автоматизации. Вы соединяете кубики-«ноды» (приложения и сервисы) между собой, чтобы они обменивались данными и выполняли задачи без вашего участия. Гибко, наглядно и не всегда требует навыков программирования.
Что же выбрать: n8n или код? 🤔
- Скорость — главный приоритет. Собрать рабочий сценарий в n8n можно за минуты, а не за дни или недели;
- Бюджет ограничен. Использование готовых интеграций и визуального конструктора значительно дешевле, чем оплата часов разработчика;
- Задача типовая. Нужно связать популярные сервисы (Telegram, Google Sheets, CRM, Trello)? В n8n для этого уже все готово;
- Нужна гибкость без хардкора. Вы не программист, но хотите иметь возможность легко менять логику процесса.
- Нужна 100% кастомизация. У вас уникальная бизнес-логика, нестандартные API или требования к интерфейсу;
- Требуется максимальная производительность. Для высоконагруженных систем, обрабатывающих тысячи запросов в секунду, кастомный код, написанный под конкретную задачу, будет эффективнее;
- Интеграция очень специфична. Нужно подключить редкий или внутренний корпоративный софт, для которого нет готовых «нод»;
- Полный контроль над кодом и окружением является критически важным в серьезных проектах.
Итог таков: не стоит противопоставлять эти два подхода. Это инструменты для разных задач. Для 60% стандартных кейсов автоматизации n8n будет быстрее, дешевле и проще в поддержке. Например, бот для записи на маникюр, в больницу и т.д.
Для масштабных же проектов, рассчитанных на тысячи пользователей, n8n - это шутка. Где нужна уникальная логика и высокая производительность, — без ручной разработки не обойтись.
#automation #n8n #dev #nocode #tools
Please open Telegram to view this post
VIEW IN TELEGRAM
🤬10👏7❤1👍1😁1
import qrcode
from PIL import Image
def generate_qr_code(data, filename="qr_code.png"):
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
qr.add_data(data)
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
img.save(filename)
return filename
if __name__ == "__main__":
print("Генератор QR-кодов")
input_data = input("Введите текст или ссылку для кодирования в QR-код: ")
output_filename = input("Введите имя файла для сохранения QR-кода (например, my_qr.png) или нажмите Enter для 'qr_code.png': ")
if not output_filename:
output_filename = "qr_code.png"
elif not output_filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):
output_filename += ".png"
saved_file = generate_qr_code(input_data, output_filename)
print(f"QR-код успешно создан и сохранен как '{saved_file}'")
Ниже зависимости:
pip install qrcode Pillow
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣20🔥8🤬4🤪3❤2👍2❤🔥1
Это не просто скучные документы
- Стиль кода? Это PEP 8. Он диктует, как форматировать код, чтобы его было легко читать.
- Удобные f-строки? Спасибо PEP 498.
- Подсказки типов (type hints)? Их стандартизировал PEP 484, изменив подход к написанию большого и сложного кода.
- Философия Python? Прочитайте PEP 20 («The Zen of Python»), чтобы понять дух языка.
Теперь вы знаете чуть больше :)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤18🔥3🤬3❤🔥1👏1🌚1🤪1
Часто встречаю проекты, от заказчиков, которые стоит доработать, или просто на GitHub, где в requirements указывается просто библиотека, без конкретной версии. И часто из-за этого у конечного пользователя не получается запустить проект. Почему так?
Дело в том, что разные версии библиотек могут иметь разный синтаксис. Например, популярный aiogram, который используют для написания асинхронных телеграм-ботов, во всех версиях 2. имеет совершенно иные методы/функции, нежели в версии 3. И даже внутри одного поколения, к примеру, aiogram 3.7 и aiogram 3.18 - есть значительные отличия. К чему это ведет? Проект написанный на какой-то конкретной, актуальной версии библиотеки, может просто не "стартовать" у пользователя уже через полгода. Для неопытного/начинающего разработчика - это беда.
То есть, мы определили, что зависимости вида:
requests
aiogram
pillow
Это нормально в момент, когда вы разрабатываете проект, знакомитесь с актуальными библиотеками и используете методы/функции, которые представлены в них. Но если вы хотите передавать/распространять/выкладывать свой код в общий доступ, рекомендую выучить команду:
pip freeze > requirements.txt
Есть и более чистый вариант через pip install pip-tools. Что нужно делать?:
1) Создайте (или активируйте) venv.
2) Установите инструмент:
pip install pip-tools
3) Напишите верхнеуровневые пакеты в requirements.in (те, которые без версий!).
4) Скомпилируйте замороженный список:
pip-compile requirements.in -o requirements.txt
- "--upgrade" - обновить всё до свежих допустимых версий
- "-P httpx" - обновить только httpx
- " --generate-hashes" - добавить SHA256-хеши для безопасности
5) После этого, выполните установку пакетов из сформированного requirements.txt:
pip-sync requirements.txt
pip-sync удалит лишние пакеты из venv и установит ровно те, что в файле.
Таким образом можно и разделять Prod и Dev инструменты, чтобы не тащить лишнее в продакшн. Создаете requirements.in - это прод зависимости и requirements-dev.in - инструменты для разработки. Типичное содержание такого файла:
-r requirements.in
pytest
ruff
mypy
То есть, включаем тесты и т.д., а также базовый requirements.in. Дальше компилируем и получаем два файла requirements.txt и requirements-dev.txt, с актуальными версиями, для разработчика и для продакшена:
pip-compile requirements.in -o requirements.txt
pip-compile requirements-dev.in -o requirements-dev.txt
pip-sync requirements.txt requirements-dev.txt
Не рекомендую, кстати, смешивать prod и dev в один файл — тяжёлые и нестабильные билды получаются...
Please open Telegram to view this post
VIEW IN TELEGRAM
😡8👍5❤3🙈2👏1
Давайте сравним на казуальной задаче: парсинг веб-страницы. Задача - собрать все заголовки с главной страницы Wikipedia.
На Python для этого нужно использовать только: requests, BeautifulSoup. А вот на C++ придется по-мучится с libcurl и Gumbo-parser.
Что у нас получается на Python? Буквально 7 строк. А вот, что получится для С++:
#include <iostream>
#include <string>
#include <vector>
#include <curl/curl.h>
#include <gumbo.h>
size_t write_callback(void *contents, size_t size, size_t nmemb, std::string *s) {
size_t new_length = size * nmemb;
try {
s->append((char*)contents, new_length);
} catch(std::bad_alloc &e) {
return 0;
}
return new_length;
}
void search_for_headers(GumboNode* node, std::vector<std::string>& headers) {
if (node->type != GUMBO_NODE_ELEMENT) {
return;
}
GumboTag tag = node->v.element.tag;
if (tag >= GUMBO_TAG_H1 && tag <= GUMBO_TAG_H6) {
GumboVector* children = &node->v.element.children;
for (unsigned int i = 0; i < children->length; ++i) {
GumboNode* child = static_cast<GumboNode*>(children->data[i]);
if (child->type == GUMBO_NODE_TEXT) {
headers.push_back(child->v.text.text);
}
}
}
GumboVector* children = &node->v.element.children;
for (unsigned int i = 0; i < children->length; ++i) {
search_for_headers(static_cast<GumboNode*>(children->data[i]), headers);
}
}
int main() {
CURL *curl;
CURLcode res;
std::string html_content;
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://ru.wikipedia.org/wiki/Заглавная_страница");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &html_content);
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
std::cerr << "Ошибка curl_easy_perform(): " << curl_easy_strerror(res) << std::endl;
}
curl_easy_cleanup(curl);
}
if (html_content.empty()) {
std::cerr << "Не удалось загрузить HTML." << std::endl;
return 1;
}
GumboOutput* output = gumbo_parse(html_content.c_str());
std::vector<std::string> headers;
search_for_headers(output->root, headers);
std::cout << "Найденные заголовки:" << std::endl;
for (const auto& header : headers) {
std::cout << "- " << header << std::endl;
}
gumbo_destroy_output(&kGumboDefaultOptions, output);
return 0;
}
Как видите, код на C++ требует:
- ручного управления зависимостями: нужно установить и слинковать библиотеки;
- более низкоуровневой работы: вы вручную настраиваете curl, пишете callback-функцию для сохранения данных;
- явного обхода дерева: вы рекурсивно обходите DOM-дерево, построенное Gumbo;
- ручного управления памятью: вы обязаны вызвать gumbo_destroy_output, чтобы избежать утечек памяти.
Please open Telegram to view this post
VIEW IN TELEGRAM
😍12❤8👍6😁1🤨1😡1
Так вот, полный список команд с объяснениями (Linux!!!):
1) Установка и проверка:
# Обновляем список пакетов
sudo apt update
# Устанавливаем Docker
sudo apt install -y docker.io
# Запускаем и добавляем Docker в автозагрузку
sudo systemctl start docker
sudo systemctl enable docker
# Устанавливаем Docker Compose
sudo apt install -y docker-compose
Чтобы проверить, что все сделали четко:
docker --version
docker-compose --version
Должно показать версии Docker и Docker-compose.
2) Разворачивание, запуск контейнера.
После того, как вы установили это все (делать нужно 1 раз(!!!)), нужно перейти в директорию с файлами проекта (где лежат Dockerfile, docker-compose.yml).
Пример:
cd /root/dialog_bot/
После этого, пишите команду:
sudo docker-compose up --build -d
Если сделали все четко, контейнер соберется и сразу же будет в работе.
Вот что делают "флажки":
- up: Создает и запускает контейнеры.
- --build: Принудительно пересобирает образ перед запуском. Это полезно, если ты внес изменения в Dockerfile или файлы проекта.
- -d: Запускает контейнеры в фоновом (detached) режиме.
Просмотреть логи с контейнера после можно по команде:
sudo docker-compose logs -f
3) А что на Windows?
Чтобы запустить на Win 10, 11, нужно:
1. Перейдите на официальный сайт Docker и скачай установщик для Windows.
2. Установите Docker Desktop:
- Запустите скачанный установщик.
- Следуйте инструкциям на экране. Очень важно: убедитесь, что выбрана опция "Use WSL 2 instead of Hyper-V" (Использовать WSL 2 вместо Hyper-V), если она доступна и твой Windows 10 это поддерживает (версия 2004 и выше, сборка 19041 и - выше). WSL 2 обеспечивает лучшую производительность. Если опции нет или твоя система старее, Docker Desktop может использовать Hyper-V.
- Установка может потребовать включения функций "Контейнеры" и "Подсистема Windows для Linux" (WSL). Установщик обычно предлагает сделать это автоматически или дает инструкции.
3. Запусти Docker Desktop после установки. Иконка кита появится в системном трее. При первом запуске может потребоваться некоторое время на инициализацию. Убедись, что Docker Desktop показывает, что он запущен (иконка кита в трее статична и не анимирована).
Важно: каждый раз, когда захотите собрать контейнер на Win 10, 11, нужно запускать Docker Desktop!
Дальше можете прямо в IDE, в папке с проектом в консоли писать:
docker-compose up --build -d
И все. Команды тут те же, что и на Linux.
Полезно?
Please open Telegram to view this post
VIEW IN TELEGRAM
😭15😡7❤6👍6👌2💘1
main.py
6.9 KB
Работает на Pyrofork. Выводит в консоль количество существующих подарков, баланс звезд Вашего аккаунта, обновляется раз в 300 секунд (ставьте КД меньше, около минуты). Не забудьте в начале свои API HASH и API ID указать.
pip install pyrofork
Видел, в комментариях часто такое решение упоминали - держите.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯20😁5❤3😢2
Для работы использовал FFMPEG.
Как легкий пример для поста выше.
Как легкий пример для поста выше.
import os
import ffmpeg
class VideoToGifConverter:
def __init__(self, source_dir="video", target_dir="gif", frame_rate=2):
self.source_dir = source_dir
self.target_dir = target_dir
self.frame_rate = frame_rate
os.makedirs(self.source_dir, exist_ok=True)
os.makedirs(self.target_dir, exist_ok=True)
def get_video_files(self):
return [
file_name
for file_name in os.listdir(self.source_dir)
if file_name.lower().endswith(".mp4")
]
def convert_videos_to_gif(self):
video_files = self.get_video_files()
for video_file in video_files:
base_name = os.path.splitext(video_file)[0]
gif_file_name = base_name + ".gif"
input_path = os.path.join(self.source_dir, video_file)
output_path = os.path.join(self.target_dir, gif_file_name)
stream = ffmpeg.input(input_path)
stream = stream.filter("fps", fps=self.frame_rate)
stream = ffmpeg.output(stream, output_path)
ffmpeg.run(stream)
def main():
converter = VideoToGifConverter(source_dir="video", target_dir="gif", frame_rate=2)
converter.convert_videos_to_gif()
if __name__ == "__main__":
main()
🤬16👍3❤2💋1😨1
Сегодня о классической связке, которая лежит в основе многих крутых проектов: Python и MySQL.
🤔 Как они "дружат?"
Python "общается" с базами данных MySQL с помощью специальных библиотек-коннекторов. Самые популярные — mysql-connector-python (официальный от Oracle) и PyMySQL.
1. Веб-приложения на Django & Flask: Это самая частая сфера применения. Интернет-магазины, блоги, CRM-системы, социальные сети — везде, где нужно надежно хранить данные о пользователях, товарах или постах, MySQL отлично справляется с ролью хранилища. Django и Flask имеют прекрасную интеграцию с этой СУБД.
2. Аналитика и ETL-процессы: Представьте, что вы парсите данные с сайтов. Python-скрипт собирает информацию, обрабатывает ее и аккуратно записывает в таблицы MySQL. Позже эти данные можно легко анализировать и строить отчеты.
3. Телеграм-боты: Ваш бот должен помнить пользователей, их настройки или историю сообщений? MySQL — отличный и надежный выбор для хранения этой информации.
4. Системы мониторинга: Скрипты, которые следят за состоянием серверов или приложений, могут записывать логи и метрики в базу MySQL для последующего анализа.
Python + MySQL — это надежное и масштабируемое решение для огромного спектра задач.
P.S. я вижу сообщения от ВСЕХ в боте, не нужно писать по несколько раз. Я закрываю вопрос с 2-3 людьми, потом иду дальше.
Если я начну отвечать всем и сразу - никто решение своей проблемы не получит, а я к тому, что сейчас кушаю золофт, еще пару таблеток у психиатра выпишу. До всех очередь дойдет, компенсирую работой/деньгами.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤬7❤6
Из интереса и ради практики делал.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🤬37🔥13😁3👍1