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

Thanks @babsonnexus and @Jean0987654321 . As above, I failed with the port change and the fresh install with restoring my original program_files folder, but I have now resolved the problem.

After a bit of trial and error, logic suggested there was some issue in the playlists, so I did another fresh install, copied just the StreamLinkManager files back, which restored previous efforts on that, and just the PlaylistManager_StreamingStations file, which restored that. That just left me to start from scratch on the Manage Playlists. Thankfully my set up is pretty basic, so it wasn't too much effort. All good now.

Do you still have your original files? I'd be interested to see what the difference is between them and your fixed ones. For instance, is one of them (especially PlaylistManager_Combinedm3us.csv missing its header row or have some character in one of the more recent bottom rows that is not liked? If you do find something, please let me know; and also if you can remember what you were doing right before the issues above started. If there is some type of bug that can be triggered, even by unlikely actions, I'd like to snuff it out in a future version.

Yes, I still had the old PlaylistManager_Combinedm3us.csv file, and you are spot on, it's missing the column headers. The date modified metadata for that file was 16/04/2026 at 02:00, so I suspect this was an scheduled automation, I certainly wasn't tinkering at that time on a Thursday morning! I can't be fully sure what automation used to run at 02:00 but I suspect it was Playlist Manager: Update Station List because that is the default on my clean install.

Thanks again for your help and all the work you put in on this.

1 Like

Hmmmm... that wouldn't be doing anything special that should cause that, and there are even protections that shouldn't let your stations get deleted if there was a connection problem or something to the source playlist(s). If you recall anything that you may have done the day prior, like removing your source playlists or adding a new one, let me know so I can investigate further.

The only thing that happened, but a least a few days before the 16th, was I noticed a problem in channels, then I couldn't access SLM through my bookmark at all. I found this was because I changed my mesh network earlier in the year, but I forgot to reserve the IP for the mini PC I run channels and SLM on. There must have been an update on the router and it issued a new IP on reboot. I had to change the IP for my SLM m3u and xlm files in channels. But, other than the bookmark, I don't recall having to change anything in SLM/PLM because the only playlists in linear stations reference "localhost" or ".local", or are web addresses or deeplinks.
It could have been a change I made in SLM/PLM that I can't recall relating to this, or just as a result of this change causing some confusion, but I remember checking end to end that everything worked, and it was fine. It seems like whatever happened, it was finally triggered by a subsequent automation process.
It all been fine since the new install, so no problem here, but if it helps in anyway, that's great.

Are you still seeing this as true? I'm doing some testing and I am getting the exact opposite result:

2026/07/19 16:27:41.009633 [ERR] Error during stream M3U-PLMGracenoteFallbackMPEGTS01 ch1037 AMC: Detected HLS playlist instead of MPEG-TS

In other words, I could not play a HLS stream in a MPEG-TS playlist in Channels; the backend stopped me from doing so.

Maybe the "feature" was discovered and removed in one of the recent updates.

We fixed the glitch! :wink:

1 Like

I'm actually starting to think its only in very specific circumstance that it doesn't work, and I was unlucky enough to find one. Most of the time, HLS does pass through in a MPEG-TS custom channels souce. I've been chasing a ghost for days, but I actually think it's fairly limited in which situations this is true.


EDIT: Here's some logs showing a MPEG-TS source successfully playing a HLS Stream (with a warning):

2026/07/23 17:10:49.493297 [TNR] Opened connection to M3U-PLMNonGracenoteFallbackMPEGTS01 for ch1915 Star Trek: The Next Generation
2026/07/23 17:10:49.497496 [HLS] Starting live stream for channel 1915 from 172.22.0.1 (bitrate=3321kbps)
2026/07/23 17:10:54.854717 [HLS] ffmpeg: ch1915-dANY-ip172.22.0.1-remux:  [mpegts @ 0xbeb3cc0] Stream 2, codec webvtt, is muxed as a private data stream and may not be recognized upon reading.

Have a problematic link which is causing a 500 on updating:

2026-07-28 06:38:27.370643:  Creating and removing Stream Link/File files and directories...
2026-07-28 06:38:27.420362:  INFO: Creating Stream Link/File file(s) for 1923 (2022) | SHOW ...
    Error with original path: [Errno 2] No such file or directory: '/app/channels_folder/Imports/TV/slm/1923 (2022)/Season 01/S01E01.strmlnk'
