Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

лл: делаем сайт, который находит новые игры на торрентах и постит их описание в Телегу. Рисуем лого, интерфейс и пишем код на Пайтоне.

* * *

Приглашаю окунуться в магический мир разработки программного обеспечения, полный приключений, неизвестности, страданий и сожалений о своих решениях. Мы с вами пройдём путь от идеи «Телеграм-канал с описанием новых игр на торрент-трекерах» до сайта, который их находит и публикует.

Процесс сильно упрощён для простоты понимания, однако, вам всё же потребуются знания школьной программы: что такое переменная, массив, функция, операторы IF и FOR. Ещё нужно знать, что сайты состоят из HTML и работают особо-шумных компьютерах под названием «серверы». Остальное объясню на пальцах.

Это не учебный материал. Некоторые вещи сделаны не оптимально, с ошибками и преднамеренно криво. Если хотите научиться программировать, то лучше купите книгу, запишитесь на курсы или послушайте индусов на YouTube.

Хватит разговоров, пора мешки ворочать. Открываем творение Дурова и пишем пост об одной игре, чтобы знать к какому результату стремиться. Чем чётче цель, тем проще к ней двигаться:

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

Чтобы делать такие посты нам потребуются:

• Трейлер игры
• Три скриншота
• Жанры
• Описание
• Минимальные системные требования
• Рейтинг на Метакритике

Собирать всё это будет программа, которая работает на сервере и управляется через веб-сайт, он же «панель управления». Нам предстоит её научить:

• Загружать список игр с Рутрекера.
• Сохранять в базу данных название, описание и жанры игры.
• Скачивать скриншоты.
• Искать и скачивать трейлеры с YouTube.
• Искать и сохранять рейтинг на Metacritic.
• Показывать описание, трейлеры и скриншоты в панели управления.
• Отправлять это всё в Телеграм.

Звучит не сложно. Начнём с названия, логотипа и интерфейса.

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

Рабочее название проекта: «Pirate Parrot». Как-то сразу в голову пришло. Звучит настолько попсово, что даже не стал проверять занять ли домены — наверняка заняты — и существуют ли похожие проекты с таким названием — наверняка существуют.

За пару дней раздумий ничего толкового не придумал. Каково же было удивление, что домен «pirateparrot.ru» свободен. Ладно, берём его для сайта-заглушки и ещё один, не скажу какой, для панели управления.

Корабль назвали и ему нужен логотип, а точнее флаг. Пиратский флаг с черепом. Но не простой, а цифровой. Мой любимый торрент-клиент «Transmission» показывает доступность файлов у сидеров в виде цветных блоков. Отличная метафора для проекта: череп из блоков доступности торрента.

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

Находим референс в Гугле, сдуваем пыль с графического планшета и рисуем как умеем. Мозайку Фотошоп сделаем сам, нам останется только перенести её в вектор. Да, царапины на клюве плохо видны, но этот и ещё парочку косяков поправим позже. Сейчас главное выпустить «Версию 1.0» как можно быстрее, а не идеально.

Поговаривают, что нейросети заменят дизайнеров и программистов. Ну чтож, робот, удиви меня! Нарисуй этот логотип лучше:

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

Н-да… Код, пожалуй, сам напишу.

Займёмся интерфейсом. В интересах времени опущу промежуточные варианты. Не думайте, будто всё получилось с первой попытки:

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

• Точка перед пунктом меню — индикатор новых торрентов. Сейчас мы сделаем только игры, а остальные оставим на будущее.

• ARW — переключатель «Await, Rejected, Weekly» или «Ожидают публикации, Отклонённые, Дайджест за неделю».

• Status — главная страница со статистикой и управлением программой.

• Если навести курсор на скриншот, то он появится вместо видео.

• «Original text» показывает текст описания торрента вместо видео и скриншотов.

• Удалять видео и скриншоты нельзя, да это и не нужно.

• Весь текст поста состоит из полей ввода, у которых нет заливки границ. Чтобы поправить, скажем, заголовок, достаточно нажать на него.

• Кнопка без подписи. И так понятно, что она делает.

• Логотип — это индикатор конца списка.

Как же приятно работать, когда не нужно ни с кем нянчиться. Будь тут «эффективный менеджер», сейчас бы выслушивал про «негативный образ смерти в логотипе, кнопки без подписей никто не делает, логотип должен быть как можно выше на странице» и сотни других претензий. Получилась бы постная ерунда с улыбающимся попугайчиком в пиратской шляпе и интерфейс с кучей никому не нужных текстовых подсказок.

Ладно, достаточно желчи, займёмся кодом. На самом деле нам предстоит написать две программы:

1. Комбайн — по расписанию заходит на трекер, проверяет нет ли там чего нового и сохраняет информацию об играх в базу данных.

2. Панель управления — сайт, который читает ту же базу данных, позволяет нам редактировать инфу об игре и отправляет её в Телеграм.

— Зачем две, когда это может сделать одна?
— Горизонтальное масштабирование.

Когда программа обрастает новыми функциями, к примеру загрузкой свежих фильмов, ей нужно больше вычислительных мощностей. Если программа одна, то единственный способ дать ей их — это увеличить число процессоров и ОЗУ сервера, что называется «вертикальное масштабирование». Но память и процессоры не получится наращивать до бесконечности, а арендовать два сервера выйдет дешевле, чем один с аналогичной мощностью — это и называется «горизонтальное масштабирование».

На первый взгляд преувеличение, но лучше заранее готовить почву под будущие функции, чем переделывать код, когда настанет время их реализовать.

Комбайну и панели управления всё равно, что они работают на разных серверах. Мы даже сможем запустить несколько Комбайнов и одну панель управления. Главное — единая база данных. Кстати, самое время её создать:

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

