Conversation
|
Should this really be named "WiiM Player Provider" and not "Linkplay Player Provider"? Is or will this provider be hardcoded to only be specifically just for WiiM branded products or will it technically be a generic Linkplay implementation? Might we also need a seperate "Linkplay Player Provider" as well is this is added as-is? The main difference is that WiiM is only a brand while Linkplay is a (propriatory) protocol that other manufacturers can also license to use? If I understand correctly, Linkplay Technology has at least in the past licensed its Linkplay technology to others, even if it is today more focused on WiiM which is Linkplay Technology etelectronics brand (though initially it sounds like it was more meant as a reference design that others could copy to make their own Linkplay-based products). So if this provider is not WiiM-specific but instead a general Linkplay provider implementation that coould technically also be used by other manufacturers that support the Linkplay protocol then suggest name it "Linkplay Player Provider" in Music Assistant . However I see that you have also an open PR for a pure WiiM media player integration which is very relevant to this as well: PS: Public info on how Linkplay technology is used in other brands and others manufacturer's products is not perfectly clear: Quotes from https://www.linkplay.com/ "We provide a turnkey solution that includes software, Voice, Wi-Fi, Bluetooth Modules, and global streaming content integrated into one central mobile app for smart, voice-enabled, and IoT products. " "Our smart solution currently powers over hundreds of brands and smart products in multiple regions around the world, in the United States, Europe, Asia, and South America." "Brands We’ve Worked With"
Ping @Linkplay2020 / @WiimHome |
|
@Hedda I'm using the At the moment that package does not support arbitrary LinkPlay players. I'm trying to get at least the Audio Pro stuff added (e.g. Linkplay2020/wiim#7), but we'll see how that goes. I'm indifferent about naming. Maybe we could move strategy discussions like that into a separate issue and keep the discussion on this PR focused on getting the technical issues sorted out? |
|
@Hedda LinkPlay is just an OEM that provides chips for other brands (such as WiiM) to use in their audio equipment. Many of those brands have different features enabled and/or built different features on top of this. It will be close to impossible to build a LinkPlay provider that will work with all features of all brands. Ultimately, the best we can do is provide a 'generic LinkPlay provider' with just basic functionality, but that will then live next to the WiiM provider for example. |
|
If you can add a proper icon that would be great. This one would do you just have to trim the corners and turn it into a SVG. https://share.google/K8fboJeSoe1vwfpq2 |
| async def play(self) -> None: | ||
| """Play command.""" | ||
| logger = self.provider.logger.getChild(self.player_id) | ||
| logger.info("Received PLAY command on player %s", self.display_name) |
There was a problem hiding this comment.
I assume these are all here just during development?
@MarvinSchenkel I don't think that is quite correct as Linkplay Technology is actually also the company who own the WiiM brand. WiiM is just a consumer brand of the Linkplay Technology, but yes they also license their "Linkplay" tech to other companies too. If look at the wiimhome.com website you will see that it is says © 2025 Linkplay Technology Inc. And if look at the "About us" company page on the linkplay.com website it mentions that WiiM is their own brand of electronics. Linkplay Technology Inc. has full owership + control of both of Linkplay as a protocol as well as WiiM as a brand and their code. As such there is nothing preventing that company from making a single integration compatible with Linkplay and WiiM. You can kind of see WiiM as a hardware reference platform which show off what the Linkplay ecosystem can do. That is, WiiM products might have more features but the integration can techically be made cross-compatible with both. I understand it is a confusing since "Linkplay Technology" is both name of the company and their technology is named "Linkplay". Ping @Linkplay2020 and @WiimHome for further clearification. Update: Forn reference, here are few blog posts that put better words on the connection between Linkplay and its WiiM brand: "The WiiM trademark belongs to Linkplay Technology, founded in 2014. It included experienced engineers and programmers from the world’s leading companies Google, Broadcom, Harman and InterVideo, who hardly need a separate introduction. Since its inception, Linkplay has specialized in the development and improvement of voice interactive control systems, home automation and IT technologies. Her clients included Yamaha, Marshall, Edifier, Audio Pro and other well-known companies. And then LinkPlay decided to produce “smart” electronics under its own brand." "‘WiiM’ is the rather awkward brand name adopted by Linkplay for a (quickly expanding) range of home audio streaming products." "WiiM is part of LinkPlay Technology Inc., a collaborative team from the likes of Google and Harmon, developing bespoke audio streaming software and hardware for OEM partners, with bases in the US, China and South Korea." "Linkplay Technology has launched an upgraded version of its affordable audiophile music streaming box called the WiiM Pro Plus" |
Co-authored-by: OzGav <gavnosp@hotmail.com>
Co-authored-by: Marvin Schenkel <marvinschenkel@gmail.com>
Co-authored-by: Marvin Schenkel <marvinschenkel@gmail.com>
| { | ||
| "type": "player", | ||
| "domain": "wiim", | ||
| "name": "WiiM", |
There was a problem hiding this comment.
| "name": "WiiM", | |
| "name": "WiiM", | |
| ”stage”: “beta”, |
|
|
||
| await self.try_add_player(player_id, stripped_ip_address, "Unknown", upnp_device) | ||
|
|
||
| async def unload(self, is_removed: bool = False) -> None: |
There was a problem hiding this comment.
Should the ClientSession created in handle_async_ini be closed here?
| break | ||
|
|
||
| if not upnp_device: | ||
| return |
There was a problem hiding this comment.
Just confirm you want to break out of the loop here?
| elif group_info and group_info.get("role") == "follower": | ||
| pass | ||
|
|
||
| self._is_group_leader = is_current_device_leader |
There was a problem hiding this comment.
This isn’t initialised in init?
| if self.device.name != self._attr_name: | ||
| self._attr_name = self.device.name | ||
|
|
||
| self._attr_device_info = DeviceInfo( |
There was a problem hiding this comment.
I don’t think this is initialised before?
|
Just an update for anyone watching this PR: I am currently thinking that the attempt in #3067 is more promising, so the work over there is probably more relevant to try and review. @OzGav I tried to address the comments you left here over in the other PR, so hopefully you don't have to leave those again :) |
|
@davidanthoff There are some mypy errors. Make sure you run pre-commit before pushing. Also add a comment and resolve each of the conversations above. |

This is a very WIP attempt to use the official WiiM Python package (https://github.com/Linkplay2020/wiim) to implement a player provider.
Some things work, but the underlying
wiimpackage seems buggy and not in great shape at the moment. I opened a few PRs against the package that fixes a few things, but there is probably a fair bit more... This PR only works with all my PRs over at thewiimpackage merged. At the same time, there is apparently a plan to use that package for the core HA integration (home-assistant/core#148948), so fingers crossed the quality of the package will improve.I originally attempted to use the
pywiimpackage (https://github.com/mjcumming/pywiim) for this, and I'm still wondering whether that might actually be a better route, as that package seems to get a lot of attention and might be better maintained. But of course, it isn't the "official" package...It's been years that I programmed anything in Python, and certainly my first MA code, so bear with me :)