- β‘ ΠΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ ΠΏΠΎΠΈΡΠΊ ΠΌΡΠ·ΡΠΊΠΈ
- π ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ²
- π οΈ ΠΡΠΎΡΡΠΎΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΡΠΌΠΈ Π΄Π²ΠΈΠΆΠΊΠ°ΠΌΠΈ
- π¦ ΠΠ΅Π³ΠΊΠ°Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Π² ΠΏΡΠΎΠ΅ΠΊΡΡ
- π ΠΡΡΡΡΠ°Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ΅ΡΠ΅Π· pip
- π₯οΈ TUI (Terminal User Interface) Ρ ΠΏΠΎΠΈΡΠΊΠΎΠΌ, ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ ΡΠΊΠ°ΡΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ
ΠΠ»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ pip:
pip install msocΠ’Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΈΠ· ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠΎΠ²:
git clone https://github.com/paranoik1/msoc.git
cd MSOC
pip install .ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ TUI Π΄Π»Ρ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ°, ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π½ΠΈΡ ΠΈ ΡΠΊΠ°ΡΠΈΠ²Π°Π½ΠΈΡ ΠΌΡΠ·ΡΠΊΠΈ:
msoc --tui
# or
python -m msoc --tuiTUI ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ:
- ΠΡΠΊΠ°ΡΡ ΡΡΠ΅ΠΊΠΈ ΠΏΠΎ Π·Π°ΠΏΡΠΎΡΡ
- ΠΡΠΎΡΠ»ΡΡΠΈΠ²Π°ΡΡ ΡΡΠ΅ΠΊΠΈ ΡΠ΅ΡΠ΅Π· ffmpeg (Π°Π²ΡΠΎΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ PulseAudio/PipeWire)
- Π‘ΠΊΠ°ΡΠΈΠ²Π°ΡΡ ΡΡΠ΅ΠΊΠΈ Π² ΡΠ΅ΠΊΡΡΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ
- ΠΠΈΠ΄Π΅ΡΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΡΠ΅ΠΊΠΎΠ²
Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅: Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ TUI Π½ΡΠΆΠ΅Π½ ffmpeg Π² ΡΠΈΡΡΠ΅ΠΌΠ΅. ΠΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΡΡ
ffmpeg version n8.1.2.
Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Ρ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π» Ρ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΡΠ΅Π²ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΏΡΠΈ ΠΏΡΠΎΠΈΠ³ΡΡΠ²Π°Π½ΠΈΠΈ. ΠΠ»Ρ ΡΠ΅ΡΡΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» wondershaper β ΠΏΠΎΠ΄ LinuΡ ΠΎΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΊΡΡΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ΅Π·Π°ΡΡ ΠΏΡΠΎΠΏΡΡΠΊΠ½ΡΡ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, ΡΡΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ ΡΠΈΠΌΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ»Π°Π±ΡΠΉ ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ.
Π‘Π΅ΠΉΡΠ°Ρ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
- ffmpeg ΡΠΊΠ°ΡΠΈΠ²Π°Π΅Ρ ΡΡΠ΅ΠΊ Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΏΠ°ΠΏΠΊΡ (
-c:a copyβ Π±Π΅Π· ΠΏΠ΅ΡΠ΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΏΡΠΎΡΡΠΎ ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊ ΠΊΠ°ΠΊ Π΅ΡΡΡ).- ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π΄Π°Π½Π½ΡΡ ΠΎΠ± Π°ΡΠ΄ΠΈΠΎ ΡΠ°ΠΉΠ»Π΅ ΡΠ°Π½ΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΡΡ ffprobe ΠΏΠΎ url Π°ΡΠ΄ΠΈΠΎ, ΡΡΠΎ Π±ΡΠ»ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΡΠΈΡΡΡΡΡΠ²ΠΎΠ²Π°Π»Π° Π½Π΅ΠΏΡΠΈΡΡΠ½Π°Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠ°. ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π±ΡΠ» Π·Π°ΠΌΠ΅Π½Π΅Π½ ΡΡΠ΅Π½ΠΈΠ΅ΠΌ stderr ffmpeg ΠΏΡΠΎΡΠ΅ΡΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΊΠ°ΡΠΈΠ²Π°Π΅Ρ ΡΠ°ΠΉΠ». Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΠ΄Π°Π΅ΡΡΡ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ
- ΠΡΠΎΡΠΎΠΉ ffmpeg ΡΠΈΡΠ°Π΅Ρ ΡΠΆΠ΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΡΠ΅Ρ Π² PCM ΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π² sounddevice.
ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΠΈ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² ΡΠ°Π·Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠ°Ρ , ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΡΡΡ Π΄ΡΡΠ³ Π΄ΡΡΠ³Π° β ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΠ°ΡΡ ΡΠ»ΡΡΠ°ΡΡ, Π½Π΅ Π΄ΠΎΠΆΠΈΠ΄Π°ΡΡΡ ΠΏΠΎΠ»Π½ΠΎΠΉ Π·Π°Π³ΡΡΠ·ΠΊΠΈ.
ΠΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ Download, Π»ΠΎΠ³ΠΈΠΊΠ° ΡΠ°ΠΊΠ°Ρ:
- ΠΡΠ»ΠΈ ΡΡΠ΅ΠΊ ΡΠΆΠ΅ Π·Π°Π³ΡΡΠΆΠ΅Π½ Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΏΠ°ΠΏΠΊΡ (Π΄ΠΎΠΊΠ°ΡΠ°Π»ΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π½ΠΈΡ) β ΠΏΡΠΎΡΡΠΎ ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ ΠΎΡΡΡΠ΄Π° Π² ΡΠ΅ΠΊΡΡΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ. ΠΠΈΠΊΠ°ΠΊΠΈΡ Π½ΠΎΠ²ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π² ΡΠ΅ΡΡ.
- ΠΡΠ»ΠΈ ΡΡΠ΅ΠΊ ΠΏΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ ΠΈΠ³ΡΠ°Π΅Ρ, Π½ΠΎ Π΅ΡΡ Π½Π΅ Π΄ΠΎΠΊΠ°ΡΠ°Π»ΡΡ β ΠΆΠ΄ΡΠΌ, ΠΏΠΎΠΊΠ°
ΡΠΎΠ½ΠΎΠ²ΡΠΉ ffmpeg Π·Π°ΠΊΠΎΠ½ΡΠΈΡ, ΠΈ ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ. ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²ΠΈΠ΄ΠΈΡ
...Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ΅. - ΠΡΠ»ΠΈ ΡΡΠ΅ΠΊ Π½Π΅ ΠΈΠ³ΡΠ°Π» ΠΈ Π½Π΅ Π·Π°Π³ΡΡΠΆΠ°Π»ΡΡ β ffmpeg ΡΠΊΠ°ΡΠΈΠ²Π°Π΅Ρ Π½Π°ΠΏΡΡΠΌΡΡ
(
-c:a copy), ΡΠΎΡ ΡΠ°Π½ΡΡ Π² ΡΠ΅ΠΊΡΡΡΡ ΠΏΠ°ΠΏΠΊΡ.
usage: msoc [-h] [--tui] [--mode {fast,full}] [query]
ΠΡΡΡΡΡΠΉ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠΉ ΠΏΠΎΠΈΡΠΊ ΠΌΡΠ·ΡΠΊΠΈ
positional arguments:
query ΠΠΎΠΈΡΠΊΠΎΠ²ΡΠΉ Π·Π°ΠΏΡΠΎΡ
options:
-h, --help show this help message and exit
--tui ΠΠ°ΠΏΡΡΡΠΈΡΡ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ (TUI)
--mode {fast,full} Π Π΅ΠΆΠΈΠΌ ΠΏΠΎΠΈΡΠΊΠ°: fast (ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ²ΡΠ΅
ΡΡΡΠ°Π½ΠΈΡΡ) ΠΈΠ»ΠΈ full (Π²ΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ)ΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠ²Π΅Π΄Π΅Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΡ
ΡΡΠ΅ΠΊΠ°Ρ
: Name, Artist, URL, Engine (Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π΄Π²ΠΈΠΆΠΊΠ°) ΠΈ Meta (Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅).
ΠΠΌΠΏΠΎΡΡΠΈΡΡΠΉΡΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ msoc ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ search() Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΠΌΡΠ·ΡΠΊΠΈ:
from msoc import search
import asyncio
async def main():
query = input("ΠΠ°ΠΏΡΠΎΡ: ")
async for sound in search(query):
print(f"Name: {sound.title}\nArtist: {sound.artist}\nURL: {sound.url}")
print("================================================")
asyncio.run(main())Π€ΡΠ½ΠΊΡΠΈΡ search() ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΏΠΎΠΈΡΠΊΠΎΠ²ΡΠΉ Π·Π°ΠΏΡΠΎΡ ΠΈ ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ mode (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ SearchMode.Fast):
SearchMode.Fastβ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ²ΡΠΉ Π·Π°ΠΏΡΠΎΡ (ΠΎΠ΄Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ° ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ²).SearchMode.Fullβ Π΄Π²ΠΈΠΆΠΎΠΊ ΠΏΡΡΠ°Π΅ΡΡΡ ΡΠΎΠ±ΡΠ°ΡΡ Π²ΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² ΡΠ΅ΡΠ΅Π· ΡΡΠ½ΠΊΡΠΈΡsearch_full. ΠΡΠ»ΠΈ Π΄Π²ΠΈΠΆΠΎΠΊ Π½Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρsearch_full, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΠ±ΡΡΠ½ΡΠΉsearchΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ.
from msoc import search, SearchMode
async for sound in search("query", mode=SearchMode.Full):
...ΠΠ»Π°ΡΡ Sound ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΠ΅ΡΠ½Π΅.
| ΠΠΎΠ»Π΅ | Π’ΠΈΠΏ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
|---|---|---|
title |
str |
ΠΠ°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ½ΠΈ |
url |
str |
Π‘ΡΡΠ»ΠΊΠ° Π½Π° ΡΠΊΠ°ΡΠΈΠ²Π°Π½ΠΈΠ΅ |
artist |
str | None |
ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Ρ (ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ) |
meta |
dict[str, Any] |
ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ {}) |
_engine |
str | None |
ΠΠ²ΠΈΠΆΠΎΠΊ-ΠΈΡΡΠΎΡΠ½ΠΈΠΊ, Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ |
Π Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° MSOC ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π΄Π²ΠΈΠΆΠΊΠΈ ΠΏΠΎΠΈΡΠΊΠ°:
- zaycev_net: ΠΠΎΠΈΡΠΊ Π½Π° ΡΠ°ΠΉΡΠ΅ zaycev.net
- hitmo: ΠΠΎΠΈΡΠΊ Π½Π° ΡΠ°ΠΉΡΠ΅ rus.hitmotop.com - ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΎΡ Ushiiro82
- muzbomb: ΠΠΎΠΈΡΠΊ Π½Π° ΡΠ°ΠΉΡΠ΅ muzbomb.net - ΡΠΎΠ·Π΄Π°Π½ takilow
ΠΠ²ΠΈΠΆΠΊΠΈ Π·Π°Π³ΡΡΠΆΠ°ΡΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈ ΠΈΠΌΠΏΠΎΡΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠ° msoc.
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° MSOC ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ:
LoadedEngineNotFoundError: ΠΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° Π΄Π²ΠΈΠΆΠΎΠΊ ΠΏΠΎΠΈΡΠΊΠ° Π½Π΅ Π±ΡΠ» Π½Π°ΠΉΠ΄Π΅Π½ Π² Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΡ Π΄Π²ΠΈΠΆΠΊΠ°Ρ .
ΠΠ»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΏΠΎΠΈΡΠΊΠΎΠ²ΡΡ Π΄Π²ΠΈΠΆΠΊΠΎΠ² Π½Π° Python Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄:
-
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π½ΠΎΠ²ΡΠΉ Python-ΡΠ°ΠΉΠ» Π΄Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΠΎΠΈΡΠΊΠΎΠ²ΠΎΠ³ΠΎ Π΄Π²ΠΈΠΆΠΊΠ°:
- ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ°ΠΉΠ»
my_search_engine.py.
- ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ°ΠΉΠ»
-
ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ
search(query), ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ ΠΏΠΎΠΈΡΠΊΠΎΠ²ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ:- Π Π΅Π°Π»ΠΈΠ·ΡΠΉΡΠ΅ Π»ΠΎΠ³ΠΈΠΊΡ ΠΏΠΎΠΈΡΠΊΠ°, Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΡ Ρ API ΠΈΠ»ΠΈ Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡΠ°ΠΌΠΈ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ.
- ΠΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ
aiohttp,beautifulsoup4ΠΈ Π΄ΡΡΠ³ΠΈΠ΅, Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ HTTP-Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΈ ΠΏΠ°ΡΡΠΈΠ½Π³Π° HTML-ΡΡΡΠ°Π½ΠΈΡ.
ΠΠ»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΡΠ΅ΠΆΠΈΠΌΠ° Mode.Full Π΄Π²ΠΈΠΆΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ search_full(query) Ρ ΡΠΎΠΉ ΠΆΠ΅ ΡΠΈΠ³Π½Π°ΡΡΡΠΎΠΉ, ΡΡΠΎ ΠΈ search. ΠΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡΠΎΡ
ΠΎΠ΄ΠΈΡΡ ΠΏΠΎ Π²ΡΠ΅ΠΌ ΡΡΡΠ°Π½ΠΈΡΠ°ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ². ΠΡΠ»ΠΈ search_full Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π°, Mode.Full ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ search (ΠΎΠ΄Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°).
Π€ΡΠ½ΠΊΡΠΈΡ search Π²Π½ΡΡΡΠΈ Π΄Π²ΠΈΠΆΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Sound.
ΠΡΠΈΠΌΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ search(query) Π² my_search_engine.py:
import aiohttp
from bs4 import BeautifulSoup
from msoc.sound import Sound
async def search(query: str):
async with aiohttp.ClientSession() as session:
async with session.get(f"https://example.com/search?q={query}") as response:
html = await response.text()
soup = BeautifulSoup(html, "html.parser")
for item in soup.find_all("div", class_="search-result"):
name = item.find("h3").get_text(strip=True)
artist = item.find("span", class_="artist").get_text(strip=True)
url = item.find("a").get("href")
yield Sound(name, url, artist)- ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΠ΅ Π²Π°Ρ ΠΏΠΎΠΈΡΠΊΠΎΠ²ΡΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ ΠΊ ΡΠΈΡΡΠ΅ΠΌΠ΅:
from msoc import register_engine, get_engines
import my_search_engine
register_engine("my_search_engine", my_search_engine)
print(get_engines())- ΠΠ°ΠΌΠ΅Π½ΠΈΡΠ΅
my_search_engineΠ½Π° Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π²Π°ΡΠ΅Π³ΠΎ python ΡΠ°ΠΉΠ»Π°. - ΠΠ°Π»Π΅Π΅ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ
get_engines(), ΡΡΠΎΠ±Ρ ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΠΈΡΡΡΡ, ΡΡΠΎ Π΄Π²ΠΈΠΆΠΎΠΊ Π±ΡΠ» ΡΡΠΏΠ΅ΡΠ½ΠΎ Π·Π°Π³ΡΡΠΆΠ΅Π½
- Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ
searchΡΡΠ½ΠΊΡΠΈΠΈ, Π²Π°Ρ Π΄Π²ΠΈΠΆΠΎΠΊ Π±ΡΠ΄Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π·Π°Π³ΡΡΠΆΠ΅Π½ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΠ΅ΡΠ΅Π½
ΠΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ ΠΏΠΎΠΈΡΠΊΠΎΠ²ΠΎΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ, ΡΠ°ΠΉΠ» ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π½Π΅ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΏΠ°ΠΏΠΊΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΌ python ΠΏΠ°ΠΊΠ΅ΡΠΎΠΌ importlib
from msoc import register_engine
from importlib import util
spec = util.spec_from_file_location("my_search_engine", "/path/to/python/file/my_search_engine.py")
module = util.module_from_spec(spec)
spec.loader.exec_module(module)
register_engine("my_search_engine", module)ΠΡΠ»ΠΈ Π²Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ΅Π½ ΠΊΠ°ΠΊΠΎΠΉ Π»ΠΈΠ±ΠΎ ΠΏΠΎΠΈΡΠΊΠΎΠ²ΠΎΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉ unload_search_engine Π΄Π»Ρ Π΅Π³ΠΎ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΈΠ· Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΡ
:
from msoc import unload_search_engine, engines
unload_search_engine("my_search_engine")
print(engines())ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ ΡΠ΅ΠΏΠ΅ΡΡ Π»Π΅ΠΆΠΈΡ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π²ΠΈΠΆΠΊΠ΅. ΠΡΠ»ΠΈ ΡΠ°ΠΉΡ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ΅Π½, Π΄Π²ΠΈΠΆΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ°ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ Π² search() (Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, Π²ΠΎΠ·Π²ΡΠ°Ρ ΠΏΡΡΡΠΎΠ³ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° ΠΈ Ρ.Π΄.). msoc Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ β Π»ΠΈΡΠ½ΠΈΠΉ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ Π²ΡΠ·ΠΎΠ² ΡΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΌΠ΅Π΄Π»ΡΠ΅Ρ ΠΏΠΎΠΈΡΠΊ. ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ URL Π² ΠΌΠΎΠ΄ΡΠ»Π΅ Π΄Π²ΠΈΠΆΠΊΠ° ΡΠ΅ΠΏΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° Π²Π½ΡΡΡΠΈ ΡΠ°ΠΌΠΎΠ³ΠΎ Π΄Π²ΠΈΠΆΠΊΠ°.
ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ Π²Π½Π΅ΡΡΠΈ ΡΠ²ΠΎΠΉ Π²ΠΊΠ»Π°Π΄ Π² ΡΠ°Π·Π²ΠΈΡΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ MSOC, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅:
- π Π‘ΠΎΠΎΠ±ΡΠΈΡΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ ΠΈΠ»ΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΡΡ Π½ΠΎΠ²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
- ποΈ Π Π°Π·ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π½ΠΎΠ²ΡΠ΅ Π΄Π²ΠΈΠΆΠΊΠΈ ΠΏΠΎΠΈΡΠΊΠ°
- π Π£Π»ΡΡΡΠΈΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ
- π§ ΠΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ
