RoonCommandLine Version 2.0.5 Release 1

RoonCommandLine version 2.0.5 release 1 was released today. This release adds upgrade features, zone info, and several new commands.

This release preserves existing configuration if it detects a previous release of RoonCommandLine is already installed. Only the Roon Core IP and port are reconfigured if necessary. In addition, the default zone groupings in roon_api.ini are improved to avoid grouping incompatible zones. Python scripts utilizing the Roon API have been improved to remove all warnings and use a single source for providing the extension version to Roon.

Changes to RoonCommandLine commands include changing the shuffle and repeat commands to toggles, similar to what was done for mute. Note that repeat does not mimic the Roon loop feature which cycles through three values - ‘loop’, ‘loop_one’, and ‘disabled’. The repeat command in RoonCommandLine and the Python Roon API is a Boolean and toggles between ‘loop’ and ‘disabled’.

A mute_all command was added to toggle playback muting in all Roon zones.

A pause_all command was added to pause playback in all Roon zones.

A play_all command was added to begin playback in all Roon zones.

A stop_all command was added to stop playback in all Roon zones and release devices.

A -i option was added to the roon command to display zone information. In the absence of any -z zone argument, information on all zones is displayed. If a zone is specified in combination with the -i argument, e.g. -i -z Kitchen, then extended information is displayed for that zone alone. The Python script zone_properties.py was added to support this feature.

See below for a summary of changes in recent RoonCommandLine releases. To install or upgrade RoonCommandLine, visit the download link for Version 2.0.5 Release 1 at:

Download the latest Debian or RPM package format release

If you are upgrading from a previous RoonCommandLine release then see the Upgrades section of the README.

Install the package on Debian based systems by executing the command

sudo apt install ./RoonCommandLine_2.0.5-1.deb

Install the package on RPM based systems by executing the command

sudo yum localinstall ./RoonCommandLine-2.0.5-1.rpm

Removal of the package on Debian based systems can be accomplished by issuing the command:

sudo apt remove rooncommandline

Removal of the package on RPM based systems can be accomplished by issuing the command:

sudo yum remove RoonCommandLine

To install on Mac OS X, clone the repository and execute the Install command:

git clone https://gitlab.com/doctorfree/RoonCommandLine.git
cd RoonCommandLine
./Install

Recent RoonCommandLine releases included the following enhancements:

RoonCommandLine version 2.0.4 release 3 was a feature modification release.

That release changed the mute/unmute commands to a toggle. Both commands operate exactly the same, toggling the muting/unmuting of the selected zone or zone grouping. The two commands are retained rather than removing unmute in order to preserve compatibility with any existing scripts that use these commands.

RoonCommandLine version 2.0.4 release 2 was a bugfix release.

That release fixed a bug with muting/unmuting ungrouped zones.

RoonCommandLine version 2.0.4 release 1 added zone and zone grouping volume control.

The command `roon -v volume` sets the volume level in the selected zone.

The `volume` argument has the format `[g:][r:][s:]num`

Where `g` indicates set volume for all zones in the group
      `r` specifies use relative method volume setting
      `s` specifies use relative_step method volume setting
      `num` can be absolute (0-100) or relative (negative or positive)

RoonCommandLine version 2.0.3 release 2 added several new commands including support for playing a specified track by artist, playing a specified album by artist, playing either a specified artist or album in designated genre, playing a specified composer, and additional listing options. Listing and playing commands now include support for artist and album name exclusion strings allowing searches for a specified artist/album/composer/genre/playlist whose name includes a specified string but not another string. This exclusion filtering enables narrower listing, searching, and playing of library media.

Checks for Python 3 and Pip were added to pre-installation scripts, MacOS installation has been significantly improved, installation of the roonapi Pip module is handled more gracefully.

RoonCommandLine version 2.0.x releases added support for detection of the Roon Core port as well as its IP address. The port number is stored in roon_api.ini and used in all subsequent calls to the Python Roon API. This was necessary as Roon Labs changed the port number in the most recent update. Extensions shouldn’t be assuming a hard coded port number anyway so this change prompted a good improvement although it was irritating at first. A bug introduced by the change to return status of the Bash builtin type command was addressed. RoonCommandLine commands’ location are added to PATH or full path used in SSH invocations. The installation script has been revised to work with the updated Python roonapi module version numbering. SSH invocations should work in a wider range of environments with this release.

