рд▓рд┐рдХреНрд╡рд┐рдбрд╕реИрдк + рдЖрдЗрд╕рдХреИрд╕реНрдЯ рдЗрдВрдЯрд░рдиреЗрдЯ рд░реЗрдбрд┐рдпреЛ рд╕реНрдЯреЗрд╢рди

liquidsoap рдЕрдВрджрд░ рд╕реЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдм рдкрд░ рдХрд╛рдлреА рдХреБрдЫ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрдВрдЯрд░рдиреЗрдЯ рдкреНрд░рд╕рд╛рд░рдг рдХреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦреА рдЧрдИ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдиреАрдВрд╡ рд╣реИрдВ , рдЬреЛ рдореИрдВ рдЖрдкрдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдПрдХ рдЕрдиреНрдп рд╢реМрдХрд┐рдпрд╛ рдЗрдВрдЯрд░рдиреЗрдЯ рд░реЗрдбрд┐рдпреЛ рд╕реНрдЯреЗрд╢рди рдХреЗ рд╕рдВрдЧрдарди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЬреЛ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд░реВрдк рд╕реЗ рдЕрд▓реНрдк -рдЬреНрдЮрд╛рдд рд▓рд┐рдХреНрд╡рд┐рдбрд╕реИрдк 1.0.1 рдФрд░ рд╕рд░реНрд╡рд╡реНрдпрд╛рдкреА рдЖрдЗрд╕рдХреИрд╕реНрдЯ 2.3.2 рдХреЗ рдПрдХ рд╕рдореВрд╣ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд▓реЗрдЦ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдХрдо рд╕реЗ рдХрдо рд▓рдЧрднрдЧ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо, рдЖрдЗрд╕рдХреИрд╕реНрдЯ, рд▓рд┐рдирдХреНрд╕ рдХрдВрд╕реЛрд▓ рдФрд░ рдпрд╣ рдЖрдо рддреМрд░ рдкрд░ рдХреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХ рдиреМрд╕рд┐рдЦрд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рдирд┐рд░реНрдгрдп рдЗрд╖реНрдЯрддрдо рдХреЗ рд╢реАрд░реНрд╖рдХ рдХрд╛ рджрд╛рд╡рд╛ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЖрд╡рд╢реНрдпрдХ рд╕рд╛рд░рд╛рдВрд╢ рдХрд╛рд░реНрдпрд╢реАрд▓рддрд╛


  1. рдордирдорд╛рдиреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛
  2. рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ OGG, MP3, FLAC рдкрд┐рдХрдЕрдк рдХрд╛ рд╕рдорд░реНрдерди
  3. рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рдиреНрдпрд╛рд╕
  4. рд░реЗрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд╛рджрди рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдЖрд╕рд╛рдиреА
  5. рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ
  6. рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рд▓рд┐рдирдХреНрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдм рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛

рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЗ рд▓рдВрдмреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж, рдореИрдВ рд▓рд┐рдХреНрд╡рд┐рдбрд╕реИрдк + рдЖрдЗрд╕рдХрд╛рд╕реНрдЯ рдкрд░ рдмрд╕ рдЧрдпрд╛ред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдФрд░ рд╡реНрдпрд╛рдкрдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдПрдирд╛рд▓реЙрдЧреНрд╕ рдХреА рддрд▓рд╛рд╢ рднреА рдирд╣реАрдВ рдХреА рдереА), рдФрд░ рд▓рд┐рдХреНрд╡рд┐рдбрд╕реИрдк рдЕрдкрдиреА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдЕрджреНрднреБрдд рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд▓рд┐рдПред рдЙрдирд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ ices, ices + ardj, AirTime рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛, рдХреБрдЫ рдФрд░ рдЬреЛ рдореИрдВ рднреА рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЙрди рд╕рднреА рдиреЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдореБрдЭреЗ рд╕реВрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВрдиреЗ рд▓рд┐рдХреНрд╡рд┐рдбрд╕реИрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдХрдорд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ, рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдЕрдЬреНрдЮрд╛рдд рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рддрд╣рдд рдПрдХ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░реАрдо рдЬрд╛рд░реА рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ (рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж) - рдпрд╣ рдПрдХ рд░рд┐рдмреВрдЯ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВ рдЕрдкрдиреА рд╕рд╛рд░реА рд╢рдХреНрддрд┐ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВ - рд╕рднреА рджрд╕реНрддрд╛рд╡реЗрдЬ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдФрд░ рдпрд╣ рдореЗрд░реЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ - рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВрдиреЗ рдХреБрдЫ рд╕реАрдЦрд╛ рд╣реИ рдФрд░ рд╣рд░ рдЙрд╕ рдЪреАрдЬ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдЬрд┐рд╕реЗ рдореИрдВ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реВрдВред

рд╕реНрдерд╛рдкрдирд╛


рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╣рд┐рдЪрдХрд┐рдЪрд╛рд╣рдЯ рдХреЗ, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд▓реИрдкрдЯреЙрдк рдкрд░ рдЦреБрд▓реЗ 12.2 x64 рдХреЗ рддрд╣рдд рдпрд╣ рд╕рдм рдЪрдорддреНрдХрд╛рд░ рдЙрдард╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рддрд╛рдХрд┐ рд▓рд┐рдХреНрд╡рд┐рдбрд╕реИрдк рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЗрд╕реЗ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдорд╢реАрди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдХреЗрд╡рд▓ рдЖрдЗрд╕рдХреИрд╕реНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдореМрдЬреВрдж рдерд╛, рд▓рд┐рдХреНрд╡рд┐рдбрд╕реИрдк рдХреЛ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ред рдбреЗрдмрд┐рдпрди / рдЙрдмрдВрдЯреВ, рд╡рд┐рдВрдбреЛрдЬ, рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕, рдлреНрд░реАрдмреАрдПрд╕рдбреА рдФрд░ рдЖрд░реНрдХрд▓рд┐рдирдХреНрд╕ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Icecast

рдореИрдВрдиреЗ рдорд╛рдирдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдЖрдЗрд╕рдХрд╛рд╕реНрдЯ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреА:
# zypper in icecast 

рдореИрдВ рдЖрдЗрд╕рдХреИрд╕реНрдЯ рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдореИрдВ рдХреЗрд╡рд▓ рдореЗрд░реЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрдХрд╛рд░реА рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛:

/etc/icecast.xml
 <icecast> <limits> <clients>100</clients> <sources>2</sources> <threadpool>5</threadpool> <queue-size>524288</queue-size> <client-timeout>30</client-timeout> <header-timeout>15</header-timeout> <source-timeout>10</source-timeout> <burst-on-connect>1</burst-on-connect> <burst-size>65535</burst-size> </limits> <authentication> <source-password>mypass</source-password> <relay-password>mysecondpass</relay-password> <admin-user>adminuser</admin-user> <admin-password>mythirdpass</admin-password> </authentication> <hostname>localhost</hostname> <listen-socket> <port>8000</port> </listen-socket> <fileserve>1</fileserve> #_____________________________________________________________ #   .      ,          ,      .      ices     secure. <mount> <mount-name>/secure</mount-name> <hidden>1</hidden> #   -      <charset>UTF8</charset> #  </mount> #   mount' <mount> <fallback-mount>/secure</fallback-mount> #   ,    <fallback-override>1</fallback-override> #           <fallback-when-full>1</fallback-when-full> #    ,       <mount-name>/HabraRadio_192</mount-name> #  mount'. <charset>UTF8</charset> #  </mount> <mount> <fallback-mount>/secure</fallback-mount> <fallback-override>1</fallback-override> <fallback-when-full>1</fallback-when-full> <mount-name>/HabraRadio_320</mount-name> <charset>UTF8</charset> </mount> <mount> <fallback-mount>/secure</fallback-mount> <fallback-override>1</fallback-override> <fallback-when-full>1</fallback-when-full> <mount-name>/HabraRadio_vorbis_avg_128</mount-name> <charset>UTF8</charset> </mount> #_____________________________________________________________ <paths> <basedir>/usr/share/icecast</basedir> <logdir>/var/log/icecast</logdir> <webroot>/usr/share/icecast/web</webroot> <adminroot>/usr/share/icecast/admin</adminroot> <alias source="/" dest="/status.xsl"/> </paths> <logging> <accesslog>access.log</accesslog> <errorlog>error.log</errorlog> <loglevel>3</loglevel> <logsize>10000</logsize> </logging> <security> <chroot>0</chroot> <changeowner> <user>icecast</user> <group>icecast</group> </changeowner> </security> </icecast> 


Liquidsoap

рдбрд╛рдЙрдирд▓реЛрдб, рддреИрдпрд╛рд░:
 $ git clone https://github.com/savonet/liquidsoap-full.git liquidsoap $ cd liquidsoap $ make init $ cp PACKAGES.minimal PACKAGES 

рдореЗрд░реЗ рд▓рд┐рдП, рдПрдХ рдиреНрдпреВрдирддрдо рд╕реЗрдЯ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдкреИрдХреНрд╕реИрдЬ рдлрд╛рдЗрд▓ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП:
 # zypper in make autoconf automake ocaml libao-devel libmad-devel libmp3lame-devel flac-devel libgavl-devel ocaml-camomile-devel ocaml-camlimages-devel ocaml-camomile-data libtheora-devel ocaml-findlib-devel libsamplerate-devel libtag-devel libvorbis-devel gcc-c++ ocaml-pcre-devel libtiff-devel libjpeg62-devel libXpm-devel 

рд╣рдо рдПрдХрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
 $ ./bootstrap $ ./configure --with-user=user --with-group=users $ make # make install 

рд╡реИрд╕реЗ, "./configure ..." рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЬреЛ рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд╣ рд╕рднреА рдЕрд╕реЗрдВрдмрд▓реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧреАред рдпрд╣ рдХреЗрд╡рд▓ "./configure ..." рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рджреЗрдЦрдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣реА рд╣реИ, рдЖрдк "рд▓рд┐рдХреНрд╡рд┐рдбрд╕реИрдк - рдПрд╡рд░реНрд╕рди" рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рд╣рдо рд╣рд╡рд╛ рдХреА рдЕрдиреБрд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реЛрдВрдЧреЗ


рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
  1. 02: 00-06: 00 - рд░рд╛рдд рдХреА рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ
  2. 06: 00-09: 00 - рд╕реБрдмрд╣ рдХреА рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ
  3. 09: 00-19: 00 - рджрд┐рди рдХреА рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ
  4. рд╢рд╛рдо 7 рдмрдЬреЗ - 2 рдмрдЬреЗ - рд╢рд╛рдо рдХреА рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ
  5. рд╕реЛрдо, рдмреБрдз, рд╢реБрдХреНрд░ - 21: 00-22: 00 - рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо
  6. рд╕реЛрдо, рдмреБрдз, рдЧреБрд░реБ, рд╢реБрдХреНрд░ - 18: 00-19: 00 - рджреВрд╕рд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо

рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕реНрдерд╛рди:
 radio тФЬтФАтФА collection |  тФВ тФЬтФАтФА efir |    тФВ тФВ тФЬтФАтФА daytime |   тФВ тФВ тФВ тФЬтФАтФА jingles | ,   тФВ тФВ тФВ тФФтФАтФА music | ,   тФВ тФВ тФЬтФАтФА evening | ,  тФВ тФВ тФВ тФЬтФАтФА jingles тФВ тФВ тФВ тФФтФАтФА music тФВ тФВ тФЬтФАтФА morning |  тФВ тФВ тФВ тФЬтФАтФА jingles тФВ тФВ тФВ тФФтФАтФА music тФВ тФВ тФФтФАтФА night |   тФВ тФВ тФЬтФАтФА jingles тФВ тФВ тФФтФАтФА music тФВ тФЬтФАтФА programs тФВ тФВ тФЬтФАтФА 1_prog | 1  тФВ тФВ тФЬтФАтФА 2_prog | 2  тФВ тФЬтФАтФА promo |   тФВ тФФтФАтФА security |     тФЬтФАтФА technical | ,  тФФтФАтФА  |    

рд▓рд┐рдХреНрд╡рд┐рдбрд╕реИрдк рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди


рддреБрд░рдВрдд рддреИрдпрд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд▓рд╛рдПрдБ:

./radio/technical/start_liquidsoap
 #!/usr/local/bin/liquidsoap #          #      out = output.icecast( #   icecast host = "127.0.0.1", #   port = 8000, #  user = "source", #   password = "mypass", #  name = "-", #  genre = "Rock", #    url = "http://habrahabr.ru", #  encoding = "UTF-8" ) #  telnet- set("server.telnet.bind_addr","127.0.0.1") set("server.telnet",true) # _____________________________________ #     . #    ,       ,       ,       .   ,   . #      wd = "/home/user/radio" #      pl = "#{wd}/collection" #   tech = "#{wd}/technical" #  set("log.file.path","#{tech}/liquidsoap.log") #     set("log.level", 3) #   #     promo_dir = "#{pl}/promo" #    progr_dir = "#{pl}/programs" #     ef = "#{pl}/efir" #    ni = "#{ef}/night" mo = "#{ef}/morning" da = "#{ef}/daytime" ev = "#{ef}/evening" #    mus_ni_dir = "#{ni}/music" mus_mo_dir = "#{mo}/music" mus_da_dir = "#{da}/music" mus_ev_dir = "#{ev}/music" #    jin_ni_dir = "#{ni}/jingles" jin_mo_dir = "#{mo}/jingles" jin_da_dir = "#{da}/jingles" jin_ev_dir = "#{ev}/jingles" #   .   -      ,   -    . 1_prog_pl = "#{progr_dir}/1_prog.pl" 2_prog_pl = "#{progr_dir}/2_prog.pl" # _____________________________________ #    "source",     . #   "reload"    360     ,  . #  ,   ,  <code>mode = "normal"</code>     . #  , , ,  mus_ni = playlist (reload = 360, "#{mus_ni_dir}") mus_mo = playlist (reload = 360, "#{mus_mo_dir}") mus_da = playlist (reload = 360, "#{mus_da_dir}") mus_ev = playlist (reload = 360, "#{mus_ev_dir}") jin_ni = playlist (reload = 360, "#{jin_ni_dir}") jin_mo = playlist (reload = 360, "#{jin_mo_dir}") jin_da = playlist (reload = 360, "#{jin_da_dir}") jin_ev = playlist (reload = 360, "#{jin_ev_dir}") promo = playlist (reload = 360, "#{promo_dir}") 1_prog = playlist (reload = 360, "#{1_prog_pl}", mode = "normal") 2_prog = playlist (reload = 360, "#{2_prog_pl}", mode = "normal") # _____________________________________ #  4 ,    #   ins_ni = rotate (weights = [2, 1], [jin_ni, promo]) ins_mo = rotate (weights = [2, 1], [jin_mo, promo]) ins_da = rotate (weights = [2, 1], [jin_da, promo]) ins_ev = rotate (weights = [2, 1], [jin_ev, promo]) #     ni = rotate (weights = [3, 1], [mus_ni, ins_ni]) mo = rotate (weights = [3, 1], [mus_mo, ins_mo]) da = rotate (weights = [3, 1], [mus_da, ins_da]) ev = rotate (weights = [3, 1], [mus_ev, ins_ev]) #_______________________________________________________________________ #    radio = switch (track_sensitive = true, [ ({ (1w21h - 1w22h) or (3w21h - 3w22h) or (5w21h - 5w22h)}, 1_prog), ({ (1w18h - 1w19h) or (3w18h - 3w19h) or (4w18h - 4w19h) or (5w18h - 5w19h)}, 2_prog), ({ 2h - 6h }, ni), ({ 6h - 9h }, mo), ({ 9h - 19h }, da), ({ 19h - 2h }, ev) ]) #_______________________________________________________________________ #  crossfade radio = crossfade(start_next=1., fade_out=1., fade_in=1., radio) # , ,      out( %vorbis.abr(samplerate = 44100, channels = 2, bitrate = 128, max_bitrate = 192, min_bitrate = 96), description = "Average vorbis 96-128-192 Kbps", mount = "HabraRadio_vorbis_avg_128", mksafe(radio) ) out( %mp3(bitrate = 320, id3v2 = true), description = "MP3 320 Kbps", mount = "HabraRadio_320", mksafe(radio) ) out( %mp3(bitrate = 192, id3v2 = true), description = "MP3 192 Kbps", mount = "HabraRadio_192", mksafe(radio) ) 


рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ:
1) рдпреЗ рдкрдВрдХреНрддрд┐рдпрд╛рдБ:
 wd = "/home/user/radio" pl = "#{wd}/collection" ef = "#{pl}/efir" ni = "#{ef}/night" mus_ni_dir = "#{ni}/music" mus_ni = playlist (reload = 360, "#{mus_ni_dir}") 

рдХрд╛рдлреА рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
 mus_ni = playlist (reload = 360, "/home/user/radio/collection/efir/night/music") 

рдФрд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рд▓рд┐рдХреНрд╡рд┐рдбрд╕реИрдк рдХреЗрд╡рд▓ # {wd} рдХреЗ рдмрдЬрд╛рдп wd рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред

2) рдЬрд┐рд╕ рд╕реНрдерд╛рди рдкрд░ рд╣рдордиреЗ рдЖрд╡реЗрд╖рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдерд╛, рд╡рд╣рд╛рдВ рд▓рд╛рдЗрдиреЗрдВ рдереАрдВ:
 ins_ni = rotate (weights = [2, 1], [jin_ni, promo]) ni = rotate (weights = [3, 1], [mus_ni, ins_ni]) 

rotate() - рдЖрдкрдХреЛ рдХрддрд╛рд░ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
weights = [2, 1], [jin_ni, promo] - jin_ni рд╕реЗ 2 рдЯреНрд░реИрдХ рд▓реЗрдиреЗ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ, рдлрд┐рд░ рдкреНрд░реЛрдореЛ рд╕реЗ 1, рдмрд╛рд░-рдмрд╛рд░ 2 рдЯреНрд░реИрдХ рдХреЗ рдмрд╛рдж jin_ni рд╕реЗ рдФрд░ рдЗрддрдиреЗ рдкрд░ред
weights = [3, 1], [mus_ni, ins_ni] - рдореБрд╕_рдиреА рд╕реЗ 3 рдЯреНрд░реИрдХ рд▓реЗрдиреЗ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ, рдлрд┐рд░ рдкрд╣рд▓реЗ рд╕реЗ рдорд┐рд╢реНрд░рд┐рдд рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рд╕реЗ 1 рдЯреНрд░реИрдХ рдЬреЛ рдкрд╣рд▓реЗ рдПрдХ рд▓рд╛рдЗрди (ins_ni) рдирд┐рдХрд▓рд╛ред

3) рдкреНрд░рд╕рд╛рд░рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╕рдордп, рд╣рдордиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:
 radio = switch (track_sensitive = true, [ ({ (1w21h - 1w22h) or (3w21h - 3w22h) or (5w21h - 5w22h)}, 1_prog), ({ (1w18h - 1w19h) or (3w18h - 3w19h) or (4w18h - 4w19h) or (5w18h - 5w19h)}, 2_prog), ({ 2h - 6h }, ni), ({ 6h - 9h }, mo), ({ 9h - 19h }, da), ({ 19h - 2h }, ev) ]) 


switch() - рдСрдбрд┐рдпреЛ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдордп рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИред
track_sensitive = true - рд╡рд░реНрддрдорд╛рди рдЯреНрд░реИрдХ рдХреЛ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╕рдХреНрд░рд┐рдп рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рд╣реЛред рдпрд╛рдиреА рдпрджрд┐ рд░рд╛рдд рдХрд╛ рдЯреНрд░реИрдХ 05:59 рд╕реЗ рд╢реБрд░реВ рд╣реБрдЖ, рддреЛ рдЬрдм рддрдХ рдпрд╣ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛, рддрдм рддрдХ рд╕реБрдмрд╣ рдХреА рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рдкреНрд░рднрд╛рд╡реА рдирд╣реАрдВ рд╣реЛрдЧреАред
({ (1w21h - 1w22h) or (3w21h - 3w22h) or (5w21h - 5w22h)}, 1_prog), - рд╕реЛрдорд╡рд╛рд░, рдмреБрдзрд╡рд╛рд░ рдФрд░ рд╢реБрдХреНрд░рд╡рд╛рд░ рдХреЛ 21 рд╕реЗ 22 рдШрдВрдЯреЗ рддрдХ рд╕реНрд░реЛрдд 1_prog рдЦреЗрд▓рддреЗ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рд╕реНрд╡рд┐рдЪ рдореЗрдВ рдЙрди рдкрдВрдХреНрддрд┐рдпреЛрдВ () рдХреА рд╕реВрдЪреА рдЬреЛ рдКрдкрд░ рд╕реНрдерд┐рдд рд╣реИрдВ, рдЙрдирдХреА рд╕рд░реНрд╡реЛрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИред

рдПрдХ рд░реЗрдбрд┐рдпреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдПрдХ рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рдмрдирд╛рдирд╛


рд╕рд┐рджреНрдзрд╛рдВрдд рд╕рд░рд▓ рд╣реИ: prog_1 рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ "01_ProgName" рдлреЙрд░реНрдо рдХреА рд░реЗрдбрд┐рдпреЛ рдкреНрд░рд╕рд╛рд░рдг рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд░реЗрдбрд┐рдпреЛ рд╣реЛрд╕реНрдЯ рдХреА рдЖрд╡рд╛рдЬреЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХреА рдЬрд╛рддреА рд╣реИрдВред рдкреНтАНрд▓реЗрд▓рд┐рд╕реНтАНрдЯ рдлреЙрд░реНрдо рдХрд╛ рд╣реЛрдЧрд╛:

01_ProgName
Music152
02_ProgName
Music241
03_ProgName
Music937
...

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмреИрд╢ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреА рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдирд░реЗрдЯрд░ рд▓рд┐рдЦрдирд╛ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдкрд╛рдпрдерди рд╕реЗ рдорд┐рд▓рд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рдкрд░ рд╡реНрд╣рд┐рдк рдХрд┐рдпрд╛:

./radio/technical/generatorProg1.py
 #!/usr/bin/env python2 # -*- coding: utf-8 -*- import os import random finalPaylist = '/home/user/radio/collection/programs/1_prog.pl' music = '/home/user/radio/collection/efir/evening/music/' show = '/home/user/radio/collection/programs/1_prog/' myShow = sorted(os.listdir(show)) myMusic = os.listdir(music) listOfTracks = [] def getRandomTrack(list): i = 0 buf = random.choice(myMusic) while (buf in list) & (not i == 100): i += 1 buf = random.choice(myMusic) return buf for i in range(60): if not i%2: try: listOfTracks.append(show + myShow[i/2]) except : listOfTracks.append(music + getRandomTrack(listOfTracks)) else: listOfTracks.append(music + getRandomTrack(listOfTracks)) myFile = open(finalPaylist, 'w') for i in range(len(listOfTracks)): myFile.write(listOfTracks[i]+'\n') 

