Compare commits

...

9 Commits

Author SHA1 Message Date
20f1951321 new cn date 2025-10-31 18:18:58 +01:00
Dave Morriss
e54e1c926f Removed the timestamp at the end of Community_News/shownotes_container.tpl 2025-10-31 15:09:57 +00:00
e784b07dbd Support for extra files associated with the eps 2025-10-28 17:14:15 +01:00
Dave Morriss
00172063de Adjustments for new website
Community_News/make_meeting: added a new -output=FILE option

Community_News/shownote_template.tpl: removed reference to previous name
    shownote_template13.tpl

Community_News/shownotes_container.tpl: rewrote to use the new website
    design. Also removed some irrelevant parts like the navigation links
    and the comment form.
2025-10-26 18:35:11 +00:00
01c5ed1495 dat update and minor format changes 2025-10-20 15:37:24 +02:00
50facb86f3 dat update and minor format changes 2025-10-20 15:36:48 +02:00
Dave Morriss
9c5cccd0f2 Addition of notes about running "thanks_to_hosts" 2025-10-07 12:33:37 +01:00
Dave Morriss
2e7ae52cf1 Merge branch 'main' of repo.anhonesthost.net:HPR/hpr-tools
[I always commit before pulling!]
2025-10-06 23:25:36 +01:00
Dave Morriss
782f501c2b Addition of tool to list hosts in a year
hosts_in_year.sqlite.sql: query to return all hosts contributing shows
    in a period (usually a year)

hosts_list.tpl: `TT²` template to generate an HTML list from the output
    of hosts_in_year.sqlite.sql

make_shownotes: trivial tidying

thanks_to_hosts: Bash script to simplify the generation of the HTML
    which thanks a year's hosts for their contributions
2025-10-06 23:20:28 +01:00
10 changed files with 345 additions and 239 deletions

View File

@@ -0,0 +1,51 @@
# Thanking hosts at the end of the year
## Introduction
Every year, in the last Community News recording (for December) it has been the
norm to list all of the hosts who have contributed. A list of host names is
assembled for this purpose, included in the notes and read out by the
volunteers.
## Method
A Bash script exists, called `thanks_to_hosts`, which manages the generation of
the list of hosts. The end product is a piece of HTML for insertion into the
notes.
The script is invoked simply by typing:
```
thanks_to_hosts
```
By default, the script uses the current year when generating the list of hosts.
If, as may happen, the list is being generated in the next year, then a 4-digit
year can be given in as an argument.
### Items required to run
The `thanks_to_hosts` script requires a number of tools and files to run:
- `query2tt2` - this is a Perl script which performs a database query and hands
the results to Template Toolkit template.
- `hpr.db` - a SQLite database which contains a copy of the live HPR database.
This needs to have been refreshed in the recent past.
- `.hpr_sqlite.cfg` - the configuration file for `query2tt2` to indicate what
type of database is being used and where to find it.
- `hosts_in_year.sqlite.sql` - a file containing the query used (using SQLite
syntax)
- `hosts_list.tpl` - the template which will be used to generate HTML
### Output file
Running the script `thanks_to_hosts`, if successful, will result in the
generation of a file called `hosts_in_year_${YEAR}.html`, where `${YEAR}` is
replaced by the default or explicit year. The script will report the name of
this file for convenience.
<!--
vim: syntax=markdown:ts=8:sw=4:ai:et:tw=78:fo=tcqn:fdm=marker:com+=fb\:-
-->

View File

@@ -0,0 +1,17 @@
--
-- hosts_in_year.sqlite.sql 2025-10-06
--
-- Query for use with 'query2tt2' to generate a list of hosts who contributed
-- shows in a particular year. Designed to be used with the 'hosts_list.tpl'
-- template.
-- The two '?' placeholders in the query are to be filled with 'YYYY-01-01'
-- for the start of the year and 'YYYY-12-31'. The values can be passed using
-- the '-dbargs' option to 'query2tt2'.
--
SELECT DISTINCT
printf('%04d',h.hostid) AS hostid, h.host AS hostname
FROM eps e
JOIN hosts h ON e.hostid = h.hostid
WHERE e.date BETWEEN ? AND ?
AND title != 'Reserved'
ORDER BY lower(h.host)

View File

