mirror of
https://github.com/home-assistant/core.git
synced 2025-07-28 15:47:12 +00:00
Refactor esphome ffmpeg proxy (#129330)
This commit is contained in:
parent
2c7d0b8909
commit
56fb61bd6f
@ -153,11 +153,10 @@ class FFmpegConvertResponse(web.StreamResponse):
|
|||||||
self.proxy_data = proxy_data
|
self.proxy_data = proxy_data
|
||||||
self.chunk_size = chunk_size
|
self.chunk_size = chunk_size
|
||||||
|
|
||||||
async def prepare(self, request: BaseRequest) -> AbstractStreamWriter | None:
|
async def transcode(
|
||||||
|
self, request: BaseRequest, writer: AbstractStreamWriter
|
||||||
|
) -> None:
|
||||||
"""Stream url through ffmpeg conversion and out to HTTP client."""
|
"""Stream url through ffmpeg conversion and out to HTTP client."""
|
||||||
writer = await super().prepare(request)
|
|
||||||
assert writer is not None
|
|
||||||
|
|
||||||
command_args = [
|
command_args = [
|
||||||
"-i",
|
"-i",
|
||||||
self.convert_info.media_url,
|
self.convert_info.media_url,
|
||||||
@ -195,6 +194,14 @@ class FFmpegConvertResponse(web.StreamResponse):
|
|||||||
# Only one conversion process per device is allowed
|
# Only one conversion process per device is allowed
|
||||||
self.convert_info.proc = proc
|
self.convert_info.proc = proc
|
||||||
|
|
||||||
|
await self._write_ffmpeg_data(request, writer, proc)
|
||||||
|
|
||||||
|
async def _write_ffmpeg_data(
|
||||||
|
self,
|
||||||
|
request: BaseRequest,
|
||||||
|
writer: AbstractStreamWriter,
|
||||||
|
proc: asyncio.subprocess.Process,
|
||||||
|
) -> None:
|
||||||
assert proc.stdout is not None
|
assert proc.stdout is not None
|
||||||
assert proc.stderr is not None
|
assert proc.stderr is not None
|
||||||
|
|
||||||
@ -206,8 +213,7 @@ class FFmpegConvertResponse(web.StreamResponse):
|
|||||||
and (not request.transport.is_closing())
|
and (not request.transport.is_closing())
|
||||||
and (chunk := await proc.stdout.read(self.chunk_size))
|
and (chunk := await proc.stdout.read(self.chunk_size))
|
||||||
):
|
):
|
||||||
await writer.write(chunk)
|
await self.write(chunk)
|
||||||
await writer.drain()
|
|
||||||
except asyncio.CancelledError:
|
except asyncio.CancelledError:
|
||||||
raise # don't log error
|
raise # don't log error
|
||||||
except:
|
except:
|
||||||
@ -231,8 +237,6 @@ class FFmpegConvertResponse(web.StreamResponse):
|
|||||||
# Close connection
|
# Close connection
|
||||||
await writer.write_eof()
|
await writer.write_eof()
|
||||||
|
|
||||||
return writer
|
|
||||||
|
|
||||||
|
|
||||||
class FFmpegProxyView(HomeAssistantView):
|
class FFmpegProxyView(HomeAssistantView):
|
||||||
"""FFmpeg web view to convert audio and stream back to client."""
|
"""FFmpeg web view to convert audio and stream back to client."""
|
||||||
@ -279,6 +283,10 @@ class FFmpegProxyView(HomeAssistantView):
|
|||||||
convert_info.proc = None
|
convert_info.proc = None
|
||||||
|
|
||||||
# Stream converted audio back to client
|
# Stream converted audio back to client
|
||||||
return FFmpegConvertResponse(
|
resp = FFmpegConvertResponse(
|
||||||
self.manager, convert_info, device_id, self.proxy_data
|
self.manager, convert_info, device_id, self.proxy_data
|
||||||
)
|
)
|
||||||
|
writer = await resp.prepare(request)
|
||||||
|
assert writer is not None
|
||||||
|
await resp.transcode(request, writer)
|
||||||
|
return resp
|
||||||
|
Loading…
x
Reference in New Issue
Block a user