Files
Lee Hanken 7c8efd2228 Initial commit: HPR Knowledge Base MCP Server
- MCP server with stdio transport for local use
- Search episodes, transcripts, hosts, and series
- 4,511 episodes with metadata and transcripts
- Data loader with in-memory JSON storage

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-26 10:54:13 +00:00

239 lines
16 KiB
Plaintext

Episode: 2340
Title: HPR2340: Tracking the HPR queue in Python
Source: https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr2340/hpr2340.mp3
Transcribed: 2025-10-19 01:29:22
---
This is HPR episode 2,340 entitled, Tracking the HP RQ in Python.
It is hosted by MrX and is about 22 minutes long and carrying a clean flag.
The summary is, I explain how I capture the number of HPR shown in the QU in Python.
This episode of HPR is brought to you by an honesthost.com.
Get 15% discount on all shared hosting with the offer code HPR15, that's HPR15.
Better web hosting that's honest and fair at An Honesthost.com.
Hello and welcome Hacker Public Radio audience.
My name is MrX and welcome to this podcast.
I hope you enjoy it.
I'll let you start by thanking the people at HPR for making this service available.
And HPR is a community led podcast created by the community for the community.
If you all created one show, just one show a year, we'd have more shows and we'd know what to do with.
I'm sure you must have something interesting we'd love to hear.
Anyway, on with the show.
Okay, so when I was doing the previous show was about the Bo thing UV5R handheld transceiver.
It took a bit of time to pull the series together.
And of course I was looking at the Q, the HPRQ and noticing that it was getting quite small.
And the back of my mind I thought, oh no, what if I put all this effort into producing these set of shows and then HPR folds.
And obviously all it's been a big waste of time.
So I thought, hmm, and to keep an eye on it on the Q and make sure it's not going to go too low.
And towards the end of the, as I got near the end of creating the set of the series on the Bo thing and depth series on the Bo thing.
I thought it would quite handy if I could keep track of the number of shows in the HPRQ without having to open a tablet or a PC or something.
So I thought, what if I could do something and Python?
So I've got a project which this, this conbubulation project of things, it's like a monster that's grown in all different directions.
It's not been properly planned.
I started that many years ago and I hope the time now to spend on it.
But I can attack it onto that.
And I do plan eventually some point in HPRQ last long enough to do a show on this project and I'll not elaborate any further than that.
On this, this thing that I've built, I have a Blink Stick attached.
A Blink Stick is a read device which you may well know about.
I think they come in various forum factors.
It's a USB thing, the one I've got plugs into the side of your Raspberry Pi, for example.
And you can control it with software.
It's with an RGB LED and you can make it any red, green, blue or mixing the colors you can make it any color, basically.
And it's very useful for signaling.
I use it for a few things on this mystical project which I just say I'm not going to go into.
Anyway, I managed to hack up this bit of Python code and I'm not a programmer.
I'll start by saying that.
And it's probably a very bad code and hacked together.
But it seems to work. It seems reliable enough.
And no other compilation of code that seems to work and seems to be reasonably reliable.
And that's really all I'm looking for.
So I thought I'd be going to go through the code without too much detail because I don't want to bore you all.
So I've got the, I've actually got a file here called Scratchpad.
And I find that I'm finding that quite useful.
So I can maybe put a few functions in it and play with it in Python.
And then without upsetting this monster of bit of code that I've got, it's not monster bit.
For me it is. It's a thousand lines of code, something like that.
But I can play with it in isolation sort of thing.
And I've now implemented this bit of code into the monster project and it works.
Okay, I'll start describing this messy bit of code that seems to work.
I called the function, I've got a, I'm sorry, I'll start by again.
I've got a file called Scratchpad and I just work with it as a code and see how it works.
And then transfer it into the main project once I'm happy with it.
So the function, I called it getHPRQ.
So DevSpace, get underscoreHPR underscoreQ.
Open brackets, close brackets and finish that with a, what did you call it?
Double vertical dots, what did you call it?
I can't remember, it's a colon, brain feed.
Right, okay.
So the first thing, the first problem I had was, how do I getHPRQ, HTTP content?
You know, I'll web page, how do I capture that and Python?
I literally be told using the excellent site, found it on, using a Google search,
I found it on a stack exchange, fantastic site for looking for some pieces like this.
I'm not, as I said, I'm not a programmer and definitely I'm not a professional in Python.
I've probably got more experience of bash scripting, though I don't proclaim to be a super guru like our Dave Morris,
but nonetheless, this seems to do the job.
So the command you need to capture a web page content is you are Lib, you are L-L-I-B.
And in order to use that, you need to load that module.
And of course, you load a module in Python by using the command import space, you are Lib.request.
So that's you've got the module loaded.
And then the command I used was urlib.request.url open, open brackets, then they'll actually address,
which is the calendar, the HPR calendar page, close brackets.read, open brackets, close brackets.
And then, so that gives you the HTML content from the page.
And I passed that to a variable using a pass that by to the variable HTML underscore content.
So HTML content equals in in that command.
And that's all good and well, but I think that's stored as a list.
I think you call it as opposed to a string.
So to make it easier to deal with, I had to convert it into a string.
So I used the STR function Python.
So I used the STR open bracket, HTML underscore content, close brackets.
And that converts the HTML content, the information in that HTML content variable to a string.
And I passed that to a variable HTML page.
HTML page variable contains the string, the whole page as a string.
So the next thing I'm going to do is find a bit in the page where the queue is stored.
So I used the find command for that.
And I don't think I need a module for that.
So it's a standard as part of Python.
So to find the string I was looking for is there are only angle bracket, strong angle bracket.
That's enough to find the chunk in the page where the queue is held.
So HTML underscore page, which remember contains the string of the web page dot find open brackets.
Quote, there are only angle bracket, strong angle bracket, quote, and enclosed with a, I'm, I'm bracket.
And that, that, that finds the location in the string of the page.
And it returns a number.
It could be hundreds of characters along from the start of the string.
It counts, you know, it counts from the first character on the first line.
And it just counts each, each character basically in the, it's one big, you know, within the whole big string.
So it could be hundreds of characters along before it finds that, that, that string.
And that, and I passed that to a variable called line begin.
That's it found the position where there are only bloody, bloody, bloody, okay.
And then a, a move an arbitrary number of characters from that beginning at that point.
And I thought 70 was long enough.
So I used line begin, line underscore begin plus 70.
So that takes the number that came back with add 70 to it.
And I passed that to a variable called line end.
So I've now got the line begin and the line end numbers character number.
So that's fine.
So then I need to, to grab that chunk of text.
I used html underscore page, which you remember contains a whole page.
Square bracket, line underscore begin, colon, line underscore end, square bracket.
Now that's the way that you, you slice things.
I believe that's the terminology used in Python.
And so that grabs the beginning point and the end point.
And I passed that to a variable called line.
So that's kind of contains the line that we're looking for.
Now from that line, I need to find the, the, the digit, you know, the actual number.
And it could be a one digit number, it could be a two digit number, you know,
you don't know how many keys, how many shows are going to be an accuse, you need to find that digit.
I'm going to use stack exchange to find out the command for that.
And, and that turned out to be re dot find all open brackets are,
um, quote, backslash d plus, um, quote, comma, line.
So that, I'm going to close up with a, a bracket, obviously.
And I pass that to the variable digit.
So that's using regular expressions.
Um, this re dot find all, uh, and assume the slash d plus is finding digits.
Uh, I don't fully, I'm not, as I say, I'm just, um, I'm not an expert in Python.
So this is a, I'll connect this bits a bit new to, I've never used regular expressions in Python before.
And of course, in order to use regular expressions in Python, you need to load the module for that for quite to mention that.
So import space re does that allows you to use that to, that to command.
So we now have the digit.
Now, the trouble is that, I think again, the digit is stored, um, the digit we've captured is stored as a list.
Um, so you need to turn that into an integer, uh, so that you can work with it.
So again, uh, use the command int int open bracket, digit, square bracket, zero, close, square bracket,
and then close the, the normal bracket.
And what that does is that, that catches, captures the first element of the list, digit.
And, uh, they're all only be, um, should only be one item in that list, because it should just find the one digit and that's it.
Um, so that's passed to the variable HPR shows.
So the HPR shows now contains, hopefully, the number of shows in the queue.
And, um, I then wanted to control my blank stick and I just use standard if statements and Python.
Uh, and I've got some, some made up modules for dealing with the blank stick simple ones.
I've got a, um, B stick underscore on and then you give it a, a color in it and it turns a stick the stick on.
And, um, whatever I've got, I've got to, uh, I've also got B stick underscore blink underscore red.
And that turns the blank stick on and blinks at red.
So these are the functions that I've used for that.
And I won't go into the detail.
You can look at how to use a, a blank stick if you like yourself.
Um, but, uh, so the, the, the if statements I've got is, if HPR shows is greater than nine,
then turn the blank stick on green.
So in other words, that means if it's 10 or higher than it, then it shows green to us.
Let me just choke you.
Find else if HPR shows is greater than five.
Blink stick on blue.
Um, so in other words, if it's, uh, six or, or, or between six and nine, then it turned on blue.
Now, I thought about using red green amber, but amber uses, uh, I think it's yellow and green mixes colors.
And if you've got the LEDs and a load intensity, don't, doesn't it look off a good, so I used blue instead.
And then finally else if, well, no, not, not finally.
There's another one else.
If HPR shows is, it's greater than minus one.
Just in other words, if it's zero, uh, and between zero and, um, five, then be stick.
Turn the blank stick on red.
Um, and if it's not that, if it's none of those, if it's not, not within any of these, these ranges, then else.
Blink stick, blank red.
So a blank thread.
So what happens here is if the shows are, it's greater than 10, then green.
Blink stick comes on green.
It was greater than, between five and, and, um, nine, then blue.
And if it's between, uh, it was between zero and, um, if it's, let me think if it's, if it's, uh, between zero and five, then red.
And if it's below, um, else, if it's something else and it's just flash red, I hope that makes sense.
Right.
And then, um, it displays that for four seconds where the sleep command, um, when, of course, to use sleep, you need to import, um, from time import sleep.
And so that you need that and, um, steep open bracket for plus bracket.
And so that, that pauses it for four seconds.
And finally, blink stick off.
And that turns the blink stick off.
So that's how I approached it.
But then, of course, I realized that, well, what happens if the URL isn't available, you know, if HPR is down or something like that?
Well, it would just crash out and now it's not any good.
So, um, I played around with, um, um, um, raising an exception.
So I haven't really, this is the first time I've really done this because I'm, I'm lazy at a Python.
It's a quick way of getting things done sort of thing out of the time these days to, to be particularly choosing about writing good code.
So it's all slapped actually.
So, um, I, again, I'm not sure how these things really work.
I believe you've got, you raise exceptions on your support.
There's, there's a whole host of exceptions that you can raise.
Um, but I just chose the top level one.
So it catches all sort of thing.
I don't think I should do, but, um, it worked anyway.
So that, that first line that I told you about that catches the HTML content.
What I did was that I, I used the command.
Try colon, then indent HTML content equals URL lib.request. URL open, um, URL.read.
Know that, that command I gave you before.
So you indent that with a, a, a, a try above it.
So it tries that.
And if it fails, then below that, you put the command except a colon.
And so what happens is if that fails and it tries to seize the commands that are undentied from within the accept command.
So in other words, if it fails, then print, I've got to say print error problem accessing URL.
And it's so prints out the URL that it fails.
Um, and the other problem you've got is, uh, okay, what are the web pages there?
But the, uh, you can't find the digit.
And then if it tries to pass, pass the, the, the digit on, uh, turn it into an integer and pass it to HPR shows.
Then of course, it would all bomb out because it wouldn't be there.
So again, you use a try command and then indent hpr shows equals int open bracket, digit square bracket, zero square bracket.
Close, uh, bracket.
And what, if that fails passing the value across to HPR shows, then you use the command except and colon.
And, um, I print error problem getting number of HPR shows in queue.
So that, that solves that.
And then I set the value HPR shows to the value of minus one.
And that would then just blink the red LED further down.
And that, that seems to work.
Um, and so, uh, when I turn on this, this project of mine, which I'll describe, another date.
Um, the light, the blinks that comes on and at a glance, I can tell that it is a show queue, OK, medium or, we're getting really low.
And as I noticed today, it's, um, it flashed, it went red, so it's below, uh, five.
So, um, we need to be, we only need to be putting out a few shows I reckon really.
Anyway, I hope you all find that interesting.
And, um, I'll speak to you later.
Uh, I think that's all I have to say for this show.
Thanks very much for listening.
OK, so if you want to contact me, I can be contacted at MrX at HPR at googlemail.com.
That's MRX, AT, HPR, the at symbol, googlemail.com.
So until next time, thank you, and goodbye.
You've been listening to Hecopublic Radio at HecopublicRadio.org.
We are a community podcast network that releases shows every weekday Monday through Friday.
Today's show, like all our shows, was contributed by an HPR listener like yourself.
If you ever thought of recording a podcast, then click on our contributing to find out
how easy it really is.
Hecopublic Radio was founded by the Digital Dove Pound and the Infonomicon Computer Club,
and is part of the binary revolution at binrev.com.
If you have comments on today's show, please email the host directly, leave a comment on
the website or record a follow-up episode yourself.
Unless otherwise status, today's show is released under Creative Commons, Attribution,
ShareLite, 3.0 license.