The installation automatically detects and stores the Roon Core IP and port. There is no need for any manual configuration.

IMPORTANT NOTE Older versions of RoonCommandLine will no longer function properly. In order to use RoonCommandLine you must install version 2.0.2 release 1 or later.

2 Likes

Hey @Ronald_Record – thanks for yet another update. Install/Upgrade did not go as planned this time (Mac mini, Monterrey):

rene@George RoonCommandLine % ./Install
Install RoonCommandLine version 2.0.5r1 ? ('Y'/'N'): y
WARNING: The directory '/Users/rene/Library/Caches/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you should use sudo's -H flag.
Requirement already satisfied: roonapi in /Library/Python/3.8/site-packages (0.1.1)
Requirement already satisfied: requests>=2.0 in /Library/Python/3.8/site-packages (from roonapi) (2.26.0)
Requirement already satisfied: ifaddr>=0.1.0 in /Library/Python/3.8/site-packages (from roonapi) (0.1.7)
Requirement already satisfied: websocket_client>=0.57.0 in /Library/Python/3.8/site-packages (from roonapi) (1.2.3)
Requirement already satisfied: six>=1.10.0 in /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/site-packages (from roonapi) (1.15.0)
Requirement already satisfied: charset-normalizer~=2.0.0 in /Library/Python/3.8/site-packages (from requests>=2.0->roonapi) (2.0.9)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /Library/Python/3.8/site-packages (from requests>=2.0->roonapi) (1.26.7)
Requirement already satisfied: idna<4,>=2.5 in /Library/Python/3.8/site-packages (from requests>=2.0->roonapi) (3.3)
Requirement already satisfied: certifi>=2017.4.17 in /Library/Python/3.8/site-packages (from requests>=2.0->roonapi) (2021.10.8)
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
cp: /usr/local/Roon/etc/roon_api.ini: Permission denied
cat: /usr/local/Roon/etc/roon_api.ini: No such file or directory
cat: /usr/local/Roon/etc/roon_api.ini: No such file or directory
grep: /usr/local/Roon/etc/roon_api.ini: No such file or directory
cat: /usr/local/Roon/etc/roon_api.ini: No such file or directory
sed: 1: "/RoonCorePort.*/a RoonC ...": command a expects \ followed by text
cp: /usr/local/Roon/etc/roon_api.ini: Permission denied
grep: /usr/local/Roon/etc/roon_api.ini: No such file or directory
cat: /usr/local/Roon/etc/roon_api.ini: No such file or directory
sed: 1: "/RoonCommandLineVersion ...": command a expects \ followed by text
cp: /usr/local/Roon/etc/roon_api.ini: Permission denied
id: Shared: no such user
Setting the Python Roon API server IP address to 192.168.178.158
Enabling local access in /usr/local/Roon/etc/pyroonconf
cp: /usr/local/Roon/etc/pyroonconf: Permission denied

In order to configure the Python Roon API we must set the IP address
of the Roon Core. Discovery will be used to determine the Roon Core IP.
When prompted for authorization, go to a Roon Remote window and click
    Settings -> Extensions -> Enable
to authorize discovery

Traceback (most recent call last):
  File "get_core_ip.py", line 8, in <module>
    tokenfile = config['DEFAULT']['TokenFileName']
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/configparser.py", line 1254, in __getitem__
    raise KeyError(key)
KeyError: 'TokenFileName'
cat: /usr/local/Roon/etc/roon_api.ini: No such file or directory
Traceback (most recent call last):
  File "list_zones.py", line 9, in <module>
    server = config['DEFAULT']['RoonCoreIP']
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/configparser.py", line 1254, in __getitem__
    raise KeyError(key)
KeyError: 'RoonCoreIP'

Verify the 'server' and 'user' settings in the roon script are correct
and copy the 'roon' frontend shell script to a location in your execution
PATH on all systems from which you wish to control Roon via SSH

