Refreshed episodes/hosts/comments/series from hpr.sql, and added official HPR transcripts for the 180 episodes aired since the last sync (hpr4516-hpr4695).
337 lines
28 KiB
Plaintext
337 lines
28 KiB
Plaintext
Episode: 4686
|
|
Title: Debugging Security Cameras: Firmware Updates, Python Scripts and Windows Workarounds
|
|
Source: https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr4686/hpr4686.mp3
|
|
Transcribed: 2026-07-31 16:16:46 (official HPR transcript)
|
|
|
|
---
|
|
|
|
This is Hacker Public Radio Episode 4686, for 2026-07-20
|
|
Today's show is entitled, "Debugging Security Cameras: Firmware Updates, Python Scripts and Windows Workarounds"
|
|
The host is operat0r and the duration is 00:41:52
|
|
The flag is Explicit, and the license is CC-BY-SA
|
|
The summary is "Debug a Uniview camera using Python scripts, firmware updates and Windows hacks."
|
|
Hello everyone and welcome to another episode. I have a pre-book video with your host operator
|
|
feeling a little under the weather so my voice is kind of we're seeing moody
|
|
I mumble so I'm going to try to announce heat especially if I'm 6 so we'll get through this
|
|
Anyways, a couple of things
|
|
I'm going to talk about fixing my front camera
|
|
and um before that I'm telling you how I'm doing my soup
|
|
I drop soup the trick to it is get it boiling
|
|
and when you um you can make your own broth you can use a beat broth cubes it's
|
|
sludge cheaper than buying the whole
|
|
stupid chicken broth you can buy the chicken
|
|
boolean cubes or whatever chicken boolean cubes do that same thing
|
|
can't really help
|
|
Anyways, he makes those up however much to want
|
|
I got to do one and maybe a couple eggs
|
|
the trick is to heat it up to like a rolling boil and then I start
|
|
real quickly and I get a little swirl going on
|
|
and then I pour the egg down in there from the the egg drop
|
|
and I pour it down and let it let's swirl around and that's how you get that rippony
|
|
rippony messed up
|
|
you'll actually want to have more broth than you really need
|
|
um as a ratio so like this is a little junky because
|
|
there wasn't quite as much broth but if you want to be perfect you have like tons of
|
|
broth and very little egg but I don't want to be wasteful so
|
|
uh when I had to move that so what I do is I do usually
|
|
once I get that rolling boil I turn off the heat and I spin it around circles
|
|
and then I pour the egg in there and I'll let it sit for a second and it's done basically
|
|
and then uh since this is actually kind of salty I shouldn't have
|
|
put my soy sauce in there usually on but soy sauce but that's kind of where I'm at now
|
|
this is my hot soup for my sickness I picked up some kind of something
|
|
oh I went camping with my son and uh
|
|
went camping and uh for scouts and apparently that's uh I picked up some kind of
|
|
crack red so first things first we're going to check the camera itself I have no
|
|
browsers um so the camera is a I'll actually tell you
|
|
cctvf I did vocal domain names so instead of remembering IP addresses
|
|
I put in the UDM device I put um we call that static DHCP basically
|
|
so that static IP I think it's like a when they put in like the MAC address and it
|
|
results back and that's how you get like a static DHCP I think how it's set up
|
|
so anyways um this is some trinysium actually it's not trinysium it's a very good brand
|
|
UVN um UVN is there to find the docs on it
|
|
UVN UVN you eat and no um UVN no of course not so anyways um this is a
|
|
hardware version from where version model number maybe I'll search for the
|
|
lot of number it'll come up model yeah look a thing with a good fig
|
|
this is a one of those ones is for like a pbpbr a a vansy um DVR or whatever they want you to buy their
|
|
stack so as a as a camera by itself it's kind of jeancy it's not kind of doesn't work
|
|
so I had to write my own API there's not really an API for it so this is uh the company is
|
|
univ you sorry it's an univ you uh why is that ISP warm light deterrent network camera
|
|
they're pretty high in cameras the optics are amazing with the past three or four years um you can
|
|
get really good optics on these cameras um for relatively low cost um you can find their reseller
|
|
for an Arnold like but I don't know how much I paid for this one I think I paid cost for it because
|
|
friend does stuff so he I showed him a picture of my horrible black and white mess and he sent me
|
|
one of these and and kindly sent me one of these so um now I have a crappy one of the back
|
|
and then the fancy one of the front the problem is she's not getting the alerts so
|
|
the way I have it set up is this kind of giant fat SD card on it
|
|
and that runs uh plugs in power of ether at POE and I think it's a lot of like 30 volts or
|
|
some crazy power of ether at some crazy amount of voltage under power of ether that by the way
|
|
so I'm going into the server because I think that's where everything lives
|
|
unfortunately when you have we are old you'll remember where anything is anymore
|
|
and that's why another project I'm working on is my own personal AI so I have a crontab
|
|
very crypt that's not it's my SL um CCTV FPY and unbeknownst to me I have a log here so
|
|
I can look at this log um it's a Python script that I will put in these
|
|
show notes I will do show notes so let me make a new thing here put Python script for API
|
|
camp in show notes and a model number I use the clipboard history which is the security
|
|
flop because as soon as you copy and paste a password you're screwed so whatever the
|
|
all right so we're going to take a look at this Python script first
|
|
extra make sure it runs as a current user so we're going to do this whole
|
|
it's a crontab entry that says it runs every two minutes well that's aggressive
|
|
I also want to put thrallion here so no recordings found in the past 24 hours
|
|
which is not great because uh they're definitely been something in the past 24 hours my
|
|
while I come home my flat whatever so that's a little weird oh look at the log here so it's a
|
|
a Python command followed by the Python script and then the pipe we call it listen or
|
|
or greater than greater than greater than in flex and then the errors out to itself
|
|
on standard and standard out I never really could understand it so there's no time
|
|
it's a time state of sign any of this 11 25 10 20 few is when I first started this script
|
|
and it looks like it started it was working this file is massive I use VI and you can press
|
|
colon and then a button like a bunch of numbers I'll just mash down the work and I'll take you to
|
|
whatever line number so if you do colon one we'll take you to the first line like so like that
|
|
so I met the end and it says no recordings in the past 24 hours so one thing this here is
|
|
missing is a timestamp me bullet my brains out here
|
|
all right so we have some exceptions next retry exceeded with URL
|
|
jailtreme streams offset blah blah blah fail a sourcing new connection error whatever
|
|
um that's a weird one so I'm going to cut out this file because everybody loves cat
|
|
recordings there's a bunch of noise in this file so I think it's called no recordings
|
|
and choosing tests recordings found no recording sound in the past 24 hours so we're going to
|
|
get rid of that it's going to cat this file so I'm counting the log file and I'm gripping out
|
|
grip minus V if you use e-grep it's basically an alias to the grip so I don't
|
|
I've gotten out of the habit of using that because it doesn't exist everywhere
|
|
what's the kind of one thing to keep in mind so um I've gripped out that no recordings
|
|
to an alias something crashed um found one recordings in the past 24 hours
|
|
no new recordings across this found record but fail to record fail to get recordings for 01
|
|
almost like a off issue
|
|
and then there's really big error like a timeout type of thing
|
|
probably fire the power went out maybe next retries exceeded with URL blah blah blah
|
|
recordings begin time stamp and time stamp limit offset blah blah blah so I'm filtering out by date and time
|
|
it looks like so I'm going to go to the actual camera which sucks because again
|
|
these things are not made to be used I don't want to say it locally I have to download and
|
|
install this weird executable from China it's like a five-meg set up EXE it's like
|
|
super-shifty so whatever all these things are kind of scary say at least so I've installed this
|
|
little executable which randomly makes me reinstall it I don't know why because I'll install it
|
|
and then like two months later whenever next time I have to use it it has to be installed again
|
|
which just does make a sense so anyways um I believe there's no callbacks to try that in here
|
|
so I've installed this little setup EXE which I think like hooks a DLL so that it can do
|
|
whatever silliness needs to do I see a main stream in a substream substreams like the
|
|
traditionally a substream is a lower lower quality stream and it's loading like a poop poop poop poop
|
|
the local admin password is all the same pretty much my house is like the egg you know
|
|
the technology where we get it you're pretty much screwed anyway so if you got somebody on your
|
|
network you're kind of screwed anyway so I usually use leave credits default to most stuff
|
|
because it doesn't really matter um no it is random so pseudo random should dare I say
|
|
the math nerds we'll say that it's a pseudo random so anyways I can't get any playback at all
|
|
working it might even just need to be like unplugged and plugged back in because I can't even get a
|
|
stream going um I do have somewhere else a different URL which I don't know where it is probably
|
|
in my city in notes now um let me search I've been using it up sitting for a little bit
|
|
yeah this is a video too I'm still new to obsidian but it's it's the
|
|
the front end for my AI assistant that eats uh two three googles one yahu
|
|
male and a uh linkedin and google voice mail oh okay so you might be able to hear this
|
|
no I can't hear this I see crickets and a tire in her front yard whatever so it's it's working
|
|
as he's stuff um the real question is is why is it why is one the playback not working
|
|
which I'll close all this out closing on all my browser windows and restarting
|
|
maybe that'll help
|
|
I've always kind of had issues with the live view
|
|
with this camera again a lot of these are made to have like a DVR whatever and you know
|
|
they're like a hundred dollars or something who knows oh they have my life only put let me put
|
|
it outside gamers wow this is saltiest says hell anyways um yeah I can't even get
|
|
upstream or mainstream I can hit it via RTSP but for whatever reason there's no captures in here
|
|
I mean it's possible it could have been reset somehow um I don't know but this view eyes
|
|
does it say at least take a photo take a photo I have no idea what I'm looking at
|
|
let's see free space so there's kind of two ways to do this I had uh a there's like two different
|
|
kinds of answers like motion events which I used to have enabled motion detection is off right now
|
|
this is like your standard better regular motion detection and it has I don't have to think
|
|
it has boundaries like the other thing does I don't think it has boundaries I can't even remember
|
|
but that's the more traditional method the one you want is this intelligence thing that's called
|
|
intrusion and the intrusion let's see do like these rules and yeah see I still can't see anything
|
|
going on with this with this setup try not a coffin your ear let's see try and load it again
|
|
that's the thing with this camera it's just like not designed to be managed with a client
|
|
um so I don't know it's kind of frustrating I'm gonna do a tale of the
|
|
tail tail minus in 10,000 third in 2000 found 15 recordings no no it's like it found 15 recordings
|
|
and then through up maybe maybe it needs to be like you know reset because it's trying to pull
|
|
in 15 recordings that once and it can't do that right so we're gonna just assume something like that
|
|
happened all right now I'm starting to cauff getting um see
|
|
content I'm I don't know I the whole crime tab thing there's user
|
|
crime tabs and there's root crime tabs and you can have the root crime tabs basically the user
|
|
and I feel like I just want to put everything in root but that's not what you're supposed to do so I
|
|
have user crime tabs but it's very confusing um because I have different users with different
|
|
crime tabs and it's hard to see them all I'm sure it was like me and I can run to see them all but
|
|
it's quite I'm not just to throw it back up this first cp like cp my um
|
|
either auto hockey that will um it makes paste and copy and paste uh caps locks a and caps like s
|
|
but when it's not on I just end up typing caps like s and that caps like a capitalating
|
|
capital S um so it's kind of annoying I turned it off because I was going to be near game
|
|
so we have some kind of resets out yeah fx file sent sent events is the is flag is a it's like a
|
|
placeholder cat oh my god I'm hitting the cast on all the time now so I'm going to go to
|
|
go to my user folder start up this thing oh my god what is going on so going on my user folder
|
|
I'm going to start up a auto hockey because it drives me insane not to be able to copy and paste
|
|
it does much of other stuff things too it's like I'm pretty defined can't um
|
|
get don't get something get something send events
|
|
all right um and it's like a bunch of timestamps um maybe if I just heard it or echo
|
|
I don't know just one the last one two
|
|
sent events it's also weird that like sometimes when I copy and paste it's like got
|
|
extra characters in it and it's so weird if I use the clipboard history and then I paste
|
|
what's in the clipboard history the first time it has like carrot left bracket left bracket 200
|
|
uh squiggly and then the paste it version and then squiggly but then if I do it again
|
|
it works perfectly fine so don't understand what happens it's weird it's really weird the way uh
|
|
the way it works like it doesn't make any sense clipboard Canadians so anyways that sent events
|
|
I completely cleared out which I think five eight nine eight four three some kind of time stamp
|
|
or right you ID I have no idea that's from with the vibe code it should is it you have no idea
|
|
what anything is doing what it does stuff so I'm going to do my contact I'm going to run this
|
|
run the script it's who happens so no recordings found the past 24 hours um which might be true
|
|
because I can't tell if anything is running anyways so yeah it's proving not to be fine at all
|
|
and that's that's the uh the fun of it Jesus um I guess I can turn off my at blockers and my
|
|
privacy battery and you black origins that might be it
|
|
when every time I refresh at the log in it's like
|
|
1990 style session management all right I turn off all the uh at blockers maybe I'll get an
|
|
actually stream I'll get an actual stream for this no yeah give it I don't know man um
|
|
yeah this is just waste time so I'm about to see what happens okay so I'm about to both the computer
|
|
and the camera and I do not see any events for today at all I want to check yesterday
|
|
interface for this thing is potato all right so let's do this stuff it's uh 12 523 that was
|
|
so long time ago I'm not gonna do a 523 doing 623 6 2019 okay so it hasn't been doing events for
|
|
a while not even locally so this is their stupid camera app it's oh my god it's not even now
|
|
you know you you you you think um so now I'm uh it's it's now 623 the date I'm going back to
|
|
619 I see nothing I want to go back to 523 I see stuff let's go to 615 so the events aren't happening
|
|
at all there's no events being generated meaning something's wrong with the the ability
|
|
for it to capture events for some reason so we're gonna go with that um I doubt there's any kind
|
|
of troubleshooting or any errors or log is there anything with this thing um that is really weird
|
|
now can I force a record record you would do like to access storage and you can save images
|
|
oh no I'm not that kind of record I want to record on that for server and so this web app thing is
|
|
still piece garbage let's see if we don't have Firefox somewhere want to stay up at Firefox on
|
|
here anyways it's super exciting obviously let me put jump off for a second okay so a bit of a tangent
|
|
I got it working with I found a Firefox executable for a playwright which is for automation
|
|
of stuff so I'm I have Firefox running with the viewer and I can actually see the camera
|
|
but I noticed that my windows directory is still exists and it's really hard to delete that
|
|
windows old the folder what you can't do is a program called there's other ways to do it you can
|
|
do the run as okay let me back up there's users in windows there's system and trusted
|
|
installer and a lot of people think that admin is admin no it's not admin system is more or less
|
|
sort of admin and trusted installer is more like a root if if I had to put them in a bucket
|
|
a lot of people do not know how windows permissions work and how that magic is I don't even know
|
|
but I know I do know that you can use a trusted installer kind of bypass you think where you
|
|
replace the binary of the trusted installer executable or the the trusted installer
|
|
command line and replace it with whatever you want see you basically take the trusted installer
|
|
service and replace the command to run the trusted installer service with whatever you want it to
|
|
actually do as trusted installer and then and then you hopefully revert it back if not all your
|
|
adder move add all that stuff having to do the software it's going to get all one key and you will
|
|
be able to install stuff but I had a hack that would basically forcefully delete stuff or
|
|
forcefully run a specific process using the trusted installer hack by replacing the admin you
|
|
have admin rights to replace the trusted installer service binary to run whatever you want and
|
|
that's kind of how you hack around the problem with that there's no easy way to do an interactive
|
|
trusted installer instance now there's an executable that's been around forever called
|
|
exact EXETI.exe exact TI exact trusted installer.exe and this lets you bring up a
|
|
windows you you take them run dialogue but you can run whatever command you want as trusted installer
|
|
so I type C&D hit enter and I have set and I see compact layer app health installer the
|
|
row with the system path is home path is still user internet which is quite interesting
|
|
I'm looking at the environment variables for this thing so it's compact layer detectors
|
|
app health installer does compatibility window windows compatibility layer I wonder if there's
|
|
something there if that's like a way I can be just installer I don't know so there's some other
|
|
some other weird chocolate you last update not just okay so we're going to try to delete this
|
|
mood directory versus this windows it windows old and I guarantee you it will work with
|
|
falsely because trusted installer has writes that not even system has if you try to do see yeah
|
|
which system is being used by other process I don't know how this is like how how long I'm
|
|
supposed to delete the stuff except do it in dice yeah it's saying like users all users in video
|
|
messaging message bus log is being used by another program I hope I'm not actually delete my real
|
|
windows folder that would be hilarious I don't think that's the case let me double check
|
|
windows directory SQL Microsoft does sure system root SQL Microsoft Windows okay but it says it's
|
|
being used by another process which doesn't make any I think sense that's kind of terrifying
|
|
so the auto boot links to get rid of this uh that's really the only way to delete stuff
|
|
in windows to like won't let you delete um you can do chamada type of stuff and just to complicated
|
|
whereas windows or Linux will let you just melt what what what you want and then delete what you want
|
|
without having to do take ownership of entire folder and like take ownership of all the files and
|
|
all that bullshit um Linux you just go now in a fsmout whatever god um you know there are
|
|
some very rare edge cases that that could be a problem but anyways that was a bit of tangent
|
|
it's on my website it's uh under actually I'll make a show that's for it trusted installer
|
|
exact TI right as where's my notes I started some notes they and then I rebooted
|
|
so anyways card drives by the problem with that is it'll trigger every time inside whoa what is that
|
|
dude I just saw something purple and glowing what was that
|
|
that I was creepy anyways the I buy house lights on so there's a little bit of weird
|
|
colors going on so there's a rule that has a compounding box of my driveway and all in
|
|
way out to the street but not the street itself motion technically gets picked up by
|
|
cars driving down and that motion gets activated and once the motion is activated it looks for an
|
|
object such as a motor vehicle or pedestrian and I have sensitivity thresholds whatever
|
|
it works good it used to trigger a lot and that was why I switched it from
|
|
the regular motion to this intelligence smart thing but the problem with the intelligence smart thing
|
|
is that the email alerts we're not working the intrusion detection email it's we're not working
|
|
so I had to make my own that's kind of where we're at now I don't know what the problem is
|
|
I did go out there and move around and do stuff I read I formatted the storage
|
|
so it says total capacity 230 gigs geez man what how much 230 gig micro SD is right now
|
|
how much did I buy that for Jesus Christ why did I buy such a massive card
|
|
250 250 micro 250 on to say 250 I don't even know where I bought it from
|
|
like I see R. I'm looking at my Amazon history I probably bought it through them
|
|
with the storage yeah it'd be careful here's a 32 gig 250 and why that's it
|
|
okay how much did I buy this for I bought it for 49 dollars
|
|
what you can buy 200 if you can see it for 49 bucks I guess it's just like the memory the
|
|
ECC or the fancy ram is really expensive this is cheap 450 bucks I'll probably pay more than that
|
|
what did I pay let's see I pay 38 okay whatever anyways
|
|
yeah that's that I put the just a dollar thing in there I I'm going to try one more thing
|
|
and try to trigger it and then I'll come back okay well we got something in how did the date the
|
|
system to I got close this other window I looked at the date it says it's November 1st 2011 at 1500
|
|
hours is this system time on New York is the right time zone the NTPs NTP server is an IP address
|
|
of I don't know where the hell that is so let me ask a I top NTP servers for Linux
|
|
didn't even type it correctly it's like deviant what's a deviant one I pulled that NTP
|
|
network sure North America pool US pool dot NTP dot org who's an 80 on these test NTP check
|
|
failed that's interesting what about it about to
|
|
NTP check failed we're okay we're actually get the IP address and put that in maybe that's why
|
|
I had an IP address in there is because the IP address is it doesn't take a host name oh that's
|
|
fucking weird it doesn't take a host name so that's weird I said so with the computer sync with computer
|
|
system time that's not I don't want to do any of that I don't want to do any of that so let me go back
|
|
back to cc cc tv fn what's definitely one problem is it thinks it's it thinks it's 2011 for whatever reason
|
|
that I wipe it out or something I don't know so I click the download I search for the model number
|
|
and I click download firmware and I get this weird as this is the weirdest download I've ever seen
|
|
in my life it's at 7% it's dog slow when I click the download button and there's no actual it's
|
|
not using the browser it's download but it's using like some Java bullshit so I am just because I'm
|
|
crazy I use bolt media downloader that's like a sniffer sort of sorts um so we got this weird
|
|
140 mags file that it's downloading it whatever speed so not going to copy and paste this
|
|
copy this link it downloads like some json from Lenovo and then it it's files.com wow really
|
|
you can even host your own shit you got to use some third party whatever before minutes two minutes one
|
|
minute um yeah that's the fastest it's going to get so I can do stream to downloading too so
|
|
I'm going to take that link and take it to download manager send to download manager which
|
|
can do three threads at a time also download links see if I get three or four threads going
|
|
I'm going to be fair it is a like secure link it's got like my IP address in it and like all
|
|
kind of stuff um yeah any ID token the token is blank of course off key so it's definitely
|
|
some kind of you know temporary thing and the hilarious thing is that it says client IP equals
|
|
in my home IP which that's going to be in there it walks anyway so it doesn't make a ton of
|
|
sense to put that somewhere um I guess you can deny the download based on somebody else's
|
|
if you put their own remote IP in there I don't know I've never heard of files if I LZ.com to
|
|
fucking malware why these guys don't support their own downloads is terrifying they got Facebook and
|
|
YouTube and all that stuff but I guess that these things are all shady Chinese and whatnot like
|
|
what why why why do you have the outsource here your downloads that's kind of gross
|
|
so we're almost done 66% so it's not any faster with multi threaded the thing I use from
|
|
multi threaded is called turbo download manager and that's for chrome and along with both
|
|
media downloader and turbo download manager I can pretty much download almost anything
|
|
and then URLs that I can't download directly I'll send to FFNP or YouTube deal
|
|
um I have a oh my get up I have a YouTube downloader script that will use RSSC2 to multi threaded
|
|
download any video you send it um so you can set it a list of like you know 16 different videos from
|
|
the same site across 16 other websites you'd have like 16 times 16 and it would download all those
|
|
at the same time I think how I have it set up anyway so here's a file that is a bin which it's supposed
|
|
to be I think as a file because the way I downloaded it it's not so let's see what happens when I
|
|
click this yeah it's supposed to be blah blah blah does it so I'm gonna copy and paste this weird as
|
|
message I'm gonna rename it to a zip file thank god it opens so I have this zip file and
|
|
I'm gonna extract it you'll see that it's okay it has a cloud upgrade button which yeah that sounds
|
|
terrifying um click the image debug I'm gonna turn that off while I'm doing this I can go ahead and
|
|
export my config um file encryption I don't want to encrypt anything can that be empty
|
|
that's gonna weird
|
|
is it file or something how is it encrypted it's just like this is encrypted like it's a
|
|
dot config file I don't understand so I use seven zip which is the mother of all
|
|
decompression tools yeah I don't know how to read this I don't know how to read this it's a
|
|
weird file um I use bash for a lot of stuff bash I can I bash here they kind of slow bash everywhere
|
|
yeah sort of works um IPs IPc it just says data um the file can be just calls it data I have no
|
|
idea what this is but we're gonna back it up put it on the uh Google I guess it's just my
|
|
config drive like keep like documentation and small things like things I want to be able to search for
|
|
essentially in um in Google Drive because it has that kind of index feature
|
|
or I can search for stuff so I'm gonna call it the call it some
|
|
was it CC TV CC TV CC TV F is it F new I can't remember I'll try to drop it in here
|
|
I think it's there so now I have backup of the config the new version is detected no
|
|
okay we'll take a while please do not disconnect power that no idea what it's doing it just says it's
|
|
gonna take a while oh look the data right so it says 2026 that might be why it's not working because
|
|
there's nothing to collect from 2011 maybe the data's so far off you know who knows so we'll go
|
|
pop back into the thing and delete that date file maybe that'll help kind of jumpstart it
|
|
um or into the no dot to these files
|
|
lesson video yeah so that's blanked out and then also we're gonna
|
|
I go test to the log file so I need to log file and I look new to the timestamp trigger
|
|
think so that knows so that it knows where it's at and then we'll go from there see what happens
|
|
at the update all right well uh I guess it says the upgrade will take a while please do not
|
|
disconnect power wish me like um looks like the family's heading back here so I do not have
|
|
any more time and you know more of the same take it easy
|
|
You have been listening to the Hacker Public Radio podcast, at hackerpublicradio.org.
|
|
Today's show was contributed by a HPR listener like yourself.
|
|
If you ever thought of recording a podcast, then visit the HPR site to find out how easy it really is.
|
|
Hosting for HPR has been kindly provided by anhonesthost.com, the Internet Archive, rsync.net, and the HPR Community Content Delivery Network.
|
|
Unless otherwise stated, today's show is released under a Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.
|