[error | 2026-07-28 06:38:27,421] - Exception on /tools_automation [POST]
Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 1511, in wsgi_app

This happened after I:

  1. deleted the episode in channels
  2. reordered provider order
  3. ran automation to pick up the provider change

I've even deleted the series in slm, and then also tried re-adding after the crash too - no luck. An way to clear this out?

I'm having great difficulty getting an exact replication of what you're seeing. For future reference, more of the of the log is necessary to know where the issue is happening, especially something like this:

  File "c:\Users\...\OneDrive\04 Media\Channels Backups\~Programs\Developement\Stream Link Manager\slm_web\slm.py", line 17251, in create_file
    with open(file_path, 'w', encoding="utf-8") as file:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PermissionError: [Errno 13] Permission denied: '\\\\nexus-world-x\\Files\\Media\\Channels DVR 8090\\recordings\\Imports\\TV\\slm\\1923 (2022)\\Season 01\\S01E01.strmlnk'
2026-07-28 10:12:46.803634:  ERROR: Webpage responded... 500 INTERNAL SERVER ERROR

Or this:

  File "c:\Users\...\OneDrive\04 Media\Channels Backups\~Programs\Developement\Stream Link Manager\slm_web\slm.py", line 17149, in normalize_path
    return unicodedata.normalize('NFKC', path)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: normalize() argument 2 must be str, not None
2026-07-28 10:39:57.397810:  ERROR: Webpage responded... 500 INTERNAL SERVER ERROR

Based on what I have been able to do by forcing a lot of things manually, for you, it appears that either the Stream Link file or some parent directory it is in has become read-only or has had permissions removed. I'm assuming this is occurring on the Channels server side. If you make the files/directories writable/permission granted again, it should clear up.

If you can get more of the logs and let me know if modifying access in the some way fixed things, I can see if there is anything I can do in SLM to mitigate.

As of v2026.07.28.1543, this is no longer true! You now have the ability to create "Fallback" feed(s) that do know if a stream/tuner is unavailable/broken and then move on to the next source. Read all about it on the Wiki:

This resolves one of my biggest qualms with Channels in that now you only need one version of a station in your listings and PLM will handle figuring one which one is working and play that. In other words, if, say, the Channels TVE source for HGTV fails during the middle of the day, then it can fallback to ADBTuner. And if ADBTuner's tuners are all filled, it can fallback to PrismCast. There is no limit to the number of source playlists you can use, how many times you want to retry, and how long that link remains "valid" for.

I'm so excited for you to get to use this feature and, as always, simply enjoy!

This better? Let me know

2026-07-29 05:43:15.401656:  INFO: Creating Stream Link/File file(s) for 1883 (2021) | SHOW ...
    Error with original path: [Errno 2] No such file or directory: '/app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01/S01E01.strmlnk'
