task.cancel()
-async def check_output(shell_cmd: str) -> tuple[int, bytes]:
- """Run shell subprocess and return output."""
- proc = await asyncio.create_subprocess_shell(
- shell_cmd,
- stderr=asyncio.subprocess.STDOUT,
- stdout=asyncio.subprocess.PIPE,
- )
+async def check_output(args: str | list[str]) -> tuple[int, bytes]:
+ """Run subprocess and return output."""
+ if isinstance(args, str):
+ proc = await asyncio.create_subprocess_shell(
+ args,
+ stderr=asyncio.subprocess.STDOUT,
+ stdout=asyncio.subprocess.PIPE,
+ )
+ else:
+ proc = await asyncio.create_subprocess_exec(
+ *args,
+ stderr=asyncio.subprocess.STDOUT,
+ stdout=asyncio.subprocess.PIPE,
+ )
stdout, _ = await proc.communicate()
return (proc.returncode, stdout)
import ifaddr
import memory_tempfile
+from music_assistant.server.helpers.process import check_output
+
if TYPE_CHECKING:
from collections.abc import Iterator
async def install_package(package: str) -> None:
"""Install package with pip, raise when install failed."""
LOGGER.debug("Installing python package %s", package)
- cmd = f"python3 -m pip install --find-links {HA_WHEELS} {package}"
- proc = await asyncio.create_subprocess_shell(
- cmd, stderr=asyncio.subprocess.STDOUT, stdout=asyncio.subprocess.PIPE
- )
-
- stdout, _ = await proc.communicate()
+ args = ["python3", "-m", "pip", "install", "--find-links", HA_WHEELS, package]
+ return_code, output = await check_output(args)
- if proc.returncode != 0:
- msg = f"Failed to install package {package}\n{stdout.decode()}"
+ if return_code != 0:
+ msg = f"Failed to install package {package}\n{output.decode()}"
raise RuntimeError(msg)
"domain": "opensubsonic",
"name": "Open Subsonic Media Server Library",
"description": "Support for Open Subsonic based streaming providers in Music Assistant.",
- "codeowners": ["@khers"],
- "requirements": ["py-opensonic>=5.0.5"],
+ "codeowners": [
+ "@khers"
+ ],
+ "requirements": [
+ "py-opensonic==5.0.5"
+ ],
"documentation": "https://music-assistant.io/music-providers/subsonic/",
"multi_instance": true
}
orjson==3.9.15
pillow==10.2.0
plexapi==4.15.10
-py-opensonic>=5.0.5
+py-opensonic==5.0.5
pyatv==0.14.5
PyChromecast==14.0.1
pycryptodome==3.20.0