[RELEASE] Playlist Manager for Channels [Streaming Library Manager Extension]

Well, the XML guide data doesn't really exist inside of PLM that it can be pulled up on the fly; they are always just called dynamically when needed. However, I can create a report that does this functionality:

This will be made available in the next release!

as always, solid work! thanks for the quick reply. trying to read large EPG XML files is a chore...

just another thought- not sure if it'd ever come up, but how would PLM handle it if there was a duplicate EPG guide id- like "1234" was in both EPG data sources?

While the chances are extremely, extremely low, it'd be bad, m'kay?

As of v2025.06.02.1803, you can now run a scan when updating stations that checks if the child station is HLS, MPEG-TS, or not working at all. This information is then used to later assign each to final playlists (or not at all) appropriately. As you can imagine, this means you no longer need to hunt down and check if a station's stream format is different than its base source playlist (although overrides still take priority); everything will just work in Channels without having to think about it at all! Complete details can be seen on the Wiki here:

Note that if you were already using Check Station Status, you might want to re-evaluate your buffer time with the automation schedule. This process takes somewhat longer than the original version (~30%). I've also opened up an issue to also add "Disabled" to the summary chart on the Final Playlists page, so that should be coming soon.

Special thanks to @eric for helping me understand what Channels is doing in the backend during its own detection process so I could figure out a way to make it happen in PLM.

MPEG-TS is the only format needed. Just assign it to all playlists and do not bother with HLS at all.

Some stuff like TVE and SPLUS tv still use HLS. The fast channels we get through the docker all use HLS.
Thanks for the great work.

It is just not necessary to specify HLS format for a custom M3U. MPEG-TS always works and relieves the user from having to worry about specifying the right format.

Most of the stuff i play via different streaming is mpeg-ts.
Glad to have everything working.

Per that last time this topic came up:

Therefore, I will respectfully disagree and recommend that users continue to separate HLS and MPEG-TS, and use PLM to help make it easy to do so!

2 Likes

We could use this opportunity and reward the developers for admitting to being wrong for the very first time. A small price to pay for not having to worry what the playlist contains.

As far as I understand it, downgrading HLS-capable streams to MPEG-TS loses their adaptive bitrate streaming capability. In that case, doesn't knowing what the playlist contains make a difference?

I doubt anyone needs "adaptive" aka. lowered bitrate. This is actually an argument for MPEG-TS.

Source: Trust me, bro

1 Like

Please present the use case for it on the CDVR side.

Getting this error when testing this report:

Internal Server Error

The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.

I'll need logs from when you run it, please.

[error | 2025-06-05 12:39:52,260] - Exception on /reports_queries [POST]
Traceback (most recent call last):
File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 1511, in wsgi_app
response = self.full_dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 919, in full_dispatch_request
rv = self.handle_user_exception(e)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request
rv = self.dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/app/slm.py", line 6575, in webpage_reports_queries
slm_query_raw = run_query(select_report_query_input)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/app/slm.py", line 7226, in run_query
combined_xml_guide_stations_data = get_combined_xml_guide_stations()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/app/slm.py", line 7305, in get_combined_xml_guide_stations
display_name = re.search(r'(.*?)', line).group(1)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'group'
2025-06-05 12:39:52.261467: ERROR: Webpage responded... 500 INTERNAL SERVER ERROR

Can you confirm for me that you have a situation like this in at least one of you XML guides:

<display-name>
   Blah Blah
</display-name>

As opposed to:

<display-name>Blah Blah</display-name>

And if there are any other oddities, like spaces around the display-name field?

here's some samples from my sources:

Try this version:

If you are still getting errors, there should be more info in the logs now.