Edit the Roon Command Line configuration settings at:
/usr/local/Roon/etc/roon_api.ini
and verify the settings in the configuration file /usr/local/Roon/etc/pyroonconf

Uninstalled and reinstalled to no avail. Is it me? :smiley:

Nope, me too.

(base) djn@trinity RoonCommandLine % ./Install
Install RoonCommandLine version 2.0.5r1 ? ('Y'/'N'): y
Password:
WARNING: The directory '/Users/djn/Library/Caches/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you should use sudo's -H flag.
Requirement already satisfied: roonapi in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (0.1.1)
Requirement already satisfied: requests>=2.0 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from roonapi) (2.27.1)
Requirement already satisfied: ifaddr>=0.1.0 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from roonapi) (0.1.7)
Requirement already satisfied: six>=1.10.0 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from roonapi) (1.16.0)
Requirement already satisfied: websocket_client>=0.57.0 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from roonapi) (1.3.2)
Requirement already satisfied: certifi>=2017.4.17 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from requests>=2.0->roonapi) (2021.10.8)
Requirement already satisfied: charset-normalizer~=2.0.0 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from requests>=2.0->roonapi) (2.0.12)
Requirement already satisfied: idna<4,>=2.5 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from requests>=2.0->roonapi) (3.3)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from requests>=2.0->roonapi) (1.26.9)
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
/usr/local/share/doc/RoonCommandLine/changelog.gz already exists -- do you wish to overwrite (y or n)? y
cp: /usr/local/Roon/etc/roon_api.ini: Permission denied
cat: /usr/local/Roon/etc/roon_api.ini: No such file or directory
cat: /usr/local/Roon/etc/roon_api.ini: No such file or directory
grep: /usr/local/Roon/etc/roon_api.ini: No such file or directory
cat: /usr/local/Roon/etc/roon_api.ini: No such file or directory
sed: 1: "/RoonCorePort.*/a RoonC ...": command a expects \ followed by text
cp: /usr/local/Roon/etc/roon_api.ini: Permission denied
grep: /usr/local/Roon/etc/roon_api.ini: No such file or directory
cat: /usr/local/Roon/etc/roon_api.ini: No such file or directory
sed: 1: "/RoonCommandLineVersion ...": command a expects \ followed by text
cp: /usr/local/Roon/etc/roon_api.ini: Permission denied
id: Shared: no such user
Setting the Python Roon API server IP address to 192.168.68.145
Enabling local access in /usr/local/Roon/etc/pyroonconf
cp: /usr/local/Roon/etc/pyroonconf: Permission denied

In order to configure the Python Roon API we must set the IP address
of the Roon Core. Discovery will be used to determine the Roon Core IP.
When prompted for authorization, go to a Roon Remote window and click
    Settings -> Extensions -> Enable
to authorize discovery

Traceback (most recent call last):
  File "/usr/local/Roon/api/get_core_ip.py", line 8, in <module>
    tokenfile = config['DEFAULT']['TokenFileName']
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/configparser.py", line 1258, in __getitem__
    raise KeyError(key)
KeyError: 'TokenFileName'
cat: /usr/local/Roon/etc/roon_api.ini: No such file or directory
Traceback (most recent call last):
  File "/usr/local/Roon/api/list_zones.py", line 9, in <module>
    server = config['DEFAULT']['RoonCoreIP']
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/configparser.py", line 1258, in __getitem__
    raise KeyError(key)
KeyError: 'RoonCoreIP'

Verify the 'server' and 'user' settings in the roon script are correct
and copy the 'roon' frontend shell script to a location in your execution
PATH on all systems from which you wish to control Roon via SSH

Edit the Roon Command Line configuration settings at:
/usr/local/Roon/etc/roon_api.ini
and verify the settings in the configuration file /usr/local/Roon/etc/pyroonconf

Running ./Uninstall then reinstalling seems to have worked for me but I ran into a permissions problem with the /usr/local/Roon/etc folder, i.e. it was set with Read & Write permissions for ‘system’, and Read Only for ‘wheel’ and ‘everyone’. Once I added my user account for the folder, and gave myself Read & Write permissions, everything was working again.

1 Like

No luck so far getting this to install or work on macOS Catalina (v10.15.7). I’m using pyenv to manage Python versions, so that could be part of my issues.

