HTTPλ₯Ό ν΅ν΄ Mopidyκ° μ¬μνλ μ€λμ€ μ€νΈλ¦Όμ μ 곡νλ κ²½μ° HTTP μ€νΈλ¦Ό λ° Squeezeboxes μ κ°μ μ₯μΉλ₯Ό μ§μνλ MPD ν΄λΌμ΄μΈνΈ λͺ¨λμμ μ¬μ©ν μ μμ΅λλ€.
μ€νΈλ¦Ό μΈμ½λ©μ Ogg Vorbis λ°/λλ MP3μ¬μΌ ν©λλ€.
λ€μ μ½λλ₯Ό κ°μ ν©λλ€.
import logging
from BaseHTTPServer import BaseHTTPRequestHandler
from mopidy import get_version
logger = logging.getLogger('mopidy.outputs.http')
class StreamingHTTPRequestHandler(BaseHTTPRequestHandler):
server_version = 'HTTPOutput/%s' % get_version()
def do_GET(self):
self.send_response(200)
self.send_header('content-type', 'audio/mpeg')
self.end_headers()
register_fd_with_output(self.wfile.fileno())
self.close_connection = 0
def log_message(self, format, *args):
logger.info(format, *args)
μ¬κΈ°μ register_fd_with_output()
λ HTTPOutput( audioconvert ! lame ! multifdsink
)μ fd μ±ν¬μ μΆκ° μ νΈλ₯Ό λ΄λ³΄λ΄λ ν¨μμ΄κ³ BaseHTTPServer.HTTPServer
μ€ν μ€μΈ ThreadingActor
κ° μμ΅λλ€. StreamingHTTPRequestHandler
HTTP μ€νΈλ¦¬λ°μ΄ μλν΄μΌ ν©λλ€.
λ©νλ°μ΄ν°μ κ°μ μΆκ° κΈ°λ₯μ κ²½μ° λ€μ λ§ν¬κ° μ μ©ν΄μΌ ν©λλ€.
μμ μ½λλ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ λ° μ¬μ©νλ©΄ μ λ©λλ€. μ½λ κΈ°λ°μ νμ¬ μνλ‘ μ°λ¦¬λ cherrypyλ₯Ό κΈ°λ°μΌλ‘ νλ 무μΈκ°λ₯Ό μν©λλ€.
κ°μ₯ λ¨Όμ ν΄μΌ ν μΌμ OUTPUT
μ€μ μμ μ¬μ©ν μ μλ GStreamer μμλ₯Ό λ§λ€κ³ λ±λ‘νλ κ²μ
λλ€. λ―Ήμλ₯Ό μ¬μ©νλ©΄ #152 λλ Pitivi μμ μ μ½λλ‘ μμνκΈ°μ μΆ©λΆν΄μΌ ν©λλ€. μμλ κΈ°λ³Έμ μΌλ‘ multifdsink
λννκ³ , μ²΄λ¦¬νΌ νλͺ©μ μ²λ¦¬νκ³ μ΄λ€ μ¬μ΄μ FDλ₯Ό μ λ¬ν©λλ€.
HTTP λΆλΆμ κ΄ν΄μλ μ μ΄λ κ·Έκ²μ λν΄ μ§ννλ λ°©λ²μ΄ μμ΅λλ€. 첫 λ²μ§Έλ μλ§λ κ°μ₯ μ¬μ΄ λ°©λ²μΌ κ²μ λλ€. νλ‘ νΈμλ μλ²μ λν΄ λ 립μ μΈ cherrypy μλ²λ₯Ό μμνκ³ μ¬μ©νμμμ€. λ λ²μ§Έ, μ°λ¦¬κ° μνλ κ²μ νλ‘ νΈμλμ μ½λμ μ€νΈλ¦¬λ° λΆλΆ κ°μ 곡μ λλ μ±κΈν€ HTTP μλ²λ₯Ό κ°λ κ²μ λλ€. μ΄ λΆλΆμ νμ¬ μ κ° μλ ν ν¬κ² μλ €μ§μ§ μμ λΆλΆμ λλ€.
HTTP μλ²κ° λ°°μΉλλ©΄ 체리νμ΄μμ μμΌμ λΆλ¦¬ν΄μΌ ν©λλ€. ws4pyλ₯Ό 보면 request.rfile.rfile._sock = None
κ²μ΄ μ°λ¦¬κ° κ΄λ¦¬ν μ μλ κ°μ₯ κ°λ₯μ± μλ ν΄κ²° λ°©λ²μΈ κ² κ°μ΅λλ€. λΆλ¦¬νκΈ° μ μ μΌλΆ ν€λλ₯Ό λ΄λ³΄λ΄κ³ μΆμ κ²μ
λλ€. κ·Έλ° λ€μ fdλ₯Ό λΆλ¦¬νμ¬ μ±ν¬λ‘ λ΄λ³΄λ΄κ³ μ€νΈλ¦¬λ°ν΄μΌ ν©λλ€. ws4pyκ° μμΌμ μΈμνλ λ°©λ²μ μ΄ν΄λ³΄λ©΄ μΈλΆ μ 보λ₯Ό νμ
ν μ μμ΅λλ€.
λ€λ₯Έ λΆλΆμ FDλ₯Ό λ°©μΆν μ μλλ‘ ν΅μ¬ μ€λμ€ APIλ₯Ό νμ₯νλμ§ μ¬λΆμ λλ€. κ·Έκ²μ λ°λ‘ κ·Έ κ²½μ°μ νΉνλ κ²μ΄κ±°λ μ°λ¦¬κ° μ¬μ©νκ³ μλ μΆλ ₯ λΉμ μ κ·Όν μ μλλ‘ νλ λ μΌλ°μ μΈ κ²μ λλ€.
λ΄κ° μ μ΄κ²μ λ μΌμ° μκ°νμ§ μμλμ§ λλ μ ν λͺ¨λ₯Έλ€. κ·Έλ¬λ μμΌμ νμΉλ κ²μ κ΄ν΄μλ μ°λ¦¬κ° socket.fromfd
μ μ¬μ©νμ¬ μ 볡μ¬λ³Έμ μμ±νμ¬ μλ³Έμ μ무 μν₯ μμ΄ λ«μ μ μλλ‘ ν΄μΌ ν©λλ€.
κ°κΉμ΄ μ₯λμ μΆλ ₯ μ€νΈλ¦¬λ°μ μΆκ°ν κ³νμ΄ μμ΅λκΉ?
λλ μ΄κ²μ΄ λͺ λ¬ μ μ΄λΌλ κ²μ μκ³ μμ§λ§ μ΄κ²μ΄ λ°λλΌ MPDμμ μ ννλ κ²μ λ§λ μ μΌν κ²μ λλ€. μ€νΌμ»€κ° μ°κ²°λμ§ μμ μλ²μμ MPDλ₯Ό μ€ννκ³ μ§ μνμ λ€μν μ»΄ν¨ν°/μ₯μΉμμ HTTP μ€νΈλ¦Όμ μ‘°μ ν©λλ€. Mopidyμμ μ΄κ²μ λ³΄κ³ μΆμ΅λλ€. κ·Έλ¦¬κ³ κ·Έκ²μ΄ μ΄λ―Έ μλ€λ©΄ μ¬λ°λ₯Έ λ°©ν₯μΌλ‘ μ λ₯Ό κ°λ¦¬μΌ μ£Όμμμ€! μ μ λμ μ€λͺ μλ₯Ό μ½μμ§λ§μ΄ μμ μ μννλ λ°©λ²μ μ°Ύμ§ λͺ»νλ κ² κ°μ΅λλ€.
AFAIKλ https://docs.mopidy.com/en/latest/config/#streaming -through-shoutcast-icecastμ λ¬Έμνλ Icecast λ° λͺ κ°μ§ ν΄νΉκ³Ό κ²°ν©νμ¬ Mopidyμμ μλνλ HTTP μ€νΈλ¦¬λ°μ μ»μ μ μμ΅λλ€.
κ°λ¦¬μ€ λΈλμΉ(#1288 μ°Έμ‘°)μ λν μμ μ΄ μ§ν μ€μ΄λ©° λ€μ λΌμ΄λμ κ°λ¦¬μ€ κ°μ κ³Ό ν¨κ» μ€νΈλ¦Όμ μ μ§νκΈ° μν΄ ν΄νΉ μμ΄ Mopidy+Icecastκ° μλνλλ‘ ν΄μΌ ν©λλ€.
μ λ HTTP μ€νΈλ¦¬λ°μ μ§μ§ν κ΄μ¬μ κ°κ³ μλ€λ μ μμ μ°¨μνκ³ μΆμ΅λλ€. μ§μ₯μμ λ΄ μΉ μλ²/VPNμ λ©μ§ Moped μΉ μΈν°νμ΄μ€μμ Spotifyλ₯Ό λ£λ λ° μ¬μ©νκ³ μΆμ΅λλ€. λ‘컬μμ μ€ννκ³ μμ μ λ€μμ λ λ€μ νκ° λ¬κ³ μ격μΌλ‘ μ€ννλ €κ³ ν λ μλ§μ JACK μ€λ₯κ° λ°μνμ΅λλ€. λ λμ μ½λ© λ°©λ²μ μλ€λ©΄ μ§μ μλν΄ λ³Ό κ²μ λλ€. κ°μ¬ ν΄μ!
@jodal #1288μ λν΄ μΈκΈν λ¬Έμ κ° ν΄κ²°λμμ΅λκΉ?
μ¦, λ¬Έμμ μ΄ λΆλΆμ μ κ±°ν μ μμ΅λκΉ?
νμ¬ Mopidyλ GStreamerμμ νΈλ λκ³Ό μ€νΈλ¦Ό λ μ νΈλ₯Ό μ¬λ°λ₯΄κ² μ²λ¦¬νμ§ μμ΅λλ€. μ΄λ‘ μΈν΄ SHOUTcast μ€νΈλ¦Όμ΄ κ° νΈλμ λμμ μ°κ²°μ΄ λμ΄μ Έ μλΉν μΈλͺ¨μκ² λ©λλ€. μμΈν λ΄μ©μ #492λ₯Ό μ°Έμ‘°νμμμ€. μλμ μΈκΈλ ν΄κ²° λ°©λ²μ μλν΄ λ³Ό μλ μμ΅λλ€.
@JohnMaguire λ¬Έμμ μ΄λκ°μ λ§ν¬λ₯Ό ν¬ν¨νμ§ μμκΈ° λλ¬Έμ μμ΄λ²λ¦° μΉμ μ΄ μλμ§ μ¬λΆλ μ μ μμ΅λλ€. AFAIK λ¬Έμμ "κ°λ°" λ²μ μ 2.0μ μμ λ λ³κ²½ μ¬νμΌλ‘ μ΅μ μνμ λλ€.
μ£μ‘ν©λλ€: https://docs.mopidy.com/en/latest/config/#streaming -through-shoutcast-icecast
λ¬Έμμ κ°λ° λ²μ μμ μ λ°μ΄νΈλ κ² κ°μ΅λλ€. μ νν©λλ€: https://docs.mopidy.com/en/develop/audio/#streaming -through-icecast
@jodalλ κ°μ¬ν©λλ€!
μ§λ 2λ λμ μ λ°μ΄νΈκ° μμ΅λκΉ?
μ§λ 5λ λμ μ λ°μ΄νΈκ° μμ΅λκΉ?
μλμ. Icecastλ μ΅κ³ μ μ루μ μΌλ‘ λ¨μ μμ΅λλ€.
Mopidy 3μ μΌλΆλ‘ hlssink2μ κ°μ HTTP μ€νΈλ¦¬λ°μ μν λͺ κ°μ§ λ λμ μ΅μ μ μ 곡νλ GStreamerμ μ΅μ μ§μ λ²μ μ μΆμνμ΅λλ€. λꡬλ μ§ μ΄κ²μ μΆκ΅¬νλ λ° κ΄μ¬μ΄ μλ€λ©΄ μμνλ κ²μ΄ μ’μ΅λλ€.
Snapcast λ λ λ€λ₯Έ μ루μ μ λλ€. λ©ν°λ£Έ μ¬μμ©μΌλ‘ λ§λ€μ΄μ‘μ§λ§ λ¨μΌ ν΄λΌμ΄μΈνΈλ‘ μ€νΈλ¦¬λ°νλ λ°μλ μ¬μ©ν μ μλ μ΄μ λ μμ΅λλ€. λλ κ·Έκ²μ ν μ€νΈνμ§ μμμ§λ§ μ λ§ν΄ 보μ λλ€.
λ€, μ λ μ€λ μΊμ€νΈλ₯Ό μ¬μ©νμ΅λλ€. fifoμ μ¬μ©μ μ½κ° κΉλ€λ‘κ³ μλ‘μ΄ λ체 λ°©λ²μ΄ κ°λ°λκ³ μμμ§λ§ λ§μ§λ§μΌλ‘ κ·Έ λ°©λ²μ μ체 λ¬Έμ κ° μλ€λ μμμ λ€μμ΅λλ€. λν http μ€νΈλ¦¬λ°μ΄ μλλλ€.
κ°μ₯ μ μ©ν λκΈ
μ§λ 2λ λμ μ λ°μ΄νΈκ° μμ΅λκΉ?