@@ -0,0 +1,53 @@
[%# ==========================================================================
This is the TT2 file for making a list of hosts contributing to HPR in the
current year which is run in conjunction with 'query2tt2'. It's invoked
by using the Bash script 'thanks_to_hosts'.
[We can't use the planned pure TT2 version since Template::Plugin::DBI
can't run over the SSH tunnel.]
The 'query2tt2' script needs a configuration file '.hpr_sqlite.cfg,' though this
is the default.
The file 'hosts_in_year.sqlite.sql' is used to generate the 'result' hash
which is used by this template. The query needs to be given the first and last
dates of the year.
This template uses the variable 'year' which can be provided to 'query2tt2'
using the option '-def year="$year"' or similar. If not provided the default
value is the current year.
The 'result' hash is sorted by host name. The loop which writes the output
generates links to the HPR website, with 8 per list element
Changes:
-------
2023-10-30: The correspondent URL has changed with the static site, and needs
the hostid to be zero-padded.
2025-01-01: We now use a copy of the live database, built from the HPR server
and available as https://www.hackerpublicradio.org/hpr.sql. This is
a MySQL/MariaDB dump which can be used to create a MariaDB or a SQLite copy.
See the script collect_HPR_database for how the SQLite version is created.
========================================================================== -%]
[%- USE date -%]
[%- DEFAULT
year = date.format(date.now,'%Y','UTC')
-%]
<h3>Thanks to all [% result.size %] HPR contributors in [% year %]!</h3>
[% limit = 8 -%]
[% count = 0 -%]
<p><ul><li>
[% FOREACH h = result -%]
<a href="https://hackerpublicradio.org/correspondents/[% h.hostid %].html">[% h.hostname %]</a>
[%- IF loop.count mod limit == 0 || loop.count == result.size -%].[% ELSE %],[% END %]
[% count = count + 1 -%]
[% IF count == limit -%]
[% count = 0 -%]
</li><li>
[% END -%]
[% END -%]
</li></ul></p>
[%#
# vim: syntax=tt2:ts=8:sw=4:ai:et:tw=78:fo=tcrqn21:fdm=marker
-%]

View File

@@ -10,16 +10,16 @@
# recurrence description is not adequate.
#
# OPTIONS: None
# REQUIREMENTS: Needs modules Getopt::Long, Data::ICal, Date::Parse and
# Date::Calc
# REQUIREMENTS: Needs modules Getopt::Long, Data::ICal, Date::ICal,
# Date::Parse and Date::Calc
# BUGS: ---
# NOTES: Based on a script distributed with the HPR episode "iCalendar
# Hacking"
# AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
# LICENCE: Copyright (c) year 2012-2024 Dave Morriss
# VERSION: 0.2.3
# LICENCE: Copyright (c) year 2012-2025 Dave Morriss
# VERSION: 0.2.4
# CREATED: 2012-10-13 15:34:01
# REVISION: 2024-10-28 13:17:44
# REVISION: 2025-10-23 16:51:48
#
#===============================================================================
@@ -42,7 +42,7 @@ use Date::ICal;
#
# Version number (manually incremented)
#
our $VERSION = '0.2.3';
our $VERSION = '0.2.4';
#
# Script name
@@ -88,9 +88,10 @@ usage() if ( $options{'help'} );
#
# Collect options
#
my $count = ( defined( $options{count} ) ? $options{count} : $DEF_COUNT );
my $count = ( defined( $options{count} ) ? $options{count} : $DEF_COUNT );
my $reminder = ( defined( $options{reminder} ) ? $options{reminder} : 0 );
my $force = ( defined( $options{force} ) ? $options{force} : 0 );
my $outfile = $options{output};
#my $reminder_summary = ( defined( $options{summary} ) ? $options{summary} :
# $DEF_SUMMARY );
@@ -120,6 +121,19 @@ else {
@startdate = Today();
}
#
# Open the output file (or STDOUT)
#
my $outfh;
if ($outfile) {
open( $outfh, ">:encoding(UTF-8)", $outfile )
or die "Unable to open $outfile for writing: $!\n";
}
else {
open( $outfh, ">&", \*STDOUT )
or die "Unable to initialise for writing: $!\n";
}
#
# Date and time values
#
@@ -291,7 +305,7 @@ if ($reminder) {
#
# Print the result
#
print $calendar->as_string;
print $outfh $calendar->as_string;
exit;
@@ -440,7 +454,7 @@ sub ISO8601_Date {
#===============================================================================
sub usage {
print STDERR <<EOD;
Usage: $PROG [options] [FILE...]
Usage: $PROG [options]
$PROG v$VERSION
@@ -452,6 +466,8 @@ adds reminders in the form of TODO items in relation to each meeting.
-count=N Number of entries; default 12
-[no]force Allow a -from=DATE date before today; default not
-[no]reminder Add a reminder TODO item; default no
-output=FILE Name of file to write to; optional, writes to STDOUT
if omitted
EOD
# -summary=TEXT Alternative text for the reminder (default 'Send out
@@ -472,7 +488,8 @@ EOD
sub Options {
my ($optref) = @_;
my @options = ( "help", "from=s", "count=i", "force!", "reminder!");
my @options
= ( "help", "from=s", "count=i", "force!", "reminder!", "output=s" );
# "summary|rs=s" );
if ( !GetOptions( $optref, @options ) ) {

View File

@@ -159,8 +159,11 @@ Options( \%options );
#
# Default help is just the USAGE section
#
pod2usage( -msg => "$PROG version $VERSION\n", -verbose => 0, -exitval => 1 )
if ( $options{'help'} );
pod2usage(
-msg => "$PROG version $VERSION\n",
-verbose => 0,
-exitval => 1
) if ( $options{'help'} );
#
# Full documentation if requested with -documentation or -man

View File

@@ -36,3 +36,5 @@
2025-06-01,2025-07-04 15:00:00
2025-07-01,2025-08-01 15:00:00
2025-08-01,2025-08-29 15:00:00
2025-09-01,2025-09-26 15:00:00
2025-10-01,2025-09-26 15:00:00

View File

@@ -1,4 +1,4 @@
[%# shownote_template13.tpl Updated: 2025-08-20 -%]
[%# shownote_template.tpl Updated: 2025-10-22 -%]
[%# -------------------------------------------------------------------------------- -%]
[%# Makes either an HTML snippet for insertion into the database or a full -%]
[%# listing with full comments for circulation to the hosts recording the episode -%]

View File

@@ -1,4 +1,4 @@
[%# /home/cendjm/HPR/Community_News/shownotes_container.tpl 2024-06-22 -%]
[%# /home/cendjm/HPR/Community_News/shownotes_container.tpl 2025-10-26 -%]
[%# Container to display Community News shownotes as an HTML page -%]
[%- USE date -%]
[% DEFAULT shownotes = ""
@@ -8,250 +8,99 @@
<!DOCTYPE HTML>
<html lang="en">
<head>
<title>Hacker Public Radio ~ The Technology Community Podcast</title> <base href="https://hackerpublicradio.org/"> <meta charset="utf-8" />
<title>Hacker Public Radio ~ The Technology Community Podcast</title> <base href="https://hackerpublicradio.org/"> <meta charset="utf-8" />
<meta http-equiv="X-Clacks-Overhead" content="GNU Terry Pratchett" />
<meta http-equiv="last-modified" content="Sat, 22 Jun 2024 16:04:21 +0000">
<meta http-equiv="last-modified" content="Wed, 22 Oct 2025 09:32:36 +0000">
<meta name="keywords" content="Technology, Tech News, Education, Training" />
<meta name="description" content="Hacker Public Radio is a podcast that releases shows every weekday Monday through Friday. Our shows are produced by the community (you) and can be on any topic that is of interest to hackers and hobbyists." />
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Internal CSS -->
<style type="text/css">
article, aside, dialog, figure, footer, header, hgroup, menu, nav, section {
display: block;
}
#list1, #list2, #list3 {
display:none;
}
</style>
<link rel="shortcut icon" href="https://hackerpublicradio.org/hpr.ico" >
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Ogg Vorbis RSS" href="./hpr_ogg_rss.php" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Speex RSS" href="./hpr_spx_rss.php" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio MP3 RSS" href="./hpr_mp3_rss.php" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Comments RSS" href="./comments.rss" />
<link rel="shortcut icon" href="/hpr.ico" >
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Opus RSS" href="/hpr_opus_rss.php" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Ogg Vorbis RSS" href="/hpr_ogg_rss.php" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio MP3 RSS" href="/hpr_mp3_rss.php" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Comments RSS" href="/comments.rss" />
<link rel="license" title="CC BY-SA 4.0" href="https://creativecommons.org/licenses/by-sa/4.0/" />
<link href="./css/hpr.css" rel="stylesheet" />
<link href="/css/hpr.css" rel="stylesheet" />
<!--[if IE]>
<link rel="stylesheet" href="./css/hpr.css" media="screen" type="text/css" />
<link rel="stylesheet" href="/css/hpr.css" media="screen" type="text/css" />
<script src="/JavaScript/html5.js"></script>
<![endif]-->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.5, user-scalable=yes"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"/>
</head>
<body id="give">
<div id="container" class="shadow">
<header>
<a href="./"><img id="hprlogo" src="./images/hpr_logo.png" alt="hprlogo"></a>
<div id="hpr_banner">
<p id="accessible_menu">
<a href="./sitemap.html">Site Map</a>
- <a href="#maincontent">skip to main content</a>
<body>
<div id="top_navigation" class="sr-only">
<nav id="accessible_menu">
<menu>
<li><a href="#main_content">Skip to Main Content</a></li>
<li><a href="/sitemap.html#main_content">Site Map</a></li>
</menu>
</nav>
<hr class="no-css">
</div>
<header role="banner">
<div class="bounding-box">
<hgroup id="title">
<h1 id="site_acronym"><a href="/index.html">HPR</a></h1>
<p id="site_name">
<a href="/correspondents/index.html">H</a>acker
<a href="/comments_viewer.html">P</a>ublic
<a href="/syndication.html">R</a>adio
</p>
<h1 id="sitename">
<a href="./correspondents/index.html">H</a>acker
<a href="./comments_viewer.html">P</a>ublic
<a href="./syndication.html">R</a>adio
</h1>
<h2>Your ideas, projects, opinions - podcasted.</h2>
<h3>New episodes every weekday Monday through Friday.<br />
<em><small>Temporary version of the Community News notes for hosts to use when recording<br />
Updated on [% date.format(date.now,'%Y-%m-%d %H:%M:%S') %]</small></em></h3>
</hgroup>
<hgroup id="tag_line">
<h2 id="tag1">The Community Podcast</h2>
<p id="tag2">Sharing your ideas, projects, opinions since 2005</p>
<p id="tag3">New episodes every weekday </p>
</div>
<hr />
<nav class="menu" role="navigation"> <ul>
<li><a href="https://hub.hackerpublicradio.org/"><strong>⇧Upload⇧</strong></a></li>
<li><a href="./index.html"><strong>Home</strong></a></li>
<li><a href="./syndication.html"><strong>Get Shows »</strong></a></li>
<li><a href="./eps/index.html">Full Episode Guide</a></li>
<li><a href="./series/index.html">In-Depth Series</a></li>
<li><a href="./download.html">Download Options</a></li>
</ul>
</nav>
</hgroup>
</div>
</header>
<main id="maincontent">
<main id="main_content" role="main">
<article>
<header>
<h1>hpr[% episode %] :: HPR Community News for [% month_year %]</h1>
<h3>HPR Volunteers talk about shows released and comments posted in [% month_year %]</h3>
<p class="meta"><small><a href="./eps/hpr0001/index.html" rel="first">&lt;&lt; First</a>, <a href="./eps/hpr4190/index.html" rel="previous">&lt; Previous</a>, Next <span>&gt;</span> <a href="./eps/hpr4145/index.html" rel="last">Latest &gt;&gt;</a></small> </p>
<p><a href="./correspondents/0159.html"><img src="./images/hosts/159.png" height="80" width="80" alt="Thumbnail of HPR Volunteers" /></a><br>Hosted by <a href="./correspondents/0159.html">HPR Volunteers</a> on <span>2024-09-02</span> is flagged as <span>Explicit</span> and is released under a <span>CC-BY-SA license</span>. <br> <span><label>Tags:</label> <em> <a href="./tags.html#community news">Community News</a>.</em>
<p><em><small>Temporary version of the Community News notes for hosts to use when recording<br />
Updated on [% date.format(date.now,'%Y-%m-%d %H:%M:%S') %]</small></em></p>
<p><a href="/correspondents/0159.html"><img src="/images/hosts/159.png" height="80" width="80" alt="Thumbnail of HPR Volunteers" /></a><br>Hosted by <a href="/correspondents/0159.html">HPR Volunteers</a> on <span>Monday, 2025-10-06</span> is flagged as <span>Explicit</span> and is released under a <span>CC-BY-SA license</span>. <br> <span><label>Tags:</label> <em> <a href="/tags.html#community_news">Community News</a>.</em>
</span>
<label>Comments: </label><a href="./eps/hpr[% episode %]/index.html#comments" aria-label="Comments for hpr[% episode %]">(Be the first)</a>. <br>
The show is available on the Internet Archive at: <a href="https://archive.org/details/hpr[% episode %]">https://archive.org/details/hpr[% episode %]</a><p> Listen in <a href="https://archive.org/download/hpr[% episode %]/hpr[% episode %].ogg" aria-label="Download hpr[% episode %] as">ogg</a>,
<a href="https://archive.org/download/hpr[% episode %]/hpr[% episode %].spx" aria-label="Download hpr[% episode %] as">spx</a>,
or <a href="https://archive.org/download/hpr[% episode %]/hpr[% episode %].mp3" aria-label="Download hpr[% episode %] as">mp3</a> format. Play now:<br>
<label>Comments: </label><a href="/eps/[% episode %]/index.html#comments"
aria-label="Comments for [% episode %]">(Be the first)</a>. <br><p> Listen in <a href="https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/[% episode %]/[% episode %].ogg" aria-label="Download [% episode %] as">ogg</a>,
<a href="https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/[% episode %]/[% episode %].opus" aria-label="Download [% episode %] as">opus</a>,
or <a href="https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/[% episode %]/[% episode %].mp3" aria-label="Download [% episode %] as">mp3</a> format. Play now:<br>
<audio controls preload="none">
<source src="https://archive.org/download/hpr[% episode %]/hpr[% episode %].ogg" type="audio/ogg" >
<source src="https://archive.org/download/hpr[% episode %]/hpr[% episode %].mp3" type="audio/mpeg" >
<source src="https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/[% episode %]/[% episode %].ogg" type="audio/ogg" >
<source src="https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/[% episode %]/[% episode %].mp3" type="audio/mpeg" >
</audio><br>
Duration: 00:00:00</p></p>
<h3> <label>Part of the series:</label> <a href="./series/0047.html">HPR Community News</a>.</h3>
Duration: 01:23:13<br>Download the <a href="https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/[% episode %]/[% episode %].txt" aria-label="Download [% episode %]">transcription</a></li> and
<a href="https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/[% episode %]/[% episode %].srt" aria-label="Download [% episode %]">subtitles</a>.</p></p>
<h3> <label>Part of the series:</label> <a href="/series/0047.html">HPR Community News</a>.</h3>
<p><em>A monthly look at what has been going on in the HPR community. This is a regular show scheduled for the first Monday of the month.</em></p>
</header>
<div>
[% INCLUDE $shownotes -%]
</div>
<footer><h2>Show Transcript</h2>
<p>Automatically generated using <a href="https://github.com/openai/whisper">whisper</a>
<pre><code>whisper --model tiny --language en hpr[% episode %].wav</code></pre></p>
<p>
You can save these subtitle files to the same location as the HPR Episode, and they will automatically show in players like <a href="https://mpv.io/">mpv</a>, <a href="https://www.videolan.org/vlc/">vlc</a>. Some players allow you to specify the subtitle file location.
</p>
<ul>
<li>Text: <a href="https://archive.org/download/hpr[% episode %]/hpr[% episode %]/hpr[% episode %].txt">hpr[% episode %].txt</a></li>
<li><a href="https://en.wikipedia.org/wiki/WebVTT">WebVTT</a>: <a href="https://archive.org/download/hpr[% episode %]/hpr[% episode %]/hpr[% episode %].vtt">hpr[% episode %].vtt</a></li>
<li><a href="https://en.wikipedia.org/wiki/SubRip">SubRip</a>: <a href="https://archive.org/download/hpr[% episode %]/hpr[% episode %]/hpr[% episode %].srt">hpr[% episode %].srt</a></li>
</ul><p><small><a href="./eps/hpr0001/index.html" rel="first">&lt;&lt; First</a>, <a href="./eps/hpr4190/index.html" rel="previous">&lt; Previous</a>, Next <span>&gt;</span> <a href="./eps/hpr4145/index.html" rel="last">Latest &gt;&gt;</a></small></p>
</footer></article><hr />
<h1>Comments</h1>
<p id="comments">
Subscribe to the comments <a href="./comments.rss">RSS</a> feed.
</p>
<h2>Leave Comment</h2>
<p>
<strong>Note to Verbose Commenters</strong><br />
If you can't fit everything you want to say in the comment below then you really should <a href="https://hackerpublicradio.org/about.html#so_you_want_to_record_a_podcast">record</a> a response show instead.
</p>
<p>
<strong>Note to Spammers</strong><br />
All comments are moderated. All links are checked by humans. We strip out all html. Feel free to <a href="https://hackerpublicradio.org/about.html#so_you_want_to_record_a_podcast">record</a> a show about yourself, or your industry, or any other topic we may find interesting. <em>We also check shows for spam :)</em>.
</p>
<form method="POST" action="https://hub.hackerpublicradio.org/comment_confirm.php">
<fieldset>
<legend>Provide feedback</legend>
<table>
<tr>
<td>Your Name/Handle:</td>
<td><input required type="text" name="comment_author_name" size="40" maxlength="40" placeholder="Enter your name" ></td>
</tr>
<tr>
<td>Title:</td>
<td><input required type="text" name="comment_title" size="50" maxlength="100" placeholder="What is your comment about?"></td>
</tr>
<tr>
<td>Comment:</td>
<td><textarea required name="comment_text" maxlength="2000" rows="10" cols="50" placeholder="Place the comment here."></textarea></td>
</tr>
<tr>
<td>Anti Spam Question:</td>
<td>
What does the letter <strong>P</strong> in <em>HPR</em> stand for? <br />
<input required type="text" name="anti_spam_question" size="50" maxlength="100" placeholder="Type out what the P in HPR stands for."></td>
</tr><!-- . -->
<tr>
<td>Are you a spammer?</td>
<td>
<input required checked="checked" type="radio" name="spammer" id="spammer_yes" value="Yes">
<label for="spammer_yes">Yes</label>
<input required type="radio" name="spammer" id="spammer_no" value="No">
<label for="spammer_no">No</label>
</td>
</tr>
<!-- . -->
<tr>
<td>What is the <strong>HOST_ID</strong> for the host of this show?</td>
<td>
<input required type="text" name="hostid" size="20" maxlength="5" placeholder="Type the host number"></td>
<td>
<!-- . -->
<tr>
<td>What does HPR mean to you?</td>
<td><textarea required name="justification" maxlength="200" rows="4" cols="50" placeholder="Convince us you are part of the community."></textarea></td>
</tr> <tr><td>
<input type="hidden" name="eps_id" value="[% episode %]">
</td></tr>
</table>
<input type="submit" value="Next">
</fieldset>
</form>
</main>
<footer id="footer_page">
<h1 class="thick_bar"><span style="padding-left: 1em;">More Information...</span></h1>
<div id="more_info">
<nav class="column">
<h2>Ancestry</h2>
<ul>
<li><a href="http://audio.textfiles.com/shows/radiofreekamerica/">Radio Freek America</a></li>
<li><a href="http://audio.textfiles.com/shows/binrev/">BinRev Radio</a></li>
<li><a href="http://audio.textfiles.com/shows/infonomicon/">Infonomicon</a></li>
<li><a href="http://audio.textfiles.com/shows/twat/">Today With a Techie</a></li>
</ul>
</nav>
<nav class="column">
<h2>Social</h2>
<ul>
<li><a href="https://hackerpublicradio.org/maillist" >Mailing list</a></li>
<li><a href="https://botsin.space/@hpr" >Mastodon</a></li>
<li><a href="https://matrix.to/#/#hpr:matrix.org" >Matrix</a></li>
<li><a href="mumble://chatter.skyehaven.net:64738/Hacker%20Public%20Radio?version=1.2.0" >Mumble</a></li>
<li><a href="https://web.libera.chat/gamja/?channels=oggcastplanet" target="_blank">#oggcastplanet</a></li>
<li><a href="https://t.me/+6fEhQrf5IEc4ZGU8">Telegram</a></li>
<li><a href="https://twitter.com/HPR">Twitter.com</a></li>
<li><a href="https://www.facebook.com/HenryPartickReilly" target="_blank">Facebook</a></li>
<li><a href="https://www.linkedin.com/company/hackerpublicradio/" target="_blank">Linked-In</a></li>
</ul>
</nav>
<nav class="column">
<h2>Unaffiliates</h2>
<ul>
<li><a href="https://archive.org/details/hackerpublicradio">Archive.org</a></li>
<li><a href="https://music.amazon.fr/podcasts/9d9e6211-ff78-4501-93b6-6a9e560c4dbd/hacker-public-radio">Amazon Music</a></li>
<li><a href="https://podcasts.google.com/feed/aHR0cDovL2hhY2tlcnB1YmxpY3JhZGlvLm9yZy9ocHJfcnNzLnBocA">Google Podcasts</a></li>
<li><a href="https://www.iheart.com/podcast/256-hacker-public-radio-30994513/" target="_blank">iHeart Radio</a></li>
<li><a href="https://podcasts.apple.com/us/podcast/hacker-public-radio/id281699640">iTunes</a></li>
<li><a href="https://www.listennotes.com/de/podcasts/hacker-public-radio-hacker-public-radio-mNH-jsI7LcJ/">Listen Notes</a></li>
<li><a href="https://www.mixcloud.com/hackerpublicradio/">MixCloud</a></li>
<li><a href="https://player.fm/series/hacker-public-radio">PlayerFM</a></li>
<li><a href="https://www.podchaser.com/podcasts/hacker-public-radio-76781">Podchaser</a></li>
<li><a href="https://nl.radio.net/podcast/hacker-public-radio">Radio.net</a></li>
<li><a href="https://open.spotify.com/show/7e2hYcnHj9vKgUzsIOf4r3">Spotify</a></li>
<li><a href="https://toppodcast.com/podcast_feeds/hacker-public-radio/">Top Podcasts</a></li>
</ul>
</nav>
<nav class="column">
<h2>Commons</h2>
<ul>
<li><a href="https://freeculturepodcasts.org/">Free Culture Podcasts</a></li>
<li><a href="https://archive.org/details/hackerpublicradio">archive.org</a></li>
<li><a href="https://repo.anhonesthost.net/explore/repos" >HPR Source Code</a></li>
<li><a href="https://cchits.net/">cchits.net</a></li>
<li><a href="https://freesound.org/">freesound.org</a></li>
<li><a href="https://librivox.org/">librivox.org</a></li>
<li><a href="https://openclipart.org/">openclipart.org</a></li>
<li><a href="https://openfontlibrary.org/">openfontlibrary.org</a></li>
<li><a href="https://www.openrouteservice.org/">openrouteservice.org/</a></li>
<li><a href="https://pixabay.com/">pixabay.com/</a></li>
</ul>
</nav>
<nav class="column">
<h2>Patrons</h2>
<ul>
<li><a href="https://anhonesthost.com/hosting/shared-hosting">AnHonestHost.com</a></li>
<li><a href="https://archive.org/donate/">Archive.org</a></li>
<li><a href="https://rsync.net/">rsync.net</a></li>
</ul>
</nav>
</div><!-- more_info -->
<h1 class="thick_bar"><span style="padding-left: 1em;">Copyright Information</span></h1>
</article>
</main>
<footer role="contentinfo">
<hr class="no-css">
<div id="copyright">
<p>
Unless otherwise stated, our shows are released under a <a rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/">
Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)</a> license.</p>
<p>
<span>Unless otherwise stated, our shows are released under a <a rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/">
Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)</a> license.</span>
<span>
The <span property="dct:title">HPR Website Design</span> is released to the <a rel="license" href="https://creativecommons.org/publicdomain/mark/1.0/">Public Domain</a>.
</p>
<hr />
</div><!-- copyright -->
<hr />
</span>
</div>
</footer>
</div>
<!-- shadow -->
</body>
</html>
[%#
vim: syntax=html:ts=8:sw=4:ai:et:tw=78:fo=tcqn:fdm=marker:com+=fb\:-
-%]

114
Community_News/thanks_to_hosts Executable file
View File

@@ -0,0 +1,114 @@
#!/bin/bash -
#===============================================================================
#
# FILE: thanks_to_hosts
#
# USAGE: ./thanks_to_hosts [year]
#
# DESCRIPTION: Generates HTML to be added to the Community News at the end of
# the year in order to thank hosts contributing shows in that
# year.
#
# OPTIONS: ---
# REQUIREMENTS: ---
# BUGS: ---
# NOTES: ---
# AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
# VERSION: 0.0.1
# CREATED: 2025-10-06 16:38:42
# REVISION: 2025-10-06 18:06:12
#
#===============================================================================
set -o nounset # Treat unset variables as an error
#
# Process the year, either as an argument or as a default (the current year)
#
YEAR="${1:-}"
if [[ -z $YEAR ]]; then
YEAR="$(date +%Y)"
else
if ! [[ $YEAR =~ ^[0-9]{4}$ ]]; then
echo "Invalid year: '$YEAR'"
exit 1
fi
fi
#
# Various constants
#
# Uncomment the first form and comment out the second form unless 'query2tt2'
# is in your path. It or a link to the script will need to be in the current
# directory.
#
# DBQUERY='./query2tt2'
DBQUERY="$(command -v query2tt2)"
#
# Files expected to be in the current directory, or which will be written
# there. These could be given full absolute paths if desired.
#
DB='hpr.db'
CONFIG='.hpr_sqlite.cfg'
QUERY='hosts_in_year.sqlite.sql'
TEMPLATE='hosts_list.tpl'
OUTPUT="hosts_in_year_${YEAR}.html"
# [Nothing should need editing below here]
#
# Start and end of the year
#
YRSTART="${YEAR}-01-01"
YREND="${YEAR}-12-31"
#
# Sanity checks
#
[ -e "$DBQUERY" ] || {
echo "Unable to find '$DBQUERY'"
exit 1
}
[ -e $DB ] || {
echo "Unable to find '$DB'"
exit 1
}
[ -e $CONFIG ] || {
echo "Unable to find '$CONFIG'"
exit 1
}
[ -e $QUERY ] || {
echo "Unable to find '$QUERY'"
exit 1
}
[ -e $TEMPLATE ] || {
echo "Unable to find '$TEMPLATE'"
exit 1
}
#
# Query the SQLite database
#
$DBQUERY \
-config=$CONFIG \
-query=$QUERY \
-template=$TEMPLATE \
-dbarg "$YRSTART" \
-dbarg "$YREND" \
-def "year=${YEAR}" \
-out="$OUTPUT"
RES=$?
#
# Deal with failures
#
if [[ $RES -eq 0 ]]; then
echo "HTML written to $OUTPUT"
else
echo "Problem generating HTML"
fi
exit $RES
# vim: syntax=sh:ts=8:sw=4:ai:et:tw=78:fo=tcrqn21

View File

@@ -48,13 +48,6 @@ function echo_debug() {
fi
}
#################################################
# Display Information message
function abs_diff() {
echo $(($1 >= $2 ? $1 - $2 : $2 - $1))
}
#################################################
# Display Help
@@ -63,6 +56,13 @@ function display_help_and_exit() {
exit 1
}
#################################################
# Calculate difference
function abs_diff() {
echo $(($1 >= $2 ? $1 - $2 : $2 - $1))
}
#################################################
# Program Checks
@@ -174,7 +174,7 @@ function check_variable_is_correct() {
fi
if [ "$( file --brief --mime-type "${assets_csv}" | grep --count 'text/csv' )" -ne "1" ]
then
echo_error "The \"assets_csv\" variable has not a valid \"text/csv\" mime type."
echo_error "The \"assets_csv\" file has not a valid \"text/csv\" mime type."
fi
if [ "$( wc --lines ${assets_csv} | awk '{print $1}' )" -le "1" ]
then
@@ -1657,7 +1657,7 @@ function generate_show_transcript() {
cat "${episode_srt}" | while read this_line
do
if [ "$( echo "${this_line}" | grep -c --perl-regexp '^[0-9]+$' )" -eq "1" ]
if [ "$( echo "${this_line}" | grep --count --perl-regexp '^[0-9]+$' )" -eq "1" ]
then
echo "${count}"
count=$((count+1))
@@ -1899,7 +1899,7 @@ function register_assets() {
echo '"episode_id","filename","extension","size", "sha1sum", "mime_type", "file_type"' | tee "${assets_csv}"
find "${working_dir}/" -maxdepth 1 -type f \( -iname "hpr${ep_num}.*" -or -iname "hpr${ep_num}_image_*.*" \) | \
find "${working_dir}/" -maxdepth 1 -type f \( -iname "hpr${ep_num}.*" -or -iname "hpr${ep_num}_image_*.*" -or -iname "hpr${ep_num}_extra_*.*" \) | \
while read this_asset_filename
do
this_asset_filename="$( basename "${this_asset_filename}" )"