์ฐ๋ฆฌ ์ค ๋ง์ ์ฌ๋๋ค์ด ์์นจ์ ๋ผ๋์ค๋ฅผ ๋ฃ๋ ๊ฒ์ ์ข์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ํ์ฐฝํ ์์นจ, ๋๋ ์ง์ญ FM ๋ผ๋์ค ๋ฐฉ์ก์ ๋ฃ๊ณ ์ถ์ง ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ๊ด์ฌ์ด ์๋ค. ๊ทธ๋ฌ๋ ๊ทธ ์ต๊ด์ ํด๋ก์ด ๊ฒ์ผ๋ก ํ๋ช ๋์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ FM ์์ ๊ธฐ๋ฅผ ์ธํฐ๋ท ์์ ๊ธฐ๋ก ๊ต์ฒดํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๋๋ ์ ์ํ๊ฒ Aliexpress์์ ๋ถํ์ ๊ตฌ์ ํ๊ณ ์ธํฐ๋ท ์์ ๊ธฐ๋ฅผ ์กฐ๋ฆฝํ์ต๋๋ค.
์ธํฐ๋ท ์์ ๊ธฐ์ ๋ํ์ฌ. ์์ ๊ธฐ์ ํต์ฌ์ ESP32 ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ์ ๋๋ค. KA-radio์ ํ์จ์ด. ๋ถํ๊ฐ์ 12๋ฌ๋ฌ์์ต๋๋ค. ์กฐ๋ฆฝ์ด ๊ฐํธํด์ ๋ฉฐ์น ๋ง์ ์กฐ๋ฆฝํ ์ ์์์ต๋๋ค. ์ ์๋ํ๊ณ ์์ ์ ์ผ๋ก ์๋ํฉ๋๋ค. 10๊ฐ์ ๋์ ์์ ํ ๋์ ๋ช ๋ฒ๋ง ๋ฉ์ท๋๋ฐ ๊ทธ ๋ค์์๋ ๋ด ์คํ ๋๋ฌธ์ ๋ฉ์ท์ต๋๋ค. ํธ๋ฆฌํ๊ณ ์ธ์ฌํ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ค๋งํธํฐ๊ณผ ์ปดํจํฐ์์ ์ ์ดํ ์ ์์ต๋๋ค. ํ๋ง๋๋ก ์ด๊ฒ์ ํ๋ฅญํ ์ธํฐ๋ท ์์ ๊ธฐ์ ๋๋ค.
๋ค ๊ด์ฐฎ์. ๊ทธ๋ฌ๋ ์ด๋ ์ด๋ฅธ ์์นจ ๋๋ ์๋ง ๊ฐ์ ๋ผ๋์ค ๋ฐฉ์ก๊ตญ์ ์ ์ํ ์ ์์์๋ ๋ถ๊ตฌํ๊ณ ํฅ๋ฏธ๋ก์ด ๋ฐฉ์ก๊ตญ์ด ์๋ค๋ ๊ฒฐ๋ก ์ ๋๋ฌํ์ต๋๋ค. ๋๋ ๋ฐํ์๋ค์ ๊ด๊ณ ์ ์ด๋ฆฌ์์ ๋๋ด์ ์ง์ฆ์ด๋ฌ์ต๋๋ค. ํ ์คํ
์ด์
์์ ๋ค๋ฅธ ์คํ
์ด์
์ผ๋ก ๋์์์ด ์ ํํฉ๋๋ค. ๋๋ Spotify์ Yandex.Music์ ์ข์ํฉ๋๋ค. ํ์ง๋ง ์์ฌ์ด ์ ์ ์ฐ๋ฆฌ๋๋ผ์์๋ ์๋ํ์ง ์๋๋ค๋ ์ ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ธํฐ๋ท ์์ ๊ธฐ๋ฅผ ํตํด ๋ฃ๊ณ ์ถ์ต๋๋ค.
๋๋ ์ด๋ฆฐ ์์ ์ ๊ธฐ์ตํ์ต๋๋ค. ๋๋ ํ
์ดํ ๋ ์ฝ๋์ XNUMX๊ฐ์ ์นด์ธํธ๋ฅผ ๊ฐ์ง๊ณ ์์์ต๋๋ค. ์น๊ตฌ๋ค๊ณผ ์นด์ธํธ๋ฅผ ๊ตํํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ํ๋ฅญํ์ต๋๋ค. ๋๋ ๋ด ์ค๋์ค ์์นด์ด๋ธ๋ฅผ ์ธํฐ๋ท ์์ ๊ธฐ๋ก๋ง ์คํธ๋ฆฌ๋ฐํด์ผ ํ๋ค๊ณ ๊ฒฐ์ ํ์ต๋๋ค. ๋ฌผ๋ก ์ค๋์ค ํ๋ ์ด์ด๋ iPod์ ์คํผ์ปค์ ์ฐ๊ฒฐํ ์ ์๋ ์ต์
๋ ์์ผ๋ฏ๋ก ๊ฑฑ์ ํ์ง ๋ง์ธ์. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ฐ๋ฆฌ์ ๋ฐฉ์์ด ์๋๋๋ค! ๋๋ ์ปค๋ฅํฐ ์ฐ๊ฒฐ์ ์ซ์ดํ๋ค)
๋๋ ๊ธฐ์ฑ ์๋ฃจ์ ์ ์ฐพ๊ธฐ ์์ํ์ต๋๋ค. Radio-Tochka.com์์ ์์ ๋ง์ ์ธํฐ๋ท ๋ผ๋์ค๋ฅผ ๋ง๋ค ์ ์๋ ์ ์์ด ์์ฅ์ ๋์ ์์ต๋๋ค. 5์ผ ๋์ ํ ์คํธํด๋ดค์ต๋๋ค. ๋ด ์ธํฐ๋ท ์์ ๊ธฐ์์๋ ๋ชจ๋ ๊ฒ์ด ์ ์๋ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ๊ฒฉ์ ๋์๊ฒ ๋งค๋ ฅ์ ์ด์ง ์์์ต๋๋ค. ๋๋ ์ด ์ต์ ์ ๊ฑฐ๋ถํ์ต๋๋ค.
๋๋ ํธ์คํ 10GB๋ฅผ ์ง๋ถํ์ต๋๋ค. ๋๋ mp3 ํ์ผ์ ์ค๋์ค ์คํธ๋ฆผ์ ์คํธ๋ฆฌ๋ฐํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๋๋ PHP๋ก ์์ฑํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋นจ๋ฆฌ ์์ฑํ๊ณ ์ถ์ํ์ต๋๋ค. ๋ชจ๋ ๊ฒ์ด ์๋ํ์ต๋๋ค. ๋ฉ์ก์ด! ๊ทธ๋ฐ๋ฐ ๋ฉฐ์น ํ ํธ์คํ ๊ด๋ฆฌ๊ตญ์ผ๋ก๋ถํฐ ํธ์ง๋ฅผ ๋ฐ์์ต๋๋ค. ํ๋ก์ธ์ ์๊ฐ ์ ํ์ด ์ด๊ณผ๋์์ผ๋ฉฐ ๋ ๋์ ๊ด์ธ๋ก ์ ๊ทธ๋ ์ด๋ํด์ผ ํ๋ค๊ณ ๋งํ์ต๋๋ค. ์คํฌ๋ฆฝํธ๋ฅผ ์ญ์ ํด์ผ ํ๊ณ ์ด ์ต์ ์ ํฌ๊ธฐ๋์์ต๋๋ค.
์ด๋ป๊ฒ์ด ์ผ์ด ์ผ์ด ๋ฌ์ด์? ๋ผ๋์ค ์์ด๋ ๋ชป ์ด์์. ๋ค๋ฅธ ์ฌ๋์ ํธ์คํ ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ๊ฒ์ ํ์ฉํ์ง ์๋ ๊ฒฝ์ฐ ์์ฒด ์๋ฒ๊ฐ ํ์ํฉ๋๋ค. ๋ด ์ํผ์ด ์ํ๋ ๊ฒ์ ๋ด๊ฐ ํ ๊ณณ.
์ ๋ ๋ฐฐํฐ๋ฆฌ๊ฐ ์๋ ์ค๋๋ ๋ท๋ถ์ ๊ฐ์ง๊ณ ์์ต๋๋ค(CPU - 900MHz, RAM - 512Mb). ๊ทธ ๋ ธ์ธ์ ๋ฒ์จ 11์ด์ด ๋์์ต๋๋ค. ์๋ฒ์ ์ ํฉํฉ๋๋ค. ์ฐ๋ถํฌ 12.04๋ฅผ ์ค์นํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ Apache2์ PHP 5.3, Samba๋ฅผ ์ค์นํฉ๋๋ค. ๋ด ์๋ฒ๊ฐ ์ค๋น๋์์ต๋๋ค.
๋๋ Icecast๋ฅผ ์ฌ์ฉํด๋ณด๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๋ง๋๋ฅผ ๋ง์ด ์ฝ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ด ์ด๋ ต๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ PHP ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ต์
์ผ๋ก ๋์๊ฐ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์ด ์คํฌ๋ฆฝํธ๋ฅผ ๋๋ฒ๊น
ํ๋ ๋ฐ ๋ฉฐ์น ์ด ๊ฑธ๋ ธ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๊ฒ์ด ํ๋ฅญํ๊ฒ ์๋ํ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ํ์บ์คํธ๋ฅผ ์ฌ์ํ๊ธฐ ์ํ ์คํฌ๋ฆฝํธ๋ ์์ฑํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ฌด ์ข์์ ์์ ํ๋ก์ ํธ๋ฅผ ํ๊ธฐ๋ก ํ์ฃ . IWScast๋ผ๊ณ ๋ถ๋ ์ต๋๋ค.
๋ชจ๋ ๊ฒ์ด ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. mp3 ํ์ผ๊ณผ index.php ํ์ผ์ Apache ๋ฃจํธ ํด๋ /var/www/์ ๋ณต์ฌํ๋ฉด ๋ฌด์์๋ก ์ฌ์๋ฉ๋๋ค. ๋๋ต ํ๋ฃจ ์ข
์ผ ์ฝ 300๊ณก์ด๋ฉด ์ถฉ๋ถํฉ๋๋ค.
index.php ํ์ผ์ ์คํฌ๋ฆฝํธ ์์ฒด์
๋๋ค. ์คํฌ๋ฆฝํธ๋ ๋๋ ํ ๋ฆฌ์ ์๋ MP3 ํ์ผ์ ๋ชจ๋ ์ด๋ฆ์ ๋ฐฐ์ด๋ก ์ฝ์ด์ต๋๋ค. ์ค๋์ค ์คํธ๋ฆผ์ ์์ฑํ๊ณ MP3 ํ์ผ ์ด๋ฆ์ ๋์ฒดํฉ๋๋ค. ๋
ธ๋๋ฅผ ๋ฃ๊ณ ๋ง์์ ๋ค ๋๊ฐ ์์ด์. ๋๊ฐ ๋
ธ๋ํ๊ณ ์๋ ๊ฒ ๊ฐ๋์? ์ด๋ฌํ ๊ฒฝ์ฐ ๋ก๊ทธ log.txt์ ์ฒญ์ทจํ ํธ๋ ์ด๋ฆ์ด ๊ธฐ๋ก๋์ด ์์ต๋๋ค.
์์ ํ ์คํฌ๋ฆฝํธ ์ฝ๋
<?php
set_time_limit(0);
header('Content-type: audio/mpeg');
header("Content-Transfer-Encoding: binary");
header("Pragma: no-cache");
header("icy-br: 128 ");
header("icy-name: your name");
header("icy-description: your description");
$files = glob("*.mp3");
shuffle($files); //Random on
for ($x=0; $x < count($files);) {
$filePath = $files[$x++];
$bitrate = 128;
$strContext=stream_context_create(
array(
'http'=>array(
'method' =>'GET',
'header' => 'Icy-MetaData: 1',
'header' =>"Accept-language: enrn"
)
)
);
//Save to log
$fl = $filePath;
$log = date('Y-m-d H:i:s') . ' Song - ' . $fl;
file_put_contents('log.txt', $log . PHP_EOL, FILE_APPEND);
$fpOrigin=fopen($filePath, 'rb', false, $strContext);
while(!feof($fpOrigin)){
$buffer=fread($fpOrigin, 4096);
echo $buffer;
flush();
}
fclose($fpOrigin);
}
?>
ํธ๋์ ์์๋๋ก ์ฌ์ํด์ผ ํ๋ ๊ฒฝ์ฐ index.php์์ ํด๋น ๋ผ์ธ์ ์ฃผ์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
shuffle($files); //Random on
ํ์บ์คํธ์ ๊ฒฝ์ฐ /var/www/podcast/๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ index.php๊ฐ ์์ต๋๋ค. ํ์บ์คํธ ํธ๋ ์๊ธฐ๊ฐ ์์ต๋๋ค. ๋ค์์ ์ธํฐ๋ท ์์ ๊ธฐ๋ฅผ ์ผ๋ฉด ๋ค์ ํ์บ์คํธ ํธ๋์ด ์ฌ์๋ฉ๋๋ค. ์ฌ์๋ ํธ๋์ ๋ก๊ทธ๋ ์์ต๋๋ค.
counter.dat ํ์ผ์์ ํธ๋ ๋ฒํธ๋ฅผ ์ง์ ํ ์ ์์ผ๋ฉฐ ์ด ๋ฒํธ์์ ํ์บ์คํธ ์ฌ์์ด ์์๋ฉ๋๋ค.
ํ์บ์คํธ ์๋ ๋ค์ด๋ก๋๋ฅผ ์ํ ํ์๋ฅผ ์์ฑํ์ต๋๋ค. RSS์์ ์ต์ 4๊ฐ ํธ๋์ ๊ฐ์ ธ์ ๋ค์ด๋ก๋ํฉ๋๋ค. ์ด ๋ชจ๋ ๊ธฐ๋ฅ์ ์ค๋งํธํฐ, IPTV ์ ํฑ๋ฐ์ค ๋๋ ๋ธ๋ผ์ฐ์ ์์ ํ๋ฅญํ๊ฒ ์๋ํฉ๋๋ค.
์ด๋ ๋ ์์นจ์๋ ํธ๋์ ์ฌ์ ์์น๋ฅผ ๊ธฐ์ตํด๋๋ฉด ์ข๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค. ํ์ง๋ง ์์ง PHP์์ ์ด ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์คํฌ๋ฆฝํธ๋ฅผ ๋ค์ด๋ก๋ํ ์ ์์ต๋๋ค.
์ถ์ฒ : habr.com