рдкрд░рд┐рдгрд╛рдо рдПрдХ рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рд╣реИ рдЬреЛ рд░реЗрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмрд┐рдирд╛ рднреА рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдШрдВрдЯреЗ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред рдореБрдЦреНрдп рдмрд╛рдд рдЧреИрд░-рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдореЛрдб рдореЗрдВ рдЗрд╕ рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рдХреЛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рднреВрд▓рдирд╛ рд╣реИред рдЦреИрд░, рджреВрд╕рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рднреА рд╣реИред

рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢


Crontab рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рдкреАрдврд╝реА рдбрд╛рд▓реЗрдВ:

Crontab -e
 0 19 * * * /home/user/radio/technical/generatorProg1.py 0 16 * * * /home/user/radio/technical/generatorProg2.py 

рдХреЗрдбреАрдИ рдСрдЯреЛрд░рди рдореЗрдВ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ:

/home/user/.kde4/Autostart/start_liquidsoap.sh
 #!/bin/sh cp /home/user/radio/technical/liquidsoap.log /home/user/radio/technical/liquidsoap_backup.log cat /dev/null > /home/user/radio/technical/liquidsoap.log liquidsoap /home/user/radio/technical/start_liquidsoap 

рдСрдЯреЛрд╕реНрдЯрд╛рд░реНрдЯ рдЖрдЗрд╕рдХреИрд╕реНрдЯ рднреА рдЪреЛрдЯ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рдПрдЧрд╛
 /etc/init.d/icecast start chkconfig --add icecast 

рдФрд░, рдХреНрдпрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг, рдЕрдВрддрд┐рдо рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо NTP рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдпрд╣рд╛рдВ рдмрд╣реБрдд рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕рдордп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ YaST рдХреЗ рддрд╣рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ


рдЕрдм рдпрд╣ рд░реЗрдбрд┐рдпреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдлрд╝рд╛рдЗрд▓реЗрдВ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рдиреАрдЪреЗ рд╕реЗ рдПрдХ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝ рджреА рдЬрд╛рддреА рд╣реИрдВ, рдЬрд┐рд╕реЗ рдУрдкрдирд╡реАрдкреАрдПрди + рд╕рд╛рдВрдмрд╛ рдмрдВрдбрд▓, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреНрд▓реЗ, рд▓реЙрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрднрд╡ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╣реИрдВ: рдкреНрд░рддреНрдпреЗрдХ рдШрдВрдЯреЗ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЖрд╡реЗрд╖рдг рдмрдЬрд╛рдирд╛, рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рдХреЗ рдЕрдкрдиреЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛, рд░рд┐рдореЛрдЯ рдХреЙрдиреНрдлреНрд░реЗрдВрд╕ рдХреЙрд▓ рдСрди рдж рдПрдпрд░, рд╕рдм рдХреБрдЫ рдФрд░ рд╣рд░ рдЪреАрдЬ рд╕реЗ рдореБрдХрд╛рдмрд▓рд╛ рдХрд░рдирд╛, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рджреЛрд╖ рд╕рд╣рд┐рд╖реНрдгреБ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде рдиреБрдХрд╕рд╛рди рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░рдирд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд▓рд┐рдХреНрд╡рд┐рдбрд╕реИрдк рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдПрдХ рдЦреБрд╢реА рд╣реИред рд╕рднреА рдХреЛ рдЕрдЪреНрдЫрд╛ рд╕рдВрдЧреАрддред

UPD: рдорд┐рд▓рд░ рд╕реЗ рдЕрдиреБрдкреВрд░рдХ ред

UPD 2: рдХреНрд░реЙрд╕рдлрд╝реЗрдб рдХреЗ рдмрд╛рдж рдореМрди рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрд░реЙрд╕рдлрд╝реЗрдб рд╕реЗ рдкрд╣рд▓реЗ рд▓рд╛рдЗрди рдЬреЛрдбрд╝реЗрдВ:
 radio = mksafe(radio) 

рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП kvaps рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/In156591/


All Articles