I’ll pull a Raspberry Pi out of a drawer and give it a try on that later this weekend. Thanks for the effort!

Thanks for the problem reports. It looks like there is a permission problem, at least on Mac installs. I will try and track it down as quickly as possible but Real Life may get in the way today. Is everybody experiencing this issue on a Mac? If anyone is using either the Debian or RPM package to install please raise your hand. Thanks.

2 Likes

Just installed the .deb on Debian Bullseye – works just fine.

Don’t sweat it – we’ll pick up the new release when it’s ready. Real Life always goes first. :smiley:

1 Like

I was able to identify a problem with permissions in the macInstall script fairly quickly and easily. There may be other issues, I am still testing and probably won’t have much more time today. However, I updated the macInstall script and tested it a bit and it seems to work, for me anyway. So give it a try if you want to help me test or wish to update your Macs to 2.0.5r1 today.

To install this release on a Mac using the fixed macInstall script, first:

cd RoonCommandLine
git pull

This should update your previously cloned version of macInstall.

I would suggest uninstalling then installing as one of my tests produced a zero length roon_api.ini which, with the upgrade features in this release, would get carried forward in the install.

To install after the git pull succeeds:

./Uninstall
./Install

Sorry about this. We have built a Tower of Babel and I forgot to check one of the towers well enough.

NOTE: This only pertains to Mac installs/upgrades. If you are using the Debian or RPM format installation packages you can ignore this. Also, if you are on a Mac but have not already tried and failed to install this release successfully then you can ignore this.

3 Likes

Confirmed working – after pulling in the new macInstall script and uninstalling/installing all appears to be OK.

I got it working with your fix and by manually running pip3 install roonapi before running ./Install.

Now to spend some time figuring things out. Behavior is not quite what I would expect, but it could be that I just don’t understand the arguments or configuration.

$ list_playlists
No playlists found matching  Bowie Favs

I don’t know where “Bowie Vavs” came from. LOL. I was expecting to just see a list of my playlists. No luck with flags either


$ list_playlists -h
usage: list_playlists.py [-h] [-p PLAYLIST] [-x EXPLAYLIST] [-z ZONE]
list_playlists.py: error: argument -p/--playlist: expected one argument

$ list_playlists -p Larry
usage: list_playlists.py [-h] [-p PLAYLIST] [-x EXPLAYLIST] [-z ZONE]
list_playlists.py: error: argument -p/--playlist: expected one argument

$ list_playlists -z "The Bar Sonos"  # actually the name of one of my zones
usage: list_playlists.py [-h] [-p PLAYLIST] [-x EXPLAYLIST] [-z ZONE]
list_playlists.py: error: argument -p/--playlist: expected one argument

I would not expect -h to complain about a missing argument for -p. No combination of arguments seems to work, and running it without arguments uses defaults that are not relevant to my library.

Mysterious, but I’ve not ruled out my lack of understanding. I’ll keep poking around.

Take a look at this page: it will definitely help with configuring and using Roon Command Line.

1 Like

I uninstalled and reinstalled and most things seem to be working. That said, there seems to be a problem with playlists insofar as "roon - l playlists’ only returns one playlist: ‘An Introduction to Qobuz’.

Searching for a playlist keyword also generates an error, as follows:

(base) djn@trinity RoonCommandLine % roon -l playlists -s "hannibal"
Traceback (most recent call last):
  File "list_playlists.py", line 70, in <module>
    playlists = roonapi.list_media(output_id, ["Playlists", playlistsearch])
  File "/Users/djn/opt/anaconda3/lib/python3.8/site-packages/roonapi/roonapi.py", line 416, in list_media
    total_count = self.browse_browse(opts)["list"]["count"]
TypeError: 'NoneType' object is not subscriptable

I’m also getting a similar error with genres:

(base) djn@trinity RoonCommandLine % roon -g default
Traceback (most recent call last):
  File "play_genre.py", line 71, in <module>
    genres = roonapi.list_media(output_id, ["Genres", genresearch])
  File "/Users/djn/opt/anaconda3/lib/python3.8/site-packages/roonapi/roonapi.py", line 455, in list_media
    total_count = self.browse_browse(opts)["list"]["count"]
TypeError: 'NoneType' object is not subscriptable

I guess this is something to do with my Python installation (/Users/djn/opt/anaconda3/lib/python3.8) but don’t know if this is a bug with RoonCommandLine or something I need to fix at my end. Any advice would be gratefully received.

EDIT
I tried updating Python, but it didn’t help:

djn@trinity opt % roon -g default                    
Traceback (most recent call last):
  File "/usr/local/Roon/api/play_genre.py", line 71, in <module>
    genres = roonapi.list_media(output_id, ["Genres", genresearch])
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/roonapi/roonapi.py", line 455, in list_media
    total_count = self.browse_browse(opts)["list"]["count"]
TypeError: 'NoneType' object is not subscriptable

@David_Snyder and @DaveN , thanks for the problem reporting. It looks like the issues are on my end, not yours. I will get fixes out as quickly as possible. It appears there are multiple issues and those are not restricted to a single command. Also, I don’t like how the list commands use a default in the absence of a search argument. I think they should list all when none is specified. So I might change the intended behavior. All this means it might take me more than a day although I think there are some immediate fixes I could get done easily and quickly.

As for where does the “Bowie Favs” come from when listing playlists, this comes from /usr/local/Roon/etc/roon_api.ini which is used by all the commands to set some configuration options and fallback defaults. The distributed default playlist is “Bowie Favs”. These default settings are meant to be configured by the Roon user to suit your library and taste. I just picked some initial defaults. I may change the way this is handled but for now edit roon_api.ini and change these default settings to fit your library and preference. At any rate, listings should probably default to “all” rather than the default.

2 Likes

Also, @David_Snyder , the problem with listing playlists seems to be with the list_playlists command but works properly (for me) when listing playlists with roon -l playlists. The roon command is used to frontend all of the RoonCommandLine commands and is intended as the primary user interface. It massages the arguments properly (in this case, adding a __all__ argument if no playlist search term is specified).

Still, the backend commands should work as expected when invoked directly and without need for arcane knowledge of how to supply the proper arguments. Let me know if you encounter problems with the roon command not functioning as expected.

1 Like

That works for me.

Thanks.

This isn’t working for me, I have 17 playlists, only one of which is displayed 


djn@trinity lastcollage-cli % roon -l playlists          

All Playlists in Library:

An Introduction to Qobuz!

EDIT: I don’t know if this will help, but I just tested the other list options. Some work, but ‘genres’ ‘genalbum’, genartists’ and ‘tags’ all fail with pretty much the following error 


roon -l tags      
Traceback (most recent call last):
  File "/usr/local/Roon/api/list_tags.py", line 65, in <module>
    tags = roonapi.list_media(output_id, ["Library", "Tags", searchterm])
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/roonapi/roonapi.py", line 455, in list_media
    total_count = self.browse_browse(opts)["list"]["count"]
TypeError: 'NoneType' object is not subscriptable

@DaveN , I am not yet able to reproduce what you are seeing. Perhaps this is due to some difference between our environments (i’ve tried on both Mac and Linux but of course Python is a many headed beast) or a difference in our libraries (this should not matter unless the library is damaged) or our RoonCommandLine configuration (my guess).

You are somehow managing to provoke an unchecked situation in the Python Roon API where it is trying to get a property of an object but that object has not been set. I am working on submitting some changes to pyroon to address this. But I do not understand why you are seeing this while I am not able to provoke it.

I will keep trying to reproduce these issues. Can you send me your roon_api.ini and perform a test by directly invoking a Python script?

For example, try listing all of your tags by doing the following:

cd /usr/local/Roon/api
python3 list_tags.py -t __all__

Or do something similar with any of the other listings you have had problems with. This will probably eliminate the roon command and the backend list_tags command as possible culprits and narrow it down to just the Python script and Python Roon API.

[DEFAULT]
DefaultAlbum = Diamond Mine
DefaultArtist = Jethro Tull
DefaultComposer = Wolfgang Amadeus Mozart
DefaultGenre = Classical
DefaultPlaylist = Shipping Forecast
DefaultRadio = BBC Radio 4
DefaultTag = Another Late Night
DefaultZone = Kef LSX
TokenFileName = /usr/local/Roon/etc/roontoken.txt
RoonCoreIP = 192.168.68.145
RoonCorePort = 9330
RoonCommandLineVersion = 2.0.5
RoonCommandLineRelease = 1

