2 Commits

Author SHA1 Message Date
kdmurrayhpr
cf687fe0db Merge branch 'main' into main 2024-06-04 21:19:20 +00:00
e0ef6c7613 Added relative comment link trackbacks to the comment viewer 2024-06-04 14:18:09 -07:00
122 changed files with 2312 additions and 26037 deletions

View File

@@ -1,24 +0,0 @@
FROM perl:stable
RUN cpanm Config::Std \
&& cpanm Template \
&& cpanm Template::Plugin::DBI \
&& cpanm Template::Plugin::HTML::Strip \
&& cpanm DBD::SQLite \
&& cpanm Tie::DBI \
&& cpanm Date::Calc \
&& cpanm Text::CSV_XS \
&& cpanm HTML::Entities \
&& mkdir -p /usr/src/app
WORKDIR /usr/src/app
ADD site-generator /usr/src/app/site-generator
ADD site.cfg /usr/src/app/site.cfg
ADD templates /usr/src/app/templates
ADD LICENSE /usr/src/app/LICENSE
# Tell Perl where to find the local modules
ENV PERL5LIB=/usr/local/lib/perl5/site_perl
ENTRYPOINT ["/usr/src/app/site-generator"]

View File

@@ -6,14 +6,16 @@ If git is not installed on the operating system, please install it now
To retrieve the code from the repository on anhonesthost.net (a username and
password are required), run:
`git clone https://repo.anhonesthost.net/HPR/hpr_generator.git`
`git clone https://repo.anhonesthost.net/rho_n/hpr_generator.git`
To retrieve the code from the repository on gitlab.com, run:
`git clone https://gitlab.com/roan.horning/hpr_generator.git`
On success, an "hpr_generator" directory will be created in the folder from
which the clone command was executed containing a local copy of the git repository.
# Building on local system
## Install required Perl modules
# Install required Perl modules
Installing the Perl modules is the most finicky part of the installation process.
The needed Perl modules can be found using the operating system's package
@@ -36,12 +38,11 @@ apt install libconfig-std-perl \
```
### Using CPAN to install the modules
## Using CPAN to install the modules
A cross platform method to install the needed modules is the Perl CPAN application.
Make sure that the [gcc](https://www.gnu.org/software/gcc/),
[make](https://www.gnu.org/software/make/manual/make.html),
and [cpan](https://perldoc.perl.org/CPAN) commands are available.
Make sure both the [make](https://www.gnu.org/software/make/manual/make.html)
command and the [cpan](https://perldoc.perl.org/CPAN) command are available.
Install them using the operating system's package manager, or from source.
Run commands:
@@ -50,54 +51,9 @@ Run commands:
cpan Config::Std
cpan Template
cpan Template::Plugin::DBI
cpan Template::Plugin::HTML::Strip
cpan DBD::SQLite
cpan Date::Calc
cpan Tie::DBI
cpan Text:CSV_XS
```
### Testing for Perl module dependencies
A bash script is included in the utils directory that will list the Perl modules used by the site-generator and report whether the modules are installed on the current OS.
It can be run from any directory. To run from the utils directory:
```
./check-dependencies.sh
```
# Building with Docker
The docker file will copy the local version of the site-generator program, the templates directory, the LICENSE file,
and the site.cfg file into the Docker image. For the docker image to run correctly it needs access to your local
hpr.db file and the output directory (defaults to "public_html"). The default site.cfg assumes the hpr.db is located
in the directory from which the site-generator is run. There are two ways to make the db available to the container:
* Put the hpr.db file in the public_html folder and modify the driver option under the [DBI] section of the site.cfg to:<br>
```driver: dbi:SQLite:public_html/hpr.db```
* mount the hpr.db file into the container when starting up the container with the -v option: <br>
```-v <path to db directory>/hpr.db:/usr/src/app/hpr.db```
Build the image by running the following command from the hpr_generator directory:
```docker build -t hpr/site-generator .```
The first build will take a while. It must pull down the base container, perl-latest, and then pull down and build the
various Perl modules from CPAN. After the initial build, if you have modified your site.cfg file, templates dir, or the
site-generator program itself, builds will be very quick.
If the build fails, it is often from a CPAN module failing to download and install. Try running the Docker build command again.
## Running the container
When runing the Docker image, your local output directory (typically public_html) must be mounted into the container using
the -v option. If you are using the default path for the hpr.db, then the local hpr.db file must also be mounted into the image.
The following is an example of running the site-generator with default locations from the hpr_generator directory:
```
docker run \
-v "$(pwd)/public_html":/usr/src/app/public_html \
-v "$(pwd)/hpr.db":/usr/src/app/hpr.db \
hpr/site-generator --help
```
# Create the HPR database
@@ -130,11 +86,11 @@ program which creates the hpr.db file:
`./utils/mysql2sqlite ./hpr-sqlite.sql | sqlite3 ./hpr.db`
For convenience, the update-hpr-db.sh script in the utils directory
For convenience, the update-sqlite-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-hpr-db.sh`
`./utils/update-sqlite-db.sh`
# Configure the site-generator
@@ -146,7 +102,7 @@ file are found in the comments within the file.
Any database supported by the Perl:DBI and Perl::DBD modules can be used with
the site-generator program. Currently the hpr_generator project works with
an SQLite database.
a MySQL or SQLite database.
Find the [DBI] section of the file. It should look like the following
@@ -181,6 +137,26 @@ The hpr.db section of the driver option `dbi:SQLite:hpr.db` is the path
to the sqlite file. The default assumes the hpr.db file is located in the same
directory as the site-generator.
### MySQL
Remove the comment character from the start of the database, driver,
user, and password option lines:
```
# Configuration settings for MySQL
database: mysql
driver: dbi:mysql:database=hpr_hpr:hostname=localhost
user: hpr-generator
password: *********
```
This assumes that the MySQL database service is available at the localhost
hostname, that the database name (hpr_hpr) is the database created from
the hpr.sql dump file or manually created by you, that the user (hpr-generator)
was added by you and has read rights to the hpr_hpr database, and that the
password (replace ********* with the actual password) matches the password set
for the hpr-generator database user.
## Configuring the website for viewing locally
For HTML links to work when viewing the files on your local machine using the
@@ -201,7 +177,7 @@ baseurl: file://</path/to>/hpr_generator/public_html
```
Replace \<path/to\> with the full path to the hpr_generator directory. For
example: `file:///home/HPR/development/hpr_generator/public_html`
example: `file:///home/rho_n/development/hpr_generator/public_html`
## Configuring the website media file links

View File

@@ -1,17 +0,0 @@
# Basic Concept, Design and Guiding Light
* Ken Fallon
# Implementaion and Design Touches
* Lee Hanken
* Roan Horning
# Constructive Feedback and Forward Looks
* Archer72 (Mark Rice)
* Dave Morris
* kwoot
Thanks to all the contributers who helped give HPR
its 2025 facelift!

View File

