Compare commits
430 Commits
I30-Series
...
newsite
Author | SHA1 | Date | |
---|---|---|---|
c68a7f12a2
|
|||
0b977264dc
|
|||
38b4a704f9
|
|||
9dce59fdee
|
|||
65528d2025
|
|||
ec8335daab
|
|||
7f559f26e3
|
|||
82ee6c808c
|
|||
a5c73f5874
|
|||
829bdb7708
|
|||
91000b7c6f
|
|||
80315d296c
|
|||
69b26429a8
|
|||
51ed253bbd
|
|||
fcd73c05d7
|
|||
71c1c46cfb
|
|||
991f088ded
|
|||
ebe230ee0a
|
|||
da62e4ec51
|
|||
34d13fa0c6
|
|||
e21f434c2a | |||
e2c591edff | |||
28a75efe1b | |||
94baef679f | |||
11738f5052 | |||
|
c9e1446f1f | ||
|
bbf5c26dab | ||
|
2ca4d32282 | ||
|
cbe3dd4e0d | ||
a8b205ed2c | |||
013beca3c0 | |||
|
86e1d73085 | ||
dcd05d0e9b | |||
6d59372077
|
|||
beb5814d5d | |||
6c7712be71 | |||
|
09f69164d0 | ||
bf7178b79f | |||
|
c4e875548c | ||
ed85c81396 | |||
6f8c5c7141 | |||
|
0ebc67addb | ||
|
808386bccc | ||
28af8900a3 | |||
54ed57fd1a | |||
|
65e6464add | ||
|
71f1a8b8c3 | ||
37c45e0384 | |||
|
e750e33301 | ||
45dd69d855
|
|||
f58e25a685
|
|||
1cec6b45f0
|
|||
|
17b3416dd2 | ||
f135b1119a
|
|||
15547a2e87
|
|||
|
b572673c93 | ||
|
6642e9adae | ||
|
334d60f179 | ||
|
3b692f8926 | ||
|
c3ee7200c3 | ||
|
d898849cd8 | ||
|
59725eae4e | ||
|
77c694b3e8 | ||
280ece7a52 | |||
70dbb06122 | |||
2c8845ceb9 | |||
|
f34f762fef | ||
54f6f6a365 | |||
def745b564 | |||
97487216c8 | |||
3409cff8be | |||
|
a8b52d49fe | ||
146107b122
|
|||
|
35e58959ea | ||
b3617bf6ed | |||
|
b881afa4e9 | ||
|
794cf5cade | ||
0aab4c22bb | |||
|
73740b8ffb | ||
c1078d9b9c
|
|||
27caa97c7d
|
|||
c32a343728
|
|||
7d07b8b814
|
|||
a38c8e2705
|
|||
|
d456de5663 | ||
|
3ba76e8cd3 | ||
|
c1be07780f | ||
dcea8a374b
|
|||
5cfb37cae2
|
|||
85258d03ba
|
|||
|
270b4c0584 | ||
ef17c94d58
|
|||
|
c19030787a | ||
|
8884a8517a | ||
|
f68375dd5f | ||
|
7f604025e9 | ||
|
61de606208 | ||
|
a58934acbf | ||
9a83c13daf
|
|||
e4e1813bc0
|
|||
b802a8a7b2
|
|||
84d868cf25
|
|||
8f31864b83
|
|||
2b0b02ecb7
|
|||
9655c56ee6
|
|||
87b7f7bde6
|
|||
69f19976fd
|
|||
6062cfd6b4
|
|||
51adbcd938
|
|||
7cd0cc3056
|
|||
d1539a3ca2
|
|||
ad89f1fb4f
|
|||
6b2a324730
|
|||
e8f01ba5c5
|
|||
68e51c0a32
|
|||
|
a3e722589f | ||
85d43851d1
|
|||
8b277607cf
|
|||
|
39d2ef86ad | ||
|
0f5d8650b3 | ||
0e1ddf7006
|
|||
7ac6a8c51f
|
|||
|
12166b507b | ||
|
1ec5e78482 | ||
|
24e1177c45 | ||
20409e9521
|
|||
f377f56002
|
|||
|
73dd71f2f0 | ||
|
06601c5d20 | ||
|
eedd954a11 | ||
|
a3b927f802 | ||
|
1853715a19 | ||
b17daba4ed
|
|||
70d5983ede
|
|||
31a5994731
|
|||
aaaaa29d8e
|
|||
3662ebd0aa
|
|||
c64ad492c8
|
|||
0f57b99fbe
|
|||
48b3c51bb3
|
|||
4e9f1457d5
|
|||
4ae854f5e1
|
|||
af810c88bc
|
|||
|
92dce90753 | ||
|
65e4e1af5e | ||
|
b5384408db | ||
|
1a84becd8d | ||
|
d74c23bace | ||
|
f1817e6820 | ||
|
493bae282b | ||
|
dbc557d4c5 | ||
|
2099f0e130 | ||
|
29c9c827a4 | ||
|
c72c813b02 | ||
|
966a94647d | ||
e090bf8498 | |||
|
4d1d4c8c1d | ||
99aee89698 | |||
|
f6f2c01202 | ||
797039d182 | |||
|
93f22fb266 | ||
|
eb0b752841 | ||
4c19b56643 | |||
9766ec2c36 | |||
392f9ba9e5 | |||
41979786eb | |||
|
a61f2a5222 | ||
|
ccba560ee3 | ||
|
a2c69ec898 | ||
|
1382fe5e2a | ||
54ba2dc318 | |||
c2c2cb0cc2 | |||
|
5ec9fd21e9 | ||
|
d053ec253a | ||
|
db6c0bedaa | ||
0c000b17b9 | |||
1853af5521 | |||
f4530a3f48 | |||
|
5b2b2ce6d0 | ||
6d8bdaa7a9 | |||
2713664f86 | |||
eacd1e8425 | |||
|
138c1e2d2b | ||
|
b69cb913ea | ||
|
467a14a72a | ||
|
69dcb66d05 | ||
|
1e451e156d | ||
|
7c98273236 | ||
|
fcf624dc22 | ||
|
fc096c6fa6 | ||
|
d34064d787 | ||
|
4287028e25 | ||
|
67f28d43e3 | ||
|
dc36d9de86 | ||
|
96642bc69f | ||
|
f432954891 | ||
|
3f32a39301 | ||
|
7d8af97f7d | ||
130f603748 | |||
|
eba235c503 | ||
|
8bcf6bd0e8 | ||
|
15cd9018b0 | ||
|
e5b5aac104 | ||
|
0ef92840c8 | ||
|
79a788bda9 | ||
|
2e151ebae9 | ||
|
097b50b30b | ||
|
8325b2c0d1 | ||
|
a49bd6b08d | ||
|
c8135d811d | ||
|
dab80f1772 | ||
|
3ccd6101ee | ||
|
51d328203b | ||
|
366729a827 | ||
|
faac8c202e | ||
|
3cf2f3a8e1 | ||
|
83bb04f25c | ||
|
383ef45bb7 | ||
|
68c5e91552 | ||
|
35fa97e120 | ||
|
47a7493ef2 | ||
|
b4448caf16 | ||
|
8e6c44c46c | ||
|
aba463099c | ||
|
3396413321 | ||
d1832ae619 | |||
4c239f4f67 | |||
796ee598e9 | |||
4b2a030a5b | |||
7009533e25 | |||
|
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
|
215
GETTING_STARTED.md
Normal file
@@ -0,0 +1,215 @@
|
||||
# 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/HPR/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 that the [gcc](https://www.gnu.org/software/gcc/),
|
||||
[make](https://www.gnu.org/software/make/manual/make.html),
|
||||
and [cpan](https://perldoc.perl.org/CPAN) commands are available.
|
||||
Install them using the operating system's package manager, or from source.
|
||||
|
||||
Run commands:
|
||||
|
||||
```
|
||||
cpan Config::Std
|
||||
cpan Template
|
||||
cpan Template::Plugin::DBI
|
||||
cpan Template::Plugin::HTML::Strip
|
||||
cpan DBD::SQLite
|
||||
cpan Date::Calc
|
||||
cpan Tie::DBI
|
||||
cpan Text:CSV_XS
|
||||
```
|
||||
|
||||
## Testing for Perl module dependencies
|
||||
|
||||
A bash script is included in the utils directory that will list the Perl modules used by the site-generator and report whether the modules are installed on the current OS.
|
||||
|
||||
It can be run from any directory. To run from the utils directory:
|
||||
|
||||
```
|
||||
./check-dependencies.sh
|
||||
```
|
||||
|
||||
# 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-hpr-db.sh script in the utils directory
|
||||
automates the above steps (including downloading the hpr.sql file).
|
||||
From the root of the local hpr_generator repository run:
|
||||
|
||||
`./utils/update-hpr-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/HPR/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
|
||||
```
|
58
README.md
@@ -3,51 +3,77 @@ 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
|
||||
* Getopt::Long
|
||||
* Pod::Usage
|
||||
* Config::Std
|
||||
* Template
|
||||
* Template::Plugin::File
|
||||
* Template::Plugin::DBI
|
||||
* Template::Plugin::Date
|
||||
* Template::Plugin::HTML::Strip
|
||||
* DBI
|
||||
* Tie::DBI
|
||||
* DBD::SQLite
|
||||
* DBD::SQLite or DBD::mysql
|
||||
* Date::Calc
|
||||
* Text::CSV_XS
|
||||
* HTML::Entities
|
||||
|
||||
* See the [Getting Started](GETTING_STARTED.md) tutorial for more details on
|
||||
installing the HPR generator.
|
||||
|
||||
## Usage
|
||||
Generate two specific pages:
|
||||
`site-generator index about`
|
||||
`site-generator index about`
|
||||
|
||||
Generate the whole site:
|
||||
`site-generator --all`
|
||||
`site-generator --all`
|
||||
|
||||
Generate pages based on the same template:
|
||||
`site-generator correspondent=1,3,5..10`
|
||||
|
||||
## Support
|
||||
Please [submit an Issue](https://repo.anhonesthost.net/rho_n/hpr_generator/issues),
|
||||
Please [submit an Issue](https://repo.anhonesthost.net/HPR/hpr_generator/issues),
|
||||
and add the label "**Help Request**" for help running or installing the site-generator.
|
||||
|
||||
For discussing HPR site generation in general, please [submit an Issue](https://repo.anhonesthost.net/rho_n/hpr_generator/issues) and add the label "**General Discussion**".
|
||||
For discussing HPR site generation in general, please [submit an Issue](https://repo.anhonesthost.net/HPR/hpr_generator/issues) and add the label "**General Discussion**".
|
||||
|
||||
## Contributing
|
||||
Happy to take any contributions or suggestions.
|
||||
|
||||
To contribute code or documentation, please create a fork of the project and [submit a pull request](https://repo.anhonesthost.net/rho_n/hpr_generator/pulls) or send a patch. If an issue exists that is related to your patch, please assign the issue to yourself, or if it is already assigned to someone else, please coordinate with them to minimize duplicated efforts.
|
||||
To contribute code or documentation, please create a fork of the project and [submit a pull request](https://repo.anhonesthost.net/HPR/hpr_generator/pulls) or send a patch. If an issue exists that is related to your patch, please assign the issue to yourself, or if it is already assigned to someone else, please coordinate with them to minimize duplicated efforts.
|
||||
|
||||
If you have found an error in the code or the generated HTML, please [submit an Issue](https://repo.anhonesthost.net/rho_n/hpr_generator/issues),
|
||||
If you have found an error in the code or the generated HTML, please [submit an Issue](https://repo.anhonesthost.net/HPR/hpr_generator/issues),
|
||||
and add the label "**Bug Found**".
|
||||
|
||||
To make a suggestion, please [submit an Issue](https://repo.anhonesthost.net/rho_n/hpr_generator/issues),
|
||||
To make a suggestion, please [submit an Issue](https://repo.anhonesthost.net/HPR/hpr_generator/issues),
|
||||
and add the label "**Feature Request**".
|
||||
|
||||
## Authors and acknowledgment
|
||||
* Roan "Rho`n" Horning
|
||||
* Roan "Rho`n" Horning
|
||||
* Dave Morriss
|
||||
* gordons
|
||||
* Ken Fallon
|
||||
* norrist
|
||||
|
||||
|
BIN
public_html/css/bebas/BebasNeue.otf
Normal file
BIN
public_html/css/bebas/BebasNeue.woff
Normal file
BIN
public_html/css/bebas/BebasNeueLight.otf
Normal file
BIN
public_html/css/gnutypewriter/GNUTypewriter.odt
Normal file
BIN
public_html/css/gnutypewriter/GNUTypewriter.pdf
Normal file
27342
public_html/css/gnutypewriter/GNUTypewriter.sfd
Normal file
BIN
public_html/css/gnutypewriter/gtw.otf
Normal file
BIN
public_html/css/gnutypewriter/gtw.ttf
Normal file
BIN
public_html/css/gnutypewriter/gtw.woff
Normal file
@@ -1,262 +1,326 @@
|
||||
@charset "utf-8";
|
||||
/* Website design Copyright Ken Fallon - Released into the public domain/
|
||||
|
||||
http://creativecommons.org/publicdomain/
|
||||
https://creativecommons.org/publicdomain/
|
||||
|
||||
*/
|
||||
/*
|
||||
* See the following for the modern CSS responsive design techniques used in this file:
|
||||
* - MDN web docs: Responsive design
|
||||
* -- https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Responsive_Design
|
||||
* - Matthew James Tayler: Responsive Font Size (Optimal Text at Every Breakpoint)
|
||||
* -- https://matthewjamestaylor.com/responsive-font-size
|
||||
* - CSS-Tricks: Linearly Scale font-size with CSS clamp() Based on the Viewport
|
||||
* -- https://css-tricks.com/linearly-scale-font-size-with-css-clamp-based-on-the-viewport/
|
||||
*/
|
||||
@font-face {
|
||||
font-family: "GNUTypewriter";
|
||||
src:
|
||||
local("GNUTypewriter"),
|
||||
url("/css/gnutypewriter/gtw.woff") format("woff");
|
||||
}
|
||||
@font-face {
|
||||
font-family: "BebasNeue";
|
||||
src:
|
||||
local("BebasNeue"),
|
||||
url("/css/bebas/BebasNeue.woff") format("woff");
|
||||
}
|
||||
:root {
|
||||
--background-primary: #dfdfdf;
|
||||
--text-primary: #4d4d4d; /* HPR Grey */
|
||||
--banner-text-primary: #000000;
|
||||
--background-secondary: #4d4d4d;
|
||||
--text-secondary: #dfdfdf;
|
||||
--link-primary: #004852 /*#154a60*/;
|
||||
--link-primary-hover: #f8961e;
|
||||
--link-secondary: #a8f8ff;
|
||||
--link-secondary-hover: #f9e9c2;
|
||||
|
||||
p.meta span label { font-weight: bold; }
|
||||
@media only screen and (min-width: 479px) {
|
||||
--link-spacing-horizontal: clamp(0.5rem, -0.25rem + 3vw, 2.5rem);
|
||||
|
||||
body {background: #dfdfdf;}
|
||||
div, h1, h2, h3, h4, h5, h6, p, ul, ol, li, dl, dt, dd, img, form, fieldset, input, textarea, blockquote {
|
||||
font-family: Verdana, Arial, Helvetica, sans-serif;/* 1em/1.5 OpenDyslexic, */
|
||||
color: #4D4D4D; /* HPR Grey */
|
||||
background: white;
|
||||
--font-family-hpr: Verdana, Arial, Helvetica, sans-serif; /* 1em/1.5 OpenDyslexic, */;
|
||||
--font-size-default: clamp(1rem, 15px + 0.3vw, 1.07rem);
|
||||
|
||||
/* screen breakpoints */
|
||||
--for-phone-only: 599px;
|
||||
--for-tablet-portrait-up: 600px;
|
||||
--for-tablet-landscape-up: 900px;
|
||||
--for-desktop-up: 1200px;
|
||||
--for-big-desktop-up: 1800px;
|
||||
}
|
||||
|
||||
|
||||
#container {
|
||||
width: 100%;
|
||||
max-width: 58em;
|
||||
margin: auto;
|
||||
overflow: hidden;
|
||||
padding: .5em;
|
||||
border: thin solid;
|
||||
background: white;
|
||||
html {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
body {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: flex-start;
|
||||
background-color: var(--background-primary);
|
||||
color: var(--text-primary);
|
||||
font-size: 1rem; /* fallback for browsers that don't support the clamp function) */
|
||||
font-size: var(--font-size-default);
|
||||
font-family: var(--font-family-hpr);
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
.shadow {
|
||||
-moz-box-shadow: 2px 3px 6px 3px #675958;
|
||||
-webkit-box-shadow: 2px 3px 6px 3px #675958;
|
||||
box-shadow: 2px 3px 6px 3px #675958;}
|
||||
|
||||
#hprlogo {
|
||||
display: block;
|
||||
position: relative;
|
||||
top: 0;
|
||||
left: 0;
|
||||
border: 0;
|
||||
margin: 0.75em;
|
||||
float:left;
|
||||
body > nav {
|
||||
background-color: var(--background-secondary);
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
body > nav a {
|
||||
color: var(--link-secondary);
|
||||
}
|
||||
body > nav a:hover {
|
||||
color: var(--link-secondary-hover);
|
||||
}
|
||||
body > nav ul {
|
||||
background-color: inherit;
|
||||
color: inherit;
|
||||
margin: 0;
|
||||
padding: 0.25rem;
|
||||
}
|
||||
body > nav ul li {
|
||||
display: inline-block;
|
||||
background-color: inherit;
|
||||
color: inherit;
|
||||
line-height: 1.0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
padding-right: var(--link-spacing-horizontal);
|
||||
}
|
||||
body > nav ul li a {
|
||||
padding: 0.25rem 0;
|
||||
}
|
||||
body > header {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-flow: wrap;
|
||||
justify-content: space-between;
|
||||
padding: 0.25rem;
|
||||
background-image: url("/images/main-header-background.png");
|
||||
background-size: cover;
|
||||
color: var(--banner-text-primary);
|
||||
align-items: center;
|
||||
}
|
||||
body > header > * {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
flex: 1 1 auto;
|
||||
padding: 0.5rem;
|
||||
background-image: none;
|
||||
}
|
||||
body > main {
|
||||
flex: 1 0 auto;
|
||||
padding: 0.25rem;
|
||||
}
|
||||
body > footer {
|
||||
flex: 0 1 auto;
|
||||
background-color: var(--background-secondary);
|
||||
color: var(--text-secondary);
|
||||
padding: 0.25rem;
|
||||
text-align: center
|
||||
}
|
||||
body > footer hr:first-child {
|
||||
display: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
body > footer a {
|
||||
color: var(--link-secondary);
|
||||
}
|
||||
body > footer a:hover {
|
||||
color: var(--link-secondary-hover);
|
||||
}
|
||||
div,
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6,
|
||||
p,
|
||||
ul,
|
||||
ol,
|
||||
li,
|
||||
dl,
|
||||
dt,
|
||||
dd,
|
||||
img,
|
||||
form,
|
||||
fieldset,
|
||||
input,
|
||||
textarea,
|
||||
blockquote {
|
||||
font-family: inherit;
|
||||
color: inherit;
|
||||
background: inherit;
|
||||
}
|
||||
|
||||
#hpr_banner {
|
||||
display: block;
|
||||
position: relative;
|
||||
border: 0;
|
||||
margin: 0.75em;
|
||||
float: left;
|
||||
h1 {
|
||||
font-size: 1.5rem;
|
||||
margin: 1.25rem 0 0.75rem 0;
|
||||
}
|
||||
|
||||
#hpr_banner h1 {margin: -.25em 0em -.5em 0em;}
|
||||
#hpr_banner h2 {font-size: 100%; font-weight: lighter; }
|
||||
#hpr_banner h3 {font-size: 90%; font-weight: lighter; }
|
||||
|
||||
#accessible_menu {
|
||||
font-size: small;
|
||||
h2,
|
||||
article * h1,
|
||||
section > header:first-child {
|
||||
font-size: 1.45rem;
|
||||
margin: 1.25rem 0 0.75rem 0;
|
||||
}
|
||||
|
||||
/* The main navigation menu */
|
||||
.menu {
|
||||
background: #4D4D4D; /* HPR Grey */
|
||||
text-align: Left;
|
||||
clear:both; /* Forces the menu to appear after the HPR Header block */
|
||||
padding: 0em 0em;
|
||||
margin: 0em 0em;
|
||||
h3,
|
||||
article * h2 {
|
||||
font-size: 1.25rem;
|
||||
margin: 1.25rem 0 0.75rem 0;
|
||||
}
|
||||
|
||||
.menu ul ul { /* Causes the sub menus not to be displayed, until hover shows them */
|
||||
display: none;
|
||||
h4,
|
||||
article * h3 {
|
||||
font-size: 1.15rem;
|
||||
margin: 1.25rem 0 0.75rem 0;
|
||||
}
|
||||
|
||||
#main_menu li a {display: block;}
|
||||
|
||||
.menu ul li { padding: .25em 0em;}
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.menu ul { /* The menu bar background across screen */
|
||||
background: #4D4D4D; /* HPR Grey */
|
||||
color: white;
|
||||
padding: 0 10px; /* Keeps sub menus to the left */
|
||||
list-style: none;
|
||||
position: relative;
|
||||
margin: 0;
|
||||
display: inline-table;
|
||||
ul {
|
||||
padding-left: 1.15rem;
|
||||
}
|
||||
|
||||
.menu ul:after { /* Forces the dropdown to be a block with non float */
|
||||
content: "";
|
||||
clear: both;
|
||||
display: block;
|
||||
li {
|
||||
line-height: 1.25;
|
||||
}
|
||||
|
||||
.menu ul li {
|
||||
background: #4D4D4D; /* HPR Grey */
|
||||
color: white;
|
||||
float: left;
|
||||
padding: .5em 1em;
|
||||
a {
|
||||
text-decoration: none;
|
||||
color: var(--link-primary);
|
||||
}
|
||||
|
||||
.menu ul li a {
|
||||
background: #4D4D4D; /* HPR Grey */
|
||||
color: white;
|
||||
display: block;
|
||||
text-decoration: none;
|
||||
a:hover {
|
||||
cursor: pointer;
|
||||
color: var(--link-primary-hover);
|
||||
}
|
||||
|
||||
.menu ul ul {
|
||||
background: #4D4D4D; /* HPR Grey */
|
||||
color: white;
|
||||
padding: 0;
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
}
|
||||
|
||||
.menu ul ul li {
|
||||
background: #4D4D4D; /* HPR Grey */
|
||||
color: white;
|
||||
float: none;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.menu ul ul ul {
|
||||
position: absolute;
|
||||
left: 100%;
|
||||
top:0;
|
||||
}
|
||||
|
||||
|
||||
hr {
|
||||
background: #4D4D4D; /* HPR Grey */
|
||||
border: 0;
|
||||
height: 0.25em;
|
||||
background: #4D4D4D;
|
||||
border: 0;
|
||||
height: 0.25em;
|
||||
}
|
||||
|
||||
/* The multi colum footer layout */
|
||||
|
||||
#footer_page {
|
||||
width:100%;
|
||||
audio {
|
||||
padding: 0.7em 0em 0.5em 0em;
|
||||
clear: both;
|
||||
position: relative;
|
||||
z-index: auto;
|
||||
}
|
||||
|
||||
.column {
|
||||
width:12%;
|
||||
background-color: white;
|
||||
color: #4D4D4D; /* HPR Grey */
|
||||
float:left;
|
||||
margin:0 10px;
|
||||
display: block;
|
||||
.audcredit {
|
||||
font-size: 75%;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
.column li {
|
||||
list-style:none;
|
||||
padding: .25em 0em;
|
||||
font-size: 85%;
|
||||
p.meta {
|
||||
line-height: 1.25;
|
||||
}
|
||||
|
||||
.thick_bar {
|
||||
width:100%;
|
||||
background-color: #4D4D4D; /* HPR Grey */
|
||||
color: white;
|
||||
float:left;
|
||||
clear: both;
|
||||
height:1.5em;
|
||||
padding: .5em 0em .5em 0em;
|
||||
font-size: 1em;
|
||||
margin: 1em 0em 1em 0em;
|
||||
p.meta span label {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#more_info {margin: auto;}
|
||||
nav.column { display: block; padding: 0em 1em 0em 1em;}
|
||||
#copyright {
|
||||
font-size: small;
|
||||
width:100%;
|
||||
float:left;
|
||||
}
|
||||
|
||||
article, #copyright p {
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
audio {padding: .7em 0em .5em 0em; clear: both; position: relative; z-index:auto;}
|
||||
.audcredit { font-size: 75%;margin-bottom: 1em;}
|
||||
h1.showtitle { font-size: 125%;}
|
||||
|
||||
/* Full Index Page styling */
|
||||
#index_full h2.title {
|
||||
font-weight: lighter;
|
||||
margin-bottom: -.5em;
|
||||
padding: .5em 0em 0em 0em;
|
||||
font-size: 110%;}
|
||||
|
||||
#index_full p.meta {font-size: 85%;}
|
||||
|
||||
#small {
|
||||
font-size: small;
|
||||
}
|
||||
|
||||
p.author { font-size: 85%;}
|
||||
p.shownotes { padding: .5em;}
|
||||
#maincontent footer p { font-size: 75%; margin-bottom: 1em;}
|
||||
/* link styling */
|
||||
a:link {text-decoration: none;}
|
||||
|
||||
table {
|
||||
width:100%;
|
||||
}
|
||||
table, th, td {
|
||||
border-collapse: collapse;
|
||||
padding: 2px;
|
||||
text-align: left;
|
||||
}
|
||||
table#t01, table#t01 th, table#t01 td {
|
||||
border: 1px solid black;
|
||||
}
|
||||
table#t01 th, table#t01 td {
|
||||
padding: 5px;
|
||||
text-align: left;
|
||||
}
|
||||
table#t01 tr:nth-child(even) {
|
||||
background-color: #eee;
|
||||
}
|
||||
table#t01 tr:nth-child(odd) {
|
||||
background-color:#fff;
|
||||
}
|
||||
table#t01 th {
|
||||
background-color: #4D4D4D;
|
||||
color: white;
|
||||
}
|
||||
|
||||
pre { /* Add background, border and scrollbar to <pre> */
|
||||
background: #eee;
|
||||
border: 1px solid #ddd;
|
||||
overflow: auto;
|
||||
clear: both;
|
||||
}
|
||||
.lane {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.5rem;
|
||||
|
||||
}
|
||||
a.lane-button {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
margin: 0.5rem var(--link-spacing-horizontal);
|
||||
padding: 0.5rem;
|
||||
border-width: 5px;
|
||||
border-color: var(--link-primary);
|
||||
border-style: solid;
|
||||
border-radius: 5px;
|
||||
text-align: center;
|
||||
|
||||
@media only screen and (max-width: 680px) {
|
||||
#container {width: 95%;}
|
||||
img#hprlogo {float: left; max-width: 85px; padding: .35em;}
|
||||
.column {width: 15%;}
|
||||
h1 {font-size: 140%;}
|
||||
h2 {font-size: 120%;}
|
||||
h3 {font-size: 100%;}
|
||||
nav.column { display: block; padding: 0em .25em 0em .25em;}
|
||||
#footer_page li {font-size: 85%; padding: .5em .25em .5em .25em;}
|
||||
footer p {font-size: 75%;}
|
||||
audio {float: none; }
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 479px) {
|
||||
body {background: #ffffff; color: #4D4D4D; font-family: Verdana, Arial, Helvetica, sans-serif;/* 1em/1.5 OpenDyslexic, */}
|
||||
li {font-size: 100%; padding: .75em 0em .75em 0em; margin-left: -.25em;}
|
||||
img#hprlogo {float: left; max-width: 65px; padding: .35em;}
|
||||
.column {width: auto;}
|
||||
h1#sitename { clear: both;}
|
||||
a:link {text-decoration: none;}
|
||||
audio {padding: .7em 0em .5em 0em; width: 95%; max-width: 300px;}
|
||||
.audcredit { font-size: 65%; margin-bottom: 1em;}
|
||||
a.lane-button img {
|
||||
height: 110px;
|
||||
filter: invert(60%) sepia(50%) hue-rotate(140deg) saturate(200%);
|
||||
transform: scaleX(0.9);
|
||||
}
|
||||
#tag_line,
|
||||
#title {
|
||||
text-transform: uppercase;
|
||||
}
|
||||
#tag_line {
|
||||
line-height: 1;
|
||||
}
|
||||
#tag_line *,
|
||||
#title * {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
#title h1 {
|
||||
font-size: 7.5rem;
|
||||
letter-spacing: -0.65rem;
|
||||
line-height: 0.75;
|
||||
}
|
||||
#tag_line h2 {
|
||||
text-transform: uppercase;
|
||||
font-family: "BebasNeue", sans-serif;
|
||||
font-size: 1.15rem;
|
||||
letter-spacing: 0.05rem;
|
||||
}
|
||||
#tag_line h2:first-child {
|
||||
font-size: 2rem;
|
||||
}
|
||||
#tag_line h3 {
|
||||
text-transform: capitalize;
|
||||
font-size: 1.15rem;
|
||||
}
|
||||
#site_url {
|
||||
font-family: "GNUTypewriter", monospace;
|
||||
text-transform: none;
|
||||
}
|
||||
@media (min-width: 900px) {
|
||||
#tag_line {
|
||||
text-align: center;
|
||||
}
|
||||
#title h1 {
|
||||
font-size: 7.5rem;
|
||||
letter-spacing: -0.65rem;
|
||||
line-height: 0.75;
|
||||
}
|
||||
#tag_line h2 {
|
||||
font-size: 1.82rem;
|
||||
letter-spacing: 0.05rem;
|
||||
}
|
||||
#tag_line h2:first-child {
|
||||
font-size: 4rem;
|
||||
}
|
||||
#tag_line h3 {
|
||||
font-size: 1.85rem;
|
||||
margin-left: 5rem;
|
||||
}
|
||||
#qr_code {
|
||||
text-align: center;
|
||||
}
|
||||
#qr_code > img {
|
||||
max-height: 195px;
|
||||
}
|
||||
body > main {
|
||||
padding: 0.25rem 2rem;
|
||||
}
|
||||
}
|
||||
|
122
public_html/images/Richard_Querin_atomic-plain.svg
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
public_html/images/hosts/149.png
Normal file
After Width: | Height: | Size: 7.1 KiB |
BIN
public_html/images/hosts/290.png
Normal file
After Width: | Height: | Size: 185 KiB |
BIN
public_html/images/hosts/374.png
Executable file
After Width: | Height: | Size: 2.4 KiB |
BIN
public_html/images/hosts/420.png
Normal file
After Width: | Height: | Size: 383 KiB |
BIN
public_html/images/hosts/421.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
BIN
public_html/images/hosts/425.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
public_html/images/hosts/433.png
Normal file
After Width: | Height: | Size: 8.0 KiB |
BIN
public_html/images/hosts/437.png
Normal file
After Width: | Height: | Size: 182 KiB |
BIN
public_html/images/hosts/441.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
public_html/images/hosts/442.png
Normal file
After Width: | Height: | Size: 109 KiB |
1
public_html/images/icons/calendar-2-line.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M9 1V3H15V1H17V3H21C21.5523 3 22 3.44772 22 4V20C22 20.5523 21.5523 21 21 21H3C2.44772 21 2 20.5523 2 20V4C2 3.44772 2.44772 3 3 3H7V1H9ZM20 11H4V19H20V11ZM8 13V15H6V13H8ZM13 13V15H11V13H13ZM18 13V15H16V13H18ZM7 5H4V9H20V5H17V7H15V5H9V7H7V5Z"/></svg>
|
After Width: | Height: | Size: 339 B |
1
public_html/images/icons/mic-fill.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M11.9998 1C14.7612 1 16.9998 3.23858 16.9998 6V10C16.9998 12.7614 14.7612 15 11.9998 15C9.23833 15 6.99976 12.7614 6.99976 10V6C6.99976 3.23858 9.23833 1 11.9998 1ZM3.05469 11H5.07065C5.55588 14.3923 8.47329 17 11.9998 17C15.5262 17 18.4436 14.3923 18.9289 11H20.9448C20.4837 15.1716 17.1714 18.4839 12.9998 18.9451V23H10.9998V18.9451C6.82814 18.4839 3.51584 15.1716 3.05469 11Z"/></svg>
|
After Width: | Height: | Size: 476 B |
1
public_html/images/icons/question-mark.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M12 19C12.8284 19 13.5 19.6716 13.5 20.5C13.5 21.3284 12.8284 22 12 22C11.1716 22 10.5 21.3284 10.5 20.5C10.5 19.6716 11.1716 19 12 19ZM12 2C15.3137 2 18 4.68629 18 8C18 10.1646 17.2474 11.2907 15.3259 12.9231C13.3986 14.5604 13 15.2969 13 17H11C11 14.526 11.787 13.3052 14.031 11.3989C15.5479 10.1102 16 9.43374 16 8C16 5.79086 14.2091 4 12 4C9.79086 4 8 5.79086 8 8V9H6V8C6 4.68629 8.68629 2 12 2Z"/></svg>
|
After Width: | Height: | Size: 497 B |
1
public_html/images/icons/rss-fill.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M3 3C12.9411 3 21 11.0589 21 21H18C18 12.7157 11.2843 6 3 6V3ZM3 10C9.07513 10 14 14.9249 14 21H11C11 16.5817 7.41828 13 3 13V10ZM3 17C5.20914 17 7 18.7909 7 21H3V17Z"/></svg>
|
After Width: | Height: | Size: 264 B |
1
public_html/images/icons/stack-fill.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M20.0833 10.4999L21.2854 11.2212C21.5221 11.3633 21.5989 11.6704 21.4569 11.9072C21.4146 11.9776 21.3557 12.0365 21.2854 12.0787L11.9999 17.6499L2.71451 12.0787C2.47772 11.9366 2.40093 11.6295 2.54301 11.3927C2.58523 11.3223 2.64413 11.2634 2.71451 11.2212L3.9166 10.4999L11.9999 15.3499L20.0833 10.4999ZM20.0833 15.1999L21.2854 15.9212C21.5221 16.0633 21.5989 16.3704 21.4569 16.6072C21.4146 16.6776 21.3557 16.7365 21.2854 16.7787L12.5144 22.0412C12.1977 22.2313 11.8021 22.2313 11.4854 22.0412L2.71451 16.7787C2.47772 16.6366 2.40093 16.3295 2.54301 16.0927C2.58523 16.0223 2.64413 15.9634 2.71451 15.9212L3.9166 15.1999L11.9999 20.0499L20.0833 15.1999ZM12.5144 1.30864L21.2854 6.5712C21.5221 6.71327 21.5989 7.0204 21.4569 7.25719C21.4146 7.32757 21.3557 7.38647 21.2854 7.42869L11.9999 12.9999L2.71451 7.42869C2.47772 7.28662 2.40093 6.97949 2.54301 6.7427C2.58523 6.67232 2.64413 6.61343 2.71451 6.5712L11.4854 1.30864C11.8021 1.11864 12.1977 1.11864 12.5144 1.30864Z"/></svg>
|
After Width: | Height: | Size: 1.0 KiB |
1
public_html/images/icons/user-fill.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M4 22C4 17.5817 7.58172 14 12 14C16.4183 14 20 17.5817 20 22H4ZM12 13C8.685 13 6 10.315 6 7C6 3.685 8.685 1 12 1C15.315 1 18 3.685 18 7C18 10.315 15.315 13 12 13Z"/></svg>
|
After Width: | Height: | Size: 260 B |
1
public_html/images/icons/volume-up-fill.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M2 16.0001H5.88889L11.1834 20.3319C11.2727 20.405 11.3846 20.4449 11.5 20.4449C11.7761 20.4449 12 20.2211 12 19.9449V4.05519C12 3.93977 11.9601 3.8279 11.887 3.73857C11.7121 3.52485 11.3971 3.49335 11.1834 3.66821L5.88889 8.00007H2C1.44772 8.00007 1 8.44778 1 9.00007V15.0001C1 15.5524 1.44772 16.0001 2 16.0001ZM23 12C23 15.292 21.5539 18.2463 19.2622 20.2622L17.8445 18.8444C19.7758 17.1937 21 14.7398 21 12C21 9.26016 19.7758 6.80629 17.8445 5.15557L19.2622 3.73779C21.5539 5.75368 23 8.70795 23 12ZM18 12C18 10.0883 17.106 8.38548 15.7133 7.28673L14.2842 8.71584C15.3213 9.43855 16 10.64 16 12C16 13.36 15.3213 14.5614 14.2842 15.2841L15.7133 16.7132C17.106 15.6145 18 13.9116 18 12Z"/></svg>
|
After Width: | Height: | Size: 785 B |
BIN
public_html/images/livestream.png
Normal file
After Width: | Height: | Size: 405 B |
BIN
public_html/images/main-header-background.png
Normal file
After Width: | Height: | Size: 529 KiB |
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 |
BIN
public_html/images/qr_code_logo.png
Normal file
After Width: | Height: | Size: 53 KiB |
BIN
public_html/press/2011-08-01_hpr-linux-format.png
Normal file
After Width: | Height: | Size: 1.4 MiB |
5091
public_html/press/2013-10-11_Illuminating_Linux_Podcasts.pdf
Normal file
After Width: | Height: | Size: 1.3 MiB |
BIN
public_html/press/2016-06-26_www.podcastawards.com.png
Normal file
After Width: | Height: | Size: 838 KiB |
BIN
public_html/press/2024-07_RSGB_RadCom_Vol_100_Num_07.pdf
Executable file
BIN
public_html/promos/HPRpromoKlaatu.ogg
Executable file
BIN
public_html/promos/HPRpromoNewsCast.ogg
Executable file
BIN
public_html/promos/HPRpromoSkirlet.ogg
Executable file
BIN
public_html/promos/hpr-contributor-promo-basenettheme.ogg
Executable file
BIN
public_html/promos/hpr-contributor-promo-sax.ogg
Executable file
BIN
public_html/promos/hpr-nye-promo.ogg
Executable file
556
site-generator
@@ -1,68 +1,96 @@
|
||||
#!/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.)
|
||||
* Config::Std
|
||||
* DBD::SQLite or DBD:mysql
|
||||
* DBI
|
||||
* Data::Dumper
|
||||
* Date::Calc
|
||||
* GetOpt::Long
|
||||
* HTML::Entities
|
||||
* Pod::Usage
|
||||
* Template
|
||||
* Template::Plugin::DBI
|
||||
* Template::Plugin::Date
|
||||
* Template::Plugin::File
|
||||
* Template::Plugin::HTML::Strip
|
||||
* Text::CSV_XS
|
||||
* Tie::DBI
|
||||
|
||||
=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 +103,332 @@ 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 HTML::Entities qw(encode_entities);
|
||||
use Date::Calc;
|
||||
use DBI;
|
||||
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";
|
||||
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 => $_[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;
|
||||
$ids = "" unless defined $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]);
|
||||
# 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, 1));
|
||||
}
|
||||
|
||||
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 );
|
||||
encode_entities( $text );
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
# vim: syntax=perl:ts=8:sw=4:et:ai:tw=78:fo=tcrqn21:fdm=marker
|
||||
|
94
site.cfg
@@ -1,10 +1,17 @@
|
||||
# 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:
|
||||
|
||||
# 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 +20,11 @@ password:
|
||||
[root_template]
|
||||
content: page.tpl.html
|
||||
#baseurl: OPTIONAL [i.e. file://<full path to local website directory>]
|
||||
http_baseurl: http://hackerpublicradio.org/
|
||||
hub_baseurl: https://hub.hackerpublicradio.org/
|
||||
media_baseurl: https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/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,10 +60,6 @@ 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
|
||||
|
||||
[correspondent]
|
||||
navigation: navigation-about.tpl.html
|
||||
content: content-correspondent.tpl.html
|
||||
@@ -80,58 +88,48 @@ content: content-episode.tpl.html
|
||||
multipage: true
|
||||
filename: eps/hpr[id]/index.html
|
||||
|
||||
[download]
|
||||
navigation: navigation-get-shows.tpl.html
|
||||
content: content-download.tpl.html
|
||||
|
||||
[syndication]
|
||||
navigation: navigation-get-shows.tpl.html
|
||||
content: content-syndication.tpl.html
|
||||
|
||||
[contribute]
|
||||
navigation: navigation-give-shows.tpl.html
|
||||
content: content-contribute.tpl.html
|
||||
|
||||
[search]
|
||||
navigation: navigation-main.tpl.html
|
||||
content: content-search.tpl.html
|
||||
|
||||
[help_out]
|
||||
navigation: navigation-contribute.tpl.html
|
||||
content: content-help_out.tpl.html
|
||||
|
||||
[download]
|
||||
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
|
||||
|
||||
[theme]
|
||||
navigation: navigation-give-shows.tpl.html
|
||||
content: content-theme.tpl.html
|
||||
|
||||
[requested_topics]
|
||||
navigation: navigation-give-shows.tpl.html
|
||||
content: content-requested_topics.tpl.html
|
||||
|
||||
[recording]
|
||||
navigation: navigation-give-shows.tpl.html
|
||||
content: content-recording.tpl.html
|
||||
|
||||
[request_a_slot]
|
||||
navigation: navigation-give-shows.tpl.html
|
||||
content: content-request_a_slot.tpl.html
|
||||
|
||||
[podcatchers]
|
||||
navigation: navigation-contribute.tpl.html
|
||||
content: content-podcatchers.tpl.html
|
||||
|
||||
[promote]
|
||||
navigation: navigation-about.tpl.html
|
||||
content: content-promote.tpl.html
|
||||
|
||||
[sitemap]
|
||||
navigation: navigation-about.tpl.html
|
||||
content: content-sitemap.tpl.html
|
||||
|
||||
[tags]
|
||||
navigation: navigation-main.tpl.html
|
||||
content: content-tags.tpl.html
|
||||
|
||||
[twat_episode]
|
||||
navigation: navigation-get-shows.tpl.html
|
||||
content: content-twat_episode.tpl.html
|
||||
multipage: true
|
||||
filename: eps/twt[id]/index.html
|
||||
|
||||
[mumble-howto]
|
||||
navigation: navigation-about.tpl.html
|
||||
content: content-mumble-howto.tpl.html
|
||||
|
||||
[contact]
|
||||
navigation: navigation-about.tpl.html
|
||||
content: content-contact.tpl.html
|
||||
|
||||
[promote]
|
||||
navigation: navigation-about.tpl.html
|
||||
content: content-promote.tpl.html
|
||||
|
||||
[comments_viewer]
|
||||
navigation: navigation-about.tpl.html
|
||||
content: content-comments_viewer.tpl.html
|
||||
|
||||
[hpr_ogg]
|
||||
root_template: rss.tpl.xml
|
||||
content: rss-hpr.tpl.xml
|
||||
@@ -169,3 +167,7 @@ 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
|
||||
|
43
templates/content-comments_viewer.tpl.html
Normal file
@@ -0,0 +1,43 @@
|
||||
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-listen-now.tpl.html' %-->
|
||||
<!--% PROCESS "queries-episode.tpl.html" %-->
|
||||
<!--% USE DBI(constants.driver) %-->
|
||||
|
||||
<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,4 +1,4 @@
|
||||
<article>
|
||||
<article>
|
||||
<header>
|
||||
<h1>Contact</h1>
|
||||
</header>
|
||||
@@ -6,7 +6,7 @@
|
||||
<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>Website: <a href="http://www.hackerpublicradio.org" target="_blank">www.hackerpublicradio.org</a></li>
|
||||
<li>Mailist: <a href="http://www.hackerpublicradio.org/maillist" target="_blank">Maillist</a></li>
|
||||
<li><a href="https://web.libera.chat/gamja/?channels=oggcastplanet" target="_blank">#oggcastplanet</a></li>
|
||||
<li><a href="https://www.facebook.com/home.php?sk=group_130169220378872¬if_t=group_r2j" target="_blank">Facebook</a></li>
|
||||
@@ -18,4 +18,4 @@
|
||||
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>
|
||||
</article>
|
||||
|
@@ -1,87 +0,0 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% FOREACH correspondents IN DBI.query('
|
||||
SELECT COUNT(hostid) AS \'tally\' FROM hosts;
|
||||
') %-->
|
||||
<h1>So you want to do a podcast ?</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="<!--% absolute_path(baseurl) %-->correspondents/index.html"><!--% correspondents.tally %--></a> people like yourself have done it and so can you.
|
||||
<!--% END %-->
|
||||
</p>
|
||||
<h2>1. Stuff you need to know</h2>
|
||||
<ul>
|
||||
<li>HPR will stop as a project if there are not enough <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#no_shows_no_hpr">Shows</a>.</li>
|
||||
<li>We do not <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#syndication">syndicate</a> shows not produced for HPR.</li>
|
||||
<li>You are agreeing to <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#license">license</a> your show CC BY-SA 4.0.</li>
|
||||
<li>You have <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#permission">permission</a> to redistribute your show in its entirety.</li>
|
||||
<li>Your audio will <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#not_moderated">not be moderated.</a></li>
|
||||
<li>Your show will be signaled as containing <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#explicit">explicit</a> content.</li>
|
||||
<li>You determine where in the <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#schedule">schedule</a> your show will be released.</li>
|
||||
<li>We use <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#utf8">UTF-8</a> end to end.</li>
|
||||
<li>Your show will be heard by an <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#international">International</a> Audience.</li>
|
||||
<li>We also need <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#emergency_queue">emergency</a> shows.</li>
|
||||
<li>You will no longer be allowed to edit HPR pages on <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#wikipedia">Wikipedia</a>.</li>
|
||||
</ul>
|
||||
<p>
|
||||
<a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html">More information.</a>
|
||||
</p>
|
||||
|
||||
<h2>2. Select a Topic</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="<!--% absolute_path(baseurl) %-->eps/index.html">Archive</a> page for examples of shows people have recorded in the past. You can also look at our <a href="<!--% absolute_path(baseurl) %-->requested_topics.html">Requested Topics</a>, or our <a href="<!--% absolute_path(baseurl) %-->series/index.html">Series</a> page to see if you can add your knowledge to the pool.
|
||||
</p>
|
||||
<p>
|
||||
If you are <a href="<!--% absolute_path(baseurl) %-->will-my-show-be-of-interest-to-hackers.html">worried that your show may not be of interest to Hackers then follow this link</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="<!--% absolute_path(baseurl) %-->series/0029.html">how you got into tech</a> as a way to introducing yourself to the community.
|
||||
</p>
|
||||
|
||||
<h2>3. Record your show</h2>
|
||||
<p>
|
||||
Please select <a href="<!--% absolute_path(baseurl) %-->recording.html">more detailed information on how to record a show</a>:
|
||||
</p>
|
||||
<ul>
|
||||
<!-- <li>Recording with the <a href="<!--% absolute_path(baseurl) %-->recording.html#callin_numbers">telephone</a>.</li> -->
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->recording.html#portable_media_player">Recording with a portable media player</a>.</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->recording.html#smart_phone">Recording with a smart phone</a>.</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->recording.html#editing">Recording/Editing using your Computer</a>.</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->recording.html#phone_interviews">Recording Interviews with the Phone</a>.</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->recording.html#round_table">Recording round table discussions</a>.</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->recording.html#background_music">Avoid Bedding/background music</a>.</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->recording.html#encoding">We mix down to Mono</a>.</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->recording.html#no_metadata">No need to add Metadata</a> to the file.</li>
|
||||
</ul>
|
||||
<p>Don't forget to <strong>introduce yourself</strong> in your show.</p>
|
||||
|
||||
<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.
|
||||
</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.
|
||||
</p>
|
||||
<p>
|
||||
<a href="<!--% absolute_path(baseurl) %-->request_a_slot.html">More Information</a>.
|
||||
</p>
|
||||
|
||||
<h2>Questions ?</h2>
|
||||
<p>
|
||||
Got any questions not covered here, then just email <strong>"admin" at "www.hackerpublicradio.org"</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>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="<!--% absolute_path(baseurl) %-->eps/index.html">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>
|
||||
|
@@ -1,50 +1,70 @@
|
||||
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-avatar.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% query_show_count = DBI.prepare('
|
||||
SELECT id
|
||||
FROM eps
|
||||
WHERE eps.hostid = ? ')
|
||||
<!--% PROCESS "queries-correspondent.tpl.html" %-->
|
||||
<!--% USE DBI(constants.driver) %-->
|
||||
<!--% results_hpr_shows = DBI.prepare(query_hpr_shows)
|
||||
%-->
|
||||
<!--% query_shows = DBI.prepare('
|
||||
SELECT
|
||||
eps.id,
|
||||
CASE eps.explicit WHEN 1 THEN \'Explicit\' ELSE \'Clean\' END AS explicit ,
|
||||
<!--% results_hpr_show_count = DBI.prepare(query_hpr_show_count) %-->
|
||||
<!--% hpr_shows_to_count = results_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 ,
|
||||
eps.date, eps.license, eps.duration,
|
||||
eps.title, eps.summary, eps.tags,
|
||||
eps.title, eps.summary, eps.tags,
|
||||
eps.notes,
|
||||
hosts.local_image,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email, hosts.profile,
|
||||
miniseries.name AS series, miniseries.id AS seriesid
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
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>profile:</label> <!--% this_host.profile %--><br><br>
|
||||
<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>
|
||||
<p><a href="<!--% absolute_url(baseurl) %-->about.html#so_you_want_to_record_a_podcast">Become a Correspondent</a></p>
|
||||
|
@@ -1,31 +1,33 @@
|
||||
<!--% 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>
|
||||
<p>For more information on how to become a Correspondent see our <a href="<!--% absolute_url(baseurl) %-->about.html#so_you_want_to_record_a_podcast">contribute</a></center> page. To add a logo here, either email one to admin at hpr or setup your email on <a href="https://en.gravatar.com/">Gravatar</a>. To protect your browsing privacy we gather the images every hour and serve them directly from HPR.<p />
|
||||
<!--% USE DBI(constants.driver) %-->
|
||||
<!--% 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>
|
||||
<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>
|
||||
<p><a href="<!--% absolute_url(baseurl) %-->about.html#so_you_want_to_record_a_podcast">Become a Correspondent</a></p>
|
||||
</article>
|
||||
|
@@ -1,13 +1,12 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<article>
|
||||
<header>
|
||||
<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.
|
||||
The <a href="./eps/index.html">compete episode guide</a> is available to you, and it lists all the shows on one page going right back to the very first episode.
|
||||
</p>
|
||||
<h2>Command line download</h2>
|
||||
<p>
|
||||
@@ -54,4 +53,4 @@
|
||||
<footer>
|
||||
<p>Big to DeepGeek and the team for providing the BitTorrent service.</p>
|
||||
</footer>
|
||||
</article>
|
||||
</article>
|
||||
|
@@ -1,60 +1,136 @@
|
||||
<!--% 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.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><!--% day_and_date(episode.date) %--></span> is flagged as <span><!--% display_explicit(episode.explicit) %--></span> and is released under a <span><!--% episode.license %--> license</span>. <br>
|
||||
<!--% 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>
|
||||
<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 %-->"><a href="/eps/hpr<!--% zero_pad_left(episode.id) %-->/index.html#comment_<!--% comment.id %-->">Comment #<!--% comment_index %--></a> posted on <!--% comment.comment_timestamp %--> by <!--% comment.comment_author_name %--></h5>
|
||||
<h4><!--% comment.comment_title %--></h4>
|
||||
<p class="comment"><!--% comment.comment_text FILTER html_line_break %--></p>
|
||||
<!--% comment_index = comment_index + 1 %-->
|
||||
<!--% END %-->
|
||||
|
||||
<h2>Leave Comment</h2>
|
||||
<p>
|
||||
<strong>Note to Verbose Commenters</strong><br />
|
||||
If you can't fit everything you want to say in the comment below then you really should <a href="<!--% absolute_url(baseurl) %-->about.html#so_you_want_to_record_a_podcast">record</a> a response show instead.
|
||||
</p>
|
||||
<p>
|
||||
<strong>Note to Spammers</strong><br />
|
||||
All comments are moderated. All links are checked by humans. We strip out all html. Feel free to <a href="<!--% absolute_url(baseurl) %-->about.html#so_you_want_to_record_a_podcast">record</a> a show about yourself, or your industry, or any other topic we may find interesting. <em>We also check shows for spam :)</em>.
|
||||
</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 is the <strong>host</strong> of this show?</td>
|
||||
<td>
|
||||
<select required name="hostid" id="hostid">
|
||||
<option value="Spammer" selected="selected">Spammer</option>
|
||||
<option value="Spammer">Linus Torvalds</option>
|
||||
<option value="Spammer">Marie Curie</option>
|
||||
<option value="<!--% episode.hostid %-->"><!--% episode.host %--></option>
|
||||
<option value="Spammer">Alan Turing</option>
|
||||
<option value="Spammer">Terry Pratchett</option>
|
||||
<option value="Spammer">Yuri Gagarin</option>
|
||||
</select>
|
||||
<td>
|
||||
<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.tpl.html" %-->
|
||||
<article>
|
||||
<header>
|
||||
<h1>Complete Archive of Shows.</h1>
|
||||
@@ -6,8 +7,18 @@
|
||||
All this information is available to the public. Scrape if you wish but if we can format the data for you then we're happy to help.
|
||||
</p>
|
||||
</header>
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% FOREACH episodes IN DBI.query('
|
||||
<!--% USE DBI(constants.driver) %-->
|
||||
<!--% FOREACH episodes IN DBI.query(query_episodes)
|
||||
%-->
|
||||
<!--% show_summary(episodes) %-->
|
||||
<p class="listen-in"><!--% display_listen_in(episodes.id) %--></p>
|
||||
<!--% END %-->
|
||||
<h2 id="twt_episodes">Today With a Techie Archived Shows</h2>
|
||||
<p>
|
||||
<!-- Creative Commons License -->
|
||||
<a rel="license" href="https://creativecommons.org/licenses/by-nc-sa/2.5/"><img alt="Creative Commons License" border="0" src="https://creativecommons.org/images/public/somerights20.png" width="88" height="31" /></a><br>The following work is licensed under a <a rel="license" href="https://creativecommons.org/licenses/by-nc-sa/2.5/">Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License</a>.</p>
|
||||
<p>Today With a Techie Radio was brought to you by <a href="https://en.wikipedia.org/wiki/Infonomicon">The Infonomicon Computer Club</a></p>
|
||||
<!--% 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>
|
||||
|
||||
|
@@ -1,11 +0,0 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<h1>Help Out.</h1>
|
||||
<h2>Submit a show</h2>
|
||||
<p>One of the best ways to help out is to <a href="<!--% absolute_path(baseurl) %-->contribute.html">contribute a show</a>. You can find out <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html">everything you need to know here</a>. </p>
|
||||
<h2>Suggest Topics</h2>
|
||||
<p>If there is a technical topic you would like us to cover, or if you are looking for topics to record a show on, then look no further than our <a href="<!--% absolute_path(baseurl) %-->requested_topics.html">Requested topics</a> page.</p>
|
||||
<h2>Podcatcher Support</h2>
|
||||
<p>
|
||||
Please report your experiences with our feeds to admin@hpr. We maintain a podcatcher <a href="<!--% absolute_path(baseurl) %-->podcatchers.html">compatibility list.</a>
|
||||
</p>
|
||||
|
1
templates/content-index-announcement.tpl.html
Normal file
@@ -0,0 +1 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
@@ -1,99 +1,133 @@
|
||||
<!--% PROCESS 'shared-avatar.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<hr>
|
||||
<article>
|
||||
<header>
|
||||
<h3>Welcome to HPR the Community Podcast</h3>
|
||||
</header>
|
||||
<!--% USE date %-->
|
||||
<!--% 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.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 %-->
|
||||
<!--% days_till_next_episode = 0 %-->
|
||||
<!--% USE DBI(constants.driver) %-->
|
||||
<!--% USE date %-->
|
||||
<!--% calc = date.calc %-->
|
||||
<!--% episodes = DBI.query(query_next_available_episode).get_all() %-->
|
||||
<!--% last_date = episodes.0.date.split('-') %-->
|
||||
<!--% offset = (calc.Day_of_Week(last_date.0,last_date.1,last_date.2) == 5 ? 3 : 1) %-->
|
||||
<!--% slot_date = calc.Add_Delta_Days(last_date.0,last_date.1,last_date.2,offset) %-->
|
||||
<!--% now = calc.Today() %-->
|
||||
<!--% days_till_next_episode = calc.Delta_Days(now.0,now.1,now.2,slot_date.0,slot_date.1,slot_date.2) %-->
|
||||
|
||||
<!--% delta = date.calc.N_Delta_YMD(2005,9,19, date.format(date.now, '%Y'),date.format(date.now, '%m'),date.format(date.now, '%d')) %-->
|
||||
<p>We started producing shows as <a href="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>
|
||||
</article>
|
||||
<hr>
|
||||
<section id="welcome">
|
||||
<header>Welcome</header>
|
||||
<p>Hacker Public Radio is a podcast that releases shows every weekday Monday to Friday. The shows are contributed by the public and can be on any topic that is of interest to hackers, makers, hobbyists, etc.</p>
|
||||
<div id="call_for_shows">
|
||||
<!--% display_call_for_shows() %-->
|
||||
</div>
|
||||
</section>
|
||||
<section id="podcast_lane">
|
||||
<header>Podcast</header>
|
||||
<div class="lane">
|
||||
<a class="lane-button" href="<!--% absolute_path(baseurl) %-->about.html#recording_a_podcast">
|
||||
<img src="<!--% absolute_path(baseurl) %-->images/icons/mic-fill.svg" alt="">
|
||||
Record
|
||||
</a>
|
||||
<a class="lane-button" href="https://hub.hackerpublicradio.org/calendar.php">
|
||||
<img src="<!--% absolute_path(baseurl) %-->images/icons/calendar-2-line.svg" alt="">
|
||||
Schedule
|
||||
</a>
|
||||
<a class="lane-button" href="<!--% absolute_path(baseurl) %-->syndication.html">
|
||||
<img src="<!--% absolute_path(baseurl) %-->images/icons/rss-fill.svg" alt="">
|
||||
Subscribe
|
||||
</a>
|
||||
<a class="lane-button" href="<!--% absolute_path(baseurl) %-->eps/index.html">
|
||||
<img src="<!--% absolute_path(baseurl) %-->images/icons/volume-up-fill.svg" alt="">
|
||||
Listen
|
||||
</a>
|
||||
</div>
|
||||
</section>
|
||||
<section id="project_lane">
|
||||
<header>Project</header>
|
||||
<div class="lane">
|
||||
<a class="lane-button" href="<!--% absolute_path(baseurl) %-->correspondents/index.html">
|
||||
<img src="<!--% absolute_path(baseurl) %-->images/icons/user-fill.svg" alt="">
|
||||
Host
|
||||
</a>
|
||||
<a class="lane-button" href="<!--% absolute_path(baseurl) %-->series/index.html">
|
||||
<img src="<!--% absolute_path(baseurl) %-->images/icons/stack-fill.svg" alt="">
|
||||
Series
|
||||
</a>
|
||||
<a class="lane-button" href="<!--% absolute_path(baseurl) %-->about.html">
|
||||
<img src="<!--% absolute_path(baseurl) %-->images/icons/question-mark.svg" alt="">
|
||||
About
|
||||
</a>
|
||||
</div>
|
||||
</section>
|
||||
<section id="latest_lane" class="lane">
|
||||
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
|
||||
<h1>Latest Shows</h1>
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% FOREACH latest_episodes IN DBI.query('
|
||||
<section id="latest_shows">
|
||||
<header>Latest Shows</header>
|
||||
<!--% host_cnt = 0 %-->
|
||||
<ul>
|
||||
<!--% FOREACH latest_episodes IN DBI.query(query_latest_episodes)
|
||||
%-->
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(latest_episodes.id) %-->/index.html">hpr<!--% latest_episodes.id %--> :: <!--% latest_episodes.title %--></a></li>
|
||||
<!--% host_cnt = host_cnt + 1 %-->
|
||||
<!--% END %-->
|
||||
</ul>
|
||||
</section>
|
||||
<section id="latest_comments">
|
||||
<header>Latest Comments</header>
|
||||
<ul>
|
||||
<!--% FOREACH item IN DBI.query('
|
||||
WITH episode_comment_rank AS (
|
||||
SELECT
|
||||
comments.eps_id
|
||||
, comments.id as comment_id
|
||||
, comments.comment_author_name
|
||||
, comments.comment_timestamp
|
||||
, comments.comment_title
|
||||
, RANK() OVER (PARTITION BY eps_id ORDER BY id ) AS comment_number
|
||||
FROM comments
|
||||
)
|
||||
SELECT
|
||||
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
|
||||
episode_comment_rank.*
|
||||
, hosts.host
|
||||
, eps.title AS episode_title
|
||||
, eps.date AS episode_date
|
||||
FROM episode_comment_rank
|
||||
INNER JOIN eps
|
||||
ON episode_comment_rank.eps_id = eps.id
|
||||
INNER JOIN hosts
|
||||
ON eps.hostid = hosts.hostid
|
||||
ORDER BY episode_comment_rank.comment_timestamp DESC
|
||||
LIMIT 10;
|
||||
|
||||
')
|
||||
%-->
|
||||
<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>
|
||||
</header>
|
||||
<!--% 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>
|
||||
</footer>
|
||||
</article>
|
||||
<li>hpr<!--% item.eps_id %--> (<!--% item.episode_date %-->) "<!--% item.episode_title %-->" by <!--% item.host %-->
|
||||
<ul>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(item.eps_id) %-->/index.html#comment_<!--% item.comment_id%-->">Comment <!--% item.comment_number %-->: <!--% item.comment_author_name %--> on <!--% item.comment_timestamp %-->: "<!--% item.comment_title %-->"</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<!--% END %-->
|
||||
<article>
|
||||
<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
|
||||
')
|
||||
%-->
|
||||
<!--% show_summary(last_5_weeks_episodes) %-->
|
||||
<!--% END %-->
|
||||
</article>
|
||||
<h1>Older Shows</h1>
|
||||
<p>
|
||||
Get a <a href="<!--% absolute_path(baseurl) %-->eps/index.html">full list</a> of all our shows.
|
||||
</p>
|
||||
</ul>
|
||||
</section>
|
||||
|
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>
|
@@ -1,151 +0,0 @@
|
||||
<h1>Podcast Clients Test Status</h1>
|
||||
<table style="width:100%">
|
||||
<caption></caption>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>MP3</th>
|
||||
<th>OGG</th>
|
||||
<th>SPX</th>
|
||||
<th>HTML</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>gPodder</td>
|
||||
<td>OK</td>
|
||||
<td>OK</td>
|
||||
<td>OK</td>
|
||||
<td>?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Bashpodder</td>
|
||||
<td>OK</td>
|
||||
<td>OK</td>
|
||||
<td>OK</td>
|
||||
<td>?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>podget</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Akregator</td>
|
||||
<td>?</td>
|
||||
<td>OK</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>BeyondPod</td>
|
||||
<td>?</td>
|
||||
<td>OK</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>AntennaPod, Version 1.5.2.0</td>
|
||||
<td>OK</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>Reading the itunes:summary which has no html.<br />Should we also enable html here as well - how to fix the 4k limit ?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>PodKicker Pro for Android</td>
|
||||
<td>?</td>
|
||||
<td>FAIL</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>pocketcasts</td>
|
||||
<td>?</td>
|
||||
<td>FAIL</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Podlisten</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Soundwaves</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Podax</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>PodKicker Pro</td>
|
||||
<td>OK</td>
|
||||
<td>FAIL</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>RssDemon</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>newsbeuter</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>iTunes</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>VLC</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="https://github.com/jgoerzen/hpodder/wiki">hpodder</a></td>
|
||||
<td>OK</td>
|
||||
<td>OK</td>
|
||||
<td>OK</td>
|
||||
<td>?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="https://play.google.com/store/apps/details?id=com.podkicker">PodKicker Pro for Android</a></td>
|
||||
<td>OK</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>OK</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
<td>?</td>
|
||||
</tr>
|
||||
</table>
|
@@ -1,12 +1,11 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<article>
|
||||
<article>
|
||||
<header>
|
||||
<h1>Please promote HPR</h1>
|
||||
</header>
|
||||
<p>Feel free to use the promotional material to spread the word in your podcasts, or have them played on to other shows.</p>
|
||||
<h2>General HPR promotion</h2>
|
||||
<ul>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->media/promos/HPRpromoKlaatu.ogg">Klaatu explains HPR Daily podcast by the www.hackerpublicradio.org Community for the www.hackerpublicradio.org Community</a></li>
|
||||
<li><a href="./media/promos/HPRpromoKlaatu.ogg">Klaatu explains HPR Daily podcast by the www.hackerpublicradio.org Community for the www.hackerpublicradio.org Community</a></li>
|
||||
<!--<li><a href="../media/promos/HPRpromoNewsCast.ogg">A News Caster tells us about HPR</a></li>
|
||||
<li><a href="../media/promos/HPRpromoSkirlet.ogg">Skirlet tells us we need to listen to HPR</a></li>-->
|
||||
</ul>
|
||||
@@ -14,10 +13,10 @@
|
||||
<h2>Requests for contributions</h2>
|
||||
<p>
|
||||
<ul>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->media/promos/Jude-aka-Mrs_Peter64_HPR-needs-shows.flac">Jude Mrs. Peter64 HPR needs shows</a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->media/promos/hpr-contributor-promo-sax.ogg">slick0 basenet theme</a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->media/promos/hpr-contributor-promo-basenettheme.ogg">slick0 sax roll</a></li>
|
||||
<li><a href="./media/promos/Jude-aka-Mrs_Peter64_HPR-needs-shows.flac">Jude Mrs. Peter64 HPR needs shows</a></li>
|
||||
<li><a href="./media/promos/hpr-contributor-promo-sax.ogg">slick0 basenet theme</a></li>
|
||||
<li><a href="./media/promos/hpr-contributor-promo-basenettheme.ogg">slick0 sax roll</a></li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
</article>
|
||||
</article>
|
||||
|
@@ -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,16 +15,16 @@
|
||||
<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><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>Episodes for the <a href="<!--% absolute_url(baseurl,'series/0007.html') %-->">LPI</a>, or the Networking series.</li>
|
||||
<li><a href="https://web.archive.org/web/20160629174556/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="<!--% 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>
|
||||
|