Skip to content

Commit 70ad327

Browse files
author
paranoik1
committed
README.md update
1 parent 7fed282 commit 70ad327

3 files changed

Lines changed: 50 additions & 9 deletions

File tree

README.md

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
- 🛠️ Простое расширение новыми движками
1616
- 📦 Легкая интеграция в проекты
1717
- 🚀 Быстрая установка через pip
18-
- 🖥️ TUI (Textual User Interface) с поиском, прослушиванием и скачиванием
18+
- 🖥️ TUI (Terminal User Interface) с поиском, прослушиванием и скачиванием
1919

2020
---
2121

@@ -46,12 +46,52 @@ msoc --tui
4646
python -m msoc --tui
4747
```
4848

49+
![alt text](image.png)
50+
4951
TUI позволяет:
5052
- Искать треки по запросу
5153
- Прослушивать треки через ffmpeg (автоопределение PulseAudio/PipeWire)
5254
- Скачивать треки в текущую директорию
5355
- Видеть продолжительность треков
5456

57+
> **Требование:** для работы TUI нужен ffmpeg в системе. При разработке
58+
> использовался `ffmpeg version n8.1.2`.
59+
60+
### Эксперименты с оптимизацией
61+
62+
В процессе разработки я экспериментировал с тем, как уменьшить количество
63+
сетевых запросов при проигрывании. Для тестов использовал
64+
[wondershaper](https://github.com/magnific0/wondershaper) — под Linuх он
65+
позволяет искусственно резать пропускную способность интерфейса, что удобно
66+
симулировать слабый интернет.
67+
68+
Сейчас воспроизведение выглядит так:
69+
70+
1. **ffmpeg скачивает трек во временную папку** (`-c:a copy` — без
71+
перекодирования, просто сохраняет поток как есть).
72+
2. **Второй ffmpeg читает уже локальный файл**, декодирует в PCM
73+
и отправляет в sounddevice.
74+
75+
Загрузка и воспроизведение работают в разных потоках, поэтому не блокируют
76+
друг друга — можно начать слушать, не дожидаясь полной загрузки.
77+
78+
Что хочется доделать: сейчас длительность и другие метаданные вытаскиваются
79+
отдельным вызовом ffprobe (по сути — ещё один запрос к недокачанному файлу).
80+
Планирую парсить `stderr` первого ffmpeg, чтобы получать ту же информацию
81+
без лишних походов в сеть.
82+
83+
#### Как работает скачивание
84+
85+
Когда пользователь нажимает Download, логика такая:
86+
87+
- **Если трек уже загружен во временную папку** (докачался во время
88+
прослушивания) — просто копируем оттуда в текущую директорию.
89+
Никаких новых запросов в сеть.
90+
- **Если трек прямо сейчас играет, но ещё не докачался** — ждём, пока
91+
фоновый ffmpeg закончит, и копируем. Пользователь видит `...` на кнопке.
92+
- **Если трек не играл и не загружался** — ffmpeg скачивает напрямую
93+
(`-c:a copy`), сохраняя в текущую папку.
94+
5595
## 💻 В консоле
5696

5797
Можно протестировать пакет обычным скриптом:
@@ -89,21 +129,21 @@ asyncio.run(main())
89129

90130
Класс `Sound` содержит информацию о песне.
91131

92-
Атрибуты:
93-
94-
- `title (str)`: Название песни.
95-
- `url (str | None)`: Ссылка на скачивание песни. Может быть None, если ссылка недоступна (Необязательный атрибут).
96-
- `artist (str | None)`: Исполнитель песни. Может быть None, если информация об исполнителе недоступна (Необязательный атрибут).
97-
- `meta (dict[str, Any])`: Дополнительные метаданные трека.
98-
- `_engine (str | None)`: Название движка, нашедшего трек (заполняется автоматически).
132+
| Поле | Тип | Описание |
133+
|------|-----|----------|
134+
| `title` | `str` | Название песни |
135+
| `url` | `str` | Ссылка на скачивание |
136+
| `artist` | `str \| None` | Исполнитель (опционально) |
137+
| `meta` | `dict[str, Any]` | Дополнительные метаданные (по умолчанию `{}`) |
138+
| `_engine` | `str \| None` | Движок-источник, заполняется автоматически |
99139

100140

101141
## 🔌 Реализованные движки поиска
102142

103143
В настоящее время библиотека MSOC поддерживает следующие движки поиска:
104144

105145
- zaycev_net: Поиск на сайте [zaycev.net](https://zaycev.net)
106-
- hitmo: Поиск на сайте [rus.hitmotop.com](https://rus.hitmotop.com) - реализован на основе [данного кода](https://github.com/Ushiiro82/MelodyHub/blob/master/parsing/hitmo_parser.py)
146+
- hitmo: Поиск на сайте [rus.hitmotop.com](https://rus.hitmotop.com) - реализован на основе [данного кода от Ushiiro82](https://github.com/Ushiiro82/MelodyHub/blob/master/parsing/hitmo_parser.py)
107147
- muzbomb: Поиск на сайте [muzbomb.net](https://muzbomb.net/) - создан [takilow](https://github.com/takilow)
108148
- trekson: Поиск на сайте [trekson.net](https://trekson.net/) - обновлённый парсер
109149

image.png

45.7 KB
Loading

src/msoc/textual_app.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,7 @@ def on_unmount(self, event):
497497
if __name__ == "__main__":
498498
logging.basicConfig(
499499
filename="journal_app.log",
500+
filemode="w",
500501
level=logging.DEBUG,
501502
format="[%(asctime)s - %(name)s] - %(levelname)s - %(message)s",
502503
)

0 commit comments

Comments
 (0)