Compare commits
9 Commits
d19fe2e4bf
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 20f1951321 | |||
|
|
e54e1c926f | ||
| e784b07dbd | |||
|
|
00172063de | ||
| 01c5ed1495 | |||
| 50facb86f3 | |||
|
|
9c5cccd0f2 | ||
|
|
2e7ae52cf1 | ||
|
|
782f501c2b |
51
Community_News/Thanking_hosts_at_end_of_year.md
Normal file
51
Community_News/Thanking_hosts_at_end_of_year.md
Normal 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\:-
|
||||
-->
|
||||
17
Community_News/hosts_in_year.sqlite.sql
Normal file
17
Community_News/hosts_in_year.sqlite.sql
Normal 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)
|
||||
53
Community_News/hosts_list.tpl
Normal file
53
Community_News/hosts_list.tpl
Normal 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
|
||||
-%]
|
||||
@@ -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 ) ) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 -%]
|
||||
|
||||
@@ -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"><< First</a>, <a href="./eps/hpr4190/index.html" rel="previous">< Previous</a>, Next <span>></span> <a href="./eps/hpr4145/index.html" rel="last">Latest >></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"><< First</a>, <a href="./eps/hpr4190/index.html" rel="previous">< Previous</a>, Next <span>></span> <a href="./eps/hpr4145/index.html" rel="last">Latest >></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
114
Community_News/thanks_to_hosts
Executable 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
|
||||
|
||||
@@ -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}" )"
|
||||
|
||||
Reference in New Issue
Block a user