[error | 2026-07-29 05:43:15,407] - Exception on /tools_automation [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 13523, in webpage_tools_automation
    generate_stream_links(None)
  File "/app/slm.py", line 14841, in generate_stream_links
    create_stream_link_files(bookmarks, True, original_release_date_list)
  File "/app/slm.py", line 15542, in create_stream_link_files
    file_path_return = normalize_path(file_path_return)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/slm.py", line 17149, in normalize_path
    return unicodedata.normalize('NFKC', path)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: normalize() argument 2 must be str, not None
2026-07-29 05:43:15.410077:  ERROR: Webpage responded... 500 INTERNAL SERVER ERROR

Well, @hancox , you are doing better than I am. My SLM won't even allow the UI after the update! I've had to go back to an earlier version to be functional. Arrrgggghhhh....

Yes, narrowed down some possibilities. Please go ahead and upgrade to prerelease v2026.07.29.1123, try again, and report back. With that version, you should no longer get 500 crashes in the UX and all processes will complete, not locking out the Manage Programs page. However, errors may still be happening, and additional debugging information will be in the logs. You may see something like one of these:

2026-07-29 11:34:41.122998:  INFO: Creating Stream Link/File file(s) for 1923 (2022) | SHOW ...
    OS/Permission Error while creating '/app/channels_folder/Imports/TV/slm/1923 (2022)/Season 01/1923 (2022) - S01E01.strmlnk': [Errno 13] Permission denied: '/app/channels_folder/Imports/TV/slm/1923 (2022)/Season 01/1923 (2022) - S01E01.strmlnk'
2026-07-29 11:35:33.917706:  WARNING: Unable to find path '/app/channels_folder/Imports/TV/slm/1923 (2022)/Season 01' and therefore unable to create Stream Link/File file '1923 (2022) - S01E01'. Retrying...
2026-07-29 11:35:34.922217:  WARNING: Unable to find path '/app/channels_folder/Imports/TV/slm/1923 (2022)/Season 01' and therefore unable to create Stream Link/File file '1923 (2022) - S01E01'. Retrying...
2026-07-29 11:35:35.927108:  WARNING: Unable to find path '/app/channels_folder/Imports/TV/slm/1923 (2022)/Season 01' and therefore unable to create Stream Link/File file '1923 (2022) - S01E01'. Retrying...
2026-07-29 11:35:36.929715:  ERROR: After 3 attempts, still unable to find path '/app/channels_folder/Imports/TV/slm/1923 (2022)/Season 01' and therefore unable to create Stream Link/File file '1923 (2022) - S01E01'.
2026-07-29 11:35:36.930363:  ERROR: Skipping creation of 1923 (2022) - S01E01 in /app/channels_folder/Imports/TV/slm/1923 (2022)/Season 01. Please make sure SLM has all the necessary security permissions and write access in the host directory.

My intuition is telling me we are dealing with either a timing or permission issue. What is your Channels DVR host machine on, and what is its relationship to the SLM Container?


Nothing in the update should impact SLM launching the UX. Please provide log information, even if it's just from Docker Desktop's log view. Need to know if its getting stuck during one of the startup routines/checks.

Now the "latest" is working fine. Strange, as I tried it several times, back and forth with a previous release earlier, and it wouldn't come up before. Oh well. lol

Tried this - process finished, but all stream links deleted.

Relation to DVR is same host running in docker on the 1 click stack as slm.

2026-07-30 05:41:21.091807:  Creating and removing Stream Link/File files and directories...
2026-07-30 05:41:21.096061:  INFO: Creating Stream Link/File file(s) for 1883 (2021) | SHOW ...
    Error with original path '/app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01/S01E01.strmlnk': [Errno 2] No such file or directory: '/app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01/S01E01.strmlnk'
2026-07-30 05:41:21.102216:  ERROR: Skipping creation of S01E01 in /app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01. Please make sure SLM has all the necessary security permissions and write access in the host directory.
    Error with original path '/app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01/S01E02.strmlnk': [Errno 2] No such file or directory: '/app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01/S01E02.strmlnk'
2026-07-30 05:41:21.103972:  ERROR: Skipping creation of S01E02 in /app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01. Please make sure SLM has all the necessary security permissions and write access in the host directory.
    Error with original path '/app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01/S01E03.strmlnk': [Errno 2] No such file or directory: '/app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01/S01E03.strmlnk'
2026-07-30 05:41:21.104492:  ERROR: Skipping creation of S01E03 in /app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01. Please make sure SLM has all the necessary security permissions and write access in the host directory.
    Error with original path '/app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01/S01E04.strmlnk': [Errno 2] No such file or directory: '/app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01/S01E04.strmlnk'
2026-07-30 05:41:21.104952:  ERROR: Skipping creation of S01E04 in /app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01. Please make sure SLM has all the necessary security permissions and write access in the host directory.
    Error with original path '/app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01/S01E05.strmlnk': [Errno 2] No such file or directory: '/app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01/S01E05.strmlnk'
2026-07-30 05:41:21.105402:  ERROR: Skipping creation of S01E05 in /app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01. Please make sure SLM has all the necessary security permissions and write access in the host directory.
    Error with original path '/app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01/S01E06.strmlnk': [Errno 2] No such file or directory: '/app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01/S01E06.strmlnk'
2026-07-30 05:41:21.105923:  ERROR: Skipping creation of S01E06 in /app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01. Please make sure SLM has all the necessary security permissions and write access in the host directory.
    Error with original path '/app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01/S01E07.strmlnk': [Errno 2] No such file or directory: '/app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01/S01E07.strmlnk'
2026-07-30 05:41:21.106400:  ERROR: Skipping creation of S01E07 in /app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01. Please make sure SLM has all the necessary security permissions and write access in the host directory.
    Error with original path '/app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01/S01E08.strmlnk': [Errno 2] No such file or directory: '/app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01/S01E08.strmlnk'
2026-07-30 05:41:21.106852:  ERROR: Skipping creation of S01E08 in /app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01. Please make sure SLM has all the necessary security permissions and write access in the host directory.
    Error with original path '/app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01/S01E09.strmlnk': [Errno 2] No such file or directory: '/app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01/S01E09.strmlnk'
2026-07-30 05:41:21.107362:  ERROR: Skipping creation of S01E09 in /app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01. Please make sure SLM has all the necessary security permissions and write access in the host directory.
    Error with original path '/app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01/S01E10.strmlnk': [Errno 2] No such file or directory: '/app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01/S01E10.strmlnk'
2026-07-30 05:41:21.108009:  ERROR: Skipping creation of S01E10 in /app/channels_folder/Imports/TV/slm/1883 (2021)/Season 01. Please make sure SLM has all the necessary security permissions and write access in the host directory.

Good, that's expected behavior given the error you are generating.

What is the host? How is the folder structure shared (directly between Containers, through the host, something else)? Please don't be stingy with details and give me everything you can so we are not going back and forth on this.

In the Channels Container, go to Imports\TV\slm and delete the 1883 (2021) folder if there is one. Then, re-run generating the stream links (you don't need to do the other steps, that will suffice) and see in the logs if you get more errors, specifically around directory creation. If not, check to see if the directory has been created there and let me know. Further, check the security/access permissions on all levels of the directories.

Basically, here's what's happening and where the problem points could be:

  • Creates the necessary endpoint directory, i.e. \Imports\TV\slm\1883 (2021)\Season 01.
  • Checks to see if the directory exists and loops around a few times waiting for it appear to make sure it isn't a timing problem.
  • If the directory is found to exist, attempts to create the file and put the Stream Link inside of it.

Any failure during this is likely related to security/privileges/access. To be clear, that would mean they are not SLM issues, but that something is going on with your specific setup.

Well, good/bad news:

Bad news - we may have eclipsed this troubleshooting step
because
Good news - a subsequent automation run re-added all links without any other action.

My gut tells me this was due to my order of operations from the original post, somehow:

Thinking maybe the deletion did something weird on just that object's perm. Def. a weird one, though.

Well, I'm glad it is resolved, at least! I doubt those steps could cause the issue because they are fairly mundane, everyday activities that were hashed out back in Alpha. Does still seem like a permissions issue of some kind since deleting the directories freed up SLM to create them again with no problems. But for now, guess we'll just move on. Still, should something similar happen again, let me know!

So I tried to flip back to latest tag, and it's all falling over again, and it's not consistent on the same program/season either.

I don't think it's a perms issue, either - the files all have same perms, it just creates a 0 byte file, and that is where it bombs out.

-rwx------ 1 me staff 101 Aug 3 06:47 S01E05.strmlnk
-rwx------ 1 me staff 111 Aug 3 06:47 S01E04.strmlnk
-rwx------ 1 me staff 106 Aug 3 06:47 S01E03.strmlnk
-rwx------ 1 me staff 106 Aug 3 06:47 S01E02.strmlnk
-rwx------ 1 me staff 105 Aug 3 06:47 S01E08.strmlnk
-rwx------ 1 me staff 109 Aug 3 06:47 S01E07.strmlnk
-rwx------ 1 me staff 112 Aug 3 06:47 S01E06.strmlnk
-rwx------ 1 me staff 0 Aug 3 06:51 S01E01.strmlnk

2026-08-03 06:51:16.886500:  INFO: Creating Stream Link/File file(s) for 1923 (2022) | SHOW ...
    Error with original path: [Errno 2] No such file or directory: '/app/channels_folder/Imports/TV/slm/1923 (2022)/Season 01/S01E01.strmlnk'
[error | 2026-08-03 06:51:16,888] - Exception on /tools_automation [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 13523, in webpage_tools_automation
    generate_stream_links(None)
  File "/app/slm.py", line 14841, in generate_stream_links
    create_stream_link_files(bookmarks, True, original_release_date_list)
  File "/app/slm.py", line 15542, in create_stream_link_files
    file_path_return = normalize_path(file_path_return)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/slm.py", line 17149, in normalize_path
    return unicodedata.normalize('NFKC', path)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: normalize() argument 2 must be str, not None
2026-08-03 06:51:16.895955:  ERROR: Webpage responded... 500 INTERNAL SERVER ERROR