Compare commits
93 Commits
4e1d525e6e
...
2023-02
Author | SHA1 | Date | |
---|---|---|---|
|
b4e4187902 | ||
431126e8a3
|
|||
|
91ceefd88e | ||
8feb37e831
|
|||
4a34496f24
|
|||
|
f7e54233e2 | ||
59875e772e
|
|||
|
f84ee71b7c | ||
927424901b
|
|||
27a84529c6
|
|||
59549daa63
|
|||
|
ec7a6ce379 | ||
756bdc0fa1
|
|||
b2eaea1eb8
|
|||
|
fe9bf574cf | ||
309ea05c15
|
|||
|
649d6c3746 | ||
e41f6029aa
|
|||
|
4bd7c6f867 | ||
138b0fdd1b
|
|||
d437e66f0e
|
|||
|
a213efa695 | ||
|
314127441c | ||
2a486cb58b
|
|||
7c44f6b680
|
|||
71a63e1beb
|
|||
8e1232517a | |||
cb65d25cfc
|
|||
2b4802508d
|
|||
1312e3d374
|
|||
3cc6da57ad
|
|||
675f8fa9d5
|
|||
6f28bb2a16
|
|||
cb881558ca
|
|||
4e8edf2640
|
|||
|
e86d2c010d | ||
f0fa21ae45
|
|||
0b99483f0d
|
|||
8c3874ad8b
|
|||
6f95a33e67
|
|||
979c8b43e5
|
|||
e3abe5fd68
|
|||
5612eeed42
|
|||
4af117fb7a
|
|||
e1b0189275
|
|||
aad77f3c78
|
|||
be1344e10c
|
|||
|
308d03d63c | ||
0837e11bfe
|
|||
06ace35c41
|
|||
6d0d1b99a6
|
|||
fdeff3879a
|
|||
b667c30d40
|
|||
b08f5c30df
|
|||
|
d8613143d3 | ||
3de4476a3f
|
|||
4984ac3383
|
|||
e4463dc5ba
|
|||
|
bf8bf8daad | ||
1d4e6e15b7
|
|||
d556e28e2d
|
|||
fb70ae6253
|
|||
64ae9c4f86
|
|||
b0d31ee507
|
|||
|
6ac65212d7 | ||
991b3dcec1
|
|||
|
1c9eb16934 | ||
2eaaa11a69
|
|||
3723303e31
|
|||
|
db46938de6 | ||
3054d6519e
|
|||
c6e7a3c239
|
|||
dbf011395c
|
|||
c817e3a17a
|
|||
0edf9cc5a2
|
|||
|
4d34f762d0 | ||
dbd9f8e973
|
|||
|
4fdb32934b | ||
|
5bd96f69e0 | ||
38d2e7c363
|
|||
|
7691209360 | ||
f7216132a4
|
|||
67a8a2bfa4
|
|||
cfd463d2b0
|
|||
91cbc81a12
|
|||
|
c1a83f8baf | ||
3b72fe6d28
|
|||
76b976732b
|
|||
|
bf60d35ed1 | ||
e2cf52af6e
|
|||
414bae101a
|
|||
|
082ea4069d | ||
dfbb4a24db
|
25
README.md
@@ -3,12 +3,22 @@ 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 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 MySQL
|
||||
* Create database hpr_hpr in the MySQL server from HPR dump file.
|
||||
- ``sudo mysql --host=localhost < hpr.sql``
|
||||
* Create a user that will be used by the site-generator.
|
||||
- Suggested username: hpr-generator
|
||||
- ``CREATE USER 'hpr-generator'@'localhost' IDENTIFIED BY '<password>';``
|
||||
* Limit the user's privileges to EXECUTE and SELECT
|
||||
- ``GRANT SELECT ON hpr_hpr.* TO 'hpr-generator'@'localhost';``
|
||||
- ``GRANT EXECUTE ON `hpr_hpr`.* TO 'hpr-generator'@'localhost';``
|
||||
* Install the needed Perl modules using preferred method (distribution packages, CPAN, etc.)
|
||||
* GetOpt
|
||||
* Pod::Usage
|
||||
@@ -18,7 +28,7 @@ Static web page generator for the Hacker Public Radio website.
|
||||
* Template::Plugin::DBI
|
||||
* DBI
|
||||
* Tie::DBI
|
||||
* DBD::SQLite
|
||||
* DBD::SQLite or DBD:mysql
|
||||
* Date::Calc
|
||||
|
||||
## Usage
|
||||
@@ -50,4 +60,3 @@ and add the label "**Feature Request**".
|
||||
|
||||
## Authors and acknowledgment
|
||||
* Roan "Rho`n" Horning
|
||||
|
||||
|
@@ -235,6 +235,17 @@ pre { /* Add background, border and scrollbar to <pre> */
|
||||
clear: both;
|
||||
}
|
||||
|
||||
table.hosts {
|
||||
background: white
|
||||
}
|
||||
table.hosts tr:nth-child(even) { background-color:#cccccc; }
|
||||
table.hosts tr:nth-child(odd) { background-color:white; }
|
||||
table.hosts tr td img { vertical-align:middle }
|
||||
|
||||
pre.comment {
|
||||
white-space: pre-wrap;
|
||||
padding: 2px;
|
||||
line-height: 1.2rem;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 680px) {
|
||||
|
BIN
public_html/images/livestream.png
Normal file
After Width: | Height: | Size: 405 B |
BIN
public_html/images/mumble-howto/01-intro.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
public_html/images/mumble-howto/02-device-selection.png
Normal file
After Width: | Height: | Size: 48 KiB |
BIN
public_html/images/mumble-howto/03-device-tuning.png
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
public_html/images/mumble-howto/04-volume.png
Normal file
After Width: | Height: | Size: 59 KiB |
BIN
public_html/images/mumble-howto/05-ptt.png
Normal file
After Width: | Height: | Size: 48 KiB |
BIN
public_html/images/mumble-howto/06-notts.png
Normal file
After Width: | Height: | Size: 77 KiB |
BIN
public_html/images/mumble-howto/07-positional-audio.png
Normal file
After Width: | Height: | Size: 54 KiB |
BIN
public_html/images/mumble-howto/08-stats.png
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
public_html/images/mumble-howto/09-cert.png
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
public_html/images/mumble-howto/10-finished.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
public_html/images/mumble-howto/11-username.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
public_html/images/mumble-howto/12-accept-cert.png
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
public_html/images/mumble-howto/13-audio-test.png
Normal file
After Width: | Height: | Size: 80 KiB |
BIN
public_html/images/mumble-howto/14-audio-ping.png
Normal file
After Width: | Height: | Size: 80 KiB |
BIN
public_html/images/mumble-howto/15-audio-pong.png
Normal file
After Width: | Height: | Size: 81 KiB |
BIN
public_html/images/mumble-howto/16-hpr-room.png
Normal file
After Width: | Height: | Size: 82 KiB |
BIN
public_html/images/mumble-howto/17-register.png
Normal file
After Width: | Height: | Size: 114 KiB |
BIN
public_html/images/mumble-howto/18-register-confirm.png
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
public_html/images/mumble-howto/20-add-new.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
public_html/images/mumble-howto/21-add-server.png
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
public_html/images/mumble-howto/22-pavucontrol-recording.png
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
public_html/images/mumble-howto/23-pavucontrol-playback.png
Normal file
After Width: | Height: | Size: 29 KiB |
@@ -35,15 +35,27 @@ This is a site generator for the Hacker Public Radio website based upon the Perl
|
||||
|
||||
=head1 INSTALLATION
|
||||
|
||||
With SQLite
|
||||
* 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.)
|
||||
- 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 MySQL
|
||||
* Create database hpr_hpr in the MySQL server from HPR dump file.
|
||||
- sudo mysql --host=localhost < hpr.sql
|
||||
* Create a user that will be used by the site-generator.
|
||||
- Suggested username: hpr-generator
|
||||
- CREATE USER 'hpr-generator'@'localhost' IDENTIFIED BY '<password>';
|
||||
* Limit the user's privileges to EXECUTE and SELECT
|
||||
- GRANT SELECT ON hpr_hpr.* TO 'hpr-generator'@'localhost';
|
||||
- GRANT EXECUTE ON `hpr_hpr`.* TO 'hpr-generator'@'localhost';
|
||||
|
||||
Install the needed Perl modules using preferred method (distribution packages, CPAN, etc.)
|
||||
* GetOpt
|
||||
* Pod::Usage
|
||||
* Config::Std
|
||||
@@ -52,7 +64,7 @@ This is a site generator for the Hacker Public Radio website based upon the Perl
|
||||
* Template::Plugin::DBI
|
||||
* DBI
|
||||
* Tie::DBI
|
||||
* DBD::SQLite
|
||||
* DBD::SQLite or DBD:mysql
|
||||
* Date::Calc
|
||||
|
||||
=head1 AUTHOR
|
||||
@@ -125,6 +137,8 @@ sub main {
|
||||
# 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 'media_hostname' } @page_args;
|
||||
|
||||
};
|
||||
foreach my $page_arg (@page_args) {
|
||||
my %parsed_arg = parse_page_arg($page_arg);
|
||||
@@ -138,8 +152,13 @@ sub main {
|
||||
$page_config->{'root_template'} = $config{root_template}{content};
|
||||
}
|
||||
|
||||
if (exists $config{root_template}{baseurl}) {
|
||||
$page_config->{'baseurl'} = $config{root_template}{baseurl};
|
||||
# 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') {
|
||||
@@ -179,6 +198,7 @@ sub get_template_html (\%@) {
|
||||
PRE_CHOMP => 1,
|
||||
POST_CHOMP => 1,
|
||||
CONSTANTS => {
|
||||
database => $_[0]{database},
|
||||
driver => $_[0]{driver},
|
||||
user => $_[0]{user},
|
||||
password => $_[0]{password},
|
||||
|
28
site.cfg
@@ -2,9 +2,10 @@
|
||||
# with the database.
|
||||
# dbi:<driver name [SQLite, CSV, ADO, mSQL, etc.]>:<database name>
|
||||
[DBI]
|
||||
driver: dbi:SQLite:hpr.db
|
||||
user:
|
||||
password:
|
||||
database: mysql
|
||||
driver: dbi:mysql:database=hpr_hpr:hostname=localhost
|
||||
user: hpr-generator
|
||||
password: zBozqN-Z2zNAz
|
||||
|
||||
# Configure the root template page which pulls in the navigation and
|
||||
# content templates used by each page. An optional baseurl property may
|
||||
@@ -13,6 +14,8 @@ password:
|
||||
[root_template]
|
||||
content: page.tpl.html
|
||||
#baseurl: OPTIONAL [i.e. file://<full path to local website directory>]
|
||||
baseurl: file:///home/roan/Development/hpr/website/hpr_generator/public_html/
|
||||
media_baseurl: https://archive.org/download/hpr$eps_id/
|
||||
|
||||
# Configure the navigation menu and the content templates for each page
|
||||
# of the site:
|
||||
@@ -132,6 +135,21 @@ content: content-promote.tpl.html
|
||||
navigation: navigation-about.tpl.html
|
||||
content: content-sitemap.tpl.html
|
||||
|
||||
[twat_episode]
|
||||
navigation: navigation-get-shows.tpl.html
|
||||
content: content-twat_episode.tpl.html
|
||||
multipage: true
|
||||
filename: eps/twat[id]/index.html
|
||||
media_baseurl: https://www.hackerpublicradio.org/eps/
|
||||
|
||||
[mumble-howto]
|
||||
navigation: navigation-about.tpl.html
|
||||
content: content-mumble-howto.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 +187,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-avatar.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-listen-now.tpl.html' %-->
|
||||
<!--% PROCESS "queries-episode-${constants.database}.tpl.html" %-->
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<h2>Comment Viewer</h2>
|
||||
<p>Because of the spammers we have had to turn on comment moderation. Sorry about the delay this will cause.</p>
|
||||
<p><a href="<!--% absolute_path(baseurl) %-->comments.rss">Subscribe</a> to the comment feed.</p>
|
||||
<hr />
|
||||
<!--% FOREACH item IN DBI.query('
|
||||
SELECT C.*,
|
||||
H.host, H.hostid AS host_id,
|
||||
E.title AS episode_title,
|
||||
E.date AS episode_date,
|
||||
E.duration AS episode_duration,
|
||||
M.id AS series_id, M.name AS series_name
|
||||
FROM comments AS C
|
||||
INNER JOIN eps AS E
|
||||
ON C.eps_id = E.id
|
||||
INNER JOIN hosts AS H
|
||||
ON E.hostid = H.hostid
|
||||
INNER JOIN miniseries AS M
|
||||
ON E.series = M.id
|
||||
ORDER BY C.comment_timestamp DESC
|
||||
LIMIT 30
|
||||
')
|
||||
%-->
|
||||
|
||||
<article>
|
||||
<header>
|
||||
<h1><!--% item.comment_author_name %--> says: <!--% item.comment_title %--></h1>
|
||||
<p><small>Posted at <!--% item.comment_timestamp %--> relating to the show <a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(item.eps_id) %-->/index.html">hpr<!--% item.eps_id %--></a> which was released on <!--% item.episode_date %--> by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(item.host_id) %-->.html"><!--% item.host %--></a> entitled <em><!--% item.episode_title %--></em></small>
|
||||
</p>
|
||||
</header>
|
||||
<pre class="comment">
|
||||
<!--% item.comment_text %-->
|
||||
</pre>
|
||||
<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,13 +1,30 @@
|
||||
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-avatar.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% PROCESS "queries-correspondent-${constants.database}.tpl.html" %-->
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% query_show_count = DBI.prepare('
|
||||
<!--% query_hpr_show_count = DBI.prepare('
|
||||
SELECT id
|
||||
FROM eps
|
||||
WHERE eps.hostid = ? ')
|
||||
WHERE eps.hostid = ?
|
||||
')
|
||||
%-->
|
||||
<!--% query_shows = DBI.prepare('
|
||||
<!--% results_hpr_shows = DBI.prepare(query_hpr_shows)
|
||||
%-->
|
||||
<!--% hpr_shows_to_count = query_hpr_show_count.execute(id); %-->
|
||||
<!--% hpr_shows = results_hpr_shows.execute(id); %-->
|
||||
<!--% hpr_show_count = 0 %-->
|
||||
<!--% FOREACH show IN hpr_shows_to_count %-->
|
||||
<!--% hpr_show_count = hpr_show_count +1; %-->
|
||||
<!--% END %-->
|
||||
|
||||
<!--% query_twat_show_count = DBI.prepare('
|
||||
SELECT id
|
||||
FROM twat_eps AS eps
|
||||
WHERE eps.hostid = ?
|
||||
')
|
||||
%-->
|
||||
<!--% query_twat_shows = DBI.prepare('
|
||||
SELECT
|
||||
eps.id,
|
||||
CASE eps.explicit WHEN 1 THEN \'Explicit\' ELSE \'Clean\' END AS explicit ,
|
||||
@@ -18,18 +35,20 @@
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email,
|
||||
miniseries.name AS series, miniseries.id AS seriesid
|
||||
FROM eps
|
||||
FROM twat_eps AS eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE hosts.hostid = ? AND eps.date < date(\'now\', \'+1 days\')
|
||||
ORDER BY date DESC ')
|
||||
WHERE hosts.hostid = ?
|
||||
ORDER BY eps.id DESC
|
||||
')
|
||||
%-->
|
||||
<!--% shows_to_count = query_show_count.execute(id); %-->
|
||||
<!--% shows = query_shows.execute(id); %-->
|
||||
<!--% show_count = 0 %-->
|
||||
<!--% FOREACH show IN shows_to_count %-->
|
||||
<!--% show_count = show_count +1; %-->
|
||||
<!--% twat_shows_to_count = query_twat_show_count.execute(id); %-->
|
||||
<!--% twat_shows = query_twat_shows.execute(id); %-->
|
||||
<!--% twat_show_count = 0 %-->
|
||||
<!--% FOREACH show IN twat_shows_to_count %-->
|
||||
<!--% twat_show_count = twat_show_count +1; %-->
|
||||
<!--% END %-->
|
||||
|
||||
<!--% hosts = DBI.tie('hosts', 'hostid') %-->
|
||||
|
||||
<article>
|
||||
@@ -40,11 +59,15 @@
|
||||
height="80" alt="Host Image" /><br>
|
||||
<label>Host ID</label>: <!--% this_host.hostid %--><br><br>
|
||||
<label>email:</label> <u><!--% this_host.email %--></u><br>
|
||||
<label>episodes:</label> <strong><!--% show_count %--></strong>
|
||||
<label>episodes:</label> <strong><!--% hpr_show_count + twat_show_count %--></strong>
|
||||
</p>
|
||||
<!--% FOREACH show IN shows; %-->
|
||||
<!--% FOREACH hpr_show IN hpr_shows; %-->
|
||||
|
||||
<!--% show_summary(show, 'hide_host') %-->
|
||||
<!--% show_summary(hpr_show, 'hide_host') %-->
|
||||
<!--% END %-->
|
||||
<!--% FOREACH twat_show IN twat_shows; %-->
|
||||
|
||||
<!--% twat_show_summary(twat_show, 'hide_host') %-->
|
||||
<!--% END %-->
|
||||
</article>
|
||||
<p><a href="contribute.html">Become a Correspondent</a></p>
|
||||
|
@@ -4,7 +4,7 @@
|
||||
<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>
|
||||
<table class="hosts">
|
||||
<th >Avatar</th>
|
||||
<th >Name & Host ID</th>
|
||||
<th >license</th>
|
||||
@@ -16,7 +16,7 @@
|
||||
inner join (select hostid, max(date) as date from eps group by hostid) as e
|
||||
on h.hostid = e.hostid '
|
||||
) %-->
|
||||
<tr height="80" bgcolor="#CCCCCC">
|
||||
<tr height="80">
|
||||
<td><img src="<!--% absolute_path(baseurl) %-->images/<!--% get_avatar(host.hostid) %-->" height="80" width="80" alt="avatar" /></td>
|
||||
|
||||
<td><strong><!--% host.host %--></strong><br>
|
||||
|
@@ -1,60 +1,103 @@
|
||||
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-avatar.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-listen-now.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-show-transcript.tpl.html' %-->
|
||||
<!--% PROCESS "queries-episode-${constants.database}.tpl.html" %-->
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% query_episodes = DBI.prepare('
|
||||
WITH episode_maxmin AS (
|
||||
SELECT MAX(id) AS \'latest\', MIN(id) AS \'earliest\', ? AS \'id\'
|
||||
FROM eps
|
||||
WHERE eps.date < date (\'now\', \'+1 days\')
|
||||
),
|
||||
episode_date AS (
|
||||
SELECT eps.date
|
||||
FROM eps
|
||||
WHERE eps.id = ?
|
||||
),
|
||||
episode_previous AS (
|
||||
SELECT MAX(id) AS \'previous\', ? AS \'id\'
|
||||
FROM eps
|
||||
INNER JOIN episode_date
|
||||
ON eps.date < episode_date.date
|
||||
WHERE eps.id > 1
|
||||
),
|
||||
episode_next AS (
|
||||
SELECT MIN(id) AS \'next\', ? AS \'id\'
|
||||
FROM eps
|
||||
INNER JOIN episode_date
|
||||
ON eps.date > episode_date.date
|
||||
WHERE eps.date < date (\'now\')
|
||||
)
|
||||
SELECT eps.id, eps.date, eps.title, eps.duration,
|
||||
eps.summary, eps.notes, eps.explicit, eps.license,
|
||||
eps.tags, eps.version, eps.downloads, eps.valid,
|
||||
episode_maxmin.latest, episode_maxmin.earliest,
|
||||
episode_previous.previous, episode_next.next,
|
||||
hosts.hostid, hosts.host,
|
||||
miniseries.name AS \'series\', miniseries.id AS \'seriesid\'
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
INNER JOIN episode_maxmin ON eps.id = episode_maxmin.id
|
||||
INNER JOIN episode_previous ON eps.id = episode_previous.id
|
||||
INNER JOIN episode_next ON eps.id = episode_next.id
|
||||
WHERE eps.id = ?
|
||||
')
|
||||
<!--% query_episodes = DBI.prepare(query_episode_maxmin)
|
||||
%-->
|
||||
<!--% episode_result = query_episodes.execute(id, id, id, id, id) %-->
|
||||
<!--% FOREACH episode IN episode_result %-->
|
||||
<!--% episode_navigation = step_navigation(baseurl,episode) %-->
|
||||
<article>
|
||||
<header>
|
||||
<h1>hpr<!--% 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>
|
||||
Hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(episode.hostid) %-->.html"><!--% episode.host %--></a> on <span><!--% episode.date %--></span> is flagged as <span><!--% display_explicit(episode.explicit) %--></span> and is released under a <span><!--% episode.license %--> license</span>. <br>
|
||||
<!--% display_tags(episode.tags) %--> <br>
|
||||
<!--% display_listen_in(episode.id) %--> |
|
||||
<!--% display_comments_tally(episode.id, episode.eps_tally) %-->
|
||||
</p>
|
||||
<h3><!--% show_series(episode.series, episode.seriesid, "Part of the series") %--></h3>
|
||||
<p><em><!--% episode.series_description %--></em></p>
|
||||
</header>
|
||||
<div><!--% episode.notes %--></div>
|
||||
</article>
|
||||
<footer>
|
||||
|
||||
<!--% show_transcript(episode, "hpr", baseurl, media_baseurl) %-->
|
||||
|
||||
<!--% listen_now(episode, "hpr", baseurl, media_baseurl) %-->
|
||||
<p>
|
||||
<!--% episode_navigation %-->
|
||||
</p>
|
||||
</footer></article>
|
||||
<!--% END %-->
|
||||
<hr />
|
||||
<h1>Comments</h1>
|
||||
<p id="comments">
|
||||
Subscribe to the comments <a href="<!--% absolute_path(baseurl) %-->comments.rss">RSS</a> feed.
|
||||
</p>
|
||||
<!--% query_comments = DBI.prepare('
|
||||
SELECT
|
||||
id,
|
||||
comment_timestamp,
|
||||
comment_author_name,
|
||||
comment_title,
|
||||
comment_text
|
||||
FROM comments
|
||||
WHERE eps_id = ?
|
||||
')
|
||||
%-->
|
||||
<!--% comment_index = 1 %-->
|
||||
<!--% comments_result = query_comments.execute(id) %-->
|
||||
<!--% FOREACH comment IN comments_result %-->
|
||||
<h5 id="comment_<!--% comment.id %-->">Comment #<!--% comment_index %--> posted on <!--% comment.comment_timestamp %--> by <!--% comment.comment_author_name %--></h5>
|
||||
<h4><!--% comment.comment_title %--></h4>
|
||||
<!--% comment.comment_text %-->
|
||||
<!--% comment_index = comment_index + 1 %-->
|
||||
<!--% END %-->
|
||||
|
||||
<h2>Leave Comment</h2>
|
||||
<p>
|
||||
<strong>Note to Verbose Commenters</strong><br />
|
||||
If you can't fit everything you want to say in the comment below then you really should <a href="<!--% absolute_path(baseurl) %-->contribute.html">record</a> a response show instead.
|
||||
</p>
|
||||
<p>
|
||||
<strong>Note to Spammers</strong><br />
|
||||
All comments are moderated. All links are checked by humans. We strip out all html. Feel free to <a href="<!--% absolute_path(baseurl) %-->contribute.html">record</a> a show about yourself, or your industry, or any other topic we may find interesting. <em>We also check shows for spam :)</em>.
|
||||
</p>
|
||||
<form method="POST" action="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 <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>
|
||||
<input type="hidden" name="spammer" value="No">
|
||||
<input type="hidden" name="hostid" value="406">
|
||||
<input type="hidden" name="justification" value="No justification is asked for or required.">
|
||||
<input type="hidden" name="eps_id" value="3665 ">
|
||||
</table>
|
||||
<input type="submit" value="Next">
|
||||
</fieldset>
|
||||
</form>
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
|
||||
<!--% PROCESS "queries-episodes-${constants.database}.tpl.html" %-->
|
||||
<article>
|
||||
<header>
|
||||
<h1>Complete Archive of Shows.</h1>
|
||||
@@ -7,7 +8,16 @@
|
||||
</p>
|
||||
</header>
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% FOREACH episodes IN DBI.query('
|
||||
<!--% FOREACH episodes IN DBI.query(query_episodes)
|
||||
%-->
|
||||
<!--% show_summary(episodes) %-->
|
||||
<!--% END %-->
|
||||
<h2 id="twat_episodes">Today With a Techie Archived Shows</h2>
|
||||
<p>
|
||||
<!-- Creative Commons License -->
|
||||
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/2.5/"><img alt="Creative Commons License" border="0" src="http://creativecommons.org/images/public/somerights20.png" width="88" height="31" /></a><br>The following work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/2.5/">Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License</a>.</p>
|
||||
<p>T.W.A.T. Radio was brought to you by <a href="https://en.wikipedia.org/wiki/Infonomicon">The Infonomicon Computer Club</a></p>
|
||||
<!--% FOREACH twat_episode IN DBI.query('
|
||||
SELECT
|
||||
eps.id,
|
||||
eps.explicit,
|
||||
@@ -16,13 +26,14 @@
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email, hosts.local_image,
|
||||
miniseries.name AS series, miniseries.id AS seriesid
|
||||
FROM eps
|
||||
FROM twat_eps as eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE eps.date < date(\'now\', \'+1 days\')
|
||||
ORDER BY date DESC
|
||||
ORDER BY eps.id DESC
|
||||
')
|
||||
%-->
|
||||
<!--% show_summary(episodes) %-->
|
||||
<!--% twat_show_summary(twat_episode) %-->
|
||||
<!--% END %-->
|
||||
|
||||
</article>
|
||||
|
||||
|
2
templates/content-index-announcement.tpl.html
Normal file
@@ -0,0 +1,2 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
|
@@ -1,14 +1,30 @@
|
||||
<!--% PROCESS 'shared-avatar.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-listen-now.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-show-transcript.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-call_for_shows.tpl.html' %-->
|
||||
<!--% INCLUDE 'content-index-announcement.tpl.html' %-->
|
||||
<!--% PROCESS "queries-index-${constants.database}.tpl.html" %-->
|
||||
<hr>
|
||||
<article>
|
||||
<header>
|
||||
<h3>Welcome to HPR the Community Podcast</h3>
|
||||
</header>
|
||||
<!--% days_till_next_episode = 0 %-->
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% FOREACH next_available_episode_result IN DBI.query(query_next_available_episode)
|
||||
%-->
|
||||
<!--% USE date %-->
|
||||
<!--% calc = date.calc %-->
|
||||
<!--% days_till_next_episode = calc.Delta_Days(date.format(date.now, '%Y'),date.format(date.now, '%m'),date.format(date.now, '%d'),next_available_episode_result.last_year,next_available_episode_result.last_month,next_available_episode_result.last_day + 1) %-->
|
||||
<!--% END %-->
|
||||
<!--% USE date %-->
|
||||
<!--% delta = date.calc.N_Delta_YMD(2005,9,19, date.format(date.now, '%Y'),date.format(date.now, '%m'),date.format(date.now, '%d')) %-->
|
||||
<p>We started producing shows as <a href="https://www.hackerpublicradio.org/twat.php"><em>Today with a Techie</em></a> on 2005-09-19, <!--% delta.0 %--> years, <!--% delta.1 %--> months, <!--% delta.2 %--> days ago. our shows are produced by <a href="<!--% absolute_path(baseurl) %-->correspondents/index.html">listeners</a> like you and can be on any <a href="<!--% absolute_path(baseurl) %-->eps/index.html">topic</a> that <strong>"are of interest to <a href="https://en.wikipedia.org/wiki/hacker_(hobbyist)">hackers</a>"</strong>. if you listen to HPR then please consider contributing one show a year. if you <a href="<!--% absolute_path(baseurl) %-->contribute.html">record</a> your show now it could be <a href="https://www.hackerpublicradio.org/calendar.php">released</a> in <strong>13</strong> days.</p>
|
||||
<h4>Meet the team</h4>
|
||||
<p>We started producing shows as <a href="<!--% absolute_path(baseurl) %-->eps/index.html#twat_episodes"><em>Today with a Techie</em></a> on 2005-09-19, <!--% delta.0 %--> years, <!--% delta.1 %--> months, <!--% delta.2 %--> days ago. our shows are produced by <a href="<!--% absolute_path(baseurl) %-->correspondents/index.html">listeners</a> like you and can be on any <a href="<!--% absolute_path(baseurl) %-->eps/index.html">topic</a> that <strong>"are of interest to <a href="https://en.wikipedia.org/wiki/hacker_(hobbyist)">hackers</a>"</strong>. if you listen to HPR then please consider contributing one show a year. if you <a href="<!--% absolute_path(baseurl) %-->contribute.html">record</a> your show now it could be <a href="https://www.hackerpublicradio.org/calendar.php">released</a> in <strong><!--% days_till_next_episode %--></strong> days.</p>
|
||||
</article>
|
||||
<!--% display_call_for_shows() %-->
|
||||
<article>
|
||||
<h4>Meet the team</h4>
|
||||
<p>
|
||||
<audio controls preload="none">";
|
||||
<source src="<!--% absolute_path(baseurl) %-->media/promos/all-hpr-hosts.ogg" type="audio/ogg" >
|
||||
@@ -19,25 +35,7 @@
|
||||
<hr>
|
||||
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
|
||||
<h1>Latest Shows</h1>
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% FOREACH latest_episodes IN DBI.query('
|
||||
SELECT
|
||||
eps.id,
|
||||
eps.explicit,
|
||||
eps.date, eps.license, eps.duration,
|
||||
eps.title, eps.summary, eps.tags,
|
||||
eps.notes,
|
||||
hosts.local_image,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email,
|
||||
miniseries.name AS series, miniseries.id AS seriesid
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE eps.date < date(\'now\', \'+1 days\')
|
||||
ORDER BY date DESC
|
||||
LIMIT 10
|
||||
')
|
||||
<!--% FOREACH latest_episodes IN DBI.query(query_latest_episodes)
|
||||
%-->
|
||||
<hr>
|
||||
<article>
|
||||
@@ -47,24 +45,16 @@
|
||||
<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>
|
||||
<!--% display_tags(latest_episodes.tags) %--><br>
|
||||
<small><!--% display_listen_in(latest_episodes.id) %--> <!--% show_series(latest_episodes.series, latest_episodes.seriesid) %--> |
|
||||
<!--% display_comments_tally(latest_episodes.id, latest_episodes.eps_tally) %--></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>
|
||||
<!--% show_transcript(latest_episodes, "hpr", baseurl, media_baseurl) %-->
|
||||
|
||||
<!--% listen_now(latest_episodes, "hpr", baseurl, media_baseurl) %-->
|
||||
</footer>
|
||||
</article>
|
||||
<!--% END %-->
|
||||
@@ -73,22 +63,7 @@
|
||||
<hr>
|
||||
<h1>Previous five weeks</h1>
|
||||
</header>
|
||||
<!--% FOREACH last_5_weeks_episodes IN DBI.query('
|
||||
SELECT
|
||||
eps.id,
|
||||
CASE eps.explicit WHEN 1 THEN \'Explicit\' ELSE \'Clean\' END AS explicit ,
|
||||
eps.date, eps.license, eps.title, eps.summary,
|
||||
eps.duration, eps.notes, eps.tags,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email, hosts.local_image,
|
||||
miniseries.name AS series, miniseries.id AS seriesid
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE eps.date < date(\'now\', \'+1 days\')
|
||||
ORDER BY date DESC
|
||||
LIMIT 30 OFFSET 10
|
||||
')
|
||||
<!--% FOREACH last_5_weeks_episodes IN DBI.query(query_last_5_weeks_episodes)
|
||||
%-->
|
||||
<!--% show_summary(last_5_weeks_episodes) %-->
|
||||
<!--% END %-->
|
||||
|
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,28 +1,16 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% PROCESS "queries-series-${constants.database}.tpl.html" %-->
|
||||
<article>
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<h1 class="title">In-Depth Series</h1>
|
||||
<!--% FOREACH series IN DBI.query(
|
||||
'SELECT miniseries.id, miniseries.name, miniseries.description,
|
||||
miniseries.private, miniseries.image, miniseries.valid,
|
||||
ep.number_of_episodes, ep.latest_show, ep.earliest_show
|
||||
FROM miniseries
|
||||
INNER JOIN
|
||||
(SELECT series,
|
||||
COUNT(eps.id) AS number_of_episodes,
|
||||
MAX(eps.date) AS latest_show,
|
||||
MIN(eps.date) AS earliest_show
|
||||
FROM eps
|
||||
GROUP BY series) AS ep ON ep.series = miniseries.id
|
||||
ORDER BY name'
|
||||
) %-->
|
||||
<h2><a href="series/<!--% zero_pad_left(series.id) %-->.html"><!--% series.name %--></a></h2>
|
||||
<!--% FOREACH series IN DBI.query(query_episodes) %-->
|
||||
<h2><a href="<!--% absolute_path(baseurl) %-->series/<!--% zero_pad_left(series.id) %-->.html"><!--% series.name %--></a></h2>
|
||||
<ul>
|
||||
<li>Number of episodes: <!--% series.number_of_episodes %--></li>
|
||||
<li>Open/closed: <!--% display_choice(series.private, 'closed', 'open') %--></li>
|
||||
<li>Date of earliest show: <!--% series.earliest_show %--></li>
|
||||
<li>Date of latest show: <!--% series.latest_show %--></li>
|
||||
<li>Series RSS feeds: <a href="hpr_ogg_rss.php?series=38">ogg</a>, <a href="hpr_spx_rss.php?series=38">spx</a>, <a href="hpr_mp3_rss.php?series=38">mp3</a></li>
|
||||
<li>Series RSS feeds: <a href="https://www.hackerpublicradio.org/hpr_ogg_rss.php?series=<!--% series.id %-->">ogg</a>, <a href="https://www.hackerpublicradio.org/hpr_spx_rss.php?series=<!--% series.id %-->">spx</a>, <a href="https://www.hackerpublicradio.org/hpr_mp3_rss.php?series=<!--% series.id %-->">mp3</a></li>
|
||||
</ul>
|
||||
<em><!--% series.description %--></em>
|
||||
<!--% END %-->
|
||||
|
@@ -1,20 +1,8 @@
|
||||
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-avatar.tpl.html' %-->
|
||||
<!--% PROCESS "queries-series_episodes-${constants.database}.tpl.html" %-->
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% query_series = DBI.prepare('SELECT miniseries.id, miniseries.name,
|
||||
miniseries.description,
|
||||
miniseries.private, miniseries.image, miniseries.valid,
|
||||
ep.number_of_episodes, ep.latest_show, ep.earliest_show
|
||||
FROM miniseries
|
||||
INNER JOIN
|
||||
(SELECT series,
|
||||
COUNT(eps.id) AS number_of_episodes,
|
||||
MAX(eps.date) AS latest_show,
|
||||
MIN(eps.date) AS earliest_show
|
||||
FROM eps
|
||||
GROUP BY series) AS ep ON ep.series = miniseries.id
|
||||
WHERE miniseries.id = ?
|
||||
ORDER BY name')
|
||||
<!--% query_series = DBI.prepare(query_series_sql)
|
||||
%-->
|
||||
<!--% series_result = query_series.execute(id) %-->
|
||||
<article>
|
||||
@@ -25,21 +13,11 @@
|
||||
<li>Open/closed: open</li>
|
||||
<li>Date of earliest show: <!--% series.earliest_show %--></li>
|
||||
<li>Date of latest show: <!--% series.latest_show %--></li>
|
||||
<li>Series RSS feeds: <a href="hpr_ogg_rss.php?series=79&full=1&gomax=1">ogg</a>, <a href="hpr_spx_rss.php?series=79&full=1&gomax=1">spx</a>, <a href="hpr_mp3_rss.php?series=79&full=1&gomax=1">mp3</a></li>
|
||||
<li>Series RSS feeds: <a href="https://www.hackerpublicradio.org/hpr_ogg_rss.php?series=<!--% series.id %-->&full=1&gomax=1">ogg</a>, <a href="https://www.hackerpublicradio.org/hpr_spx_rss.php?series=<!--% series.id %-->&full=1&gomax=1">spx</a>, <a href="https://www.hackerpublicradio.org/hpr_mp3_rss.php?series=<!--% series.id %-->&full=1&gomax=1">mp3</a></li>
|
||||
</ul>
|
||||
<div><em><!--% series.description %--></em></div>
|
||||
<!--% END %-->
|
||||
<!--% query_shows = DBI.prepare('SELECT
|
||||
id, date, title,
|
||||
duration, summary, notes,
|
||||
explicit, eps.license, tags,
|
||||
hosts.host, hosts.hostid
|
||||
FROM eps
|
||||
INNER JOIN hosts
|
||||
ON eps.hostid = hosts.hostid
|
||||
WHERE series = ?
|
||||
ORDER BY date DESC
|
||||
')
|
||||
<!--% query_shows = DBI.prepare(query_shows_sql)
|
||||
%-->
|
||||
<!--% show_results = query_shows.execute(id) %-->
|
||||
<!--% FOREACH show IN show_results %-->
|
||||
|
@@ -1,3 +1,51 @@
|
||||
<h1>RSS Syndication</h1>
|
||||
<p><small><em><a href="http://hackerpublicradio.org/advanced_rss_settings.php">Advanced Settings</a>.</em></small></p>
|
||||
|
||||
<article>
|
||||
<header>
|
||||
<h2>Subscribe to our Feeds</h2>
|
||||
</header>
|
||||
<p>
|
||||
Great that you want to listen. Have a look below at the feeds that best suite your listening habits.
|
||||
</p>
|
||||
</article>
|
||||
<article>
|
||||
<header>
|
||||
<h2><img src="<!--% absolute_path(baseurl) %-->images/feed.png" alt="rss logo"> The Community News Summary</h2>
|
||||
<h3>One show a month</h3>
|
||||
</header>
|
||||
<p>
|
||||
If you get overwhelmend by the amount of shows we produce, then this is a good place to start.
|
||||
</p>
|
||||
<p>
|
||||
Every month, the HPR Janitors put down their mops had have a chat about all the shows, and what else has been going on in the HPR community. This is a regular show scheduled for the first Monday of the month.
|
||||
</p>
|
||||
<ul>
|
||||
<li><a href="https://hackerpublicradio.org/hpr_ogg_rss.php?series=47">ogg</a> Larger file size higher quality feed.</li>
|
||||
<li><a href="https://hackerpublicradio.org/hpr_spx_rss.php?series=47">mp3</a> Larger file size regular quality feed in a common format.</li>
|
||||
<li><a href="https://hackerpublicradio.org/hpr_mp3_rss.php?series=47">spx</a> Small file size lower quality feed. <br/>Ideal for dial-up/mobile connections.</li>
|
||||
</ul>
|
||||
<p>
|
||||
We also maintain an <a href="https://archive.org/details/hackerpublicradio?and[]=subject%3A%22Community+News%22">Archive.org</a> page where you can get the shows in even more formats.
|
||||
</p>
|
||||
</article>
|
||||
<article>
|
||||
<header>
|
||||
<h2><img src="<!--% absolute_path(baseurl) %-->images/feed.png" alt="rss logo"> Two week Audio feed</h2>
|
||||
<h3>5 shows a week</h3>
|
||||
</header>
|
||||
<p>
|
||||
Use these feeds to keep up to date with the latest HPR Episodes.
|
||||
</p>
|
||||
<ul>
|
||||
<li><a href="hpr_ogg_rss.php">ogg</a> Larger file size higher quality feed.</li>
|
||||
<li><a href="hpr_rss.php">mp3</a> Larger file size regular quality feed in a common format.</li>
|
||||
<li><a href="hpr_spx_rss.php">spx</a> Small file size lower quality feed. <br/>Ideal for dial-up/mobile connections.</li>
|
||||
</ul>
|
||||
<p>
|
||||
We also maintain an <a href="https://archive.org/details/hackerpublicradio">Archive.org</a> page where you can get the shows in even more formats. For more recent shows we are now including the original upload as delivered.
|
||||
</p>
|
||||
</article>
|
||||
<article>
|
||||
<header>
|
||||
<h2><img src="<!--% absolute_path(baseurl) %-->images/feed.png" alt="rss logo"> Entire Archive Audio feed</h2>
|
||||
@@ -19,7 +67,7 @@
|
||||
Use this feed to get the shows as they are posted. The shows will be posted out of order as they come in and may be replaced/reposted if errors are found. This is intended as a means to provide find issues with metadata or the audio quality of new shows before they hit the main feed.
|
||||
</p>
|
||||
<ul>
|
||||
<li><a href="rss-future.php">Shows as they are posted.</a> OGG Only</li>
|
||||
<li><a href="https://www.hackerpublicradio.org/rss-future.php">Shows as they are posted.</a> OGG Only</li>
|
||||
</ul>
|
||||
</article>
|
||||
<article>
|
||||
@@ -27,6 +75,27 @@
|
||||
<h2><img src="<!--% absolute_path(baseurl) %-->images/feed.png" alt="rss logo"> Comment feed</h2>
|
||||
</header>
|
||||
<ul>
|
||||
<li><a href="http://www.hackerpublicradio.org/comments_rss.php">Listener contributed comments to the episodes</a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->comments.rss">Listener contributed comments to the episodes</a></li>
|
||||
</ul>
|
||||
</article>
|
||||
<article>
|
||||
<header>
|
||||
<h2>Site Replication Sources</h2>
|
||||
</header>
|
||||
<ul>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->hpr.sql">Daily Database Dump in SQL Format</a></li>
|
||||
<ul>
|
||||
</article>
|
||||
<article>
|
||||
<header>
|
||||
<h2>External Sources</h2>
|
||||
</header>
|
||||
<ul>
|
||||
<li><a href="https://archive.org/details/hackerpublicradio">Archive.org</a></li>
|
||||
<li><a href="https://itunes.apple.com/us/podcast/hacker-public-radio/id281699640?mt=2">iTunes</a></li>
|
||||
<li><a href="https://podcasts.google.com/feed/aHR0cDovL2hhY2tlcnB1YmxpY3JhZGlvLm9yZy9ocHJfcnNzLnBocA">Google Podcasts</a></li>
|
||||
<li><a href="https://player.fm/series/hacker-public-radio">PlayerFM</a></li>
|
||||
<li><a href="https://open.spotify.com/show/7e2hYcnHj9vKgUzsIOf4r3">Spotify</a></li>
|
||||
<li><a href="https://www.mixcloud.com/hackerpublicradio/">MixCloud</a></li>
|
||||
<ul>
|
||||
</article>
|
||||
|
72
templates/content-twat_episode.tpl.html
Normal file
@@ -0,0 +1,72 @@
|
||||
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-avatar.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-listen-now.tpl.html' %-->
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% query_episodes = DBI.prepare('
|
||||
WITH episode_maxmin AS (
|
||||
SELECT MAX(id) AS \'latest\', MIN(id) AS \'earliest\', ? AS \'id\'
|
||||
FROM twat_eps AS eps
|
||||
),
|
||||
episode_date AS (
|
||||
SELECT eps.date
|
||||
FROM twat_eps AS eps
|
||||
WHERE eps.id = ?
|
||||
),
|
||||
episode_previous AS (
|
||||
SELECT MAX(id) AS \'previous\', ? AS \'id\'
|
||||
FROM twat_eps AS eps
|
||||
INNER JOIN episode_date
|
||||
ON eps.date < episode_date.date
|
||||
WHERE eps.id > 1
|
||||
),
|
||||
episode_next AS (
|
||||
SELECT MIN(id) AS \'next\', ? AS \'id\'
|
||||
FROM twat_eps AS eps
|
||||
INNER JOIN episode_date
|
||||
ON eps.date > episode_date.date
|
||||
)
|
||||
SELECT eps.id, eps.date, eps.title, eps.duration,
|
||||
eps.summary, eps.notes, eps.explicit, eps.license,
|
||||
eps.tags, eps.version, eps.downloads, eps.valid,
|
||||
episode_maxmin.latest, episode_maxmin.earliest,
|
||||
episode_previous.previous, episode_next.next,
|
||||
hosts.hostid, hosts.host,
|
||||
miniseries.name AS \'series\', miniseries.id AS \'seriesid\',
|
||||
miniseries.description AS \'series_description\'
|
||||
FROM twat_eps AS eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
INNER JOIN episode_maxmin ON eps.id = episode_maxmin.id
|
||||
INNER JOIN episode_previous ON eps.id = episode_previous.id
|
||||
INNER JOIN episode_next ON eps.id = episode_next.id
|
||||
WHERE eps.id = ?
|
||||
')
|
||||
%-->
|
||||
<!--% episode_result = query_episodes.execute(id, id, id, id, id) %-->
|
||||
<!--% FOREACH episode IN episode_result %-->
|
||||
<!--% episode_navigation = step_navigation(baseurl,episode,"twat") %-->
|
||||
<article>
|
||||
<header>
|
||||
<h1><!--% episode.id %--> :: <!--% episode.title %--></h1>
|
||||
<h3><!--% episode.summary %--></h3>
|
||||
<p class="meta"><!--% episode_navigation %-->
|
||||
</p>
|
||||
<p><!--% 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> on <span><!--% episode.date %--></span> is flagged as <span><!--% display_explicit(episode.explicit) %--></span> and is released under a <span><!--% episode.license %--> license</span>. <br>
|
||||
<!--% display_tags(episode.tags) %--> <br>
|
||||
<!--% display_listen_in(episode.id, "twat") %-->
|
||||
</p>
|
||||
<h3><!--% show_series(episode.series, episode.seriesid, "Part of the series") %--></h3>
|
||||
<p><em><!--% episode.series_description %--></em></p>
|
||||
</header>
|
||||
<div><!--% episode.notes %--></div>
|
||||
<footer>
|
||||
<!--% listen_now(episode, "twat", baseurl, media_baseurl) %-->
|
||||
<p>
|
||||
<!--% episode_navigation %-->
|
||||
</p>
|
||||
</footer></article>
|
||||
<!--% END %-->
|
||||
|
@@ -1,8 +1,6 @@
|
||||
<!--% PROCESS "queries-ids-episode-${constants.database}.tpl.html" %-->
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% FOREACH episode IN DBI.query(
|
||||
'select eps.id from eps
|
||||
where eps.date < date (\'now\', \'+1 days\') '
|
||||
) %-->
|
||||
<!--% FOREACH episode IN DBI.query(query_ids_episode) %-->
|
||||
,<!--% episode.id %-->
|
||||
<!--% END %-->
|
||||
|
||||
|
7
templates/ids-twat_episode.tpl.html
Normal file
@@ -0,0 +1,7 @@
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% FOREACH episode IN DBI.query(
|
||||
'select eps.id from twat_eps AS eps'
|
||||
) %-->
|
||||
,<!--% episode.id %-->
|
||||
<!--% END %-->
|
||||
|
@@ -5,7 +5,7 @@
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->syndication.html">Get Shows</a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->contribute.html">Give Shows</a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->help_out.html">Contribute</a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->tags.html">Tags</a></li>
|
||||
<li><a href="http://www.hackerpublicradio.org/tags.php">Tags</a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->about.html">About</a></li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->search.html">Search</a></li>
|
||||
</ul>
|
||||
|
@@ -10,6 +10,7 @@
|
||||
<meta http-equiv="X-Clacks-Overhead" content="GNU Terry Pratchett" />
|
||||
<meta name="keywords" content="Technology, Tech News, Education, Training" />
|
||||
<meta name="description" content="Hacker Public Radio is an podcast that releases shows every weekday Monday through Friday. Our shows are produced by the community (you) and can be on any topic that are of interest to hackers and hobbyists." />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<!-- Internal CSS -->
|
||||
<style type="text/css">
|
||||
article, aside, dialog, figure, footer, header, hgroup, menu, nav, section {
|
||||
|
6
templates/queries-call_for_shows-mysql.tpl.html
Normal file
@@ -0,0 +1,6 @@
|
||||
<!--% query_call_for_shows = '
|
||||
SELECT CASE WHEN COUNT(id) < 7 THEN True ELSE False END AS `request_for_shows`
|
||||
FROM eps
|
||||
WHERE eps.date > NOW() AND eps.date < DATE_ADD(NOW(), INTERVAL 10 DAY)
|
||||
'
|
||||
%-->
|
6
templates/queries-call_for_shows-sqlite.tpl.html
Normal file
@@ -0,0 +1,6 @@
|
||||
<!--% query_call_for_shows = '
|
||||
SELECT CASE WHEN COUNT(id) < 7 THEN True ELSE False END AS `request_for_shows`
|
||||
FROM eps
|
||||
WHERE eps.date > date(\'now\') AND eps.date < date(\'now\', \'+10 days\')
|
||||
'
|
||||
%-->
|
18
templates/queries-correspondent-mysql.tpl.html
Normal file
@@ -0,0 +1,18 @@
|
||||
<!--% query_hpr_shows = '
|
||||
SELECT
|
||||
eps.id,
|
||||
CASE eps.explicit WHEN 1 THEN \'Explicit\' ELSE \'Clean\' END AS explicit ,
|
||||
eps.date, eps.license, eps.duration,
|
||||
eps.title, eps.summary, eps.tags,
|
||||
eps.notes,
|
||||
hosts.local_image,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email,
|
||||
miniseries.name AS series, miniseries.id AS seriesid
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE hosts.hostid = ? AND eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
|
||||
ORDER BY eps.id DESC
|
||||
'
|
||||
%-->
|
18
templates/queries-correspondent-sqlite.tpl.html
Normal file
@@ -0,0 +1,18 @@
|
||||
<!--% query_hpr_shows = '
|
||||
SELECT
|
||||
eps.id,
|
||||
CASE eps.explicit WHEN 1 THEN \'Explicit\' ELSE \'Clean\' END AS explicit ,
|
||||
eps.date, eps.license, eps.duration,
|
||||
eps.title, eps.summary, eps.tags,
|
||||
eps.notes,
|
||||
hosts.local_image,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email,
|
||||
miniseries.name AS series, miniseries.id AS seriesid
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE hosts.hostid = ? AND eps.date < date(\'now\', \'+1 days\')
|
||||
ORDER BY eps.id + 0 DESC
|
||||
'
|
||||
%-->
|
51
templates/queries-episode-mysql.tpl.html
Normal file
@@ -0,0 +1,51 @@
|
||||
<!--% query_episode_maxmin = '
|
||||
WITH episode_maxmin AS (
|
||||
SELECT MAX(id) AS \'latest\', MIN(id) AS \'earliest\', ? AS \'id\'
|
||||
FROM eps
|
||||
WHERE eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
|
||||
),
|
||||
episode_date AS (
|
||||
SELECT eps.date
|
||||
FROM eps
|
||||
WHERE eps.id = ?
|
||||
),
|
||||
episode_previous AS (
|
||||
SELECT MAX(id) AS \'previous\', ? AS \'id\'
|
||||
FROM eps
|
||||
INNER JOIN episode_date
|
||||
ON eps.date < episode_date.date
|
||||
WHERE eps.id > 1
|
||||
),
|
||||
episode_next AS (
|
||||
SELECT MIN(id) AS \'next\', ? AS \'id\'
|
||||
FROM eps
|
||||
INNER JOIN episode_date
|
||||
ON eps.date > episode_date.date
|
||||
WHERE eps.date < NOW()
|
||||
),
|
||||
comment_tallies AS (
|
||||
SELECT
|
||||
eps_id,
|
||||
COUNT(eps_id) AS eps_tally
|
||||
FROM comments
|
||||
GROUP BY eps_id
|
||||
)
|
||||
SELECT eps.id, eps.date, eps.title, eps.duration,
|
||||
eps.summary, eps.notes, eps.explicit, eps.license,
|
||||
eps.tags, eps.version, eps.downloads, eps.valid,
|
||||
episode_maxmin.latest, episode_maxmin.earliest,
|
||||
episode_previous.previous, episode_next.next,
|
||||
hosts.hostid, hosts.host,
|
||||
miniseries.name AS \'series\', miniseries.id AS \'seriesid\',
|
||||
miniseries.description AS \'series_description\',
|
||||
COALESCE (comment_tallies.eps_tally, 0) AS eps_tally
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
INNER JOIN episode_maxmin ON eps.id = episode_maxmin.id
|
||||
INNER JOIN episode_previous ON eps.id = episode_previous.id
|
||||
INNER JOIN episode_next ON eps.id = episode_next.id
|
||||
LEFT JOIN comment_tallies ON eps.id = comment_tallies.eps_id
|
||||
WHERE eps.id = ?
|
||||
'
|
||||
%-->
|
51
templates/queries-episode-sqlite.tpl.html
Normal file
@@ -0,0 +1,51 @@
|
||||
<!--% query_episode_maxmin = '
|
||||
WITH episode_maxmin AS (
|
||||
SELECT MAX(id) AS \'latest\', MIN(id) AS \'earliest\', ? AS \'id\'
|
||||
FROM eps
|
||||
WHERE eps.date < date(\'now\', \'+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\')
|
||||
),
|
||||
comment_tallies AS (
|
||||
SELECT
|
||||
eps_id,
|
||||
COUNT(eps_id) AS eps_tally
|
||||
FROM comments
|
||||
GROUP BY eps_id
|
||||
)
|
||||
SELECT eps.id, eps.date, eps.title, eps.duration,
|
||||
eps.summary, eps.notes, eps.explicit, eps.license,
|
||||
eps.tags, eps.version, eps.downloads, eps.valid,
|
||||
episode_maxmin.latest, episode_maxmin.earliest,
|
||||
episode_previous.previous, episode_next.next,
|
||||
hosts.hostid, hosts.host,
|
||||
miniseries.name AS \'series\', miniseries.id AS \'seriesid\',
|
||||
miniseries.description AS \'series_description\',
|
||||
COALESCE (comment_tallies.eps_tally, 0) AS eps_tally
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
INNER JOIN episode_maxmin ON eps.id = episode_maxmin.id
|
||||
INNER JOIN episode_previous ON eps.id = episode_previous.id
|
||||
INNER JOIN episode_next ON eps.id = episode_next.id
|
||||
LEFT JOIN comment_tallies ON eps.id = comment_tallies.eps_id
|
||||
WHERE eps.id = ?
|
||||
'
|
||||
%-->
|
15
templates/queries-episodes-mysql.tpl.html
Normal file
@@ -0,0 +1,15 @@
|
||||
<!--% query_episodes = 'SELECT
|
||||
eps.id,
|
||||
eps.explicit,
|
||||
eps.date, eps.license, eps.title, eps.summary,
|
||||
eps.duration, eps.notes, eps.tags,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email, hosts.local_image,
|
||||
miniseries.name AS series, miniseries.id AS seriesid
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
|
||||
ORDER BY eps.id DESC'
|
||||
%-->
|
||||
|
15
templates/queries-episodes-sqlite.tpl.html
Normal file
@@ -0,0 +1,15 @@
|
||||
<!--% query_episodes = 'SELECT
|
||||
eps.id,
|
||||
eps.explicit,
|
||||
eps.date, eps.license, eps.title, eps.summary,
|
||||
eps.duration, eps.notes, eps.tags,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email, hosts.local_image,
|
||||
miniseries.name AS series, miniseries.id AS seriesid
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE eps.date < date(\'now\', \'+1 days\')
|
||||
ORDER BY eps.id + 0 DESC'
|
||||
%-->
|
||||
|
4
templates/queries-ids-episode-mysql.tpl.html
Normal file
@@ -0,0 +1,4 @@
|
||||
<!--% query_ids_episode = 'select eps.id from eps
|
||||
where eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY) '
|
||||
%-->
|
||||
|
4
templates/queries-ids-episode-sqlite.tpl.html
Normal file
@@ -0,0 +1,4 @@
|
||||
<!--% query_ids_episode = 'select eps.id from eps
|
||||
where eps.date < date(\'now\', \'+1 days\')'
|
||||
%-->
|
||||
|
62
templates/queries-index-mysql.tpl.html
Normal file
@@ -0,0 +1,62 @@
|
||||
<!--% query_next_available_episode = '
|
||||
WITH next_id AS (
|
||||
SELECT id, id + 1 AS \'id_next\', date as \'last_date\'
|
||||
FROM eps
|
||||
WHERE eps.date > NOW()
|
||||
)
|
||||
SELECT
|
||||
MIN(next_id.id_next) AS \'next_id\',
|
||||
DATE_FORMAT(MIN(last_date), \'%Y\') AS \'last_year\',
|
||||
DATE_FORMAT(MIN(last_date), \'%d\') AS \'last_day\',
|
||||
DATE_FORMAT(MIN(last_date), \'%m\') AS \'last_month\'
|
||||
FROM next_id
|
||||
LEFT JOIN eps ON next_id.id_next = eps.id
|
||||
WHERE eps.id IS NULL
|
||||
'
|
||||
%-->
|
||||
<!--% query_latest_episodes = '
|
||||
WITH comment_tallies AS (
|
||||
SELECT
|
||||
eps_id,
|
||||
COUNT(eps_id) AS eps_tally
|
||||
FROM comments
|
||||
GROUP BY eps_id
|
||||
)
|
||||
SELECT
|
||||
eps.id,
|
||||
eps.explicit,
|
||||
eps.date, eps.license, eps.duration,
|
||||
eps.title, eps.summary, eps.tags,
|
||||
eps.notes,
|
||||
hosts.local_image,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email,
|
||||
miniseries.name AS series, miniseries.id AS seriesid,
|
||||
COALESCE (comment_tallies.eps_tally, 0) AS eps_tally
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
LEFT JOIN comment_tallies ON eps.id = comment_tallies.eps_id
|
||||
WHERE eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
|
||||
ORDER BY eps.id DESC
|
||||
LIMIT 10
|
||||
'
|
||||
%-->
|
||||
<!--% query_last_5_weeks_episodes = '
|
||||
SELECT
|
||||
eps.id,
|
||||
CASE eps.explicit WHEN 1 THEN \'Explicit\' ELSE \'Clean\' END AS explicit ,
|
||||
eps.date, eps.license, eps.title, eps.summary,
|
||||
eps.duration, eps.notes, eps.tags,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email, hosts.local_image,
|
||||
miniseries.name AS series, miniseries.id AS seriesid
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
|
||||
ORDER BY eps.id DESC
|
||||
LIMIT 30 OFFSET 10
|
||||
'
|
||||
%-->
|
||||
|
62
templates/queries-index-sqlite.tpl.html
Normal file
@@ -0,0 +1,62 @@
|
||||
<!--% query_next_available_episode = '
|
||||
WITH next_id AS (
|
||||
SELECT id, id + 1 AS \'id_next\', date as \'last_date\'
|
||||
FROM eps
|
||||
WHERE eps.date > date(\'now\')
|
||||
)
|
||||
SELECT
|
||||
MIN(next_id.id_next) AS \'next_id\',
|
||||
strftime(\'%Y\', MIN (last_date)) AS \'last_year\',
|
||||
strftime(\'%d\', MIN (last_date)) AS \'last_day\',
|
||||
strftime(\'%m\', MIN (last_date)) AS \'last_month\'
|
||||
FROM next_id
|
||||
LEFT JOIN eps ON next_id.id_next = eps.id
|
||||
WHERE eps.id IS NULL
|
||||
'
|
||||
%-->
|
||||
<!--% query_latest_episodes = '
|
||||
WITH comment_tallies AS (
|
||||
SELECT
|
||||
eps_id,
|
||||
COUNT(eps_id) AS eps_tally
|
||||
FROM comments
|
||||
GROUP BY eps_id
|
||||
)
|
||||
SELECT
|
||||
eps.id,
|
||||
eps.explicit,
|
||||
eps.date, eps.license, eps.duration,
|
||||
eps.title, eps.summary, eps.tags,
|
||||
eps.notes,
|
||||
hosts.local_image,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email,
|
||||
miniseries.name AS series, miniseries.id AS seriesid,
|
||||
COALESCE (comment_tallies.eps_tally, 0) AS eps_tally
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
LEFT JOIN comment_tallies ON eps.id = comment_tallies.eps_id
|
||||
WHERE eps.date < date(\'now\', \'+1 days\')
|
||||
ORDER BY eps.id + 0 DESC
|
||||
LIMIT 10
|
||||
'
|
||||
%-->
|
||||
<!--% query_last_5_weeks_episodes = '
|
||||
SELECT
|
||||
eps.id,
|
||||
CASE eps.explicit WHEN 1 THEN \'Explicit\' ELSE \'Clean\' END AS explicit ,
|
||||
eps.date, eps.license, eps.title, eps.summary,
|
||||
eps.duration, eps.notes, eps.tags,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email, hosts.local_image,
|
||||
miniseries.name AS series, miniseries.id AS seriesid
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE eps.date < date(\'now\', \'+1 days\')
|
||||
ORDER BY eps.id + 0 DESC
|
||||
LIMIT 30 OFFSET 10
|
||||
'
|
||||
%-->
|
||||
|
15
templates/queries-series-mysql.tpl.html
Normal file
@@ -0,0 +1,15 @@
|
||||
<!--% query_episodes = 'SELECT miniseries.id, miniseries.name, miniseries.description,
|
||||
miniseries.private, miniseries.image, miniseries.valid,
|
||||
ep.number_of_episodes, ep.latest_show, ep.earliest_show
|
||||
FROM miniseries
|
||||
INNER JOIN
|
||||
(SELECT series,
|
||||
COUNT(eps.id) AS number_of_episodes,
|
||||
MAX(eps.date) AS latest_show,
|
||||
MIN(eps.date) AS earliest_show
|
||||
FROM eps
|
||||
WHERE eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
|
||||
GROUP BY series) AS ep ON ep.series = miniseries.id
|
||||
ORDER BY name'
|
||||
%-->
|
||||
|
15
templates/queries-series-sqlite.tpl.html
Normal file
@@ -0,0 +1,15 @@
|
||||
<!--% query_episodes = 'SELECT miniseries.id, miniseries.name, miniseries.description,
|
||||
miniseries.private, miniseries.image, miniseries.valid,
|
||||
ep.number_of_episodes, ep.latest_show, ep.earliest_show
|
||||
FROM miniseries
|
||||
INNER JOIN
|
||||
(SELECT series,
|
||||
COUNT(eps.id) AS number_of_episodes,
|
||||
MAX(eps.date) AS latest_show,
|
||||
MIN(eps.date) AS earliest_show
|
||||
FROM eps
|
||||
WHERE eps.date < date(\'now\', \'+1 days\')
|
||||
GROUP BY series) AS ep ON ep.series = miniseries.id
|
||||
ORDER BY name'
|
||||
%-->
|
||||
|
29
templates/queries-series_episodes-mysql.tpl.html
Normal file
@@ -0,0 +1,29 @@
|
||||
<!--% query_series_sql = 'SELECT miniseries.id, miniseries.name,
|
||||
miniseries.description,
|
||||
miniseries.private, miniseries.image, miniseries.valid,
|
||||
ep.number_of_episodes, ep.latest_show, ep.earliest_show
|
||||
FROM miniseries
|
||||
INNER JOIN
|
||||
(SELECT series,
|
||||
COUNT(eps.id) AS number_of_episodes,
|
||||
MAX(eps.date) AS latest_show,
|
||||
MIN(eps.date) AS earliest_show
|
||||
FROM eps
|
||||
WHERE eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
|
||||
GROUP BY series) AS ep ON ep.series = miniseries.id
|
||||
WHERE miniseries.id = ?
|
||||
ORDER BY name'
|
||||
%-->
|
||||
<!--% query_shows_sql = 'SELECT
|
||||
id, date, title,
|
||||
duration, summary, notes,
|
||||
explicit, eps.license, tags,
|
||||
hosts.host, hosts.hostid
|
||||
FROM eps
|
||||
INNER JOIN hosts
|
||||
ON eps.hostid = hosts.hostid
|
||||
WHERE series = ? AND eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
|
||||
ORDER BY eps.id DESC
|
||||
'
|
||||
%-->
|
||||
|
28
templates/queries-series_episodes-sqlite.tpl.html
Normal file
@@ -0,0 +1,28 @@
|
||||
<!--% query_series_sql = 'SELECT miniseries.id, miniseries.name,
|
||||
miniseries.description,
|
||||
miniseries.private, miniseries.image, miniseries.valid,
|
||||
ep.number_of_episodes, ep.latest_show, ep.earliest_show
|
||||
FROM miniseries
|
||||
INNER JOIN
|
||||
(SELECT series,
|
||||
COUNT(eps.id) AS number_of_episodes,
|
||||
MAX(eps.date) AS latest_show,
|
||||
MIN(eps.date) AS earliest_show
|
||||
FROM eps
|
||||
WHERE eps.date < date(\'now\', \'+1 days\')
|
||||
GROUP BY series) AS ep ON ep.series = miniseries.id
|
||||
WHERE miniseries.id = ?
|
||||
ORDER BY name'
|
||||
%-->
|
||||
<!--% query_shows_sql = 'SELECT
|
||||
id, date, title,
|
||||
duration, summary, notes,
|
||||
explicit, eps.license, tags,
|
||||
hosts.host, hosts.hostid
|
||||
FROM eps
|
||||
INNER JOIN hosts
|
||||
ON eps.hostid = hosts.hostid
|
||||
WHERE series = ? AND eps.date < date(\'now\', \'+1 days\')
|
||||
ORDER BY eps.id DESC
|
||||
'
|
||||
%-->
|
59
templates/rss-comments.tpl.xml
Normal file
@@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" >
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
|
||||
<!--% USE date %-->
|
||||
<channel>
|
||||
<title>Hacker Public Radio ~ Comment Feed</title>
|
||||
<link><!--% baseurl %-->about.html</link>
|
||||
<description>Comments Feed: Hacker Public Radio is an podcast that releases shows every weekday Monday through Friday. Our shows are produced by the community (you) and can be on any topic that are of interest to hackers and hobbyists.</description>
|
||||
<language>en-us</language>
|
||||
<copyright>Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) License</copyright>
|
||||
<managingEditor>feedback.nospam@nospam.hackerpublicradio.org (HPR Feedback)</managingEditor>
|
||||
<webMaster>admin.nospam@nospam.hackerpublicradio.org (HPR Webmaster)</webMaster>
|
||||
<generator>hpr_generator</generator>
|
||||
<docs>http://www.rssboard.org/rss-specification</docs>
|
||||
<ttl>600</ttl>
|
||||
<image>
|
||||
<url><!--% baseurl %-->images/hpr_feed_small.png</url>
|
||||
<title>Hacker Public Radio ~ Comment Feed</title>
|
||||
<link><!--% baseurl %-->about.html</link>
|
||||
<description>The Hacker Public Radio Old Microphone Logo</description>
|
||||
<height>164</height>
|
||||
<width>144</width>
|
||||
</image>
|
||||
<atom:link href="<!--% baseurl %-->comments.rss" rel="self" type="application/rss+xml" />
|
||||
<pubDate><!--% format_feed_date(date.now) %--></pubDate>
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% FOREACH item IN DBI.query('
|
||||
SELECT C.*,
|
||||
H.host, H.hostid AS host_id,
|
||||
E.title AS episode_title,
|
||||
E.date AS episode_date,
|
||||
E.duration AS episode_duration,
|
||||
M.id AS series_id, M.name AS series_name
|
||||
FROM comments AS C
|
||||
INNER JOIN eps AS E
|
||||
ON C.eps_id = E.id
|
||||
INNER JOIN hosts AS H
|
||||
ON E.hostid = H.hostid
|
||||
INNER JOIN miniseries AS M
|
||||
ON E.series = M.id
|
||||
ORDER BY C.comment_timestamp DESC
|
||||
LIMIT 30
|
||||
')
|
||||
%-->
|
||||
|
||||
<item>
|
||||
<title><!--% item.comment_author_name %--> says: <!--% item.comment_title %--></title>
|
||||
<author>feedback.nospam@nospam.hackerpublicradio.org (<!--% item.comment_author_name %-->)</author>
|
||||
<link><!--% baseurl %-->eps/hpr<!--% zero_pad_left(item.eps_id) %-->/index.html#comments</link>
|
||||
<description><![CDATA[<strong>RE: hpr<!--% zero_pad_left(item.eps_id) %-->::<!--% item.episode_date %--> <em><!--% item.episode_title %--></em> by <a href="<!--% baseurl %-->correspondents/<!--% zero_pad_left(item.host_id) %-->.html"><!--% item.host %--></a></strong><!--% rss_show_series(item.series_name, item.series_id) %--><br />
|
||||
<!--% display_episode_duration(item.episode_duration) %--><!--% display_listen_in(item.eps_id) %--><br /><!--% item.comment_text %-->
|
||||
]]></description>
|
||||
<pubDate><!--% format_feed_date(item.comment_timestamp) %--></pubDate>
|
||||
<guid isPermaLink="false"><!--% baseurl %-->eps/hpr<!--% zero_pad_left(item.eps_id) %-->/index.html#comment_<!--% item.id %--></guid>
|
||||
</item>
|
||||
<!--% END %-->
|
||||
</channel>
|
||||
</rss>
|
@@ -1,5 +1,5 @@
|
||||
<!--% PROCESS 'shared-item.tpl.xml' %-->
|
||||
<!--% PROCESS 'rss-query-hpr.tpl.xml' %-->
|
||||
<!--% PROCESS "rss-query-hpr-${constants.database}.tpl.xml" %-->
|
||||
<!--% FOREACH episode IN feed_result %-->
|
||||
<!--% display_item(episode, media_file_extension, audio_mime_type) %-->
|
||||
<!--% END %-->
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<!--% PROCESS 'shared-item.tpl.xml' %-->
|
||||
<!--% PROCESS 'rss-query-hpr_total.tpl.xml' %-->
|
||||
<!--% PROCESS "rss-query-hpr_total-${constants.database}.tpl.xml" %-->
|
||||
<!--% FOREACH episode IN feed_result %-->
|
||||
<!--% display_item(episode, media_file_extension, audio_mime_type) %-->
|
||||
<!--% END %-->
|
||||
|
23
templates/rss-query-hpr-mysql.tpl.xml
Normal file
@@ -0,0 +1,23 @@
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% query_hpr_feed = DBI.prepare('
|
||||
SELECT
|
||||
eps.id,
|
||||
eps.explicit,
|
||||
DATE_FORMAT(eps.date, \'%H:%i:%S %d:%m:%Y\') AS \'date\',
|
||||
eps.license, eps.duration,
|
||||
eps.title, eps.summary, eps.tags,
|
||||
eps.notes,
|
||||
hosts.local_image,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email,
|
||||
miniseries.name AS series, miniseries.id AS seriesid
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
|
||||
ORDER BY eps.date DESC
|
||||
LIMIT 10
|
||||
')
|
||||
%-->
|
||||
<!--% feed_result = query_hpr_feed.execute() %-->
|
||||
|
22
templates/rss-query-hpr_total-mysql.tpl.xml
Normal file
@@ -0,0 +1,22 @@
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% query_hpr_feed = DBI.prepare('
|
||||
SELECT
|
||||
eps.id,
|
||||
eps.explicit,
|
||||
DATE_FORMAT(eps.date, \'%H:%i:%S %d:%m:%Y\') AS \'date\',
|
||||
eps.license, eps.duration,
|
||||
eps.title, eps.summary, eps.tags,
|
||||
eps.notes,
|
||||
hosts.local_image,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email,
|
||||
miniseries.name AS series, miniseries.id AS seriesid
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
|
||||
ORDER BY eps.date DESC
|
||||
')
|
||||
%-->
|
||||
<!--% feed_result = query_hpr_feed.execute() %-->
|
||||
|
18
templates/shared-call_for_shows.tpl.html
Normal file
@@ -0,0 +1,18 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% PROCESS "queries-call_for_shows-${constants.database}.tpl.html" %-->
|
||||
<!--% MACRO display_call_for_shows BLOCK %-->
|
||||
<!--% result_call_for_shows = DBI.prepare(query_call_for_shows)
|
||||
%-->
|
||||
<!--% results_call_for_shows = result_call_for_shows.execute().get_all() %-->
|
||||
<!--% IF results_call_for_shows.0.request_for_shows == 1 %-->
|
||||
<!--% USE date %-->
|
||||
<article>
|
||||
<header>
|
||||
<h3>Call for shows</h3>
|
||||
</header>
|
||||
<p><strong><em>We are running very low on shows</em></strong> at the moment. Have a look at the <a href="<!--% absolute_path(baseurl) %-->correspondents/index.html">hosts</a> page and if you don't see "<!--% date.format(date.now, '%Y') %-->-??-??" next to your name, or if your name is not listed, you might consider sending us in something.</p>
|
||||
<!-- <img src="/images/hprstats.png" alt="hpr queue showing an graph showing how few shows we have" /> -->
|
||||
<p>There are no files to process on the FTP server.</p>
|
||||
</article>
|
||||
<!--% END %-->
|
||||
<!--% END %-->
|
@@ -1,12 +1,38 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
|
||||
<!--% MACRO show_series(series, series_id) IF series != "" %-->
|
||||
<label>Series:</label> <a href="<!--% absolute_path(baseurl) %-->series/<!--% zero_pad_left(series_id) %-->.html"><!--% series %--></a>.
|
||||
<!--% MACRO rss_show_series(series, series_id) IF series != "general" %-->
|
||||
from the series <em><a href="<!--% baseurl %-->series/<!--% zero_pad_left(series_id) %-->.html"><!--% series %--></em></a>.
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO show_meta(show) BLOCK %-->
|
||||
<span><label>Released:</label> <!--% show.date %-->.</span> <span><label>Duration:</label> <!--% show.duration %-->.</span> <span><label>Flag:</label> <!--% display_explicit(show.explicit) %-->.</span> <span><!--% show_series(show.series, show.seriesid) %--></span> <br>
|
||||
<span><label>Tags:</label> <em><!--% show.tags %--></em>.</span>
|
||||
<!--% MACRO show_series(series, series_id, label) IF series != "" %-->
|
||||
<!--% IF label == "" %-->
|
||||
<!--% label = "Series" %-->
|
||||
<!--% END %-->
|
||||
<label><!--% label %-->:</label> <a href="<!--% absolute_path(baseurl) %-->series/<!--% zero_pad_left(series_id) %-->.html"><!--% series %--></a>.
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO display_tags(tags) BLOCK %-->
|
||||
<span><label>Tags:</label> <em><!--% tags %--></em>.</span>
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO display_listen_in(eps_id, episode_type) BLOCK %-->
|
||||
<!--% IF episode_type == "" %--><!--% episode_type = 'hpr' %--><!--% END %-->
|
||||
Listen in
|
||||
<!--% IF episode_type == 'hpr' %-->
|
||||
<a href="<!--% media_path(eps_id, episode_type, 'ogg', baseurl, media_baseurl) %-->">ogg</a>,
|
||||
<a href="<!--% media_path(eps_id, episode_type, 'spx', baseurl, media_baseurl) %-->">spx</a>,
|
||||
or
|
||||
<!--% END %-->
|
||||
<a href="<!--% media_path(eps_id, episode_type, 'mp3', baseurl, media_baseurl) %-->">mp3</a> format.
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO display_comments_tally(eps_id, tally) BLOCK %-->
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(eps_id) %-->/index.html#comments">Comments (<!--% tally %-->)</a>.
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO show_meta(show, hide_tags) BLOCK %-->
|
||||
<span><label>Released:</label> <!--% show.date %-->.</span> <span><label>Duration:</label> <!--% display_episode_duration(show.duration) %-->.</span> <span><label>Flag:</label> <!--% display_explicit(show.explicit) %-->.</span> <span><!--% show_series(show.series, show.seriesid) %--></span> <br>
|
||||
<!--% IF hide_tags == "" %--><!--% display_tags(tags) %--><!--% END %-->
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO show_summary(show, hide_host) BLOCK %-->
|
||||
@@ -19,3 +45,15 @@
|
||||
<!--% show.summary %-->
|
||||
</p>
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO twat_show_summary(show, hide_host) BLOCK %-->
|
||||
|
||||
<h3 class="title"><a href="<!--% absolute_path(baseurl) %-->eps/twat<!--% zero_pad_left(show.id) %-->/index.html">twat<!--% show.id %--> :: <!--% show.title %--></a> <!--% IF hide_host == "" %-->
|
||||
hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(show.hostid) %-->.html"><!--% show.host %--></a>
|
||||
<!--% END %-->
|
||||
</h3>
|
||||
<p class="meta"><!--% show_meta(show) %--><br>
|
||||
<!--% show.summary %-->
|
||||
</p>
|
||||
<!--% END %-->
|
||||
|
||||
|
16
templates/shared-listen-now.tpl.html
Normal file
@@ -0,0 +1,16 @@
|
||||
<!--% MACRO listen_now(episode, episode_type, baseurl, media_baseurl) BLOCK %-->
|
||||
<h2>Listen Now</h2>
|
||||
<p>Duration: <!--% display_episode_duration(episode.duration) %--></p>
|
||||
<audio controls preload="none">
|
||||
<source src="<!--% media_path(episode.id, episode_type, 'ogg', baseurl, media_baseurl) %-->" type="audio/ogg" >
|
||||
<source src="<!--% media_path(episode.id, episode_type, 'mp3', baseurl, media_baseurl) %-->" type="audio/mpeg" >
|
||||
</audio>
|
||||
<ul>
|
||||
<!--% IF episode_type != "twat" %-->
|
||||
<li>ogg: <a href="<!--% media_path(episode.id, episode_type, 'ogg', baseurl, media_baseurl) %-->"><!--% media_path(episode.id, episode_type, 'ogg', baseurl, media_baseurl) %--></a></li>
|
||||
<li>spx: <a href="<!--% media_path(episode.id, episode_type, 'spx', baseurl, media_baseurl) %-->"><!--% media_path(episode.id, episode_type, 'spx', baseurl, media_baseurl) %--></a></li>
|
||||
<!--% END %-->
|
||||
<li>mp3: <a href="<!--% media_path(episode.id, episode_type, 'mp3', baseurl, media_baseurl) %-->"><!--% media_path(episode.id, episode_type, 'mp3', baseurl, media_baseurl) %--></a></li>
|
||||
</ul>
|
||||
<!--% END %-->
|
||||
|
12
templates/shared-show-transcript.tpl.html
Normal file
@@ -0,0 +1,12 @@
|
||||
<!--% MACRO show_transcript(episode, episode_type, baseurl, media_baseurl) BLOCK %-->
|
||||
<h2>Show Transcript</h2>
|
||||
<p>Automatically generated using <a href="https://github.com/openai/whisper">whisper</a>
|
||||
<pre><code>whisper --model tiny --language en hpr<!--% zero_pad_left(episode.id) %-->.wav</code></pre></p>
|
||||
|
||||
<ul>
|
||||
<li>Text: <a href="<!--% media_path(episode.id, episode_type, 'txt', baseurl, media_baseurl) %-->">hpr<!--% zero_pad_left(episode.id) %-->.txt</a></li>
|
||||
<li><a href="https://en.wikipedia.org/wiki/WebVTT">WebVTT</a>: <a href="<!--% media_path(episode.id, episode_type, 'vtt', baseurl, media_baseurl) %-->">hpr<!--% zero_pad_left(episode.id) %-->.vtt</a></li>
|
||||
<li><a href="https://en.wikipedia.org/wiki/SubRip">SubRip</a>: <a href="<!--% media_path(episode.id, episode_type, 'srt', baseurl, media_baseurl) %-->">hpr<!--% zero_pad_left(episode.id) %-->.srt</a></li>
|
||||
</ul>
|
||||
<!--% END %-->
|
||||
|
@@ -1,6 +1,11 @@
|
||||
<!--% MACRO zero_pad_left(word) BLOCK %-->
|
||||
<!--% USE String(word) %-->
|
||||
<!--% String.format("%04s") %-->
|
||||
<!--% MACRO zero_pad_left(word, pad_length) BLOCK %-->
|
||||
<!--% IF pad_length %-->
|
||||
<!--% zero_pad_format = "%0${pad_length}s" %-->
|
||||
<!--% ELSE %-->
|
||||
<!--% zero_pad_format = "%04s" %-->
|
||||
<!--% END %-->
|
||||
<!--% USE String(word) %-->
|
||||
<!--% String.format(zero_pad_format) %-->
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO display_choice(choice, display_when_true, display_when_false) BLOCK %-->
|
||||
@@ -8,6 +13,20 @@
|
||||
<!--% ELSE %--><!--% display_when_false %--><!--% END %-->
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO display_episode_duration(duration_sec) BLOCK %-->
|
||||
<!--% seconds = duration_sec % 60 %-->
|
||||
<!--% USE format %-->
|
||||
<!--% minutes_only = format("%d") %-->
|
||||
<!--% minutes = minutes_only(duration_sec / 60) %-->
|
||||
<!--% hours_only = format("%d") %-->
|
||||
<!--% hours = hours_only(minutes / 60) %-->
|
||||
<!--% IF hours >= 1 %-->
|
||||
<!--% minutes = minutes - hours * 60 %-->
|
||||
<!--% END %-->
|
||||
<!--% display_hours = format("%02d:%02d:%02d") %-->
|
||||
<!--% display_hours(hours,minutes,seconds) %-->
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO display_explicit(is_explicit) BLOCK %-->
|
||||
<!--% display_choice(is_explicit, 'Explicit', 'Clean') %-->
|
||||
<!--% END %-->
|
||||
@@ -17,7 +36,7 @@
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO format_feed_date(date_to_format) BLOCK %-->
|
||||
<!--% USE feed_date = date(format = '%a, %e %b %Y 00:00:00 +0000', gmt=1) %-->
|
||||
<!--% USE feed_date = date(format = '%a, %d %b %Y %H:%M:%S +0000', gmt=1) %-->
|
||||
<!--% feed_date.format(date_to_format) %-->
|
||||
<!--% END %-->
|
||||
|
||||
@@ -25,17 +44,47 @@
|
||||
<!--% IF baseurl %-->./<!--% ELSE %-->/<!--% END %-->
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO step_navigation(baseurl, links) BLOCK %-->
|
||||
<small><a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(links.earliest) %-->/index.html" rel="first"><< First</a>,
|
||||
<!--% MACRO media_basepath(baseurl, media_baseurl) BLOCK %-->
|
||||
<!--% IF media_baseurl %-->
|
||||
<!--% media_baseurl %--><!--% ELSE %-->
|
||||
<!--% IF baseurl %--><!--% baseurl %--><!--% ELSE %-->/<!--% END %-->
|
||||
<!--% END %-->
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO media_path(episode_id, episode_type, media_type, baseurl, media_baseurl) BLOCK %-->
|
||||
<!--% IF episode_type == "twat" %-->
|
||||
<!--% padding = 3 %-->
|
||||
<!--% media_folder = "eps/"; padding = 3 %-->
|
||||
<!--% ELSE %-->
|
||||
<!--% media_folder = "local/" %-->
|
||||
<!--% END %-->
|
||||
<!--% IF media_baseurl %-->
|
||||
<!--% transcription_types = "txt srt vtt" %-->
|
||||
<!--% USE String(transcription_types) %-->
|
||||
<!--% USE String(media_baseurl) %-->
|
||||
<!--% IF transcription_types.search(media_type) && media_baseurl.search('archive.org') %-->
|
||||
<!--% media_baseurl = "${media_baseurl}hpr\$eps_id/" %-->
|
||||
<!--% END %-->
|
||||
<!--% media_folder = "" %-->
|
||||
<!--% media_baseurl = media_baseurl.replace('\$eps_id', zero_pad_left(episode_id)) %-->
|
||||
<!--% END %-->
|
||||
<!--% media_basepath(baseurl, media_baseurl) %--><!--% media_folder %--><!--% episode_type %--><!--% zero_pad_left(episode_id, padding) %-->.<!--% media_type %-->
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO step_navigation(baseurl, links, folder) BLOCK %-->
|
||||
<!--% IF folder %-->
|
||||
<!--% folder = folder %--><!--% ELSE %--><!--% folder = "hpr" %-->
|
||||
<!--% END %-->
|
||||
<small><a href="<!--% absolute_path(baseurl) %-->eps/<!--% folder %--><!--% zero_pad_left(links.earliest) %-->/index.html" rel="first"><< First</a>,
|
||||
<!--% IF links.previous %-->
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(links.previous) %-->/index.html" rel="previous">< Previous</a>,
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/<!--% folder %--><!--% zero_pad_left(links.previous) %-->/index.html" rel="previous">< Previous</a>,
|
||||
<!--% ELSE %-->
|
||||
<span><</span> Previous,
|
||||
<!--% END %-->
|
||||
<!--% IF links.next %-->
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(links.next) %-->/index.html" rel="next">Next ></a>,
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/<!--% folder %--><!--% zero_pad_left(links.next) %-->/index.html" rel="next">Next ></a>,
|
||||
<!--% ELSE %-->
|
||||
Next <span>></span>
|
||||
<!--% END %-->
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(links.latest) %-->/index.html" rel="last">Latest >></a></small>
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/<!--% folder %--><!--% zero_pad_left(links.latest) %-->/index.html" rel="last">Latest >></a></small>
|
||||
<!--% END %-->
|
||||
|