Compare commits
203 Commits
4e1d525e6e
...
167_Severa
Author | SHA1 | Date | |
---|---|---|---|
|
b4448caf16 | ||
|
5a73e94cf7 | ||
|
99a54d5543 | ||
|
f87199bd92 | ||
|
ccc1982c6c | ||
|
d9392bad6c | ||
|
d519936f98 | ||
|
f1480d742f | ||
|
7d1968c60b | ||
|
c263646cf2 | ||
|
dc138596ea | ||
|
8e1788147c | ||
0b841ba78f | |||
|
7b6788731b | ||
|
31fed34212 | ||
|
d7d94b1ba7 | ||
|
3f766544ac | ||
|
fb2b3ec6db | ||
6a3dae3d95 | |||
|
8176492dbe | ||
278867cb4f | |||
|
0229b913db | ||
726ac57989 | |||
|
62c7323847 | ||
4f35673a3d | |||
|
10236d5705 | ||
33d98904e2
|
|||
|
de58d9dc61 | ||
c9510516f1 | |||
d828cdbce8 | |||
6211b9a033 | |||
f95ff21c5e | |||
69055d6e9c | |||
52c5d02dbc | |||
|
db5774f642 | ||
|
7dca1d75cb | ||
e7fe824302
|
|||
|
69255693ef | ||
8b218e2036
|
|||
|
afc6b7518f | ||
|
f3de654284 | ||
|
d2bf821aa8 | ||
91ce3c4325 | |||
821ea9b62d | |||
6c9d6239bb
|
|||
|
f2c9326e61 | ||
ebced513ad
|
|||
a2863e5d84
|
|||
1c94855de2
|
|||
c6e909523f
|
|||
a9c4388cb0
|
|||
24c2f9044e
|
|||
f045cdd32f
|
|||
dc4377d588
|
|||
|
4fa79187a9 | ||
|
d5406f3cce | ||
|
5369bea657 | ||
|
0e9ad6ba65 | ||
|
610e91ea9f | ||
|
860ce671f8 | ||
|
51d6188542 | ||
c9278c0dd6
|
|||
aabeca44f5
|
|||
3a8b6db348
|
|||
7a6ace156f
|
|||
dee924e6a8
|
|||
5b4421071f
|
|||
|
61311b30dd | ||
7406a9baa4
|
|||
|
ce4aefe828 | ||
|
ebcd906300 | ||
|
3b144ecaf5 | ||
fc7975379e
|
|||
207eabec86
|
|||
c9af4fbde8
|
|||
|
e557f103b9 | ||
ea8403c7b6
|
|||
b16a1c3a5f
|
|||
|
8783ca5099 | ||
f65e892182
|
|||
14bafbc3ab
|
|||
231a50957f
|
|||
|
bdc28d21c4 | ||
9310a8642d
|
|||
97a5d4ebbd
|
|||
b420453abd
|
|||
7feae31e11
|
|||
d6068778ab
|
|||
82d761bf68
|
|||
|
0f4fdc2d46 | ||
|
d3c2401e28 | ||
|
c744bdf175 | ||
16d6cf99aa
|
|||
add4f338be
|
|||
|
444c05f8f9 | ||
24a12a5af3
|
|||
add92ef20d
|
|||
f8e397d0bd
|
|||
6d588dc558
|
|||
|
f0b0b5ea59 | ||
a33fa197df
|
|||
e7e752f1e8
|
|||
094287837c
|
|||
a53f201842
|
|||
2ce1280cc0
|
|||
d45ca0de96
|
|||
13aeb647ad
|
|||
ee6a4e601d
|
|||
b544687f0f
|
|||
0ed7efe93b
|
|||
|
b4e4187902 | ||
431126e8a3
|
|||
|
91ceefd88e | ||
8feb37e831
|
|||
4a34496f24
|
|||
|
f7e54233e2 | ||
59875e772e
|
|||
|
f84ee71b7c | ||
927424901b
|
|||
27a84529c6
|
|||
59549daa63
|
|||
|
ec7a6ce379 | ||
756bdc0fa1
|
|||
b2eaea1eb8
|
|||
|
fe9bf574cf | ||
309ea05c15
|
|||
|
649d6c3746 | ||
e41f6029aa
|
|||
|
4bd7c6f867 | ||
138b0fdd1b
|
|||
d437e66f0e
|
|||
|
a213efa695 | ||
|
314127441c | ||
2a486cb58b
|
|||
7c44f6b680
|
|||
71a63e1beb
|
|||
8e1232517a | |||
cb65d25cfc
|
|||
2b4802508d
|
|||
1312e3d374
|
|||
3cc6da57ad
|
|||
675f8fa9d5
|
|||
6f28bb2a16
|
|||
cb881558ca
|
|||
4e8edf2640
|
|||
|
e86d2c010d | ||
f0fa21ae45
|
|||
0b99483f0d
|
|||
8c3874ad8b
|
|||
6f95a33e67
|
|||
979c8b43e5
|
|||
e3abe5fd68
|
|||
5612eeed42
|
|||
4af117fb7a
|
|||
e1b0189275
|
|||
aad77f3c78
|
|||
be1344e10c
|
|||
|
308d03d63c | ||
0837e11bfe
|
|||
06ace35c41
|
|||
6d0d1b99a6
|
|||
fdeff3879a
|
|||
b667c30d40
|
|||
b08f5c30df
|
|||
|
d8613143d3 | ||
3de4476a3f
|
|||
4984ac3383
|
|||
e4463dc5ba
|
|||
|
bf8bf8daad | ||
1d4e6e15b7
|
|||
d556e28e2d
|
|||
fb70ae6253
|
|||
64ae9c4f86
|
|||
b0d31ee507
|
|||
|
6ac65212d7 | ||
991b3dcec1
|
|||
|
1c9eb16934 | ||
2eaaa11a69
|
|||
3723303e31
|
|||
|
db46938de6 | ||
3054d6519e
|
|||
c6e7a3c239
|
|||
dbf011395c
|
|||
c817e3a17a
|
|||
0edf9cc5a2
|
|||
|
4d34f762d0 | ||
dbd9f8e973
|
|||
|
4fdb32934b | ||
|
5bd96f69e0 | ||
38d2e7c363
|
|||
|
7691209360 | ||
f7216132a4
|
|||
67a8a2bfa4
|
|||
cfd463d2b0
|
|||
91cbc81a12
|
|||
|
c1a83f8baf | ||
3b72fe6d28
|
|||
76b976732b
|
|||
|
bf60d35ed1 | ||
e2cf52af6e
|
|||
414bae101a
|
|||
|
082ea4069d | ||
dfbb4a24db
|
206
GETTING_STARTED.md
Normal file
@@ -0,0 +1,206 @@
|
||||
# Clone the repository
|
||||
|
||||
If git is not installed on the operating system, please install it now
|
||||
(see the git documentation for [instructions on installing git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)).
|
||||
|
||||
To retrieve the code from the repository on anhonesthost.net (a username and
|
||||
password are required), run:
|
||||
|
||||
`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.
|
||||
|
||||
# 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
|
||||
manager or using the modules found in the
|
||||
[Comprehensive Perl Archive Network (CPAN)](https://www.cpan.org/).
|
||||
|
||||
## Installing modules on Debian based Linux distributions
|
||||
|
||||
Run command (tested on Debian 11):
|
||||
|
||||
```
|
||||
apt install libconfig-std-perl \
|
||||
libtemplate-perl \
|
||||
libtemplate-plugin-dbi-perl \
|
||||
libdbd-sqlite3-perl libdate-calc-perl \
|
||||
libtie-dbi-perl \
|
||||
libtext-csv-xs-perl \
|
||||
libhtml-parser-perl \
|
||||
libtemplate-plugin-html-strip-perl
|
||||
|
||||
```
|
||||
|
||||
## Using CPAN to install the modules
|
||||
|
||||
A cross platform method to install the needed modules is the Perl CPAN application.
|
||||
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:
|
||||
|
||||
```
|
||||
cpan Config::Std
|
||||
cpan Template
|
||||
cpan Template::Plugin::DBI
|
||||
cpan DBD::SQLite
|
||||
cpan Date::Calc
|
||||
cpan Tie::DBI
|
||||
```
|
||||
|
||||
# Create the HPR database
|
||||
|
||||
The hpr_generator relies on information from a database to generate many of the
|
||||
files for the website (for example: index.html, series/index.html,
|
||||
hpr_mp3.rss, etc). This data is available from a MySQL dump file found on
|
||||
hackerpublicradio.org at URL "https://www.hackerpublicradio.org/hpr.sql".
|
||||
|
||||
The first step is to download the hpr.sql file. This can be done using your
|
||||
browser, or by running one of the following commands:
|
||||
|
||||
`curl https://www.hackerpublicradio.org/hpr.sql --output ./hpr.sql`
|
||||
|
||||
or
|
||||
|
||||
`wget --directory-prefix=./ https://www.hackerpublicradio.org/hpr.sql`
|
||||
|
||||
## Creating an SQLite database file
|
||||
|
||||
The SQL of the hpr.sql file must be converted from MySQL specific statements to
|
||||
SQLite specific statements. The mysql2sqlite script found in the utils directory
|
||||
is used for this conversion. First remove the lines from hpr.sql that
|
||||
mysql2sqlite can't handle:
|
||||
|
||||
`sed '/^DELIMITER ;;/,/^DELIMITER ;/d' < ./hpr.sql > ./hpr-sqlite.sql`
|
||||
|
||||
Next run the mysql2sqlite script piping its output into the sqlite3
|
||||
program which creates the hpr.db file:
|
||||
|
||||
`./utils/mysql2sqlite ./hpr-sqlite.sql | sqlite3 ./hpr.db`
|
||||
|
||||
For convenience, the update-sqlite-db.sh script in the utils directory
|
||||
automates the above steps (including downloading the hpr.sql file).
|
||||
From the root of the local hpr_generator repository run:
|
||||
|
||||
`./utils/update-sqlite-db.sh`
|
||||
|
||||
# Configure the site-generator
|
||||
|
||||
In your favorite text editor, open the site.cfg file found in the root of the
|
||||
"hpr_generator" folder. Full details about options for configuring the site.cfg
|
||||
file are found in the comments within the file.
|
||||
|
||||
## Configuring the database connection
|
||||
|
||||
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
|
||||
a MySQL or SQLite database.
|
||||
|
||||
Find the [DBI] section of the file. It should look like the following
|
||||
|
||||
```
|
||||
[DBI]
|
||||
# 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)
|
||||
```
|
||||
|
||||
### SQLite
|
||||
|
||||
Remove the comment character from the start of the database and driver
|
||||
option lines:
|
||||
|
||||
```
|
||||
# Configuration settings for SQLite
|
||||
database: sqlite
|
||||
driver: dbi:SQLite:hpr.db
|
||||
#user: (not used - leave blank)
|
||||
#password: (not used - leave blank)
|
||||
```
|
||||
|
||||
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
|
||||
"file://" protocal (i.e. using the "Open..." command in your browser, each HTML
|
||||
file must include a \<base\> meta-data tag in the \<head\> section of its
|
||||
contents. To configure this in the site.cfg file, find the [root_template]
|
||||
section. It should look like the following:
|
||||
|
||||
```
|
||||
[root_template]
|
||||
content: page.tpl.html
|
||||
#baseurl: OPTIONAL [i.e. file://<full path to local website directory>]
|
||||
```
|
||||
Below the #baseurl comment line add:
|
||||
|
||||
```
|
||||
baseurl: file://</path/to>/hpr_generator/public_html
|
||||
```
|
||||
|
||||
Replace \<path/to\> with the full path to the hpr_generator directory. For
|
||||
example: `file:///home/rho_n/development/hpr_generator/public_html`
|
||||
|
||||
## Configuring the website media file links
|
||||
|
||||
If you do not want to host all the media files (currently, audio files and
|
||||
transcription files), you can configure the `media_baseurl` option. This can
|
||||
be added to the [root_template] section of the site.cfg file. Suggested
|
||||
external site is archive.org. To use this site add:
|
||||
|
||||
```
|
||||
media_baseurl: https://archive.org/download/hpr$eps_id/
|
||||
```
|
||||
|
||||
# Run the site-generator
|
||||
|
||||
Run the site generator form the hpr_generator directory:
|
||||
|
||||
```
|
||||
./site-generator --all
|
||||
```
|
||||
|
||||
This will generate all the files for the website. For more examples and to see
|
||||
all available options run:
|
||||
|
||||
```
|
||||
./site-generator --help
|
||||
```
|
36
README.md
@@ -3,12 +3,27 @@ Static web page generator for the Hacker Public Radio website.
|
||||
|
||||
## Installation
|
||||
* Clone or download this repository
|
||||
* Create the sqlite3 database from the files in the _sql directory. The default name for the database file is "hpr.db" and should be located in the root of the project directory. The name and location can be set in the site.cfg file.
|
||||
* Two sql helper scripts are available to generate an empty database or a database filled with test data.
|
||||
- For an empty database: `cat Create_Database_Empty.sql | sqlite3 hpr.db`
|
||||
- For a database with test data: `cat Create_Database_Test.sql | sqlite3 hpr.db`
|
||||
* 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 SQLite
|
||||
* Create the sqlite3 database from the hpr.sql MySQL dump file available on
|
||||
hackerpublicradio.org. The default name for the database file is "hpr.db"
|
||||
and should be located in the root of the project directory. The name and
|
||||
location can be set in the site.cfg file.
|
||||
* An "update-hpr.sh" helper script is available in the utils directory. This
|
||||
script will download the hpr.sql file, convert it to the SQLite hpr.db file,
|
||||
and regenerate the website using the site-generator.
|
||||
1. `cd` into the root of the project directory
|
||||
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
|
||||
* Pod::Usage
|
||||
@@ -18,9 +33,10 @@ Static web page generator for the Hacker Public Radio website.
|
||||
* Template::Plugin::DBI
|
||||
* DBI
|
||||
* Tie::DBI
|
||||
* DBD::SQLite
|
||||
* DBD::SQLite or DBD:mysql
|
||||
* Date::Calc
|
||||
|
||||
* See the Getting Started tutorial (GETTING_STARTED.md) for more details on
|
||||
installing the HPR generator.
|
||||
## Usage
|
||||
Generate two specific pages:
|
||||
`site-generator index about`
|
||||
@@ -50,4 +66,6 @@ and add the label "**Feature Request**".
|
||||
|
||||
## Authors and acknowledgment
|
||||
* Roan "Rho`n" Horning
|
||||
|
||||
* gordons
|
||||
* Ken Fallon
|
||||
* norrist
|
@@ -198,7 +198,7 @@ h1.showtitle { font-size: 125%;}
|
||||
|
||||
p.author { font-size: 85%;}
|
||||
p.shownotes { padding: .5em;}
|
||||
#maincontent footer p { font-size: 75%; margin-bottom: 1em;}
|
||||
#maincontent footer p { /* font-size: 75%; */ margin-bottom: 1em;}
|
||||
/* link styling */
|
||||
a:link {text-decoration: none;}
|
||||
|
||||
@@ -235,7 +235,23 @@ pre { /* Add background, border and scrollbar to <pre> */
|
||||
clear: both;
|
||||
}
|
||||
|
||||
table.hosts {
|
||||
background: white
|
||||
}
|
||||
table.hosts tr:nth-child(even) { background-color:#cccccc; }
|
||||
table.hosts tr:nth-child(odd) { background-color:white; }
|
||||
table.hosts tr td img { vertical-align:middle }
|
||||
|
||||
pre.comment {
|
||||
white-space: pre-wrap;
|
||||
padding: 2px;
|
||||
line-height: 1.2rem;
|
||||
}
|
||||
|
||||
h3.title { margin: 1.25rem 0 0.75rem 0 }
|
||||
p.meta { margin: 0.25rem 0 }
|
||||
p.summary { margin: 0.25rem 0 }
|
||||
p.listen-in { margin-top: 0 }
|
||||
|
||||
@media only screen and (max-width: 680px) {
|
||||
#container {width: 95%;}
|
||||
|
BIN
public_html/images/livestream.png
Normal file
After Width: | Height: | Size: 405 B |
BIN
public_html/images/mumble-howto/01-intro.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
public_html/images/mumble-howto/02-device-selection.png
Normal file
After Width: | Height: | Size: 48 KiB |
BIN
public_html/images/mumble-howto/03-device-tuning.png
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
public_html/images/mumble-howto/04-volume.png
Normal file
After Width: | Height: | Size: 59 KiB |
BIN
public_html/images/mumble-howto/05-ptt.png
Normal file
After Width: | Height: | Size: 48 KiB |
BIN
public_html/images/mumble-howto/06-notts.png
Normal file
After Width: | Height: | Size: 77 KiB |
BIN
public_html/images/mumble-howto/07-positional-audio.png
Normal file
After Width: | Height: | Size: 54 KiB |
BIN
public_html/images/mumble-howto/08-stats.png
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
public_html/images/mumble-howto/09-cert.png
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
public_html/images/mumble-howto/10-finished.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
public_html/images/mumble-howto/11-username.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
public_html/images/mumble-howto/12-accept-cert.png
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
public_html/images/mumble-howto/13-audio-test.png
Normal file
After Width: | Height: | Size: 80 KiB |
BIN
public_html/images/mumble-howto/14-audio-ping.png
Normal file
After Width: | Height: | Size: 80 KiB |
BIN
public_html/images/mumble-howto/15-audio-pong.png
Normal file
After Width: | Height: | Size: 81 KiB |
BIN
public_html/images/mumble-howto/16-hpr-room.png
Normal file
After Width: | Height: | Size: 82 KiB |
BIN
public_html/images/mumble-howto/17-register.png
Normal file
After Width: | Height: | Size: 114 KiB |
BIN
public_html/images/mumble-howto/18-register-confirm.png
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
public_html/images/mumble-howto/20-add-new.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
public_html/images/mumble-howto/21-add-server.png
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
public_html/images/mumble-howto/22-pavucontrol-recording.png
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
public_html/images/mumble-howto/23-pavucontrol-playback.png
Normal file
After Width: | Height: | Size: 29 KiB |
553
site-generator
@@ -1,68 +1,93 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# {{{ POD documentation
|
||||
|
||||
=head1 NAME
|
||||
|
||||
site-generator - HPR Site Generator
|
||||
site-generator - HPR Site Generator
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
site-generator [OPTION]... PAGE|PAGE=<comma separated list of ids>...
|
||||
site-generator [OPTION]... PAGE|PAGE=<comma separated list of ids>...
|
||||
|
||||
-a, --all generate all pages defined in configuration file
|
||||
-l, --list print list of configured pages
|
||||
-p, --preview print generated pages to standard out
|
||||
-q, --quiet suppress progress information while generating pages
|
||||
-v, --verbose print extended progress information while generating pages
|
||||
--help print this help message
|
||||
-a, --all generate all pages defined in configuration file
|
||||
-c, --configuration path to configuration file
|
||||
-l, --list print list of configured pages
|
||||
-p, --preview print generated pages to standard out
|
||||
-q, --quiet suppress progress information while generating pages
|
||||
-v, --verbose print extended progress information while generating pages
|
||||
--help print this help message
|
||||
|
||||
Where I<PAGE> is a file name of a web page
|
||||
or the special I<ALL> (to generate all pages).
|
||||
Where I<PAGE> is a file name of a web page
|
||||
or the special I<ALL> (to generate all pages).
|
||||
|
||||
Examples:
|
||||
Examples:
|
||||
|
||||
Generate two specific pages:
|
||||
site-generator index about
|
||||
Generate two specific pages:
|
||||
site-generator index about
|
||||
|
||||
Generate the whole site:
|
||||
site-generator --all
|
||||
Generate the whole site:
|
||||
site-generator --all
|
||||
|
||||
Generate pages based on the same template:
|
||||
site-generator correspondent=1,3,5..10
|
||||
|
||||
Generate two specific pages with a different configuration:
|
||||
site-generator --configuration=site_sqlite.cfg index about
|
||||
|
||||
Generate pages based on the same template:
|
||||
site-generator correspondent=1,3,5..10
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This is a site generator for the Hacker Public Radio website based upon the Perl Templates Toolkit.
|
||||
This is a site generator for the Hacker Public Radio website based upon the
|
||||
Perl Template Toolkit.
|
||||
|
||||
=head1 INSTALLATION
|
||||
|
||||
* Create the sqlite3 database from the files in the _sql directory. The default name for the
|
||||
database file is "hpr.db" and should be located in the root of the project directory. The
|
||||
name and location can be set in the site.cfg file.
|
||||
* Two sql helper scripts are available to generate an empty database or a database filled with test data.
|
||||
- For an empty database: `cat Create_Database_Empty.sql | sqlite3 hpr.db`
|
||||
- For a database with test data: `cat Create_Database_Test.sql | sqlite3 hpr.db`
|
||||
* 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.
|
||||
* Install the needed Perl modules using preferred method (distribution packages, CPAN, etc.)
|
||||
* GetOpt
|
||||
* Pod::Usage
|
||||
* Config::Std
|
||||
* Template
|
||||
* Template::Plugin::File
|
||||
* Template::Plugin::DBI
|
||||
* DBI
|
||||
* Tie::DBI
|
||||
* DBD::SQLite
|
||||
* Date::Calc
|
||||
With SQLite
|
||||
* Create the sqlite3 database from the hpr.sql MySQL dump file available on
|
||||
hackerpublicradio.org. The default name for the database file is "hpr.db"
|
||||
and should be located in the root of the project directory. The name and
|
||||
location can be set in the site.cfg file.
|
||||
* An "update-hpr.sh" helper script is available in the utils directory. This
|
||||
script will download the hpr.sql file, convert it to the SQLite hpr.db file,
|
||||
and regenerate the website using the site-generator.
|
||||
1. `cd` into the root of the project directory
|
||||
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
|
||||
* Pod::Usage
|
||||
* Config::Std
|
||||
* Template
|
||||
* Template::Plugin::File
|
||||
* Template::Plugin::DBI
|
||||
* Template::Plugin::HTML::Strip
|
||||
* DBI
|
||||
* Tie::DBI
|
||||
* DBD::SQLite or DBD:mysql
|
||||
* Date::Calc
|
||||
* Text::CSV_XS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Roan Horning <roan.horning@no-spam.gmail.com>
|
||||
Roan Horning <roan.horning@no-spam.gmail.com>
|
||||
|
||||
=head1 LICENSE
|
||||
|
||||
site-generator -- a static website generator for HPR
|
||||
Copyright (C) 2022 Roan Horning
|
||||
site-generator -- a static website generator for HPR
|
||||
Copyright (C) 2022 Roan Horning
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
@@ -75,228 +100,334 @@ This is a site generator for the Hacker Public Radio website based upon the Perl
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
=cut
|
||||
|
||||
# }}}
|
||||
|
||||
use 5.012;
|
||||
use strict;
|
||||
use warnings;
|
||||
use open ':encoding(UTF-8)';
|
||||
|
||||
use Getopt::Long qw(:config auto_help);
|
||||
use Pod::Usage;
|
||||
use Config::Std;
|
||||
use Text::CSV_XS;
|
||||
use HTML::Entities qw(encode_entities_numeric);
|
||||
use Date::Calc;
|
||||
use DBI;
|
||||
use DBD::SQLite;
|
||||
use Tie::DBI;
|
||||
use Template;
|
||||
use Template::Plugin::Date;
|
||||
use Template::Plugin::DBI;
|
||||
use Template::Plugin::HTML::Strip;
|
||||
|
||||
use Data::Dumper;
|
||||
|
||||
exit main();
|
||||
|
||||
sub main {
|
||||
|
||||
# Argument parsing
|
||||
my $all;
|
||||
my $preview;
|
||||
my $verbose;
|
||||
my $quiet;
|
||||
GetOptions(
|
||||
'all' => \$all,
|
||||
'list' => \&print_available_pages,
|
||||
'preview' => \$preview,
|
||||
'verbose' => \$verbose,
|
||||
'quiet' => \$quiet,
|
||||
) or pod2usage(1);
|
||||
pod2usage(1) unless @ARGV || $all;
|
||||
my (@page_args) = @ARGV;
|
||||
# Argument parsing
|
||||
my $all;
|
||||
my $configuration_path;
|
||||
my $preview;
|
||||
my $verbose;
|
||||
my $quiet;
|
||||
GetOptions(
|
||||
'all' => \$all,
|
||||
'configuration=s' => \$configuration_path,
|
||||
'list' => \&print_available_pages,
|
||||
'preview' => \$preview,
|
||||
'verbose' => \$verbose,
|
||||
'quiet' => \$quiet,
|
||||
) or pod2usage(1);
|
||||
pod2usage(1) unless @ARGV || $all;
|
||||
my (@page_args) = @ARGV;
|
||||
|
||||
if ($quiet) {
|
||||
$verbose = 'quiet';
|
||||
};
|
||||
if ($quiet) {
|
||||
$verbose = 'quiet';
|
||||
};
|
||||
|
||||
# Load config file
|
||||
read_config "site.cfg" => my %config;
|
||||
if (!$configuration_path) {
|
||||
$configuration_path = "site.cfg";
|
||||
}
|
||||
|
||||
my $tt = get_template_html($config{DBI});
|
||||
my %config;
|
||||
if ( -f $configuration_path ) {
|
||||
# Load config file
|
||||
read_config $configuration_path => %config;
|
||||
}
|
||||
else {
|
||||
print STDOUT "Could not read configuration file: $configuration_path\n";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
# If command line option all is set, parse configuration file
|
||||
# for all pages
|
||||
if ($all) {
|
||||
@page_args = keys %config;
|
||||
my $tt = get_template_html($config{DBI}, $config{app_paths});
|
||||
|
||||
# Remove non page sections of the configuration file
|
||||
# from the generated list of pages.
|
||||
@page_args= grep { $_ ne 'DBI' } @page_args;
|
||||
@page_args= grep { $_ ne 'root_template' } @page_args;
|
||||
};
|
||||
foreach my $page_arg (@page_args) {
|
||||
my %parsed_arg = parse_page_arg($page_arg);
|
||||
if (exists($config{$parsed_arg{'page'}})) {
|
||||
my $page_config = $config{$parsed_arg{'page'}};
|
||||
$page_config->{'page'} = $parsed_arg{'page'};
|
||||
#
|
||||
# Define a TT² vmethod called 'csv_parse', it takes a scalar value and
|
||||
# returns an arrayref. Also define a filter called 'xml_entity' which
|
||||
# numerically encodes non-ASCII characters.
|
||||
#
|
||||
$tt->context->define_vmethod( 'scalar', 'csv_parse', \&parse_csv );
|
||||
$tt->context->define_filter( 'xml_entity', \&xml_entity );
|
||||
|
||||
# Set page's root_template to the default root_template if the
|
||||
# page root_template property is not set in the configuration file.
|
||||
if (exists $page_config->{'root_template'} == 0) {
|
||||
$page_config->{'root_template'} = $config{root_template}{content};
|
||||
}
|
||||
# If command line option all is set, parse configuration file
|
||||
# for all pages
|
||||
if ($all) {
|
||||
@page_args = keys %config;
|
||||
|
||||
if (exists $config{root_template}{baseurl}) {
|
||||
$page_config->{'baseurl'} = $config{root_template}{baseurl};
|
||||
}
|
||||
# Remove non page sections of the configuration file
|
||||
# from the generated list of pages.
|
||||
@page_args= grep { $_ ne 'DBI' } @page_args;
|
||||
@page_args= grep { $_ ne 'root_template' } @page_args;
|
||||
@page_args= grep { $_ ne 'app_paths' } @page_args;
|
||||
|
||||
if ($page_config->{'multipage'} && $page_config->{'multipage'} eq 'true') {
|
||||
if (scalar @{$parsed_arg{'ids'}} == 1) {
|
||||
@{$parsed_arg{'ids'}} = get_ids_from_db($tt, \$page_config);
|
||||
}
|
||||
foreach my $id (@{$parsed_arg{'ids'}}) {
|
||||
$page_config->{'id'} = $id;
|
||||
verbose ($verbose, "Generating page: $page_config->{'page'} with id: $id");
|
||||
generate_page($tt, \$page_config, $preview);
|
||||
}
|
||||
}
|
||||
else {
|
||||
verbose ($verbose, "Generating page: $page_config->{'page'}");
|
||||
generate_page($tt, \$page_config, $preview);
|
||||
}
|
||||
}
|
||||
else {
|
||||
verbose (1, "\nWarning: Page $parsed_arg{'page'} is not defined in the configuration file.");
|
||||
}
|
||||
}
|
||||
};
|
||||
foreach my $page_arg (@page_args) {
|
||||
my %parsed_arg = parse_page_arg($page_arg);
|
||||
if (exists($config{$parsed_arg{'page'}})) {
|
||||
my $page_config = $config{$parsed_arg{'page'}};
|
||||
$page_config->{'page'} = $parsed_arg{'page'};
|
||||
|
||||
# Set page's root_template to the default root_template if the
|
||||
# page root_template property is not set in the configuration file.
|
||||
if (exists $page_config->{'root_template'} == 0) {
|
||||
$page_config->{'root_template'} = $config{root_template}{content};
|
||||
}
|
||||
|
||||
# Set all config root_template properties as default page config properties
|
||||
# except the previously set root_template content property
|
||||
my @root_args = grep { $_ ne 'content' } keys %{$config{root_template}};
|
||||
foreach my $root_arg (@root_args) {
|
||||
if (exists $page_config->{$root_arg} == 0) {
|
||||
$page_config->{$root_arg} = $config{root_template}{$root_arg};
|
||||
}
|
||||
}
|
||||
|
||||
if ($page_config->{'multipage'} && $page_config->{'multipage'} eq 'true') {
|
||||
if (scalar @{$parsed_arg{'ids'}} == 0) {
|
||||
@{$parsed_arg{'ids'}} = get_ids_from_db($tt, \$page_config);
|
||||
}
|
||||
foreach my $id (@{$parsed_arg{'ids'}}) {
|
||||
$page_config->{'id'} = $id;
|
||||
verbose ($verbose, "Generating page: $page_config->{'page'} with id: $id");
|
||||
generate_page($tt, \$page_config, $preview);
|
||||
}
|
||||
}
|
||||
else {
|
||||
verbose ($verbose, "Generating page: $page_config->{'page'}");
|
||||
generate_page($tt, \$page_config, $preview);
|
||||
}
|
||||
}
|
||||
else {
|
||||
verbose (1, "\nWarning: Page $parsed_arg{'page'} is not defined in the configuration file.");
|
||||
}
|
||||
}
|
||||
verbose (1, "\nFinished processing the files.");
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
sub get_template_html (\%@) {
|
||||
# For an HTML based Template file, define the
|
||||
# template start and end tags to also function as
|
||||
# HTML comments to make the template file valid HTML.
|
||||
#
|
||||
return Template->new({
|
||||
INCLUDE_PATH => './templates',
|
||||
OUTPUT_PATH => './public_html',
|
||||
EVAL_PERL => 1,
|
||||
START_TAG => '<!--%',
|
||||
END_TAG => '%-->',
|
||||
PRE_CHOMP => 1,
|
||||
POST_CHOMP => 1,
|
||||
CONSTANTS => {
|
||||
driver => $_[0]{driver},
|
||||
user => $_[0]{user},
|
||||
password => $_[0]{password},
|
||||
}
|
||||
}) || die $Template::ERROR, "\n";
|
||||
# For an HTML based Template file, define the
|
||||
# template start and end tags to also function as
|
||||
# HTML comments to make the template file valid HTML.
|
||||
#
|
||||
return Template->new(
|
||||
{ INCLUDE_PATH => $_[1]{templates_path},
|
||||
OUTPUT_PATH => $_[1]{output_path},
|
||||
EVAL_PERL => 1,
|
||||
START_TAG => '<!--%',
|
||||
END_TAG => '%-->',
|
||||
PRE_CHOMP => 1,
|
||||
POST_CHOMP => 1,
|
||||
CONSTANTS => {
|
||||
database => $_[0]{database},
|
||||
driver => $_[0]{driver},
|
||||
user => $_[0]{user},
|
||||
password => $_[0]{password},
|
||||
}
|
||||
}
|
||||
) || die $Template::ERROR, "\n";
|
||||
|
||||
}
|
||||
|
||||
sub generate_page {
|
||||
my ($tt, $config, $preview) = @_;
|
||||
my $html;
|
||||
if (!$preview) {
|
||||
$html = get_filename($$config);
|
||||
}
|
||||
$tt->process($$config->{root_template}, $$config, $html)
|
||||
|| die $tt->error(), "\n";
|
||||
sub generate_page {
|
||||
my ( $tt, $config, $preview ) = @_;
|
||||
my $html;
|
||||
if ( !$preview ) {
|
||||
$html = get_filename($$config);
|
||||
}
|
||||
$tt->process( $$config->{root_template},
|
||||
$$config, $html
|
||||
)
|
||||
|| die $tt->error(), "\n";
|
||||
|
||||
}
|
||||
|
||||
sub verbose {
|
||||
my ($verbose, $message) = @_;
|
||||
if ($verbose) {
|
||||
if ($verbose ne 'quiet') {
|
||||
print STDOUT "$message\n";
|
||||
}
|
||||
}
|
||||
else {
|
||||
STDOUT->autoflush(1);
|
||||
print STDOUT ".";
|
||||
};
|
||||
my ($verbose, $message) = @_;
|
||||
if ($verbose) {
|
||||
if ($verbose ne 'quiet') {
|
||||
print STDOUT "$message\n";
|
||||
}
|
||||
}
|
||||
else {
|
||||
STDOUT->autoflush(1);
|
||||
print STDOUT ".";
|
||||
};
|
||||
}
|
||||
|
||||
sub parse_page_arg {
|
||||
my ($page_arg) = @_;
|
||||
# Split page name from page ids if available.
|
||||
my ($page, $ids) = split(/=/, $page_arg);
|
||||
my @ids = [];
|
||||
my ($page_arg) = @_;
|
||||
# Split page name from page ids if available.
|
||||
my ($page, $ids) = split(/=/, $page_arg);
|
||||
my @ids;
|
||||
|
||||
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]);
|
||||
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]);
|
||||
}
|
||||
|
||||
sub get_ids_from_db {
|
||||
# Use a template to generate a string of page identifiers.
|
||||
# The template should return the string in the form of
|
||||
# <comma><identifier><comma><identifier>...
|
||||
#
|
||||
my ($tt, $config) = @_;
|
||||
my $selected_ids = "";
|
||||
my $id_template = "ids-$$config->{'page'}.tpl.html";
|
||||
# Use a template to generate a string of page identifiers.
|
||||
# The template should return the string in the form of
|
||||
# <comma><identifier><comma><identifier>...
|
||||
#
|
||||
my ($tt, $config) = @_;
|
||||
my $selected_ids = "";
|
||||
my $id_template = "ids-$$config->{'page'}.tpl.html";
|
||||
|
||||
$tt->process($id_template, $$config, \$selected_ids)
|
||||
|| die $tt->error(), "\n";
|
||||
|
||||
return split(/,/, substr($selected_ids, 1));
|
||||
$tt->process($id_template, $$config, \$selected_ids)
|
||||
|| die $tt->error(), "\n";
|
||||
|
||||
# Starts with a newline and comma
|
||||
return split(/,/, substr($selected_ids, 2));
|
||||
}
|
||||
|
||||
sub get_filename {
|
||||
my ($config) = @_;
|
||||
my $filename = "output.html";
|
||||
my $base_path = "";
|
||||
my ($config) = @_;
|
||||
my $filename = "output.html";
|
||||
my $base_path = "";
|
||||
|
||||
if ($$config{'filename'}) {
|
||||
if (substr($$config{'filename'}, -1) eq '/') {
|
||||
$base_path = $$config{'filename'};
|
||||
}
|
||||
else {
|
||||
$filename = $$config{'filename'};
|
||||
my $padded_index = "";
|
||||
if (exists $$config{'id'}) {
|
||||
$padded_index = sprintf("%04d", $$config{'id'});
|
||||
}
|
||||
$filename =~ s/\[id\]/$padded_index/;
|
||||
return $filename;
|
||||
}
|
||||
}
|
||||
# Default naming if full filename configuration is not supplied.
|
||||
if ($$config{'multipage'} && $$config{'multipage'} eq 'true') {
|
||||
my $padded_index = sprintf("%04d", $$config{'id'});
|
||||
$filename = "$base_path$$config{'page'}${padded_index}.html";
|
||||
}
|
||||
else {
|
||||
$filename = "$base_path$$config{'page'}.html";
|
||||
}
|
||||
return $filename;
|
||||
if ($$config{'filename'}) {
|
||||
if (substr($$config{'filename'}, -1) eq '/') {
|
||||
$base_path = $$config{'filename'};
|
||||
}
|
||||
else {
|
||||
$filename = $$config{'filename'};
|
||||
my $padded_index = "";
|
||||
if (exists $$config{'id'} && $$config{'id'} ne "") {
|
||||
$padded_index = sprintf("%04d", $$config{'id'});
|
||||
}
|
||||
$filename =~ s/\[id\]/$padded_index/;
|
||||
return $filename;
|
||||
}
|
||||
}
|
||||
# Default naming if full filename configuration is not supplied.
|
||||
if ($$config{'multipage'} && $$config{'multipage'} eq 'true') {
|
||||
my $padded_index = sprintf("%04d", $$config{'id'});
|
||||
$filename = "$base_path$$config{'page'}${padded_index}.html";
|
||||
}
|
||||
else {
|
||||
$filename = "$base_path$$config{'page'}.html";
|
||||
}
|
||||
return $filename;
|
||||
}
|
||||
|
||||
sub print_available_pages {
|
||||
# Load config file
|
||||
read_config "site.cfg" => my %config;
|
||||
# Load config file
|
||||
read_config "site.cfg" => my %config;
|
||||
|
||||
my @page_args = sort (keys %config);
|
||||
my @page_args = sort ( keys %config );
|
||||
|
||||
# Remove non page sections of the configuration file
|
||||
# from the generated list of pages.
|
||||
@page_args= grep { $_ ne 'DBI' } @page_args;
|
||||
@page_args= grep { $_ ne 'root_template' } @page_args;
|
||||
# Remove non page sections of the configuration file
|
||||
# from the generated list of pages.
|
||||
@page_args = grep { $_ ne 'DBI' } @page_args;
|
||||
@page_args = grep { $_ ne 'root_template' } @page_args;
|
||||
|
||||
foreach my $page_arg (@page_args) {
|
||||
print "$page_arg\n";
|
||||
}
|
||||
exit;
|
||||
foreach my $page_arg (@page_args) {
|
||||
print "$page_arg\n";
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
#=== FUNCTION ================================================================
|
||||
# NAME: parse_csv
|
||||
# PURPOSE: Parses a simple string containing CSV data
|
||||
# PARAMETERS: $csv_in CSV string
|
||||
# RETURNS: An arrayref containing the parsed CSV elements
|
||||
# DESCRIPTION: The Text::CSV_XS module instance is created with the option
|
||||
# 'allow_whitespace' to be forgiving of any spaces around the
|
||||
# CSV elements and to strip them. Also, 'allow_loose_quotes' is
|
||||
# forgiving of really messed up CSV. The 'binary' option
|
||||
# permits any characters in the tags (expecting Unicode).
|
||||
# The fields parsed from the tag string is checked for the
|
||||
# existence of utf8 characters and encoded to ensure any found
|
||||
# are properly stored.
|
||||
# THROWS: No exceptions
|
||||
# COMMENTS: None
|
||||
# SEE ALSO: N/A
|
||||
#===============================================================================
|
||||
sub parse_csv {
|
||||
my ($csv_in) = @_;
|
||||
|
||||
my $csv = Text::CSV_XS->new(
|
||||
{ binary => 1,
|
||||
auto_diag => 1,
|
||||
allow_whitespace => 1,
|
||||
allow_loose_quotes => 1
|
||||
}
|
||||
);
|
||||
my $status = $csv->parse($csv_in);
|
||||
unless ( $status ) {
|
||||
warn "Failed to parse CSV '$csv_in'\n" ;
|
||||
return;
|
||||
}
|
||||
my @fields = $csv->fields();
|
||||
|
||||
@fields = map {utf8::encode($_) if utf8::is_utf8($_); $_} @fields;
|
||||
|
||||
return \@fields;
|
||||
}
|
||||
|
||||
#=== FUNCTION ================================================================
|
||||
# NAME: xml_entity
|
||||
# PURPOSE: Static filter to encode Unicode for XML
|
||||
# PARAMETERS: $text String to be processed
|
||||
# RETURNS: Processed text
|
||||
# DESCRIPTION:
|
||||
# THROWS: No exceptions
|
||||
# COMMENTS: None
|
||||
# SEE ALSO: N/A
|
||||
#===============================================================================
|
||||
sub xml_entity {
|
||||
my ($text) = @_;
|
||||
|
||||
encode_entities_numeric( $text );
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
# vim: syntax=perl:ts=8:sw=4:et:ai:tw=78:fo=tcrqn21:fdm=marker
|
||||
|
123
site.cfg
@@ -1,10 +1,24 @@
|
||||
# Configure the Perl DBI driver to allow the templates communicate
|
||||
# with the database.
|
||||
# dbi:<driver name [SQLite, CSV, ADO, mSQL, etc.]>:<database name>
|
||||
# For more information on Perl Template Toolkit see:
|
||||
# http://template-toolkit.org/docs/manual/index.html
|
||||
[DBI]
|
||||
# Configuration settings for SQLite
|
||||
database: sqlite
|
||||
driver: dbi:SQLite:hpr.db
|
||||
user:
|
||||
password:
|
||||
#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
|
||||
output_path: ./public_html
|
||||
|
||||
# Configure the root template page which pulls in the navigation and
|
||||
# content templates used by each page. An optional baseurl property may
|
||||
@@ -13,6 +27,12 @@ password:
|
||||
[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/
|
||||
hub_baseurl: https://hub.hackerpublicradio.org/
|
||||
media_baseurl: https://archive.org/download/hpr$eps_id/
|
||||
generator_name: The HPR Robot
|
||||
generator_email: robot.nospam@nospam.hackerpublicradio.org
|
||||
|
||||
# Configure the navigation menu and the content templates for each page
|
||||
# of the site:
|
||||
@@ -48,9 +68,9 @@ navigation: navigation-about.tpl.html
|
||||
content: content-correspondents.tpl.html
|
||||
filename: correspondents/index.html
|
||||
|
||||
[contact]
|
||||
navigation: navigation-about.tpl.html
|
||||
content: content-contact.tpl.html
|
||||
# [contact]
|
||||
# navigation: navigation-about.tpl.html
|
||||
# content: content-contact.tpl.html
|
||||
|
||||
[correspondent]
|
||||
navigation: navigation-about.tpl.html
|
||||
@@ -100,9 +120,9 @@ content: content-help_out.tpl.html
|
||||
navigation: navigation-get-shows.tpl.html
|
||||
content: content-download.tpl.html
|
||||
|
||||
[stuff_you_need_to_know]
|
||||
navigation: navigation-give-shows.tpl.html
|
||||
content: content-stuff_you_need_to_know.tpl.html
|
||||
# [stuff_you_need_to_know]
|
||||
# navigation: navigation-give-shows.tpl.html
|
||||
# content: content-stuff_you_need_to_know.tpl.html
|
||||
|
||||
[theme]
|
||||
navigation: navigation-give-shows.tpl.html
|
||||
@@ -132,40 +152,63 @@ content: content-promote.tpl.html
|
||||
navigation: navigation-about.tpl.html
|
||||
content: content-sitemap.tpl.html
|
||||
|
||||
[hpr_ogg]
|
||||
root_template: rss.tpl.xml
|
||||
content: rss-hpr.tpl.xml
|
||||
filename: hpr_ogg.rss
|
||||
media_file_extension: ogg
|
||||
[tags]
|
||||
navigation: navigation-main.tpl.html
|
||||
content: content-tags.tpl.html
|
||||
|
||||
[hpr_mp3]
|
||||
root_template: rss.tpl.xml
|
||||
content: rss-hpr.tpl.xml
|
||||
filename: hpr_mp3.rss
|
||||
media_file_extension: mp3
|
||||
audio_mime_type: mpeg
|
||||
[twat_episode]
|
||||
navigation: navigation-get-shows.tpl.html
|
||||
content: content-twat_episode.tpl.html
|
||||
multipage: true
|
||||
filename: eps/twat[id]/index.html
|
||||
media_baseurl: https://www.hackerpublicradio.org/eps/
|
||||
|
||||
[hpr_spx]
|
||||
root_template: rss.tpl.xml
|
||||
content: rss-hpr.tpl.xml
|
||||
filename: hpr_spx.rss
|
||||
media_file_extension: spx
|
||||
[mumble-howto]
|
||||
navigation: navigation-about.tpl.html
|
||||
content: content-mumble-howto.tpl.html
|
||||
|
||||
[hpr_total_ogg]
|
||||
root_template: rss.tpl.xml
|
||||
content: rss-hpr_total.tpl.xml
|
||||
filename: hpr_total_ogg.rss
|
||||
media_file_extension: ogg
|
||||
[comments_viewer]
|
||||
navigation: navigation-about.tpl.html
|
||||
content: content-comments_viewer.tpl.html
|
||||
|
||||
[hpr_total_mp3]
|
||||
root_template: rss.tpl.xml
|
||||
content: rss-hpr_total.tpl.xml
|
||||
filename: hpr_total_mp3.rss
|
||||
media_file_extension: mp3
|
||||
audio_mime_type: mpeg
|
||||
# [hpr_ogg]
|
||||
# root_template: rss.tpl.xml
|
||||
# content: rss-hpr.tpl.xml
|
||||
# filename: hpr_ogg.rss
|
||||
# media_file_extension: ogg
|
||||
#
|
||||
# [hpr_mp3]
|
||||
# root_template: rss.tpl.xml
|
||||
# content: rss-hpr.tpl.xml
|
||||
# filename: hpr_mp3.rss
|
||||
# media_file_extension: mp3
|
||||
# audio_mime_type: mpeg
|
||||
#
|
||||
# [hpr_spx]
|
||||
# root_template: rss.tpl.xml
|
||||
# content: rss-hpr.tpl.xml
|
||||
# filename: hpr_spx.rss
|
||||
# media_file_extension: spx
|
||||
#
|
||||
# [hpr_total_ogg]
|
||||
# root_template: rss.tpl.xml
|
||||
# content: rss-hpr_total.tpl.xml
|
||||
# filename: hpr_total_ogg.rss
|
||||
# media_file_extension: ogg
|
||||
#
|
||||
# [hpr_total_mp3]
|
||||
# root_template: rss.tpl.xml
|
||||
# content: rss-hpr_total.tpl.xml
|
||||
# filename: hpr_total_mp3.rss
|
||||
# media_file_extension: mp3
|
||||
# audio_mime_type: mpeg
|
||||
#
|
||||
# [hpr_total_spx]
|
||||
# root_template: rss.tpl.xml
|
||||
# content: rss-hpr_total.tpl.xml
|
||||
# filename: hpr_total_spx.rss
|
||||
# media_file_extension: spx
|
||||
|
||||
[hpr_total_spx]
|
||||
root_template: rss.tpl.xml
|
||||
content: rss-hpr_total.tpl.xml
|
||||
filename: hpr_total_spx.rss
|
||||
media_file_extension: spx
|
||||
[comments]
|
||||
root_template: rss-comments.tpl.xml
|
||||
filename: comments.rss
|
||||
|
@@ -1,48 +1,792 @@
|
||||
<h1>About HPR.</h1>
|
||||
<h2 id="history">History<a href="#history">.</a></h2>
|
||||
<p>Hacker Public Radio (HPR) is an Internet Radio show (podcast) that releases shows every weekday Monday through Friday. HPR has a long lineage going back to <a target="_blank" href="http://www.oldskoolphreak.com" target="_blank">Radio FreeK America</a>, <a target="_blank" href="http://www.binrev.com" target="_blank">Binary Revolution Radio</a> & <a target="_blank" href="http://nomicon.info" target="_blank">Infonomicon</a>, and it is a direct continuation of <a target="_blank" href="<!--% absolute_url(baseurl) %-->twat.html" target="_blank">Twatech</a> radio. Please listen to StankDawg's "<a target="_blank" href="<!--% absolute_url(baseurl) %-->eps/hpr0001.mp3" target="_blank">Introduction to HPR</a>" for more information.</p>
|
||||
<h1 id="welcome">Welcome to HPR<a href="<!--% absolute_url(baseurl,'about.html#about') %-->">.</a></h1>
|
||||
|
||||
<ul>
|
||||
<li><a href="<!--% absolute_url(baseurl,'about.html#about') %-->">About HPR.</a></li>
|
||||
<li><a href="<!--% absolute_url(baseurl,'about.html#contact') %-->">Contact.</a></li>
|
||||
<li><a href="<!--% absolute_url(baseurl,'about.html#press') %-->">In the Press.</a></li>
|
||||
<li><a href="<!--% absolute_url(baseurl,'about.html#so_you_want_to_record_a_podcast') %-->">So you want to record a podcast.</a></li>
|
||||
<li><a href="<!--% absolute_url(baseurl,'about.html#requested_topics') %-->">Requested Topics.</a></li>
|
||||
<li><a href="<!--% absolute_url(baseurl,'about.html#agreement') %-->">Stuff you need to know.</a></li>
|
||||
<li><a href="<!--% absolute_url(baseurl,'about.html#recording_a_podcast') %-->">Recording a Podcast.</a></li>
|
||||
<li><a href="<!--% absolute_url(baseurl,'about.html#promote_hpr') %-->">Please promote HPR.</a></li>
|
||||
<li><a href="<!--% absolute_url(baseurl,'about.html#requesting_slot') %-->">Picking a slot for your show.</a></li>
|
||||
<li><a href="<!--% absolute_url(baseurl,'about.html#adding_an_episode') %-->">Adding an Episode.</a></li>
|
||||
<li><a href="<!--% absolute_url(baseurl,'about.html#scheduling_guidelines') %-->">Scheduling Guidelines.</a></li>
|
||||
<li><a href="<!--% absolute_url(baseurl,'about.html#reserve_queue') %-->">The reserve queue.</a></li>
|
||||
<li><a href="<!--% absolute_url(baseurl,'about.html#workflow') %-->">Workflow.</a></li>
|
||||
<li><a href="<!--% absolute_url(baseurl,'about.html#faq') %-->">Frequently Asked Questions.</a></li>
|
||||
</ul>
|
||||
|
||||
<h2 id="community">The HPR Community<a href="#community">.</a></h2>
|
||||
<p>What differentiates HPR from other podcasts is that the shows are crowd sourced from the community - fellow listeners like <strong><a target="_blank" href="<!--% absolute_url(baseurl) %-->contact.html" target="_blank">you</a></strong>. There is no restriction on how long the show can be, nor on the topic you can cover as long as they are not spam and <em>"are of interest to <a target="_blank" href="http://en.wikipedia.org/wiki/Hacker_(hobbyist)" target="_blank">Hackers</a>"</em>. If you want to see what topics have been covered so far just have a look at our <a target="_blank" href="<!--% absolute_url(baseurl) %-->eps/index.html" target="_blank">Archive</a>. We also allow for a <a target="_blank" href="<!--% absolute_url(baseurl) %-->series/index.html" target="_blank">series</a> of shows so that hosts can go into more detail on a topic.<p>
|
||||
<h1 id="about">About HPR<a href="<!--% absolute_url(baseurl,'about.html#about') %-->">.</a></h1>
|
||||
|
||||
<p>You can download/listen to the shows <a target="_blank" href="<!--% absolute_url(baseurl) %-->eps/index.html" target="_blank">here</a> or you can <a target="_blank" href="<!--% absolute_url(baseurl) %-->hpr_rss.php" target="_blank">subscribe</a> to the show in your favorite podcatching client to automatically get our new shows as soon as they are available. You can copy and redistribute the shows for free provided you adhere to the <a target="_blank" href="https://creativecommons.org/licenses/by-sa/4.0/" target="_blank">Creative Commons Attribution<WBR> Share Alike 3.0 License</a>.</p>
|
||||
<h2 id="community">The HPR Community<a href="<!--% absolute_url(baseurl,'about.html#community') %-->">.</a></h2>
|
||||
<p>What differentiates HPR from other podcasts is that the shows are crowd sourced from the community - fellow listeners like <strong><a href="<!--% absolute_url(baseurl,'about.html#contact') %-->">you</a></strong>. There is no restriction on how long the show can be, nor on the topic you can cover as long as they are not spam and <em>"are of interest to <a href="http://en.wikipedia.org/wiki/Hacker_(hobbyist)" >Hackers</a>"</em>. If you want to see what topics have been covered so far just have a look at our <a href="<!--% absolute_url(baseurl,'eps/index.html') %-->">Archive</a>. We also allow for a <a href="<!--% absolute_url(baseurl,'series/index.html') %-->">series</a> of shows so that hosts can go into more detail on a topic.<p>
|
||||
|
||||
<h2 id="free_culture">Free Culture<a href="#free_culture">.</a></h2>
|
||||
<p>Hacker Public Radio is dedicated to sharing knowledge. We do not accept donations so please consider supporting our patrons. If you listen to HPR, then we would love you to <a target="_blank" href="contribute.html">contribute</a> one show a year. Our shows are by default released under a <a target="_blank" href="https://creativecommons.org/licenses/by-sa/4.0/" target="_blank">Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)</a> license. All the software we use is <a target="_blank" href="https://en.wikipedia.org/wiki/Free_software" target="_blank">Free software</a>. All the code we develop is published in our <a target="_blank" href="http://gitlab.anhonesthost.com/HPR/HPR_Public_Code/" target="_blank">gitlab</a> repository. All the media is available via the feeds. We are going through an audit process to release the website code as well.</p>
|
||||
<p>You can download/listen to the shows <a href="<!--% absolute_url(baseurl,'eps/index.html') %-->">here</a> or you can <a href="<!--% absolute_url(baseurl,'syndication.html') %-->">subscribe</a> to the show in your favorite podcatching client to automatically get our new shows as soon as they are available. You can copy and redistribute the shows for free provided you adhere to the <a href="https://creativecommons.org/licenses/by-sa/4.0/" >Creative Commons Attribution<WBR> Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) License</a>.</p>
|
||||
|
||||
<h2 id="history">History<a href="<!--% absolute_url(baseurl,'about.html#history') %-->">.</a></h2>
|
||||
<p>Hacker Public Radio (HPR) is an Internet Radio show (podcast) that releases shows every weekday Monday through Friday. HPR has a long lineage going back to <a href="http://www.oldskoolphreak.com" >Radio FreeK America</a>, <a href="http://www.binrev.com" >Binary Revolution Radio</a> & <a href="http://nomicon.info" >Infonomicon</a>, and it is a direct continuation of <a href="<!--% absolute_url(baseurl,'twat.html') %-->" >Twatech</a> radio. Please listen to StankDawg's "<a href="<!--% media_path(1, 'hpr', 'mp3', baseurl, media_baseurl) %-->" >Introduction to HPR</a>" for more information.</p>
|
||||
|
||||
<h2 id="free_culture">Free Culture<a href="<!--% absolute_url(baseurl,'about.html#free_culture') %-->">.</a></h2>
|
||||
<p>Hacker Public Radio is dedicated to sharing knowledge. We do not accept donations so please consider supporting our patrons. If you listen to HPR, then we would love you to <a href="contribute.html">contribute</a> one show a year. Our shows are by default 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. All the software we use is <a href="https://en.wikipedia.org/wiki/Free_software" >Free software</a>. All the code we develop is published in our <a href="http://gitlab.anhonesthost.com/HPR/HPR_Public_Code/" >gitlab</a> repository. All the media is available via the feeds. We are going through an audit process to release the website code as well.</p>
|
||||
|
||||
<h2 id ="governance" >Governance<a href="#governance">.</a></h2>
|
||||
<p>HPR is entirely community driven. Policy decisions are proposed and discussed on the <a target="_blank" href="http://www.hackerpublicradio.org/maillist" target="_blank">Mailing list</a>, which is open to anyone to join. Mailing list discussions are brought to the attention of the listening community on the first Monday of the month in the <a target="_blank" href="<!--% absolute_url(baseurl) %-->series/0047.html" target="_blank">HPR Community News</a> show. This show is also <a target="_blank" href="<!--% absolute_url(baseurl) %-->recording.html#round_table" target="_blank">open to anyone</a> to participate in. The schedule for the Community News shows can be downloaded as an <a href="<!--% absolute_url(baseurl) %-->HPR_Community_News_schedule.ics">iCal calendar</a> containing recording dates for the next 12 months. A reminder is also sent to the mailing list in the week before the recording.</p>
|
||||
<p>Our hosting is kindly provided to us by <a target="_blank" href="<!--% absolute_url(baseurl) %-->correspondents/0174.html">Josh Knapp</a> from <a target="_blank" href="https://anhonesthost.com/hosting/shared-hosting">AnHonestHost.com</a>, and he has the last word in issues related to site security. A changing team of volunteers called the "admins" or "Janitors", deal with the day to day operation of HPR. Acting as the first point of contact, processing the shows, coordinating policy discussions, removing spam, updating the website, etc. They are contactable via the email account admin @ HPR. They have no more say over policy than anyone else. Anyone who has shown a long term dedication to the project and is trusted by the community, can become an admin.
|
||||
<h2 id ="governance" >Governance<a href="<!--% absolute_url(baseurl,'about.html#governance') %-->">.</a></h2>
|
||||
<p>HPR is entirely community driven. Policy decisions are proposed and discussed on the <a href="<!--% absolute_url(baseurl,'/maillist') %-->" >Mailing list</a>, which is open to anyone to join. Mailing list discussions are brought to the attention of the listening community on the first Monday of the month in the <a href="<!--% absolute_url(baseurl,'series/0047.html') %-->" >HPR Community News</a> show. This show is also <a href="<!--% absolute_url(baseurl,'recording.html#round_table') %-->" >open to anyone</a> to participate in. The schedule for the Community News shows can be downloaded as an <a href="<!--% absolute_url(baseurl,'HPR_Community_News_schedule.ics') %-->">iCal calendar</a> containing recording dates for the next 12 months. A reminder is also sent to the mailing list in the week before the recording.</p>
|
||||
<p>Our hosting is kindly provided to us by <a href="<!--% absolute_url(baseurl,'correspondents/0174.html') %-->">Josh Knapp</a> from <a href="https://anhonesthost.com/hosting/shared-hosting">AnHonestHost.com</a>, and he has the last word in issues related to site security. A changing team of volunteers called the "admins" or "Janitors", deal with the day to day operation of HPR. Acting as the first point of contact, processing the shows, coordinating policy discussions, removing spam, updating the website, etc. They are contactable via the email account admin @ HPR. They have no more say over policy than anyone else. Anyone who has shown a long term dedication to the project and is trusted by the community, can become an admin.
|
||||
</p>
|
||||
<p>Click <a target="_blank" href="<!--% absolute_url(baseurl) %-->stuff_you_need_to_know.html" target="_blank">here</a> for more information.</p>
|
||||
<p>See the section <a href="<!--% absolute_url(baseurl,'about.html#stuff_you_need_to_know') %-->" >stuff you need to know</a> for more information.</p>
|
||||
<h3 id="recent_policy_changes">Recent Policy Changes</h3>
|
||||
<ul>
|
||||
<li><a href="http://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-July/014969.html">HPR will move #oggcastplanet on libera, and we will also include links to the matrix, and mastodon channel</a></li>
|
||||
<li><a href="http://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-August/014973.html">Existing shows will be flagged with the current version and new shows will default to "Attribution 4.0 International (CC BY 4.0)"</a></li>
|
||||
<li><a href="http://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-November/015100.html">The Intro Outro will be changed and the upload form will remove the option to add intro and outros.</a></li>
|
||||
<li><a href="http://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-December/015114.html">Removal of "by arranged permission" when posting to HPR</a></li>
|
||||
<li><a href="https://lists.hackerpublicradio.com/pipermail/hpr/2021-July/004191.html">HPR will move #oggcastplanet on libera, and we will also include links to the matrix, and mastodon channel</a></li>
|
||||
<li><a href="https://lists.hackerpublicradio.com/pipermail/hpr/2021-August/004200.html">Existing shows will be flagged with the current version and new shows will default to "Attribution 4.0 International (CC BY 4.0)"</a></li>
|
||||
<li><a href="https://lists.hackerpublicradio.com/pipermail/hpr/2021-November/004328.html">The Intro Outro will be changed and the upload form will remove the option to add intro and outros.</a></li>
|
||||
<li><a href="https://lists.hackerpublicradio.com/pipermail/hpr/2021-December/004341.html">Removal of "by arranged permission" when posting to HPR</a></li>
|
||||
</ul>
|
||||
<h2 id ="patrons" >Please support our Patrons<a href="#patrons">.</a></h2>
|
||||
<h2 id ="patrons" >Please support our Patrons<a href="<!--% absolute_url(baseurl,'about.html#patrons') %-->">.</a></h2>
|
||||
<p>
|
||||
Our hosting is kindly provided by <a href="http://hackerpublicradio.org/correspondents/0174.html">Josh</a> from <a href="https://anhonesthost.com/shared-hosting/">AnHonestHost.com</a>. We would appreciate it if you could <a href="https://secure.anhonesthost.com/cart.php?gid=17">donate</a> to help reduce his costs in funding the hosting. He is also accepting bitcoins to <em>1KsxJr9HtsdaUeU7yaV9bk9bQi21UPBtUq</em>
|
||||
</p>
|
||||
<p>
|
||||
Please also consider supporting the <a href="https://archive.org/donate/">https://archive.org/donate/</a> who are now hosting our media files.
|
||||
</p>
|
||||
|
||||
<hr />
|
||||
|
||||
<h2 id ="press" >In the Press<a href="#press">.</a></h2>
|
||||
<h1 id="contact">Contact<a href="<!--% absolute_url(baseurl,'about.html#contact') %-->">.</a></h1>
|
||||
|
||||
<p>We are always looking for more hosts...</p>
|
||||
<ul>
|
||||
<li>2019-10-18: <a target="_blank" href="https://blog.feedspot.com/hacker_podcasts/">Top 10 Hacker Podcasts You Must Follow in 2019</a> (<a target="_blank" href="press/2019-10-18_blog.feedspot.com-hacker_podcasts-Top_10_Hacker_Podcasts_You_Must_Follow_in_2019.pdf">Archived</a>)</li>
|
||||
<li>2018-08-01: <a target="_blank" href="https://www.linuxlinks.com/review-hacker-public-radio-podcasts-hacker-community/">Review: The Linux Podcast Scene – all the movers and shakers</a> (<a target="_blank" href="press/2018-08-01_linuxlinks.com_review-linux-podcast-scene-movers-shakers.pdf">Archived</a>)</li>
|
||||
<li>2016-06-26: <a target="_blank" href="http://www.podcastawards.com/">11th Podcast Awards</a> (<a target="_blank" href="press/2016-06-26_www.podcastawards.com.png">Archived</a>)</li>
|
||||
<li>2016-05-18: <a target="_blank" href="http://solutionsreview.com/endpoint-security/top-ten-cybersecurity-podcasts/">Ten Security Podcasts You Should Be Listening To</a> by Lauren Cooke in Endpoint Security News (<a target="_blank" href="press/2016-05-18_solutionsreview.com_endpoint-security_top-ten-cybersecurity-podcasts.png">Archived</a>)</li>
|
||||
<li>2016-01-18: <a target="_blank" href="http://www.tripwire.com/state-of-security/security-awareness/information-security-podcast-roundup-2016-edition/">Information Security Podcast Roundup: 2016 Edition</a> from TripWire.com (<a target="_blank" href="press/2016-01-18_Information_Security_Podcast_Roundup_2016_Edition.pdf">Archived</a>)</li>
|
||||
<li>2014-12-09: <a target="_blank" href="http://joeyh.name/blog/entry/podcasts_that_dont_suck_2014/">podcasts that don't suck, 2014 edition (Joey Hess)</a>(<a target="_blank" href="press/2014-12-09_podcasts_that_dont_suck_2014_edition.pdf">Archived</a>)</li>
|
||||
<li>2014-06-30: <a target="_blank" href="http://opensource.com/life/14/6/hacker-public-radio">Free software on Hacker Public Radio</a> by Bryan Behrenshausen (Red Hat)(<a target="_blank" href="press/2014-06-30_Free_software_on_Hacker_Public_Radio.pdf">Archived</a>)</li>
|
||||
<li>2014-04-19: <a target="_blank" href="http://www.efytimes.com/e1/fullnews.asp?edid=136312">10 Useful Places Hosting Informative Podcasts On Linux</a> (<a target="_blank" href="press/2014-04-19_10_Useful_Places_Hosting_Informative_Podcasts_On_Linux.pdf">Archived</a>)
|
||||
<li>2014-04-11: <a target="_blank" href="http://blog.sleeplessbeastie.eu/2014/04/11/hand-picked-audio-podcasts-for-linux-users/">Hand-picked audio podcasts for Linux users</a> by Milosz Galazka (<a target="_blank" href="press/2014-04-11_hand-picked-audio-podcasts-for-linux-users.pdf">Archive</a>)</li>
|
||||
<li>2013-10-11: <a target="_blank" href="http://www.linuxlinks.com/article/20130706190339587/LinuxPodcasts-Page1.html">Illuminating Linux Podcasts</a> by Dan Petersen (<a target="_blank" href="press/2013-10-11_Illuminating_Linux_Podcasts.pdf">Archive</a>)</li>
|
||||
<li>2012-12-24: <a target="_blank" href="http://www.maketecheasier.com/10-great-podcasts-for-linux-open-source-geeks/">10 Great Podcasts for Linux & Open Source Geeks</a> by Rebecca "Ruji" Chapnik (<a target="_blank" href="press/2012-12-24_10-great-podcasts-for-linux-open-source-geeks.pdf">Archived</a>)</li>
|
||||
<li>2011-08-01: <a target="_blank" href="http://www.linuxformat.com/archives?issue=147">Linux Format: Pick the perfect geek podcast in our roundup</a> by Mayank Sharma in Linux Format Magazine(<a target="_blank" href="press/2011-08-01_hpr-linux-format.png">Archive</a>)</li>
|
||||
<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="<!--% absolute_url(baseurl,'') %-->" ><!--% absolute_url(baseurl,'') %--></a></li>
|
||||
<li>Maillist: <a href="<!--% absolute_url(baseurl,'/maillist') %-->">Mailing list</a></li>
|
||||
<li><a href="https://web.libera.chat/gamja/?channels=oggcastplanet" >#oggcastplanet</a></li>
|
||||
<li><a href="https://www.facebook.com/home.php?sk=group_130169220378872¬if_t=group_r2j" >Facebook</a></li>
|
||||
<li><a href="https://www.linkedin.com/company/hackerpublicradio/" >Linked-In</a></li>
|
||||
<li><a href="http://itunes.apple.com/us/podcast/hacker-public-radio/id281699640" >iTunes</a></li>
|
||||
</ul>
|
||||
<h2>Mail List</h2>
|
||||
<p>
|
||||
HPR is governed by the community, so decisions about how <?php print "${HPR_Name}";?> Public Radio should be run are made on the mailing list you can join it by going to :<br />
|
||||
<a href="<!--% absolute_url(baseurl,'/maillist') %-->"><!--% absolute_url(baseurl,'/maillist') %--></a>
|
||||
</p>
|
||||
|
||||
<hr />
|
||||
|
||||
<h1 id ="press" >In the Press<a href="<!--% absolute_url(baseurl,'about.html#press') %-->">.</a></h1>
|
||||
<ul>
|
||||
<li>2019-10-18: <a href="https://blog.feedspot.com/hacker_podcasts/">Top 10 Hacker Podcasts You Must Follow in 2019</a> (<a href="<!--% absolute_url(baseurl,'press/2019-10-18_blog.feedspot.com-hacker_podcasts-Top_10_Hacker_Podcasts_You_Must_Follow_in_2019.pdf') %-->">Archived</a>)</li>
|
||||
<li>2018-08-01: <a href="https://www.linuxlinks.com/review-hacker-public-radio-podcasts-hacker-community/">Review: The Linux Podcast Scene – all the movers and shakers</a> (<a href="<!--% absolute_url(baseurl,'press/2018-08-01_linuxlinks.com_review-linux-podcast-scene-movers-shakers.pdf') %-->">Archived</a>)</li>
|
||||
<li>2016-06-26: <a href="http://www.podcastawards.com/">11th Podcast Awards</a> (<a href="<!--% absolute_url(baseurl,'press/2016-06-26_www.podcastawards.com.png') %-->">Archived</a>)</li>
|
||||
<li>2016-05-18: <a href="http://solutionsreview.com/endpoint-security/top-ten-cybersecurity-podcasts/">Ten Security Podcasts You Should Be Listening To</a> by Lauren Cooke in Endpoint Security News (<a href="<!--% absolute_url(baseurl,'press/2016-05-18_solutionsreview.com_endpoint-security_top-ten-cybersecurity-podcasts.png') %-->">Archived</a>)</li>
|
||||
<li>2016-01-18: <a href="http://www.tripwire.com/state-of-security/security-awareness/information-security-podcast-roundup-2016-edition/">Information Security Podcast Roundup: 2016 Edition</a> from TripWire.com (<a href="<!--% absolute_url(baseurl,'press/2016-01-18_Information_Security_Podcast_Roundup_2016_Edition.pdf') %-->">Archived</a>)</li>
|
||||
<li>2014-12-09: <a href="http://joeyh.name/blog/entry/podcasts_that_dont_suck_2014/">podcasts that don't suck, 2014 edition (Joey Hess)</a>(<a href="<!--% absolute_url(baseurl,'press/2014-12-09_podcasts_that_dont_suck_2014_edition.pdf') %-->">Archived</a>)</li>
|
||||
<li>2014-06-30: <a href="http://opensource.com/life/14/6/hacker-public-radio">Free software on Hacker Public Radio</a> by Bryan Behrenshausen (Red Hat)(<a href="<!--% absolute_url(baseurl,'press/2014-06-30_Free_software_on_Hacker_Public_Radio.pdf') %-->">Archived</a>)</li>
|
||||
<li>2014-04-19: <a href="http://www.efytimes.com/e1/fullnews.asp?edid=136312">10 Useful Places Hosting Informative Podcasts On Linux</a> (<a href="<!--% absolute_url(baseurl,'press/2014-04-19_10_Useful_Places_Hosting_Informative_Podcasts_On_Linux.pdf') %-->">Archived</a>)
|
||||
<li>2014-04-11: <a href="http://blog.sleeplessbeastie.eu/2014/04/11/hand-picked-audio-podcasts-for-linux-users/">Hand-picked audio podcasts for Linux users</a> by Milosz Galazka (<a href="<!--% absolute_url(baseurl,'press/2014-04-11_hand-picked-audio-podcasts-for-linux-users.pdf') %-->">Archive</a>)</li>
|
||||
<li>2013-10-11: <a href="http://www.linuxlinks.com/article/20130706190339587/LinuxPodcasts-Page1.html">Illuminating Linux Podcasts</a> by Dan Petersen (<a href="<!--% absolute_url(baseurl,'press/2013-10-11_Illuminating_Linux_Podcasts.pdf') %-->">Archive</a>)</li>
|
||||
<li>2012-12-24: <a href="http://www.maketecheasier.com/10-great-podcasts-for-linux-open-source-geeks/">10 Great Podcasts for Linux & Open Source Geeks</a> by Rebecca "Ruji" Chapnik (<a href="<!--% absolute_url(baseurl,'press/2012-12-24_10-great-podcasts-for-linux-open-source-geeks.pdf') %-->">Archived</a>)</li>
|
||||
<li>2011-08-01: <a href="http://www.linuxformat.com/archives?issue=147">Linux Format: Pick the perfect geek podcast in our roundup</a> by Mayank Sharma in Linux Format Magazine(<a href="<!--% absolute_url(baseurl,'press/2011-08-01_hpr-linux-format.png') %-->">Archive</a>)</li>
|
||||
</ul>
|
||||
|
||||
<hr />
|
||||
|
||||
<h1 id="so_you_want_to_record_a_podcast">So you want to record a podcast<a href="<!--% absolute_url(baseurl,'about.html#so_you_want_to_record_a_podcast') %-->">.</a></h1>
|
||||
|
||||
<p>Well you've come to the right place. Our goal here at HPR is to make it as easy as possible for you to get a podcast released. We take care of the hard bits so you don't need to. Recording your first show is always a daunting prospect but over <a href="/correspondents.php"><?php echo "$total"; ?></a> people like yourself have done it and so can you.
|
||||
</p>
|
||||
|
||||
<h2 id="stuff_you_need_to_know">1. Stuff you need to know<a href="<!--% absolute_url(baseurl,'about.html#stuff_you_need_to_know') %-->">.</a></h2>
|
||||
<ul>
|
||||
<li>HPR will stop as a project if there are not enough Shows.</li>
|
||||
<li>We do not <a href="<!--% absolute_url(baseurl,'about.html##syndication') %-->">syndicate</a> shows not produced for HPR.</li>
|
||||
<li>You are agreeing to <a href="<!--% absolute_url(baseurl,'about.html##license') %-->">license</a> your show CC BY-SA 4.0.</li>
|
||||
<li>You have <a href="<!--% absolute_url(baseurl,'about.html#permission') %-->">permission</a> to redistribute your show in its entirety.</li>
|
||||
<li>Your audio will <a href="<!--% absolute_url(baseurl,'about.html#not_moderated') %-->">not be moderated.</a></li>
|
||||
<li>Your show will be signaled as containing <a href="<!--% absolute_url(baseurl,'about.html#explicit') %-->">explicit</a> content.</li>
|
||||
<li>You determine where in the <a href="<!--% absolute_url(baseurl,'about.html#schedule') %-->">schedule</a> your show will be released.</li>
|
||||
<li>We use <a href="<!--% absolute_url(baseurl,'about.html#utf8') %-->">UTF-8</a> end to end.</li>
|
||||
<li>Your show will be heard by an <a href="<!--% absolute_url(baseurl,'about.html#international') %-->">International</a> Audience.</li>
|
||||
<li>We also need <a href="<!--% absolute_url(baseurl,'about.html#reserve_queue') %-->">reserve</a> shows.</li>
|
||||
<li>You will no longer be allowed to edit HPR pages on <a href="<!--% absolute_url(baseurl,'about.html#wikipedia') %-->">Wikipedia</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="select_a_topic">2. Select a Topic<a href="<!--% absolute_url(baseurl,'about.html#select_a_topic') %-->">.</a></h2>
|
||||
<p>
|
||||
The first thing you will need to do is decide on a topic for your show. You might already have an idea but if not you can have a look at our <a href="/index_full.php">Archive</a> page for examples of shows people have recorded in the past. You can also look at our <a href="/requested_topics.php">Requested Topics</a>, or our <a href="/series.php">Series</a> page to see if you can add your knowledge to the pool.
|
||||
</p>
|
||||
<p>
|
||||
If you are worried that your show may not be of interest to <?php print "${HPR_Names}";?> then you can <a href="will-my-show-be-of-interest-to-hackers.html">click here</a> to check if it is.
|
||||
</p>
|
||||
<p>
|
||||
If you can't think of anything to talk about then please just record a show telling us <a href="series.php?id=29">how you got into tech</a> as a way to introducing yourself to the community.
|
||||
</p>
|
||||
|
||||
<h2 id="record_your_show">3. Record your show<a href="<!--% absolute_url(baseurl,'about.html#record_your_show') %-->">.</a></h2>
|
||||
<p>
|
||||
Please select <a href="recording.php">more detailed information</a> on how to record a show:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Recording with a <a href="recording.php#portable_media_player">portable media player</a>.</li>
|
||||
<li>Recording with a <a href="recording.php#smart_phone">smart phone</a>.</li>
|
||||
<li><a href="recording.php#editing">Recording/Editing</a> using your Computer.</li>
|
||||
<li>Recording Interviews with the <a href="recording.php#phone_interviews">Phone</a>.</li>
|
||||
<li>Recording <a href="recording.php#round_table">round table</a> discussions.</li>
|
||||
<li>Avoid <a href="recording.php#background_music">Bedding/background</a> music.</li>
|
||||
<li>We mix down to <a href="recording.php#encoding">Mono</a>.</li>
|
||||
<li>No need to add <a href="recording.php#no_metadata">Metadata</a> to the file.</li>
|
||||
</ul>
|
||||
<p>Don't forget to <strong>introduce yourself</strong> in your show.</p>
|
||||
|
||||
<h2 id="upload_your_show">4. Upload your show<a href="<!--% absolute_url(baseurl,'about.html#upload_your_show') %-->">.</a></h2>
|
||||
<p>
|
||||
Once you have your audio ready you can post your show by going to the <a href="/calendar.php">Calendar</a> page or press the <strong><a href="calendar.php">⇧Upload⇧</strong></a> button.
|
||||
</p>
|
||||
<p>
|
||||
After you have selected a date you will be redirected to the <a href="/request.php">request page</a>, where you will be asked to select your show and email address. We will send a link to where you can upload your show to this address and so it must be a valid working address that you can access quickly. We intend to use <a href="https://www.gnupg.org/">GPG</a> to speed up the validation of hosts, so you may wish to use an email address that has an associated public key available on public key servers.
|
||||
</p>
|
||||
<p>
|
||||
<a href="request_a_slot.php">More Information</a>.
|
||||
</p>
|
||||
|
||||
<h2 id="questions"><a href="<!--% absolute_url(baseurl,'about.html#questions') %-->">.</a></h2>Questions ?</h2>
|
||||
<p>
|
||||
Got any questions not covered here, then just email <strong>"admin" at "<?php print "${HTTP_HOST}";?>"</strong>, and we’ll get in touch with you with all you need to know about getting your show published.<br />
|
||||
You can chat with other podcasters using IRC in the <strong>#oggcastplanet</strong> channel on the <a href="https://web.libera.chat/gamja/?channels=oggcastplanet">freenode.net</a> network. Follow us on <a href="https://identi.ca/group/hpr">identi.ca</a> (use the tag <strong>!hpr</strong>) and on <a href="https://twitter.com/hpr">Twitter</a> (use the tag <strong>#hpr</strong>). We have a <a href="https://www.facebook.com/home.php?sk=group_130169220378872">Facebook</a> and <a href="https://www.linkedin.com/groups?mostPopular=&gid=3737302">LinkedIn</a> group, so please join and spread the word.</p>
|
||||
|
||||
<h2 id="still_nervous"><a href="<!--% absolute_url(baseurl,'about.html#still_nervous') %-->">.</a></h2>Still Nervous</h2>
|
||||
<p>
|
||||
Fellow listeners like yourself contribute the shows and so we all know how hard it is to do that first show. You're probably worried that we won't like the topic. Well don't be, have a look at our <a href="/index_full.php">archive</a> to see how diverse the contributions have been. You're probably worried about the quality of your audio, that you sound funny, that English isn't your native language, that you suffer from a speech impediment, that your show has loads of ummms and awws in it, well don't be. 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 not the quality of the audio. That's not to say we won't help you with ways to improve the audio if you wish, or narrate your script if you can't or won't record it yourself. Drop into the IRC channel <a href="https://web.libera.chat/gamja/?channels=oggcastplanet">#oggcastplanet</a> where there are people who will help.<br />
|
||||
</p>
|
||||
|
||||
<h2 id="motto">Our Mottos</h2>
|
||||
<blockquote>Any audio is better than no audio.</blockquote>
|
||||
<blockquote>Any topic of intrest to hackers.</blockquote>
|
||||
<blockquote>It ain't a show unless it's on the server.</blockquote>
|
||||
<blockquote>If you tell us you are doing a show, then you owe us a show.</blockquote>
|
||||
|
||||
<p>You don't need anyones permission to upload a show, but if you have any questions then drop into the <a href="https://web.libera.chat/gamja/?channels=oggcastplanet">#oggcastplanet</a> channel on freenode and chat with a live person 24/7.
|
||||
</p>
|
||||
|
||||
<hr />
|
||||
|
||||
<h1 id="requested_topics">Requested topics<a href="<!--% absolute_url(baseurl,'about.html#requested_topics') %-->">.</a></h1>
|
||||
|
||||
<p>This is a list of topics that have been requested by the community. Feel free to add it to the list by emailing admin at hpr or by tweeting us on <a href="https://twitter.com/hpr">@HPR</a>.</p>
|
||||
<ul>
|
||||
<li>How did you get into podcasting/linux/geekdom?</li>
|
||||
<li>What podcasts you listen to and can recommend</li>
|
||||
<li>What’s in your bag? Tell us what tools/gear/stuff you keep close at hand.</li>
|
||||
<li>What got you into Linux?</li>
|
||||
<li>Your favorite Android applications.</li>
|
||||
<li>Your favorite desktop applications.</li>
|
||||
<li>Your favorite browser extensions.</li>
|
||||
<li>A introduction to Wireshark.</li>
|
||||
<li>How to set up your own blog.</li>
|
||||
<li>Choosing a artistic design for website, business cards etc.</li>
|
||||
<li>Music Theory</li>
|
||||
<li>Installing a VPN to your home network</li>
|
||||
<li>Init and System.d</li>
|
||||
<li>Episodes for the <a href="http://<?php print "${HTTP_HOST}";?>/series.php?id=7">LPI</a>, or the Networking series.</li>
|
||||
<li><a href="http://opensourcemusician.com/index.php/Beginning_Audio_Series_for_HPR_and_OSMP_Release">Beginning Audio Series for HPR and OSMP Release</a></li>
|
||||
<li>Hackintosh computers - what are they, why would you want one.</li>
|
||||
<li>Grub 2.0 introduction and customization.</li>
|
||||
<li>FM Transmitter hack to listen into internet streams</li>
|
||||
<li>How I Got Into Accessible Computing</li>
|
||||
<li>How to do knitting</li>
|
||||
<li>How to build a house</li>
|
||||
<li>Bitcoin howto <a href="http://<?php print "${HTTP_HOST}";?>/eps.php?id=0788">hpr0788</a></li>
|
||||
<li>How to solder <a href="http://<?php print "${HTTP_HOST}";?>/eps.php?id=1037">hpr1037</a>, <a href="http://<?php print "${HTTP_HOST}";?>/eps.php?id=1047">hpr1047</a></li>
|
||||
<li>How to weld</li>
|
||||
<li>How to fix a car</li>
|
||||
<li>Reviews of stream playing software, (for linuxheads who don't want to keep a browser tab open all the time)</li>
|
||||
<li>Reviews of stream ripping software on linux</li>
|
||||
<li>Beginners guide to gnuplot</li>
|
||||
<li>Nagios series, intro, setup, advanced ...</li>
|
||||
<li>How to set up GPG/openPGP</li>
|
||||
<li>What I do with my Raspberry Pi</li>
|
||||
<li>It broke, I fixed it</li>
|
||||
<li>How does coreboot work</li>
|
||||
<li>Introduction to HAM Radio</li>
|
||||
<li>I've moved and they do it like this here</li>
|
||||
<li>How to record a tag team tutorial on a topic</li>
|
||||
<li>Open Street Map new editor</li>
|
||||
<li>etymology</li>
|
||||
<li>functional versus procedural programming</li>
|
||||
<li>sed, awk and grep</li>
|
||||
<li>Setting up imap/smtp (gmail) in a cli mail program</li>
|
||||
<li>Irssi - a sane setup</li>
|
||||
<li>Your view of the future</li>
|
||||
<li>Alternative uses for Bayesian email classifiers (<a href="https://www.youtube.com/watch?v=JKB5CojW4AA">more info</a>)</li>
|
||||
<li>How to use a multimeter, and other basic electronic components like a 555 timer</li>
|
||||
<li>How does Hubble remain fixed on a spot in space while in orbit of the earth</li>
|
||||
<li>Gnu automake system.</li>
|
||||
<li>What's the deal with IPv6 (i.e., why can't we just NAT at the ISP level, are there privacy issues in having your MAC address as part of your IP?)</li>
|
||||
<li>Network like a Pro. If you were to treat your home network like a corporate server farm, what tools and hardware would it entail to treat your home network like a security professional? What do we need for a firewall and what are the detection/prevention technologies that we could be implementing?</li>
|
||||
<li>Beyond Firewall and an IDS/IPS, what do I need? I've started listening to Security Weekly, starting with last December, and at one point the suggested a secondary IDS, behind the firewall, to record what the primary defenses missed. Where and how do I set that up? Beyond firewall and IDS, what other tools should I be running, where should they be in my network, and how many physical boxes are we talking? Emphasis should be on low power devices and free as in beer tools.</li>
|
||||
<li>Now That Your Security is in Place, How to Read Logs and Formulate a Response to an Intrusion. What I've learned from SW, is that you can't prevent an intrusion, it's how to respond when you are compromised. Again, according to SW, the security manager's job is to detect intrusions, inside 48 hours rather than 48 months. How can you protect your proprietary data and customer database?</li>
|
||||
<li>What Are the Answers I Need, To the Questions I Don't Know Enough to Ask?</li>
|
||||
<li>#IPFS (and don't leave out IPNS!). I'd really like to get a better understanding of practical use of this.</li>
|
||||
<li>Any experiences integrating Dell/Wyse thin- and zero- clients into linux networks.</li>
|
||||
</ul>
|
||||
|
||||
<hr />
|
||||
|
||||
<h1 id="agreement">Stuff you need to know<a href="#agreement">.</a></h1>
|
||||
<p>
|
||||
This is some important information that you will need to know before uploading to HPR.
|
||||
</p>
|
||||
|
||||
<h2 id="wikipedia">You will no longer be allowed to edit HPR pages on Wikipedia<a href="#wikipedia">.</a></h2>
|
||||
<p>
|
||||
Once you upload a show, you will no longer be allowed to edit pages relating to <a href="https://en.wikipedia.org/wiki/Hacker_Public_Radio">Hacker Public Radio</a> in <a href="https://en.wikipedia.org/wiki/Wikipedia:FAQ/Organizations">Wikipedia</a>.
|
||||
</p>
|
||||
|
||||
<h2 id="mailinglist">All policy decisions are made by the HPR Community<a href="#mailinglist">.</a></h2>
|
||||
<p>
|
||||
The community decides the HPR policies.
|
||||
Please join the <a href="<!--% absolute_url(baseurl,'/maillist') %-->">HPR Mailing List</a> to participate.
|
||||
</p>
|
||||
|
||||
<h2 id="no_shows_no_hpr">HPR will stop as a project if there are not enough shows<a href="#no_shows_no_hpr">.</a></h2>
|
||||
<p>
|
||||
Hacker Public Radio is dedicated to sharing knowledge.
|
||||
We release about 260 shows a year, which is probably more than all of the other FOSS podcasts put together.
|
||||
If you listen to HPR, then we would love you to <a target="_blank" href="<!--% absolute_path(baseurl) %-->contribute.html">contribute</a> one show a year.
|
||||
Remember once that all the reserve shows have been used up and there are no more shows in the queue, HPR as a project will stop.
|
||||
|
||||
</p>
|
||||
<h2 id="patrons">Support our Patrons<a href="#patrons">.</a></h2>
|
||||
<p>
|
||||
Our hosting is kindly provided to us by <a href="<!--% absolute_path(baseurl) %-->correspondents/0174.html">Josh Knapp</a> from <a href="https://anhonesthost.com/hosting/shared-hosting">AnHonestHost.com</a>, and The Internet Archive at <a href="https://archive.org/donate/">Archive.org</a>.
|
||||
We encourage you to support our Patrons.
|
||||
Over the years kind people have donated services and supported equipment for our conferences.
|
||||
|
||||
</p>
|
||||
<h2 id="syndication">We do not syndicate non HPR Shows<a href="#syndication">.</a></h2>
|
||||
<p>
|
||||
HPR is founded on the principle of Hackers sharing knowledge.
|
||||
For this reason we are only releasing material created exclusively for HPR.
|
||||
We will continue to promote new podcasts and other creative commons material, but if you wish to have your show promoted, then please contact our sister site <a href="https://freeculturepodcasts.org/">Free Culture Podcasts</a>.
|
||||
</p>
|
||||
<p>
|
||||
That said, if there is a piece of creative commons content that you would like to promote, then feel free to record a regular show.
|
||||
There you can introduce the content and explain why it is important, providing links to where we can get more information etc., and then include one example episode.
|
||||
</p>
|
||||
|
||||
<h2 id="license">You are agreeing to license your show CC-BY-SA<a href="#license">.</a></h2>
|
||||
<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.
|
||||
Click the <a href="https://creativecommons.org/licenses/by-sa/4.0/">link</a> for more information.
|
||||
</p>
|
||||
|
||||
<h2 id="permission">You have permission to redistribute your show in its entirety<a href="#permission">.</a></h2>
|
||||
<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 other copyrighted content, even if it is made available under fair use, or by arranged permission.
|
||||
</p>
|
||||
|
||||
<h2 id="not_moderated">The audio of your show will not be moderated<a href="#not_moderated">.</a></h2>
|
||||
<p>
|
||||
We do not vet, edit, moderate or in any way censor any of the audio you submit, we trust you to do that.
|
||||
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.
|
||||
<br />
|
||||
We <strong>do</strong> transcode the audio into different formats.
|
||||
</p>
|
||||
<p>
|
||||
Please note that this only relates to the audio you upload.
|
||||
The rest of the meta-data (branding/summaries/tags/show notes/etc.), are managed by the HPR Community, and <strong>may</strong> be edited.
|
||||
The show <a href="<!--% absolute_path(baseurl) %-->eps/hpr2210/index.html">hpr2210 :: On Freedom of Speech and Censorship</a> describes the agreed approach to this topic.
|
||||
</p>
|
||||
|
||||
</p>
|
||||
|
||||
<h2 id="explicit">Your show will be signaled as containing explicit content<a href="#explicit">.</a></h2>
|
||||
<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 that 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 short warning at the very beginning of the show before the intro, to allow listeners time to switch off the episode should they so desire.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/hpr2210/index.html">hpr2210 :: On Freedom of Speech and Censorship</a> describes the agreed approach to this topic.
|
||||
</p>
|
||||
|
||||
<h2 id="schedule">You determine when your show will be released<a href="#schedule">.</a></h2>
|
||||
<p>
|
||||
The HPR Schedule is entirely community driven and we recommend that <strong>you</strong> pick the date or show number as then you know when your show will be released.
|
||||
However 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.
|
||||
Once the slots have been allocated it is not possible to move them.
|
||||
</p>
|
||||
|
||||
<h2 id="reserving">All reservations need to be approved<a href="#reserving">.</a></h2>
|
||||
<p>
|
||||
Any host can select any free slot a up to year in advance. However the audio must be ready at time of picking a slot so that it can be upload immediately afterwards.
|
||||
</p>
|
||||
<p>
|
||||
In exceptional circumstances it may be necessary to reserve a slot while not having the audio available, but 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:
|
||||
<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>
|
||||
<li>The days following new year.</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<h2 id="utf8">We use UTF-8 end to end<a href="#utf8">.</a></h2>
|
||||
<blockquote>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>.
|
||||
</blockquote>
|
||||
|
||||
<h2 id="accessibility">Keep accessibility in mind<a href="#accessibility">.</a></h2>
|
||||
<p>
|
||||
When you includes 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 <pre> tags)
|
||||
<br />
|
||||
Include descriptive language in any link texts.
|
||||
<br />
|
||||
Avoid structures like: <em>"For accessibility information click <a href="#accessibility">here</a>"</em><br />
|
||||
Rather use: <em>"For more information click our <a href="#accessibility">accessibility page</a>"</em><br />
|
||||
</p>
|
||||
|
||||
<h2 id="international">Your show will be heard by an International Audience<a href="#international">.</a></h2>
|
||||
<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>.
|
||||
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="../images/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>
|
||||
|
||||
<h1 id="reserve_queue">Feed the reserve queue<a href="#reserve_queue">.</a></h1>
|
||||
<p>
|
||||
The reserve queue is intended only to be used in the cases where there is still a gap in the schedule 24 hours prior to release. This was known as the emergency queue, but now can also be used when the hosts don't care when the shows are scheduled. They will be used on a first come first go basis, when there is no conflict with the scheduling guidelines.
|
||||
</p>
|
||||
|
||||
<hr />
|
||||
|
||||
<h1 id="scheduling_guidelines">Scheduling Guidelines</h1>
|
||||
<ol>
|
||||
<li>You must have your audio recording ready to upload <strong>before</strong> you pick a slot.</li>
|
||||
<li>Always try and fill any free slots that are available in the upcoming two weeks.</li>
|
||||
<li>If the queue is filling up then please consider leaving some slots free for new contributors.</li>
|
||||
<li>If you have a non urgent show then find a empty week and schedule it then.</li>
|
||||
<li>If you are uploading a series of shows, consider scheduling one every two weeks.</li>
|
||||
<li>Interviews may be released sooner.</li>
|
||||
</ol>
|
||||
|
||||
<hr />
|
||||
|
||||
<h1 id="recording_a_podcast">Recording a Podcast</h1>
|
||||
<p>
|
||||
On this page you will find information on how to record a podcast. Our golden rule is <strong>Any audio is better than no audio.</strong> so keep that in mind. Don't forget to <strong>introduce yourself</strong> in your show.
|
||||
</p>
|
||||
<h2 id="portable_media_player">Recording with a portable media player<a href="#portable_media_player">.</a></h2>
|
||||
<p>
|
||||
Many of today's <a href="http://wiki.xiph.org/PortablePlayers">portable media players</a> support recording audio out of the box. Search for "Voice Recorder", to see if there is an application for your smartphone. Whichever option you have close to hand, try and set the recording to the best quality format (<a href="http://en.wikipedia.org/wiki/WAV">WAV</a> or <a href="http://en.wikipedia.org/wiki/FLAC">FLAC</a>), and set everything else to the highest setting. It's always the goal to get the best quality audio but here at <?php print "${HPR_Name}";?> Public Radio we value content over quality and so long as it's audible we'll take it.
|
||||
</p>
|
||||
<p>
|
||||
Then just record your show, <a href="request_a_slot.php">request a slot</a>, and we'll do the rest.
|
||||
</p>
|
||||
|
||||
<h2 id="smart_phone">Recording with a portable media player<a href="#smart_phone">.</a></h2>
|
||||
<p>
|
||||
Some of our hosts recommend <a href="https://gitlab.com/axet/android-audio-recorder">Android Audio Recorder</a> on my android phone. It's available on <a href="https://f-droid.org/en/packages/com.github.axet.audiorecorder/">F-Droid</a> and <a href="https://play.google.com/store/apps/details?id=com.github.axet.audiorecorder">Google Play</a>. These are the recommended settings:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Recording Source - Unprocessed</li>
|
||||
<li>Sample Rate - 44.1 kHz</li>
|
||||
<li>Encoding - .flac</li>
|
||||
<li>Audio Channels - Mono</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h2 id="editing">Recording/Editing using your Computer<a href="#editing">.</a></h2>
|
||||
<p>
|
||||
The majority of podcasters use <a href="http://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 width="600" 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>
|
||||
<iframe width="640" height="390" src="//www.youtube.com/embed/ss8CyTwBOPY" style="border: none"></iframe>
|
||||
<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 width="600" src="images/contribute-audacity-export.png" alt="Audacity Export Settings" title="Audacity Screenshot of an Export" >
|
||||
</p>
|
||||
|
||||
<h2 id="phone_interviews">Recording Interviews with the Phone<a href="#phone_interviews">.</a></h2>
|
||||
<p>
|
||||
If you want to record a one-to-one interview with someone then you can use <a href="skype.com">Skype</a> in conjunction with <a href="http://atdot.ch/scr/">Skype Call Recorder</a>. If everyone is using skype then it won't cost you anything otherwise you will need to pay for SkypeOut service. Although the quality is usually terrible, you could also put your phone on hands free and record with a <a href="http://wiki.xiph.org/PortablePlayers">portable media player</a>.
|
||||
</p>
|
||||
|
||||
<h2 id="round_table">Recording round table discussions<a href="#round_table">.</a></h2>
|
||||
<p>
|
||||
If you would like to record with multiple participants then you can use <a href="http://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><?php print "${HPR_Name}";?> 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 multiple tracks, one for each participant which you can edit and then submit.
|
||||
<br />
|
||||
Kwisher made a <a href="http://<?php print "${HTTP_HOST}";?>/Mumble-How-To.pdf">Mumble tutorial</a> which you might find useful and Delwin has produced a number of short <a href="http://<?php print "${HTTP_HOST}";?>/correspondents.php?hostid=228">shows</a> on how to configure the audio quality.
|
||||
</p>
|
||||
<p>
|
||||
<img width="600" src="images/contribute-mumble-record.png" alt="Audacity Can Record" title="Audacity Screenshot of Recording" >
|
||||
</p>
|
||||
|
||||
<h2 id="background_music">Avoid Bedding/background music<a href="#background_music">.</a></h2>
|
||||
<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.<br/>
|
||||
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>
|
||||
|
||||
<h2 id="encoding">We mix down to Mono<a href="#encoding">.</a></h2>
|
||||
<p>
|
||||
We will by default mix down your show to one channel mono and we will <a href="https://gitorious.org/hpr-scheduling-system/hpr-scheduling-system/source/2d526e000d31e79afa3d863ea8659503e2074267:transcoding/hprtranscode">transcode</a> to MP3, ogg and spx formats. If you want to control this in more detail then please email admin at <?php print "${HPR_Name}";?> Public Radio for more information.
|
||||
</p>
|
||||
|
||||
<h2 id="no_metadata">No need to add Metadata to the file<a href="#">.</a></h2>
|
||||
<p>
|
||||
There is no need to add any information to the file as that will be inserted based on the information you fill in when you upload the show.
|
||||
</p>
|
||||
|
||||
|
||||
<hr />
|
||||
|
||||
<h1 id="promote_hpr">Please promote HPR<a href="<!--% absolute_url(baseurl,'about.html#promote_hpr') %-->">.</a></h1>
|
||||
|
||||
<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 <?php print "${HTTP_HOST}";?> Community for the <?php print "${HTTP_HOST}";?> 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>
|
||||
|
||||
<hr />
|
||||
|
||||
<h1 id="requesting_slot">Picking a slot for your show</h1>
|
||||
<p>
|
||||
Any host can select any free slot a up to year in advance, by recording their show and uploading it to the desired slot. In exceptional circumstances it may be necessary to reserve a slot while not having the audio available, but 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. [<a href="https://lists.hackerpublicradio.com/pipermail/hpr/2018-February/003482.html">?</a>]
|
||||
</p>
|
||||
<p>
|
||||
You can post your show by going to the <a href="http://<?php print "${HTTP_HOST}";?>/calendar.php">Calendar</a> page. Once you have selected a date you will be redirected to the <a href="http://<?php print "${HTTP_HOST}";?>/request.php">request page</a>, where you will be asked to select your show and email address. We will send a link to where you can upload your show to this address and therefore it must be a valid working address that you can access quickly. We intend to use <a href="https://www.gnupg.org/">GPG</a> to speed up the validation of hosts, so you may wish to use an email address that has an associated public key available on public key servers.
|
||||
</p>
|
||||
<p>
|
||||
The audio of your show will not be moderated, however <em>the information provided in the upload form <strong>may be moderated</strong></em>. All publicly facing material is managed by the HPR Community as a whole, and not just the host providing the show. The show <a href="https://hackerpublicradio.org/eps.php?id=2210">hpr2210 :: On Freedom of Speech and Censorship</a> describes the agreed approach to this topic.
|
||||
</p>
|
||||
<p><strong>Note:</strong> 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. Where we publish it we pad it with dot nospam at-sign nospam dot. <br />
|
||||
i.e. <em>hpr@example.com</em> becomes <em>hpr.nospam@nospam.example.com</em>. If you do not want to have your email exposed, please contact the admin@hpr team to arrange a alias.
|
||||
</p>
|
||||
<p>
|
||||
Once you press <em>next</em>, an email will be sent to your email address pointing to where you can upload the show. You need to <em>open</em> the link within <strong>15 minutes</strong> or the temporary lock will be released. Once you open the link, you can fill in the information at your leisure. The upload form works on the assumption you will be posting one show at a time, from the same IP address. Once you have pressed submit you will not be able to edit any of the information.
|
||||
</p>
|
||||
|
||||
<hr />
|
||||
|
||||
<h1 id="adding_an_episode">Adding an Episode</h1>
|
||||
<p>
|
||||
The unique link sent by email will allow you to manage both the episode and information about yourself that is displayed on HPR. The following information will be requested:
|
||||
</p>
|
||||
<h2 id="personal_information">Personal Information</h2>
|
||||
<p>
|
||||
Remember <em>All information will be displayed publicly</em>. The only exception is that your email address will be sent in the feed with some anti-spam additions.<br />
|
||||
For example <em>hpr@example.com</em> will become <em>hpr.nospam@nospam.example.com</em>
|
||||
</p>
|
||||
<ul>
|
||||
<li id="email"><strong>email:</strong> <em>already populated</em><br />
|
||||
See notes <a href="#requesting_slot">above</a><br />
|
||||
</li>
|
||||
<li id="image"><strong>image:</strong> <em>Optional</em><br />
|
||||
If you have associated a <a href="http://en.gravatar.com/">Gravatar</a> image with an email address, then it will be displayed here. Otherwise you can upload a 80x80 image .</li>
|
||||
<li id="Name_Handle"><strong>Name/Handle:</strong> <em>Mandatory</em><br />
|
||||
It should be the name you wish to be known as on HPR. It can be your real name, an Internet handle or both.</li>
|
||||
<li id="Default_license"><strong>Your Default license:</strong> <em>Mandatory</em><br />
|
||||
This field tells us what your work is normally licensed under. 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. Click the <a href="https://creativecommons.org/licenses/by-sa/4.0/">link</a> for more information.</li>
|
||||
<li id="Profile"><strong>Profile:</strong> <em>Optional</em><br />
|
||||
Enter some text about yourself with links to your blog or other online presence.</li>
|
||||
</ul>
|
||||
<p>
|
||||
Your profile information is used on the website, in the RSS feeds, and on social media sites. You can change your profile information at any time, by submitting another show.
|
||||
</p>
|
||||
<h2 id="episode_information">Episode Information</h2>
|
||||
<ul>
|
||||
<li id="Title"><strong>Title:</strong> <em>Mandatory</em><br />
|
||||
This will be a short 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.</li>
|
||||
<li id="Short_Summary"><strong>Summary:</strong> <em>Mandatory</em><br />
|
||||
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 twitter, mastodon etc.</li>
|
||||
<li id="Theme"><strong>Theme:</strong> <em>Automatic</em><br />
|
||||
The <a href="http://<?php print "${HTTP_HOST}";?>/theme.php#intro">Intro</a>, and the <a href="http://<?php print "${HTTP_HOST}";?>/theme.php#outro">Outro</a> will be added automatically. Please do not add it.
|
||||
</li>
|
||||
<li id="Explicit"><strong>Explicit:</strong> <em>Mandatory</em><br />
|
||||
See <a href="http://www.apple.com/uk/itunes/podcasts/specs.html#submitting">iTunes</a> for more information.</li>
|
||||
<li id="License"><strong>License:</strong> <em>Mandatory</em><br />
|
||||
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. Click the <a href="https://creativecommons.org/licenses/by-sa/4.0/">link</a> for more information.</li>
|
||||
<li id="show_notes"><strong>show notes:</strong> <em>Mandatory</em><br />
|
||||
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>They ensure your show gets posted on time.</strong><br />
|
||||
If you do not supply show notes then your show notes will need to be edited manually by an HPR volunteer and this will most likely result in delays. During that time other shows will be processed and may get posted before your show. It is always better if you send us show notes yourself as you know best what information you are trying to convey.</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, so the only way for your show to be of help to them is if you distill the essence of the show into the show notes. If you are using a script to prepare your show then include that.</li>
|
||||
</ul>
|
||||
The amount you can enter is restricted to 4000 characters, but you can provide additional show notes if you wish. Please add them to an index.html file which you can expect to be served from http://<?php print "${HTTP_HOST}";?>/eps/hpr9999/index.html<br /> <br />
|
||||
<li>
|
||||
If you wish to include text formatting then please use a format that supports it. We accept:
|
||||
|
||||
<ul>
|
||||
<li>HTML5</li>
|
||||
<li>Markdown (standard)</li>
|
||||
<li>Markdown (GitHub flavoured)</li>
|
||||
<li>Markdown (Pandoc flavoured)</li>
|
||||
<li>RestructuredText</li>
|
||||
<li>txt2tags</li>
|
||||
<li>Plain text</li>
|
||||
</ul>
|
||||
|
||||
However please restrict yourself to text unless you are experienced producing valid markdown/HTML5. Regardless of the format you send your shownotes will end up in html5 <article> section, where the header and footer are not available to you. Avoid using <div> or <span>. The inclusion of JavaScript will send your show into quarantine, until an experienced HPR volunteer can be found to debug it.<br />
|
||||
It takes us a lot longer to fix incorrectly formatted shownotes than plain text, so please only create formatted show notes if you know what you are doing and are sure that what you are writing is valid.
|
||||
</li>
|
||||
<li id="shownotes_format"><strong>Show Note Format:</strong> <em>Optional</em><br />
|
||||
Please tell us which format, if any you used when filling in your shownotes.
|
||||
<ul>
|
||||
<li><a href="http://www.w3schools.com/html/html5_intro.asp">HTML5</a></li>
|
||||
<li><a href="https://en.wikipedia.org/wiki/Markdown">Markdown (standard)</a></li>
|
||||
<li><a href="https://help.github.com/articles/basic-writing-and-formatting-syntax/">Markdown (GitHub flavoured)</a></li>
|
||||
<li><a href="http://rmarkdown.rstudio.com/authoring_pandoc_markdown.html">Markdown (Pandoc flavoured)</a></li>
|
||||
<li><a href="http://docutils.sourceforge.net/docs/user/rst/quickstart.html">RestructuredText</a></li>
|
||||
<li><a href="http://txt2tags.org/online.php">txt2tags</a></li>
|
||||
<li>Plain text having no formatting.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li id="series"><strong>Series:</strong> <em>Optional</em><br />
|
||||
Select the <a href="http://<?php print "${HTTP_HOST}";?>/series.php">series</a> if any that your show is a part of.
|
||||
</li>
|
||||
<li id="tags"><strong>Tags:</strong> <em>Optional</em><br />
|
||||
Add a list of comma separated tags. Pick the most important words from the shownotes. These are used to <a href="http://hackerpublicradio.org/tags.php">find shows via the tags page</a>.
|
||||
</li>
|
||||
<li id="upload_method"><strong>Upload Method:</strong> <em>Optional</em><br />
|
||||
You have the choice of the following options:<br />
|
||||
<ul>
|
||||
<li id="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 to see this in Firefox you will need to install a <a href="https://addons.mozilla.org/en-US/firefox/addon/uploadprogress/">plugin</a>, or just wait.
|
||||
</li>
|
||||
<li id="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.
|
||||
</li>
|
||||
<li id="upload_later"><strong>Other</strong><br />
|
||||
The postal information will be sent to you after submission.
|
||||
</li>
|
||||
</ul>
|
||||
<br />
|
||||
If you want to submit an additional file with your show, then put them in a zip, or tgz file. This should expand to a directory with a index.html file that refers to the other files. This will be hosted in the eps directory under a new directory with the episode number.
|
||||
<pre>
|
||||
http://<?php print "${HTTP_HOST}";?>/eps/hpr9999/index.html
|
||||
http://<?php print "${HTTP_HOST}";?>/eps/hpr9999/other-file.pdf
|
||||
http://<?php print "${HTTP_HOST}";?>/eps/hpr9999/yet-other-file.c
|
||||
...
|
||||
</pre>
|
||||
Ensure that all links are full urls, as relative urls will not work in RSS feeds. Adding additional files will delay processing as they need to be verified manually.
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
Press submit and your show will be sent to the HPR Volunteers to be processed. Keep an eye on the <a href="http://<?php print "${HTTP_HOST}";?>/calendar.php">calendar</a> for when it is posted.
|
||||
Your show information is used to process the media files, on the website, in the RSS feeds, and on social media sites.
|
||||
</p>
|
||||
|
||||
<hr />
|
||||
|
||||
<h1 id="workflow">Workflow</h1>
|
||||
|
||||
<ol>
|
||||
<li>REQUEST_UNVERIFIED - </li>
|
||||
<li>REQUEST_EMAIL_SENT - email sent</li>
|
||||
<li>EMAIL_LINK_CLICKED - pending upload</li>
|
||||
<li>SHOW_SUBMITTED - upload complete</li>
|
||||
<li>METADATA_PROCESSED - shownotes.{json,txt} processed to html</li>
|
||||
<li>SHOW_POSTED - show in the database</li>
|
||||
<li>MEDIA_TRANSCODED - audio all generated</li>
|
||||
<li>UPLOADED_TO_IA - on the IA and visible</li>
|
||||
<li>UPLOADED_TO_RSYNC_NET - archived on rsync.net</li>
|
||||
</ol>
|
||||
|
||||
<hr />
|
||||
|
||||
<h1 id="faq">Frequently Asked Questions</h1>
|
||||
<h2 data-number="0.1" id="what-is-hacker-public-radio"><span class="header-section-number">0.1</span> What is Hacker Public Radio?</h2>
|
||||
<ul>
|
||||
<li><p>Hacker Public Radio (HPR) is an Internet Radio show (podcast) that releases shows (episodes) every weekday Monday through Friday.</p></li>
|
||||
<li><p>What differentiates HPR from other podcasts is that the shows are crowd sourced from the community — fellow listeners like you. There is no restriction on how long shows can be, nor on the topic you can cover, as long as they are not spam and "are of interest to Hackers".</p>
|
||||
<p>If you want to see what topics have been covered so far just have a look at our <a href="http://hackerpublicradio.org/index_full.php">Archive</a>. We also allow for shows to be grouped into <a href="http://hackerpublicradio.org/series.php">series</a> so that hosts can go into more detail on a topic.</p></li>
|
||||
<li><p>Look at the <a href="http://hackerpublicradio.org/about.php"><em>About HPR</em></a> page for a full description of <em>The HPR Community</em>, <em>Free Culture</em>, <em>Governance</em> and our <em>Patrons</em>.</p></li>
|
||||
<li><p>A question on the mailing list in 2020 asked if HPR is a Content Publication Network like YouTube, or is it a Podcast that random people contribute to? Or to put it another way, is the host addressing the Internet in general or the HPR Audience?</p>
|
||||
<ul>
|
||||
<li>The consensus of opinion is that HPR is a Podcast contributed to by the community, not a Content Publication Network.</li>
|
||||
</ul></li>
|
||||
</ul>
|
||||
<h2 data-number="0.2" id="what-is-a-show"><span class="header-section-number">0.2</span> What is a show?</h2>
|
||||
<ul>
|
||||
<li><p>A show is your <em>audio</em> presentation (which we do not moderate), with an <em>intro</em>, <em>outro</em>, a <em>title</em> and a <em>summary</em>.</p></li>
|
||||
<li><p>The <em>audio</em> is the recording you have made and sent in to HPR.</p></li>
|
||||
<li><p>The <em>intro</em> (introduction) is a piece of audio introducing the show. See <a href="http://hackerpublicradio.org/theme.php"><em>HPR Theme Music</em></a> for details. The components are:</p>
|
||||
<ul>
|
||||
<li>a synopsis taken from the details submitted with the show (added automatically)</li>
|
||||
<li>acknowledgement of our hosting provider (added automatically)</li>
|
||||
<li>HPR introduction music, can be added automatically or by you</li>
|
||||
</ul></li>
|
||||
<li><p>The <em>outro</em> is added automatically, but you can add it yourself if you want. It must contain the HPR outro music and the text you will find on the <a href="http://hackerpublicradio.org/theme.php"><em>HPR Theme Music</em></a> page.</p></li>
|
||||
<li><p>Each show needs a <em>title</em> to describe what it is about.</p></li>
|
||||
<li><p>Similarly, a <em>summary</em> helps to add more information describing the show so a potential listener can decide whether to listen to it or not.</p></li>
|
||||
<li><p>Each show is expected to have certain mandatory attributes listed <a href="#what-are-the-mandatory-elements-of-an-hpr-show">below</a>.</p></li>
|
||||
<li><p>HPR shows are usually expected to be informative or educational, and as such some sort of accompanying written material is highly desirable. This might consist of brief notes, links to relevant web sites, or possibly longer notes and examples. Photographs, diagrams and example files are also welcome if the host feels it helps to get the message across.</p></li>
|
||||
<li><p>Shows are released under a <a href="">Creative Commons Attribution-ShareAlike 3.0 Unported</a> license. See <a href="<!--% absolute_url(baseurl,'about.html#stuff_you_need_to_know') %-->"><em>Stuff you need to know</em></a> for much more detail about this and related issues.</p></li>
|
||||
<li><p>As a contributor you can choose when your show will be released. We only release one show a day, during week days, but if a slot is free you can claim it. Go to the <a href="http://hackerpublicradio.org/calendar.php"><em>calendar</em></a> page to do this. You need to have your show ready to upload before you reserve a slot though.</p></li>
|
||||
</ul>
|
||||
<h2 data-number="0.3" id="can-i-submit-a-show-made-for-another-podcast"><span class="header-section-number">0.3</span> Can I submit a show made for another podcast?</h2>
|
||||
<ul>
|
||||
<li><p>Strictly, no. Shows are expected to have been made exclusively for HPR.</p></li>
|
||||
<li><p>However, we support promoting new podcasts and other creative commons material. If you record a show of your own in which you introduce the other podcast, perhaps explaining why it is important, and giving links to the feed, you may include an example episode.</p></li>
|
||||
<li><p>A series exists <a href="http://hackerpublicradio.org/series.php?id=75"><em>Podcast recommendations</em></a>, which can be used for such shows.</p></li>
|
||||
</ul>
|
||||
<h2 data-number="0.4" id="what-defines-a-show-as-being-produced-for-hacker-public-radio"><span class="header-section-number">0.4</span> What defines a show as being "<em>Produced for Hacker Public Radio</em>"?</h2>
|
||||
<ul>
|
||||
<li>If you create material and post it first on HPR then it meets the requirements of "<em>being produced for HPR</em>". That means once you upload it to the HPR server you can publish it anywhere else you like.</li>
|
||||
</ul>
|
||||
<h2 data-number="0.5" id="what-are-the-mandatory-elements-of-an-hpr-show"><span class="header-section-number">0.5</span> What are the mandatory elements of an HPR show?</h2>
|
||||
<ul>
|
||||
<li><p>See <a href="http://hackerpublicradio.org/request_a_slot.php"><em>Picking a slot for your show</em></a> for the full details of how to submit a show and what information is required.</p></li>
|
||||
<li><p>A quick summary of the main components is:</p>
|
||||
<ul>
|
||||
<li>A show title</li>
|
||||
<li>A summary of what the show is about</li>
|
||||
<li>The <em>explicit</em>/<em>clean</em> flag</li>
|
||||
<li>License</li>
|
||||
<li>Show notes</li>
|
||||
<li>Tags</li>
|
||||
<li>Audio</li>
|
||||
</ul></li>
|
||||
</ul>
|
||||
<h2 data-number="0.6" id="what-are-tags"><span class="header-section-number">0.6</span> What are tags?</h2>
|
||||
<ul>
|
||||
<li><p>We are trying to maintain a collection of tags to allow people to find shows on the same (or similar) topic.</p></li>
|
||||
<li><p>Tags are simple words or short phrases describing aspects of a show such as what topics are covered in it. To get hints about what tags have already been used you can view all the current tags in alphabetical order on this page: <a href="http://hackerpublicradio.org/tags.php">Tag summary</a></p></li>
|
||||
<li><p>Some examples are: <b>android</b>, <b>creative commons</b> and <b>gaming</b>.</p></li>
|
||||
<li><p>Are there any tags that are best avoided?</p></li>
|
||||
</ul>
|
||||
<h2 data-number="0.7" id="is-it-ok-if-i-dont-include-notes-with-my-show"><span class="header-section-number">0.7</span> Is it OK if I don't include notes with my show?</h2>
|
||||
<ul>
|
||||
<li><strong>Please don't do that</strong>. It is important to provide good show notes for reasons described on the <a href="http://hackerpublicradio.org/request_a_slot.php"><em>Picking a slot for your show</em></a> page:
|
||||
<ul>
|
||||
<li>They provide the listeners with more information on the topic your show is covering</li>
|
||||
<li>They ensure your show gets posted on time (the volunteers don't have to make notes for you)</li>
|
||||
<li>They encourage people to download your show</li>
|
||||
<li>They allow your show to be indexed by search engines</li>
|
||||
<li>They make your show accessible to the deaf and hard of hearing</li>
|
||||
</ul></li>
|
||||
</ul>
|
||||
<h2 data-number="0.8" id="how-do-i-include-photographs-or-other-files-with-my-show"><span class="header-section-number">0.8</span> How do I include photographs or other files with my show?</h2>
|
||||
<ul>
|
||||
<li>TBA</li>
|
||||
</ul>
|
||||
<h2 data-number="0.9" id="what-is-and-is-not-edited-in-a-show-after-submission"><span class="header-section-number">0.9</span> What is and is not edited in a show after submission?</h2>
|
||||
<ul>
|
||||
<li><p>We don't listen to the audio before posting a show to the website, so we don't change the content.</p></li>
|
||||
<li><p>Unless you have done so and told us you have, we add an introduction to the audio announcing what it is. Similarly we add an <em>outro</em>. This is not <u>editing</u> since we don't change the content.</p></li>
|
||||
<li><p>We may make changes to the show title, summary or tags. Usually these are minor changes such as spelling corrections. The intention is not any sort of censorship, merely to make these items more understandable or easier to index.</p></li>
|
||||
<li><p>Depending on the form the show notes take we may modify these.</p>
|
||||
<ul>
|
||||
<li>If what is submitted is plain text we convert it to Markdown in order to generate HTML.</li>
|
||||
<li>If the notes are one of the permitted markup formats (mostly Markdown flavours) we may adjust this to ensure that valid HTML is generated.</li>
|
||||
<li>If the notes are HTML we run them through an HTML checker and correct any mistakes it highlights.</li>
|
||||
<li>We may correct spelling, grammar and punctuation if this clarifies anything which might otherwise be unclear.</li>
|
||||
<li>If despite the request for show notes of some kind, none are provided, we may add notes which help to clarify the content of the show. This may be done after the show is released (when we have had a chance to listen to it).</li>
|
||||
</ul></li>
|
||||
<li><p>We are working on the production of reports about any changes made, which will be sent to the host after we have processed the show.</p></li>
|
||||
<li><p>We may make changes to a show's metadata if the host requests it (see the item on <a href="#if-i-notice-an-error-in-my-shows-details-how-can-it-be-fixed">fixing errors after upload</a>).</p></li>
|
||||
<li><p>If a show contains links to resources which disappear after a period of time, we may at some future time change the notes to refer to any <em>Wayback Machine</em> copy that can be found.</p></li>
|
||||
</ul>
|
||||
<h2 data-number="0.10" id="what-are-some-common-errors-in-show-notes"><span class="header-section-number">0.10</span> What are some common errors in show notes?</h2>
|
||||
<p>It depends on the note format to some extent:</p>
|
||||
<h3 data-number="0.10.1" id="html-notes"><span class="header-section-number">0.10.1</span> HTML notes</h3>
|
||||
<ul>
|
||||
<li><p>It's very easy to hand-write bad HTML. That's why we use an HTML checker on it, and fix the errors it reports.</p></li>
|
||||
<li><p>A common fault is to write <code><code><pre></code> to define a pre-formatted block of text using a fixed-width font. However it's illegal because the <code><pre></code> tag can't be enclosed in other tags like <code><code></code>. Use <code><pre><code></code> instead.</p></li>
|
||||
</ul>
|
||||
<h3 data-number="0.10.2" id="markdown-notes"><span class="header-section-number">0.10.2</span> Markdown notes</h3>
|
||||
<ul>
|
||||
<li>This is quite a forgiving format. Some people embed HTML in the Markdown, and the HTML used suffers from some of the issues discussed in this document. These are <em>much</em> harder to spot. The HTML checker can't really help unless it's run on the output from Pandoc.</li>
|
||||
</ul>
|
||||
<h3 data-number="0.10.3" id="general-errors"><span class="header-section-number">0.10.3</span> General errors</h3>
|
||||
<ul>
|
||||
<li><p>Spelling is often an issue in notes. As the notes are processed they are edited in the Vim editor with the spell check option turned on. In most cases spelling problems flagged by Vim are corrected.</p></li>
|
||||
<li><p>Grammar and punctuation can also be issues. We do not have very effective grammar checking tools in the note preparation workflow. Modifications may be made to split up extra-long (often <em>comma-spliced</em>) sentences, rationalise the use of capital letters and similar.</p></li>
|
||||
</ul>
|
||||
<h2 data-number="0.11" id="if-i-notice-an-error-in-my-shows-details-how-can-it-be-fixed"><span class="header-section-number">0.11</span> If I notice an error in my show's details how can it be fixed?</h2>
|
||||
<ul>
|
||||
<li><p>The HPR administrators can make changes to show titles, summaries, notes and so forth. Ideally send an email to <code>admin</code> at <code>hackerpublicradio.org</code> explaining what the problem is and we'll fix it for you. We'll also ensure that the changes are propagated to the relevant page on archive.org.</p></li>
|
||||
<li><p>Don't be tempted to send in your corrections as a comment. Comments are not propagated to archive.org, so people referring to that copy will not see the changes.</p></li>
|
||||
</ul>
|
||||
<h2 data-number="0.12" id="does-hobbypublicradio.com-have-anything-to-do-with-hpr"><span class="header-section-number">0.12</span> Does <code>hobbypublicradio.com</code> have anything to do with HPR?</h2>
|
||||
<ul>
|
||||
<li><p>Some environments prevent access to sites which use the word <code>'hacker'</code> or <code>'hackers'</code> in their names (or content in extreme cases). The site names <code>hobbypublicradio.{com,net,org}</code> have been created, which link to the main HPR site, in order to get around this restriction.</p></li>
|
||||
<li><p>See the mailing list thread here: <a href="https://lists.hackerpublicradio.com/pipermail/hpr/2015-February/002493.html" class="uri">https://lists.hackerpublicradio.com/pipermail/hpr/2015-February/002493.html</a></p></li>
|
||||
</ul>
|
||||
<h2 data-number="0.13" id="how-can-i-talk-to-other-hpr-hosts-and-listeners"><span class="header-section-number">0.13</span> How can I talk to other HPR hosts and listeners?</h2>
|
||||
<ul>
|
||||
<li>You have a number of choices:
|
||||
<ul>
|
||||
<li>The mailing list <a href="mailto:hpr@hackerpublicradio.org" class="email">hpr@hackerpublicradio.org</a> is where various policy matters are discussed and announcements made. You need to be a member of the list to post to it. Visit the <a href="<!--% absolute_url(baseurl,'/maillist') %-->" ><em>listinfo page</em></a> to sign up.</li>
|
||||
<li>You can join the <strong>#oggcastplanet</strong> channel on IRC. Visit the <a href="http://webchat.freenode.net/?channels=oggcastplanet">freenode.net</a> network to sign up.</li>
|
||||
<li>A number of HPR messages may be found on Twitter (tag <strong>#hpr</strong>) and Mastodon (tag <strong>#hpr</strong>).</li>
|
||||
<li><strong>TBA - Matrix? Telegram?</strong></li>
|
||||
<li>An HPR tradition exists where we record a 26-hour show at the turn of the year celebrating the arrival of the New Year around the world. We use Mumble to record the show and anyone can connect to the Mumble server and speak to other HPR listeners and hosts. The recording is used to make multiple shows which are released when they are ready.</li>
|
||||
</ul></li>
|
||||
</ul>
|
||||
|
42
templates/content-comments_viewer.tpl.html
Normal file
@@ -0,0 +1,42 @@
|
||||
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-listen-now.tpl.html' %-->
|
||||
<!--% PROCESS "queries-episode-${constants.database}.tpl.html" %-->
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<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 />
|
||||
<!--% FOREACH item IN DBI.query('
|
||||
SELECT C.*,
|
||||
H.host, H.hostid AS host_id,
|
||||
E.title AS episode_title,
|
||||
E.date AS episode_date,
|
||||
E.duration AS episode_duration,
|
||||
M.id AS series_id, M.name AS series_name
|
||||
FROM comments AS C
|
||||
INNER JOIN eps AS E
|
||||
ON C.eps_id = E.id
|
||||
INNER JOIN hosts AS H
|
||||
ON E.hostid = H.hostid
|
||||
INNER JOIN miniseries AS M
|
||||
ON E.series = M.id
|
||||
ORDER BY C.comment_timestamp DESC
|
||||
LIMIT 30
|
||||
')
|
||||
%-->
|
||||
|
||||
<article>
|
||||
<header>
|
||||
<h1><!--% item.comment_author_name %--> says: <!--% 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 />
|
||||
<!--% END %-->
|
@@ -1,21 +0,0 @@
|
||||
<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.www.hackerpublicradio.org" target="_blank">www.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 />
|
||||
<a href="http://www.hackerpublicradio.org/maillist">http://www.hackerpublicradio.org/maillist</a>
|
||||
</p>
|
||||
</article>
|
@@ -55,7 +55,7 @@
|
||||
|
||||
<h2>4. Upload your show</h2>
|
||||
<p>
|
||||
Once you have your audio ready you can post your show by going to the <a href="https://www.hackerpublicradio.org/calendar.php">Calendar</a> page or press the <strong><a href="https://www.hackerpublicradio.org/calendar.php">⇧Upload⇧</strong></a> button.
|
||||
Once you have your audio ready you can post your show by going to the <a href="<!--% hub_baseurl %-->calendar.php">Calendar</a> page or press the <strong><a href="<!--% hub_baseurl %-->calendar.php">⇧Upload⇧</strong></a> button.
|
||||
</p>
|
||||
<p>
|
||||
After you have selected a date you will be redirected to the <a href="https://www.hackerpublicradio.org/request.php">request page</a>, where you will be asked to select your show and email address. We will send a link to where you can upload your show to this address and so it must be a valid working address that you can access quickly. We intend to use <a href="https://www.gnupg.org/">GPG</a> to speed up the validation of hosts, so you may wish to use an email address that has an associated public key available on public key servers.
|
||||
|
@@ -1,13 +1,30 @@
|
||||
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-avatar.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% PROCESS "queries-correspondent-${constants.database}.tpl.html" %-->
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% query_show_count = DBI.prepare('
|
||||
<!--% query_hpr_show_count = DBI.prepare('
|
||||
SELECT id
|
||||
FROM eps
|
||||
WHERE eps.hostid = ? ')
|
||||
WHERE eps.hostid = ?
|
||||
')
|
||||
%-->
|
||||
<!--% query_shows = DBI.prepare('
|
||||
<!--% 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 %-->
|
||||
|
||||
<!--% 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 ,
|
||||
@@ -18,33 +35,40 @@
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email,
|
||||
miniseries.name AS series, miniseries.id AS seriesid
|
||||
FROM eps
|
||||
FROM twat_eps AS 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 date DESC ')
|
||||
WHERE hosts.hostid = ?
|
||||
ORDER BY eps.id DESC
|
||||
')
|
||||
%-->
|
||||
<!--% shows_to_count = query_show_count.execute(id); %-->
|
||||
<!--% shows = query_shows.execute(id); %-->
|
||||
<!--% show_count = 0 %-->
|
||||
<!--% FOREACH show IN shows_to_count %-->
|
||||
<!--% show_count = show_count +1; %-->
|
||||
<!--% 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') %-->
|
||||
|
||||
<article>
|
||||
<!--% this_host = hosts.$id %-->
|
||||
<h2 class="title">Correspondent</h2>
|
||||
<h2><!--% this_host.host %--></h2>
|
||||
<p><img src="<!--% absolute_path(baseurl) %-->images/<!--% get_avatar(this_host.hostid) %-->"
|
||||
height="80" alt="Host Image" /><br>
|
||||
<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>episodes:</label> <strong><!--% show_count %--></strong>
|
||||
<label>episodes:</label> <strong><!--% hpr_show_count + twat_show_count %--></strong>
|
||||
</p>
|
||||
<!--% FOREACH show IN shows; %-->
|
||||
<!--% FOREACH hpr_show IN hpr_shows; %-->
|
||||
|
||||
<!--% show_summary(show, 'hide_host') %-->
|
||||
<!--% 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="contribute.html">Become a Correspondent</a></p>
|
||||
|
@@ -1,30 +1,32 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-avatar.tpl.html' %-->
|
||||
<article>
|
||||
<h2 class="title">Correspondents</h2>
|
||||
<p>For more information on how to become a Correspondent see our <a href="<!--% absolute_path(baseurl) %-->contribute.html">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) %-->
|
||||
<!--% PROCESS 'shared-avatar.tpl.html' %-->
|
||||
<table>
|
||||
<!--% host_cnt = 0 %-->
|
||||
<table class="hosts">
|
||||
<th >Avatar</th>
|
||||
<th >Name & Host ID</th>
|
||||
<th >license</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 '
|
||||
on h.hostid = e.hostid
|
||||
order by h.host'
|
||||
) %-->
|
||||
<tr height="80" bgcolor="#CCCCCC">
|
||||
<td><img src="<!--% absolute_path(baseurl) %-->images/<!--% get_avatar(host.hostid) %-->" height="80" width="80" alt="avatar" /></td>
|
||||
<tr height="80">
|
||||
<td><!--% get_avatar(host.hostid, host.host, host_cnt > 8) %--></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>
|
||||
</tr><!--% host_cnt = host_cnt + 1 %-->
|
||||
<!--% END %-->
|
||||
</table>
|
||||
<p><a href="<!--% absolute_path(baseurl) %-->contribute.html">Become a Correspondent</a></p>
|
||||
|
@@ -1,60 +1,128 @@
|
||||
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-avatar.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-listen-now.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-show-transcript.tpl.html' %-->
|
||||
<!--% PROCESS "queries-episode-${constants.database}.tpl.html" %-->
|
||||
<!--% 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 eps
|
||||
WHERE eps.date < date (\'now\', \'+1 days\')
|
||||
),
|
||||
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 < date (\'now\')
|
||||
)
|
||||
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\'
|
||||
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
|
||||
WHERE eps.id = ?
|
||||
')
|
||||
%-->
|
||||
<!--% 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) %-->
|
||||
<article>
|
||||
<header>
|
||||
<h1>hpr<!--% episode.id %--> :: <!--% episode.title %--></h1>
|
||||
<h1>hpr<!--% zero_pad_left(episode.id) %--> :: <!--% episode.title %--></h1>
|
||||
<h3><!--% episode.summary %--></h3>
|
||||
<p class="meta"><!--% step_navigation(baseurl,episode) %-->
|
||||
<p class="meta"><!--% episode_navigation %-->
|
||||
</p>
|
||||
<p><!--% IF get_avatar(episode.hostid) != 'hpr_logo.png' %-->
|
||||
<img src="<!--% absolute_path(baseurl) %-->images/<!--% get_avatar(episode.hostid) %-->" height="80" width="80" alt="" /></a><br><!--% END %-->
|
||||
Hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(episode.hostid) %-->.html"><!--% episode.host %--></a>. <!--% show_meta(episode) %--></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><!--% 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>
|
||||
<!--% 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><!--% episode.notes %--></div>
|
||||
</article>
|
||||
<footer>
|
||||
<!--% show_transcript(episode, "hpr", baseurl, media_baseurl) %-->
|
||||
<p>
|
||||
<!--% episode_navigation %-->
|
||||
</p>
|
||||
</footer></article>
|
||||
<!--% END %-->
|
||||
<hr />
|
||||
<h1>Comments</h1>
|
||||
<p id="comments">
|
||||
Subscribe to the comments <a href="<!--% absolute_path(baseurl) %-->comments.rss">RSS</a> feed.
|
||||
</p>
|
||||
<!--% query_comments = DBI.prepare('
|
||||
SELECT
|
||||
id,
|
||||
comment_timestamp,
|
||||
comment_author_name,
|
||||
comment_title,
|
||||
comment_text
|
||||
FROM comments
|
||||
WHERE eps_id = ?
|
||||
')
|
||||
%-->
|
||||
<!--% comment_index = 1 %-->
|
||||
<!--% comments_result = query_comments.execute(id) %-->
|
||||
<!--% FOREACH comment IN comments_result %-->
|
||||
<h5 id="comment_<!--% comment.id %-->">Comment #<!--% comment_index %--> posted on <!--% comment.comment_timestamp %--> by <!--% comment.comment_author_name %--></h5>
|
||||
<h4><!--% comment.comment_title %--></h4>
|
||||
<!--% 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_path(baseurl) %-->contribute.html">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_path(baseurl) %-->contribute.html">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>
|
||||
<legend>Provide feedback</legend>
|
||||
<table>
|
||||
<tr>
|
||||
<td>Your Name/Handle:</td>
|
||||
<td><input required type="text" name="comment_author_name" size="40" maxlength="40" placeholder="Enter your name" ></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Title:</td>
|
||||
<td><input required type="text" name="comment_title" size="50" maxlength="100" placeholder="What is your comment about?"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Comment:</td>
|
||||
<td><textarea required name="comment_text" maxlength="2000" rows="10" cols="50" placeholder="Place the comment here."></textarea></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Anti Spam Question:</td>
|
||||
<td>
|
||||
What does the letter <strong>P</strong> in <em>HPR</em> stand for? <br />
|
||||
<input required type="text" name="anti_spam_question" size="50" maxlength="100" placeholder="Type out what the P in HPR stands for."></td>
|
||||
</tr>
|
||||
<!--% IF in_window %-->
|
||||
<tr><td>
|
||||
<input type="hidden" name="spammer" value="No">
|
||||
<input type="hidden" name="hostid" value="<!--% episode.hostid %-->">
|
||||
<input type="hidden" name="justification" value="No justification is asked for or required.">
|
||||
</td></tr>
|
||||
<!--% ELSE %-->
|
||||
<!-- . -->
|
||||
<tr>
|
||||
<td>Are you a spammer?</td>
|
||||
<td>
|
||||
<input required checked="checked" type="radio" name="spammer" id="spammer_yes" value="Yes">
|
||||
<label for="spammer_yes">Yes</label>
|
||||
<input required type="radio" name="spammer" id="spammer_no" value="No">
|
||||
<label for="spammer_no">No</label>
|
||||
</td>
|
||||
</tr>
|
||||
<!-- . -->
|
||||
<tr>
|
||||
<td>Who hosted this show?</td>
|
||||
<td>
|
||||
<input required type="text" name="hostid" size="20" maxlength="5" placeholder="Type the host number"></td>
|
||||
<td>
|
||||
<!-- . -->
|
||||
<tr>
|
||||
<td>What does HPR mean to you?</td>
|
||||
<td><textarea required name="justification" maxlength="200" rows="4" cols="50" placeholder="Convince us you are part of the community."></textarea></td>
|
||||
</tr>
|
||||
<!--% END %-->
|
||||
<tr><td>
|
||||
<input type="hidden" name="eps_id" value="<!--% episode.id %-->">
|
||||
</td></tr>
|
||||
</table>
|
||||
<input type="submit" value="Next">
|
||||
</fieldset>
|
||||
</form>
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
|
||||
<!--% PROCESS "queries-episodes-${constants.database}.tpl.html" %-->
|
||||
<article>
|
||||
<header>
|
||||
<h1>Complete Archive of Shows.</h1>
|
||||
@@ -7,7 +8,17 @@
|
||||
</p>
|
||||
</header>
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% FOREACH episodes IN DBI.query('
|
||||
<!--% FOREACH episodes IN DBI.query(query_episodes)
|
||||
%-->
|
||||
<!--% show_summary(episodes) %-->
|
||||
<p class="listen-in"><!--% display_listen_in(episodes.id) %--></p>
|
||||
<!--% END %-->
|
||||
<h2 id="twat_episodes">Today With a Techie Archived Shows</h2>
|
||||
<p>
|
||||
<!-- Creative Commons License -->
|
||||
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/2.5/"><img alt="Creative Commons License" border="0" src="http://creativecommons.org/images/public/somerights20.png" width="88" height="31" /></a><br>The following work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/2.5/">Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License</a>.</p>
|
||||
<p>T.W.A.T. Radio was brought to you by <a href="https://en.wikipedia.org/wiki/Infonomicon">The Infonomicon Computer Club</a></p>
|
||||
<!--% FOREACH twat_episode IN DBI.query('
|
||||
SELECT
|
||||
eps.id,
|
||||
eps.explicit,
|
||||
@@ -16,13 +27,14 @@
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email, hosts.local_image,
|
||||
miniseries.name AS series, miniseries.id AS seriesid
|
||||
FROM eps
|
||||
FROM twat_eps as eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE eps.date < date(\'now\', \'+1 days\')
|
||||
ORDER BY date DESC
|
||||
ORDER BY eps.id DESC
|
||||
')
|
||||
%-->
|
||||
<!--% show_summary(episodes) %-->
|
||||
<!--% twat_show_summary(twat_episode) %-->
|
||||
<!--% END %-->
|
||||
|
||||
</article>
|
||||
|
||||
|
2
templates/content-index-announcement.tpl.html
Normal file
@@ -0,0 +1,2 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
|
@@ -1,96 +1,81 @@
|
||||
<!--% PROCESS 'shared-avatar.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-listen-now.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-show-transcript.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-call_for_shows.tpl.html' %-->
|
||||
<!--% INCLUDE 'content-index-announcement.tpl.html' %-->
|
||||
<!--% PROCESS "queries-index-${constants.database}.tpl.html" %-->
|
||||
<!--% MACRO tidy_notes(all_lines) BLOCK %-->
|
||||
<!--% lines = all_lines %-->
|
||||
<!--% after_html = all_lines %-->
|
||||
<!--% img_re = '(?six)^(.*?)\<img ([^\>]+\>)(.+)$' %-->
|
||||
<!--% lazy_re = '(?i)loading="lazy"' %-->
|
||||
<!--% WHILE (matches = lines.match(img_re)) %-->
|
||||
<!--% img_tag = matches.1 %-->
|
||||
<!--% after_html = matches.2 %-->
|
||||
<!--% matches.0 %-->
|
||||
<!--% IF (img_tag.search(lazy_re)) %-->
|
||||
<img <!--% img_tag %-->
|
||||
<!--% ELSE %-->
|
||||
<img loading="lazy" <!--% img_tag %-->
|
||||
<!--% END %-->
|
||||
<!--% lines = after_html %-->
|
||||
<!--% END %-->
|
||||
<!--% after_html %-->
|
||||
<!--% END %-->
|
||||
<hr>
|
||||
<article>
|
||||
<header>
|
||||
<h3>Welcome to HPR the Community Podcast</h3>
|
||||
</header>
|
||||
<!--% days_till_next_episode = 0 %-->
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% FOREACH next_available_episode_result IN DBI.query(query_next_available_episode)
|
||||
%-->
|
||||
<!--% USE date %-->
|
||||
<!--% calc = date.calc %-->
|
||||
<!--% days_till_next_episode = calc.Delta_Days(date.format(date.now, '%Y'),date.format(date.now, '%m'),date.format(date.now, '%d'),next_available_episode_result.last_year,next_available_episode_result.last_month,next_available_episode_result.last_day) %-->
|
||||
<!--% END %-->
|
||||
<!--% USE date %-->
|
||||
<!--% delta = date.calc.N_Delta_YMD(2005,9,19, date.format(date.now, '%Y'),date.format(date.now, '%m'),date.format(date.now, '%d')) %-->
|
||||
<p>We started producing shows as <a href="https://www.hackerpublicradio.org/twat.php"><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">topic</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_path(baseurl) %-->contribute.html">record</a> your show now it could be <a href="https://www.hackerpublicradio.org/calendar.php">released</a> in <strong>13</strong> days.</p>
|
||||
<h4>Meet the team</h4>
|
||||
<p>
|
||||
<audio controls preload="none">";
|
||||
<source src="<!--% absolute_path(baseurl) %-->media/promos/all-hpr-hosts.ogg" type="audio/ogg" >
|
||||
<source src="<!--% absolute_path(baseurl) %-->media/promos/all-hpr-hosts.mp3" type="audio/mpeg" >
|
||||
</audio>
|
||||
</p>
|
||||
<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">topic</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_path(baseurl) %-->contribute.html">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' %-->
|
||||
<h1>Latest Shows</h1>
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% FOREACH latest_episodes IN DBI.query('
|
||||
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
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE eps.date < date(\'now\', \'+1 days\')
|
||||
ORDER BY date DESC
|
||||
LIMIT 10
|
||||
')
|
||||
<!--% host_cnt = 0 %-->
|
||||
<!--% FOREACH latest_episodes IN DBI.query(query_latest_episodes)
|
||||
%-->
|
||||
<hr>
|
||||
<article>
|
||||
<header>
|
||||
<h1><a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(latest_episodes.id) %-->/index.html">hpr<!--% latest_episodes.id %--> :: <!--% latest_episodes.title %--></a></h1>
|
||||
<h3><!--% latest_episodes.summary%--></h3>
|
||||
<p class="meta"$><!--% IF get_avatar(latest_episodes.hostid) != 'hpr_logo.png' %-->
|
||||
<img src="<!--% absolute_path(baseurl) %-->images/<!--% get_avatar(latest_episodes.hostid) %-->" height="80" width="80" alt="" /></a><!--% END %-->
|
||||
<br>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>
|
||||
<strong>Tags:</strong> <!--% latest_episodes.tags %--><em></em>.<br>
|
||||
<small>listen in <a href="local/hpr<!--% latest_episodes.id %-->.ogg">ogg</a>, <a href="local/hpr<!--% latest_episodes.id %-->.spx">spx</a>, or <a href="local/hpr<!--% latest_episodes.id %-->.mp3">mp3</a> format. <!--% show_series(latest_episodes.series, latest_episodes.seriesid) %-->
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(latest_episodes.id) %-->/index.html#comments">View comments.</a></small>
|
||||
<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>
|
||||
<!--% latest_episodes.notes %-->
|
||||
<!--% tidy_notes(latest_episodes.notes) %-->
|
||||
<footer>
|
||||
<h2>listen now</h2>
|
||||
<p>Duration: <!--% latest_episodes.duration %--></p>
|
||||
<audio controls preload="none">
|
||||
<source src="local/hpr<!--% latest_episodes.id %-->.ogg" type="audio/ogg" >
|
||||
<source src="local/hpr<!--% latest_episodes.id %-->.mp3" type="audio/mpeg" >
|
||||
</audio>
|
||||
<ul>
|
||||
<li>ogg: <a href="local/hpr<!--% latest_episodes.id %-->.ogg">/local/hpr<!--% latest_episodes.id %-->.ogg</a></li>
|
||||
<li>spx: <a href="local/hpr<!--% latest_episodes.id %-->.spx">/local/hpr<!--% latest_episodes.id %-->.spx</a></li>
|
||||
<li>mp3: <a href="local/hpr<!--% latest_episodes.id %-->.mp3">/local/hpr<!--% latest_episodes.id %-->.mp3</a></li>
|
||||
</ul>
|
||||
<!--% show_transcript(latest_episodes, "hpr", baseurl, media_baseurl) %-->
|
||||
</footer>
|
||||
</article>
|
||||
<!--% host_cnt = host_cnt + 1 %-->
|
||||
<!--% END %-->
|
||||
<article>
|
||||
<header>
|
||||
<hr>
|
||||
<h1>Previous five weeks</h1>
|
||||
</header>
|
||||
<!--% FOREACH last_5_weeks_episodes IN DBI.query('
|
||||
SELECT
|
||||
eps.id,
|
||||
CASE eps.explicit WHEN 1 THEN \'Explicit\' ELSE \'Clean\' END AS 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 < date(\'now\', \'+1 days\')
|
||||
ORDER BY date DESC
|
||||
LIMIT 30 OFFSET 10
|
||||
')
|
||||
<!--% FOREACH last_5_weeks_episodes IN DBI.query(query_last_5_weeks_episodes)
|
||||
%-->
|
||||
<!--% show_summary(last_5_weeks_episodes) %-->
|
||||
<p class="listen-in"><!--% display_listen_in(last_5_weeks_episodes.id) %--></p>
|
||||
<!--% END %-->
|
||||
</article>
|
||||
<h1>Older Shows</h1>
|
||||
|
189
templates/content-mumble-howto.tpl.html
Normal file
@@ -0,0 +1,189 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<p>In this article we will show you how to connect to the HPR Community Room on Mumble.</p>
|
||||
|
||||
<p>You can think of Mumble like visiting a hotel that has different meeting rooms. Some are locked to you, some only allow you access if you are registered, some you can join but only listen to. In most, like the HPR room, you can hear the other people in the room talking. If you talk they can also hear you. There is a chat section where text can be shared as well.</p>
|
||||
|
||||
<p>When using Mumble <strong><em>you should always use a microphone and headset</em></strong> positioned close to your mouth but slightly off to the side.</p>
|
||||
<h2>Install the software</h2>
|
||||
|
||||
<p>The <a href="https://www.mumble.info/downloads/">Mumble website offers download and install instructions</a> for different operating systems.
|
||||
</p>
|
||||
|
||||
<p>Once you have installed the client then connect to the <a href="mumble://chatter.skyehaven.net:64738/Hacker%20Public%20Radio?version=1.2.0">HPR Room on Mumble</a>.
|
||||
|
||||
<p>There is a first run wizard that will step you through the process of configuring Mumble the first time. This will open up a series of configuration options.</p>
|
||||
|
||||
<p>Press <strong>Next</strong> on the introduction.</p>
|
||||
|
||||
<p><img alt="intro screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/01-intro.png" ></p>
|
||||
|
||||
<p>The device selection page will allow you to select which audio to use. As this will be different for everyone we can't offer you much help here other than to say that the defaults are usually fine.</p>
|
||||
|
||||
<p>When you are done press <strong>Next</strong>.</p>
|
||||
|
||||
<p><img alt="device selection screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/02-device-selection.png" ></p>
|
||||
|
||||
<p>The device tuning page will allow you to fine tune the latency. Normally the defaults are usually fine.</p>
|
||||
|
||||
<p>When you are done press <strong>Next</strong>.</p>
|
||||
|
||||
<p><img alt="device tuning screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/03-device-tuning.png" ></p>
|
||||
|
||||
<p>The Volume Tuning page will allow you to set your audio levels. Normally the defaults are usually fine.</p>
|
||||
|
||||
<p>Then press <strong>Next</strong>.</p>
|
||||
|
||||
<p><img alt="volume tuning screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/04-volume.png" ></p>
|
||||
|
||||
<p>It is <strong>very important</strong> that you set <strong>Push to Talk (PTT)</strong>, as you will disturb the other people in the room if you select the other methods. It may seem to be working fine to you, but it <em>will</em> result in issues for the others.
|
||||
</p>
|
||||
<ul>
|
||||
<li>Click "Push to Talk:"</li>
|
||||
<li>Click in the area next to it and press the key you intend to use as the Push To Talk (PTT) Key</li>
|
||||
</ul>
|
||||
|
||||
<p>Try and pick a key that you don't normally use or need. You may have to disable that key mapping in the operating system you are using.</p>
|
||||
|
||||
<p>Then press <strong>Next</strong>.</p>
|
||||
|
||||
<p><img alt="ptt screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/05-ptt.png" ></p>
|
||||
|
||||
<p>The Quality Settings page will allow you to adjust the bandwidth. Normally the defaults are usually fine.</p>
|
||||
|
||||
<p>It is <strong>very important</strong> that you <strong>Disable Text-To-Speech</strong>, as all notifications will be read back and will disturb the other people in the room. It may seem to be working fine to you, but it <em>will</em> result in issues for the others.</p>
|
||||
<ul>
|
||||
<li>Click "Disable Text-To-Speech and use sounds instead"</li>
|
||||
</ul>
|
||||
|
||||
<p>Then press <strong>Next</strong>.</p>
|
||||
|
||||
<p><img alt="no tts screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/06-notts.png" ></p>
|
||||
|
||||
<p>The positional audio page will allow you to fine tune the latency. Normally the defaults are usually fine.</p>
|
||||
|
||||
<p>Just press <strong>Next</strong>.</p>
|
||||
|
||||
<p><img alt="positional audio screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/07-positional-audio.png" ></p>
|
||||
|
||||
<p>That's it the initial configuration is done.</p>
|
||||
|
||||
<p>Then press <strong>Finish</strong>.</p>
|
||||
|
||||
<p><img alt="stats screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/08-stats.png" ></p>
|
||||
|
||||
<p>You are expected to have a digital certificate when connecting to Mumble servers.</p>
|
||||
|
||||
<p>This screen will allow you to Automatically create one.</p>
|
||||
|
||||
<p>Just press <strong>Next</strong>.</p>
|
||||
|
||||
<p><img alt="cert screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/09-cert.png" ></p>
|
||||
|
||||
<p>That completes the first setup of Mumble.</p>
|
||||
|
||||
<p>Then press <strong>Finish</strong>.</p>
|
||||
|
||||
<p><img alt="finished screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/10-finished.png" ></p>
|
||||
<hr>
|
||||
|
||||
<p>Now that you have the Mumble client set up we can now start the process of connecting to the <a href="mumble://chatter.skyehaven.net:64738/Hacker%20Public%20Radio?version=1.2.0">HPR Room on Mumble</a>.</p>
|
||||
|
||||
<p>If you opened Mumble by clicking the link above, then you may not see the following options, but we'll cover them here if at any time you need to add the HPR server again</p>
|
||||
|
||||
<p>Just open mumble and press <strong>Server - Connect</strong></p>
|
||||
|
||||
<p>Then press <strong>Add New...</strong>.</p>
|
||||
|
||||
<p><img alt="add new connection screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/20-add-new.png" ></p>
|
||||
|
||||
<p>You will need to enter the information for the HPR server:</p>
|
||||
<ul>
|
||||
<li>Address: <strong>chatter.skyehaven.net</strong></li>
|
||||
<li>Port: 64738</li>
|
||||
<li>Username: <strong><em>Your Username</em></strong></li>
|
||||
<li>Label: chatter.skyehaven.net</li>
|
||||
</ul>
|
||||
|
||||
<p>Think about your username a bit as if you register it on the server you will not be able to change it again.</p>
|
||||
|
||||
<p>Then press <strong>Next</strong>.</p>
|
||||
|
||||
<p><img alt="add new server screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/21-add-server.png" ></p>
|
||||
|
||||
<p>If you clicked the link to the <a href="mumble://chatter.skyehaven.net:64738/Hacker%20Public%20Radio?version=1.2.0">HPR Room on Mumble</a>, then you may be brought to the option to enter a username. Think about this a bit as if you register it on the server you will not be able to change it again.</p>
|
||||
|
||||
<p>Then press <strong>Next</strong>.</p>
|
||||
|
||||
<p><img alt="username screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/11-username.png" ></p>
|
||||
|
||||
<p>You will need to confirm the servers Certificate matches this:</p>
|
||||
|
||||
<p>
|
||||
<pre>Digest (SHA-1): 09:22:05:88:D6:60:17:FD:39:8F:55:B0:F5:A0:45:DA:96:32:9C:23</pre>
|
||||
</p>
|
||||
|
||||
<p>If it matches then press <strong>Yes</strong>.</p>
|
||||
|
||||
<p><img alt="accept cert screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/12-accept-cert.png" ></p>
|
||||
|
||||
<p>All going well you will be connected to the server. By default you will end up in the <strong>Root</strong> - think the lobby of an hotel !</p>
|
||||
|
||||
<p>You will see a lot of rooms with names of other podcasts that use the server.</p>
|
||||
|
||||
<p>Before connecting to any room it's good etiquette to make sure your audio is working correctly.</p>
|
||||
|
||||
<p>The room <strong>Audio Test</strong> will allow you to speak and the <strong>OpieTheRepeatherBot</strong> will record your speech and after 10 seconds will play it back for you.</p>
|
||||
|
||||
<p><em>Click and hold</em> on your username (<em>ken1</em> in this example) and <em>drag</em> yourself into the <strong>Audio Test</strong> room.</p>
|
||||
|
||||
<p><img alt="audio test screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/13-audio-test.png" ></p>
|
||||
|
||||
<p>You now know how to switch from room to room.</p>
|
||||
|
||||
<p>Try to say something. Remember to press the <strong>Push to talk (PTT)</strong>. Everyone forgets to do this but it will become second nature after a while.</p>
|
||||
|
||||
<p>A good test is to count to ten slowly.</p>
|
||||
|
||||
<p>When you are talking the server should change your icon from a green person to a <em>blue</em> one with <em>sound circles</em> around the head.</p>
|
||||
|
||||
<p><img alt="audio ping screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/14-audio-ping.png" ></p>
|
||||
|
||||
<p>The <strong>OpieTheRepeatherBot</strong> will create another client with the prefix <strong>Mimic-</strong> followed by your username.</p>
|
||||
|
||||
<p>In this example it is <em>Mimic-ken1</em>.</p>
|
||||
|
||||
<p>You should hear your audio back.</p>
|
||||
|
||||
<p><img alt="audio pong screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/15-audio-pong.png" ></p>
|
||||
|
||||
<p>If your audio is poor - as is often the case - then this gives you the opportunity to fix it before interrupting other people.</p>
|
||||
|
||||
<p>How you fix it will depend on the operating system that you are using and the exact nature of the problem.</p>
|
||||
|
||||
<p>A common problem is that the operating system uses the built in speaker and microphone from the laptop instead of your headset. A tip would be to press the <strong>Push to talk (PTT)</strong> button and tap the microphone of your head set lightly. If you don't hear the tapping then Mumble is probably getting the wrong microphone as input.</p>
|
||||
|
||||
<p>In the example below I clicked the Microphone icon in my taskbar and a application (<em>pavucontrol</em>) opened allowing me to set the correct microphone.</p>
|
||||
|
||||
<p><img alt="hpr room screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/22-pavucontrol-recording.png" ></p>
|
||||
|
||||
<p>While I was there I also checked to make sure that Mumble was playing audio to my headset.</p>
|
||||
|
||||
<p><img alt="hpr room screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/23-pavucontrol-playback.png" ></p>
|
||||
|
||||
<p>Satisfied that the audio is good, you can <em>click and drag</em> your icon to the <strong>HPR</strong> room.</p>
|
||||
|
||||
<p><img alt="hpr room screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/16-hpr-room.png" ></p>
|
||||
|
||||
<p>Some rooms require you to be registered to enter a room, to speak, to record, or to chat in the room.</p>
|
||||
|
||||
<p>To register first <em>Right Click</em> on your icon and a menu will open.</p>
|
||||
|
||||
<p>Press <strong>Register....</strong></p>
|
||||
|
||||
<p><img alt="register screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/17-register.png" ></p>
|
||||
|
||||
<p>Then press <strong>Yes</strong></p>
|
||||
|
||||
<p><img alt="register confirm screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/18-register-confirm.png" ></p>
|
||||
|
||||
<p>That's it - you are now all set to use mumble.</p>
|
@@ -35,7 +35,7 @@
|
||||
Many of today's <a href="http://wiki.xiph.org/PortablePlayers">portable media players</a> support recording audio out of the box. Search for "Voice Recorder", to see if there is an application for your smartphone. Whichever option you have close to hand, try and set the recording to the best quality format (<a href="http://en.wikipedia.org/wiki/WAV">WAV</a> or <a href="http://en.wikipedia.org/wiki/FLAC">FLAC</a>), and set everything else to the highest setting. 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>
|
||||
Then just record your show, <a href="r<!--% absolute_url(baseurl) %-->equest_a_slot.html">request a slot</a>, and we'll do the rest.
|
||||
Then just record your show, <a href="<!--% absolute_url(baseurl,'request_a_slot.html') %-->">request a slot</a>, and we'll do the rest.
|
||||
</p>
|
||||
|
||||
<h2 id="smart_phone">Recording with a portable media player<a href="#smart_phone">.</a></h2>
|
||||
@@ -55,7 +55,7 @@
|
||||
The majority of podcasters use <a href="http://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 width="600" src="<!--% absolute_url(baseurl) %-->images/contribute-audacity-record.png" alt="Audacity Can Record" title="Audacity Screenshot of Recording" >
|
||||
<img width="600" src="<!--% absolute_url(baseurl,'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>
|
||||
<iframe width="640" height="390" src="//www.youtube.com/embed/ss8CyTwBOPY" style="border: none"></iframe>
|
||||
@@ -70,7 +70,7 @@
|
||||
<li>Set <em>Bit depth</em> to <strong>24</strong>.</li>
|
||||
</ol>
|
||||
<p>
|
||||
<img width="600" src="<!--% absolute_url(baseurl) %-->images/contribute-audacity-export.png" alt="Audacity Export Settings" title="Audacity Screenshot of an Export" >
|
||||
<img width="600" src="<!--% absolute_url(baseurl,'images/contribute-audacity-export.png') %-->" alt="Audacity Export Settings" title="Audacity Screenshot of an Export" >
|
||||
</p>
|
||||
|
||||
<h2 id="phone_interviews">Recording Interviews with the Phone<a href="#phone_interviews">.</a></h2>
|
||||
@@ -83,10 +83,10 @@
|
||||
If you would like to record with multiple participants then you can use <a href="http://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 multiple tracks, one for each participant which you can edit and then submit.
|
||||
<br />
|
||||
Kwisher made a <a href="<!--% absolute_url(baseurl) %-->Mumble-How-To.pdf">Mumble tutorial</a> which you might find useful and Delwin has produced a number of short <a href="<!--% absolute_url(baseurl) %-->correspondents/0228.html">shows</a> on how to configure the audio quality.
|
||||
Kwisher made a <a href="<!--% absolute_url(baseurl,'Mumble-How-To.pdf') %-->">Mumble tutorial</a> which you might find useful and Delwin has produced a number of short <a href="<!--% absolute_url(baseurl,'correspondents/0228.html') %-->">shows</a> on how to configure the audio quality.
|
||||
</p>
|
||||
<p>
|
||||
<img width="600" src="<!--% absolute_url(baseurl) %-->images/contribute-mumble-record.png" alt="Audacity Can Record" title="Audacity Screenshot of Recording" >
|
||||
<img width="600" src="<!--% absolute_url(baseurl,'images/contribute-mumble-record.png') %-->" alt="Audacity Can Record" title="Audacity Screenshot of Recording" >
|
||||
</p>
|
||||
|
||||
<h2 id="background_music">Avoid Bedding/background music<a href="#background_music">.</a></h2>
|
||||
|
@@ -1,16 +1,16 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<h1 id="requesting_slot">Picking a slot for your show</h1>
|
||||
<p>
|
||||
Any host can select any free slot a up to year in advance, by recording their show and uploading it to the desired slot. In exceptional circumstances it may be necessary to reserve a slot while not having the audio available, but this must be approved by the <a href="http://hackerpublicradio.org/mailman/listinfo/hpr_hackerpublicradio.org">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.
|
||||
Any host can select any free slot a up to year in advance, by recording their show and uploading it to the desired slot. In exceptional circumstances it may be necessary to reserve a slot while not having the audio available, but 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. [<a href="http://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2018-February/014260.html">?</a>]
|
||||
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. [<a href="https://lists.hackerpublicradio.com/pipermail/hpr/2018-February/003482.html">?</a>]
|
||||
</p>
|
||||
<p>
|
||||
You can post your show by going to the <a href="http://www.hackerpublicradio.org/calendar.php">Calendar</a> page. Once you have selected a date you will be redirected to the <a href="<!--% absolute_url(baseurl) %-->request.html">request page</a>, where you will be asked to select your show and email address. We will send a link to where you can upload your show to this address and therefore it must be a valid working address that you can access quickly. We intend to use <a href="https://www.gnupg.org/">GPG</a> to speed up the validation of hosts, so you may wish to use an email address that has an associated public key available on public key servers.
|
||||
You can post your show by going to the <a href="<!--% hub_baseurl %-->calendar.php">Calendar</a> page. Once you have selected a date you will be redirected to the <a href="<!--% absolute_url(baseurl,'request.html') %-->">request page</a>, where you will be asked to select your show and email address. We will send a link to where you can upload your show to this address and therefore it must be a valid working address that you can access quickly. We intend to use <a href="https://www.gnupg.org/">GPG</a> to speed up the validation of hosts, so you may wish to use an email address that has an associated public key available on public key servers.
|
||||
</p>
|
||||
<p>
|
||||
The audio of your show will not be moderated, however <em>the information provided in the upload form <strong>may be moderated</strong></em>. All publicly facing material is managed by the HPR Community as a whole, and not just the host providing the show. The show <a href="<!--% absolute_url(baseurl) %-->eps/hpr2210/index.html">hpr2210 :: On Freedom of Speech and Censorship</a> describes the agreed approach to this topic.
|
||||
The audio of your show will not be moderated, however <em>the information provided in the upload form <strong>may be moderated</strong></em>. All publicly facing material is managed by the HPR Community as a whole, and not just the host providing the show. The show <a href="<!--% absolute_url(baseurl,'eps/hpr2210/index.html') %-->">hpr2210 :: On Freedom of Speech and Censorship</a> describes the agreed approach to this topic.
|
||||
</p>
|
||||
<p><strong>Note:</strong> 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. Where we publish it we pad it with dot nospam at-sign nospam dot. <br />
|
||||
i.e. <em>hpr@example.com</em> becomes <em>hpr.nospam@nospam.example.com</em>. If you do not want to have your email exposed, please contact the admin@hpr team to arrange a alias.
|
||||
@@ -52,7 +52,7 @@
|
||||
<li id="Short_Summary"><strong>Summary:</strong> <em>Mandatory</em><br />
|
||||
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 twitter, mastodon etc.</li>
|
||||
<li id="Theme"><strong>Theme:</strong> <em>Automatic</em><br />
|
||||
The <a href="<!--% absolute_url(baseurl) %-->theme.html#intro">Intro</a>, and the <a href="<!--% absolute_url(baseurl) %-->theme.html#outro">Outro</a> will be added automatically. Please do not add it.
|
||||
The <a href="<!--% absolute_url(baseurl,'theme.html#intro') %-->">Intro</a>, and the <a href="<!--% absolute_url(baseurl,'theme.html#outro') %-->">Outro</a> will be added automatically. Please do not add it.
|
||||
</li>
|
||||
<li id="Explicit"><strong>Explicit:</strong> <em>Mandatory</em><br />
|
||||
See <a href="http://www.apple.com/uk/itunes/podcasts/specs.html#submitting">iTunes</a> for more information.</li>
|
||||
@@ -104,7 +104,7 @@
|
||||
</li>
|
||||
|
||||
<li id="series"><strong>Series:</strong> <em>Optional</em><br />
|
||||
Select the <a href="<!--% absolute_url(baseurl) %-->series.html">series</a> if any that your show is a part of.
|
||||
Select the <a href="<!--% absolute_url(baseurl,'series.html') %-->">series</a> if any that your show is a part of.
|
||||
</li>
|
||||
<li id="tags"><strong>Tags:</strong> <em>Optional</em><br />
|
||||
Add a list of comma separated tags. Pick the most important words from the shownotes. These are used to <a href="http://hackerpublicradio.org/tags.php">find shows via the tags page</a>.
|
||||
@@ -134,6 +134,6 @@
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
Press submit and your show will be sent to the HPR Volunteers to be processed. Keep an eye on the <a href="http://www.hackerpublicradio.org/calendar.php">calendar</a> for when it is posted.
|
||||
Press submit 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.
|
||||
Your show information is used to process the media files, on the website, in the RSS feeds, and on social media sites.
|
||||
</p>
|
||||
|
@@ -15,7 +15,7 @@
|
||||
<li>Music Theory</li>
|
||||
<li>Installing a VPN to your home network</li>
|
||||
<li>Init and System.d</li>
|
||||
<li>Episodes for the <a href="<!--% absolute_url(baseurl) %-->series/0007.html">LPI</a>, or the Networking series.</li>
|
||||
<li>Episodes for the <a href="<!--% absolute_url(baseurl,'series/0007.html') %-->">LPI</a>, or the Networking series.</li>
|
||||
<li><a href="http://opensourcemusician.com/index.php/Beginning_Audio_Series_for_HPR_and_OSMP_Release">Beginning Audio Series for HPR and OSMP Release</a></li>
|
||||
<li>Hackintosh computers - what are they, why would you want one.</li>
|
||||
<li>Grub 2.0 introduction and customization.</li>
|
||||
@@ -23,8 +23,8 @@
|
||||
<li>How I Got Into Accessible Computing</li>
|
||||
<li>How to do knitting</li>
|
||||
<li>How to build a house</li>
|
||||
<li>Bitcoin howto <a href="<!--% absolute_url(baseurl) %-->eps/hpr0788/index.html">hpr0788</a></li>
|
||||
<li>How to solder <a href="<!--% absolute_url(baseurl) %-->eps/hpr1037/index.html">hpr1037</a>, <a href="<!--% absolute_url(baseurl) %-->eps/hpr1047/index.html">hpr1047</a></li>
|
||||
<li>Bitcoin howto <a href="<!--% absolute_url(baseurl,'eps/hpr0788/index.html') %-->">hpr0788</a></li>
|
||||
<li>How to solder <a href="<!--% absolute_url(baseurl,'eps/hpr1037/index.html') %-->">hpr1037</a>, <a href="<!--% absolute_url(baseurl,'eps/hpr1047/index.html') %-->">hpr1047</a></li>
|
||||
<li>How to weld</li>
|
||||
<li>How to fix a car</li>
|
||||
<li>Reviews of stream playing software, (for linuxheads who don't want to keep a browser tab open all the time)</li>
|
||||
|
@@ -5,35 +5,41 @@
|
||||
<hr />
|
||||
<h2>Search Show Tags</h2>
|
||||
<p>
|
||||
<a href="http://www.hackerpublicradio.org/tags.php">Complete list of all the Tags</a></p>
|
||||
<a href="https://www.hackerpublicradio.org/tags.html">Complete list of all the Tags</a></p>
|
||||
<hr />
|
||||
<h2>Google</h2>
|
||||
<form name="google-search" method="get" action="http://www.google.com/search">
|
||||
<input type="hidden" name="sitesearch" value="http://www.hackerpublicradio.org/" />
|
||||
<input name="q" type="text" />
|
||||
<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="http://www.google.com/policies/privacy/">privacy policy</a>
|
||||
<a href="https://www.google.com/policies/privacy/">privacy policy</a>
|
||||
</p>
|
||||
<hr />
|
||||
<h2>DuckDuckGo</h2>
|
||||
<p>
|
||||
<iframe src="http://duckduckgo.com/search.html?site=www.hackerpublicradio.org&prefill=Search DuckDuckGo" style="overflow:hidden;margin:0;padding:0;width:408px;height:40px;" frameborder="0"></iframe>
|
||||
<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>
|
||||
<a href="httpss://duckduckgo.com/privacy">privacy policy</a>
|
||||
</p>
|
||||
<hr />
|
||||
<h2>Bing</h2>
|
||||
<p>
|
||||
<form method="get" action="http://www.bing.com/search">
|
||||
<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" />
|
||||
<input type="submit" value="Search with Bing" />
|
||||
<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="http://www.microsoft.com/privacystatement/en-us/bing/default.aspx">privacy policy</a>
|
||||
<a href="https://www.microsoft.com/privacystatement/en-us/bing/default.aspx">privacy policy</a>
|
||||
</p>
|
||||
</article>
|
||||
|
@@ -1,28 +1,16 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% PROCESS "queries-series-${constants.database}.tpl.html" %-->
|
||||
<article>
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<h1 class="title">In-Depth Series</h1>
|
||||
<!--% FOREACH series IN DBI.query(
|
||||
'SELECT miniseries.id, miniseries.name, miniseries.description,
|
||||
miniseries.private, miniseries.image, miniseries.valid,
|
||||
ep.number_of_episodes, ep.latest_show, ep.earliest_show
|
||||
FROM miniseries
|
||||
INNER JOIN
|
||||
(SELECT series,
|
||||
COUNT(eps.id) AS number_of_episodes,
|
||||
MAX(eps.date) AS latest_show,
|
||||
MIN(eps.date) AS earliest_show
|
||||
FROM eps
|
||||
GROUP BY series) AS ep ON ep.series = miniseries.id
|
||||
ORDER BY name'
|
||||
) %-->
|
||||
<h2><a href="series/<!--% zero_pad_left(series.id) %-->.html"><!--% series.name %--></a></h2>
|
||||
<!--% 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="hpr_ogg_rss.php?series=38">ogg</a>, <a href="hpr_spx_rss.php?series=38">spx</a>, <a href="hpr_mp3_rss.php?series=38">mp3</a></li>
|
||||
<li>Series RSS feeds: <a href="https://www.hackerpublicradio.org/hpr_ogg_rss.php?series=<!--% series.id %-->">ogg</a>, <a href="https://www.hackerpublicradio.org/hpr_spx_rss.php?series=<!--% series.id %-->">spx</a>, <a href="https://www.hackerpublicradio.org/hpr_mp3_rss.php?series=<!--% series.id %-->">mp3</a></li>
|
||||
</ul>
|
||||
<em><!--% series.description %--></em>
|
||||
<!--% END %-->
|
||||
|
@@ -1,20 +1,8 @@
|
||||
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-avatar.tpl.html' %-->
|
||||
<!--% PROCESS "queries-series_episodes-${constants.database}.tpl.html" %-->
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% query_series = DBI.prepare('SELECT miniseries.id, miniseries.name,
|
||||
miniseries.description,
|
||||
miniseries.private, miniseries.image, miniseries.valid,
|
||||
ep.number_of_episodes, ep.latest_show, ep.earliest_show
|
||||
FROM miniseries
|
||||
INNER JOIN
|
||||
(SELECT series,
|
||||
COUNT(eps.id) AS number_of_episodes,
|
||||
MAX(eps.date) AS latest_show,
|
||||
MIN(eps.date) AS earliest_show
|
||||
FROM eps
|
||||
GROUP BY series) AS ep ON ep.series = miniseries.id
|
||||
WHERE miniseries.id = ?
|
||||
ORDER BY name')
|
||||
<!--% query_series = DBI.prepare(query_series_sql)
|
||||
%-->
|
||||
<!--% series_result = query_series.execute(id) %-->
|
||||
<article>
|
||||
@@ -25,24 +13,15 @@
|
||||
<li>Open/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="hpr_ogg_rss.php?series=79&full=1&gomax=1">ogg</a>, <a href="hpr_spx_rss.php?series=79&full=1&gomax=1">spx</a>, <a href="hpr_mp3_rss.php?series=79&full=1&gomax=1">mp3</a></li>
|
||||
<li>Series RSS feeds: <a href="https://www.hackerpublicradio.org/hpr_ogg_rss.php?series=<!--% series.id %-->&full=1&gomax=1">ogg</a>, <a href="https://www.hackerpublicradio.org/hpr_spx_rss.php?series=<!--% series.id %-->&full=1&gomax=1">spx</a>, <a href="https://www.hackerpublicradio.org/hpr_mp3_rss.php?series=<!--% series.id %-->&full=1&gomax=1">mp3</a></li>
|
||||
</ul>
|
||||
<div><em><!--% series.description %--></em></div>
|
||||
<!--% END %-->
|
||||
<!--% query_shows = DBI.prepare('SELECT
|
||||
id, date, title,
|
||||
duration, summary, notes,
|
||||
explicit, eps.license, tags,
|
||||
hosts.host, hosts.hostid
|
||||
FROM eps
|
||||
INNER JOIN hosts
|
||||
ON eps.hostid = hosts.hostid
|
||||
WHERE series = ?
|
||||
ORDER BY date DESC
|
||||
')
|
||||
<!--% query_shows = DBI.prepare(query_shows_sql)
|
||||
%-->
|
||||
<!--% show_results = query_shows.execute(id) %-->
|
||||
<!--% FOREACH show IN show_results %-->
|
||||
<!--% show_summary(show) %-->
|
||||
<p class="listen-in"><!--% display_listen_in(show.id) %--></p>
|
||||
<!--% END %-->
|
||||
</article>
|
||||
|
@@ -1,7 +1,7 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<h1>Sitemap</h1>
|
||||
<ul>
|
||||
<li><a href="https://www.hackerpublicradio/calendar.php"><strong>⇧Upload⇧</strong></a> ← Upload Your Show</li>
|
||||
<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>
|
||||
@@ -11,7 +11,6 @@
|
||||
</ul>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->contribute.html">Give Shows</a> ← Upload your podcast show here.</li>
|
||||
<ul>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html">Info</a> ← Stuff you need to know before uploading a show.</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->theme.html">Theme</a> ← Information about HPR Theme Music.</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->requested_topics.html">Topics</a> ← Requested topics.</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->recording.html">Recording</a> ← How to record a podcast.</li>
|
||||
@@ -27,7 +26,7 @@
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->correspondents/index.html">Hosts</a> ← A list of all our Hosts.</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->contact.html">Contact</a> ← How to get in touch with us.</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->promote.html">Promote HPR</a> ← Ways you can spread the word.</li>
|
||||
<li><a href="https://www.hackerpublicradio.org/comments_viewer.php">Show Comments</a> ← Read the latest comments left on shows.</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->comments_viewer.html">Show Comments</a> ← Read the latest comments left on shows.</li>
|
||||
</ul>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->search.html">Search</a> ← Search HPR</li>
|
||||
</ul>
|
||||
|
@@ -1,162 +0,0 @@
|
||||
<h1 id="agreement">Stuff you need to know<a href="#agreement">.</a></h1>
|
||||
<p>
|
||||
This is some important information that you will need to know before uploading to HPR.
|
||||
</p>
|
||||
|
||||
<h2 id="wikipedia">You will no longer be allowed to edit HPR pages on Wikipedia<a href="#wikipedia">.</a></h2>
|
||||
<p>
|
||||
Once you upload a show, you will no longer be allowed to edit pages relating to <a href="https://en.wikipedia.org/wiki/Hacker_Public_Radio">Hacker Public Radio</a> in <a href="https://en.wikipedia.org/wiki/Wikipedia:FAQ/Organizations">Wikipedia</a>.
|
||||
</p>
|
||||
|
||||
<h2 id="mailinglist">All policy decisions are made by the HPR Community<a href="#mailinglist">.</a></h2>
|
||||
<p>
|
||||
The community decides the HPR policies.
|
||||
Please join the <a href="https://hackerpublicradio.org/mailman/listinfo/hpr_hackerpublicradio.org">HPR Mailing List</a> to participate.
|
||||
</p>
|
||||
|
||||
<h2 id="no_shows_no_hpr">HPR will stop as a project if there are not enough shows<a href="#no_shows_no_hpr">.</a></h2>
|
||||
<p>
|
||||
Hacker Public Radio is dedicated to sharing knowledge.
|
||||
We release about 260 shows a year, which is probably more than all of the other FOSS podcasts put together.
|
||||
If you listen to HPR, then we would love you to <a target="_blank" href="<!--% absolute_path(baseurl) %-->contribute.html">contribute</a> one show a year.
|
||||
Remember once that all the emergency shows have been used up and there are no more shows in the queue, HPR as a project will stop.
|
||||
|
||||
</p>
|
||||
<h2 id="patrons">Support our Patrons<a href="#patrons">.</a></h2>
|
||||
<p>
|
||||
Our hosting is kindly provided to us by <a href="<!--% absolute_path(baseurl) %-->correspondents/0174.html">Josh Knapp</a> from <a href="https://anhonesthost.com/hosting/shared-hosting">AnHonestHost.com</a>, and The Internet Archive at <a href="https://archive.org/donate/">Archive.org</a>.
|
||||
We encourage you to support our Patrons.
|
||||
Over the years kind people have donated services and supported equipment for our conferences.
|
||||
|
||||
</p>
|
||||
<h2 id="syndication">We do not syndicate non HPR Shows<a href="#syndication">.</a></h2>
|
||||
<p>
|
||||
HPR is founded on the principle of Hackers sharing knowledge.
|
||||
For this reason we are only releasing material created exclusively for HPR.
|
||||
We will continue to promote new podcasts and other creative commons material, but if you wish to have your show promoted, then please contact our sister site <a href="https://freeculturepodcasts.org/">Free Culture Podcasts</a>.
|
||||
</p>
|
||||
<p>
|
||||
That said, if there is a piece of creative commons content that you would like to promote, then feel free to record a regular show.
|
||||
There you can introduce the content and explain why it is important, providing links to where we can get more information etc., and then include one example episode.
|
||||
</p>
|
||||
|
||||
<h2 id="license">You are agreeing to license your show CC-BY-SA<a href="#license">.</a></h2>
|
||||
<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.
|
||||
Click the <a href="https://creativecommons.org/licenses/by-sa/4.0/">link</a> for more information.
|
||||
</p>
|
||||
|
||||
<h2 id="permission">You have permission to redistribute your show in its entirety<a href="#permission">.</a></h2>
|
||||
<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 other copyrighted content, even if it is made available under fair use, or by arranged permission.
|
||||
</p>
|
||||
|
||||
<h2 id="not_moderated">The audio of your show will not be moderated<a href="#not_moderated">.</a></h2>
|
||||
<p>
|
||||
We do not vet, edit, moderate or in any way censor any of the audio you submit, we trust you to do that.
|
||||
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.
|
||||
<br />
|
||||
We <strong>do</strong> transcode the audio into different formats.
|
||||
</p>
|
||||
<p>
|
||||
Please note that this only relates to the audio you upload.
|
||||
The rest of the meta-data (branding/summaries/tags/show notes/etc.), are managed by the HPR Community, and <strong>may</strong> be edited.
|
||||
The show <a href="<!--% absolute_path(baseurl) %-->eps/hpr2210/index.html">hpr2210 :: On Freedom of Speech and Censorship</a> describes the agreed approach to this topic.
|
||||
</p>
|
||||
|
||||
</p>
|
||||
|
||||
<h2 id="explicit">Your show will be signaled as containing explicit content<a href="#explicit">.</a></h2>
|
||||
<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 that 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 short warning at the very beginning of the show before the intro, to allow listeners time to switch off the episode should they so desire.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/hpr2210/index.html">hpr2210 :: On Freedom of Speech and Censorship</a> describes the agreed approach to this topic.
|
||||
</p>
|
||||
|
||||
<h2 id="schedule">You determine when your show will be released<a href="#schedule">.</a></h2>
|
||||
<p>
|
||||
The HPR Schedule is entirely community driven and we recommend that <strong>you</strong> pick the date or show number as then you know when your show will be released.
|
||||
However 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.
|
||||
Once the slots have been allocated it is not possible to move them.
|
||||
</p>
|
||||
|
||||
<h2 id="reserving">All reservations need to be approved<a href="#reserving">.</a></h2>
|
||||
<p>
|
||||
Any host can select any free slot a up to year in advance, by recording their show and uploading it to the desired slot.
|
||||
In exceptional circumstances it may be necessary to reserve a slot while not having the audio available, but this must be approved by the <a href="https://hackerpublicradio.org/mailman/listinfo/hpr_hackerpublicradio.org">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.
|
||||
<br />
|
||||
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:
|
||||
<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>
|
||||
<li>The days following new year.</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<h2 id="utf8">We use UTF-8 end to end<a href="#utf8">.</a></h2>
|
||||
<blockquote>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>.
|
||||
</blockquote>
|
||||
|
||||
<h2 id="accessibility">Keep accessibility in mind<a href="#accessibility">.</a></h2>
|
||||
<p>
|
||||
When you includes 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 <pre> tags)
|
||||
<br />
|
||||
Include descriptive language in any link texts.
|
||||
<br />
|
||||
Avoid structures like: <em>"For accessibility information click <a href="#accessibility">here</a>"</em><br />
|
||||
Rather use: <em>"For more information click our <a href="#accessibility">accessibility page</a>"</em><br />
|
||||
</p>
|
||||
|
||||
<h2 id="international">Your show will be heard by an International Audience<a href="#international">.</a></h2>
|
||||
<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>.
|
||||
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="../images/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>
|
||||
|
||||
<h2 id="emergency_queue">Feed the emergency queue<a href="#emergency_queue">.</a></h2>
|
||||
<p>
|
||||
The emergency queue is intended only to be used in the cases where there is still a gap in the schedule 24 hours prior to release.
|
||||
The shows will by their very nature need to be "timeless".
|
||||
That means your topic should still be relevant in four years or more.
|
||||
People will be able to hear the show on the website but they will not be included in any feeds until release.
|
||||
</p>
|
||||
<p>
|
||||
Please begin all shows with text similar to:
|
||||
<br />
|
||||
<em>
|
||||
"This is an emergency show, if you are hearing this then HPR needs shows ASAP.
|
||||
Please consider contributing a show.
|
||||
Email admin at hacker public radio dot org for more information."
|
||||
</em>
|
||||
</p>
|
||||
<p>
|
||||
We expect that we need at least 10 shows in the emergency queue in order to give people enough time to record and submit shows.
|
||||
Please contact admin at hpr if you want to submit an emergency show.
|
||||
</p>
|
@@ -1,3 +1,51 @@
|
||||
<h1>RSS Syndication</h1>
|
||||
<p><small><em><a href="http://hackerpublicradio.org/advanced_rss_settings.php">Advanced Settings</a>.</em></small></p>
|
||||
|
||||
<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>
|
||||
</article>
|
||||
<article>
|
||||
<header>
|
||||
<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>
|
||||
<ul>
|
||||
<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.
|
||||
</p>
|
||||
</article>
|
||||
<article>
|
||||
<header>
|
||||
<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="hpr_ogg_rss.php">ogg</a> Larger file size higher quality feed.</li>
|
||||
<li><a href="hpr_rss.php">mp3</a> Larger file size regular quality feed in a common format.</li>
|
||||
<li><a href="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.
|
||||
</p>
|
||||
</article>
|
||||
<article>
|
||||
<header>
|
||||
<h2><img src="<!--% absolute_path(baseurl) %-->images/feed.png" alt="rss logo"> Entire Archive Audio feed</h2>
|
||||
@@ -6,9 +54,9 @@
|
||||
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_ogg.rss">ogg feed</a> Warning over 50G</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->hpr_total_spx.rss">spx feed</a> Warning over 22G</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->hpr_total_mp3.rss">mp3 feed</a> Warning over 36G</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>
|
||||
@@ -19,7 +67,7 @@
|
||||
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.
|
||||
</p>
|
||||
<ul>
|
||||
<li><a href="rss-future.php">Shows as they are posted.</a> OGG Only</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->rss-future.php">Shows as they are posted.</a> OGG Only</li>
|
||||
</ul>
|
||||
</article>
|
||||
<article>
|
||||
@@ -27,6 +75,83 @@
|
||||
<h2><img src="<!--% absolute_path(baseurl) %-->images/feed.png" alt="rss logo"> Comment feed</h2>
|
||||
</header>
|
||||
<ul>
|
||||
<li><a href="http://www.hackerpublicradio.org/comments_rss.php">Listener contributed comments to the episodes</a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->comments.rss">Listener contributed comments to the episodes</a></li>
|
||||
</ul>
|
||||
</article>
|
||||
<article>
|
||||
<header>
|
||||
<h2>Site Replication Sources</h2>
|
||||
</header>
|
||||
<ul>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->hpr.sql">Daily Database Dump in SQL Format</a></li>
|
||||
<ul>
|
||||
</article>
|
||||
<article>
|
||||
<header>
|
||||
<h2>External Sources</h2>
|
||||
</header>
|
||||
<ul>
|
||||
<li><a href="https://archive.org/details/hackerpublicradio">Archive.org</a></li>
|
||||
<li><a href="https://itunes.apple.com/us/podcast/hacker-public-radio/id281699640?mt=2">iTunes</a></li>
|
||||
<li><a href="https://podcasts.google.com/feed/aHR0cDovL2hhY2tlcnB1YmxpY3JhZGlvLm9yZy9ocHJfcnNzLnBocA">Google Podcasts</a></li>
|
||||
<li><a href="https://player.fm/series/hacker-public-radio">PlayerFM</a></li>
|
||||
<li><a href="https://open.spotify.com/show/7e2hYcnHj9vKgUzsIOf4r3">Spotify</a></li>
|
||||
<li><a href="https://www.mixcloud.com/hackerpublicradio/">MixCloud</a></li>
|
||||
<ul>
|
||||
</article>
|
||||
|
||||
<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="<!--% 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 />
|
||||
<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>
|
||||
|
85
templates/content-tags.tpl.html
Normal file
@@ -0,0 +1,85 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% PROCESS "queries-tags-${constants.database}.tpl.html" %-->
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% PERL %-->
|
||||
$Template::Stash::PRIVATE = undef; # Allow . in tag
|
||||
<!--% END %-->
|
||||
<!--% 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.split(comma_re);
|
||||
NEXT UNLESS tag_str;
|
||||
NEXT IF tag_str == '';
|
||||
tag = tag_str.lower;
|
||||
first_char = tag.substr(0,1);
|
||||
IF first_char == '.';
|
||||
first_char = '.'; # Unicode .
|
||||
END;
|
||||
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}.count = 1;
|
||||
uniq_tag_count = uniq_tag_count + 1;
|
||||
all_tags.${first_char}.${tag}.urls = [ep_id];
|
||||
END;
|
||||
END;
|
||||
END %-->
|
||||
<!--% USE date %-->
|
||||
<!--% all_first = ['#','.','/','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'] %-->
|
||||
|
||||
<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 class="columns3">
|
||||
<!--% FOREACH first_char IN all_first %-->
|
||||
<!--% IF all_tags.${first_char} %-->
|
||||
<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>
|
||||
<!--% FOREACH first_char IN all_first %-->
|
||||
<!--% IF all_tags.${first_char} %-->
|
||||
<p class="ralign"><a href="<!--% absolute_path(baseurl) %-->tags.html#TOP">↑ Go to index</a></p>
|
||||
<h3>Tags beginning with '<!--% first_char %-->'</h3>
|
||||
<ul>
|
||||
<!--% FOREACH tag IN all_tags.${first_char}.keys.sort %-->
|
||||
<li>
|
||||
<a id="<!--% tag %-->"><strong><!--% tag %--></strong></a>:
|
||||
<!--% ep_links = [] %-->
|
||||
<!--% 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>');
|
||||
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 %-->
|
@@ -26,7 +26,7 @@
|
||||
<li>
|
||||
<h3 id="outro">HPR Outro Music </h3>
|
||||
<p>
|
||||
This can be added is automatically added after you upload your show.
|
||||
This is automatically added after you upload your show.
|
||||
</p>
|
||||
</li>
|
||||
</ol>
|
||||
|
71
templates/content-twat_episode.tpl.html
Normal file
@@ -0,0 +1,71 @@
|
||||
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-avatar.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-listen-now.tpl.html' %-->
|
||||
<!--% 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 twat_eps AS eps
|
||||
),
|
||||
episode_date AS (
|
||||
SELECT eps.date
|
||||
FROM twat_eps AS eps
|
||||
WHERE eps.id = ?
|
||||
),
|
||||
episode_previous AS (
|
||||
SELECT MAX(id) AS \'previous\', ? AS \'id\'
|
||||
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 twat_eps AS eps
|
||||
INNER JOIN episode_date
|
||||
ON eps.date > episode_date.date
|
||||
)
|
||||
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\'
|
||||
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
|
||||
INNER JOIN episode_previous ON eps.id = episode_previous.id
|
||||
INNER JOIN episode_next ON eps.id = episode_next.id
|
||||
WHERE eps.id = ?
|
||||
')
|
||||
%-->
|
||||
<!--% episode_result = query_episodes.execute(id, id, id, id, id) %-->
|
||||
<!--% FOREACH episode IN episode_result %-->
|
||||
<!--% episode_navigation = step_navigation(baseurl,episode,"twat") %-->
|
||||
<article>
|
||||
<header>
|
||||
<h1><!--% episode.id %--> :: <!--% episode.title %--></h1>
|
||||
<h3><!--% episode.summary %--></h3>
|
||||
<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><!--% 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, "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>
|
||||
</header>
|
||||
<div><!--% episode.notes %--></div>
|
||||
<footer>
|
||||
<p>
|
||||
<!--% episode_navigation %-->
|
||||
</p>
|
||||
</footer></article>
|
||||
<!--% END %-->
|
||||
|
@@ -1,8 +1,6 @@
|
||||
<!--% PROCESS "queries-ids-episode-${constants.database}.tpl.html" %-->
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% FOREACH episode IN DBI.query(
|
||||
'select eps.id from eps
|
||||
where eps.date < date (\'now\', \'+1 days\') '
|
||||
) %-->
|
||||
<!--% FOREACH episode IN DBI.query(query_ids_episode) %-->
|
||||
,<!--% episode.id %-->
|
||||
<!--% END %-->
|
||||
|
||||
|
7
templates/ids-twat_episode.tpl.html
Normal 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 %-->
|
||||
|
@@ -1,10 +1,10 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<ul>
|
||||
<li><a href="https://www.hackerpublicradio.org/calendar.php"><strong>⇧Upload⇧</strong></a></li>
|
||||
<li><a href="<!--% hub_baseurl %-->calendar.php"><strong>⇧Upload⇧</strong></a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->index.html"><strong>Home</a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->about.html">About »</strong></a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->correspondents/index.html">Hosts</a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->contact.html">Contact</a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->promote.html">Promote HPR</a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->comments_viewer.php">Show Comments</a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->comments_viewer.html">Show Comments</a></li>
|
||||
</ul>
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<ul>
|
||||
<li><a href="https://www.hackerpublicradio.org/calendar.php"><strong>⇧Upload⇧</strong></a></li>
|
||||
<li><a href="<!--% hub_baseurl %-->"><strong>⇧Upload⇧</strong></a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->index.html"><strong>Home</a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->help_out.html">Contribute »</strong></a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->contribute.html">Submit Show</a></li>
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<ul>
|
||||
<li><a href="https://www.hackerpublicradio.org/calendar.php"><strong>⇧Upload⇧</strong></a></li>
|
||||
<li><a href="<!--% hub_baseurl %-->"><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"><strong>Get Shows »</strong></a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->eps/index.html">Full Episode Guide</a></li>
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<ul>
|
||||
<li><a href="https://www.hackerpublicradio.org/calendar.php"><strong>⇧Upload⇧</strong></a></li>
|
||||
<li><a href="<!--% hub_baseurl %-->"><strong>⇧Upload⇧</strong></a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->index.html"><strong>Home</a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->contribute.html">Give Shows »</strong></a>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html">Info</a></li>
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<ul>
|
||||
<li><a href="https://www.hackerpublicradio.org/calendar.php"><strong>⇧Upload⇧</strong></a></li>
|
||||
<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_path(baseurl) %-->contribute.html">Give Shows</a></li>
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% USE date %-->
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="en">
|
||||
<head>
|
||||
@@ -8,8 +9,10 @@
|
||||
<!--% END %-->
|
||||
<meta charset="utf-8" />
|
||||
<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="Hacker Public Radio is an podcast that releases shows every weekday Monday through Friday. Our shows are produced by the community (you) and can be on any topic that are of interest to 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 {
|
||||
@@ -20,11 +23,11 @@
|
||||
}
|
||||
</style>
|
||||
<link rel="shortcut icon" href="hpr.ico" >
|
||||
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Ogg Vorbis RSS" href="<!--% absolute_path(baseurl) %-->hpr_ogg.rss" />
|
||||
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Speex RSS" href="<!--% absolute_path(baseurl) %-->hpr_spx.rss" />
|
||||
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio MP3 RSS" href="<!--% absolute_path(baseurl) %-->hpr_mp3.rss" />
|
||||
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Comments RSS" href="/comments_rss.php" />
|
||||
<link rel="license" title="cc by 3.0" href="https://creativecommons.org/licenses/by-sa/3.0/" />
|
||||
<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="<!--% absolute_path(baseurl) %-->css/hpr.css" rel="stylesheet" />
|
||||
<!--[if IE]>
|
||||
<link rel="stylesheet" href="<!--% absolute_path(baseurl) %-->css/hpr.css" media="screen" type="text/css" />
|
||||
@@ -42,9 +45,15 @@
|
||||
<a href="<!--% absolute_path(baseurl) %-->sitemap.html">Site Map</a>
|
||||
- <a href="#maincontent">skip to main content</a>
|
||||
</p>
|
||||
<h1 id="sitename">Hacker <a href="https://www.hackerpublicradio.org/comments_viewer.php">P</a>ublic <a href="<!--% absolute_path(baseurl) %-->syndication.html">R</a>adio</h1>
|
||||
<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
|
||||
</h1>
|
||||
<h2>Your ideas, projects, opinions - podcasted.</h2>
|
||||
<h3>New episodes Monday through Friday.</h3>
|
||||
<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>
|
||||
<hr />
|
||||
|
||||
@@ -72,7 +81,10 @@
|
||||
<nav class="column">
|
||||
<h2>Social</h2>
|
||||
<ul>
|
||||
<li><a href="http://hackerpublicradio.org/mailman/listinfo/hpr_hackerpublicradio.org" target="_blank">Maillist</a></li>
|
||||
<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://twitter.com/HPR">Twitter.com</a></li>
|
||||
<li><a href="https://plus.google.com/u/0/s/hacker%20public%20radio" target="_blank">Google+</a></li>
|
||||
@@ -117,8 +129,8 @@
|
||||
<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 Creative Commons <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/">
|
||||
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)</a> license.</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="http://creativecommons.org/publicdomain/mark/1.0/">Public Domain</a>.
|
||||
</p>
|
||||
|
6
templates/queries-call_for_shows-mysql.tpl.html
Normal 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)
|
||||
'
|
||||
%-->
|
6
templates/queries-call_for_shows-sqlite.tpl.html
Normal 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 > date(\'now\') AND eps.date <= date(\'now\', \'+10 days\')
|
||||
'
|
||||
%-->
|
18
templates/queries-correspondent-mysql.tpl.html
Normal file
@@ -0,0 +1,18 @@
|
||||
<!--% query_hpr_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,
|
||||
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
|
||||
'
|
||||
%-->
|
18
templates/queries-correspondent-sqlite.tpl.html
Normal file
@@ -0,0 +1,18 @@
|
||||
<!--% query_hpr_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,
|
||||
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
|
||||
'
|
||||
%-->
|
51
templates/queries-episode-mysql.tpl.html
Normal 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 = ?
|
||||
'
|
||||
%-->
|
51
templates/queries-episode-sqlite.tpl.html
Normal 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 <= date(\'now\')
|
||||
),
|
||||
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 <= 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 = ?
|
||||
'
|
||||
%-->
|
15
templates/queries-episodes-mysql.tpl.html
Normal 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'
|
||||
%-->
|
||||
|
15
templates/queries-episodes-sqlite.tpl.html
Normal 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 <= date(\'now\')
|
||||
ORDER BY eps.id + 0 DESC'
|
||||
%-->
|
||||
|
2
templates/queries-ids-episode-mysql.tpl.html
Normal file
@@ -0,0 +1,2 @@
|
||||
<!--% query_ids_episode = 'select eps.id from eps order by eps.id' %-->
|
||||
|
2
templates/queries-ids-episode-sqlite.tpl.html
Normal file
@@ -0,0 +1,2 @@
|
||||
<!--% query_ids_episode = 'select eps.id from eps order by eps.id' %-->
|
||||
|
62
templates/queries-index-mysql.tpl.html
Normal file
@@ -0,0 +1,62 @@
|
||||
<!--% query_next_available_episode = '
|
||||
WITH next_id AS (
|
||||
SELECT id, id + 1 AS \'id_next\', date as \'last_date\'
|
||||
FROM eps
|
||||
WHERE eps.date > NOW()
|
||||
)
|
||||
SELECT
|
||||
MIN(next_id.id_next) AS \'next_id\',
|
||||
DATE_FORMAT(DATE_ADD(MIN(last_date), INTERVAL 1 DAY), \'%Y\') AS \'last_year\',
|
||||
DATE_FORMAT(DATE_ADD(MIN(last_date), INTERVAL 1 DAY), \'%d\') AS \'last_day\',
|
||||
DATE_FORMAT(DATE_ADD(MIN(last_date), INTERVAL 1 DAY), \'%m\') AS \'last_month\'
|
||||
FROM next_id
|
||||
LEFT JOIN eps ON next_id.id_next = eps.id
|
||||
WHERE eps.id IS NULL
|
||||
'
|
||||
%-->
|
||||
<!--% 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,
|
||||
CASE eps.explicit WHEN 1 THEN \'Explicit\' ELSE \'Clean\' END AS 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
|
||||
'
|
||||
%-->
|
||||
|
62
templates/queries-index-sqlite.tpl.html
Normal file
@@ -0,0 +1,62 @@
|
||||
<!--% query_next_available_episode = '
|
||||
WITH next_id AS (
|
||||
SELECT id, id + 1 AS \'id_next\', date as \'last_date\'
|
||||
FROM eps
|
||||
WHERE eps.date > date(\'now\')
|
||||
)
|
||||
SELECT
|
||||
MIN(next_id.id_next) AS \'next_id\',
|
||||
strftime(\'%Y\', DATE (MIN (last_date), \'+1 Days\')) AS \'last_year\',
|
||||
strftime(\'%d\', DATE (MIN (last_date), \'+1 Days\')) AS \'last_day\',
|
||||
strftime(\'%m\', DATE (MIN (last_date), \'+1 Days\')) AS \'last_month\'
|
||||
FROM next_id
|
||||
LEFT JOIN eps ON next_id.id_next = eps.id
|
||||
WHERE eps.id IS NULL
|
||||
'
|
||||
%-->
|
||||
<!--% 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 <= date(\'now\')
|
||||
ORDER BY eps.id + 0 DESC
|
||||
LIMIT 10
|
||||
'
|
||||
%-->
|
||||
<!--% query_last_5_weeks_episodes = '
|
||||
SELECT
|
||||
eps.id,
|
||||
CASE eps.explicit WHEN 1 THEN \'Explicit\' ELSE \'Clean\' END AS 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 <= date(\'now\')
|
||||
ORDER BY eps.id + 0 DESC
|
||||
LIMIT 30 OFFSET 10
|
||||
'
|
||||
%-->
|
||||
|
15
templates/queries-series-mysql.tpl.html
Normal file
@@ -0,0 +1,15 @@
|
||||
<!--% query_episodes = 'SELECT miniseries.id, miniseries.name, miniseries.description,
|
||||
miniseries.private, miniseries.image, miniseries.valid,
|
||||
ep.number_of_episodes, ep.latest_show, ep.earliest_show
|
||||
FROM miniseries
|
||||
INNER JOIN
|
||||
(SELECT series,
|
||||
COUNT(eps.id) AS number_of_episodes,
|
||||
MAX(eps.date) AS latest_show,
|
||||
MIN(eps.date) AS earliest_show
|
||||
FROM eps
|
||||
WHERE eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
|
||||
GROUP BY series) AS ep ON ep.series = miniseries.id
|
||||
ORDER BY name'
|
||||
%-->
|
||||
|
15
templates/queries-series-sqlite.tpl.html
Normal file
@@ -0,0 +1,15 @@
|
||||
<!--% query_episodes = 'SELECT miniseries.id, miniseries.name, miniseries.description,
|
||||
miniseries.private, miniseries.image, miniseries.valid,
|
||||
ep.number_of_episodes, ep.latest_show, ep.earliest_show
|
||||
FROM miniseries
|
||||
INNER JOIN
|
||||
(SELECT series,
|
||||
COUNT(eps.id) AS number_of_episodes,
|
||||
MAX(eps.date) AS latest_show,
|
||||
MIN(eps.date) AS earliest_show
|
||||
FROM eps
|
||||
WHERE eps.date < date(\'now\', \'+1 days\')
|
||||
GROUP BY series) AS ep ON ep.series = miniseries.id
|
||||
ORDER BY name'
|
||||
%-->
|
||||
|
29
templates/queries-series_episodes-mysql.tpl.html
Normal file
@@ -0,0 +1,29 @@
|
||||
<!--% query_series_sql = 'SELECT miniseries.id, miniseries.name,
|
||||
miniseries.description,
|
||||
miniseries.private, miniseries.image, miniseries.valid,
|
||||
ep.number_of_episodes, ep.latest_show, ep.earliest_show
|
||||
FROM miniseries
|
||||
INNER JOIN
|
||||
(SELECT series,
|
||||
COUNT(eps.id) AS number_of_episodes,
|
||||
MAX(eps.date) AS latest_show,
|
||||
MIN(eps.date) AS earliest_show
|
||||
FROM eps
|
||||
WHERE eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
|
||||
GROUP BY series) AS ep ON ep.series = miniseries.id
|
||||
WHERE miniseries.id = ?
|
||||
ORDER BY name'
|
||||
%-->
|
||||
<!--% query_shows_sql = 'SELECT
|
||||
id, date, title,
|
||||
duration, summary, notes,
|
||||
explicit, eps.license, tags,
|
||||
hosts.host, hosts.hostid
|
||||
FROM eps
|
||||
INNER JOIN hosts
|
||||
ON eps.hostid = hosts.hostid
|
||||
WHERE series = ? AND eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
|
||||
ORDER BY eps.id DESC
|
||||
'
|
||||
%-->
|
||||
|
28
templates/queries-series_episodes-sqlite.tpl.html
Normal file
@@ -0,0 +1,28 @@
|
||||
<!--% query_series_sql = 'SELECT miniseries.id, miniseries.name,
|
||||
miniseries.description,
|
||||
miniseries.private, miniseries.image, miniseries.valid,
|
||||
ep.number_of_episodes, ep.latest_show, ep.earliest_show
|
||||
FROM miniseries
|
||||
INNER JOIN
|
||||
(SELECT series,
|
||||
COUNT(eps.id) AS number_of_episodes,
|
||||
MAX(eps.date) AS latest_show,
|
||||
MIN(eps.date) AS earliest_show
|
||||
FROM eps
|
||||
WHERE eps.date < date(\'now\', \'+1 days\')
|
||||
GROUP BY series) AS ep ON ep.series = miniseries.id
|
||||
WHERE miniseries.id = ?
|
||||
ORDER BY name'
|
||||
%-->
|
||||
<!--% query_shows_sql = 'SELECT
|
||||
id, date, title,
|
||||
duration, summary, notes,
|
||||
explicit, eps.license, tags,
|
||||
hosts.host, hosts.hostid
|
||||
FROM eps
|
||||
INNER JOIN hosts
|
||||
ON eps.hostid = hosts.hostid
|
||||
WHERE series = ? AND eps.date < date(\'now\', \'+1 days\')
|
||||
ORDER BY eps.id DESC
|
||||
'
|
||||
%-->
|
1
templates/queries-tags-mysql.tpl.html
Normal file
@@ -0,0 +1 @@
|
||||
<!--% query_tags = 'SELECT id, tags FROM eps' %-->
|
1
templates/queries-tags-sqlite.tpl.html
Normal file
@@ -0,0 +1 @@
|
||||
<!--% query_tags = 'SELECT id, tags FROM eps' %-->
|
64
templates/rss-comments.tpl.xml
Normal file
@@ -0,0 +1,64 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" >
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
|
||||
<!--% USE date %-->
|
||||
<channel>
|
||||
<title>Hacker Public Radio ~ Comment Feed</title>
|
||||
<link><!--% baseurl %-->about.html</link>
|
||||
<description>Comments Feed: Hacker Public Radio is a podcast that releases shows every weekday Monday through Friday. Our shows are produced by the community (you) and can be on any topic that is of interest to hackers and hobbyists.</description>
|
||||
<language>en-us</language>
|
||||
<copyright>Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) License</copyright>
|
||||
<managingEditor>feedback.nospam@nospam.hackerpublicradio.org (HPR Feedback)</managingEditor>
|
||||
<webMaster>admin.nospam@nospam.hackerpublicradio.org (HPR Webmaster)</webMaster>
|
||||
<generator>https://repo.anhonesthost.net/rho_n/hpr_generator</generator>
|
||||
<docs>http://www.rssboard.org/rss-specification</docs>
|
||||
<ttl>600</ttl>
|
||||
<image>
|
||||
<url><!--% baseurl %-->images/hpr_feed_small.png</url>
|
||||
<title>Hacker Public Radio ~ Comment Feed</title>
|
||||
<link><!--% baseurl %-->about.html</link>
|
||||
<description>The Hacker Public Radio Old Microphone Logo</description>
|
||||
<height>164</height>
|
||||
<width>144</width>
|
||||
</image>
|
||||
<atom:link href="<!--% baseurl %-->comments.rss" rel="self" type="application/rss+xml" />
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% FOREACH response IN DBI.query('SELECT max( comment_timestamp) AS latest_update FROM comments') %-->
|
||||
|
||||
<pubDate><!--% format_feed_date(response.latest_update) %--></pubDate>
|
||||
<!--% END %-->
|
||||
|
||||
<!--% FOREACH item IN DBI.query('
|
||||
SELECT C.*,
|
||||
H.host, H.hostid AS host_id,
|
||||
E.title AS episode_title,
|
||||
E.date AS episode_date,
|
||||
E.duration AS episode_duration,
|
||||
M.id AS series_id, M.name AS series_name
|
||||
FROM comments AS C
|
||||
INNER JOIN eps AS E
|
||||
ON C.eps_id = E.id
|
||||
INNER JOIN hosts AS H
|
||||
ON E.hostid = H.hostid
|
||||
INNER JOIN miniseries AS M
|
||||
ON E.series = M.id
|
||||
ORDER BY C.comment_timestamp DESC
|
||||
LIMIT 30
|
||||
')
|
||||
%-->
|
||||
|
||||
<item>
|
||||
<title><!--% item.comment_author_name %--> says: <!--% item.comment_title %--></title>
|
||||
<author>feedback.nospam@nospam.hackerpublicradio.org (<!--% item.comment_author_name %-->)</author>
|
||||
<link><!--% baseurl %-->eps/hpr<!--% zero_pad_left(item.eps_id) %-->/index.html#comments</link>
|
||||
<description><![CDATA[<strong>
|
||||
RE: hpr<!--% zero_pad_left(item.eps_id) %-->::<!--% item.episode_date %--> <em><!--% item.episode_title %--></em> by <a href="<!--% baseurl %-->correspondents/<!--% zero_pad_left(item.host_id) %-->.html"><!--% item.host %--></a></strong><!--% rss_show_series(item.series_name, item.series_id) %--><br />
|
||||
<!--% display_episode_duration(item.episode_duration) %--><!--% display_listen_in(item.eps_id) %--><br /><!--% item.comment_text FILTER html_line_break %-->
|
||||
]]></description>
|
||||
<pubDate><!--% format_feed_date(item.comment_timestamp) %--></pubDate>
|
||||
<guid isPermaLink="false"><!--% baseurl %-->eps/hpr<!--% zero_pad_left(item.eps_id) %-->/index.html#comment_<!--% item.id %--></guid>
|
||||
</item>
|
||||
<!--% END %-->
|
||||
</channel>
|
||||
</rss>
|
@@ -1,5 +1,5 @@
|
||||
<!--% PROCESS 'shared-item.tpl.xml' %-->
|
||||
<!--% PROCESS 'rss-query-hpr.tpl.xml' %-->
|
||||
<!--% PROCESS "rss-query-hpr-${constants.database}.tpl.xml" %-->
|
||||
<!--% FOREACH episode IN feed_result %-->
|
||||
<!--% display_item(episode, media_file_extension, audio_mime_type) %-->
|
||||
<!--% END %-->
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<!--% PROCESS 'shared-item.tpl.xml' %-->
|
||||
<!--% PROCESS 'rss-query-hpr_total.tpl.xml' %-->
|
||||
<!--% PROCESS "rss-query-hpr_total-${constants.database}.tpl.xml" %-->
|
||||
<!--% FOREACH episode IN feed_result %-->
|
||||
<!--% display_item(episode, media_file_extension, audio_mime_type) %-->
|
||||
<!--% END %-->
|
||||
|
26
templates/rss-query-hpr-mysql.tpl.xml
Normal file
@@ -0,0 +1,26 @@
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% query_hpr_feed = DBI.prepare('
|
||||
SELECT
|
||||
eps.id,
|
||||
eps.explicit,
|
||||
DATE_FORMAT(eps.date, \'%H:%i:%S %d:%m:%Y\') AS \'date\',
|
||||
eps.license, eps.duration,
|
||||
eps.title, eps.summary, eps.tags,
|
||||
eps.notes,
|
||||
hosts.local_image,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email,
|
||||
miniseries.name AS series, miniseries.id AS seriesid,
|
||||
assets.size AS length
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
INNER JOIN assets ON eps.id = assets.episode_id
|
||||
WHERE eps.date <= UTC_DATE()
|
||||
AND assets.extension = ?
|
||||
ORDER BY eps.date DESC
|
||||
LIMIT 10
|
||||
')
|
||||
%-->
|
||||
<!--% feed_result = query_hpr_feed.execute(media_file_extension) %-->
|
||||
|
26
templates/rss-query-hpr-sqlite.tpl.xml
Normal file
@@ -0,0 +1,26 @@
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% query_hpr_feed = DBI.prepare('
|
||||
SELECT
|
||||
eps.id,
|
||||
eps.explicit,
|
||||
strftime(\'%H:%M:%S %d:%m:%Y\', date(eps.date)) AS date,
|
||||
eps.license, eps.duration,
|
||||
eps.title, eps.summary, eps.tags,
|
||||
eps.notes,
|
||||
hosts.local_image,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email,
|
||||
miniseries.name AS series, miniseries.id AS seriesid,
|
||||
assets.size AS length
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
INNER JOIN assets ON eps.id = assets.episode_id
|
||||
WHERE eps.date <= date(\'now\')
|
||||
AND assets.extension = ?
|
||||
ORDER BY eps.date DESC
|
||||
LIMIT 10
|
||||
')
|
||||
%-->
|
||||
<!--% feed_result = query_hpr_feed.execute(media_file_extension) %-->
|
||||
|
@@ -1,23 +0,0 @@
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% query_hpr_feed = DBI.prepare('
|
||||
SELECT
|
||||
eps.id,
|
||||
eps.explicit,
|
||||
strftime(\'%H:%M:%S %d:%m:%Y\', date(eps.date)) AS date,
|
||||
eps.license, eps.duration,
|
||||
eps.title, eps.summary, eps.tags,
|
||||
eps.notes,
|
||||
hosts.local_image,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email,
|
||||
miniseries.name AS series, miniseries.id AS seriesid
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE eps.date < date(\'now\', \'+1 days\')
|
||||
ORDER BY eps.date DESC
|
||||
LIMIT 10
|
||||
')
|
||||
%-->
|
||||
<!--% feed_result = query_hpr_feed.execute() %-->
|
||||
|
25
templates/rss-query-hpr_total-mysql.tpl.xml
Normal file
@@ -0,0 +1,25 @@
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% query_hpr_feed = DBI.prepare('
|
||||
SELECT
|
||||
eps.id,
|
||||
eps.explicit,
|
||||
DATE_FORMAT(eps.date, \'%H:%i:%S %d:%m:%Y\') AS \'date\',
|
||||
eps.license, eps.duration,
|
||||
eps.title, eps.summary, eps.tags,
|
||||
eps.notes,
|
||||
hosts.local_image,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email,
|
||||
miniseries.name AS series, miniseries.id AS seriesid,
|
||||
assets.size AS length
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
INNER JOIN assets ON eps.id = assets.episode_id
|
||||
WHERE eps.date < UTC_DATE()
|
||||
AND assets.extension = ?
|
||||
ORDER BY eps.date DESC
|
||||
')
|
||||
%-->
|
||||
<!--% feed_result = query_hpr_feed.execute(media_file_extension) %-->
|
||||
|
25
templates/rss-query-hpr_total-sqlite.tpl.xml
Normal file
@@ -0,0 +1,25 @@
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% query_hpr_feed = DBI.prepare('
|
||||
SELECT
|
||||
eps.id,
|
||||
eps.explicit,
|
||||
strftime(\'%H:%M:%S %d:%m:%Y\', date(eps.date)) AS date,
|
||||
eps.license, eps.duration,
|
||||
eps.title, eps.summary, eps.tags,
|
||||
eps.notes,
|
||||
hosts.local_image,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email,
|
||||
miniseries.name AS series, miniseries.id AS seriesid,
|
||||
assets.size AS length
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
INNER JOIN assets ON eps.id = assets.episode_id
|
||||
WHERE eps.date <= date(\'now\')
|
||||
AND assets.extension = ?
|
||||
ORDER BY eps.date DESC
|
||||
')
|
||||
%-->
|
||||
<!--% feed_result = query_hpr_feed.execute(media_file_extension) %-->
|
||||
|
@@ -1,22 +0,0 @@
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% query_hpr_feed = DBI.prepare('
|
||||
SELECT
|
||||
eps.id,
|
||||
eps.explicit,
|
||||
strftime(\'%H:%M:%S %d:%m:%Y\', date(eps.date)) AS date,
|
||||
eps.license, eps.duration,
|
||||
eps.title, eps.summary, eps.tags,
|
||||
eps.notes,
|
||||
hosts.local_image,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email,
|
||||
miniseries.name AS series, miniseries.id AS seriesid
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE eps.date < date(\'now\', \'+1 days\')
|
||||
ORDER BY eps.date DESC
|
||||
')
|
||||
%-->
|
||||
<!--% feed_result = query_hpr_feed.execute() %-->
|
||||
|
@@ -1,15 +1,15 @@
|
||||
<!--% USE date %-->
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<rss version="2.0"
|
||||
xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"
|
||||
xmlns:atom="http://www.w3.org/2005/Atom"
|
||||
<rss version="2.0"
|
||||
xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"
|
||||
xmlns:atom="http://www.w3.org/2005/Atom"
|
||||
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" >
|
||||
<channel>
|
||||
<title>Hacker Public Radio</title>
|
||||
<link>https://www.hackerpublicradio.org/about.html</link>
|
||||
<itunes:subtitle>A daily show hosted the community on topics that are of interest to hackers and hobbyists.</itunes:subtitle>
|
||||
<description>Hacker Public Radio is an podcast that releases shows every weekday Monday through Friday. Our shows are produced by the community (you) and can be on any topic that are of interest to hackers and hobbyists.</description>
|
||||
<itunes:subtitle>A daily show hosted by the community on topics that are of interest to hackers and hobbyists.</itunes:subtitle>
|
||||
<description>Hacker Public Radio is a podcast that releases shows every weekday Monday through Friday. Our shows are produced by the community (you) and can be on any topic that is of interest to hackers and hobbyists.</description>
|
||||
<language>en-us</language>
|
||||
<itunes:category text="Technology">
|
||||
<itunes:category text="Tech News"/>
|
||||
@@ -22,14 +22,14 @@
|
||||
<itunes:author>Hacker Public Radio</itunes:author>
|
||||
<itunes:keywords>Community Radio, Tech Interviews, Linux, Open, Hobby, Software Freedom</itunes:keywords>
|
||||
<copyright>Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) License</copyright>
|
||||
<managingEditor>feedback@NOSPAM-hackerpublicradio.org (HPR Feedback)</managingEditor>
|
||||
<managingEditor>feedback@NOSPAM-hackerpublicradio.org (HPR Feedback)</managingEditor>
|
||||
<!-- <author>feedback@NOSPAM-hackerpublicradio.org (HPR Feedback)</author> -->
|
||||
<itunes:owner>
|
||||
<itunes:owner>
|
||||
<itunes:name>HPR Volunteer</itunes:name>
|
||||
<itunes:email>admin@hackerpublicradio.org</itunes:email>
|
||||
</itunes:owner>
|
||||
<webMaster>admin@hackerpublicradio.org (HPR Volunteer)</webMaster>
|
||||
<generator>site-generator</generator>
|
||||
<webMaster>admin@hackerpublicradio.org (HPR Volunteer)</webMaster>
|
||||
<generator>site-generator</generator>
|
||||
<docs>http://www.rssboard.org/rss-specification</docs>
|
||||
<ttl>43200</ttl>
|
||||
<skipDays>
|
||||
@@ -39,19 +39,19 @@
|
||||
<image>
|
||||
<url>https://www.hackerpublicradio.org/images/hpr_feed_small.png</url>
|
||||
<title>Hacker Public Radio</title>
|
||||
<link>https://www.hackerpublicradio.org/about.php</link>
|
||||
<link>https://www.hackerpublicradio.org/about.html</link>
|
||||
<description>The Hacker Public Radio Old Microphone Logo</description>
|
||||
<height>164</height>
|
||||
<width>144</width>
|
||||
</image>
|
||||
<googleplay:author>HPR Volunteer</googleplay:author>
|
||||
<googleplay:description>Hacker Public Radio is an podcast that releases shows every weekday Monday through Friday. Our shows are produced by the community (you) and can be on any topic that are of interest to hackers and hobbyists.</googleplay:description>
|
||||
<googleplay:description>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.</googleplay:description>
|
||||
<googleplay:email>admin@hackerpublicradio.org</googleplay:email>
|
||||
<googleplay:image href="https://www.hackerpublicradio.org/images/hpr_feed_itunes.png"/>
|
||||
<googleplay:category text="Technology"/>
|
||||
<atom:link href="https://www.hackerpublicradio.org/<!--% filename %-->" rel="self" type="application/rss+xml" />
|
||||
<pubDate><!--% format_feed_date(date.now) %--></pubDate>
|
||||
|
||||
|
||||
<!--% INCLUDE $content %-->
|
||||
</channel>
|
||||
</rss>
|
||||
|
@@ -1,5 +1,16 @@
|
||||
<!--% MACRO get_avatar(host_id) BLOCK %-->
|
||||
<!--% MACRO lazy_load(is_lazy) BLOCK %-->
|
||||
<!--% IF is_lazy %-->loading="lazy"<!--% END %-->
|
||||
<!--% END %-->
|
||||
<!--% MACRO get_avatar_src(host_id) BLOCK %-->
|
||||
<!--% TRY %-->
|
||||
<!--% USE File ("./public_html/images/hosts/${host_id}.png") %-->hosts/<!--% File.name %-->
|
||||
<!--% CATCH File %-->hpr_logo.png<!--% END %-->
|
||||
<!--% END %-->
|
||||
<!--% MACRO get_avatar(host_id, host_name, is_lazy_loaded) BLOCK %-->
|
||||
<img src="<!--% absolute_path(baseurl) %-->images/<!--% get_avatar_src(host_id) %-->" height="80" width="80" alt="Thumbnail of <!--% host_name | html %-->" <!--% lazy_load(is_lazy_loaded) %--> />
|
||||
<!--% END %-->
|
||||
<!--% MACRO show_avatar(host_id, host_name, is_lazy_loaded) BLOCK %-->
|
||||
<!--% IF get_avatar_src(host_id) != 'hpr_logo.png' %-->
|
||||
<a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(host_id) %-->.html"><!--% get_avatar(host_id, host_name, is_lazy_loaded) %--></a><br>
|
||||
<!--% END %-->
|
||||
<!--% END %-->
|
||||
|
16
templates/shared-call_for_shows.tpl.html
Normal file
@@ -0,0 +1,16 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% PROCESS "queries-call_for_shows-${constants.database}.tpl.html" %-->
|
||||
<!--% MACRO display_call_for_shows BLOCK %-->
|
||||
<!--% result_call_for_shows = DBI.prepare(query_call_for_shows) %-->
|
||||
<!--% results_call_for_shows = result_call_for_shows.execute().get_all() %-->
|
||||
<!--% IF results_call_for_shows.0.request_for_shows == 1 %-->
|
||||
<!--% USE date %-->
|
||||
<article>
|
||||
<header>
|
||||
<h3>Call for shows</h3>
|
||||
</header>
|
||||
<p><strong><em>We are running very low on shows</em></strong> at the moment. Have a look at the <a href="<!--% absolute_path(baseurl) %-->correspondents/index.html">hosts</a> page and if you don't see "<!--% date.format(date.now, '%Y') %-->-??-??" next to your name, or if your name is not listed, you might consider sending us in something.</p>
|
||||
<!-- <img src="/images/hprstats.png" alt="hpr queue showing an graph showing how few shows we have" /> -->
|
||||
</article>
|
||||
<!--% END %-->
|
||||
<!--% END %-->
|
@@ -1,12 +1,48 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
|
||||
<!--% MACRO show_series(series, series_id) IF series != "" %-->
|
||||
<label>Series:</label> <a href="<!--% absolute_path(baseurl) %-->series/<!--% zero_pad_left(series_id) %-->.html"><!--% series %--></a>.
|
||||
<!--% MACRO rss_show_series(series, series_id) IF series != "general" %-->
|
||||
from the series <em><a href="<!--% baseurl %-->series/<!--% zero_pad_left(series_id) %-->.html"><!--% series %--></em></a>.
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO show_meta(show) BLOCK %-->
|
||||
<span><label>Released:</label> <!--% show.date %-->.</span> <span><label>Duration:</label> <!--% show.duration %-->.</span> <span><label>Flag:</label> <!--% display_explicit(show.explicit) %-->.</span> <span><!--% show_series(show.series, show.seriesid) %--></span> <br>
|
||||
<span><label>Tags:</label> <em><!--% show.tags %--></em>.</span>
|
||||
<!--% MACRO show_series(series, series_id, label) IF series != "" %-->
|
||||
<!--% IF label == "" %-->
|
||||
<!--% label = "Series" %-->
|
||||
<!--% END %-->
|
||||
<label><!--% label %-->:</label> <a href="<!--% absolute_path(baseurl) %-->series/<!--% zero_pad_left(series_id) %-->.html"><!--% series %--></a>.
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO display_tags(tags) BLOCK %-->
|
||||
<span><label>Tags:</label> <em>
|
||||
<!--% FOREACH tag IN tags.csv_parse %-->
|
||||
<a href="<!--% absolute_path(baseurl) %-->tags.html#<!--% tag.lower %-->"><!--% tag %--></a><!--% IF loop.count == loop.size %-->.<!--% ELSE %-->,<!--% END %-->
|
||||
<!--% END %--></em>
|
||||
</span>
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO display_listen_in(eps_id, episode_type) BLOCK %-->
|
||||
<!--% IF episode_type == "" %--><!--% episode_type = 'hpr' %--><!--% END %-->
|
||||
Listen in
|
||||
<!--% IF episode_type == 'hpr' %-->
|
||||
<a href="<!--% media_path(eps_id, episode_type, 'ogg', baseurl, media_baseurl) %-->" aria-label="Download <!--% episode_type %--><!--% zero_pad_left(eps_id) %--> as">ogg</a>,
|
||||
<a href="<!--% media_path(eps_id, episode_type, 'spx', baseurl, media_baseurl) %-->" aria-label="Download <!--% episode_type %--><!--% zero_pad_left(eps_id) %--> as">spx</a>,
|
||||
or
|
||||
<!--% END %-->
|
||||
<a href="<!--% media_path(eps_id, episode_type, 'mp3', baseurl, media_baseurl) %-->" aria-label="Download <!--% episode_type %--><!--% zero_pad_left(eps_id) %--> as">mp3</a> format.
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO display_comments_tally(eps_id, tally) BLOCK %-->
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(eps_id) %-->/index.html#comments" aria-label="Comments for hpr<!--% zero_pad_left(eps_id) %-->"><!--% IF tally > 0 %--><!--% tally %--><!--% ELSE %-->(Be the first)<!--% END %--></a>.
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO show_meta(show, hide_tags) BLOCK %-->
|
||||
<span><label>Released:</label> <!--% show.date %-->.</span>
|
||||
<span><label>Duration:</label> <!--% display_episode_duration(show.duration) %-->.</span>
|
||||
<span><label>Flag:</label> <!--% display_explicit(show.explicit) %-->.</span>
|
||||
<span><!--% show_series(show.series, show.seriesid) %--></span> <br>
|
||||
<!--% IF hide_tags == "" %--><!--% display_tags(show.tags) %--><!--% END %-->
|
||||
<!--% IF show.comentsTally || show.commentsTally == 0 %-->
|
||||
<span><label>Comments:</label> <!--% display_comments_tally(show.id, show.commentsTally) %--></span>
|
||||
<!--% END %-->
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO show_summary(show, hide_host) BLOCK %-->
|
||||
@@ -15,7 +51,17 @@
|
||||
hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(show.hostid) %-->.html"><!--% show.host %--></a>
|
||||
<!--% END %-->
|
||||
</h3>
|
||||
<p class="meta"><!--% show_meta(show) %--><br>
|
||||
<!--% show.summary %-->
|
||||
</p>
|
||||
<p class="meta"><!--% show_meta(show) %--></p>
|
||||
<p class="summary"><!--% show.summary %--></p>
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO twat_show_summary(show, hide_host) BLOCK %-->
|
||||
|
||||
<h3 class="title"><a href="<!--% absolute_path(baseurl) %-->eps/twat<!--% zero_pad_left(show.id) %-->/index.html">twat<!--% show.id %--> :: <!--% show.title %--></a> <!--% IF hide_host == "" %-->
|
||||
hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(show.hostid) %-->.html"><!--% show.host %--></a>
|
||||
<!--% END %-->
|
||||
</h3>
|
||||
<p class="meta"><!--% show_meta(show) %--></p>
|
||||
<p class="summary"><!--% show.summary %--></p>
|
||||
<!--% END %-->
|
||||
|
||||
|
@@ -1,23 +1,24 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% MACRO display_item(episode, file_extension, audio_mime_type) BLOCK %-->
|
||||
<!--% USE HTML.Strip %-->
|
||||
<!--% IF audio_mime_type == "" %-->
|
||||
<!--% audio_mime_type = 'ogg' %-->
|
||||
<!--% END %-->
|
||||
<item>
|
||||
<itunes:explicit><!--% display_explicit_feed(episode.explicit) %--></itunes:explicit>
|
||||
<itunes:explicit><!--% display_explicit_feed(episode.explicit) %--></itunes:explicit>
|
||||
<googleplay:explicit><!--% display_explicit_feed(episode.explicit) %--></googleplay:explicit>
|
||||
<title>HPR<!--% zero_pad_left(episode.id) %-->: <!--% episode.title %--></title>
|
||||
<title>HPR<!--% zero_pad_left(episode.id) %-->: <!--% episode.title %--></title>
|
||||
<author><!--% episode.email %--> (<!--% episode.host %-->)</author>
|
||||
<googleplay:author><!--% episode.email %--> (<!--% episode.host %-->)</googleplay:author>
|
||||
<itunes:author><!--% episode.email %--> (<!--% episode.host %-->)</itunes:author>
|
||||
<googleplay:image href="https://www.hackerpublicradio.org/images/hpr_feed_itunes.png"/>
|
||||
<link>https://www.hackerpublicradio.org/eps/hpr/<!--% zero_pad_left(episode.id) %-->/index.html</link>
|
||||
<link>https://www.hackerpublicradio.org/eps/hpr<!--% zero_pad_left(episode.id) %-->/index.html</link>
|
||||
<description><![CDATA[<!--% episode.notes %-->]]>
|
||||
</description>
|
||||
<itunes:summary><![CDATA[<!--% episode.notes %-->]]>
|
||||
<itunes:summary><![CDATA[<!--% episode.notes.substr(0, 4000) | html_strip | xml_entity %-->]]>
|
||||
</itunes:summary>
|
||||
<pubDate><!--% format_feed_date(episode.date) %--></pubDate>
|
||||
<enclosure url="http://hackerpublicradio.org/eps/hpr<!--% zero_pad_left(episode.id) %-->.<!--% file_extension %-->" length="<!--% episode.duration * 1000 %-->" type="audio/<!--% audio_mime_type %-->"/>
|
||||
<guid>http://hackerpublicradio.org/eps/hpr<!--% zero_pad_left(episode.id) %-->.<!--% file_extension %--></guid>
|
||||
<enclosure url="http://hackerpublicradio.org/eps/hpr<!--% zero_pad_left(episode.id) %-->.<!--% file_extension %-->" length="<!--% episode.length %-->" type="audio/<!--% audio_mime_type %-->"/>
|
||||
<guid>http://hackerpublicradio.org/eps/hpr<!--% zero_pad_left(episode.id) %-->.<!--% file_extension %--></guid>
|
||||
</item>
|
||||
<!--% END %-->
|
||||
|
12
templates/shared-listen-now.tpl.html
Normal file
@@ -0,0 +1,12 @@
|
||||
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
|
||||
|
||||
<!--% MACRO listen_now(episode, episode_type, baseurl, media_baseurl, hide_duration) BLOCK %-->
|
||||
<p><!--% display_listen_in(episode.id, episode_type) %--> Play now:<br>
|
||||
<audio controls preload="none">
|
||||
<source src="<!--% media_path(episode.id, episode_type, 'ogg', baseurl, media_baseurl) %-->" type="audio/ogg" >
|
||||
<source src="<!--% media_path(episode.id, episode_type, 'mp3', baseurl, media_baseurl) %-->" type="audio/mpeg" >
|
||||
</audio>
|
||||
<!--% IF !hide_duration %--><br>
|
||||
Duration: <!--% display_episode_duration(episode.duration) %--><!--% END %--></p>
|
||||
<!--% END %-->
|
||||
|
12
templates/shared-show-transcript.tpl.html
Normal file
@@ -0,0 +1,12 @@
|
||||
<!--% MACRO show_transcript(episode, episode_type, baseurl, media_baseurl) BLOCK %-->
|
||||
<h2>Show Transcript</h2>
|
||||
<p>Automatically generated using <a href="https://github.com/openai/whisper">whisper</a>
|
||||
<pre><code>whisper --model tiny --language en hpr<!--% zero_pad_left(episode.id) %-->.wav</code></pre></p>
|
||||
|
||||
<ul>
|
||||
<li>Text: <a href="<!--% media_path(episode.id, episode_type, 'txt', baseurl, media_baseurl) %-->">hpr<!--% zero_pad_left(episode.id) %-->.txt</a></li>
|
||||
<li><a href="https://en.wikipedia.org/wiki/WebVTT">WebVTT</a>: <a href="<!--% media_path(episode.id, episode_type, 'vtt', baseurl, media_baseurl) %-->">hpr<!--% zero_pad_left(episode.id) %-->.vtt</a></li>
|
||||
<li><a href="https://en.wikipedia.org/wiki/SubRip">SubRip</a>: <a href="<!--% media_path(episode.id, episode_type, 'srt', baseurl, media_baseurl) %-->">hpr<!--% zero_pad_left(episode.id) %-->.srt</a></li>
|
||||
</ul>
|
||||
<!--% END %-->
|
||||
|
@@ -1,6 +1,11 @@
|
||||
<!--% MACRO zero_pad_left(word) BLOCK %-->
|
||||
<!--% USE String(word) %-->
|
||||
<!--% String.format("%04s") %-->
|
||||
<!--% MACRO zero_pad_left(word, pad_length) BLOCK %-->
|
||||
<!--% IF pad_length %-->
|
||||
<!--% zero_pad_format = "%0${pad_length}s" %-->
|
||||
<!--% ELSE %-->
|
||||
<!--% zero_pad_format = "%04s" %-->
|
||||
<!--% END %-->
|
||||
<!--% USE String(word) %-->
|
||||
<!--% String.format(zero_pad_format) %-->
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO display_choice(choice, display_when_true, display_when_false) BLOCK %-->
|
||||
@@ -8,6 +13,20 @@
|
||||
<!--% ELSE %--><!--% display_when_false %--><!--% END %-->
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO display_episode_duration(duration_sec) BLOCK %-->
|
||||
<!--% seconds = duration_sec % 60 %-->
|
||||
<!--% USE format %-->
|
||||
<!--% minutes_only = format("%d") %-->
|
||||
<!--% minutes = minutes_only(duration_sec / 60) %-->
|
||||
<!--% hours_only = format("%d") %-->
|
||||
<!--% hours = hours_only(minutes / 60) %-->
|
||||
<!--% IF hours >= 1 %-->
|
||||
<!--% minutes = minutes - hours * 60 %-->
|
||||
<!--% END %-->
|
||||
<!--% display_hours = format("%02d:%02d:%02d") %-->
|
||||
<!--% display_hours(hours,minutes,seconds) %-->
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO display_explicit(is_explicit) BLOCK %-->
|
||||
<!--% display_choice(is_explicit, 'Explicit', 'Clean') %-->
|
||||
<!--% END %-->
|
||||
@@ -17,25 +36,74 @@
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO format_feed_date(date_to_format) BLOCK %-->
|
||||
<!--% USE feed_date = date(format = '%a, %e %b %Y 00:00:00 +0000', gmt=1) %-->
|
||||
<!--% USE feed_date = date(format = '%a, %d %b %Y %H:%M:%S +0000', gmt=1) %-->
|
||||
<!--% feed_date.format(date_to_format) %-->
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO format_iso8601_date(date_to_format) BLOCK %-->
|
||||
<!--% USE iso8601_date = date(format = '%Y-%m-%dT%H:%M:%SZ', gmt=1) %-->
|
||||
<!--% iso8601_date.format(date_to_format) %-->
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO absolute_url(base, path) BLOCK %-->
|
||||
<!--% UNLESS base.empty %-->
|
||||
<!--% UNLESS base.substr(-1) == '/' %-->
|
||||
<!--% base = base _ '/' %-->
|
||||
<!--% END %-->
|
||||
<!--% END %-->
|
||||
<!--% UNLESS path.empty %-->
|
||||
<!--% IF path.substr(0,1) == '/' %-->
|
||||
<!--% path = path.substr(1) %-->
|
||||
<!--% END %-->
|
||||
<!--% END %-->
|
||||
<!--% base _ path %-->
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO absolute_path(baseurl) BLOCK %-->
|
||||
<!--% IF baseurl %-->./<!--% ELSE %-->/<!--% END %-->
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO step_navigation(baseurl, links) BLOCK %-->
|
||||
<small><a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(links.earliest) %-->/index.html" rel="first"><< First</a>,
|
||||
<!--% IF links.previous %-->
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(links.previous) %-->/index.html" rel="previous">< Previous</a>,
|
||||
<!--% ELSE %-->
|
||||
<span><</span> Previous,
|
||||
<!--% END %-->
|
||||
<!--% IF links.next %-->
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(links.next) %-->/index.html" rel="next">Next ></a>,
|
||||
<!--% ELSE %-->
|
||||
Next <span>></span>
|
||||
<!--% END %-->
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(links.latest) %-->/index.html" rel="last">Latest >></a></small>
|
||||
<!--% MACRO media_basepath(baseurl, media_baseurl) BLOCK %-->
|
||||
<!--% IF media_baseurl %-->
|
||||
<!--% media_baseurl %--><!--% ELSE %-->
|
||||
<!--% IF baseurl %--><!--% baseurl %--><!--% ELSE %-->/<!--% END %-->
|
||||
<!--% END %-->
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO media_path(episode_id, episode_type, media_type, baseurl, media_baseurl) BLOCK %-->
|
||||
<!--% IF episode_type == "twat" %-->
|
||||
<!--% padding = 3 %-->
|
||||
<!--% media_folder = "eps/"; padding = 3 %-->
|
||||
<!--% ELSE %-->
|
||||
<!--% media_folder = "local/" %-->
|
||||
<!--% END %-->
|
||||
<!--% IF media_baseurl %-->
|
||||
<!--% transcription_types = "txt srt vtt" %-->
|
||||
<!--% USE String(transcription_types) %-->
|
||||
<!--% USE String(media_baseurl) %-->
|
||||
<!--% IF transcription_types.search(media_type) && media_baseurl.search('archive.org') %-->
|
||||
<!--% media_baseurl = "${media_baseurl}hpr\$eps_id/" %-->
|
||||
<!--% END %-->
|
||||
<!--% media_folder = "" %-->
|
||||
<!--% media_baseurl = media_baseurl.replace('\$eps_id', zero_pad_left(episode_id)) %-->
|
||||
<!--% END %-->
|
||||
<!--% media_basepath(baseurl, media_baseurl) %--><!--% media_folder %--><!--% episode_type %--><!--% zero_pad_left(episode_id, padding) %-->.<!--% media_type %-->
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO step_navigation(baseurl, links, folder) BLOCK %-->
|
||||
<!--% IF folder %-->
|
||||
<!--% folder = folder %--><!--% ELSE %--><!--% folder = "hpr" %-->
|
||||
<!--% END %-->
|
||||
<small><a href="<!--% absolute_path(baseurl) %-->eps/<!--% folder %--><!--% zero_pad_left(links.earliest) %-->/index.html" rel="first"><< First</a>,
|
||||
<!--% IF links.previous %-->
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/<!--% folder %--><!--% zero_pad_left(links.previous) %-->/index.html" rel="previous">< Previous</a>,
|
||||
<!--% ELSE %-->
|
||||
<span><</span> Previous,
|
||||
<!--% END %-->
|
||||
<!--% IF links.next %-->
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/<!--% folder %--><!--% zero_pad_left(links.next) %-->/index.html" rel="next">Next ></a>,
|
||||
<!--% ELSE %-->
|
||||
Next <span>></span>
|
||||
<!--% END %-->
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/<!--% folder %--><!--% zero_pad_left(links.latest) %-->/index.html" rel="last">Latest >></a></small>
|
||||
<!--% END %-->
|
||||
|
184
utils/lib_utils.sh
Normal file
@@ -0,0 +1,184 @@
|
||||
#!/bin/bash -
|
||||
#===============================================================================
|
||||
#
|
||||
# FILE: lib_utils.sh
|
||||
#
|
||||
# USAGE: ./lib_utils.sh
|
||||
#
|
||||
# DESCRIPTION: functions for scripts used to update local HPR installations
|
||||
# using the HPR static site generator
|
||||
#
|
||||
# OPTIONS: ---
|
||||
# REQUIREMENTS: mysql2sqlite (https://github.com/dumblob/mysql2sqlite)
|
||||
# BUGS: ---
|
||||
# NOTES: ---
|
||||
# AUTHOR: Roan "Rho`n" Horning <roan.horning@gmail.com>
|
||||
# CREATED: 02/26/2023 03:27:08 PM -5 UTC
|
||||
# REVISION: ---
|
||||
# LICENSE: GNU AGPLv3
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
#===============================================================================
|
||||
|
||||
set -o nounset # Treat unset variables as an error
|
||||
|
||||
#--- FUNCTION ----------------------------------------------------------------
|
||||
# NAME: make_working_dir
|
||||
# DESCRIPTION: Creates a local temporary working directory
|
||||
# SEE: https://stackoverflow.com/questions/4632028/how-to-create-a-temporary-directory#answer-34676160
|
||||
# PARAMETERS:
|
||||
# RETURNS: The path to the working directory
|
||||
#-------------------------------------------------------------------------------
|
||||
function make_working_dir {
|
||||
|
||||
# the directory of the script
|
||||
local DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
# the temp directory used, within $DIR
|
||||
# omit the -p parameter to create a temporal directory in
|
||||
# the default location
|
||||
|
||||
local WORK_DIR=`mktemp -d -p "$DIR"`
|
||||
|
||||
# check if tmp dir was created
|
||||
if [[ ! "$WORK_DIR" || ! -d "$WORK_DIR" ]]; then
|
||||
echo "Could not create temp dir"
|
||||
exit 1
|
||||
fi
|
||||
echo $WORK_DIR
|
||||
}
|
||||
|
||||
#--- FUNCTION ----------------------------------------------------------------
|
||||
# NAME: clean_working_dir
|
||||
# DESCRIPTION: Remove local temporary working directory
|
||||
# PARAMETERS: WORK_DIR -- Temporay directory to be delted
|
||||
# RETURNS:
|
||||
#-------------------------------------------------------------------------------
|
||||
function clean_working_dir {
|
||||
|
||||
if [[ -d $1 ]] && expr $1 : '.*/tmp.*' ; then
|
||||
rm -rf $1
|
||||
echo "Deleted temp working directory $1"
|
||||
else
|
||||
echo "Did not delete directory: $1"
|
||||
echo "Not a temporary directory."
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
#--- FUNCTION ----------------------------------------------------------------
|
||||
# NAME: download_hpr_sql
|
||||
# DESCRIPTION: Download the HPR SQL dump file into a working directory
|
||||
# PARAMETERS:
|
||||
# RETURNS:
|
||||
#-------------------------------------------------------------------------------
|
||||
function download_hpr_sql {
|
||||
|
||||
if [[ ! -d $1 ]] || ! expr $1 : '.*/tmp.*' ;
|
||||
then
|
||||
echo "Please provide the temporary directory when calling this function"
|
||||
return 1
|
||||
fi
|
||||
|
||||
local CURL=`which curl`
|
||||
local WGET=`which wget`
|
||||
local HPR_URL=https://www.hackerpublicradio.org/hpr.sql
|
||||
|
||||
if [ -f $1/hpr.sql ];
|
||||
then
|
||||
echo "Removing temporary hpr.sql"
|
||||
rm $1/hpr.sql
|
||||
else
|
||||
echo "No temporary hpr.sql to remove"
|
||||
fi
|
||||
|
||||
if [ "$CURL" != "" ];
|
||||
then
|
||||
curl $HPR_URL --output $1/hpr.sql
|
||||
echo "Downloaded hpr.sql via curl"
|
||||
elif [ "$WGET" != "" ];
|
||||
then
|
||||
wget --directory-prefix=$1 $HPR_URL
|
||||
echo "Downloaded hpr.sql via wget"
|
||||
else
|
||||
echo "Could not download file. Please install either curl or wget."
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
#--- FUNCTION ----------------------------------------------------------------
|
||||
# NAME: make_hpr_sqlite_db
|
||||
# DESCRIPTION: Converts the hpr sql file into an sqlite db file
|
||||
# PARAMETERS:
|
||||
# RETURNS:
|
||||
#-------------------------------------------------------------------------------
|
||||
function make_hpr_sqlite_db {
|
||||
|
||||
if [[ ! -d $1 ]] || ! expr $1 : '.*/tmp.*' ;
|
||||
then
|
||||
echo "Please provide the temporary directory when calling this function"
|
||||
return 1
|
||||
fi
|
||||
|
||||
local MYSQL2SQLITE=`which mysql2sqlite`
|
||||
local BIN_PATH=""
|
||||
|
||||
if [ "$MYSQL2SQLITE" = "" ];
|
||||
then
|
||||
if [ $# -gt 1 ] && [ -z "$2" ];
|
||||
then
|
||||
BIN_PATH=$2
|
||||
else
|
||||
BIN_PATH=`find . -type f -name "mysql2sqlite" -print | head -1`
|
||||
if [ "$BIN_PATH" != "" ];
|
||||
then
|
||||
BIN_PATH=${BIN_PATH/mysql2sqlite//}
|
||||
else
|
||||
echo "Could not find mysql2sqlite script."
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
echo $BIN_PATH
|
||||
|
||||
if [ -f $1/hpr.db ];
|
||||
then
|
||||
rm $1/hpr.db
|
||||
fi
|
||||
|
||||
# Remove lines from hpr.sql that mysql2sqlite can't handle
|
||||
sed '/^DELIMITER ;;/,/^DELIMITER ;/d' < $1/hpr.sql > $1/hpr-sqlite.sql
|
||||
|
||||
${BIN_PATH}mysql2sqlite $1/hpr-sqlite.sql | sqlite3 $1/hpr.db
|
||||
echo "Created hpr.db"
|
||||
}
|
||||
|
||||
#--- FUNCTION ----------------------------------------------------------------
|
||||
# NAME: copy_to_public_dir
|
||||
# DESCRIPTION: Move HPR sql and db files to public website folder
|
||||
# PARAMETERS:
|
||||
# RETURNS:
|
||||
#-------------------------------------------------------------------------------
|
||||
function copy_to_public_dir {
|
||||
|
||||
if [ $# -gt 1 ] && [ ! -z "$1" ] && [ ! -z "$2" ];
|
||||
then
|
||||
cp $1/hpr.sql $2/hpr.sql
|
||||
cp $1/hpr.db $2/hpr.db
|
||||
return 0
|
||||
else
|
||||
echo "Bad arguments. Can't copy files to public directory."
|
||||
fi
|
||||
}
|
289
utils/mysql2sqlite
Executable file
@@ -0,0 +1,289 @@
|
||||
#!/usr/bin/awk -f
|
||||
|
||||
# Authors: @esperlu, @artemyk, @gkuenning, @dumblob
|
||||
|
||||
# FIXME detect empty input file and issue a warning
|
||||
|
||||
function printerr( s ){ print s | "cat >&2" }
|
||||
|
||||
BEGIN {
|
||||
if( ARGC != 2 ){
|
||||
printerr( \
|
||||
"USAGE:\n"\
|
||||
" mysql2sqlite dump_mysql.sql > dump_sqlite3.sql\n" \
|
||||
" OR\n" \
|
||||
" mysql2sqlite dump_mysql.sql | sqlite3 sqlite.db\n" \
|
||||
"\n" \
|
||||
"NOTES:\n" \
|
||||
" Dash in filename is not supported, because dash (-) means stdin." )
|
||||
no_END = 1
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Find INT_MAX supported by both this AWK (usually an ISO C signed int)
|
||||
# and SQlite.
|
||||
# On non-8bit-based architectures, the additional bits are safely ignored.
|
||||
|
||||
# 8bit (lower precision should not exist)
|
||||
s="127"
|
||||
# "63" + 0 avoids potential parser misbehavior
|
||||
if( (s + 0) "" == s ){ INT_MAX_HALF = "63" + 0 }
|
||||
# 16bit
|
||||
s="32767"
|
||||
if( (s + 0) "" == s ){ INT_MAX_HALF = "16383" + 0 }
|
||||
# 32bit
|
||||
s="2147483647"
|
||||
if( (s + 0) "" == s ){ INT_MAX_HALF = "1073741823" + 0 }
|
||||
# 64bit (as INTEGER in SQlite3)
|
||||
s="9223372036854775807"
|
||||
if( (s + 0) "" == s ){ INT_MAX_HALF = "4611686018427387904" + 0 }
|
||||
# # 128bit
|
||||
# s="170141183460469231731687303715884105728"
|
||||
# if( (s + 0) "" == s ){ INT_MAX_HALF = "85070591730234615865843651857942052864" + 0 }
|
||||
# # 256bit
|
||||
# s="57896044618658097711785492504343953926634992332820282019728792003956564819968"
|
||||
# if( (s + 0) "" == s ){ INT_MAX_HALF = "28948022309329048855892746252171976963317496166410141009864396001978282409984" + 0 }
|
||||
# # 512bit
|
||||
# s="6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929093243025426876941405973284973216824503042048"
|
||||
# if( (s + 0) "" == s ){ INT_MAX_HALF = "3351951982485649274893506249551461531869841455148098344430890360930441007518386744200468574541725856922507964546621512713438470702986642486608412251521024" + 0 }
|
||||
# # 1024bit
|
||||
# s="89884656743115795386465259539451236680898848947115328636715040578866337902750481566354238661203768010560056939935696678829394884407208311246423715319737062188883946712432742638151109800623047059726541476042502884419075341171231440736956555270413618581675255342293149119973622969239858152417678164812112068608"
|
||||
# if( (s + 0) "" == s ){ INT_MAX_HALF = "44942328371557897693232629769725618340449424473557664318357520289433168951375240783177119330601884005280028469967848339414697442203604155623211857659868531094441973356216371319075554900311523529863270738021251442209537670585615720368478277635206809290837627671146574559986811484619929076208839082406056034304" + 0 }
|
||||
# # higher precision probably not needed
|
||||
|
||||
FS=",$"
|
||||
print "PRAGMA synchronous = OFF;"
|
||||
print "PRAGMA journal_mode = MEMORY;"
|
||||
print "BEGIN TRANSACTION;"
|
||||
}
|
||||
|
||||
# historically 3 spaces separate non-argument local variables
|
||||
function bit_to_int( str_bit, powtwo, i, res, bit, overflow ){
|
||||
powtwo = 1
|
||||
overflow = 0
|
||||
# 011101 = 1*2^0 + 0*2^1 + 1*2^2 ...
|
||||
for( i = length( str_bit ); i > 0; --i ){
|
||||
bit = substr( str_bit, i, 1 )
|
||||
if( overflow || ( bit == 1 && res > INT_MAX_HALF ) ){
|
||||
printerr( \
|
||||
NR ": WARN Bit field overflow, number truncated (LSBs saved, MSBs ignored)." )
|
||||
break
|
||||
}
|
||||
res = res + bit * powtwo
|
||||
# no warning here as it might be the last iteration
|
||||
if( powtwo > INT_MAX_HALF ){ overflow = 1; continue }
|
||||
powtwo = powtwo * 2
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
# CREATE TRIGGER statements have funny commenting. Remember we are in trigger.
|
||||
/^\/\*.*(CREATE.*TRIGGER|create.*trigger)/ {
|
||||
gsub( /^.*(TRIGGER|trigger)/, "CREATE TRIGGER" )
|
||||
print
|
||||
inTrigger = 1
|
||||
next
|
||||
}
|
||||
# The end of CREATE TRIGGER has a stray comment terminator
|
||||
/(END|end) \*\/;;/ { gsub( /\*\//, "" ); print; inTrigger = 0; next }
|
||||
# The rest of triggers just get passed through
|
||||
inTrigger != 0 { print; next }
|
||||
|
||||
# CREATE VIEW looks like a TABLE in comments
|
||||
/^\/\*.*(CREATE.*TABLE|create.*table)/ {
|
||||
inView = 1
|
||||
next
|
||||
}
|
||||
# end of CREATE VIEW
|
||||
/^(\).*(ENGINE|engine).*\*\/;)/ {
|
||||
inView = 0
|
||||
next
|
||||
}
|
||||
# content of CREATE VIEW
|
||||
inView != 0 { next }
|
||||
|
||||
# skip comments
|
||||
/^\/\*/ { next }
|
||||
|
||||
# skip PARTITION statements
|
||||
/^ *[(]?(PARTITION|partition) +[^ ]+/ { next }
|
||||
|
||||
# print all INSERT lines
|
||||
( /^ *\(/ && /\) *[,;] *$/ ) || /^(INSERT|insert|REPLACE|replace)/ {
|
||||
prev = ""
|
||||
|
||||
# first replace \\ by \_ that mysqldump never generates to deal with
|
||||
# sequnces like \\n that should be translated into \n, not \<LF>.
|
||||
# After we convert all escapes we replace \_ by backslashes.
|
||||
gsub( /\\\\/, "\\_" )
|
||||
|
||||
# single quotes are escaped by another single quote
|
||||
gsub( /\\'/, "''" )
|
||||
gsub( /\\n/, "\n" )
|
||||
gsub( /\\r/, "\r" )
|
||||
gsub( /\\"/, "\"" )
|
||||
gsub( /\\\032/, "\032" ) # substitute char
|
||||
|
||||
gsub( /\\_/, "\\" )
|
||||
|
||||
# sqlite3 is limited to 16 significant digits of precision
|
||||
while( match( $0, /0x[0-9a-fA-F]{17}/ ) ){
|
||||
hexIssue = 1
|
||||
sub( /0x[0-9a-fA-F]+/, substr( $0, RSTART, RLENGTH-1 ), $0 )
|
||||
}
|
||||
if( hexIssue ){
|
||||
printerr( \
|
||||
NR ": WARN Hex number trimmed (length longer than 16 chars)." )
|
||||
hexIssue = 0
|
||||
}
|
||||
print
|
||||
next
|
||||
}
|
||||
|
||||
# CREATE DATABASE is not supported
|
||||
/^(CREATE DATABASE|create database)/ { next }
|
||||
|
||||
# print the CREATE line as is and capture the table name
|
||||
/^(CREATE|create)/ {
|
||||
if( $0 ~ /IF NOT EXISTS|if not exists/ || $0 ~ /TEMPORARY|temporary/ ){
|
||||
caseIssue = 1
|
||||
printerr( \
|
||||
NR ": WARN Potential case sensitivity issues with table/column naming\n" \
|
||||
" (see INFO at the end)." )
|
||||
}
|
||||
if( match( $0, /`[^`]+/ ) ){
|
||||
tableName = substr( $0, RSTART+1, RLENGTH-1 )
|
||||
}
|
||||
aInc = 0
|
||||
prev = ""
|
||||
firstInTable = 1
|
||||
print
|
||||
next
|
||||
}
|
||||
|
||||
# Replace `FULLTEXT KEY` (probably other `XXXXX KEY`)
|
||||
/^ (FULLTEXT KEY|fulltext key)/ { gsub( /[A-Za-z ]+(KEY|key)/, " KEY" ) }
|
||||
|
||||
# Get rid of field lengths in KEY lines
|
||||
/ (PRIMARY |primary )?(KEY|key)/ { gsub( /\([0-9]+\)/, "" ) }
|
||||
|
||||
aInc == 1 && /PRIMARY KEY|primary key/ { next }
|
||||
|
||||
# Replace COLLATE xxx_xxxx_xx statements with COLLATE BINARY
|
||||
/ (COLLATE|collate) [a-z0-9_]*/ { gsub( /(COLLATE|collate) [a-z0-9_]*/, "COLLATE BINARY" ) }
|
||||
|
||||
# Print all fields definition lines except the `KEY` lines.
|
||||
/^ / && !/^( (KEY|key)|\);)/ {
|
||||
if( match( $0, /[^"`]AUTO_INCREMENT|auto_increment[^"`]/) ){
|
||||
aInc = 1
|
||||
gsub( /AUTO_INCREMENT|auto_increment/, "PRIMARY KEY AUTOINCREMENT" )
|
||||
}
|
||||
gsub( /(UNIQUE KEY|unique key) (`.*`|".*") /, "UNIQUE " )
|
||||
gsub( /(CHARACTER SET|character set) [^ ]+[ ,]/, "" )
|
||||
# FIXME
|
||||
# CREATE TRIGGER [UpdateLastTime]
|
||||
# AFTER UPDATE
|
||||
# ON Package
|
||||
# FOR EACH ROW
|
||||
# BEGIN
|
||||
# UPDATE Package SET LastUpdate = CURRENT_TIMESTAMP WHERE ActionId = old.ActionId;
|
||||
# END
|
||||
gsub( /(ON|on) (UPDATE|update) (CURRENT_TIMESTAMP|current_timestamp)(\(\))?/, "" )
|
||||
gsub( /(DEFAULT|default) (CURRENT_TIMESTAMP|current_timestamp)(\(\))?/, "DEFAULT current_timestamp")
|
||||
gsub( /(COLLATE|collate) [^ ]+ /, "" )
|
||||
gsub( /(ENUM|enum)[^)]+\)/, "text " )
|
||||
gsub( /(SET|set)\([^)]+\)/, "text " )
|
||||
gsub( /UNSIGNED|unsigned/, "" )
|
||||
gsub( /_utf8mb3/, "" )
|
||||
gsub( /` [^ ]*(INT|int|BIT|bit)[^ ]*/, "` integer" )
|
||||
gsub( /" [^ ]*(INT|int|BIT|bit)[^ ]*/, "\" integer" )
|
||||
ere_bit_field = "[bB]'[10]+'"
|
||||
if( match($0, ere_bit_field) ){
|
||||
sub( ere_bit_field, bit_to_int( substr( $0, RSTART +2, RLENGTH -2 -1 ) ) )
|
||||
}
|
||||
|
||||
# remove USING BTREE and other suffixes for USING, for example: "UNIQUE KEY
|
||||
# `hostname_domain` (`hostname`,`domain`) USING BTREE,"
|
||||
gsub( / USING [^, ]+/, "" )
|
||||
|
||||
# field comments are not supported
|
||||
gsub( / (COMMENT|comment).+$/, "" )
|
||||
# Get commas off end of line
|
||||
gsub( /,.?$/, "" )
|
||||
if( prev ){
|
||||
if( firstInTable ){
|
||||
print prev
|
||||
firstInTable = 0
|
||||
}
|
||||
else {
|
||||
print "," prev
|
||||
}
|
||||
}
|
||||
else {
|
||||
# FIXME check if this is correct in all cases
|
||||
if( match( $1,
|
||||
/(CONSTRAINT|constraint) ["].*["] (FOREIGN KEY|foreign key)/ ) ){
|
||||
print ","
|
||||
}
|
||||
}
|
||||
prev = $1
|
||||
}
|
||||
|
||||
/ ENGINE| engine/ {
|
||||
if( prev ){
|
||||
if( firstInTable ){
|
||||
print prev
|
||||
firstInTable = 0
|
||||
}
|
||||
else {
|
||||
print "," prev
|
||||
}
|
||||
}
|
||||
prev=""
|
||||
print ");"
|
||||
next
|
||||
}
|
||||
# `KEY` lines are extracted from the `CREATE` block and stored in array for later print
|
||||
# in a separate `CREATE KEY` command. The index name is prefixed by the table name to
|
||||
# avoid a sqlite error for duplicate index name.
|
||||
/^( (KEY|key)|\);)/ {
|
||||
if( prev ){
|
||||
if( firstInTable ){
|
||||
print prev
|
||||
firstInTable = 0
|
||||
}
|
||||
else {
|
||||
print "," prev
|
||||
}
|
||||
}
|
||||
prev = ""
|
||||
if( $0 == ");" ){
|
||||
print
|
||||
}
|
||||
else {
|
||||
if( match( $0, /`[^`]+/ ) ){
|
||||
indexName = substr( $0, RSTART+1, RLENGTH-1 )
|
||||
}
|
||||
if( match( $0, /\([^()]+/ ) ){
|
||||
indexKey = substr( $0, RSTART+1, RLENGTH-1 )
|
||||
}
|
||||
# idx_ prefix to avoid name clashes (they really happen!)
|
||||
key[tableName] = key[tableName] "CREATE INDEX \"idx_" \
|
||||
tableName "_" indexName "\" ON \"" tableName "\" (" indexKey ");\n"
|
||||
}
|
||||
}
|
||||
|
||||
END {
|
||||
if( no_END ){ exit 1}
|
||||
# print all KEY creation lines.
|
||||
for( table in key ){ printf key[table] }
|
||||
|
||||
print "END TRANSACTION;"
|
||||
|
||||
if( caseIssue ){
|
||||
printerr( \
|
||||
"INFO Pure sqlite identifiers are case insensitive (even if quoted\n" \
|
||||
" or if ASCII) and doesnt cross-check TABLE and TEMPORARY TABLE\n" \
|
||||
" identifiers. Thus expect errors like \"table T has no column named F\".")
|
||||
}
|
||||
}
|
54
utils/update-hpr-db.sh
Executable file
@@ -0,0 +1,54 @@
|
||||
#!/bin/bash -
|
||||
#===============================================================================
|
||||
#
|
||||
# FILE: update-hpr-db.sh
|
||||
#
|
||||
# USAGE: ./update-hpr-db.sh
|
||||
#
|
||||
# DESCRIPTION: Download MySQL hpr.sql file and create SQLite3 file
|
||||
#
|
||||
# OPTIONS: ---
|
||||
# REQUIREMENTS: lib_utils.sh
|
||||
# BUGS: ---
|
||||
# NOTES: ---
|
||||
# AUTHOR: Roan "Rho`n" Horning (roan.horning@gmail.com)
|
||||
# ORGANIZATION:
|
||||
# CREATED: 03/05/2023 07:21:29 PM
|
||||
# REVISION: ---
|
||||
# LICENSE: GNU AGPLv3
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
#===============================================================================
|
||||
|
||||
set -o nounset # Treat unset variables as an error
|
||||
|
||||
BASEDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
#
|
||||
# Load library functions
|
||||
#
|
||||
LIB="$BASEDIR/lib_utils.sh"
|
||||
[ -e $LIB ] || { echo "Unable to load functions.\n$LIB not found."; exit; }
|
||||
source $LIB
|
||||
|
||||
WORKING_DIR=`make_working_dir`
|
||||
|
||||
download_hpr_sql $WORKING_DIR
|
||||
|
||||
make_hpr_sqlite_db $WORKING_DIR
|
||||
|
||||
copy_to_public_dir $WORKING_DIR `pwd`
|
||||
|
||||
clean_working_dir $WORKING_DIR
|
72
utils/update-hpr.sh
Executable file
@@ -0,0 +1,72 @@
|
||||
#!/bin/bash -
|
||||
#===============================================================================
|
||||
#
|
||||
# FILE: update-hpr.sh
|
||||
#
|
||||
# USAGE: ./update-hpr.sh
|
||||
#
|
||||
# DESCRIPTION: Script to update local statically generated HPR website
|
||||
#
|
||||
# OPTIONS: ---
|
||||
# REQUIREMENTS: lib_utils.sh
|
||||
# BUGS: ---
|
||||
# NOTES: ---
|
||||
# AUTHOR: Roan "Rho`n" Horning (roan.horning@gmail.com),
|
||||
# ORGANIZATION:
|
||||
# CREATED: 03/03/2023 09:26:29 PM
|
||||
# REVISION: ---
|
||||
# LICENSE: GNU AGPLv3
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
#===============================================================================
|
||||
|
||||
set -o nounset # Treat unset variables as an error
|
||||
|
||||
BASEDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
#
|
||||
# Load library functions
|
||||
#
|
||||
LIB="$BASEDIR/lib_utils.sh"
|
||||
[ -e $LIB ] || { echo "Unable to load functions.\n$LIB not found."; exit; }
|
||||
source $LIB
|
||||
|
||||
WORKING_DIR=`make_working_dir`
|
||||
|
||||
download_hpr_sql $WORKING_DIR
|
||||
|
||||
make_hpr_sqlite_db $WORKING_DIR
|
||||
|
||||
copy_to_public_dir $WORKING_DIR `pwd`
|
||||
|
||||
mv hpr.sql public_html/
|
||||
|
||||
echo "Update static HTML files"
|
||||
|
||||
# Clean up previously generated files
|
||||
rm -rf public_html/*.html public_html/correspondents public_html/eps public_html/series
|
||||
|
||||
git restore public_html/will-my-show-be-of-interest-to-hackers.html
|
||||
|
||||
# stash changes to configuration file to preserve DB settings
|
||||
git stash
|
||||
|
||||
git pull
|
||||
|
||||
git stash pop
|
||||
|
||||
./site-generator --quiet --all
|
||||
|
||||
clean_working_dir $WORKING_DIR
|