• url — ссылка на игру на трекере. Показывать её в Телеге не будем, а то канал забанят. @freedomist уже добаловался со своим ботом :-D

• rawTitle — название игры на трекере. Понадобится для поиска новых игр.

• rawText — весь текст описания игры с трекера.

• title, description, genre — эти поля будем отправлять в Телеграм.

• sysCPU, sysGPU, sysRAM — минимальные системные требования.

• ratingCritics и ratingUsers — рейтинг с Метакритика.

• screenshotsFilename — имена файлов всех скриншотов игры.

• selectedScreenshots — скриншоты, которые мы выбрали для публикации в Телеграм-канале.

• videoURL и videoFilename — трейлер с YouTube.

• status — статус торрента: «ожидает публикации / await», «отклонён / reject», «опубликован / published».

• date — дата добавления.

Прелюдии закончились, открываем редактор кода:

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

Если не программировали на Пайтоне, то ничего страшного — тоже недавно с ним познакомился :-) Вот что тут происходит:

На первой строчке мы импортируем файл «classTorrents». Грубо говоря, вместо неё будет код из этого файла, со всеми переменными и функциями, с которыми мы можем работать.

Помимо файлов, в Пайтоне можно импортировать целые программы — «модули», которые написаны другими программистами. Скажем, нам нужно записать что-то в базу данных под управлением MySQL. Мы могли бы написать код, который откроет подключение к этой СУБД, подготовит запрос, отправит и оповестит об успехе или ошибке. Но зачем тратить время? Находим в интернете модуль «mysql», устанавливаем, импортируем, передаём ему данные и логин/пароль об базы. Остальное он сделаем сам. Аналогично поступим со скачиваем видео с YouTube, получением HTML страниц и отправкой сообщений в Телеграм — всё это будут делать модули, бесплатно доступные в сети и написанные кем-то поумней нас с вами :-)

На четвёртой строчке кода мы создали объект класса «RuTrackerGames» из файла «classTorrents». Если не знакомы с «Объектно-ориентированным программированием / ООП», то представьте, что вы инженер и собираете новую модель самолёта. Как-то утром вы подходите к токарю и говорите:

— Иван Николаевич, а сделайте-ка мне десяток титановых болтов, пожалуйста.

Не сложно догадаться, на какие три буквы вас пошлёт мастер. И будет прав. Без чертежа болты никто делать не станет. Классы в ООП — это чертежи, а объекты — это болты. Без чертежа нельзя сделать болт, а с чертежом можно наклепать хоть вагон болтов. Но чертежом нельзя прикрепить крылья к фюзеляжу самолёта, так же и классы не выполняют код, пока не создашь объект.

Классы определяют свойства и методы объектов. Например, свойства болта: цвет, материал, размер и вес. Методы — то, что можно сделать с объектом — закрутить, раскрутить, потерять, сдать в металлолом или положить на чьё-то мнение. Методы в Пайтоне, так же как и функции, начинаются со слова «def»: «def propit_bolt():».

Классы могут наследовать методы и свойства других классов. Скажем, потребовались болты «№45» с левой резьбой. Вы делаете чертёж только резьбы, подписываете «для остальной части болта см. чертёж „Болт №45“» и Иван Николаевич приступает к работе.

Теперь у нас достаточно знаний, чтобы написать класс RuTrackerGames:

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

Наследование нам потребуется в будущем. Чтобы собрать игры с трекера «Demonoid», нужно создать класс «DemonoidGames» и написать два метода: получить список новых игр и описание каждой. Запись в базу и пропуск уже добавленных сделают родительские классы «Torrents» и «GamesTorrents». Придёт черёд собирать фильмы — новый класс «MovieTorrents», который наследует логику класса «Torrents». И так далее.

Если вы ещё не переключились на видео с котиками, чтобы дать психике отдохнуть, то напишем пару интересных функций. Скачиваем видео с YouTube:

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

Соберётесь использовать модуль «yt_dlp» в своём проекте — делайте его классом, а не функцией, т.к. единственный способ получить имя файла после загрузки, это вызвать функцию «filename_hook», в которую модуль передаст имя. Но чтобы вытащить его оттуда, придётся сделать костыль — объявить глобальную переменную «filename» на строках 22 и 24. Это скользкая дорожка. Всё начинается с безобидных глобальных переменных, и вот ты уже не замечаешь, как лепишь GOTO для выхода из условного оператора.

В следующей версии программы обязательно перепишем эту функцию в класс. А пока добавим Телеграм бота, который будет отчитываться о работе Комбайна и оповещать, если что-то пошло не так:

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост
Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

Все файлы программы:

• env — папка с модулями.

app.py — файл запуска программы.

classTorrents.py — классы Торрентов.

classWebImage.py — классы для загрузки картинок с сайтов Fastpic, Imageban и др.

config.py — настройки программы.

gamesGenres.py — приводит названия жанров игр к единому формату. Например, меняет «First Person Shooter» на «Шутер от первого лица», а «Ролевая игра» на «РПГ». В коде класса «RuTrackerGames» вызов этой функции убран для простоты понимания.

reportMaster.py — Телеграм-бот для сообщений об ошибках.

• requirements.txt — список подключённых модулей.

support.py — мелкие функции, вроде скачивания видео, поиска по тексту и удаления мусора из него.

Настало время запустить Комбайн. Открываем терминал и «Поехали!»:

Проверим что он записал в базу данных:

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

Супер! Осталось сделать панель управления и оформить Телеграм-канал. Этим займёмся в следующей части ;-)

А пока зацените результат: https://t.me/flint_games