GUI app to make it easy to schedule manual recordings

mjitkop/Channels-DVR-Manual-Recording (

Hopefully I have made it so user-friendly that no explanations are needed to use it.

You may use the Python file as long as you have Python installed on your system and possibly extra modules too. I'm not exactly sure which modules come pre-installed with the initial Python installation, which may depend on the version and the platform you install it on.
I've been working on and off on this for quite a while and I didn't keep track whether I had to install additional modules.

I have also generated a Windows EXE file that can be used as a standalone application without the need to have Python installed.

This is my first time creating a GUI so be kind with me. :grin: It's not the prettiest UI but it seems to be working. This is what it looks like:

All the input fields on the screen can be modified manually. See below for an example where I changed the name of the program, the name of the episode, as well as the image URL.

One example of use to manually start a recording with a 2-minute delay. This may be useful with 4K events, if you know what I mean. :wink:

In the DVR schedule:

After the recording is over, you can find it in the DVR/TV directory as a TV show:


You can see that the name of the program was used to create a directory, and the file name is a concatenation of the name of the program + name of the episode.

Give it a try if you have a need for it and let me know if you have any issues with it or if you have any suggestions to improve it. :slight_smile:


I'm getting a 404 on the github link :frowning_face:

Sorry, I accidentally created the repository as private instead of public.
I'm not very familiar with GitHub and I'm trying to figure out now how to make it public.


I have changed it to public. Please try again and let me know. :slight_smile:

Link works now. Thanks.

1 Like

Nice! I'm new to Python but eventually got this running on macOS, after installing Python 3 and Pip3.

Yes, I had to also install these to get it working:


Very cool, thanks for sharing this great work!

1 Like

Working for me in linux. I didn't need to install any additional modules.

1 Like

Almost there, but not quite. I'm able to launch the .py app and see the GUI but when I try to create a manual recording, I get this error:

Last login: Tue Aug 29 19:45:19 on ttys000
fofer@Fofers-laptop ~ % cd '/Applications/Channels-DVR-Manual-Recording/' && '/opt/homebrew/bin/python3'  '/Applications/Channels-DVR-Manual-Recording/'  && echo Exit status: $? && exit 1
Image downloaded and saved as art.jpg
Exception in Tkinter callback
Traceback (most recent call last):
  File "/opt/homebrew/lib/python3.11/site-packages/urllib3/", line 203, in _new_conn
    sock = connection.create_connection(
  File "/opt/homebrew/lib/python3.11/site-packages/urllib3/util/", line 85, in create_connection
    raise err
  File "/opt/homebrew/lib/python3.11/site-packages/urllib3/util/", line 73, in create_connection
ConnectionRefusedError: [Errno 61] Connection refused

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/opt/homebrew/lib/python3.11/site-packages/urllib3/", line 790, in urlopen
    response = self._make_request(
  File "/opt/homebrew/lib/python3.11/site-packages/urllib3/", line 496, in _make_request
  File "/opt/homebrew/lib/python3.11/site-packages/urllib3/", line 395, in request
  File "/opt/homebrew/Cellar/[email protected]/3.11.5/Frameworks/Python.framework/Versions/3.11/lib/python3.11/http/", line 1281, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/opt/homebrew/Cellar/[email protected]/3.11.5/Frameworks/Python.framework/Versions/3.11/lib/python3.11/http/", line 1041, in _send_output
  File "/opt/homebrew/Cellar/[email protected]/3.11.5/Frameworks/Python.framework/Versions/3.11/lib/python3.11/http/", line 979, in send
  File "/opt/homebrew/lib/python3.11/site-packages/urllib3/", line 243, in connect
    self.sock = self._new_conn()
  File "/opt/homebrew/lib/python3.11/site-packages/urllib3/", line 218, in _new_conn
    raise NewConnectionError(
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x103556b10>: Failed to establish a new connection: [Errno 61] Connection refused

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/opt/homebrew/lib/python3.11/site-packages/requests/", line 486, in send
    resp = conn.urlopen(
  File "/opt/homebrew/lib/python3.11/site-packages/urllib3/", line 844, in urlopen
    retries = retries.increment(
  File "/opt/homebrew/lib/python3.11/site-packages/urllib3/util/", line 515, in increment
    raise MaxRetryError(_pool, url, reason) from reason  # type: ignore[arg-type]
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='', port=8089): Max retries exceeded with url: /dvr/jobs/new (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x103556b10>: Failed to establish a new connection: [Errno 61] Connection refused'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/homebrew/Cellar/[email protected]/3.11.5/Frameworks/Python.framework/Versions/3.11/lib/python3.11/tkinter/", line 1948, in __call__
    return self.func(*args)
  File "/Applications/Channels-DVR-Manual-Recording/", line 266, in <lambda>
    schedule_button = tk.Button(frame, text="Schedule", font=NORMAL_FONT, bd=3, command=lambda:schedule_recording(schedule_button))
  File "/Applications/Channels-DVR-Manual-Recording/", line 484, in schedule_recording
    response =, json=json_payload)
  File "/opt/homebrew/lib/python3.11/site-packages/requests/", line 115, in post
    return request("post", url, data=data, json=json, **kwargs)
  File "/opt/homebrew/lib/python3.11/site-packages/requests/", line 59, in request
    return session.request(method=method, url=url, **kwargs)
  File "/opt/homebrew/lib/python3.11/site-packages/requests/", line 589, in request
    resp = self.send(prep, **send_kwargs)
  File "/opt/homebrew/lib/python3.11/site-packages/requests/", line 703, in send
    r = adapter.send(request, **kwargs)
  File "/opt/homebrew/lib/python3.11/site-packages/requests/", line 519, in send
    raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='', port=8089): Max retries exceeded with url: /dvr/jobs/new (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x103556b10>: Failed to establish a new connection: [Errno 61] Connection refused'))

What does this mean?

I also note that I have to re-enter my CDVR's IP address every time I relaunch the .py app. Is there a way for that field to be saved so I don't have to enter it each time?

Sorry you are having trouble with it. :frowning:
It's going to take me some time to digest these error messages. At first glance, I am not seeing anything obvious.

Can you please share what your selections were on the screen before you clicked the "Schedule" button? Maybe I can try to reproduce it.

That's a very good suggestion. I will see how I can get this done.

1 Like

No problem, happy to help troubleshoot with anything you send my way.

Sure, just tried again, with this test, got the same error:

Cool! Thanks!

I think this is the problem: even though you entered your IP address as, it looks the app was still using the default to send the request. I have an idea why and should be a quick fix. :crossed_fingers:

@Fofer your connection issue should be fixed now.

Also, the app now saves the server settings to a file in the same directory as the script. The file is called default_cdvr_server_settings.txt and contains just one line of text with the IP address and the port number. You could even modify this file manually as long as you keep the same format.
As long as this file is present in the directory, the app will read it in the very beginning and populate the input fields on the screen. Of course, you still have the option to change them manually.

In order to do that, I'm using another module: the "os" module. It is pretty standard so hopefully you shouldn't have to install it but I don't know anything about MacOS.

Please download the new version and give it a try when you get a chance. :crossed_fingers:

Awesome, it's working for me now! No additional module installation required. I added a test, then saw it show up in my DVR schedule:

Thanks so much!

1 Like

This is cool :slight_smile:

1 Like

The EXE works fine on Windows 10. I know what it is like to write a utility for yourself and have others ask for upgrades, so I'm sorry to ask this.

Would it be possible to specify the data with command line switches, or have all the data in the ...settings.txt file? That way I could have batch files for different programs.

Really dumb question, but … I've installed Python3 and PIP through Homebrew, I've downloaded the zip file from GitHub and unzipped it, and… now what? I'm on a Mac.

EDIT: It appears you do this… I think… by typing, in terminal, python3 followed by the name of the path to the file. Doing that gives me missing module errors, which I'm trying to sort out (with limited success).

1 Like

I've worked through so I'm no longer getting missing module errors, but this is what I'm getting, so clearly I've screwed something up (this is on macOS):

I don't have macOS so I don't know how it works. @Fofer will be able to explain.

Does anything happen when you double click on the file

Double-clicking just opens in a text editor, but I did get it working, although I'm not quite sure how, unfortunately. I think that some of the modules weren't installed correctly in my Python3 setup, so I was going round and round with not-so-intentionally installing and uninstalling, and eventually it just worked. I set up a test recording, and it is now showing in the schedule. Very nice work!

1 Like

Thank you. I'm glad you got it to work. :slightly_smiling_face:

1 Like