1
0
forked from HPR/hpr_generator

43 Commits

Author SHA1 Message Date
38b4a704f9 Use main navigation menu for all pages 2025-07-18 23:31:50 -04:00
9dce59fdee Fix skip to main content link 2025-07-18 23:16:41 -04:00
65528d2025 Format banner tagline 2025-07-18 23:06:35 -04:00
ec8335daab Update main navigation menu for landing page 2025-07-18 11:33:52 -04:00
7f559f26e3 Merge branch 'newsite' of repo.anhonesthost.net:HPR/hpr_generator into newsite 2025-07-18 11:32:14 -04:00
82ee6c808c Add and format lane icons 2025-07-18 11:31:24 -04:00
a5c73f5874 Add and format lane icons 2025-07-18 11:07:00 -04:00
829bdb7708 Initial accessibility tweaks based on ARC Tookit
Ran the ARC Tookit Firefox extension which pointed out
accessiblity issues with color contrasts, link display, and
skip to main link.  Some of the link colors don't look great
when they reach the recommended contrast level.
2025-07-17 16:58:29 -04:00
91000b7c6f Add main header background image 2025-07-17 11:09:45 -04:00
80315d296c Merge branch 'newsite' of repo.anhonesthost.net:HPR/hpr_generator into newsite 2025-07-17 08:35:15 -04:00
69b26429a8 Update main header and footer formatting
Move styles closer to new design displayed on hobbypublicradio.org.
2025-07-16 23:39:08 -04:00
51ed253bbd Update main header and footer formatting
Move styles closer to new design displayed on hobbypublicradio.org.
2025-07-16 23:35:12 -04:00
fcd73c05d7 Format latest lane on main landing page 2025-07-16 20:48:51 -04:00
71c1c46cfb Add latest comments to latest lane on main landing page 2025-07-16 10:42:05 -04:00
991f088ded Update lastest episodes section to new layout 2025-07-15 21:45:31 -04:00
ebe230ee0a Initial formatting of swim lanes on main landing page 2025-07-15 21:06:33 -04:00
da62e4ec51 Add QR code with logo 2025-07-14 20:51:41 -04:00
34d13fa0c6 Format main template to new website design
Create basic structure in html to be displayed using the CSS
Flex box model
2025-07-14 20:13:06 -04:00
e21f434c2a Merge pull request 'Add Container file and build script (button_hpr_container.sh) to repo.' (#263) from sgoti/hpr_generator:main into main
Reviewed-on: HPR/hpr_generator#263
2025-06-19 17:04:05 +00:00
e2c591edff Merge branch 'main' into main 2025-06-19 17:03:56 +00:00
28a75efe1b Merge pull request 'about-page-html-submit' (#264) from norrist/hpr_generator:about-page-html-submit into main
Reviewed-on: HPR/hpr_generator#264
Reviewed-by: Roan Horning <rho_n@josh@dao-mail.com>
2025-06-06 01:53:33 +00:00
94baef679f rm line break 2025-06-05 17:00:16 -05:00
11738f5052 Replace old instructions for shownotes 2025-06-05 16:58:20 -05:00
Sgoti
c9e1446f1f Tiny human distraction.
I cp the files over but the 'git rm' failed and I didn't noticed.  Just a clean
    up job.
2025-05-30 17:46:02 -04:00
Sgoti
bbf5c26dab Moved 'Containerfile' and build script to hpr-tools/
Ken asked that files be placed into 'hpr-tools/'.  The build script is named
    'button_hpr_container.sh' currently; this will change too.  Maybe
    'hpr_email_shownotes.sh'.  Taking suggestions (as of 2025/05/30-2025/12/31).
2025-05-30 17:40:11 -04:00
Sgoti
2ca4d32282 Changed image tag from 'testing' to current perl version '5.40.1'
removed a few unused variables then shift the 'local' scoped unsets to global
2025-05-29 13:04:14 -04:00
Sgoti
cbe3dd4e0d Add Container file and build script (button_hpr_container.sh) to repo. The
build script can also run new containers after building images.  Build
    properties such as "${conternerBuildProperties[containerFile]}" must be
    assigned before building/running new containers.  Build script is "work
    in progress".

On branch dev
Changes to be committed:
    new file:   Containerfile
    new file:   button_hpr_container.sh
2025-05-29 11:25:06 -04:00
a8b205ed2c Typo reported to Archer72 2025-04-25 11:38:01 +00:00
013beca3c0 Merge pull request 'Issue #259 - Remove MySQL specific code from site generation code' (#261) from paulj/hpr_generator:remove_mysql_code into main
Reviewed-on: HPR/hpr_generator#261
Reviewed-by: Roan Horning <rho_n@josh@dao-mail.com>
2025-04-07 16:47:15 +00:00
Paul Jewell
86e1d73085 Remove MySQL specific code from site generation code
- site-generator is generic, so no changes.
 - removed mysql information from site.cfg.
 - Updated template files to call sqlite queries directly.
 - Renamed the query files - remove sqlite from file names.
 - Deleted MySQL specific template files.
2025-04-04 10:28:31 +01:00
dcd05d0e9b Merge pull request 'Update donation URL for AnHonestHost' (#258) from i254-Update_AnHonestHost_donation_link into main
Reviewed-on: HPR/hpr_generator#258
2025-03-18 03:08:01 +00:00
6d59372077 Update donation URL for AnHonestHost 2025-03-17 23:04:47 -04:00
beb5814d5d Merge pull request 'I256 maillist in the footer expands to current path' (#257) from I256_maillist_in_the_footer_expands_to_current_path into main
Reviewed-on: HPR/hpr_generator#257
2025-03-16 12:34:37 +00:00
6c7712be71 Fixed link to mail list 2025-03-16 13:33:42 +01:00
Ken Fallon
09f69164d0 Merge pull request 'Remove notes from the home page' (#255) from I253_Remove_the_shownotes_from_the_main_landing_page_again into main
Reviewed-on: https://127.0.0.1:3000/HPR/hpr_generator/pulls/255
2025-02-10 16:09:56 +00:00
bf7178b79f Remove notes from the home page 2025-02-10 16:16:39 +01:00
Ken Fallon
c4e875548c revert b1afd4fda8ac2eb2b39cf6fc98a84c021109b971
revert Removed the shownotes from the homepage
2025-02-10 13:53:58 +00:00
ed85c81396 Image for Shane 2025-02-09 22:36:06 +01:00
6f8c5c7141 Image for Sem Luz em Saint Louis 2025-02-09 21:45:57 +01:00
Ken Fallon
0ebc67addb Merge pull request 'I248 - Name of database update utility updated in GETTING_STARTED.md' (#247) from paulj/hpr_generator:getting-started-update into main
Reviewed-on: HPR/hpr_generator#247
2025-02-04 08:43:13 +00:00
Ken Fallon
808386bccc Merge pull request 'fix entity escape for xml data' (#252) from rho_n/hpr_generator_dev:i232_Comments-feed-not-producing-valid-xml into main
Reviewed-on: HPR/hpr_generator#252
2025-01-29 08:10:53 +00:00
28af8900a3 fix entity escape for xml data
For title and other xml data replace &, <, >, ', and " with
corresponding escape entities. Also use http_baseurl so
complete urls will be generated.
2025-01-27 22:26:32 -05:00
Paul Jewell
65e6464add Name change on database update utility reflected in GETTING_STARTED.md 2025-01-26 21:58:13 +00:00
66 changed files with 27837 additions and 862 deletions

View File

@@ -95,11 +95,11 @@ program which creates the hpr.db file:
`./utils/mysql2sqlite ./hpr-sqlite.sql | sqlite3 ./hpr.db`
For convenience, the update-sqlite-db.sh script in the utils directory
For convenience, the update-hpr-db.sh script in the utils directory
automates the above steps (including downloading the hpr.sql file).
From the root of the local hpr_generator repository run:
`./utils/update-sqlite-db.sh`
`./utils/update-hpr-db.sh`
# Configure the site-generator

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -13,22 +13,127 @@ https://creativecommons.org/publicdomain/
* - CSS-Tricks: Linearly Scale font-size with CSS clamp() Based on the Viewport
* -- https://css-tricks.com/linearly-scale-font-size-with-css-clamp-based-on-the-viewport/
*/
@font-face {
font-family: "GNUTypewriter";
src:
local("GNUTypewriter"),
url("/css/gnutypewriter/gtw.woff") format("woff");
}
@font-face {
font-family: "BebasNeue";
src:
local("BebasNeue"),
url("/css/bebas/BebasNeue.woff") format("woff");
}
:root {
--background-primary: #dfdfdf;
--text-primary: #4d4d4d; /* HPR Grey */
--banner-text-primary: #000000;
--background-secondary: #4d4d4d;
--text-secondary: #dfdfdf;
--link-primary: #004852 /*#154a60*/;
--link-primary-hover: #f8961e;
--link-secondary: #a8f8ff;
--link-secondary-hover: #f9e9c2;
--link-spacing-horizontal: clamp(0.5rem, -0.25rem + 3vw, 2.5rem);
--font-family-hpr: Verdana, Arial, Helvetica, sans-serif; /* 1em/1.5 OpenDyslexic, */;
--font-size-default: clamp(1rem, 15px + 0.3vw, 1.07rem);
/* screen breakpoints */
--for-phone-only: 599px;
--for-tablet-portrait-up: 600px;
--for-tablet-landscape-up: 900px;
--for-desktop-up: 1200px;
--for-big-desktop-up: 1800px;
}
html {
margin: 0;
padding: 0;
display: block;
display: flex;
flex-direction: column;
}
body {
display: flex;
flex-direction: column;
justify-content: flex-start;
background-color: var(--background-primary);
color: var(--text-primary);
font-size: 1rem; /* fallback for browsers that don't support the clamp function) */
font-size: var(--font-size-default);
font-family: var(--font-family-hpr);
margin: 0;
padding: 0;
min-height: 100vh;
}
body {
display: block;
background: #dfdfdf;
font-size: 1rem; /* fallback for browsers that don't support the clamp function) */
font-size: clamp(1rem, 15px + 0.3vw, 1.07rem);
body > nav {
background-color: var(--background-secondary);
color: var(--text-secondary);
}
body > nav a {
color: var(--link-secondary);
}
body > nav a:hover {
color: var(--link-secondary-hover);
}
body > nav ul {
background-color: inherit;
color: inherit;
margin: 0;
padding: 0.25rem;
}
body > nav ul li {
display: inline-block;
background-color: inherit;
color: inherit;
line-height: 1.0;
margin: 0;
padding: 0;
padding-right: var(--link-spacing-horizontal);
}
body > nav ul li a {
padding: 0.25rem 0;
}
body > header {
display: flex;
flex-direction: row;
flex-flow: wrap;
justify-content: space-between;
padding: 0.25rem;
background-image: url("/images/main-header-background.png");
color: var(--banner-text-primary);
}
body > header > * {
margin: 0;
padding: 0;
flex: 1 1 auto;
padding: 1.5rem;
}
body > main {
flex: 1 0 auto;
padding: 0.25rem;
}
body > footer {
flex: 0 1 auto;
background-color: var(--background-secondary);
color: var(--text-secondary);
padding: 0.25rem;
text-align: center
}
body > footer hr:first-child {
display: none;
margin: 0;
padding: 0;
}
body > footer a {
color: var(--link-secondary);
}
body > footer a:hover {
color: var(--link-secondary-hover);
}
div,
h1,
h2,
@@ -49,9 +154,9 @@ fieldset,
input,
textarea,
blockquote {
font-family: Verdana, Arial, Helvetica, sans-serif; /* 1em/1.5 OpenDyslexic, */
color: #4D4D4D; /* HPR Grey */
background: white;
font-family: inherit;
color: inherit;
background: inherit;
}
h1 {
@@ -60,7 +165,8 @@ h1 {
}
h2,
article * h1 {
article * h1,
section > header:first-child {
font-size: 1.45rem;
margin: 1.25rem 0 0.75rem 0;
}
@@ -92,10 +198,12 @@ li {
a {
text-decoration: none;
color: var(--link-primary);
}
a:hover {
cursor: pointer;
color: var(--link-primary-hover);
}
hr {
@@ -124,395 +232,92 @@ p.meta span label {
font-weight: bold;
}
article>p,
#maincontent>p {
line-height: 1.45;
}
.lane {
display: flex;
flex-direction: row;
flex-wrap: wrap;
gap: 0.5rem;
article#previous_five_weeks>* {
line-height: 1.35;
margin: 0;
padding: 0;
}
article#previous_five_weeks>h3 {
margin: 1.5rem 0 0.5rem 0;
}
#container {
max-width: 58rem;
margin: 0.25rem;
padding: 0.75rem; /* fallback for browsers that don't support the clamp function) */
padding: clamp(0.75rem, -0.25rem + 3vw, 2.0rem);
overflow: hidden;
background: white;
border: thin solid #4D4D4D;
}
.shadow {
-moz-box-shadow: 2px 3px 6px 3px #675958;
-webkit-box-shadow: 2px 3px 6px 3px #675958;
box-shadow: 2px 3px 6px 3px #675958;
}
.thick_bar {
background-color: #4D4D4D;
color: white;
a.lane-button {
display: flex;
flex-direction: column;
justify-content: center;
margin: 0.5rem var(--link-spacing-horizontal);
padding: 0.5rem;
margin: 1rem 0 1rem 0;
}
border-width: 5px;
border-color: var(--link-primary);
border-style: solid;
border-radius: 5px;
text-align: center;
img#hprlogo {
max-width: 20vw;
padding-right: clamp(0.75rem, -0.25rem + 3vw, 1.5rem);
float: left;
margin-top: 1rem;
margin-bottom: clamp(0.75rem, -0.25rem + 2vw, 1.5rem);
}
#hpr_banner {
/* display: inline-block; */
border: 0;
margin: 0 0 0rem 0;
padding: 0;
a.lane-button img {
height: 110px;
filter: invert(60%) sepia(50%) hue-rotate(140deg) saturate(200%);
transform: scaleX(0.9);
}
#hpr_banner p {
margin: 0 0 0.5rem 0;
#tag_line,
#title {
text-transform: uppercase;
}
#hpr_banner h1#sitename {
font-size: clamp(1.44rem, -1rem + 3vw, 2rem);
letter-spacing: 0.06rem;
margin: 0;
padding: 0;
}
#hpr_banner h2 {
font-size: clamp(0.74rem, -1rem + 2vw, 1rem);
font-weight: 510;
margin: 0 0 1rem 0;
padding: 0;
}
#hpr_banner h3 {
font-size: 1rem;
font-weight: normal;
margin: 0 0 0.5rem 0;
padding: 0;
}
header>hr {
clear: both;
}
#accessible_menu {
font-size: smaller;
}
/* The main navigation menu */
header>nav.menu {
display: block;
background-color: #4D4D4D; /* HPR Grey */
text-align: Left;
clear: both; /* Forces the menu to appear after the HPR Header block */
padding: 0;
margin: 0;
}
header>nav.menu ul {
margin: 0;
padding: 0.5rem;
background-color: inherit;
color: white;
}
header>nav.menu ul li {
display: inline-block;
background-color: inherit;
color: inherit;
line-height: 1.5;
margin: 0;
padding: 0;
padding-right: clamp(0.5rem, -0.25rem + 3vw, 2.5rem);
}
header>nav.menu ul li a {
color: white;
text-decoration: none;
display: block;
padding: 0.25rem 0;
}
header>nav.menu ul li a:hover {
border-bottom: thin solid white;
padding: 0.15rem 0;
-webkit-transition: 0.3s ease-in-out color;
-moz-transition: 0.3s ease-in-out color;
transition: 0.3s ease-in-out color;
}
header>nav.menu ul li a:visited {
color: #EDEDED;
}
a:active,
header>nav.menu ul li a:active {
color: red;
}
pre {
/* Add background, border and scrollbar to <pre> */
background: #eee;
border: 1px solid #ddd;
overflow: auto;
clear: both;
padding: 0.5rem
}
code {
background: #eee;
border-radius: 0.2rem;
font-size: 0.95rem;
}
pre code {
padding-right: 0.5rem;
font-size: 0.85rem;
#tag_line {
line-height: 1;
}
pre.comment {
white-space: pre-wrap;
line-height: 1.2rem;
#tag_line *,
#title * {
margin: 0;
padding: 0;
}
table.hosts {
font-size: clamp(0.82rem, -0.25rem + 3vw, 1.0rem);
width: 100%;
background: white;
margin: 0 auto;
border-collapse: collapse;
display: inline-table;
#title h1 {
font-size: 7.5rem;
letter-spacing: -0.65rem;
line-height: 0.75;
}
table#t01,
table.hosts {
display: block;
overflow-x: auto;
#tag_line h2 {
text-transform: uppercase;
font-family: "BebasNeue", sans-serif;
font-size: 1.15rem;
letter-spacing: 0.05rem;
}
table#t01 tbody,
table.hosts tbody {
display: table;
#tag_line h2:first-child {
font-size: 2rem;
}
table#t01 tr:nth-child(even),
table.hosts tr:nth-child(even) {
background-color: #cccccc;
border-bottom: thick solid white;
}
table#t01 tr:nth-child(odd),
table.hosts tr:nth-child(odd) {
background-color: white;
border-bottom: thick solid white;
}
table.hosts tr td img {
vertical-align: middle;
max-height: 80px;
}
table.hosts th:first-child,
table.hosts td:first-child {
min-width: 60px;
max-width: 80px;
text-align: left;
height: 62px;
}
table.hosts th:nth-child(2),
table.hosts td:nth-child(2) {
text-align: left;
padding-left: clamp(0.15rem, -0.25rem + 3vw, 0.5rem);
}
table.hosts th:nth-child(3),
table.hosts td:nth-child(3),
table.hosts th:nth-child(4),
table.hosts td:nth-child(4) {
width: 10%;
padding-right: clamp(0.10rem, -0.25rem + 3vw, 1rem);
}
body>div>footer {
margin-top: 2rem;
}
footer #more_info nav.column {
clear: both;
font-size: 0.9rem;
margin-left: 0.5rem;
}
footer #more_info nav.column ul li {
float: left;
margin-right: 1.5rem;
margin-bottom: 1rem;
}
footer #more_info nav.column h2 {
font-size: 1.35rem;
margin-top: 0.5rem;
}
footer h1.thick_bar {
clear: left;
#tag_line h3 {
text-transform: capitalize;
font-size: 1.15rem;
}
footer #copyright {
font-size: smaller;
margin-left: 0.5rem;
margin-right: 0.5rem;
#site_url {
font-family: "GNUTypewriter", monospace;
text-transform: none;
}
fieldset>table,
fieldset>table thead,
fieldset>table tbody,
fieldset>table tr,
fieldset>table th,
fieldset>table td,
fieldset>table td input,
fieldset>table td textarea {
display: block;
font-size: 1rem;
}
fieldset>table {
width: calc(100vw + -16vw + -1rem);
max-width: 100%;
}
fieldset>table td input,
fieldset>table td textarea {
width: calc(100vw + -16vw + -1.5rem);
max-width: 100%;
border: thin solid #DFDFDF;
margin-bottom: 0.5rem;
padding: 0.5rem;
}
fieldset>table td select {
margin-bottom: 0.5rem;
padding: 0.25rem;
}
fieldset>table td input[type="radio"] {
display: initial;
width: initial;
margin-bottom: 0.5rem;
}
fieldset>input {
background: #4D4D4D;
color: white;
font-weight: 600;
padding: 0.5rem;
border: thin solid #DFDFDF;
border-radius: 0.2rem;
}
@media only screen and (min-width: 58rem) {
#container {
margin: 0.5rem auto;
@media (min-width: 900px) {
#tag_line {
text-align: center;
}
.shadow {
-moz-box-shadow: 1px 2px 5px 2px #675958;
-webkit-box-shadow: 1px 2px 5px 2px #675958;
box-shadow: 1px 2px 5px 2px #675958;
#title h1 {
font-size: 7.5rem;
letter-spacing: -0.65rem;
line-height: 0.75;
}
img#hprlogo {
margin-bottom: 1.5rem;
#tag_line h2 {
font-size: 1.82rem;
letter-spacing: 0.05rem;
}
#hpr_banner {
float: left;
#tag_line h2:first-child {
font-size: 4rem;
}
#hpr_banner h1#sitename {
font-size: 2rem;
#tag_line h3 {
font-size: 1.85rem;
margin-left: 5rem;
}
#hpr_banner h2 {
font-size: 1rem;
#qr_code {
text-align: center;
}
header>hr {
clear: right;
#qr_code > img {
max-height: 195px;
}
table.hosts td:first-child {
height: 80px;
}
footer #more_info nav.column {
clear: none;
float: left;
width: 19.5%;
margin-left: 0;
}
footer #more_info nav.column:first-child {
margin-left: 0.5rem;
}
footer #more_info nav.column ul li {
float: none;
margin-bottom: 0.5rem;
}
fieldset>table,
fieldset>table thead,
fieldset>table tbody,
fieldset>table tr,
fieldset>table th,
fieldset>table td,
fieldset>table td input,
fieldset>table td textarea {
display: revert;
width: revert;
}
fieldset>table tr {
vertical-align: baseline;
}
fieldset>table tr:nth-child(3) {
vertical-align: top;
}
fieldset>table tr:nth-child(3) td:first-child {
padding-top: 0.5rem;
}
fieldset>table tr:nth-last-child(3) td:first-child {
padding-top: 1rem;
}
fieldset>table tr:nth-last-child(2) {
vertical-align: top;
}
fieldset>table tr:nth-last-child(2) td:first-child {
padding-top: 0.75rem;
}
fieldset>table td input[type="radio"] {
margin-top: 1.5rem;
body > main {
padding: 0.25rem 2rem;
}
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M9 1V3H15V1H17V3H21C21.5523 3 22 3.44772 22 4V20C22 20.5523 21.5523 21 21 21H3C2.44772 21 2 20.5523 2 20V4C2 3.44772 2.44772 3 3 3H7V1H9ZM20 11H4V19H20V11ZM8 13V15H6V13H8ZM13 13V15H11V13H13ZM18 13V15H16V13H18ZM7 5H4V9H20V5H17V7H15V5H9V7H7V5Z"/></svg>

After

Width:  |  Height:  |  Size: 339 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M11.9998 1C14.7612 1 16.9998 3.23858 16.9998 6V10C16.9998 12.7614 14.7612 15 11.9998 15C9.23833 15 6.99976 12.7614 6.99976 10V6C6.99976 3.23858 9.23833 1 11.9998 1ZM3.05469 11H5.07065C5.55588 14.3923 8.47329 17 11.9998 17C15.5262 17 18.4436 14.3923 18.9289 11H20.9448C20.4837 15.1716 17.1714 18.4839 12.9998 18.9451V23H10.9998V18.9451C6.82814 18.4839 3.51584 15.1716 3.05469 11Z"/></svg>

After

Width:  |  Height:  |  Size: 476 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M12 19C12.8284 19 13.5 19.6716 13.5 20.5C13.5 21.3284 12.8284 22 12 22C11.1716 22 10.5 21.3284 10.5 20.5C10.5 19.6716 11.1716 19 12 19ZM12 2C15.3137 2 18 4.68629 18 8C18 10.1646 17.2474 11.2907 15.3259 12.9231C13.3986 14.5604 13 15.2969 13 17H11C11 14.526 11.787 13.3052 14.031 11.3989C15.5479 10.1102 16 9.43374 16 8C16 5.79086 14.2091 4 12 4C9.79086 4 8 5.79086 8 8V9H6V8C6 4.68629 8.68629 2 12 2Z"/></svg>

After

Width:  |  Height:  |  Size: 497 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M3 3C12.9411 3 21 11.0589 21 21H18C18 12.7157 11.2843 6 3 6V3ZM3 10C9.07513 10 14 14.9249 14 21H11C11 16.5817 7.41828 13 3 13V10ZM3 17C5.20914 17 7 18.7909 7 21H3V17Z"/></svg>

After

Width:  |  Height:  |  Size: 264 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M20.0833 10.4999L21.2854 11.2212C21.5221 11.3633 21.5989 11.6704 21.4569 11.9072C21.4146 11.9776 21.3557 12.0365 21.2854 12.0787L11.9999 17.6499L2.71451 12.0787C2.47772 11.9366 2.40093 11.6295 2.54301 11.3927C2.58523 11.3223 2.64413 11.2634 2.71451 11.2212L3.9166 10.4999L11.9999 15.3499L20.0833 10.4999ZM20.0833 15.1999L21.2854 15.9212C21.5221 16.0633 21.5989 16.3704 21.4569 16.6072C21.4146 16.6776 21.3557 16.7365 21.2854 16.7787L12.5144 22.0412C12.1977 22.2313 11.8021 22.2313 11.4854 22.0412L2.71451 16.7787C2.47772 16.6366 2.40093 16.3295 2.54301 16.0927C2.58523 16.0223 2.64413 15.9634 2.71451 15.9212L3.9166 15.1999L11.9999 20.0499L20.0833 15.1999ZM12.5144 1.30864L21.2854 6.5712C21.5221 6.71327 21.5989 7.0204 21.4569 7.25719C21.4146 7.32757 21.3557 7.38647 21.2854 7.42869L11.9999 12.9999L2.71451 7.42869C2.47772 7.28662 2.40093 6.97949 2.54301 6.7427C2.58523 6.67232 2.64413 6.61343 2.71451 6.5712L11.4854 1.30864C11.8021 1.11864 12.1977 1.11864 12.5144 1.30864Z"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M4 22C4 17.5817 7.58172 14 12 14C16.4183 14 20 17.5817 20 22H4ZM12 13C8.685 13 6 10.315 6 7C6 3.685 8.685 1 12 1C15.315 1 18 3.685 18 7C18 10.315 15.315 13 12 13Z"/></svg>

After

Width:  |  Height:  |  Size: 260 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M2 16.0001H5.88889L11.1834 20.3319C11.2727 20.405 11.3846 20.4449 11.5 20.4449C11.7761 20.4449 12 20.2211 12 19.9449V4.05519C12 3.93977 11.9601 3.8279 11.887 3.73857C11.7121 3.52485 11.3971 3.49335 11.1834 3.66821L5.88889 8.00007H2C1.44772 8.00007 1 8.44778 1 9.00007V15.0001C1 15.5524 1.44772 16.0001 2 16.0001ZM23 12C23 15.292 21.5539 18.2463 19.2622 20.2622L17.8445 18.8444C19.7758 17.1937 21 14.7398 21 12C21 9.26016 19.7758 6.80629 17.8445 5.15557L19.2622 3.73779C21.5539 5.75368 23 8.70795 23 12ZM18 12C18 10.0883 17.106 8.38548 15.7133 7.28673L14.2842 8.71584C15.3213 9.43855 16 10.64 16 12C16 13.36 15.3213 14.5614 14.2842 15.2841L15.7133 16.7132C17.106 15.6145 18 13.9116 18 12Z"/></svg>

After

Width:  |  Height:  |  Size: 785 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 529 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View File

@@ -7,13 +7,6 @@
# Configuration settings for SQLite
database: sqlite
driver: dbi:SQLite:hpr.db
#user: (not used - leave blank)
#password: (not used - leave blank)
# Configuration settings for MySQL
#database: mysql
#driver: dbi:mysql:database=hpr_hpr:hostname=localhost
#user: hpr-generator (Suggested user with read-only privileges)
#password: ********* (Password for user)
# Configure the location of the templates and the generated HTML
[app_paths]

View File

@@ -80,7 +80,7 @@
<p>
Our hosting is kindly provided by <a href="<!--% absolute_url(baseurl) %-->correspondents/0174.html">Josh</a> from
<a href="https://anhonesthost.com/shared-hosting/">AnHonestHost.com</a>.
We would appreciate it if you could <a href="https://secure.anhonesthost.com/cart.php?gid=17">donate</a> to help
We would appreciate it if you could <a href="https://secure.anhonesthost.com/store/hpr-hosting-cost-donations">donate</a> to help
reduce his costs in funding the hosting. He is also accepting bitcoins to <em>1KsxJr9HtsdaUeU7yaV9bk9bQi21UPBtUq</em>
</p>
<p>
@@ -158,7 +158,7 @@
<h2 id="podcatcher_support">Podcatcher Support</h2>
<p>
Please report your experiences with our feeds to <!--% absolute_url(baseurl,'about.html#contact') %-->admin@hpr</a>.
Please report your experiences with our feeds to admin@hpr</a>.
</p>
<h2 id="other_ways_to_help">Other ways to help</h2>
@@ -872,42 +872,17 @@
Your audio is completely inaccessible to those who have hearing problems,
so the only way for your show to be of help to them is if you distill the essence of the show into the show notes.
If you are using a script to prepare your show then include that.</li>
<li><strong>Adding the shownotes</strong>
<ul>
<li>Add text and use the WYSIWYG editor buttons to add additional formatting</li>
<li>Optionally - You can paste in <strong>Rendered</strong> HTML</li>
<li><strong>Do not paste un-rendored markup (HTML, Markdown,
RestructuredText)</strong> unless your intention is to have un-rendored
markup as shownotes.</li>
<li>The amount you can enter is restricted to 4000 characters, but you can provide additional show notes if you wish.
Please add them to an full_shownotes.html file which you can expect to be served from
<!--% absolute_url(baseurl) %-->eps/hpr9999/full_shownotes.html</li>
</ul>
The amount you can enter is restricted to 4000 characters, but you can provide additional show notes if you wish.
Please add them to an full_shownotes.html file which you can expect to be served from
<!--% absolute_url(baseurl) %-->eps/hpr9999/full_shownotes.html<br /> <br />
<li>
If you wish to include text formatting then please use a format that supports it. We accept:
<ul>
<li>HTML5</li>
<li>Markdown (standard)</li>
<li>Markdown (GitHub flavoured)</li>
<li>Markdown (Pandoc flavoured)</li>
<li>RestructuredText</li>
<li>txt2tags</li>
<li>Plain text</li>
</ul>
However please restrict yourself to text unless you are experienced producing valid markdown/HTML5.
Regardless of the format you send your shownotes will end up in html5 &lt;article&gt; section,
where the header and footer are not available to you. Avoid using &lt;div&gt; or &lt;span&gt;.
The inclusion of JavaScript will send your show into quarantine, until an experienced HPR volunteer
can be found to debug it.<br />
It takes us a lot longer to fix incorrectly formatted shownotes than plain text, so please only create formatted
show notes if you know what you are doing and are sure that what you are writing is valid.
</li>
<li id="shownotes_format"><strong>Show Note Format:</strong> <em>Optional</em><br />
Please tell us which format, if any you used when filling in your shownotes.
<ul>
<li><a href="https://www.w3schools.com/html/default.asp">HTML5</a></li>
<li><a href="https://en.wikipedia.org/wiki/Markdown">Markdown (standard)</a></li>
<li><a href="https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax">Markdown (GitHub flavoured)</a></li>
<li><a href="https://pandoc.org/MANUAL.html#pandocs-markdown">Markdown (Pandoc flavoured)</a></li>
<li><a href="https://docutils.sourceforge.io/docs/user/rst/quickstart.html">RestructuredText</a></li>
<li>Plain text having no formatting.</li>
</ul>
</li>
<li id="series"><strong>Series:</strong> <em>Optional</em><br />
Select the <a href="<!--% absolute_url(baseurl) %-->series/index.html">series</a> if any that your show is a part of.

View File

@@ -1,8 +1,9 @@
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS 'shared-listen-now.tpl.html' %-->
<!--% PROCESS "queries-episode-${constants.database}.tpl.html" %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% PROCESS "queries-episode.tpl.html" %-->
<!--% USE DBI(constants.driver) %-->
<h2>Comment Viewer</h2>
<p>Because of the spammers we have had to turn on comment moderation. Sorry about the delay this will cause.</p>
<p><a href="<!--% absolute_path(baseurl) %-->comments.rss">Subscribe</a> to the comment feed.</p>

View File

@@ -1,8 +1,8 @@
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
<!--% PROCESS 'shared-avatar.tpl.html' %-->
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS "queries-correspondent-${constants.database}.tpl.html" %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% PROCESS "queries-correspondent.tpl.html" %-->
<!--% USE DBI(constants.driver) %-->
<!--% results_hpr_shows = DBI.prepare(query_hpr_shows)
%-->
<!--% results_hpr_show_count = DBI.prepare(query_hpr_show_count) %-->

View File

@@ -3,7 +3,7 @@
<article>
<h2 class="title">Correspondents</h2>
<p>For more information on how to become a Correspondent see our <a href="<!--% absolute_url(baseurl) %-->about.html#so_you_want_to_record_a_podcast">contribute</a></center> page. To add a logo here, either email one to admin at hpr or setup your email on <a href="https://en.gravatar.com/">Gravatar</a>. To protect your browsing privacy we gather the images every hour and serve them directly from HPR.<p />
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% USE DBI(constants.driver) %-->
<!--% host_cnt = 0 %-->
<table class="hosts">
<th >Avatar</th>

View File

@@ -3,7 +3,7 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS 'shared-listen-now.tpl.html' %-->
<!--% PROCESS 'shared-show-transcript.tpl.html' %-->
<!--% PROCESS "queries-episode-${constants.database}.tpl.html" %-->
<!--% PROCESS "queries-episode.tpl.html" %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% query_episodes = DBI.prepare(query_episode_maxmin) %-->
<!--% episode_result = query_episodes.execute(id, id, id, id, id) %-->

View File

@@ -1,5 +1,5 @@
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
<!--% PROCESS "queries-episodes-${constants.database}.tpl.html" %-->
<!--% PROCESS "queries-episodes.tpl.html" %-->
<article>
<header>
<h1>Complete Archive of Shows.</h1>
@@ -7,7 +7,7 @@
All this information is available to the public. Scrape if you wish but if we can format the data for you then we're happy to help.
</p>
</header>
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% USE DBI(constants.driver) %-->
<!--% FOREACH episodes IN DBI.query(query_episodes)
%-->
<!--% show_summary(episodes) %-->

View File

@@ -4,7 +4,7 @@
<!--% PROCESS 'shared-show-transcript.tpl.html' %-->
<!--% PROCESS 'shared-call_for_shows.tpl.html' %-->
<!--% INCLUDE 'content-index-announcement.tpl.html' %-->
<!--% PROCESS "queries-index-${constants.database}.tpl.html" %-->
<!--% PROCESS "queries-index.tpl.html" %-->
<!--% MACRO tidy_notes(all_lines) BLOCK %-->
<!--% lines = all_lines %-->
<!--% after_html = all_lines %-->
@@ -23,13 +23,8 @@
<!--% END %-->
<!--% after_html %-->
<!--% END %-->
<hr>
<article>
<header>
<h3>Welcome to HPR, the Community Podcast</h3>
</header>
<!--% days_till_next_episode = 0 %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% USE DBI(constants.driver) %-->
<!--% USE date %-->
<!--% calc = date.calc %-->
<!--% episodes = DBI.query(query_next_available_episode).get_all() %-->
@@ -40,44 +35,99 @@
<!--% days_till_next_episode = calc.Delta_Days(now.0,now.1,now.2,slot_date.0,slot_date.1,slot_date.2) %-->
<!--% delta = date.calc.N_Delta_YMD(2005,9,19, date.format(date.now, '%Y'),date.format(date.now, '%m'),date.format(date.now, '%d')) %-->
<p>We started producing shows as <a href="<!--% absolute_path(baseurl) %-->eps/index.html#twt_episodes"><em>Today with a Techie</em></a> on 2005-09-19, <!--% delta.0 %--> years, <!--% delta.1 %--> months, <!--% delta.2 %--> days ago. Our shows are produced by <a href="<!--% absolute_path(baseurl) %-->correspondents/index.html">listeners</a> like you and can be on any <a href="<!--% absolute_path(baseurl) %-->eps/index.html">topics</a> that <strong>"are of interest to <a href="https://en.wikipedia.org/wiki/hacker_(hobbyist)">hackers</a>"</strong>. If you listen to HPR then please consider contributing one show a year. If you <a href="<!--% absolute_url(baseurl) %-->about.html#so_you_want_to_record_a_podcast">record</a> your show now it could be <a href="<!--% hub_baseurl %-->calendar.php">released</a> in <strong><!--% days_till_next_episode %--></strong> days.</p>
</article>
<!--% display_call_for_shows() %-->
<hr>
<section id="welcome">
<header>Welcome</header>
<p>Hacker Public Radio is a podcast that releases shows every weekday Monday to Friday. The shows are contributed by the public and can be on any topic that is of interest to hackers, makers, hobbyists, etc.</p>
<div id="call_for_shows">
<!--% display_call_for_shows() %-->
</div>
</section>
<section id="podcast_lane">
<header>Podcast</header>
<div class="lane">
<a class="lane-button" href="<!--% absolute_path(baseurl) %-->about.html#recording_a_podcast">
<img src="<!--% absolute_path(baseurl) %-->images/icons/mic-fill.svg" alt="">
Record
</a>
<a class="lane-button" href="https://hub.hackerpublicradio.org/calendar.php">
<img src="<!--% absolute_path(baseurl) %-->images/icons/calendar-2-line.svg" alt="">
Schedule
</a>
<a class="lane-button" href="<!--% absolute_path(baseurl) %-->syndication.html">
<img src="<!--% absolute_path(baseurl) %-->images/icons/rss-fill.svg" alt="">
Subscribe
</a>
<a class="lane-button" href="<!--% absolute_path(baseurl) %-->eps/index.html">
<img src="<!--% absolute_path(baseurl) %-->images/icons/volume-up-fill.svg" alt="">
Listen
</a>
</div>
</section>
<section id="project_lane">
<header>Project</header>
<div class="lane">
<a class="lane-button" href="<!--% absolute_path(baseurl) %-->correspondents/index.html">
<img src="<!--% absolute_path(baseurl) %-->images/icons/user-fill.svg" alt="">
Host
</a>
<a class="lane-button" href="<!--% absolute_path(baseurl) %-->series/index.html">
<img src="<!--% absolute_path(baseurl) %-->images/icons/stack-fill.svg" alt="">
Series
</a>
<a class="lane-button" href="<!--% absolute_path(baseurl) %-->about.html">
<img src="<!--% absolute_path(baseurl) %-->images/icons/question-mark.svg" alt="">
About
</a>
</div>
</section>
<section id="latest_lane" class="lane">
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
<h1>Latest Shows</h1>
<section id="latest_shows">
<header>Latest Shows</header>
<!--% host_cnt = 0 %-->
<ul>
<!--% FOREACH latest_episodes IN DBI.query(query_latest_episodes)
%-->
<hr>
<article>
<header>
<h1><a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(latest_episodes.id) %-->/index.html">hpr<!--% latest_episodes.id %--> :: <!--% latest_episodes.title %--></a></h1>
<h3><!--% latest_episodes.summary%--></h3>
<p class="meta"$><!--% show_avatar(latest_episodes.hostid, latest_episodes.host, host_cnt) %-->
Hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(latest_episodes.hostid) %-->.html"><!--% latest_episodes.host %--></a> on <!--% day_and_date(latest_episodes.date) %--> is flagged as <!--% display_explicit(latest_episodes.explicit) %--> and released under a <!--% latest_episodes.license %--> license. <br>
<!--% display_tags(latest_episodes.tags) %-->
<span><!--% show_series(latest_episodes.series, latest_episodes.seriesid) %--></span>
<span><label>Comments: </label><!--% display_comments_tally(latest_episodes.id, latest_episodes.eps_tally) %--></span><br>
<!--% listen_now(latest_episodes, "hpr", baseurl, media_baseurl) %-->
</p>
</header>
<!--% tidy_notes(latest_episodes.notes) %-->
</article>
<li><a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(latest_episodes.id) %-->/index.html">hpr<!--% latest_episodes.id %--> :: <!--% latest_episodes.title %--></a></li>
<!--% host_cnt = host_cnt + 1 %-->
<!--% END %-->
<article id="previous_five_weeks">
<header>
<hr>
<h1>Previous five weeks</h1>
</header>
<!--% FOREACH last_5_weeks_episodes IN DBI.query(query_last_5_weeks_episodes)
</ul>
</section>
<section id="latest_comments">
<header>Latest Comments</header>
<ul>
<!--% FOREACH item IN DBI.query('
WITH episode_comment_rank AS (
SELECT
comments.eps_id
, comments.id as comment_id
, comments.comment_author_name
, comments.comment_timestamp
, comments.comment_title
, RANK() OVER (PARTITION BY eps_id ORDER BY id ) AS comment_number
FROM comments
)
SELECT
episode_comment_rank.*
, hosts.host
, eps.title AS episode_title
, eps.date AS episode_date
FROM episode_comment_rank
INNER JOIN eps
ON episode_comment_rank.eps_id = eps.id
INNER JOIN hosts
ON eps.hostid = hosts.hostid
ORDER BY episode_comment_rank.comment_timestamp DESC
LIMIT 10;
')
%-->
<!--% show_summary(last_5_weeks_episodes) %-->
<p class="listen-in"><!--% display_listen_in(last_5_weeks_episodes.id) %--></p>
<li>hpr<!--% item.eps_id %--> (<!--% item.episode_date %-->) "<!--% item.episode_title %-->" by <!--% item.host %-->
<ul>
<li><a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(item.eps_id) %-->/index.html#comment_<!--% item.comment_id%-->">Comment <!--% item.comment_number %-->: <!--% item.comment_author_name %--> on <!--% item.comment_timestamp %-->: "<!--% item.comment_title %-->"</a>
</li>
</ul>
</li>
<!--% END %-->
</article>
<h1>Older Shows</h1>
<p>
Get a <a href="<!--% absolute_path(baseurl) %-->eps/index.html">full list</a> of all our shows.
</p>
</ul>
</section>

View File

@@ -1,7 +1,7 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS "queries-series-${constants.database}.tpl.html" %-->
<!--% PROCESS "queries-series.tpl.html" %-->
<article>
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% USE DBI(constants.driver) %-->
<h1 class="title">In-Depth Series</h1>
<!--% FOREACH series IN DBI.query(query_episodes) %-->
<h2><a href="<!--% absolute_path(baseurl) %-->series/<!--% zero_pad_left(series.id) %-->.html"><!--% series.name %--></a></h2>

View File

@@ -1,7 +1,7 @@
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
<!--% PROCESS 'shared-avatar.tpl.html' %-->
<!--% PROCESS "queries-series_episodes-${constants.database}.tpl.html" %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% PROCESS "queries-series_episodes.tpl.html" %-->
<!--% USE DBI(constants.driver) %-->
<!--% query_series = DBI.prepare(query_series_sql)
%-->
<!--% series_result = query_series.execute(id) %-->

View File

@@ -1,6 +1,6 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS "queries-tags-${constants.database}.tpl.html" %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% PROCESS "queries-tags.tpl.html" %-->
<!--% USE DBI(constants.driver) %-->
<!--% PERL %-->
$Template::Stash::PRIVATE = undef; # Allow . in tag
<!--% END %-->

View File

@@ -2,7 +2,7 @@
<!--% PROCESS 'shared-avatar.tpl.html' %-->
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS 'shared-listen-now.tpl.html' %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% USE DBI(constants.driver) %-->
<!--% query_episodes = DBI.prepare('
WITH episode_maxmin AS (
SELECT MAX(id) AS \'latest\', MIN(id) AS \'earliest\', ? AS \'id\'

View File

@@ -1,4 +1,4 @@
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% USE DBI(constants.driver) %-->
<!--% FOREACH host IN DBI.query(
'select h.hostid from hosts as h'
) %-->

View File

@@ -1,5 +1,5 @@
<!--% PROCESS "queries-ids-episode-${constants.database}.tpl.html" %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% PROCESS "queries-ids-episode.tpl.html" %-->
<!--% USE DBI(constants.driver) %-->
<!--% FOREACH episode IN DBI.query(query_ids_episode) %-->
,<!--% episode.id %-->
<!--% END %-->

View File

@@ -1,4 +1,4 @@
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% USE DBI(constants.driver) %-->
<!--% FOREACH episode IN DBI.query(
'select eps.id from twat_eps AS eps'
) %-->

View File

@@ -1,11 +1,7 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<ul>
<li><a href="<!--% hub_baseurl %-->calendar.php"><strong>⇧Upload⇧</strong></a></li>
<li><a href="<!--% absolute_path(baseurl) %-->index.html"><strong>Home »</strong></a></li>
<li><a href="<!--% absolute_path(baseurl) %-->syndication.html">Get Shows</a></li>
<li><a href="<!--% absolute_url(baseurl) %-->about.html#so_you_want_to_record_a_podcast">Give Shows</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->about.html#how_to_help">Contribute</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->tags.html">Tags</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->about.html">About</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->search.html">Search</a></li>
</ul>
<ul>
<li><a href="<!--% absolute_path(baseurl) %-->index.html">Home</a></li>
<li><a href="<!--% hub_baseurl %-->calendar.php">Upload</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->syndication.html">Download</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->about.html">About</a></li>
</ul>

View File

@@ -12,7 +12,6 @@
<meta http-equiv="last-modified" content="<!--% format_feed_date(date.now) %-->">
<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 {
@@ -33,116 +32,52 @@
<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="<!--% absolute_path(baseurl) %-->"><img id="hprlogo" src="<!--% absolute_path(baseurl) %-->images/hpr_logo.png" alt="hprlogo"></a>
<div id="hpr_banner">
<p id="accessible_menu">
<a href="<!--% absolute_path(baseurl) %-->sitemap.html">Site Map</a>
- <a href="#maincontent">skip to main content</a>
</p>
<h1 id="sitename">
<body>
<nav id="accessible_menu">
<a href="<!--% absolute_path(baseurl) %-->sitemap.html#main_content">Site Map</a>
- <a href="#main_content">skip to main content</a>
</nav>
<nav id="main_menu" class="menu" role="navigation">
<!--% INCLUDE "navigation-main.tpl.html" %-->
</nav>
<header role="banner">
<div id="title">
<h1 id="site_acronym">HPR</h1>
<h2 id="site_name">
<a href="<!--% absolute_path(baseurl) %-->correspondents/index.html">H</a>acker
<a href="<!--% absolute_path(baseurl) %-->comments_viewer.html">P</a>ublic
<a href="<!--% absolute_path(baseurl) %-->syndication.html">R</a>adio
</h1>
<h2>Your ideas, projects, opinions - podcasted.</h2>
<h3>New episodes every weekday Monday through Friday.<br />
<em><small>This page was <a href="https://repo.anhonesthost.net/HPR/hpr_generator">generated</a> by <a href="mailto:<!--% generator_email %-->"><!--% generator_name %--></a> at <time dateTime="<!--% format_iso8601_date(date.now) %-->"><!--% format_feed_date(date.now) %--></time></small></em></h3>
</h2>
<h3 id="site_url">https://HackerPublicRadio.org</h3>
</div>
<div id="tag_line">
<h2>The Community Podcast</h2>
<h2>Sharing your ideas, projects, opinions since 2005</h2>
<h3>New episodes every weekday
</div>
</h3>
</div>
<div id="qr_code">
<img src="<!--% absolute_path(baseurl) %-->images/qr_code_logo.png" alt="HPR logo as a QR code to the HPR URL">
</div>
<hr />
<nav class="menu" role="navigation">
<!--% INCLUDE $navigation %-->
</nav>
</header>
<main id="maincontent">
<main id="main_content" role="main">
<!--% INCLUDE $content %-->
</main>
<footer id="footer_page">
<h1 class="thick_bar">More Information...</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="<!--% absolute_url(baseurl,'/maillist') %-->" >Mailing list</a></li>
<li><a rel="me" href="https://infosec.exchange/@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/HPR/">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">Copyright Information</h1>
<footer role="contentinfo">
<hr>
<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>
</div><!-- copyright -->
<hr />
</span>
</div>
<div id="generated_by">This page was <a href="https://repo.anhonesthost.net/HPR/hpr_generator">generated</a> by <a href="mailto:<!--% generator_email %-->"><!--% generator_name %--></a> at <time dateTime="<!--% format_iso8601_date(date.now) %-->"><!--% format_feed_date(date.now) %--></time></em>
</div>
</footer>
</div>
<!-- shadow -->
</body>
</html>

View File

@@ -1,6 +0,0 @@
<!--% query_call_for_shows = '
SELECT CASE WHEN COUNT(id) < 6 THEN True ELSE False END AS `request_for_shows`
FROM eps
WHERE eps.date > NOW() AND eps.date <= DATE_ADD(NOW(), INTERVAL 10 DAY)
'
%-->

View File

@@ -1,24 +0,0 @@
<!--% query_hpr_shows = '
SELECT
eps.id,
eps.explicit,
eps.date, eps.license, eps.duration,
eps.title, eps.summary, eps.tags,
eps.notes,
hosts.local_image,
hosts.hostid,
hosts.host, hosts.email, hosts.profile,
miniseries.name AS series, miniseries.id AS seriesid
FROM eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
WHERE hosts.hostid = ? AND eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
ORDER BY eps.id DESC
'
%-->
<!--% query_hpr_show_count = '
SELECT id
FROM eps
WHERE eps.hostid = ? AND eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
'
%-->

View File

@@ -1,51 +0,0 @@
<!--% query_episode_maxmin = '
WITH episode_maxmin AS (
SELECT MAX(id) AS \'latest\', MIN(id) AS \'earliest\', ? AS \'id\'
FROM eps
WHERE eps.date <= UTC_DATE()
),
episode_date AS (
SELECT eps.date
FROM eps
WHERE eps.id = ?
),
episode_previous AS (
SELECT MAX(id) AS \'previous\', ? AS \'id\'
FROM eps
INNER JOIN episode_date
ON eps.date < episode_date.date
WHERE eps.id > 1
),
episode_next AS (
SELECT MIN(id) AS \'next\', ? AS \'id\'
FROM eps
INNER JOIN episode_date
ON eps.date > episode_date.date
WHERE eps.date <= NOW()
),
comment_tallies AS (
SELECT
eps_id,
COUNT(eps_id) AS eps_tally
FROM comments
GROUP BY eps_id
)
SELECT eps.id, eps.date, eps.title, eps.duration,
eps.summary, eps.notes, eps.explicit, eps.license,
eps.tags, eps.version, eps.downloads, eps.valid,
episode_maxmin.latest, episode_maxmin.earliest,
episode_previous.previous, episode_next.next,
hosts.hostid, hosts.host,
miniseries.name AS \'series\', miniseries.id AS \'seriesid\',
miniseries.description AS \'series_description\',
COALESCE (comment_tallies.eps_tally, 0) AS eps_tally
FROM eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
INNER JOIN episode_maxmin ON eps.id = episode_maxmin.id
INNER JOIN episode_previous ON eps.id = episode_previous.id
INNER JOIN episode_next ON eps.id = episode_next.id
LEFT JOIN comment_tallies ON eps.id = comment_tallies.eps_id
WHERE eps.id = ?
'
%-->

View File

@@ -1,15 +0,0 @@
<!--% query_episodes = 'SELECT
eps.id,
eps.explicit,
eps.date, eps.license, eps.title, eps.summary,
eps.duration, eps.notes, eps.tags,
hosts.hostid,
hosts.host, hosts.email, hosts.local_image,
miniseries.name AS series, miniseries.id AS seriesid
FROM eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
WHERE eps.date <= UTC_DATE()
ORDER BY eps.id DESC'
%-->

View File

@@ -1,2 +0,0 @@
<!--% query_ids_episode = 'select eps.id from eps order by eps.id' %-->

View File

@@ -1,58 +0,0 @@
<!--% query_next_available_episode = '
SELECT id, date FROM eps e WHERE id = (
SELECT id + 1 FROM eps mo
WHERE NOT EXISTS (
SELECT NULL
FROM eps mi
WHERE mi.id = mo.id + 1
)
ORDER BY id
LIMIT 1) - 1
'
%-->
<!--% query_latest_episodes = '
WITH comment_tallies AS (
SELECT
eps_id,
COUNT(eps_id) AS eps_tally
FROM comments
GROUP BY eps_id
)
SELECT
eps.id,
eps.explicit,
eps.date, eps.license, eps.duration,
eps.title, eps.summary, eps.tags,
eps.notes,
hosts.local_image,
hosts.hostid,
hosts.host, hosts.email,
miniseries.name AS series, miniseries.id AS seriesid,
COALESCE (comment_tallies.eps_tally, 0) AS eps_tally
FROM eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
LEFT JOIN comment_tallies ON eps.id = comment_tallies.eps_id
WHERE eps.date <= UTC_DATE()
ORDER BY eps.id DESC
LIMIT 10
'
%-->
<!--% query_last_5_weeks_episodes = '
SELECT
eps.id,
eps.explicit,
eps.date, eps.license, eps.title, eps.summary,
eps.duration, eps.notes, eps.tags,
hosts.hostid,
hosts.host, hosts.email, hosts.local_image,
miniseries.name AS series, miniseries.id AS seriesid
FROM eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
WHERE eps.date <= UTC_DATE()
ORDER BY eps.id DESC
LIMIT 30 OFFSET 10
'
%-->

View File

@@ -1,15 +0,0 @@
<!--% query_episodes = 'SELECT miniseries.id, miniseries.name, miniseries.description,
miniseries.private, miniseries.image, miniseries.valid,
ep.number_of_episodes, ep.latest_show, ep.earliest_show
FROM miniseries
INNER JOIN
(SELECT series,
COUNT(eps.id) AS number_of_episodes,
MAX(eps.date) AS latest_show,
MIN(eps.date) AS earliest_show
FROM eps
WHERE eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
GROUP BY series) AS ep ON ep.series = miniseries.id
ORDER BY name'
%-->

View File

@@ -1,29 +0,0 @@
<!--% query_series_sql = 'SELECT miniseries.id, miniseries.name,
miniseries.description,
miniseries.private, miniseries.image, miniseries.valid,
ep.number_of_episodes, ep.latest_show, ep.earliest_show
FROM miniseries
INNER JOIN
(SELECT series,
COUNT(eps.id) AS number_of_episodes,
MAX(eps.date) AS latest_show,
MIN(eps.date) AS earliest_show
FROM eps
WHERE eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
GROUP BY series) AS ep ON ep.series = miniseries.id
WHERE miniseries.id = ?
ORDER BY name'
%-->
<!--% query_shows_sql = 'SELECT
id, date, title,
duration, summary, notes,
explicit, eps.license, tags,
hosts.host, hosts.hostid
FROM eps
INNER JOIN hosts
ON eps.hostid = hosts.hostid
WHERE series = ? AND eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
ORDER BY eps.id DESC
'
%-->

View File

@@ -1 +0,0 @@
<!--% query_tags = 'SELECT id, tags FROM eps' %-->

View File

@@ -3,9 +3,10 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
<!--% USE date %-->
<!--% USE HTML.Strip emit_spaces = 0 %-->
<channel>
<title>Hacker Public Radio ~ Comment Feed</title>
<link><!--% baseurl %-->about.html</link>
<link><!--% absolute_url(http_baseurl) %-->about.html</link>
<description>Comments Feed: 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.</description>
<language>en-us</language>
<copyright>Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) License</copyright>
@@ -15,15 +16,15 @@
<docs>https://www.rssboard.org/rss-specification</docs>
<ttl>600</ttl>
<image>
<url><!--% baseurl %-->images/hpr_feed_small.png</url>
<url><!--% absolute_url(http_baseurl) %-->images/hpr_feed_small.png</url>
<title>Hacker Public Radio ~ Comment Feed</title>
<link><!--% baseurl %-->about.html</link>
<link><!--% absolute_url(http_baseurl) %-->about.html</link>
<description>The Hacker Public Radio Old Microphone Logo</description>
<height>164</height>
<width>144</width>
</image>
<atom:link href="<!--% baseurl %-->comments.rss" rel="self" type="application/rss+xml" />
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<atom:link href="<!--% absolute_url(http_baseurl) %-->comments.rss" rel="self" type="application/rss+xml" />
<!--% USE DBI(constants.driver) %-->
<!--% FOREACH response IN DBI.query('SELECT max( comment_timestamp) AS latest_update FROM comments') %-->
<pubDate><!--% format_feed_date(response.latest_update) %--></pubDate>
@@ -49,15 +50,15 @@
%-->
<item>
<title><!--% item.comment_author_name %--> says: <!--% item.comment_title %--></title>
<author>feedback.nospam@nospam.hackerpublicradio.org (<!--% item.comment_author_name %-->)</author>
<link><!--% baseurl %-->eps/hpr<!--% zero_pad_left(item.eps_id) %-->/index.html#comments</link>
<title><!--% item.comment_author_name | html_strip | xml_entity %--> says: <!--% item.comment_title | html_strip | xml_entity %--></title>
<author>feedback.nospam@nospam.hackerpublicradio.org (<!--% item.comment_author_name | html_strip | xml_entity %-->)</author>
<link><!--% absolute_url(http_baseurl) %-->eps/hpr<!--% zero_pad_left(item.eps_id) %-->/index.html#comments</link>
<description><![CDATA[<strong>
RE: hpr<!--% zero_pad_left(item.eps_id) %-->::<!--% item.episode_date %--> <em><!--% item.episode_title %--></em> by <a href="<!--% baseurl %-->correspondents/<!--% zero_pad_left(item.host_id) %-->.html"><!--% item.host %--></a></strong><!--% rss_show_series(item.series_name, item.series_id) %--><br />
RE: hpr<!--% zero_pad_left(item.eps_id) %-->::<!--% item.episode_date %--> <em><!--% item.episode_title | html_strip | xml_entity %--></em> by <a href="<!--% absolute_url(http_baseurl) %-->correspondents/<!--% zero_pad_left(item.host_id) %-->.html"><!--% item.host %--></a></strong><!--% rss_show_series(item.series_name, item.series_id) | html_strip | xml_entity %--><br />
<!--% display_episode_duration(item.episode_duration) %--><!--% display_listen_in(item.eps_id) %--><br /><!--% item.comment_text FILTER html_line_break %-->
]]></description>
<pubDate><!--% format_feed_date(item.comment_timestamp) %--></pubDate>
<guid isPermaLink="false"><!--% baseurl %-->eps/hpr<!--% zero_pad_left(item.eps_id) %-->/index.html#comment_<!--% item.id %--></guid>
<guid isPermaLink="false"><!--% absolute_url(http_baseurl) %-->eps/hpr<!--% zero_pad_left(item.eps_id) %-->/index.html#comment_<!--% item.id %--></guid>
</item>
<!--% END %-->
</channel>

View File

@@ -1,5 +1,5 @@
<!--% PROCESS 'shared-item.tpl.xml' %-->
<!--% PROCESS "rss-query-hpr-${constants.database}.tpl.xml" %-->
<!--% PROCESS "rss-query-hpr.tpl.xml" %-->
<!--% FOREACH episode IN feed_result %-->
<!--% display_item(episode, media_file_extension, audio_mime_type) %-->
<!--% END %-->

View File

@@ -1,5 +1,5 @@
<!--% PROCESS 'shared-item.tpl.xml' %-->
<!--% PROCESS "rss-query-hpr_total-${constants.database}.tpl.xml" %-->
<!--% PROCESS "rss-query-hpr_total.tpl.xml" %-->
<!--% FOREACH episode IN feed_result %-->
<!--% display_item(episode, media_file_extension, audio_mime_type) %-->
<!--% END %-->

View File

@@ -1,26 +0,0 @@
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% query_hpr_feed = DBI.prepare('
SELECT
eps.id,
eps.explicit,
DATE_FORMAT(eps.date, \'%H:%i:%S %d:%m:%Y\') AS \'date\',
eps.license, eps.duration,
eps.title, eps.summary, eps.tags,
eps.notes,
hosts.local_image,
hosts.hostid,
hosts.host, hosts.email,
miniseries.name AS series, miniseries.id AS seriesid,
assets.size AS length
FROM eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
INNER JOIN assets ON eps.id = assets.episode_id
WHERE eps.date <= UTC_DATE()
AND assets.extension = ?
ORDER BY eps.date DESC
LIMIT 10
')
%-->
<!--% feed_result = query_hpr_feed.execute(media_file_extension) %-->

View File

@@ -1,4 +1,4 @@
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% USE DBI(constants.driver) %-->
<!--% query_hpr_feed = DBI.prepare('
SELECT
eps.id,

View File

@@ -1,25 +0,0 @@
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% query_hpr_feed = DBI.prepare('
SELECT
eps.id,
eps.explicit,
DATE_FORMAT(eps.date, \'%H:%i:%S %d:%m:%Y\') AS \'date\',
eps.license, eps.duration,
eps.title, eps.summary, eps.tags,
eps.notes,
hosts.local_image,
hosts.hostid,
hosts.host, hosts.email,
miniseries.name AS series, miniseries.id AS seriesid,
assets.size AS length
FROM eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
INNER JOIN assets ON eps.id = assets.episode_id
WHERE eps.date < UTC_DATE()
AND assets.extension = ?
ORDER BY eps.date DESC
')
%-->
<!--% feed_result = query_hpr_feed.execute(media_file_extension) %-->

View File

@@ -1,4 +1,4 @@
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% USE DBI(constants.driver) %-->
<!--% query_hpr_feed = DBI.prepare('
SELECT
eps.id,

View File

@@ -1,5 +1,5 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS "queries-call_for_shows-${constants.database}.tpl.html" %-->
<!--% PROCESS "queries-call_for_shows.tpl.html" %-->
<!--% MACRO display_call_for_shows BLOCK %-->
<!--% result_call_for_shows = DBI.prepare(query_call_for_shows) %-->
<!--% results_call_for_shows = result_call_for_shows.execute().get_all() %-->