[ZONEGROUPS]
# Zone Groups can be anything of the form "Group_<your group zone name>".
# I am using numbers. Whatever you use, that will be the argument to the
# set_zone_group command, e.g. "roon -G 1 -c group" or "roon -G 3 -c ungroup".
# Use the command "roon -l zones" to get a listing of your enabled zone names.
# Add as many zone groupings in this section as you like, each with a unique
# key of the form "Group_*".
#
# Example zone grouping
# Group_0 = Mac Pro DAC, Mac Pro Line Out
# Group_1 = Mac Pro DAC, Kitchen
# Group_2 = HomePod Max, HomePod Mini Left, HomePod Mini Right
# Group_3 = Kitchen, Mac Pro Line Out
# Group_4 = Mac Pro Line Out, Mac Pro DAC, Kitchen
Group_0 = Sonos One, Kef LSX, Mac mini Speakers, DragonFly Cobalt
Group_1 = 
Group_2 = 
Group_3 = 
Group_4 = 

I don’t know enough about Python to diagnose the following, but it does seem to indicate that it’s something about my environment that’s causing the issue:

djn@trinity api % cd /usr/local/Roon/api
djn@trinity api % python3 list_tags.py -t __all__
Traceback (most recent call last):
  File "/usr/local/Roon/api/list_tags.py", line 34, in <module>
    from roonapi import RoonApi
ModuleNotFoundError: No module named 'roonapi'

@DaveN , it looks like the Python Roon API module did not get installed correctly on your system. This may have been the result of the order in which RoonCommandLine and Python were installed as I think you upgraded Python after having installed RoonCommandLine. It’s probably something i should address somehow but I’m not yet sure how. Let’s confirm. Try running:

python3 -m pip show roonapi

If all is well this should output details of the Python roonapi module including name, version, author, and so on. The version should be 0.1.1. It will also display the location. If it returns something like WARNING: Package(s) not found: roonapi then you need to install the Python roonapi module. This can be done by Uninstalling and Installing RoonCommandLine or by installing roonapi manually:

python3 -m pip install roonapi

There are several pitfalls wrt Python module installation including global versus local installs, installation being Python version specific, and use/access to cached modules. These issues are outside the scope of projects like RoonCommandLine and are really issues with the design of Python. Hopefully your issues can be addressed easily with a simple module install. If not, we will continue to investigate.

1 Like

I think you’re on the right track, but we’re not there yet 


djn@trinity api % python3 -m pip show roonapi
WARNING: Package(s) not found: roonapi

So I reinstalled and now get 


djn@trinity RoonCommandLine % python3 -m pip show roonapi    
Name: roonapi
Version: 0.1.1
Summary: Provides a python interface to interact with Roon
Home-page: https://github.com/pavoni/pyroon
Author: Marcel van der Veldt
Author-email: 
License: Apache-2.0
Location: /Users/djn/.pyenv/versions/3.10.3/lib/python3.10/site-packages
Requires: ifaddr, requests, six, websocket_client
Required-by: 

However 


djn@trinity RoonCommandLine % python3 list_tags.py -t __all__
/Users/djn/.pyenv/versions/3.10.3/bin/python3: can't open file '/Users/djn/src/RoonCommandLine/list_tags.py': [Errno 2] No such file or directory

This seems odd to me because ‘list_tags.py’ isn’t in RoonCommandLine it’s in RoonCommandLine/api

Is there something I need to change?

Also, I’m still getting the following when using ‘roon -l tags’.

djn@trinity RoonCommandLine % roon -l tags
Traceback (most recent call last):
  File "/usr/local/Roon/api/list_tags.py", line 65, in <module>
    tags = roonapi.list_media(output_id, ["Library", "Tags", searchterm])
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/roonapi/roonapi.py", line 455, in list_media
    total_count = self.browse_browse(opts)["list"]["count"]
TypeError: 'NoneType' object is not subscriptable