@@ -2,9 +2,6 @@
Static web page generator for the Hacker Public Radio website.
## Installation
### On local system
* Clone or download this repository
* With SQLite
* Create the sqlite3 database from the hpr.sql MySQL dump file available on
@@ -18,8 +15,17 @@ Static web page generator for the Hacker Public Radio website.
2. Run `./utils/update-hpr.sh`
* SQLite v3.8.3 or greater is recommended. CTE WITH clauses are used in some template queries. Must convert WITH
clauses to sub-queries when using earlier versions of SQLite.
* With MySQL
* Create database hpr_hpr in the MySQL server from HPR dump file.
- ``sudo mysql --host=localhost < hpr.sql``
* Create a user that will be used by the site-generator.
- Suggested username: hpr-generator
- ``CREATE USER 'hpr-generator'@'localhost' IDENTIFIED BY '<password>';``
* Limit the user's privileges to EXECUTE and SELECT
- ``GRANT SELECT ON hpr_hpr.* TO 'hpr-generator'@'localhost';``
- ``GRANT EXECUTE ON `hpr_hpr`.* TO 'hpr-generator'@'localhost';``
* Install the needed Perl modules using preferred method (distribution packages, CPAN, etc.)
* Getopt::Long
* GetOpt
* Pod::Usage
* Config::Std
* Template
@@ -29,15 +35,11 @@ Static web page generator for the Hacker Public Radio website.
* Template::Plugin::HTML::Strip
* DBI
* Tie::DBI
* DBD::SQLite
* DBD::SQLite or DBD:mysql
* Date::Calc
* Text::CSV_XS
* HTML::Entities
### Using Docker
* run: `docker build -t hpr/site-generator .`
* See the [Getting Started](GETTING_STARTED.md) tutorial for more details on
installing the HPR generator.
@@ -52,28 +54,24 @@ Generate pages based on the same template:
`site-generator correspondent=1,3,5..10`
## Support
Please [submit an Issue](https://repo.anhonesthost.net/HPR/hpr_generator/issues),
Please [submit an Issue](https://repo.anhonesthost.net/rho_n/hpr_generator/issues),
and add the label "**Help Request**" for help running or installing the site-generator.
For discussing HPR site generation in general, please [submit an Issue](https://repo.anhonesthost.net/HPR/hpr_generator/issues) and add the label "**General Discussion**".
For discussing HPR site generation in general, please [submit an Issue](https://repo.anhonesthost.net/rho_n/hpr_generator/issues) and add the label "**General Discussion**".
## Contributing
Happy to take any contributions or suggestions.
To contribute code or documentation, please create a fork of the project and [submit a pull request](https://repo.anhonesthost.net/HPR/hpr_generator/pulls) or send a patch. If an issue exists that is related to your patch, please assign the issue to yourself, or if it is already assigned to someone else, please coordinate with them to minimize duplicated efforts.
To contribute code or documentation, please create a fork of the project and [submit a pull request](https://repo.anhonesthost.net/rho_n/hpr_generator/pulls) or send a patch. If an issue exists that is related to your patch, please assign the issue to yourself, or if it is already assigned to someone else, please coordinate with them to minimize duplicated efforts.
If you have found an error in the code or the generated HTML, please [submit an Issue](https://repo.anhonesthost.net/HPR/hpr_generator/issues),
If you have found an error in the code or the generated HTML, please [submit an Issue](https://repo.anhonesthost.net/rho_n/hpr_generator/issues),
and add the label "**Bug Found**".
To make a suggestion, please [submit an Issue](https://repo.anhonesthost.net/HPR/hpr_generator/issues),
To make a suggestion, please [submit an Issue](https://repo.anhonesthost.net/rho_n/hpr_generator/issues),
and add the label "**Feature Request**".
## Authors and acknowledgment
* Roan "Rho`n" Horning
* Dave Morriss
* gordons
* Ken Fallon
* norrist
* Paul Jewell
* Lee Hanken

View File

@@ -1 +0,0 @@
ALTER TABLE twat_eps RENAME TO twt_eps;

Binary file not shown.

Binary file not shown.

View File

@@ -1,93 +0,0 @@
Copyright (c) 2010-2012 Patrick Wagesreiter (mail@patrickwagesreiter.at)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://openfontlicense.org
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

File diff suppressed because it is too large Load Diff

View File

@@ -1,93 +0,0 @@
Copyright (c) 2010-2012 Patrick Wagesreiter (mail@patrickwagesreiter.at)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://openfontlicense.org
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 383 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -1,24 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
viewBox="0 0 12 12"
version="1.1"
id="arrow_first"
width="12"
height="12"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<path
id="arrow"
style="stroke-width:0.584448;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
d="M 9.9303359,11.572157 11.530286,10.119277 7.0035163,5.9964088 11.484768,1.9181465 9.8743209,0.45252151 3.7931149,5.986851 Z" />
<rect
style="stroke-width:0.524;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;marker-start:url(#Arrow1Lstart);paint-order:normal"
id="bar"
width="2.2"
height="11.263"
x="0.5"
y="0.36860976"
rx="0"
ry="0.0015425405" />
</svg>

Before

Width:  |  Height:  |  Size: 877 B

View File

@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
viewBox="0 0 12 12"
version="1.1"
id="arrow_last"
width="12"
height="12"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<path
id="arrow"
style="stroke-width:0.584448;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
d="M 2.0731448,11.604466 0.47319466,10.151586 4.9999643,6.0287178 0.51871266,1.9504555 2.1291598,0.48483049 8.2103658,6.01916 Z" />
<rect
style="stroke-width:0.524;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;marker-start:url(#Arrow1Lstart);paint-order:normal"
id="bar"
width="2.2"
height="11.263"
x="-11.503481"
y="0.40091875"
rx="0"
ry="0.0015425405"
transform="scale(-1,1)" />
</svg>

Before

Width:  |  Height:  |  Size: 911 B

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
viewBox="0 0 12 12"
version="1.1"
id="arrow_next"
width="12"
height="12"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<path
id="arrow"
style="stroke-width:0.584448;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
d="M 2.0731448,11.604466 0.47319466,10.151586 4.9999643,6.0287178 0.51871266,1.9504555 2.1291598,0.48483049 8.2103658,6.01916 Z" />
</svg>

Before

Width:  |  Height:  |  Size: 575 B

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
viewBox="0 0 12 12"
version="1.1"
id="arrow_previous"
width="12"
height="12"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<path
id="arrow"
style="stroke-width:0.584448;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
d="M 9.9303359,11.572157 11.530286,10.119277 7.0035163,5.9964088 11.484768,1.9181465 9.8743209,0.45252151 3.7931149,5.986851 Z" />
</svg>

Before

Width:  |  Height:  |  Size: 578 B

View File

@@ -1 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 339 B

View File

@@ -1 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 476 B

View File

@@ -1 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 497 B

View File

@@ -1 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 264 B

View File

@@ -1,57 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0 0 24 24"
fill="currentColor"
version="1.1"
id="svg883"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<title
id="title18331">Search Icon</title>
<defs
id="defs887" />
<ellipse
style="opacity:0.995734;fill:none;stroke:#010001;stroke-width:1.81467;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
id="path1376"
cx="14.284247"
cy="9.0682373"
rx="6.5925374"
ry="6.5925369" />
<path
style="fill:none;stroke:#000000;stroke-width:1.84169;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 2.8483937,21.838389 10.399215,13.84375"
id="path1882" />
<path
id="path1376-6"
style="opacity:0.995734;fill:none;stroke:#010001;stroke-width:1.21;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;paint-order:fill markers stroke"
d="M 14.133134,5.0939128 C 16.342061,5.259387 18.056426,6.9596051 18.240557,9.1075843 18.055629,6.9365 16.307909,5.2286717 14.133134,5.0939128 Z" />
<metadata
id="metadata18329">
<rdf:RDF>
<cc:License
rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
<cc:Work
rdf:about="">
<cc:license
rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
<dc:title>Search Icon</dc:title>
<dc:date>2025-08-05</dc:date>
<dc:creator>
<cc:Agent>
<dc:title>Roan Horning</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
</rdf:RDF>
</metadata>
</svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -1 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -1 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 260 B

View File

@@ -1 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 785 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 611 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 529 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

View File

@@ -1,4 +1,4 @@
#!/usr/bin/env perl
#!/usr/bin/perl
# {{{ POD documentation
@@ -56,9 +56,19 @@ Perl Template Toolkit.
* SQLite v3.8.3 or greater is recommended. CTE WITH clauses are used in some template queries.
Must convert WITH clauses to sub-queries when using earlier versions of SQLite.
With MySQL
* Create database hpr_hpr in the MySQL server from HPR dump file.
- sudo mysql --host=localhost < hpr.sql
* Create a user that will be used by the site-generator.
- Suggested username: hpr-generator
- CREATE USER 'hpr-generator'@'localhost' IDENTIFIED BY '<password>';
* Limit the user's privileges to EXECUTE and SELECT
- GRANT SELECT ON hpr_hpr.* TO 'hpr-generator'@'localhost';
- GRANT EXECUTE ON `hpr_hpr`.* TO 'hpr-generator'@'localhost';
Install the needed Perl modules using preferred method (distribution packages, CPAN, etc.)
* Config::Std
* DBD::SQLite
* DBD::SQLite or DBD:mysql
* DBI
* Data::Dumper
* Date::Calc
@@ -112,6 +122,7 @@ use Text::CSV_XS;
use HTML::Entities qw(encode_entities);
use Date::Calc;
use DBI;
use DBD::SQLite;
use Tie::DBI;
use Template;
use Template::Plugin::Date;
@@ -280,23 +291,26 @@ sub parse_page_arg {
# Split page name from page ids if available.
my ($page, $ids) = split(/=/, $page_arg);
my @ids;
$ids = "" unless defined $ids;
# Parse the page ids and push them onto @ids array
my @ids_by_comma = split(/\,/, $ids);
foreach my $id_by_comma (@ids_by_comma) {
my @ids_for_range = split(/\.\./, $id_by_comma);
if ((scalar @ids_for_range) == 2) {
push @ids, $ids_for_range[0]..$ids_for_range[1];
}
elsif ((scalar @ids_for_range) == 1) {
push @ids, $ids_for_range[0];
}
else {
verbose (1, "\nWarning: Page $page id range $id_by_comma could not be parsed.");
if(!$ids) {
$ids = "";
}
else {
# Parse the page ids and push them onto @ids array
my @ids_by_comma = split(/\,/, $ids);
foreach my $id_by_comma (@ids_by_comma) {
my @ids_for_range = split(/\.\./, $id_by_comma);
if ((scalar @ids_for_range) == 2) {
push @ids, $ids_for_range[0]..$ids_for_range[1];
}
elsif ((scalar @ids_for_range) == 1) {
push @ids, $ids_for_range[0];
}
else {
verbose (1, "\nWarning: Page $page id range $id_by_comma could not be parsed.");
}
}
}
return ('page' => $page, 'ids' => [@ids]);
}
@@ -313,7 +327,7 @@ sub get_ids_from_db {
|| die $tt->error(), "\n";
# Starts with a newline and comma
return split(/,/, substr($selected_ids, 1));
return split(/,/, substr($selected_ids, 2));
}
sub get_filename {

View File

@@ -7,10 +7,17 @@
# 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]
templates_path: ./templates:./public_html/images/icons
templates_path: ./templates
output_path: ./public_html
# Configure the root template page which pulls in the navigation and
@@ -20,16 +27,14 @@ output_path: ./public_html
[root_template]
content: page.tpl.html
#baseurl: OPTIONAL [i.e. file://<full path to local website directory>]
#baseurl: file:///home/roan/Development/hpr/website/hpr_generator/public_html/
baseurl: https://hackerpublicradio.org/
http_baseurl: http://hackerpublicradio.org/
hub_baseurl: https://hub.hackerpublicradio.org/
media_baseurl: https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr$eps_id/
media_baseurl: https://archive.org/download/hpr$eps_id/
generator_name: The HPR Robot
generator_email: robot.nospam@nospam.hackerpublicradio.org
# Is safe for work: 0 for true, 1 for false -- if true substitute
# variations of Hobby for Hacker
is_sfw: 1
# Configure the navigation menu and the content templates for each page
# of the site:
#
@@ -59,10 +64,6 @@ content: content-index.tpl.html
navigation: navigation-about.tpl.html
content: content-about.tpl.html
[contribute]
navigation: content-contribute.tpl.html
content: content-contribute.tpl.html
[correspondents]
navigation: navigation-about.tpl.html
content: content-correspondents.tpl.html
@@ -96,10 +97,6 @@ content: content-episode.tpl.html
multipage: true
filename: eps/hpr[id]/index.html
[download]
navigation: navigation-get-shows.tpl.html
content: content-download.tpl.html
[syndication]
navigation: navigation-get-shows.tpl.html
content: content-syndication.tpl.html
@@ -116,32 +113,21 @@ content: content-sitemap.tpl.html
navigation: navigation-main.tpl.html
content: content-tags.tpl.html
[twt_episode]
[twat_episode]
navigation: navigation-get-shows.tpl.html
content: content-twt_episode.tpl.html
content: content-twat_episode.tpl.html
multipage: true
filename: eps/twt[id]/index.html
filename: eps/twat[id]/index.html
media_baseurl: https://www.hackerpublicradio.org/eps/
[mumble-howto]
navigation: navigation-about.tpl.html
content: content-mumble-howto.tpl.html
[contact]
navigation: navigation-about.tpl.html
content: content-contact.tpl.html
[promote]
navigation: navigation-about.tpl.html
content: content-promote.tpl.html
[comments_viewer]
navigation: navigation-about.tpl.html
content: content-comments_viewer.tpl.html
[new_year]
navigation: navigation-about.tpl.html
content: content-new_year.tpl.html
[hpr_ogg]
root_template: rss.tpl.xml
content: rss-hpr.tpl.xml
@@ -183,15 +169,3 @@ media_file_extension: spx
[comments]
root_template: rss-comments.tpl.xml
filename: comments.rss
[correspondent_m3u]
root_template: m3u.tpl.m3u8
content: m3u-correspondent.tpl.m3u8
filename: correspondents/[id]/playlist.m3u8
multipage: true
[series_episodes_m3u]
root_template: m3u.tpl.m3u8
content: m3u-series_episodes.tpl.m3u8
filename: series/[id].m3u8
multipage: true

File diff suppressed because it is too large Load Diff

View File

@@ -1,14 +1,12 @@
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS 'shared-listen-now.tpl.html' %-->
<!--% PROCESS "queries-episode.tpl.html" %-->
<!--% USE DBI(constants.driver) %-->
<!--% page_title = "HPR ~ Current comments on the shows" %-->
<!--% PROCESS "queries-episode-${constants.database}.tpl.html" %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<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>
<hr class="no-css">
<section id="comments" class="lane stack">
<hr />
<!--% FOREACH item IN DBI.query('
SELECT C.*,
H.host, H.hostid AS host_id,
@@ -27,18 +25,18 @@
LIMIT 30
')
%-->
<article>
<header>
<h2><!--% item.comment_author_name %--> says: <!--% item.comment_title %--></h2>
</header>
<p class="show-meta">Posted at <!--% item.comment_timestamp %--> relating to the show <a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(item.eps_id) %-->/index.html">hpr<!--% item.eps_id %--></a> which was released on <!--% item.episode_date %--> by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(item.host_id) %-->.html"><!--% item.host %--></a> entitled <em><!--% item.episode_title %--></em></small>
</p>
<p class="comment">
<!--% item.comment_text FILTER html_line_break %-->
</p>
<footer>
Listen in <a href="<!--% media_path(item.eps_id, 'hpr', 'ogg', baseurl, media_baseurl) %-->">ogg</a>, <a href="<!--% media_path(item.eps_id, 'hpr', 'spx', baseurl, media_baseurl) %-->">spx</a>, or <a href="<!--% media_path(item.eps_id, 'hpr', 'mp3', baseurl, media_baseurl) %-->">mp3</a> format.</p></footer>
<header>
<h1><a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(item.eps_id) %-->/index.html#comment_<!--% item.comment_id %-->"><!--% item.comment_author_name %--> says</a>: <!--% item.comment_title %--></h1>
<p><small>Posted at <!--% item.comment_timestamp %--> relating to the show <a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(item.eps_id) %-->/index.html">hpr<!--% item.eps_id %--></a> which was released on <!--% item.episode_date %--> by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(item.host_id) %-->.html"><!--% item.host %--></a> entitled <em><!--% item.episode_title %--></em></small>
</p>
</header>
<p class="comment">
<!--% item.comment_text FILTER html_line_break %-->
</p>
<footer>
Listen in <a href="<!--% media_path(item.eps_id, 'hpr', 'ogg', baseurl, media_baseurl) %-->">ogg</a>, <a href="<!--% media_path(item.eps_id, 'hpr', 'spx', baseurl, media_baseurl) %-->">spx</a>, or <a href="<!--% media_path(item.eps_id, 'hpr', 'mp3', baseurl, media_baseurl) %-->">mp3</a> format.</p></footer>
</article>
<hr class="no-css">
<hr />
<!--% END %-->
</section>

View File

@@ -1,22 +0,0 @@
<!--% page_title = "HPR ~ Contact the Community" %-->
<article>
<header>
<h1>Contact</h1>
</header>
<p>We are always looking for more hosts...</p>
<ul>
<li>email: <strong>admin -at- hackerpublicradio org</strong><br />
<em>As an anti-spam measure you will get an error back but we do get your email.</em></li>
<li>Website: <a href="http://www.hackerpublicradio.org" target="_blank">www.hackerpublicradio.org</a></li>
<li>Mailist: <a href="http://www.hackerpublicradio.org/maillist" target="_blank">Maillist</a></li>
<li><a href="https://web.libera.chat/gamja/?channels=oggcastplanet" target="_blank">#oggcastplanet</a></li>
<li><a href="https://www.facebook.com/home.php?sk=group_130169220378872¬if_t=group_r2j" target="_blank">Facebook</a></li>
<li><a href="https://www.linkedin.com/company/hackerpublicradio/" target="_blank">Linked-In</a></li>
<li><a href="http://itunes.apple.com/us/podcast/hacker-public-radio/id281699640" target="_blank">iTunes</a></li>
</ul>
<h2>Mail List</h2>
<p>
HPR is governed by the community, so decisions about how Hacker Public Radio should be run are made on the mailing list you can join it by going to :<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.hackerpublicradio.org/maillist">http://www.hackerpublicradio.org/maillist</a>
</p>
</article>

View File

@@ -1,972 +0,0 @@
<!--% page_title = "HPR ~ Contribute to this community podcast" %-->
<ul>
<li><a href="<!--% absolute_url(baseurl,'contribute.html#so_you_want_to_record_a_podcast') %-->">So you want to record a podcast</a></li>
<li><a href="<!--% absolute_url(baseurl,'contribute.html#stuff_you_need_to_know') %-->">Stuff you need to know</a></li>
<li><a href="<!--% absolute_url(baseurl,'contribute.html#pick_a_topic') %-->">Pick a Topic</a></li>
<li><a href="<!--% absolute_url(baseurl,'contribute.html#recording_a_podcast') %-->">Recording a Podcast</a></li>
<li><a href="<!--% absolute_url(baseurl,'contribute.html#requesting_slot') %-->">Deciding when your show is released</a></li>
<li><a href="<!--% absolute_url(baseurl,'contribute.html#confirmation_email') %-->">Confirmation Email</a></li>
<li><a href="<!--% absolute_url(baseurl,'contribute.html#uploading_an_episode') %-->">Uploading an Episode</a></li>
<ul>
<li><a href="<!--% absolute_url(baseurl,'contribute.html#personal_information') %-->">Personal Information</a></li>
<li><a href="<!--% absolute_url(baseurl,'contribute.html#episode_information') %-->">Episode Information</a></li>
</ul>
</ul>
<div class="lane stack">
<article>
<header>
<p class="index-link"><a href="/contribute.html#TOP">↑ Go to top</a></p>
<h1 id="so_you_want_to_record_a_podcast">So you want to record a podcast<a href="<!--% absolute_url(baseurl,'contribute.html#so_you_want_to_record_a_podcast') %-->">.</a></h1>
</header>
<p>Well you've come to the right place.
Our goal here at HPR is to make it as <strong>easy as possible</strong> for you to get your show released.
We take care of the hard bits so you don't need to.
</p>
<p>
Recording your first show can be a daunting prospect but <a href="<!--% absolute_url(baseurl) %-->correspondents/index.html">hundreds of people</a>
like yourself have done it, and so can you.
Don't worry that we won't like the topic, just have a look at our <a href="<!--% absolute_url(baseurl) %-->eps/index.html">Archive</a>
to see how diverse the contributions have been.</p>
<p>
Don't worry if your audio isn't perfect,
that your voice sounds funny,
that English isn't your native language,
that you suffer from a <a href="<!--% absolute_url(baseurl,'/eps/hpr1102/index.html') %-->">speech impediment</a>,
that your show has loads of ummms and awws in it, etc.
We have plenty of hosts that fall into all these categories, but continue to produce great shows.
</p>
<p>
At the end of the day the show is about the content and less about perfection.
That's not to say we won't help you with ways to improve the audio if you wish,
or narrate your script for you if you can't or won't record it yourself.
</p>
</article>
<article>
<header>
<p class="index-link"><a href="/contribute.html#TOP">↑ Go to top</a></p>
<h1 id="stuff_you_need_to_know">Stuff you need to know<a href="<!--% absolute_url(baseurl,'contribute.html#stuff_you_need_to_know') %-->">.</a></h1>
</header>
<p>
This is some important information that you will need to know before uploading to HPR.
</p>
<details>
<summary id="wikipedia">You will no longer be allowed to <a href="<!--% absolute_url(baseurl,'about.html#hpr_wikipedia_page') %-->">edit HPR pages</a> on Wikipedia<a href="<!--% absolute_url(baseurl,'contribute.html#wikipedia') %-->">.</a></summary>
<p>
Once you upload a show, you will be associated with the HPR project.
As such, <a href="https://en.wikipedia.org/wiki/Wikipedia:FAQ/Organizations">Wikipedia</a> policies will prevent you from creating,
or editing pages relating to
<a href="https://en.wikipedia.org/wiki/Hacker_Public_Radio">Hacker Public Radio</a>. For more information see <a href="<!--% absolute_url(baseurl,'about.html#hpr_wikipedia_page') %-->">(Re)Creating a HPR page on wikipedia</a>.
</p>
</details>
<details>
<summary id="syndication">We <strong>do not syndicate</strong> shows not produced for HPR<a href="<!--% absolute_url(baseurl,'contribute.html#syndication') %-->">.</a></summary>
<p>
HPR is founded on the principle of Hackers sharing knowledge, so we are not a media aggregation site.
For this reason we are only releasing material created exclusively for HPR.
Once released, the creative commons license will allow sharing it to other locations.
</p>
<p>
We will continue to promote new podcasts, and other creative commons material,
through our sister site <a href="https://freeculturepodcasts.org/">Free Culture Podcasts</a>.
</p>
<p>
We do allow <strong>promotion of one example</strong> episode of creative commons content.
You post it as a regular show in the series <a href="<!--% absolute_url(baseurl) %-->series/0075.html">Podcast recommendations</a>,
with your introduction as to what the piece is, why it's important,
what version of Creative Commons it is released under, and provide links to the website, and to the RSS feed.
</p>
</details>
<details>
<summary id="license">You are agreeing to <strong>license</strong> your show <strong>CC BY-SA 4.0</strong><a href="<!--% absolute_url(baseurl,'contribute.html#license') %-->">.</a></summary>
<p>
All our shows are now released under a
<a href="https://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)</a>
license, which means that while you continue to retain the copyright to your show,
you are allowing us (and everyone else) to use it provided we give you attribution and that we release it under the same license.
</p>
</details>
<details>
<summary id="permission">You have <strong>permission</strong> to redistribute your show in its entirety<a href="<!--% absolute_url(baseurl,'contribute.html#permission') %-->">.</a></summary>
<p>
Never include content, for example music, in your show that you do not have permission to redistribute.
Try to avoid using any content in your show that can not be redistributed under a
<a href="https://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) </a>
license.
If you are redistributing under another Creative Commons license, GNU Free Documentation License, public domain,
or FLOSS software license, then please signal that when you upload your show.
We do not post <a href="https://repo.anhonesthost.net/HPR/hpr_documentation/src/branch/main/policies.md#policy-change-should-we-reject-a-show-with-copyrighted-fair-use-clips-in-it-httpslistshackerpublicradiocompipermailhpr2019-may003673html">other copyrighted content</a>, even if it is made available under fair use, or by arranged permission.
</p>
</details>
<details>
<summary id="not_moderated">The audio of your show will <strong>not be moderated</strong><a href="<!--% absolute_url(baseurl,'contribute.html#not_moderated') %-->">.</a></summary>
<p>
We do not vet, edit, moderate or in any way censor any of the audio you submit, <strong>we expect you to do that</strong>.
Aside from checking snippets for audio quality/spam checking,
we have a policy that we don't listen to the shows before they are aired.
This is a long standing tradition arising from the fact that HPR is a community of peers
who believe that any host has as much right to submit shows as any other.
</p>
<p>
Please note that this only relates to the audio you upload.
We <strong>do</strong> transform the audio into different formats.
The rest of the meta-data (branding/summaries/tags/show notes/etc.), are managed by the HPR Community,
and <strong>probably will</strong> be edited.
</p>
<p>
There is no guarantee that we will accept your show.
Even after it is processed, <strong>any material that is reported as harming HPR may be unlisted until such a time as the situation can be resolved</strong>.
You can expect your show to be rejected for (incomplete list):
<ul>
<li>Inaudible audio</li>
<li>Containing Copyright Content, even <em>Fair Use</em></li>
<li>Not a HPR Episode</li>
<li>Content Containing Harassment, Trolling, Spamming, etc</li>
</ul>
</p>
<p>
Please refer to <a href="https://repo.anhonesthost.net/HPR/hpr_documentation/src/branch/main/policies.md#free-speech-and-general-conduct">Free speech and general conduct</a>
which describes the agreed approach to this topic.
</p>
</details>
<details>
<summary id="explicit_content">Your show will be signaled as containing <strong>explicit</strong> content<a href="<!--% absolute_url(baseurl,'contribute.html#explicit') %-->">.</a></summary>
<p>
Given that we are an open forum for free speech,
we signal all our shows as "explicit" with the assumption that the listeners will apply the required discretion when playing the shows in public.
That said the majority of our content is technical in nature and therefore is often considered appropriate for any audience.
If you feel that your show will be considered <strong>inoffensive in every region of the world</strong>
then you can signal your show as <em>Clean</em> when you upload the show.
</p>
<p>
When dealing with content that is "explicit" or contains material that would best be suited for a mature audience,
it has become traditional to include a <strong>short warning</strong> at the very beginning of the show before the intro,
to allow listeners <strong>sufficient time</strong> to switch off the episode should they so desire.
</p>
<p>
Please refer to <a href="https://repo.anhonesthost.net/HPR/hpr_documentation/src/branch/main/policies.md#free-speech-and-general-conduct">Free speech and general conduct</a>
which describes the agreed approach to this topic.
</p>
</details>
<details>
<summary id="schedule">You determine when your show will be <strong>scheduled</strong><a href="<!--% absolute_url(baseurl,'contribute.html#schedule') %-->">.</a></summary>
<p>You decide when <a href="<!--% absolute_url(baseurl,'contribute.html#upload_your_show') %-->">your show should be released</a>.
You can pick a day, or put it in the reserve pool so that the Janitors can use it when there are gaps in the schedule.</p>
</details>
<details>
<summary id="audio_ready">Your audio must be ready <strong>before</strong> you pick a slot<a href="<!--% absolute_url(baseurl,'contribute.html#audio_ready') %-->">.</a></summary>
<p>
Any host can select any free slot a up to year in advance,
but the audio must be ready at time of picking a slot.
</p>
<p>
In exceptional circumstances it may be necessary to reserve a slot while not having the audio available.
This must be approved by the <a href="<!--% absolute_url(baseurl,'/maillist') %-->">HPR Mailing List</a> in advance.
Be sure to allow as much time as possible,
and include a reason why you feel it is necessary to reserve the slot.
</p>
<p>
This is intended only for exceptional circumstances,
such as a scheduled interview where we would like the audio to be released as soon after the event as possible,
or to cover an important topical situation that has occurred.
Due to the extended time now needed to post shows to external sites,
the extra work this entails and the disruptive effect of reservations,
we will no longer be allowing them except in very rare cases of the type mentioned above.
</p>
<p>
The following are standing reservations:
</p>
<ul>
<li>Anniversary episodes.</li>
<li>HPR Community News on the first Monday of the month.</li>
<li>The first day of the fourth month.</li>
</ul>
</details>
<details>
<summary id="two_weeks">Leave <strong>two weeks</strong> between your shows<a href="<!--% absolute_url(baseurl,'contribute.html#two_weeks') %-->">.</a></summary>
<p>
All hosts must leave at least 9 slots (approximately two weeks) between their shows.
This is to avoid a given host, or topic taking over the queue.
</p>
</details>
<details>
<summary id="moving_shows">We will not <strong>move shows</strong> once they are scheduled<a href="<!--% absolute_url(baseurl,'contribute.html#moving_shows') %-->">.</a></summary>
<p>
Once a show has been posted it is <a href="https://repo.anhonesthost.net/HPR/hpr_documentation/src/branch/main/policies.md#permission-to-move-out-a-show">not possible to move them</a>
to another slot.
</p>
</details>
<details>
<summary id="email_address">Your <strong>email</strong> will be made <strong>public</strong><a href="<!--% absolute_url(baseurl,'contribute.html#email_address') %-->">.</a></summary>
<p>
The mail is just a way for us to get back to you if there was an issue posting the show.
This email address will be published on the HPR website and will be given out in the feeds,
so please use a <strong>public email</strong> address for this purpose.
</p>
<p>
Where we publish it we pad it with dot nospam at-sign nospam dot.
For example <em>hpr@example.com</em> becomes <em>hpr.nospam@nospam.example.com</em>.
</p>
<p>
If you do not want to have your email exposed, please contact the admin@hpr team to arrange a alias.
If you trust the janitors to know your real email,
then we can just use an alias for you on the web site.
Any inbound mail to that alias will be automatically forwarded to your personal email.
That runs the risk that were the redirect list compromised then your real email would get exposed.
We would do our best to protect your email but we can't guarantee anything.
</p>
<p>
The other option is to use an a throwaway email, like
<a href="https://www.guerrillamail.com/">https://www.guerrillamail.com/</a>
for your show. This will be up for enough time to get the key necessary for to post the show.
However keep in mind that we will be very suspicious of any submission done this way
and will be checking it in detail,
so expect delays in processing.
</details>
<details>
<summary id="schedule">You <strong>IP Address</strong> and User Agent will logged<a href="<!--% absolute_url(baseurl,'contribute.html#schedule') %-->">.</a></summary>
<p>
The information we log is sent at the end of the emails we send to you.
Your IP address is linked to your show until it is posted.
Once we verify the show is a genuine contribution we remove the reference.
</p>
</details>
<details>
<summary id="utf8">We use <strong>UTF-8</strong> end to end<a href="<!--% absolute_url(baseurl,'contribute.html#utf8') %-->">.</a></summary>
<p>
See the video "<a href="https://www.youtube.com/watch?v=MijmeoH9LT4">Characters, Symbols and the Unicode Miracle - Computerphile</a>"
for an interesting background to ASCII and <a href="https://en.wikipedia.org/wiki/UTF-8">UTF-8</a>.
</p>
</details>
<details>
<summary id="accessibility">Keep <strong>accessibility</strong> in mind<a href="<!--% absolute_url(baseurl,'contribute.html#accessibility') %-->">.</a></summary>
<p>
When you include output from the command line in the show notes,
posting screen-shots of console or terminal output
makes it impossible for screen readers to access the text.
Always try to include the raw output ( eg: embedded in &lt;pre&gt; tags)
</p>
<p>Include descriptive language in any link texts.
Avoid structures like: <em>"For accessibility information
<a href="<!--% absolute_url(baseurl,'contribute.html#accessibility') %-->">click here</a>"</em>.
Rather use: <em>"For more information click our
<a href="<!--% absolute_url(baseurl,'contribute.html#accessibility') %-->">accessibility page</a>"</em>
</p>
<p>When adding Images, add the descriptive text under the image (not in the alt tag).
That way everyone can benefit from the description.
</details>
<details>
<summary id="international">Your show will be heard by an <strong>International Audience</strong><a href="<!--% absolute_url(baseurl,'contribute.html#international') %-->">.</a></summary>
<p>
We have people listening from all over the world, who may not have the same cultural background as yourself,
therefore you should be as clear as possible when giving details.
For example always give temperatures in both Celsius and Fahrenheit, measurements in Metric and Imperial,
dates in <strong>YYYY-MM-DD</strong> <a href="https://en.wikipedia.org/wiki/ISO_8601">iso8601</a> format,
and abbreviations using the <a href="https://en.wikipedia.org/wiki/NATO_phonetic_alphabet">NATO phonetic alphabet</a>.
</p>
<p>
Never assume that your audience knows what age a sixth grader is, or how big a 20 Cent Euro coin is.
Keep in mind that keyboard layouts are also different so make sure to specify the key shape or the position
inrelation to a common known standard.
For example:
</p>
<blockquote>The at sign normally situated above the 2 key on a US keyboard, and has a unicode number of U+0040.
For more information see <a href="https://en.wikipedia.org/wiki/At_sign">Wikipedia</a></blockquote>
<p>
<a href="https://xkcd.com/1179/"><img src="https://imgs.xkcd.com/comics/iso_8601.png"
title="ISO 8601 was published on 06/05/88 and most recently amended on 12/01/04." alt="An xkcd cartoon showing ISO 8601" /></a>
</p>
</details>
<p>
If you have any questions please join one of our <a href="<!--% absolute_url(baseurl,'about.html#contact') %-->">contact channels</a> to chat with people who will help.
</p>
</article>
<div class="lane stack">
<article>
<header>
<p class="index-link"><a href="/contribute.html#TOP">↑ Go to top</a></p>
<h1 id="pick_a_topic">Pick a Topic<a href="<!--% absolute_url(baseurl,'contribute.html#pick_a_topic') %-->">.</a></h1>
</header>
<p>
The first thing you will need to do is <strong>decide on a topic</strong> for your show.
</p>
<p>
We recommend that your first show be a introductory episode to the
<a href="<!--% absolute_url(baseurl,'series/0029.html') %-->">How I got into tech</a> series.
First tell us your <strong>name</strong>,
how you <strong>found out about HPR</strong>,
and the begin with your <strong>earliest</strong> introduction to tech.
Cover all the <strong>systems</strong> you used,
and mention all the <strong>people</strong>
and <strong>events</strong> who had a role in shaping your journey.
We will make sure you get lots of suggestions for your next submission in the comments for your show,
and in the next <a href="<!--% absolute_url(baseurl,'series/0047.html') %-->">HPR Community News</a> monthly overview.
</p>
<p>
You can see in our
<a href="<!--% absolute_url(baseurl,'eps/index.html') %-->">Complete Episode Overview</a> page
that we a wide variety of topics, ranging from "OMG I just learned/broke/hacked/discovered/etc, this cool thing and no one in my house gets it",
to <a href="<!--% absolute_url(baseurl,'eries/index.html') %-->">in depth series</a> where a particular topic can be explored in more detail.
</p>
<p>
To find a overview of the topics you can also search by keyword on our
<a href="<!--% absolute_url(baseurl,'search.html#tags') %-->">tags page</a>.
</p>
<p id="requested_topics">
We maintain a page of <a href="https://repo.anhonesthost.net/HPR/hpr_documentation/src/branch/main/requested_topics">requested topics</a>
that have been sent in by the community.
Feel free to add it to the list via <a href="<!--% absolute_url(baseurl,'about.html#contact') %-->">the contact channels</a>.
</p>
<p>
If you are worried that your show may not be of interest to Hackers then you can <a href="<!--% absolute_url(baseurl) %-->will-my-show-be-of-interest-to-hackers.html">click here</a> to check if it is.
</p>
</article>
<hr class="no-css">
<article>
<header>
<p class="index-link"><a href="/contribute.html#TOP">↑ Go to top</a></p>
<h1 id="recording_a_podcast">Recording a Podcast</h1>
</header>
<p>
On this page you will find information on how to record a podcast.</p>
<h2 id="recording_tips">Recording Tips<a href="<!--% absolute_url(baseurl,'contribute.html#recording_tips') %-->">.</a></h2>
<details>
<summary id="flac_is_best">Lossless FLAC Level 8 (best) 44100 Hz, 24 bit depth<a href="<!--% absolute_url(baseurl,'contribute.html#flac_is_best') %-->">.</a></summary>
<p>
<em>FLAC is best, we accept the rest.</em>
</p>
<p>
Our recommended setting for recording is 44100 Hz, 24 bit depth, saved as Lossless FLAC Level 8 (best).
</p>
<p>
It makes our life a lot easier if you record with the best quality you can.
Record using the best equipment you have close to hand, try and set the recording to the best quality lossless format like
<a href="https://en.wikipedia.org/wiki/FLAC">FLAC</a>, or <a href="https://en.wikipedia.org/wiki/WAV">WAV</a>,
and set everything else to the highest setting.
</p>
<p>
If your recording setup can't do that, then pick a lossless format, with the highest sample rate you can.
</p>
</details>
<details>
<summary id="golden_rule">Any audio is better than no audio<a href="<!--% absolute_url(baseurl,'contribute.html#golden_rules') %-->">.</a></summary>
<p>
It's always the goal to get the best quality audio,
but here at Hacker Public Radio we value content over quality and so long as it's audible we'll take it.
</p>
<p>
The show <a href="<!--% absolute_url(baseurl,'eps/hpr2627/index.html') %-->">hpr2627 :: Home Phone Setup!!</a> is a perfect example of this.
</p>
</details>
<details>
<summary id="procrastination">Procrastination is the enemy<a href="<!--% absolute_url(baseurl,'contribute.html#procrastination') %-->">.</a></summary>
<p>
If it's taking too long to edit the episode then you are less likely to submit the show.
Send this show in, and employ your lessons learned in the next one.
</p>
<p>
A rule of thumb is to never spend more time editing than recording.
</p>
</details>
<details>
<summary id="introduce_yourself">Introduce yourself in each show<a href="<!--% absolute_url(baseurl,'contribute.html#introduce_yourself') %-->">.</a></summary>
<p>
Don't forget to <strong>introduce yourself</strong> in your show.
We have hundreds of hosts and thousands of episodes.
While you may have done many shows, some people listen randomly,
so this may be the first time they hear your voice.
</p>
</details>
<details>
<summary id="background_music">Avoid Bedding/background music<a href="<!--% absolute_url(baseurl,'contribute.html#background_music') %-->">.</a></summary>
<p>
You may include backing music but it's best if you don't.
Most long time podcast listeners speed up their shows,
as this allows them to cram more shows into a day.
Having bedding music makes it more difficult to understand,
and prevents tools like <em>truncate silence</em> from working correctly.
</p>
<p>
Others will convert shows to mono to listen in one ear leaving the other free to carry out their other chores.
Still more slow the shows down so that they can improve their English.
Others are hard of hearing and backing music makes it difficult to understand the text.
</p>
</details>
<details>
<summary id="encoding">We mix down to Mono<a href="<!--% absolute_url(baseurl,'contribute.html#encoding') %-->">.</a></summary>
<p>
We will by default mix down your show to one channel mono and we will
<a href="https://repo.anhonesthost.net/HPR/hpr-tools/src/branch/main/workflow/hpr-process_episode.bash">transcode</a> to opus, mp3, ogg and spx formats.
If you want to control this in more detail then please email admin at Hacker Public Radio for more information.
</p>
</details>
<details>
<summary id="no_metadata">No need to add Metadata to the file<a href="<!--% absolute_url(baseurl,'contribute.html#no_metadata') %-->">.</a></summary>
<p>
There is no need to add any information to the file as that will be inserted based on the information you provide when you upload the show.
</p>
</details>
<details>
<summary id="no_themes">Do not add any Theme to the show<a href="<!--% absolute_url(baseurl,'contribute.html#no_themes') %-->">.</a></summary>
<p>
The HPR Intro, and the Outro will be added automatically.
While we did ask people to add it in the past, this is no longer the case.
</p>
</details>
<h2 id="recording">Recording<a href="<!--% absolute_url(baseurl,'contribute.html#recording') %-->">.</a></h2>
<details>
<summary id="recording_smartphone">Recording with a Smartphone<a href="<!--% absolute_url(baseurl,'contribute.html#recording_smartphone') %-->">.</a></summary>
<p>
Some of our hosts recommend <a href="https://github.com/Dimowner/AudioRecorder">Audio Recorder</a> by Dmytro Ponomarenko on Android.
It's available on <a href="https://f-droid.org/packages/com.dimowner.audiorecorder/">F-Droid</a>
and <a href="https://play.google.com/store/apps/details?id=com.dimowner.audiorecorder&hl=en">Google Play</a>.
These are the recommended settings:
</p>
<ul>
<li>Recording Format: Wav</li>
<li>Sample Rate: 44.1 kHz</li>
<li>Audio Channels - Mono</li>
</ul>
</p>
<p>On iphone you can use Apples <a href="https://apps.apple.com/us/app/voice-memos/id1069512134">Voice Memos</a> built in app.
<ul>
<li>Recording Mode: Mono</li>
<li>Audio Quality: Lossless</li>
</ul>
</details>
<details>
<summary id="editing">Recording/Editing using your Computer<a href="<!--% absolute_url(baseurl,'contribute.html#editing') %-->">.</a></summary>
<p>
</p>
<p>
The majority of podcasters use <a href="https://audacity.sourceforge.net/download/">Audacity</a>.
First set the Project Rate to 44100Hz, then you can either record your show in Audacity itself or
import the file you recorded earlier and edit it as you wish.
</p>
<p>
<img srcset="images/contribute-audacity-record-sm.png 460w, images/contribute-audacity-record.png 640w"
sizes="(max-width: 460px) 95vw, 640px"
src="images/contribute-audacity-record.png" alt="Audacity Can Record" title="Audacity Screenshot of Recording" >
</p>
<blockquote>Audacity is a free, easy-to-use and multilingual audio editor and recorder for
Windows, Mac OS X, GNU/Linux and other operating systems.</blockquote>
<a href="https://www.youtube.com/watch?v=ss8CyTwBOPY">Video of hpr1404 Ken Fallon Editing prerecorded audio in Audacity</a>
<p>
When you have finished editing your podcast you can export it.
</p>
<ol>
<li>Confirm that the Project Rate is set to 44100 Hz (bottom left).</li>
<li><em>File -> Export</em> and select <strong>FLAC File</strong>.</li>
<li>Click <em>Options...</em> to reveal FLAC Export Setup.</li>
<li>Set <em>Level</em> to <strong>8 (best)</strong>.</li>
<li>Set <em>Bit depth</em> to <strong>24</strong>.</li>
</ol>
<p>
<img srcset="images/contribute-audacity-export-sm.png 460w, images/contribute-audacity-export.png 640w"
sizes="(max-width: 460px) 95vw, 640px"
src="images/contribute-audacity-export.png" alt="Audacity Export Settings" title="Audacity Screenshot of an Export" >
</p>
</details>
<details>
<summary id="round_table">Recording round table discussions<a href="<!--% absolute_url(baseurl,'contribute.html#round_table') %-->">.</a></summary>
<p>
If you would like to record with multiple participants then you can use <a href="https://www.mumble.com/">Mumble</a>.
Connect to <strong>chatter.skyehaven.net</strong> Port: <strong>64738 </strong>.<br>
Walk through the audio wizard and then pop into the <strong>Hacker Public Radio</strong> room.
Once you are ready press the <strong>recording</strong> button, select <em>multichannel</em> and then <em>start</em>.
That will record a single track which you can edit and then submit.
<br>
The <a href="<!--% absolute_url(baseurl) %-->mumble-howto">Mumble tutorial</a> has more information.
Thanks to <a href="<!--% absolute_url(baseurl) %-->correspondents/0228.html">Delwin</a> for providing the server.
</p>
<p>
<img srcset="images/contribute-mumble-record-sm.png 460w, images/contribute-mumble-record.png 640w"
sizes="(max-width: 460px) 95vw, 640px"
src="images/contribute-mumble-record.png" alt="Audacity Can Record" title="Audacity Screenshot of Recording" >
</p>
</details>
<p>
For more tips see the <a href="<!--% absolute_url(baseurl,'series/0045.html') %-->">In-Depth Series: Podcasting HowTo</a>.
</p>
</article>
<hr class="no-css">
<article>
<header>
<p class="index-link"><a href="/contribute.html#TOP">↑ Go to top</a></p>
<h1 id="requesting_slot">Deciding when your show is released</h1>
</header>
<p>
The HPR Schedule is entirely community driven, so <strong>you decide</strong> when your show will be released.
Once you have your audio ready you can post your show by going to the <a href="<!--% hub_baseurl %-->calendar.php">Calendar</a>
page.
</p>
<p>
New hosts, Interviews, and other time critical shows should use the <a href="<!--% hub_baseurl %-->calendar.php">first free slot</a>.
</p>
<p>
Otherwise, when the queue is filling up then <a href="https://repo.anhonesthost.net/HPR/hpr_documentation/src/branch/main/queue.md">leave some free slots</a>
for new contributors.
</p>
<details>
<summary id="reserve_pool">If you <strong>do not care</strong> when your show will be released,
then you can just <a href="https://hub.hackerpublicradio.org/request.php?id=9999">add it to the reserve pool</a><a href="<!--% absolute_url(baseurl,'contribute.html#reserve_pool') %-->">.</a></summary>
<p>
This is intended for <strong>non urgent shows that are timeless</strong>, as there may be a year or more before the show gets aired.
Reserve shows should <strong>not be dependant</strong> on others in the reserve pool, as they may be posted out of order.
</p>
<p>
The reserve pool shows will be used when there is a gap in the schedule.
Empty slots might be filled by reserve shows up to ten days prior to release.
(Reserve shows are not considered in the "two week" rule).
They will normally be used on a first come first go basis, but there is no guarantee of the posting order.
</p>
<p>
These shows will contain a message alerting listeners to the fact that a reserve show is in use.
The <a href="https://repo.anhonesthost.net/HPR/hpr-tools/src/branch/main/workflow/hpr-prepare-reserve.bash">severity of the message</a>
will increase as the number of reserve shows decrease.
</p>
</details>
<p>
<img src="<!--% absolute_path(baseurl) %-->images/request_a_slot.png" alt="" height="110">
</p>
<details>
<summary id="thank_you">You should then see a <strong>thank you page</strong><a href="<!--% absolute_url(baseurl,'contribute.html#thank_you') %-->">.</a></summary>
<p>
<img src="<!--% absolute_path(baseurl) %-->images/email_thank_you_for_uploading.png" alt="" height="110">
</p>
</details>
<p>
The thank you page, and confirmation email, both contain all the information we collect about you.
</p>
</article>
<hr class="no-css">
<article>
<header>
<p class="index-link"><a href="/contribute.html#TOP">↑ Go to top</a></p>
<h1 id="confirmation_email">Confirmation Email</h1>
</header>
<p>
We will then send you a <strong>unique link</strong> which you can use to upload your show.
</p>
<details>
<summary id="marked_as_spam">The Confirmation Email may be <strong>marked as spam</strong><a href="<!--% absolute_url(baseurl,'contribute.html#marked_as_spam') %-->">.</a></summary>
<p>
The email should arrive within seconds of you pressing <em>next</em> above.
We have had reports that sometimes gmail and hotmail consider the messages as spam.
If it is not there within five minutes, then please check your <strong>spam</strong> folder.
</p>
<img src="<!--% absolute_path(baseurl) %-->images/gmail-spam.png" alt="" height="110">
<p>
Please consider <a href="https://www.wikihow.com/Whitelist-an-Email" target="_blank">whitelisting</a>
the email address <em>robot@hobbypublicradio.com</em>.
</p>
</details>
<details>
<summary id="reservation_time_limit">The reservation expires after <strong>15 Minutes</strong><a href="<!--% absolute_url(baseurl,'contribute.html#reservation_time_limit') %-->">.</a></summary>
<p>
You have 15 minutes to open this link or your reservation will automatically be deleted so that the slot can become available to another host.
</p>
</details>
<details>
<summary id="slot_time_limit">The slot will be released after <strong>4 hours</strong><a href="<!--% absolute_url(baseurl,'contribute.html#slot_time_limit') %-->">.</a></summary>
<p>
Once you open the link, you have a maximum of 4 Hours to post your show.
If you do not do so then the entire reservation will be removed so another host can avail of the slot.
</p>
</details>
<details>
<summary id="same_ip_address">You must upload from the <strong>same IP Address</strong><a href="<!--% absolute_url(baseurl,'contribute.html#same_ip_address') %-->">.</a></summary>
<p>
As a security measure, you must upload your show for the same IP Address as your reservation.
</p>
<p>
Errors resulting from this may be caused by:
<ul>
<li>Making a request on one network (work), and processing it on another (home)</li>
<li>Your ISP is using NAT, and is assigning a new ip from the pool for the next request</li>
<li>You are using a VPN, and the IP address changed.</li>
<li>Your router rebooted and you got a new IP address.</li>
<li>You switched from 5G to WiFi.</li>
</ul>
</p>
</details>
<details>
<summary id="one_open_reservation">You can only reserve <strong>one show at a time</strong><a href="<!--% absolute_url(baseurl,'contribute.html#one_open_reservation') %-->">.</a></summary>
<p>
As a security measure, we do not allow multiple reservations.
Your first show must be posted before you can reserve a slot for your second.
</p>
</details>
<details>
<summary id="what_we_log">We share <strong>what we log</strong><a href="<!--% absolute_url(baseurl,'contribute.html#what_we_log') %-->">.</a></summary>
<p>
We log the date you uploaded, from which IP Address you used, and your user agent.
Once your show is processed this information is removed from the database.
</p>
</details>
<details>
<summary id="delete_a_reservation">You can also <strong>delete the reservation</strong><a href="<!--% absolute_url(baseurl,'contribute.html#delete_a_reservation') %-->">.</a></summary>
<p>
Click on the link supplied, and select "<em>Delete this reservation ...</em>" at the bottom of the page.
</p>
</details>
<p>
<img src="<!--% absolute_path(baseurl) %-->images/email_confirmation_of_request_to_reserve.png" alt="" height="110">
</p>
</article>
<hr class="no-css">
<article>
<header>
<p class="index-link"><a href="/contribute.html#TOP">↑ Go to top</a></p>
<h1 id="uploading_an_episode">Uploading an Episode</h1>
</header>
<p>
When you click on the link sent by email, you can manage both the episode, and information about yourself that is displayed on HPR.
</p>
<p>
<strong>All information you provide will be displayed publicly</strong>.
</p>
<p>
The only exception is that your email address will be sent
in the feed with some anti-spam additions.
For example <em>hpr@example.com</em> will become <em>hpr.nospam@nospam.example.com</em>
</p>
<h2 id="personal_information">Personal Information</h2>
<p>
Your profile information is used on the website, in the RSS feeds, and on social media sites.
</p>
<details>
<summary id="profile_email"><strong>email:</strong> <em>already populated</em><a href="<!--% absolute_url(baseurl,'contribute.html#email') %-->">.</a></summary>
<p>
Your email is the one provided in the request form earlier.
</p>
<p>
Please always use <strong>the same email</strong> for HPR, as otherwise we will consider you a new host.
<a href="<!--% absolute_url(baseurl,'about.html#contact') %-->">Contact</a> the Janitors and they will change your email address for you.
</p>
<p>
Some hosts like to set up an email alias, or add a <em>+hpr</em> <a href="https://www.howtogeek.com/plus-sub-email-addressing/">after their email name</a>.
Expand <a href="<!--% absolute_url(baseurl,'contribute.html#email_address') %-->">the notes above</a> for more information.
</p>
</details>
<details>
<summary id="profile_image"><strong>image:</strong> Your profile picture/avatar<a href="<!--% absolute_url(baseurl,'contribute.html#profile_image') %-->">.</a></summary>
<p>
<em>Optional</em>
</p>
<p>
If you have a <a href="https://en.gravatar.com/">Gravatar</a> image associated with an email address, then we will use that.
Otherwise you can upload a profile image.
</p>
</details>
<details>
<summary id="profile_name_handle"><strong>Name/Handle:</strong> How you wish to be known<a href="<!--% absolute_url(baseurl,'contribute.html#profile_name_handle') %-->">.</a></summary>
<p><em>Mandatory</em></p>
<p>
It should be the name you wish to be known as on HPR. It can be your real name, an Internet handle or both.
<a href="<!--% absolute_url(baseurl,'about.html#contact') %-->">Contact</a> the Janitors and they will change your Handle for you.
</p>
</details>
<details>
<summary id="profile_default_license"><strong>Your Default license:</strong> defaults to CC-BY-SA<a href="<!--% absolute_url(baseurl,'contribute.html#profile_default_license') %-->">.</a></summary>
<p>
This field tells us what your work is normally licensed under.
</p>
<p>
We recommend you use a <a href="https://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)</a> license.
That means that while you continue to retain the copyright to your show you are allowing us (and everyone else) to use it; provided we give you attribution
and that we release it under the same license.
</p>
<p>
We allow the following licenses:
<ul>
<li><a href="https://wiki.creativecommons.org/wiki/CC0">CC 0</a> - This is a public domain license.</li>
<li><a href="https://creativecommons.org/licenses/by/4.0/">CC BY</a> - This license is similar to a MIT/BSD source software license.</li>
<li><a href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA</a> - This license is similar to a copyleft free and open source software license and is our default license.</li>
<li><a href="https://opensource.org/licenses">Other</a> - This is for other OSI Approved Licenses.</li>
</ul>
</p>
</details>
<details>
<summary id="profile"><strong>Profile:</strong> Where people can find more information about you<a href="<!--% absolute_url(baseurl,'contribute.html#profile') %-->">.</a></summary>
<p>
<em>Optional</em>
</p>
<p>
Enter some text about yourself with links to your blog or other online presence.
You can use the <a href="https://en.wikipedia.org/wiki/WYSIWYG">what you see is what you get</a>/WYSIWYG
editor to format your profile as you would like to see it rendered.
</p>
</details>
<p>
You can change your profile information at any time, by submitting another show.
</p>
<img src="<!--% absolute_path(baseurl) %-->images/upload_form.png" alt="" height="110">
<h2 id="episode_information">Episode Information</h2>
<p>
Your show information is used on the website, in the RSS feeds, and on social media sites.
</p>
<details>
<summary id="episode_title"><strong>Title:</strong> A descriptive title<a href="<!--% absolute_url(baseurl,'contribute.html#episode_title') %-->">.</a></summary>
<p><em>Mandatory</em></p>
<p>
This will be a short 100 character descriptive title and will be used everywhere to identify your show.
Any valid utf-8 character is acceptable, but keep the length short and clear.
</p>
</details>
<details>
<summary id="episode_short_summary"><strong>Summary:</strong> A short summary of what your show is about<a href="<!--% absolute_url(baseurl,'contribute.html#episode_short_summary') %-->">.</a></summary>
<p><em>Mandatory</em></p>
<p>
This is a short 100 character summary of what your show is about.
Please fill this out as it is used once the show has gone off the main page, on the mobile site,
on printed brochures, on text to speech announcements, on <a href="https://infosec.exchange/@hpr">Mastodon</a> etc.<br>
Please refer to yourself in the <strong>third person</strong>. Instead of "<em>I talk ...</em>", rather use ""<em>Bob talks ...</em>".</li>
</p>
</details>
<details>
<summary id="episode_explicit"><strong>Explicit:</strong> If your show is <em>Explicit</em> or <em>Clean</em><a href="<!--% absolute_url(baseurl,'contribute.html#') %-->">.</a></summary>
<p><em>Mandatory</em></p>
<p>
See <a href="https://web.archive.org/web/20150326185817/http://www.apple.com/uk/itunes/podcasts/specs.html">iTunes</a> for more information.
We flag HPR as Explicit by default but you are free to mark it <em>Clean</em> if you wish.
Expand <a href="<!--% absolute_url(baseurl,'contribute.html#explicit_content') %-->">the note about explicit content</a> above.
</p>
</details>
<details>
<summary id="episode_license"><strong>License:</strong> defaults to CC-BY-SA<a href="<!--% absolute_url(baseurl,'contribute.html#episode_license') %-->">.</a></summary>
<p><em>Mandatory</em></p>
<p>
This field tells us what your work is licensed under.
</p>
<p>
We recommend you use a <a href="https://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)</a> license.
That means that while you continue to retain the copyright to your show you are allowing us (and everyone else) to use it; provided we give you attribution
and that we release it under the same license.
</p>
<p>
We allow the following licenses:
<ul>
<li><a href="https://wiki.creativecommons.org/wiki/CC0">CC 0</a> - This is a public domain license.</li>
<li><a href="https://creativecommons.org/licenses/by/4.0/">CC BY</a> - This license is similar to a MIT/BSD source software license.</li>
<li><a href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA</a> - This license is similar to a copyleft free and open source software license and is our default license.</li>
<li><a href="https://opensource.org/licenses">Other</a> - This is for other OSI Approved Licenses.</li>
</ul>
</p>
</details>
<details>
<summary id="episode_show_notes"><strong>Show Notes:</strong> Enter a description about your show, including links to the topics you discussed.<a href="<!--% absolute_url(baseurl,'contribute.html#episode_show_notes') %-->">.</a></summary>
<p><em>Mandatory</em></p>
<p>
If you allow JavaScript, you can use the <a href="https://en.wikipedia.org/wiki/WYSIWYG">what you see is what you get</a>/WYSIWYG editor buttons to add additional formatting.
It supports, Headings, Number and Bullet lists, Bold, Italic, Underline, and Strike through formatting, Code Blocks, Blockquotes, and links.
</p>
<p>
You can include images as well. We <strong>automatically create thumbnails</strong>,
so please upload and place the full size images in the notes.
Add the descriptive text under the image.
</p>
<p>
Optionally - You can paste in <strong>Rendered</strong> HTML but we will remove any styling.
</p>
<p>
<strong>Do not paste un-rendered markup (HTML, Markdown, RestructuredText)</strong> unless your intention is to have un-rendered markup as shownotes.
</p>
<p>
It is important to provide good show notes because:
<ul>
<li><strong>They provide the listeners with more information on the topic.</strong><br>
You have taken the time to record a show on a topic, so many people will want to find out more on the subject,
therefore you should include links to give more information. It is not enough to just give it in the show itself
as people may be listening while away from the Internet, and they may have forgotten or misheard your links.
</li>
<li><strong>You are making more work for the Janitors.</strong><br>
It is always better if you send us show notes yourself as you know best what information you are trying to convey.
If you do not supply show notes then your show notes will need to be edited manually by an HPR volunteer.
As we do not listen to the show when posting, your show will first be added without show notes.
Once it has been published in the <a href="<!--% absolute_url(baseurl,'syndication.html#feed_future') %-->">Future Feed</a>
we can listen to it and create the show notes.
Once they are done we then need to go back and republish the show to the website.
We also need to edit the Internet Archive page created for your show.
This runs the risk that the podcast platforms will not pick up the change.
</li>
<li><strong>They encourage people to download your show.</strong><br>
We produce a lot of shows and many people download based on the text in the show notes.
If the show notes are not descriptive then it is less likely that
it will get as many downloads as other shows with good show notes.</li>
<li><strong>They allow your show to be indexed by search engines.</strong><br>
Search engines cannot determine the content of your show from the audio alone.
The only way for your show to be indexed is for you to describe in the associated text what you say in the audio.</li>
<li><strong>They make your show accessible to the deaf and hard of hearing.</strong><br>
Your audio is completely inaccessible to those who have hearing problems,
It helps them 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>
</ul>
</p>
</details>
<details>
<summary id="episode_series"><strong>Series:</strong> Select a series from the drop down<a href="<!--% absolute_url(baseurl,'contribute.html#') %-->">.</a></summary>
<p><em>Optional</em></p>
<p>
See if your show fits into a <a href="<!--% absolute_url(baseurl) %-->series/index.html">series</a>.
</p>
</details>
<details>
<summary id="episode_tags"><strong>Tags:</strong> Add a list of comma separated tags<a href="<!--% absolute_url(baseurl,'contribute.html#episode_tags') %-->">.</a></summary>
<p><em>Mandatory</em></p>
<p>
Pick the most important words from the show notes.
Your tags are added as <a href="https://en.wikipedia.org/wiki/Hashtag">#hashtags</a> on social media.
This helps people find your show by topic keyword on our
<a href="<!--% absolute_url(baseurl,'search.html#tags') %-->">tags page</a>.
</p>
</details>
<details>
<summary id="episode_upload_method"><strong>Upload Method:</strong> How you are going to send us your audio<a href="<!--% absolute_url(baseurl,'contribute.html#'episode_upload_method) %-->">.</a></summary>
<p><em>Mandatory</em></p>
<ul>
<li id="episode_upload_method_browser"><strong>Upload now via this browser</strong><br>
You can upload single or multiple files using this method.
Chrome will display the percentage uploaded, but in Firefox you will need to just wait.
</li>
<li id="episode_upload_method_url"><strong>Provide a url for us to get it from</strong><br>
Using this option may cause delays as a HPR volunteer will need to troubleshoot any issues that may occur,
and this can result in your show not been posted on time.
This must be publicly accessable using a curl or wget command.
Please avoid services that require login or downloading via a browser.
</li>
</ul>
<p>
If you want to submit an additional file with your show, then put them in a zip, or tgz file.
Link to them using just the file name "<em>example_output.pdf</em>" without any paths.
Do not add any additional images this way, just include them in the show notes.
</p>
<p>
If you provide a subtitle, transcript with your upload we will automatically use that.
<code>
<pre>
whisper --language en --output_format srt myshow.flac
</pre>
</code>
</p>
<p>
Will produce a <em>srt</em> file with the same name as your audio.
You can then edit the text but leave the timing in place.
</p>
<p>
<code>
<pre>
$ ls myshow.*
myshow.flac myshow.srt
</pre>
</code>
</p>
<p>
During the upload hold the <em>Ctrl</em> key and click on both files.
You should see <em>Two Files Selected</em> next to the Browse button.
</p>
</details>
<p>
The slots will only be allocated once the shows have been successfully processed.
Any missing information can result in a show missing the requested slot.
</p>
<p>
Press <strong>submit</strong> and your show will be sent to the HPR Volunteers to be processed.
Keep an eye on the <a href="<!--% hub_baseurl %-->calendar.php">calendar</a> for when it is posted.
For more information on the process of <a href="https://repo.anhonesthost.net/HPR/hpr_documentation/src/branch/main/workflow/uploading_a_show.md">Uploading a show</a>
and <a href="https://repo.anhonesthost.net/HPR/hpr_documentation/src/branch/main/workflow/processing_a_show.md">Show Processing</a> can be found on our GitTea repo.
</p>
</div>

View File

@@ -1,51 +1,75 @@
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
<!--% PROCESS 'shared-avatar.tpl.html' %-->
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% 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) %-->
<!--% hpr_result_status = results_hpr_show_count.execute(id); %-->
<!--% hpr_shows = results_hpr_shows.execute(id); %-->
<!--% hpr_show_count = results_hpr_show_count.fetchrow_array %-->
<!--% PROCESS "queries-correspondent-${constants.database}.tpl.html" %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% query_hpr_show_count = DBI.prepare('
SELECT id
FROM eps
WHERE eps.hostid = ?
')
%-->
<!--% results_hpr_shows = DBI.prepare(query_hpr_shows)
%-->
<!--% hpr_shows_to_count = query_hpr_show_count.execute(id); %-->
<!--% hpr_shows = results_hpr_shows.execute(id); %-->
<!--% hpr_show_count = 0 %-->
<!--% FOREACH show IN hpr_shows_to_count %-->
<!--% hpr_show_count = hpr_show_count +1; %-->
<!--% END %-->
<!--% results_hpr_shows = DBI.prepare(query_twt_shows) %-->
<!--% results_twt_show_count = DBI.prepare(query_twt_show_count) %-->
<!--% twt_result_status = results_twt_show_count.execute(id); %-->
<!--% twt_shows = results_hpr_shows.execute(id); %-->
<!--% twt_show_count = results_twt_show_count.fetchrow_array %-->
<!--% query_twat_show_count = DBI.prepare('
SELECT id
FROM twat_eps AS eps
WHERE eps.hostid = ?
')
%-->
<!--% query_twat_shows = DBI.prepare('
SELECT
eps.id,
CASE eps.explicit WHEN 1 THEN \'Explicit\' ELSE \'Clean\' END AS 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 twat_eps AS eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
WHERE hosts.hostid = ?
ORDER BY eps.id DESC
')
%-->
<!--% twat_shows_to_count = query_twat_show_count.execute(id); %-->
<!--% twat_shows = query_twat_shows.execute(id); %-->
<!--% twat_show_count = 0 %-->
<!--% FOREACH show IN twat_shows_to_count %-->
<!--% twat_show_count = twat_show_count +1; %-->
<!--% END %-->
<!--% hosts = DBI.tie('hosts', 'hostid') %-->
<!--% hosts = DBI.tie('hosts', 'hostid') %-->
<!--% this_host = hosts.$id %-->
<!--% page_title = "HPR ~ Host: " _ this_host.host %-->
<h2 class="title">Correspondent</h2>
<div id="host" class="lane">
<div id="host_id">
<h2><!--% this_host.host %--></h2>
<p><!--% get_avatar(this_host.hostid, this_host.host) %--><br>
<label>Host ID</label>: <!--% this_host.hostid %--></p>
</div>
<div id="host_meta">
<p><label>email:</label> <u><!--% this_host.email %--></u></p>
<div><label>profile:</label> <!--% this_host.profile %--></div>
<p><label>episodes:</label> <strong><!--% hpr_show_count + twt_show_count %--></strong></p>
<p><a href="<!--% absolute_url(baseurl,'//correspondents') %-->/<!--% zero_pad_left(this_host.hostid) %-->/playlist.m3u8">Download the M3U playlist</a>.</p>
</div>
</div>
<div id="episodes" class="lane stack">
<!--% FOREACH hpr_show IN hpr_shows; %-->
<article>
<!--% show_summary(hpr_show, 'hide_host') %-->
<p class="listen-in"><!--% display_listen_in(hpr_show.id) %--></p>
</article>
<!--% END %-->
<!--% FOREACH twt_show IN twt_shows; %-->
<article>
<article>
<!--% this_host = hosts.$id %-->
<h2 class="title">Correspondent</h2>
<h2><!--% this_host.host %--></h2>
<p><!--% get_avatar(this_host.hostid, this_host.host) %--><br>
<label>Host ID</label>: <!--% this_host.hostid %--><br><br>
<label>email:</label> <u><!--% this_host.email %--></u><br>
<label>profile:</label> <!--% this_host.profile %--><br><br>
<label>episodes:</label> <strong><!--% hpr_show_count + twat_show_count %--></strong>
</p>
<!--% FOREACH hpr_show IN hpr_shows; %-->
<!--% twt_show_summary(twt_show, 'hide_host') %-->
<p class="listen-in"><!--% display_listen_in(twt_show.id,"twt") %--></p>
</article>
<!--% END %-->
</div>
<p><a href="<!--% absolute_url(baseurl) %-->../about.html#so_you_want_to_record_a_podcast">Become a Correspondent</a></p>
<!--% show_summary(hpr_show, 'hide_host') %-->
<p class="listen-in"><!--% display_listen_in(hpr_show.id) %--></p>
<!--% END %-->
<!--% FOREACH twat_show IN twat_shows; %-->
<!--% twat_show_summary(twat_show, 'hide_host') %-->
<p class="listen-in"><!--% display_listen_in(twat_show.id,"twat") %--></p>
<!--% END %-->
</article>
<p><a href="<!--% absolute_url(baseurl) %-->about.html#so_you_want_to_record_a_podcast">Become a Correspondent</a></p>

View File

@@ -1,35 +1,33 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS 'shared-avatar.tpl.html' %-->
<!--% page_title = "HPR ~ Hosts/Correspondents" %-->
<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) %-->
<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) %-->
<!--% host_cnt = 0 %-->
<table id="hosts" class="hosts lane stack">
<tbody class="lane stack">
<tr class="no-css">
<th>Avatar</th>
<th>Name &amp; Host ID</th>
<th>License</th>
<th>Last Show</th>
</tr>
<table class="hosts">
<th >Avatar</th>
<th >Name &amp; Host ID</th>
<th >License</th>
<th >Last Show</th>
<!--% FOREACH host IN DBI.query(
'select h.hostid, h.host, h.license, e.date,
h.local_image
from hosts as h
inner join (select hostid, max(date) as date from eps group by hostid) as e
on h.hostid = e.hostid
order by h.host COLLATE NOCASE asc'
order by h.host'
) %-->
<tr class="lane">
<tr height="80">
<td><!--% get_avatar(host.hostid, host.host, host_cnt > 8) %--></td>
<td><a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(host.hostid) %-->.html"><strong><!--% host.host %--></strong><br>
Host ID: <!--% host.hostid %--></a></td>
<td><strong><!--% host.host %--></strong><br>
Host ID: <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(host.hostid) %-->.html"><!--% host.hostid %--></a></td>
<td><!--% host.license %--></td>
<td><!--% host.date %--></td>
</tr><!--% host_cnt = host_cnt + 1 %-->
<!--% END %-->
</tbody>
</table>
<p><a href="<!--% absolute_url(baseurl) %-->../about.html#so_you_want_to_record_a_podcast">Become a Correspondent</a></p>
<p><a href="<!--% absolute_url(baseurl) %-->about.html#so_you_want_to_record_a_podcast">Become a Correspondent</a></p>
</article>

View File

@@ -1,57 +0,0 @@
<!--% page_title = "HPR ~ Download all the episodes" %-->
<article>
<header>
<h1>Download Archive</h1>
<p>Please be aware that our Archive exceeds <strong>62Gb</strong> <em>(Ogg: 21Gb, Spx: 16Gb, mp3: 25Gb)</em>. We are happy for you to download them, but please make sure that you are not going to incur additional bandwidth charges on your side.</p>
<p>We will be happy to post you DVD's of the episodes anywhere in the world if bandwidth is an issue.</p>
</header>
<h2>Full Episode Guide</h2>
<p>
The <a href="./eps/index.html">compete episode guide</a> is available to you, and it lists all the shows on one page going right back to the very first episode.
</p>
<h2>Command line download</h2>
<p>
You can download the audio of the episodes directly from the command line using the following commands:
</p>
<ul>
<li>ogg:<br />
<span style="font-family:monospace;">curl 'https://www.hackerpublicradio.org/eps/hpr[0001-3657].ogg' -o "hpr#1.ogg"</span></li>
<li>spx:<br />
<span style="font-family:monospace;">curl 'https://www.hackerpublicradio.org/eps/hpr[0001-3657].spx' -o "hpr#1.spx"</span></li>
<li>mp3:<br />
<span style="font-family:monospace;">curl 'https://www.hackerpublicradio.org/eps/hpr[0001-3657].mp3' -o "hpr#1.mp3"</span></li>
</li>
</ul>
<h2>Full RSS feed, BitTorrent and Magnet links</h2>
<p>The full rss feed is updated daily and contains the complete show note with links to supporting articles. The torrent/magnet also contains this information and is a snaphot of the archive taken between 2007 and November 2013. </p>
<ul>
<li><span style="font-family:monospace;">ogg: <a href="hpr_total_ogg_rss.php">rss</a>, <a href="https://www.talkgeektome.us/torrents/HPR-Ogg-2007-Nov2013.torrent">torrent</a>, <a href="magnet:?xt=urn:btih:390C66903BBB2B6A067C438C70B2E90988AA8207&dn=HPR-Ogg-2007-Nov2013&tr=http%3A%2F%2Ftracker.info-underground.net%3A16880%2Fannounce">magnet</a></span></li>
<li><span style="font-family:monospace;">spx: <a href="hpr_total_spx_rss.php">rss</a>, <a href="https://www.talkgeektome.us/torrents/HPR-Mp3-2007-Nov2013.torrent">torrent</a>, <a href="magnet:?xt=urn:btih:E2573BEF0209B8C2E3C7908BAF220EC34D4A5B8E&dn=HPR-Speex-2007-Nov2013&tr=http%3A%2F%2Ftracker.info-underground.net%3A16880%2Fannounce">magnet</a></span></li>
<li><span style="font-family:monospace;">mp3: <a href="hpr_total_rss.php">rss</a>, <a href="https://www.talkgeektome.us/torrents/HPR-Mp3-2007-Nov2013.torrent">torrent</a>, <a href="magnet:?xt=urn:btih:6E9492AD78BCCA2B8D6A42C9C0BCAB0E6FA778F8&dn=HPR-Mp3-2007-Nov2013&tr=http%3A%2F%2Ftracker.info-underground.net%3A16880%2Fannounce">magnet</a></span></li>
</ul>
<h3>Direct download of the remaining shows</h3>
<p>
You can download the remaining episodes since the torrent was created directly from the command line using the following commands:
</p>
<ul>
<li>ogg:<br />
<span style="font-family:monospace;">curl 'https://www.hackerpublicradio.org/eps/hpr[1391-3657].ogg' -o "hpr#1.ogg"</span>
</li>
</li>
</ul>
<ul>
<li>spx:<br />
<span style="font-family:monospace;">curl 'https://www.hackerpublicradio.org/eps/hpr[1391-3657].spx' -o "hpr#1.spx"</span>
</li>
</li>
</ul>
<ul>
<li>mp3:<br />
<span style="font-family:monospace;">curl 'https://www.hackerpublicradio.org/eps/hpr[1391-3657].mp3' -o "hpr#1.mp3"</span>
</li>
</li>
</ul>
<footer>
<p>Big to DeepGeek and the team for providing the BitTorrent service.</p>
</footer>
</article>

View File

@@ -3,14 +3,13 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS 'shared-listen-now.tpl.html' %-->
<!--% PROCESS 'shared-show-transcript.tpl.html' %-->
<!--% PROCESS "queries-episode.tpl.html" %-->
<!--% PROCESS "queries-episode-${constants.database}.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) %-->
<!--% FOREACH episode IN episode_result %-->
<!--% in_window = ( episode.id > episode.latest || episode.id < ( episode.latest - 20 ) ? 0 : 1 ) %-->
<!--% episode_navigation = step_navigation(baseurl,episode) %-->
<!--% page_title = "HPR" _ zero_pad_left(episode.id) _ "::" _ episode.title %-->
<article>
<header>
<h1>hpr<!--% zero_pad_left(episode.id) %--> :: <!--% episode.title %--></h1>
@@ -18,17 +17,19 @@
<p class="meta"><!--% episode_navigation %-->
</p>
<p><!--% show_avatar(episode.hostid, episode.host) %-->
Hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(episode.hostid) %-->.html"><!--% episode.host %--></a> on <span><!--% day_and_date(episode.date) %--></span> is flagged as <span><!--% display_explicit(episode.explicit) %--></span> and is released under a <span><!--% episode.license %--> license</span>. <br>
Hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(episode.hostid) %-->.html"><!--% episode.host %--></a> on <span><!--% episode.date %--></span> is flagged as <span><!--% display_explicit(episode.explicit) %--></span> and is released under a <span><!--% episode.license %--> license</span>. <br>
<!--% display_tags(episode.tags) %-->
<label>Comments: </label><!--% display_comments_tally(episode.id, episode.eps_tally) %--> <br>
The show is available on the Internet Archive at: <a href="https://archive.org/details/hpr<!--% zero_pad_left(episode.id) %-->">https://archive.org/details/hpr<!--% zero_pad_left(episode.id) %--></a>
<!--% listen_now(episode, "hpr", baseurl, media_baseurl) %-->
</p>
<h3><!--% show_series(episode.series, episode.seriesid, "Part of the series") %--></h3>
<p><em><!--% episode.series_description %--></em></p>
</header>
<div id="show_notes"><!--% episode.notes %--></div>
<div><!--% episode.notes %--></div>
<footer>
<!--% show_transcript(episode, "hpr", baseurl, media_baseurl) %-->
<p>
<!--% episode_navigation %-->
</p>
@@ -55,18 +56,18 @@ Subscribe to the comments <a href="<!--% absolute_path(baseurl) %-->comments.rss
<!--% FOREACH comment IN comments_result %-->
<h5 id="comment_<!--% comment.id %-->"><a href="/eps/hpr<!--% zero_pad_left(episode.id) %-->/index.html#comment_<!--% comment.id %-->">Comment #<!--% comment_index %--></a> posted on <!--% comment.comment_timestamp %--> by <!--% comment.comment_author_name %--></h5>
<h4><!--% comment.comment_title %--></h4>
<p class="comment"><!--% comment.comment_text FILTER html_line_break %--></p>
<!--% comment_index = comment_index + 1 %-->
<!--% comment.comment_text FILTER html_para %-->
<!--% comment_index = comment_index + 1 %-->
<!--% END %-->
<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="<!--% absolute_url(baseurl) %-->../../about.html#so_you_want_to_record_a_podcast">record</a> a response show instead.
If you can't fit everything you want to say in the comment below then you really should <a href="<!--% absolute_url(baseurl) %-->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="<!--% absolute_url(baseurl) %-->../../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>.
All comments are moderated. All links are checked by humans. We strip out all html. Feel free to <a href="<!--% absolute_url(baseurl) %-->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="<!--% hub_baseurl %-->comment_confirm.php">
<fieldset>
@@ -109,18 +110,9 @@ Subscribe to the comments <a href="<!--% absolute_path(baseurl) %-->comments.rss
</tr>
<!-- . -->
<tr>
<td>Who is the <strong>host</strong> of this show?</td>
<td>What is the <strong>HOST_ID</strong> for the host of this show?</td>
<td>
<select required name="hostid" id="hostid">
<option value="Spammer" selected="selected">Spammer</option>
<option value="Spammer">Linus Torvalds</option>
<option value="Spammer">Marie Curie</option>
<option value="<!--% episode.hostid %-->"><!--% episode.host %--></option>
<option value="Spammer">Alan Turing</option>
<option value="Spammer">Terry Pratchett</option>
<option value="Spammer">Yuri Gagarin</option>
</select>
<td>
<input required type="text" name="hostid" size="20" maxlength="5" placeholder="Type the host number"></td>
<td>
<!-- . -->
<tr>

View File

@@ -1,27 +1,24 @@
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
<!--% PROCESS "queries-episodes.tpl.html" %-->
<!--% page_title = "HPR ~ All the shows" %-->
<h1>Complete Archive of Shows.</h1>
<!--% PROCESS "queries-episodes-${constants.database}.tpl.html" %-->
<article>
<header>
<h1>Complete Archive of Shows.</h1>
<p>
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>
<div class="lane stack">
<!--% USE DBI(constants.driver) %-->
</header>
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% FOREACH episodes IN DBI.query(query_episodes)
%-->
<article>
<!--% show_summary(episodes) %-->
<p class="listen-in"><!--% display_listen_in(episodes.id) %--></p>
</article>
<!--% END %-->
</div>
<h2 id="twt_episodes">Today With a Techie Archived Shows</h2>
<h2 id="twat_episodes">Today With a Techie Archived Shows</h2>
<p>
<!-- Creative Commons License -->
<a rel="license" href="https://creativecommons.org/licenses/by-nc-sa/2.5/"><img alt="Creative Commons License" border="0" src="https://creativecommons.org/images/public/somerights20.png" width="88" height="31" /></a><br>The following work is licensed under a <a rel="license" href="https://creativecommons.org/licenses/by-nc-sa/2.5/">Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License</a>.</p>
<p>Today With a Techie Radio was brought to you by <a href="https://en.wikipedia.org/wiki/Infonomicon">The Infonomicon Computer Club</a></p>
<div class="lane stack">
<!--% FOREACH twt_episode IN DBI.query('
<!--% FOREACH twat_episode IN DBI.query('
SELECT
eps.id,
eps.explicit,
@@ -30,16 +27,14 @@
hosts.hostid,
hosts.host, hosts.email, hosts.local_image,
miniseries.name AS series, miniseries.id AS seriesid
FROM twt_eps as eps
FROM twat_eps as eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
ORDER BY eps.id DESC
')
%-->
<article>
<!--% twt_show_summary(twt_episode) %-->
</article>
<!--% twat_show_summary(twat_episode) %-->
<!--% END %-->
</div>
</article>

View File

@@ -1,4 +1 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% IF date.format(date.now, '%m') == 11 || date.format(date.now, '%j') == 1 %-->
<!--% PROCESS 'content-new_year_show_announcement.tpl.html' %-->
<!--% END %-->

View File

@@ -3,7 +3,8 @@
<!--% PROCESS 'shared-listen-now.tpl.html' %-->
<!--% PROCESS 'shared-show-transcript.tpl.html' %-->
<!--% PROCESS 'shared-call_for_shows.tpl.html' %-->
<!--% PROCESS "queries-index.tpl.html" %-->
<!--% INCLUDE 'content-index-announcement.tpl.html' %-->
<!--% PROCESS "queries-index-${constants.database}.tpl.html" %-->
<!--% MACRO tidy_notes(all_lines) BLOCK %-->
<!--% lines = all_lines %-->
<!--% after_html = all_lines %-->
@@ -22,8 +23,13 @@
<!--% 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) %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% USE date %-->
<!--% calc = date.calc %-->
<!--% episodes = DBI.query(query_next_available_episode).get_all() %-->
@@ -34,111 +40,47 @@
<!--% 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')) %-->
<section id="welcome">
<p><!--% make_sfw(is_sfw, "Hobby", "Hacker") %--> Public Radio is a technology focused podcast that releases shows every weekday Monday to Friday. Our shows are produced by listeners like you and can be on any topic that is of interest to <!--% make_sfw(is_sfw, "hobbyists", "hackers, hobbyists") %-->, makers, etc. We are a welcoming community that offers positive feedback and encourages respectful debate.</p>
<!--% PROCESS 'content-index-announcement.tpl.html' %-->
<div id="call_for_shows">
<!--% display_call_for_shows() %-->
</div>
</section>
<section id="podcast_lane">
<header><h2>The Podcast</h2></header>
<div class="lane">
<a class="lane-button" href="<!--% absolute_path(baseurl) %-->contribute.html">
<img src="<!--% absolute_path(baseurl) %-->images/icons/mic-fill.svg" alt="" height="110">
<p>Record</p>
</a>
<br class="no-css">
<a class="lane-button" href="<!--% hub_baseurl %-->calendar.php">
<img src="<!--% absolute_path(baseurl) %-->images/icons/calendar-2-line.svg" alt="" height="110">
<p>Schedule</p>
</a>
<br class="no-css">
<a class="lane-button" href="<!--% absolute_path(baseurl) %-->syndication.html">
<img src="<!--% absolute_path(baseurl) %-->images/icons/rss-fill.svg" alt="" height="110">
<p>Subscribe</p>
</a>
<br class="no-css">
<a class="lane-button" href="<!--% absolute_path(baseurl) %-->eps/index.html">
<img src="<!--% absolute_path(baseurl) %-->images/icons/volume-up-fill.svg" alt="" height="110">
<p>Listen</p>
</a>
</div>
</section>
<section id="project_lane">
<header><h2>The Project</h2></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="" height="110">
<p>Hosts</p>
</a>
<br class="no-css">
<a class="lane-button" href="<!--% absolute_path(baseurl) %-->series/index.html">
<img src="<!--% absolute_path(baseurl) %-->images/icons/stack-fill.svg" alt="" height="110">
<p>Series</p>
</a>
<br class="no-css">
<a class="lane-button" href="<!--% absolute_path(baseurl) %-->about.html">
<img src="<!--% absolute_path(baseurl) %-->images/icons/question-mark.svg" alt="" height="110">
<p>About</p>
</a>
<br class="no-css">
<a class="lane-button" href="<!--% absolute_path(baseurl) %-->search.html">
<img src="<!--% absolute_path(baseurl) %-->images/icons/search.svg" alt="" height="110">
<p>Search</p>
</a>
</div>
</section>
<section id="latest_lane" class="lane">
<p>We started producing shows as <a href="<!--% absolute_path(baseurl) %-->eps/index.html#twat_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>
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
<section id="latest_shows">
<header><h2>Latest Shows</h2></header>
<h1>Latest Shows</h1>
<!--% host_cnt = 0 %-->
<dl>
<!--% FOREACH latest_episodes IN DBI.query(query_latest_episodes)
%-->
<dt><a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(latest_episodes.id) %-->/index.html">hpr<!--% latest_episodes.id %--> (<!--% latest_episodes.date %-->) :: <!--% latest_episodes.title %--></a> by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(latest_episodes.hostid) %-->.html"><!--% latest_episodes.host %--></a></dt>
<dd>
<!--% latest_episodes.summary %-->
</dd>
<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 <!--% 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) %-->
<footer>
<!--% show_transcript(latest_episodes, "hpr", baseurl, media_baseurl) %-->
</footer>
</article>
<!--% host_cnt = host_cnt + 1 %-->
<!--% END %-->
</dl>
<p><a href="<!--% absolute_path(baseurl) %-->eps/index.html">More Episodes…</a></p>
</section>
<section id="latest_comments">
<header><h2>Latest Comments</h2></header>
<dl>
<!--% 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;
')
<article>
<header>
<hr>
<h1>Previous five weeks</h1>
</header>
<!--% FOREACH last_5_weeks_episodes IN DBI.query(query_last_5_weeks_episodes)
%-->
<dt><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></dt>
<dd>on hpr<!--% item.eps_id %--> (<!--% item.episode_date %-->) "<!--% item.episode_title %-->" by <!--% item.host %--></dd>
<!--% show_summary(last_5_weeks_episodes) %-->
<p class="listen-in"><!--% display_listen_in(last_5_weeks_episodes.id) %--></p>
<!--% END %-->
</dl>
<p><a href="<!--% absolute_path(baseurl) %-->comments_viewer.html">More Comments…</a></p>
</section>
</section>
</article>
<h1>Older Shows</h1>
<p>
Get a <a href="<!--% absolute_path(baseurl) %-->eps/index.html">full list</a> of all our shows.
</p>

View File

@@ -1,112 +0,0 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<h1><u>The <!--% get_new_year_show_ordinal_year %--> Annual 26 Hour New Year's Eve Show</u></h1>
<h2>Welcome every <a href="https://www.timeanddate.com/counters/multicountdown.html">TimeZone</a>!</h2>
<p>
<em>If you keep talking, we'll keep recording.</em>
</p>
<p>For those who don't know, on New Year's Eve <!--% get_new_year_show_start() %-->, we will have a recording going on the HPR Mumble server for anyone to come on and say "Happy New Year" and talk about whatever they want.
We will leave the recording going until at least <!--% get_new_year_show_end() %-->, and keep recording until the conversation stops.</p>
<p>
So please stop in. Say "Hi" and maybe join in the conversation with other HPR listeners and contributors. It's always a good time!!<br />
</p>
<h1>Listen to the live stream</h1>
<p>
<!--% IF ((date.format(date.now, '%m') == 12 && date.format(date.now, '%d') > 28) || date.format(date.now, '%j') == 1) %-->
<img src="images/livestream.png" /><br />
<audio controls autoplay>
<source src="https://files.shownotes.ooguy.com/stream" type="audio/mpeg" >
</audio> <br />
<a href="https://files.shownotes.ooguy.com/stream">https://files.shownotes.ooguy.com/stream</a><br />
<a href="https://hackerpublicradio.org/live">https://hackerpublicradio.org/live</a><br />
<!--% ELSE %-->
<audio controls preload="none">
<source src="<!--% absolute_path(baseurl) %-->promos/hpr-nye-promo.ogg" type="audio/ogg">
</audio>
<!--% END %-->
</p>
<h1>Join the conversation on Mumble</h1>
<h2>Ground Rules</h2>
<h3>Use Push to Talk, and a Headset</h3>
<p>With so many people on the chat, you must use push to talk.
You also need to use a Headset so the audio of the room is not fed back.
If there is a problem with your setup, then please drop and listen to the stream.
Trying to correct poor audio in post is a lot of work, that someone else will have to do.</p>
<h3>Be Polite</h3>
<p>When you enter the room please do not interrupt ongoing conversations.
Wait for a pause in the conversation and say Hi.
It's quite common for people you might not know to join as they wish to speak with other people in the room.
They may have been waiting all year for the chance to meet, so please give people the space to have these conversations.</p>
<h3>Do not announce the Time Zones</h3>
<p>As there are so <a moz-do-not-send="true" href="https://en.wikipedia.org/wiki/Time_zone">many Time Zones</a> there is no need to interrupt the conversation to announce every one.
If you are joining from a time zone that is currently switching to the New Year, then please wait for a pause and wish people Happy New Year.</p>
<h3>Don't Fill Dead Air</h3>
<p>This is a relaxed meet-up, and not a traditional "Radio Broadcast".
If there are no conversations going on at a given time, don't feel the need to "fill dead air".
Before the recording is posted as a podcast the <a href="https://manual.audacityteam.org/man/truncate_silence.html">silences will be truncated</a>.</p>
<h3>Do not monopolise the conversation</h3>
<p>Please be mindful that you (or your beverage of choice) may be speaking too much ;-).</p>
<h3>You are a Guest</h3>
<p>Be respectful, and remember that attendance on the New Year Show does not <a href="https://hub.hackerpublicradio.org/calendar.php">constitute a show</a>.</p>
<h3>CC-BY-SA</h3>
<p>The recording will be released as a podcast on HPR 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.
The recordings will be released mid year, when there is a lull in submissions.</p>
<h2>Mumble Setup</h2>
<p>Already have Mumble installed, then <a href="mumble://chatter.skyehaven.net:64738/Hacker%20Public%20Radio?version=1.2.0">this link will bring you to the HPR Room</a>.</p>
<p>Get the PC Client <a href="https://wiki.mumble.info/wiki/Main_Page">https://wiki.mumble.info/wiki/Main_Page</a><br />
<p>Get the Android Client Mumla <a href="https://f-droid.org/packages/se.lublin.mumla">https://f-droid.org/packages/se.lublin.mumla</a></p>
<p>Then join the Server: <strong>chatter.skyehaven.net</strong><br />
Port: <strong>64738</strong><br />
Channel: <strong>HPR</strong></p>
<p><strong>Use Push to Talk</strong>. With so many people hands free is not an option.</p>
<p>For those who have never used Mumble before, see this <a href="https://hackerpublicradio.org/mumble-howto">how-to explaining the setup of the desktop Mumble client</a>,
or listen to <a href="https://hackerpublicradio.org/eps.php?id=3503">hpr3503 :: Configuring Mumble</a>.</p>
<h3>Video Only (no audio) server</h3>
<p>
For those who wish to see the video of some of the participants we have a jitsi server.<br />
<a href="https://jitsi.minnix.dev/hprnye">https://jitsi.minnix.dev/hprnye</a><br />
<strong>Please make sure your mic is muted!</strong>
</p>
<h3>Add to the Show-notes</h2>
<p>
<strong>Please help fill out the show notes</strong><br />
<a href="https://shownotes.lugcast.mywire.org/p/hpr-nye-2026">https://shownotes.lugcast.mywire.org/p/hpr-nye-2026</a><br />
We are using Etherpad for people to share links and info to things they are discussing.
The Etherpad will be used for the HPR audio shownotes so please feel free to add to it.
The entire event will be broken into 2 to 3 hour segments and made available as HPR episodes.<br/>
<em>This really, really helps us out to post the show faster !</em>
</p>
<h2>History</h2>
<p>Suggested by <a href="https://hackerpublicradio.org/correspondents/0128.html">pokey</a> in 2011.
As podcasting tends to be a one way conversation, he thought it would be nice to get all the FLOSS, Linux, Free Culture, podcasters and Listeners in one place to get together and chat in person.
Initially it was planned to be just a few hours, but we kept missing members from other parts of the world.
The show was extended to welcome ever time zone to the New Year, which actually turns out to be <a href="https://en.wikipedia.org/wiki/List_of_UTC_offsets">38 Timezones</a>, over 26 Hours.</p>
<p>So we will record for at least 26 Hours, but will keep the recording going for an "After Show".
Some years the after show has been even longer than the show itself.
While this is on the HPR Site, it is entirely a community initiative which is supported heavily by the fine folks over at the <a href="https://linuxlugcast.com/">LinuxLugCast</a>, with the Mumble Server been provided by <a href="https://hackerpublicradio.org/correspondents/0228.html">Delwin</a>.</p>

View File

@@ -1,30 +0,0 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<div class="lane stack">
<article>
<header>
<h2 class="title"><a href="<!--% absolute_path(baseurl) %-->new_year.html">The <!--% get_new_year_show_ordinal_year %--> Annual 26 Hour New Year's Eve Show</a></h2>
</header>
<h3>Welcome every <a href="https://www.timeanddate.com/counters/multicountdown.html">TimeZone</a>!</h3>
<p>
<em>If you keep talking, we'll keep recording.</em>
</p>
<p>For those who don't know, on New Year's Eve <!--% get_new_year_show_start() %-->, we will have a recording going on the HPR Mumble server for anyone to come on and say "Happy New Year" and talk about whatever they want.
We will leave the recording going until at least <!--% get_new_year_show_end() %-->, and keep recording until the conversation stops.</p>
<p>
So please stop in. Say "Hi" and maybe join in the conversation with other HPR listeners and contributors. It's always a good time!!<br>
<!--% IF date.format(date.now, '%m') == 11 || date.format(date.now, '%d') < 29 %-->
<audio controls preload="none">
<source src="<!--% absolute_path(baseurl) %-->promos/hpr-nye-promo.ogg" type="audio/ogg">
</audio>
<!--% ELSE %-->
<img src="images/livestream.png" /><br />
<audio controls autoplay>
<source src="https://files.shownotes.ooguy.com/stream" type="audio/mpeg" >
</audio> <br />
<a href="https://files.shownotes.ooguy.com/stream">https://files.shownotes.ooguy.com/stream</a><br />
<a href="https://hackerpublicradio.org/live">https://hackerpublicradio.org/live</a><br />
<!--% END %-->
</p>
<p><a href="<!--% absolute_path(baseurl) %-->new_year.html">More information…</a></p>
</article>
</div>

View File

@@ -1,22 +0,0 @@
<article>
<header>
<h1>Please promote HPR</h1>
</header>
<p>Feel free to use the promotional material to spread the word in your podcasts, or have them played on to other shows.</p>
<h2>General HPR promotion</h2>
<ul>
<li><a href="./media/promos/HPRpromoKlaatu.ogg">Klaatu explains HPR Daily podcast by the www.hackerpublicradio.org Community for the www.hackerpublicradio.org Community</a></li>
<!--<li><a href="../media/promos/HPRpromoNewsCast.ogg">A News Caster tells us about HPR</a></li>
<li><a href="../media/promos/HPRpromoSkirlet.ogg">Skirlet tells us we need to listen to HPR</a></li>-->
</ul>
<h2>Requests for contributions</h2>
<p>
<ul>
<li><a href="./media/promos/Jude-aka-Mrs_Peter64_HPR-needs-shows.flac">Jude Mrs. Peter64 HPR needs shows</a></li>
<li><a href="./media/promos/hpr-contributor-promo-sax.ogg">slick0 basenet theme</a></li>
<li><a href="./media/promos/hpr-contributor-promo-basenettheme.ogg">slick0 sax roll</a></li>
</ul>
</p>
</article>

View File

@@ -1,124 +1,45 @@
<!--% page_title = "HPR ~ Find a show" %-->
<section id="search">
<header>
<h1>Search HPR.</h1>
</header>
<div class="lane">
<form method="get" id="search" action="https://duckduckgo.com/">
<fieldset><legend>DuckDuckGo</legend>
<input type="hidden" name="sites" value="https://www.hackerpublicradio.org/"/>
<input type="hidden" name="k8" value="#444444"/>
<input type="hidden" name="k9" value="#D51920"/>
<input type="hidden" name="kt" value="h"/>
<input type="text" name="q" maxlength="255" placeholder="Search HPR with DuckDuckGo"/>
<input type="submit" value="Search HPR with DuckDuckGo" />
<p>
<a href="https://duckduckgo.com/privacy">privacy policy</a>
</p>
</fieldset>
</form>
<form name="google-search" method="get" action="https://www.google.com/search">
<fieldset><legend>Google</legend>
<input type="hidden" name="sitesearch" value="https://www.hackerpublicradio.org/" />
<input name="q" type="text" placeholder="Search HPR with Google"/>
<input type="submit" name="sa" value="Search HPR with Google" />
<p>
<a href="https://www.google.com/policies/privacy/">privacy policy</a>
</p>
</fieldset>
</form>
<form method="get" action="https://www.bing.com/search">
<fieldset><legend>Bing</legend>
<input type="hidden" name="cp" value="utf-8" />
<input type="hidden" name="FORM" value="FREESS" />
<input type="text" name="q" size="30" placeholder="Search HPR with Bing"/>
<input type="submit" value="Search HPR with Bing" />
<input type="hidden" name="q1" value="site:www.hackerpublicradio.org" />
<p>
<a href="https://www.microsoft.com/privacystatement/en-us/bing/default.aspx">privacy policy</a>
</p>
</fieldset>
</form>
</div>
</section>
<section id="tags">
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS "queries-tags.tpl.html" %-->
<!--% USE DBI(constants.driver) %-->
<!--% PERL %-->
$Template::Stash::PRIVATE = undef; # Allow . in tag
<!--% END %-->
<!--% USE String %-->
<!--% uniq_tag_count = 0 %-->
<!--% FOREACH episode IN DBI.query(query_tags);
ep_id = episode.id;
ep_tags = episode.tags;
FOREACH tag_str IN ep_tags.csv_parse;
NEXT UNLESS tag_str;
NEXT IF tag_str == '';
tag = tag_str.lower;
tag_index = String.new(tag).push('_');
first_char = tag.substr(0,1);
IF first_char == '.';
first_char = '&#x0002E;'; # Unicode .
END;
IF all_tags.${first_char}.exists(tag_index);
all_tags.${first_char}.${tag_index}.count = all_tags.${first_char}.${tag_index}.count + 1;
all_tags.${first_char}.${tag_index}.urls.push(ep_id);
ELSE;
all_tags.${first_char}.${tag_index}.count = 1;
uniq_tag_count = uniq_tag_count + 1;
all_tags.${first_char}.${tag_index}.urls = [ep_id];
END;
END;
END %-->
<!--% USE date %-->
<!--% all_first = ['#','&#x0002E;','/','0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] %-->
<header>
<hgroup>
<h1 id="TOP" class="title">Search by Tag</h1>
<p class="date">Generated on <!--% date.format(date.now, format => '%Y-%m-%d at %H:%M:%S UTC', gmt => 1) %--></p>
</hgroup>
</header>
<p>This section summarises all of the tags currently used throughout the
database. The tags are in alphabetical order and each is followed by links to
the show numbers where it is used so you can see the context the author used
it in. There are currently <!--% uniq_tag_count %--> unique tags in the system.</p>
<h4>Alphabetical index</h4>
<p>This is an index to the initial letters of the tags below.</p>
<ul id="tag_initial_letter_index">
<!--% FOREACH first_char IN all_first %-->
<!--% IF all_tags.${first_char} %-->
<li><a href="<!--% absolute_path(baseurl) %-->search.html#<!--% tag_to_id(String.new(all_tags.${first_char}.keys.sort.first).chop) %-->"><strong><!--% first_char %--></strong></a></li>
<!--% END %-->
<!--% END %-->
</ul>
<hr class="no-css">
<!--% FOREACH first_char IN all_first %-->
<!--% IF all_tags.${first_char} %-->
<p class="index-link"><a href="<!--% absolute_path(baseurl) %-->search.html#TOP">&UpArrow; Go to index</a></p>
<h3>Tags beginning with '<!--% first_char %-->'</h3>
<ul class="tag-index">
<!--% FOREACH tag_index IN all_tags.${first_char}.keys.sort %-->
<!--% tag = String.new(tag_index).chop; tag_id = String.new(tag_index).chop; %-->
<li>
<a id="<!--% tag_to_id(tag_id) %-->"><strong><!--% tag %--></strong></a>:
<!--% ep_links = [] %-->
<!--% FOREACH ep_id IN all_tags.${first_char}.${tag_index}.urls.nsort;
ep_links.push("<a href=\"${absolute_path(baseurl)}eps/hpr" _ zero_pad_left(ep_id) _ '/index.html"'
' target="_blank" aria-label="' _ tag _
' - show ' _ ep_id _ '">' _ ep_id _ '</a>');
END %-->
<!--% ep_links.join(', ') %-->
</li>
<!--% END %-->
</ul>
<!--% END %-->
<!--% END %-->
<p><a href="#TOP">Go to TOP of page</a></p>
</article>
<!--% PERL %-->
$Template::Stash::PRIVATE = 1;
<!--% END %-->
</section>
<article>
<header>
<h1>Search HPR.</h1>
</header>
<hr />
<h2>Search Show Tags</h2>
<p>
<a href="<!--% absolute_path(baseurl) %-->tags.html">Complete list of all the Tags</a></p>
<hr />
<h2>Google</h2>
<form name="google-search" method="get" action="https://www.google.com/search">
<input type="hidden" name="sitesearch" value="https://www.hackerpublicradio.org/" />
<input name="q" type="text" placeholder="Search HPR with Google"/>
<input type="submit" name="sa" value="Search HPR with Google" />
</form>
<br />
<a href="https://www.google.com/policies/privacy/">privacy policy</a>
</p>
<hr />
<h2>DuckDuckGo</h2>
<form method="get" id="search" action="https://duckduckgo.com/">
<input type="hidden" name="sites" value="https://www.hackerpublicradio.org/"/>
<input type="hidden" name="k8" value="#444444"/>
<input type="hidden" name="k9" value="#D51920"/>
<input type="hidden" name="kt" value="h"/>
<input type="text" name="q" maxlength="255" placeholder="Search HPR with DuckDuckGo"/>
<input type="submit" value="Search HPR with DuckDuckGo" />
</form>
<br />
<a href="https://duckduckgo.com/privacy">privacy policy</a>
</p>
<hr />
<h2>Bing</h2>
<p>
<form method="get" action="https://www.bing.com/search">
<input type="hidden" name="cp" value="utf-8" />
<input type="hidden" name="FORM" value="FREESS" />
<input type="text" name="q" size="30" placeholder="Search HPR with Bing"/>
<input type="submit" value="Search HPR with Bing" />
<input type="hidden" name="q1" value="site:www.hackerpublicradio.org" />
</form>
<br />
<a href="https://www.microsoft.com/privacystatement/en-us/bing/default.aspx">privacy policy</a>
</p>
</article>

View File

@@ -1,22 +1,17 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS "queries-series.tpl.html" %-->
<!--% USE DBI(constants.driver) %-->
<!--% page_title = "HPR ~ Show series" %-->
<h1 class="title">In-Depth Series</h1>
<div class="lane stack">
<!--% FOREACH series IN DBI.query(query_episodes) %-->
<!--% PROCESS "queries-series-${constants.database}.tpl.html" %-->
<article>
<header><a href="<!--% absolute_path(baseurl) %-->series/<!--% zero_pad_left(series.id) %-->.html"><!--% series.name %--></a></header>
<ul>
<li>Number of episodes: <!--% series.number_of_episodes %--></li>
<li>Open/closed: <!--% display_choice(series.private, 'closed', 'open') %--></li>
<li>Date of earliest show: <!--% series.earliest_show %--></li>
<li>Date of latest show: <!--% series.latest_show %--></li>
<li>Series RSS feeds: <a href="<!--% absolute_path(baseurl) %-->hpr_ogg_rss.php?series=<!--% series.id %-->">ogg</a>, <a href="<!--% absolute_path(baseurl) %-->hpr_spx_rss.php?series=<!--% series.id %-->">spx</a>, <a href="<!--% absolute_path(baseurl) %-->hpr_mp3_rss.php?series=<!--% series.id %-->">mp3</a></li>
<li><a href="<!--% absolute_url(baseurl,'//series') %-->/<!--% zero_pad_left(series.id) %-->.m3u8">Download the M3U playlist</a></li>
</ul>
<div class="series-description"><!--% series.description %--></div>
</article>
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<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>
<ul>
<li>Number of episodes: <!--% series.number_of_episodes %--></li>
<li>Open/closed: <!--% display_choice(series.private, 'closed', 'open') %--></li>
<li>Date of earliest show: <!--% series.earliest_show %--></li>
<li>Date of latest show: <!--% series.latest_show %--></li>
<li>Series RSS feeds: <a href="<!--% absolute_path(baseurl) %-->hpr_ogg_rss.php?series=<!--% series.id %-->">ogg</a>, <a href="<!--% absolute_path(baseurl) %-->hpr_spx_rss.php?series=<!--% series.id %-->">spx</a>, <a href="<!--% absolute_path(baseurl) %-->hpr_mp3_rss.php?series=<!--% series.id %-->">mp3</a></li>
</ul>
<em><!--% series.description %--></em>
<!--% END %-->
</div>
</article>

View File

@@ -1,12 +1,12 @@
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
<!--% PROCESS 'shared-avatar.tpl.html' %-->
<!--% PROCESS "queries-series_episodes.tpl.html" %-->
<!--% USE DBI(constants.driver) %-->
<!--% PROCESS "queries-series_episodes-${constants.database}.tpl.html" %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% query_series = DBI.prepare(query_series_sql)
%-->
<!--% series_result = query_series.execute(id) %-->
<article>
<!--% FOREACH series IN series_result %-->
<!--% page_title = "HPR ~ Series: " _ series.name %-->
<h1 class="title">In-Depth Series: <!--% series.name %--></h1>
<ul>
<li>Number of episodes: <!--% series.number_of_episodes %--></li>
@@ -14,18 +14,14 @@
<li>Date of earliest show: <!--% series.earliest_show %--></li>
<li>Date of latest show: <!--% series.latest_show %--></li>
<li>Series RSS feeds: <a href="<!--% absolute_path(baseurl) %-->hpr_ogg_rss.php?series=<!--% series.id %-->&full=1&gomax=1">ogg</a>, <a href="<!--% absolute_path(baseurl) %-->hpr_spx_rss.php?series=<!--% series.id %-->&full=1&gomax=1">spx</a>, <a href="<!--% absolute_path(baseurl) %-->hpr_mp3_rss.php?series=<!--% series.id %-->&full=1&gomax=1">mp3</a></li>
<li><a href="<!--% absolute_url(baseurl,'//series') %-->/<!--% zero_pad_left(series.id) %-->.m3u8">Download the M3U playlist</a></li>
</ul>
<p><em><!--% series.description %--></em></p>
<section id="series_episodes" class="lane stack">
<div><em><!--% series.description %--></em></div>
<!--% END %-->
<!--% query_shows = DBI.prepare(query_shows_sql)
%-->
<!--% show_results = query_shows.execute(id) %-->
<!--% FOREACH show IN show_results %-->
<article>
<!--% show_summary(show) %-->
<footer class="listen-in"><!--% display_listen_in(show.id) %--></footer>
<p class="listen-in"><!--% display_listen_in(show.id) %--></p>
<!--% END %-->
</article>
<!--% END %-->
</section>
<!--% END %-->

View File

@@ -1,12 +1,11 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% page_title = "HPR ~ Sitemap" %-->
<h1>Sitemap</h1>
<ul>
<li><a href="<!--% hub_baseurl %-->calendar.php"><strong>⇧Upload⇧</strong></a> ← Upload Your Show</li>
<li><a href="<!--% absolute_path(baseurl) %-->index.html"><strong>Home</strong></a> ← The HPR Homepage</li>
<li><a href="<!--% absolute_path(baseurl) %-->syndication.html">Get Shows</a> ← The RSS Syndication Feeds</li>
<ul>
<li><a href="<!--% absolute_path(baseurl) %-->eps/index.html">Full Episode Guide</a> ← Complete list of all the Shows.</li>
<li><a href="<!--% absolute_path(baseurl) %-->correspondents/index.html">Full Episode Guide</a> ← Complete list of all the Shows.</li>
<li><a href="<!--% absolute_path(baseurl) %-->series/index.html">In-Depth Series</a> ← Overview of the In-Depth Series.</li>
<li><a href="<!--% absolute_url(baseurl) %-->about.html#download">Download Options</a> ← How to download the entire archive.</li>
</ul>

View File

@@ -1,25 +1,28 @@
<!--% page_title = "HPR ~ Subscribe to our feeds" %-->
<h1>RSS Syndication<a href="<!--% absolute_path(baseurl) %-->syndication.html">.</a></h1>
<h2 id="subscribe">Subscribe to our Feeds<a href="<!--% absolute_path(baseurl) %-->syndication.html">.</a></h2>
<h1>RSS Syndication</h1>
<article>
<header>
<h2>Subscribe to our Feeds</h2>
</header>
<p>
Great that you want to listen. Have a look below at the feeds that best suite your listening habits.
</p>
<div class="lane stack">
<article>
</article>
<article>
<header>
<hgroup>
<h2 id="feed_community_news"><img src="<!--% absolute_path(baseurl) %-->images/feed.png" alt="rss logo"> The Community News Summary<a href="<!--% absolute_path(baseurl) %-->syndication.html#feed_community_news">.</a></h2>
<p>One show a month</p>
</hgroup>
<h2><img src="<!--% absolute_path(baseurl) %-->images/feed.png" alt="rss logo"> The Community News Summary</h2>
<h3>One show a month</h3>
</header>
<p>If you get overwhelmend by the amount of shows we produce, then this is a good place to start.</p>
<p>Every month, the HPR Janitors put down their mops had have a chat about all the shows, and what else has been going on in the HPR community. This is a regular show scheduled for the first Monday of the month.</p>
<p>
If you get overwhelmend by the amount of shows we produce, then this is a good place to start.
</p>
<p>
Every month, the HPR Janitors put down their mops had have a chat about all the shows, and what else has been going on in the HPR community. This is a regular show scheduled for the first Monday of the month.
</p>
<ul>
<li><a href="<!--% absolute_path(baseurl) %-->hpr_opus_rss.php?series=47">opus</a>.</li>
<li><a href="<!--% absolute_path(baseurl) %-->hpr_ogg_rss.php?series=47">ogg</a>.</li>
<li><a href="<!--% absolute_path(baseurl) %-->hpr_mp3_rss.php?series=47">mp3</a>.</li>
<li><a href="<!--% absolute_path(baseurl) %-->hpr_ogg_rss.php?series=47">ogg</a> Larger file size higher quality feed.</li>
<li><a href="<!--% absolute_path(baseurl) %-->hpr_spx_rss.php?series=47">mp3</a> Larger file size regular quality feed in a common format.</li>
<li><a href="<!--% absolute_path(baseurl) %-->hpr_mp3_rss.php?series=47">spx</a> Small file size lower quality feed. <br/>Ideal for dial-up/mobile connections.</li>
</ul>
<p>
We also maintain an <a href="https://archive.org/details/hackerpublicradio?and[]=subject%3A%22Community+News%22">Archive.org</a> page where you can get the shows in even more formats.
@@ -27,18 +30,16 @@
</article>
<article>
<header>
<hgroup>
<h2 id="feed_regular"><img src="<!--% absolute_path(baseurl) %-->images/feed.png" alt="rss logo"> Two week Audio feed<a href="<!--% absolute_path(baseurl) %-->syndication.html#feed_regular">.</a></h2>
<p>5 shows a week</p>
</hgroup>
<h2><img src="<!--% absolute_path(baseurl) %-->images/feed.png" alt="rss logo"> Two week Audio feed</h2>
<h3>5 shows a week</h3>
</header>
<p>
Use these feeds to keep up to date with the latest HPR Episodes.
</p>
<ul>
<li><a href="<!--% absolute_url(baseurl) %-->hpr_opus_rss.php">opus</a>.</li>
<li><a href="<!--% absolute_url(baseurl) %-->hpr_ogg_rss.php">ogg</a>.</li>
<li><a href="<!--% absolute_url(baseurl) %-->hpr_rss.php">mp3</a>.</li>
<li><a href="<!--% absolute_url(baseurl) %-->hpr_ogg_rss.php">ogg</a> Larger file size higher quality feed.</li>
<li><a href="<!--% absolute_url(baseurl) %-->hpr_rss.php">mp3</a> Larger file size regular quality feed in a common format.</li>
<li><a href="<!--% absolute_url(baseurl) %-->hpr_spx_rss.php">spx</a> Small file size lower quality feed. <br/>Ideal for dial-up/mobile connections.</li>
</ul>
<p>
We also maintain an <a href="https://archive.org/details/hackerpublicradio">Archive.org</a> page where you can get the shows in even more formats. For more recent shows we are now including the original upload as delivered.
@@ -46,20 +47,20 @@
</article>
<article>
<header>
<h2 id="feed_full"><img src="<!--% absolute_path(baseurl) %-->images/feed.png" alt="rss logo"> Entire Archive Audio feed<a href="<!--% absolute_path(baseurl) %-->syndication.html#feed_full">.</a></h2>
<h2><img src="<!--% absolute_path(baseurl) %-->images/feed.png" alt="rss logo"> Entire Archive Audio feed</h2>
</header>
<p>
Use this feed to get the archived episodes. The feed themselves run over 15Mb in size and so use them to download the archived episodes and when you are up to date switch back to the Two Week Feeds listed above.
</p>
<ul>
<li><a href="<!--% absolute_path(baseurl) %-->hpr_total_opus_rss.php">opus feed</a> Warning over 64G</li>
<li><a href="<!--% absolute_path(baseurl) %-->hpr_total_ogg_rss.php">ogg feed</a> Warning over 68G</li>
<li><a href="<!--% absolute_path(baseurl) %-->hpr_total_rss.php">mp3 feed</a> Warning over 72G</li>
<li><a href="<!--% absolute_path(baseurl) %-->hpr_total_ogg_rss.php">ogg feed</a> Warning over 50G</li>
<li><a href="<!--% absolute_path(baseurl) %-->hpr_total_spx_rss.php">spx feed</a> Warning over 22G</li>
<li><a href="<!--% absolute_path(baseurl) %-->hpr_total_rss.php">mp3 feed</a> Warning over 36G</li>
</ul>
</article>
<article>
<header>
<h2 id="feed_future"><img src="<!--% absolute_path(baseurl) %-->images/feed.png" alt="rss logo"> Future Feed<a href="<!--% absolute_path(baseurl) %-->syndication.html#feed_future">.</a></h2>
<h2><img src="<!--% absolute_path(baseurl) %-->images/feed.png" alt="rss logo"> Future feed</h2>
</header>
<p>
Use this feed to get the shows as they are posted. The shows will be posted out of order as they come in and may be replaced/reposted if errors are found. This is intended as a means to provide find issues with metadata or the audio quality of new shows before they hit the main feed.
@@ -70,19 +71,17 @@
</article>
<article>
<header>
<h2 id="feed_comment"><img src="<!--% absolute_path(baseurl) %-->images/feed.png" alt="rss logo"> Comment Feed<a href="<!--% absolute_path(baseurl) %-->syndication.html#feed_comment">.</a></h2>
<h2><img src="<!--% absolute_path(baseurl) %-->images/feed.png" alt="rss logo"> Comment feed</h2>
</header>
<ul>
<li><a href="<!--% absolute_path(baseurl) %-->comments.rss">Listener contributed comments to the episodes</a></li>
</ul>
</article>
<div>
<hr class="no-css">
<hr />
<h1>Other Download Options</h1>
<div class="lane stack">
<article>
<header>
<h2 id="site_replication">Site Replication Sources<a href="<!--% absolute_path(baseurl) %-->syndication.html#site_replication">.</a></h2>
<h2>Site Replication Sources</h2>
</header>
<ul>
<li><a href="<!--% absolute_path(baseurl) %-->hpr.sql">Daily Database Dump in SQL Format</a></li>
@@ -92,7 +91,7 @@
</article>
<article>
<header>
<h2 id="external_sources">External Sources<a href="<!--% absolute_path(baseurl) %-->syndication.html#external_sources">.</a></h2>
<h2>External Sources</h2>
</header>
<ul>
<li><a href="https://archive.org/details/hackerpublicradio">Archive.org</a></li>
@@ -112,29 +111,25 @@
<article>
<header>
<h2 id="download_archive">Download Archive<a href="<!--% absolute_path(baseurl) %-->syndication.html#download_archive">.</a></h2>
</header>
<p>Please be aware that our Archive exceeds <strong>200Gb</strong></em>. We are happy for you to download them, but please make sure that you are not going to incur additional bandwidth charges on your side.</p>
<p>We will be happy to physically send episodes anywhere in the world if bandwidth is an issue.</p>
</article>
<article>
<header><h2 id="full_episode_guide">Full Episode Guide<a href="<!--% absolute_path(baseurl) %-->syndication.html#full_episode_guide">.</a></h2></header>
<p>The <a href="<!--% absolute_path(baseurl) %-->eps/index.html">compete episode guide</a> is available to you, and it lists all the shows on one page going right back to the very first episode.</p>
</article>
<article>
<header><h2 id="cli_download">Command line download<a href="<!--% absolute_path(baseurl) %-->syndication.html#cli_download">.</a></h2></header>
<p>You can download the audio of the episodes directly from the command line using the following commands:</p>
<h1>Download Archive</h1>
<p>Please be aware that our Archive exceeds <strong>62Gb</strong> <em>(Ogg: 21Gb, Spx: 16Gb, mp3: 25Gb)</em>. We are happy for you to download them, but please make sure that you are not going to incur additional bandwidth charges on your side.</p>
<p>We will be happy to post you DVD's of the episodes anywhere in the world if bandwidth is an issue.</p>
</header>
<h2>Full Episode Guide</h2>
<p>
The <a href="<!--% absolute_path(baseurl) %-->eps/index.html">compete episode guide</a> is available to you, and it lists all the shows on one page going right back to the very first episode.
</p>
<h2>Command line download</h2>
<p>
You can download the audio of the episodes directly from the command line using the following commands:
</p>
<ul>
<li>ogg:<br>
<code>curl '<!--% absolute_path(baseurl) %-->eps/hpr[0001-<!--% episode.latest %-->].ogg' -o "hpr#1.ogg"</code></li>
<li>spx:<br>
<code>curl '<!--% absolute_path(baseurl) %-->eps/hpr[0001-<!--% episode.latest %-->].spx' -o "hpr#1.spx"</code></li>
<li>mp3:<br>
<code>curl '<!--% absolute_path(baseurl) %-->eps/hpr[0001-<!--% episode.latest %-->].mp3' -o "hpr#1.mp3"</code></li>
<li>ogg:<br />
<span style="font-family:monospace;">curl '<!--% absolute_path(baseurl) %-->eps/hpr[0001-<!--% episode.latest %-->].ogg' -o "hpr#1.ogg"</span></li>
<li>spx:<br />
<span style="font-family:monospace;">curl '<!--% absolute_path(baseurl) %-->eps/hpr[0001-<!--% episode.latest %-->].spx' -o "hpr#1.spx"</span></li>
<li>mp3:<br />
<span style="font-family:monospace;">curl '<!--% absolute_path(baseurl) %-->eps/hpr[0001-<!--% episode.latest %-->].mp3' -o "hpr#1.mp3"</span></li>
</ul>
</article>
</div>
</article>

View File

@@ -1,67 +1,73 @@
<section id="tags">
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS "queries-tags.tpl.html" %-->
<!--% USE DBI(constants.driver) %-->
<!--% PROCESS "queries-tags-${constants.database}.tpl.html" %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% PERL %-->
$Template::Stash::PRIVATE = undef; # Allow . in tag
<!--% END %-->
<!--% USE String %-->
<!--% uniq_tag_count = 0 %-->
<!--% comma_re = '(?x)(?:^|,\s*)(?:"((?>[^"]*)(?:""[^"]*)*)"|([^",]*))'; %-->
<!--# 'Moka5,interview, "computer science"' -->
<!--% FOREACH episode IN DBI.query(query_tags);
ep_id = episode.id;
ep_tags = episode.tags;
FOREACH tag_str IN ep_tags.csv_parse;
FOREACH tag_str IN ep_tags.split(comma_re);
NEXT UNLESS tag_str;
NEXT IF tag_str == '';
tag = tag_str.lower;
tag_index = String.new(tag).push('_');
first_char = tag.substr(0,1);
IF first_char == '.';
first_char = '&#x0002E;'; # Unicode .
END;
IF all_tags.${first_char}.exists(tag_index);
all_tags.${first_char}.${tag_index}.count = all_tags.${first_char}.${tag_index}.count + 1;
all_tags.${first_char}.${tag_index}.urls.push(ep_id);
IF all_tags.${first_char}.exists(tag);
all_tags.${first_char}.${tag}.count = all_tags.${first_char}.${tag}.count + 1;
all_tags.${first_char}.${tag}.urls.push(ep_id);
ELSE;
all_tags.${first_char}.${tag_index}.count = 1;
all_tags.${first_char}.${tag}.count = 1;
uniq_tag_count = uniq_tag_count + 1;
all_tags.${first_char}.${tag_index}.urls = [ep_id];
all_tags.${first_char}.${tag}.urls = [ep_id];
END;
END;
END %-->
<!--% USE date %-->
<!--% all_first = ['#','&#x0002E;','/','0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] %-->
<header>
<hgroup>
<h1 class="title"><a id="TOP">Search by Tag</a></h1>
<p class="date">Page generated on <!--% date.format(date.now, format => '%Y-%m-%d at %H:%M:%S UTC', gmt => 1) %--></p>
</hgroup>
</header>
<style>
.columns3 { columns: 3 auto; list-style-type: none }
hr.thin {
border: 0;
height: 0;
border-top: 1px solid rgba(0, 0, 0, 0.1);
border-bottom: 1px solid rgba(255, 255, 255, 0.3);
}
p.ralign { text-align: right }
</style>
<article>
<a id="TOP"><h1 class="title">Tag summary</h1></a>
<h4 class="date">Page generated on <!--% date.format(date.now, format => '%Y-%m-%d at %H:%M:%S UTC', gmt => 1) %--></h4>
<p>This section summarises all of the tags currently used throughout the
database. The tags are in alphabetical order and each is followed by links to
the show numbers where it is used so you can see the context the author used
it in. There are currently <!--% uniq_tag_count %--> unique tags in the system.</p>
<h4>Alphabetical index</h4>
<p>This is an index to the initial letters of the tags below.</p>
<ul id="tag_initial_letter_index">
<ul class="columns3">
<!--% FOREACH first_char IN all_first %-->
<!--% IF all_tags.${first_char} %-->
<li><a href="<!--% absolute_path(baseurl) %-->search.html#<!--% tag_to_id(String.new(all_tags.${first_char}.keys.sort.first).chop) %-->"><strong><!--% first_char %--></strong></a></li>
<li><a href="<!--% absolute_path(baseurl) %-->tags.html#<!--% all_tags.${first_char}.keys.sort.first %-->"><strong><!--% first_char %--></strong></a></li>
<!--% END %-->
<!--% END %-->
</ul>
<hr class="no-css">
<hr>
<!--% FOREACH first_char IN all_first %-->
<!--% IF all_tags.${first_char} %-->
<p class="index-link"><a href="<!--% absolute_path(baseurl) %-->search.html#TOP">&UpArrow; Go to index</a></p>
<p class="ralign"><a href="<!--% absolute_path(baseurl) %-->tags.html#TOP">&UpArrow; Go to index</a></p>
<h3>Tags beginning with '<!--% first_char %-->'</h3>
<ul class="tag-index">
<!--% FOREACH tag_index IN all_tags.${first_char}.keys.sort %-->
<!--% tag = String.new(tag_index).chop; tag_id = String.new(tag_index).chop; %-->
<ul>
<!--% FOREACH tag IN all_tags.${first_char}.keys.sort %-->
<li>
<a id="<!--% tag_to_id(tag_id) %-->"><strong><!--% tag %--></strong></a>:
<a id="<!--% tag %-->"><strong><!--% tag %--></strong></a>:
<!--% ep_links = [] %-->
<!--% FOREACH ep_id IN all_tags.${first_char}.${tag_index}.urls.nsort;
<!--% FOREACH ep_id IN all_tags.${first_char}.${tag}.urls.nsort;
ep_links.push("<a href=\"${absolute_path(baseurl)}eps/hpr" _ zero_pad_left(ep_id) _ '/index.html"'
' target="_blank" aria-label="' _ tag _
' - show ' _ ep_id _ '">' _ ep_id _ '</a>');
@@ -77,5 +83,3 @@ END %-->
<!--% PERL %-->
$Template::Stash::PRIVATE = 1;
<!--% END %-->
</section>

View File

@@ -2,27 +2,27 @@
<!--% PROCESS 'shared-avatar.tpl.html' %-->
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS 'shared-listen-now.tpl.html' %-->
<!--% USE DBI(constants.driver) %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% query_episodes = DBI.prepare('
WITH episode_maxmin AS (
SELECT MAX(id) AS \'latest\', MIN(id) AS \'earliest\', ? AS \'id\'
FROM twt_eps AS eps
FROM twat_eps AS eps
),
episode_date AS (
SELECT eps.date
FROM twt_eps AS eps
FROM twat_eps AS eps
WHERE eps.id = ?
),
episode_previous AS (
SELECT MAX(id) AS \'previous\', ? AS \'id\'
FROM twt_eps AS eps
FROM twat_eps AS 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 twt_eps AS eps
FROM twat_eps AS eps
INNER JOIN episode_date
ON eps.date > episode_date.date
)
@@ -34,7 +34,7 @@
hosts.hostid, hosts.host,
miniseries.name AS \'series\', miniseries.id AS \'seriesid\',
miniseries.description AS \'series_description\'
FROM twt_eps AS eps
FROM twat_eps AS 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
@@ -45,8 +45,7 @@
%-->
<!--% episode_result = query_episodes.execute(id, id, id, id, id) %-->
<!--% FOREACH episode IN episode_result %-->
<!--% episode_navigation = step_navigation(baseurl,episode,"twt") %-->
<!--% page_title = "TWT" _ episode.id _ "::" _ episode.title %-->
<!--% episode_navigation = step_navigation(baseurl,episode,"twat") %-->
<article>
<header>
<h1><!--% episode.id %--> :: <!--% episode.title %--></h1>
@@ -54,10 +53,10 @@
<p class="meta"><!--% episode_navigation %-->
</p>
<p><!--% show_avatar(episode.hostid, episode.host) %-->
Hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(episode.hostid) %-->.html"><!--% episode.host %--></a> on <span><!--% day_and_date(episode.date) %--></span> is flagged as <span><!--% display_explicit(episode.explicit) %--></span> and is released under a <span><!--% episode.license %--> license</span>. <br>
Hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(episode.hostid) %-->.html"><!--% episode.host %--></a> on <span><!--% episode.date %--></span> is flagged as <span><!--% display_explicit(episode.explicit) %--></span> and is released under a <span><!--% episode.license %--> license</span>. <br>
<!--% display_tags(episode.tags) %--> <br>
<!--% listen_now(episode, "twt", baseurl, media_baseurl) %-->
<!--% display_listen_in(episode.id, "twt") %-->
<!--% listen_now(episode, "twat", baseurl, media_baseurl) %-->
<!--% display_listen_in(episode.id, "twat") %-->
</p>
<h3><!--% show_series(episode.series, episode.seriesid, "Part of the series") %--></h3>
<p><em><!--% episode.series_description %--></em></p>

View File

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

View File

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

View File

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

View File

@@ -1,7 +0,0 @@
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% FOREACH series IN DBI.query(
'select s.id from miniseries as s'
) %-->
,<!--% series.id %-->
<!--% END %-->

View File

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

View File

@@ -1,7 +0,0 @@
<!--% USE DBI(constants.driver) %-->
<!--% FOREACH episode IN DBI.query(
'select eps.id from twt_eps AS eps'
) %-->
,<!--% episode.id %-->
<!--% END %-->

View File

@@ -1,24 +0,0 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS 'queries-correspondent.tpl.html' %-->
<!--% USE DBI(constants.driver) %-->
<!--% results_hpr_shows = DBI.prepare(query_hpr_shows) %-->
<!--% hpr_shows = results_hpr_shows.execute(id); %-->
<!--% FOREACH hpr_show IN hpr_shows; %-->
#EXTINF: <!--% hpr_show.duration %-->,<!--% hpr_show.host %--> - <!--% hpr_show.title %-->
<!--% media_path(hpr_show.id, 'hpr', 'mp3', baseurl, media_baseurl) %-->
<!--% END %-->
<!--% results_hpr_shows = DBI.prepare(query_twt_shows) %-->
<!--% twt_result_status = results_twt_show_count.execute(id); %-->
<!--% twt_shows = results_hpr_shows.execute(id); %-->
<!--% FOREACH hpr_show IN twt_shows; %-->
#EXTINF: <!--% hpr_show.duration %-->,<!--% hpr_show.host %--> - <!--% hpr_show.title %-->
<!--% media_path(hpr_show.id, 'twt', 'mp3', baseurl, media_baseurl) %-->
<!--% END %-->

View File

@@ -1,13 +0,0 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS 'queries-series_episodes.tpl.html' %-->
<!--% USE DBI(constants.driver) %-->
<!--% results_hpr_shows = DBI.prepare(query_shows_sql) %-->
<!--% hpr_shows = results_hpr_shows.execute(id); %-->
<!--% FOREACH hpr_show IN hpr_shows; %-->
#EXTINF: <!--% hpr_show.duration %-->,<!--% hpr_show.host %--> - <!--% hpr_show.title %-->
<!--% media_path(hpr_show.id, 'hpr', 'mp3', baseurl, media_baseurl) %-->
<!--% END %-->

View File

@@ -1,2 +0,0 @@
#EXTM3U
<!--% INCLUDE $content %-->

View File

@@ -1,7 +1,11 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<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>
<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>

View File

@@ -1,18 +1,9 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% USE date %-->
<!--% page_title = make_sfw(is_sfw, "Hobby", "Hacker") _ " Public Radio (HPR) ~ The Technology Community Podcast" %-->
<!--% WRAPPER page
# The default page_title variable set above can be overridden
# in each individual $content template (i.e. templates/conten-<template name>.tpl.html)
# processed below.
%-->
<!--% PROCESS $content %-->
<!--% END %-->
<!--% BLOCK page %-->
<!DOCTYPE HTML>
<html lang="en">
<head>
<title><!--% page_title %--></title>
<title>Hacker Public Radio ~ The Technology Community Podcast</title>
<!--% IF baseurl %-->
<base href="<!--% baseurl %-->">
<!--% END %-->
@@ -20,64 +11,139 @@
<meta http-equiv="X-Clacks-Overhead" content="GNU Terry Pratchett" />
<meta http-equiv="last-modified" content="<!--% format_feed_date(date.now) %-->">
<meta name="keywords" content="Technology, Tech News, Education, Training" />
<meta name="description" content="<!--% make_sfw(is_sfw, "Hobby", "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 <!--% make_sfw(is_sfw, "makers", "hackers") %--> and hobbyists." />
<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="<!--% absolute_url(baseurl) %-->hpr.ico" >
<link rel="alternate" type="application/rss+xml" title="<!--% make_sfw(is_sfw, "Hobby", "Hacker") %--> Public Radio Opus RSS" href="<!--% absolute_path(baseurl) %-->hpr_opus_rss.php" />
<link rel="alternate" type="application/rss+xml" title="<!--% make_sfw(is_sfw, "Hobby", "Hacker") %--> Public Radio Ogg Vorbis RSS" href="<!--% absolute_path(baseurl) %-->hpr_ogg_rss.php" />
<link rel="alternate" type="application/rss+xml" title="<!--% make_sfw(is_sfw, "Hobby", "Hacker") %--> Public Radio MP3 RSS" href="<!--% absolute_path(baseurl) %-->hpr_mp3_rss.php" />
<link rel="alternate" type="application/rss+xml" title="<!--% make_sfw(is_sfw, "Hobby", "Hacker") %--> Public Radio Comments RSS" href="<!--% absolute_path(baseurl) %-->comments.rss" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Ogg Vorbis RSS" href="<!--% absolute_path(baseurl) %-->hpr_ogg_rss.php" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Speex RSS" href="<!--% absolute_path(baseurl) %-->hpr_spx_rss.php" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio MP3 RSS" href="<!--% absolute_path(baseurl) %-->hpr_mp3_rss.php" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Comments RSS" href="<!--% absolute_path(baseurl) %-->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="<!--% absolute_path(baseurl) %-->css/hpr.css" rel="stylesheet" />
<!--[if IE]>
<link rel="stylesheet" href="/css/hpr.css" media="screen" type="text/css" />
<link rel="stylesheet" href="<!--% absolute_path(baseurl) %-->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, user-scalable=yes"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.5, user-scalable=yes"/>
</head>
<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="<!--% absolute_path(baseurl) %-->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="<!--% absolute_path(baseurl) %-->index.html">HPR</a></h1>
<p id="site_name">
<a href="<!--% absolute_path(baseurl) %-->correspondents/index.html">H</a><!--% make_sfw(is_sfw, "obby", "acker") %-->
<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">
<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
</p>
</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>
</hgroup>
</div>
</header>
<main id="main_content" role="main">
<!--% content %-->
<!--% page_title = "acck" %-->
</main>
<footer role="contentinfo">
<hr class="no-css">
<div id="copyright">
<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>.
</span>
</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/rho_n/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>
</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>
<hr />
<nav class="menu" role="navigation">
<!--% INCLUDE $navigation %-->
</nav>
</header>
<main id="maincontent">
<!--% INCLUDE $content %-->
</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="<!--% absolute_url(baseurl,'/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>
<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>
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 />
</footer>
</body>
</html>
<!--% END %-->
</div>
<!-- shadow -->

View File

@@ -0,0 +1,6 @@
<!--% 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

@@ -0,0 +1,18 @@
<!--% 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
'
%-->

View File

@@ -0,0 +1,18 @@
<!--% 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(\'now\', \'+1 days\')
ORDER BY eps.id + 0 DESC
'
%-->

View File

@@ -1,58 +0,0 @@
<!--% query_hpr_shows = '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, hosts.profile,
miniseries.name AS series, miniseries.id AS seriesid,
COALESCE(comment_tallies.eps_tally,0) AS commentsTally
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 hosts.hostid = ? AND eps.date < date(\'now\', \'+1 days\')
ORDER BY eps.id + 0 DESC
'
%-->
<!--% query_hpr_show_count = '
SELECT COUNT(id) as Tally
FROM eps
WHERE eps.hostid = ? AND eps.date < date(\'now\', \'+1 days\')
'
%-->
<!--% query_twt_show_count = '
SELECT COUNT(id) as Tally
FROM twt_eps AS eps
WHERE eps.hostid = ?
'
%-->
<!--% query_twt_shows = '
SELECT
eps.id,
CASE eps.explicit WHEN 1 THEN \'Explicit\' ELSE \'Clean\' END AS 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 twt_eps AS eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
WHERE hosts.hostid = ?
ORDER BY eps.id DESC
'
%-->

View File

@@ -0,0 +1,51 @@
<!--% 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

@@ -0,0 +1,15 @@
<!--% 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,24 +1,14 @@
<!--% query_episodes = 'WITH
comment_tallies AS (
SELECT
eps_id,
COUNT(eps_id) AS eps_tally
FROM comments
GROUP BY eps_id
)
SELECT
<!--% 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,
COALESCE(comment_tallies.eps_tally,0) AS commentsTally
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
LEFT JOIN comment_tallies ON eps.id = comment_tallies.eps_id
WHERE eps.date <= date(\'now\')
ORDER BY eps.id + 0 DESC'
%-->

View File

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

View File

@@ -0,0 +1,58 @@
<!--% 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
'
%-->

Some files were not shown because too many files have changed in this diff Show More