Compare commits
1 Commits
f87199bd92
...
I123_Futur
Author | SHA1 | Date | |
---|---|---|---|
a97cc7714f |
@@ -31,10 +31,7 @@ apt install libconfig-std-perl \
|
||||
libtemplate-perl \
|
||||
libtemplate-plugin-dbi-perl \
|
||||
libdbd-sqlite3-perl libdate-calc-perl \
|
||||
libtie-dbi-perl \
|
||||
libtext-csv-xs-perl \
|
||||
libhtml-parser-perl
|
||||
|
||||
libtie-dbi-perl
|
||||
```
|
||||
|
||||
## Using CPAN to install the modules
|
||||
|
@@ -198,7 +198,7 @@ h1.showtitle { font-size: 125%;}
|
||||
|
||||
p.author { font-size: 85%;}
|
||||
p.shownotes { padding: .5em;}
|
||||
#maincontent footer p { /* font-size: 75%; */ margin-bottom: 1em;}
|
||||
#maincontent footer p { font-size: 75%; margin-bottom: 1em;}
|
||||
/* link styling */
|
||||
a:link {text-decoration: none;}
|
||||
|
||||
|
575
site-generator
575
site-generator
@@ -1,93 +1,84 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# {{{ POD documentation
|
||||
|
||||
=head1 NAME
|
||||
|
||||
site-generator - HPR Site Generator
|
||||
site-generator - HPR Site Generator
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
site-generator [OPTION]... PAGE|PAGE=<comma separated list of ids>...
|
||||
site-generator [OPTION]... PAGE|PAGE=<comma separated list of ids>...
|
||||
|
||||
-a, --all generate all pages defined in configuration file
|
||||
-c, --configuration path to configuration file
|
||||
-l, --list print list of configured pages
|
||||
-p, --preview print generated pages to standard out
|
||||
-q, --quiet suppress progress information while generating pages
|
||||
-v, --verbose print extended progress information while generating pages
|
||||
--help print this help message
|
||||
-a, --all generate all pages defined in configuration file
|
||||
-c, --configure path to configuration file
|
||||
-l, --list print list of configured pages
|
||||
-p, --preview print generated pages to standard out
|
||||
-q, --quiet suppress progress information while generating pages
|
||||
-v, --verbose print extended progress information while generating pages
|
||||
--help print this help message
|
||||
|
||||
Where I<PAGE> is a file name of a web page
|
||||
or the special I<ALL> (to generate all pages).
|
||||
Where I<PAGE> is a file name of a web page
|
||||
or the special I<ALL> (to generate all pages).
|
||||
|
||||
Examples:
|
||||
Examples:
|
||||
|
||||
Generate two specific pages:
|
||||
site-generator index about
|
||||
Generate two specific pages:
|
||||
site-generator index about
|
||||
|
||||
Generate the whole site:
|
||||
site-generator --all
|
||||
|
||||
Generate pages based on the same template:
|
||||
site-generator correspondent=1,3,5..10
|
||||
|
||||
Generate two specific pages with a different configuration:
|
||||
site-generator --configuration=site_sqlite.cfg index about
|
||||
Generate the whole site:
|
||||
site-generator --all
|
||||
|
||||
Generate pages based on the same template:
|
||||
site-generator correspondent=1,3,5..10
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This is a site generator for the Hacker Public Radio website based upon the
|
||||
Perl Template Toolkit.
|
||||
This is a site generator for the Hacker Public Radio website based upon the Perl Templates Toolkit.
|
||||
|
||||
=head1 INSTALLATION
|
||||
|
||||
With SQLite
|
||||
* Create the sqlite3 database from the hpr.sql MySQL dump file available on
|
||||
hackerpublicradio.org. The default name for the database file is "hpr.db"
|
||||
and should be located in the root of the project directory. The name and
|
||||
location can be set in the site.cfg file.
|
||||
* An "update-hpr.sh" helper script is available in the utils directory. This
|
||||
script will download the hpr.sql file, convert it to the SQLite hpr.db file,
|
||||
and regenerate the website using the site-generator.
|
||||
1. `cd` into the root of the project directory
|
||||
2. Run `./utils/update-hpr.sh`
|
||||
* SQLite v3.8.3 or greater is recommended. CTE WITH clauses are used in some template queries.
|
||||
Must convert WITH clauses to sub-queries when using earlier versions of SQLite.
|
||||
With SQLite
|
||||
* Create the sqlite3 database from the hpr.sql MySQL dump file available on
|
||||
hackerpublicradio.org. The default name for the database file is "hpr.db"
|
||||
and should be located in the root of the project directory. The name and
|
||||
location can be set in the site.cfg file.
|
||||
* An "update-hpr.sh" helper script is available in the utils directory. This
|
||||
script will download the hpr.sql file, convert it to the SQLite hpr.db file,
|
||||
and regenerate the website using the site-generator.
|
||||
1. `cd` into the root of the project directory
|
||||
2. Run `./utils/update-hpr.sh`
|
||||
* SQLite v3.8.3 or greater is recommended. CTE WITH clauses are used in some template queries.
|
||||
Must convert WITH clauses to sub-queries when using earlier versions of SQLite.
|
||||
|
||||
With MySQL
|
||||
* Create database hpr_hpr in the MySQL server from HPR dump file.
|
||||
- sudo mysql --host=localhost < hpr.sql
|
||||
* Create a user that will be used by the site-generator.
|
||||
- Suggested username: hpr-generator
|
||||
- CREATE USER 'hpr-generator'@'localhost' IDENTIFIED BY '<password>';
|
||||
* Limit the user's privileges to EXECUTE and SELECT
|
||||
- GRANT SELECT ON hpr_hpr.* TO 'hpr-generator'@'localhost';
|
||||
- GRANT EXECUTE ON `hpr_hpr`.* TO 'hpr-generator'@'localhost';
|
||||
With MySQL
|
||||
* Create database hpr_hpr in the MySQL server from HPR dump file.
|
||||
- sudo mysql --host=localhost < hpr.sql
|
||||
* Create a user that will be used by the site-generator.
|
||||
- Suggested username: hpr-generator
|
||||
- CREATE USER 'hpr-generator'@'localhost' IDENTIFIED BY '<password>';
|
||||
* Limit the user's privileges to EXECUTE and SELECT
|
||||
- GRANT SELECT ON hpr_hpr.* TO 'hpr-generator'@'localhost';
|
||||
- GRANT EXECUTE ON `hpr_hpr`.* TO 'hpr-generator'@'localhost';
|
||||
|
||||
Install the needed Perl modules using preferred method (distribution packages, CPAN, etc.)
|
||||
* GetOpt
|
||||
* Pod::Usage
|
||||
* Config::Std
|
||||
* Template
|
||||
* Template::Plugin::File
|
||||
* Template::Plugin::DBI
|
||||
* Template::Plugin::HTML::Strip
|
||||
* DBI
|
||||
* Tie::DBI
|
||||
* DBD::SQLite or DBD:mysql
|
||||
* Date::Calc
|
||||
* Text::CSV_XS
|
||||
Install the needed Perl modules using preferred method (distribution packages, CPAN, etc.)
|
||||
* GetOpt
|
||||
* Pod::Usage
|
||||
* Config::Std
|
||||
* Template
|
||||
* Template::Plugin::File
|
||||
* Template::Plugin::DBI
|
||||
* DBI
|
||||
* Tie::DBI
|
||||
* DBD::SQLite or DBD:mysql
|
||||
* Date::Calc
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Roan Horning <roan.horning@no-spam.gmail.com>
|
||||
Roan Horning <roan.horning@no-spam.gmail.com>
|
||||
|
||||
=head1 LICENSE
|
||||
|
||||
site-generator -- a static website generator for HPR
|
||||
Copyright (C) 2022 Roan Horning
|
||||
site-generator -- a static website generator for HPR
|
||||
Copyright (C) 2022 Roan Horning
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
@@ -100,327 +91,249 @@ Perl Template Toolkit.
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
=cut
|
||||
|
||||
# }}}
|
||||
|
||||
use 5.012;
|
||||
use strict;
|
||||
use warnings;
|
||||
use open ':encoding(UTF-8)';
|
||||
|
||||
use Getopt::Long qw(:config auto_help);
|
||||
use Pod::Usage;
|
||||
use Config::Std;
|
||||
use Text::CSV_XS;
|
||||
use HTML::Entities qw(encode_entities_numeric);
|
||||
use Template;
|
||||
use Template::Plugin::HTML::Strip;
|
||||
use Data::Dumper;
|
||||
|
||||
exit main();
|
||||
|
||||
sub main {
|
||||
|
||||
# Argument parsing
|
||||
my $all;
|
||||
my $configuration_path;
|
||||
my $preview;
|
||||
my $verbose;
|
||||
my $quiet;
|
||||
GetOptions(
|
||||
'all' => \$all,
|
||||
'configuration=s' => \$configuration_path,
|
||||
'list' => \&print_available_pages,
|
||||
'preview' => \$preview,
|
||||
'verbose' => \$verbose,
|
||||
'quiet' => \$quiet,
|
||||
) or pod2usage(1);
|
||||
pod2usage(1) unless @ARGV || $all;
|
||||
my (@page_args) = @ARGV;
|
||||
# Argument parsing
|
||||
my $all;
|
||||
my $configuration_path;
|
||||
my $preview;
|
||||
my $verbose;
|
||||
my $quiet;
|
||||
GetOptions(
|
||||
'all' => \$all,
|
||||
'configuration=s' => \$configuration_path,
|
||||
'list' => \&print_available_pages,
|
||||
'preview' => \$preview,
|
||||
'verbose' => \$verbose,
|
||||
'quiet' => \$quiet,
|
||||
) or pod2usage(1);
|
||||
pod2usage(1) unless @ARGV || $all;
|
||||
my (@page_args) = @ARGV;
|
||||
|
||||
if ($quiet) {
|
||||
$verbose = 'quiet';
|
||||
};
|
||||
if ($quiet) {
|
||||
$verbose = 'quiet';
|
||||
};
|
||||
|
||||
if (!$configuration_path) {
|
||||
$configuration_path = "site.cfg";
|
||||
}
|
||||
if (!$configuration_path) {
|
||||
$configuration_path = "site.cfg";
|
||||
}
|
||||
|
||||
my %config;
|
||||
if ( -f $configuration_path ) {
|
||||
# Load config file
|
||||
read_config $configuration_path => %config;
|
||||
}
|
||||
else {
|
||||
print STDOUT "Could not read configuration file: $configuration_path\n";
|
||||
exit 1;
|
||||
}
|
||||
my %config;
|
||||
if ( -f $configuration_path ) {
|
||||
# Load config file
|
||||
read_config $configuration_path => %config;
|
||||
}
|
||||
else {
|
||||
print STDOUT "Could not read configuration file: $configuration_path\n";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
my $tt = get_template_html($config{DBI}, $config{app_paths});
|
||||
my $tt = get_template_html($config{DBI}, $config{app_paths});
|
||||
|
||||
#
|
||||
# Define a TT² vmethod called 'csv_parse', it takes a scalar value and
|
||||
# returns an arrayref. Also define a filter called 'xml_entity' which
|
||||
# numerically encodes non-ASCII characters.
|
||||
#
|
||||
$tt->context->define_vmethod( 'scalar', 'csv_parse', \&parse_csv );
|
||||
$tt->context->define_filter( 'xml_entity', \&xml_entity );
|
||||
# If command line option all is set, parse configuration file
|
||||
# for all pages
|
||||
if ($all) {
|
||||
@page_args = keys %config;
|
||||
|
||||
# If command line option all is set, parse configuration file
|
||||
# for all pages
|
||||
if ($all) {
|
||||
@page_args = keys %config;
|
||||
# Remove non page sections of the configuration file
|
||||
# from the generated list of pages.
|
||||
@page_args= grep { $_ ne 'DBI' } @page_args;
|
||||
@page_args= grep { $_ ne 'root_template' } @page_args;
|
||||
@page_args= grep { $_ ne 'app_paths' } @page_args;
|
||||
|
||||
# Remove non page sections of the configuration file
|
||||
# from the generated list of pages.
|
||||
@page_args= grep { $_ ne 'DBI' } @page_args;
|
||||
@page_args= grep { $_ ne 'root_template' } @page_args;
|
||||
@page_args= grep { $_ ne 'app_paths' } @page_args;
|
||||
};
|
||||
foreach my $page_arg (@page_args) {
|
||||
my %parsed_arg = parse_page_arg($page_arg);
|
||||
if (exists($config{$parsed_arg{'page'}})) {
|
||||
my $page_config = $config{$parsed_arg{'page'}};
|
||||
$page_config->{'page'} = $parsed_arg{'page'};
|
||||
|
||||
};
|
||||
foreach my $page_arg (@page_args) {
|
||||
my %parsed_arg = parse_page_arg($page_arg);
|
||||
if (exists($config{$parsed_arg{'page'}})) {
|
||||
my $page_config = $config{$parsed_arg{'page'}};
|
||||
$page_config->{'page'} = $parsed_arg{'page'};
|
||||
# Set page's root_template to the default root_template if the
|
||||
# page root_template property is not set in the configuration file.
|
||||
if (exists $page_config->{'root_template'} == 0) {
|
||||
$page_config->{'root_template'} = $config{root_template}{content};
|
||||
}
|
||||
|
||||
# Set page's root_template to the default root_template if the
|
||||
# page root_template property is not set in the configuration file.
|
||||
if (exists $page_config->{'root_template'} == 0) {
|
||||
$page_config->{'root_template'} = $config{root_template}{content};
|
||||
}
|
||||
# Set all config root_template properties as default page config properties
|
||||
# except the previously set root_template content property
|
||||
my @root_args = grep { $_ ne 'content' } keys %{$config{root_template}};
|
||||
foreach my $root_arg (@root_args) {
|
||||
if (exists $page_config->{$root_arg} == 0) {
|
||||
$page_config->{$root_arg} = $config{root_template}{$root_arg};
|
||||
}
|
||||
}
|
||||
|
||||
# Set all config root_template properties as default page config properties
|
||||
# except the previously set root_template content property
|
||||
my @root_args = grep { $_ ne 'content' } keys %{$config{root_template}};
|
||||
foreach my $root_arg (@root_args) {
|
||||
if (exists $page_config->{$root_arg} == 0) {
|
||||
$page_config->{$root_arg} = $config{root_template}{$root_arg};
|
||||
}
|
||||
}
|
||||
|
||||
if ($page_config->{'multipage'} && $page_config->{'multipage'} eq 'true') {
|
||||
if (scalar @{$parsed_arg{'ids'}} == 0) {
|
||||
@{$parsed_arg{'ids'}} = get_ids_from_db($tt, \$page_config);
|
||||
}
|
||||
foreach my $id (@{$parsed_arg{'ids'}}) {
|
||||
$page_config->{'id'} = $id;
|
||||
verbose ($verbose, "Generating page: $page_config->{'page'} with id: $id");
|
||||
generate_page($tt, \$page_config, $preview);
|
||||
}
|
||||
}
|
||||
else {
|
||||
verbose ($verbose, "Generating page: $page_config->{'page'}");
|
||||
generate_page($tt, \$page_config, $preview);
|
||||
}
|
||||
}
|
||||
else {
|
||||
verbose (1, "\nWarning: Page $parsed_arg{'page'} is not defined in the configuration file.");
|
||||
}
|
||||
}
|
||||
if ($page_config->{'multipage'} && $page_config->{'multipage'} eq 'true') {
|
||||
if (scalar @{$parsed_arg{'ids'}} == 1) {
|
||||
@{$parsed_arg{'ids'}} = get_ids_from_db($tt, \$page_config);
|
||||
}
|
||||
foreach my $id (@{$parsed_arg{'ids'}}) {
|
||||
$page_config->{'id'} = $id;
|
||||
verbose ($verbose, "Generating page: $page_config->{'page'} with id: $id");
|
||||
generate_page($tt, \$page_config, $preview);
|
||||
}
|
||||
}
|
||||
else {
|
||||
verbose ($verbose, "Generating page: $page_config->{'page'}");
|
||||
generate_page($tt, \$page_config, $preview);
|
||||
}
|
||||
}
|
||||
else {
|
||||
verbose (1, "\nWarning: Page $parsed_arg{'page'} is not defined in the configuration file.");
|
||||
}
|
||||
}
|
||||
verbose (1, "\nFinished processing the files.");
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
sub get_template_html (\%@) {
|
||||
# For an HTML based Template file, define the
|
||||
# template start and end tags to also function as
|
||||
# HTML comments to make the template file valid HTML.
|
||||
#
|
||||
return Template->new(
|
||||
{ INCLUDE_PATH => $_[1]{templates_path},
|
||||
OUTPUT_PATH => $_[1]{output_path},
|
||||
EVAL_PERL => 1,
|
||||
START_TAG => '<!--%',
|
||||
END_TAG => '%-->',
|
||||
PRE_CHOMP => 1,
|
||||
POST_CHOMP => 1,
|
||||
CONSTANTS => {
|
||||
database => $_[0]{database},
|
||||
driver => $_[0]{driver},
|
||||
user => $_[0]{user},
|
||||
password => $_[0]{password},
|
||||
}
|
||||
}
|
||||
) || die $Template::ERROR, "\n";
|
||||
# For an HTML based Template file, define the
|
||||
# template start and end tags to also function as
|
||||
# HTML comments to make the template file valid HTML.
|
||||
#
|
||||
return Template->new({
|
||||
INCLUDE_PATH => $_[1]{templates_path},
|
||||
OUTPUT_PATH => $_[1]{output_path},
|
||||
EVAL_PERL => 1,
|
||||
START_TAG => '<!--%',
|
||||
END_TAG => '%-->',
|
||||
PRE_CHOMP => 1,
|
||||
POST_CHOMP => 1,
|
||||
CONSTANTS => {
|
||||
database => $_[0]{database},
|
||||
driver => $_[0]{driver},
|
||||
user => $_[0]{user},
|
||||
password => $_[0]{password},
|
||||
}
|
||||
}) || die $Template::ERROR, "\n";
|
||||
|
||||
}
|
||||
|
||||
sub generate_page {
|
||||
my ( $tt, $config, $preview ) = @_;
|
||||
my $html;
|
||||
if ( !$preview ) {
|
||||
$html = get_filename($$config);
|
||||
}
|
||||
$tt->process( $$config->{root_template},
|
||||
$$config, $html
|
||||
)
|
||||
|| die $tt->error(), "\n";
|
||||
sub generate_page {
|
||||
my ($tt, $config, $preview) = @_;
|
||||
my $html;
|
||||
if (!$preview) {
|
||||
$html = get_filename($$config);
|
||||
}
|
||||
$tt->process($$config->{root_template}, $$config, $html)
|
||||
|| die $tt->error(), "\n";
|
||||
|
||||
}
|
||||
|
||||
sub verbose {
|
||||
my ($verbose, $message) = @_;
|
||||
if ($verbose) {
|
||||
if ($verbose ne 'quiet') {
|
||||
print STDOUT "$message\n";
|
||||
}
|
||||
}
|
||||
else {
|
||||
STDOUT->autoflush(1);
|
||||
print STDOUT ".";
|
||||
};
|
||||
my ($verbose, $message) = @_;
|
||||
if ($verbose) {
|
||||
if ($verbose ne 'quiet') {
|
||||
print STDOUT "$message\n";
|
||||
}
|
||||
}
|
||||
else {
|
||||
STDOUT->autoflush(1);
|
||||
print STDOUT ".";
|
||||
};
|
||||
}
|
||||
|
||||
sub parse_page_arg {
|
||||
my ($page_arg) = @_;
|
||||
# Split page name from page ids if available.
|
||||
my ($page, $ids) = split(/=/, $page_arg);
|
||||
my @ids;
|
||||
my ($page_arg) = @_;
|
||||
# Split page name from page ids if available.
|
||||
my ($page, $ids) = split(/=/, $page_arg);
|
||||
my @ids = [];
|
||||
|
||||
if(!$ids) {
|
||||
$ids = "";
|
||||
}
|
||||
else {
|
||||
# Parse the page ids and push them onto @ids array
|
||||
my @ids_by_comma = split(/\,/, $ids);
|
||||
foreach my $id_by_comma (@ids_by_comma) {
|
||||
my @ids_for_range = split(/\.\./, $id_by_comma);
|
||||
if ((scalar @ids_for_range) == 2) {
|
||||
push @ids, $ids_for_range[0]..$ids_for_range[1];
|
||||
}
|
||||
elsif ((scalar @ids_for_range) == 1) {
|
||||
push @ids, $ids_for_range[0];
|
||||
}
|
||||
else {
|
||||
verbose (1, "\nWarning: Page $page id range $id_by_comma could not be parsed.");
|
||||
}
|
||||
}
|
||||
}
|
||||
return ('page' => $page, 'ids' => [@ids]);
|
||||
if(!$ids) {
|
||||
$ids = "";
|
||||
}
|
||||
else {
|
||||
# Parse the page ids and push them onto @ids array
|
||||
my @ids_by_comma = split(/\,/, $ids);
|
||||
foreach my $id_by_comma (@ids_by_comma) {
|
||||
my @ids_for_range = split(/\.\./, $id_by_comma);
|
||||
if ((scalar @ids_for_range) == 2) {
|
||||
push @ids, $ids_for_range[0]..$ids_for_range[1];
|
||||
}
|
||||
elsif ((scalar @ids_for_range) == 1) {
|
||||
push @ids, $ids_for_range[0];
|
||||
}
|
||||
else {
|
||||
verbose (1, "\nWarning: Page $page id range $id_by_comma could not be parsed.");
|
||||
}
|
||||
}
|
||||
}
|
||||
return ('page' => $page, 'ids' => [@ids]);
|
||||
}
|
||||
|
||||
sub get_ids_from_db {
|
||||
# Use a template to generate a string of page identifiers.
|
||||
# The template should return the string in the form of
|
||||
# <comma><identifier><comma><identifier>...
|
||||
#
|
||||
my ($tt, $config) = @_;
|
||||
my $selected_ids = "";
|
||||
my $id_template = "ids-$$config->{'page'}.tpl.html";
|
||||
# Use a template to generate a string of page identifiers.
|
||||
# The template should return the string in the form of
|
||||
# <comma><identifier><comma><identifier>...
|
||||
#
|
||||
my ($tt, $config) = @_;
|
||||
my $selected_ids = "";
|
||||
my $id_template = "ids-$$config->{'page'}.tpl.html";
|
||||
|
||||
$tt->process($id_template, $$config, \$selected_ids)
|
||||
|| die $tt->error(), "\n";
|
||||
|
||||
# Starts with a newline and comma
|
||||
return split(/,/, substr($selected_ids, 2));
|
||||
$tt->process($id_template, $$config, \$selected_ids)
|
||||
|| die $tt->error(), "\n";
|
||||
|
||||
return split(/,/, substr($selected_ids, 1));
|
||||
}
|
||||
|
||||
sub get_filename {
|
||||
my ($config) = @_;
|
||||
my $filename = "output.html";
|
||||
my $base_path = "";
|
||||
my ($config) = @_;
|
||||
my $filename = "output.html";
|
||||
my $base_path = "";
|
||||
|
||||
if ($$config{'filename'}) {
|
||||
if (substr($$config{'filename'}, -1) eq '/') {
|
||||
$base_path = $$config{'filename'};
|
||||
}
|
||||
else {
|
||||
$filename = $$config{'filename'};
|
||||
my $padded_index = "";
|
||||
if (exists $$config{'id'} && $$config{'id'} ne "") {
|
||||
$padded_index = sprintf("%04d", $$config{'id'});
|
||||
}
|
||||
$filename =~ s/\[id\]/$padded_index/;
|
||||
return $filename;
|
||||
}
|
||||
}
|
||||
# Default naming if full filename configuration is not supplied.
|
||||
if ($$config{'multipage'} && $$config{'multipage'} eq 'true') {
|
||||
my $padded_index = sprintf("%04d", $$config{'id'});
|
||||
$filename = "$base_path$$config{'page'}${padded_index}.html";
|
||||
}
|
||||
else {
|
||||
$filename = "$base_path$$config{'page'}.html";
|
||||
}
|
||||
return $filename;
|
||||
if ($$config{'filename'}) {
|
||||
if (substr($$config{'filename'}, -1) eq '/') {
|
||||
$base_path = $$config{'filename'};
|
||||
}
|
||||
else {
|
||||
$filename = $$config{'filename'};
|
||||
my $padded_index = "";
|
||||
if (exists $$config{'id'} && $$config{'id'} ne "") {
|
||||
$padded_index = sprintf("%04d", $$config{'id'});
|
||||
}
|
||||
$filename =~ s/\[id\]/$padded_index/;
|
||||
return $filename;
|
||||
}
|
||||
}
|
||||
# Default naming if full filename configuration is not supplied.
|
||||
if ($$config{'multipage'} && $$config{'multipage'} eq 'true') {
|
||||
my $padded_index = sprintf("%04d", $$config{'id'});
|
||||
$filename = "$base_path$$config{'page'}${padded_index}.html";
|
||||
}
|
||||
else {
|
||||
$filename = "$base_path$$config{'page'}.html";
|
||||
}
|
||||
return $filename;
|
||||
}
|
||||
|
||||
sub print_available_pages {
|
||||
# Load config file
|
||||
read_config "site.cfg" => my %config;
|
||||
# Load config file
|
||||
read_config "site.cfg" => my %config;
|
||||
|
||||
my @page_args = sort ( keys %config );
|
||||
my @page_args = sort (keys %config);
|
||||
|
||||
# Remove non page sections of the configuration file
|
||||
# from the generated list of pages.
|
||||
@page_args = grep { $_ ne 'DBI' } @page_args;
|
||||
@page_args = grep { $_ ne 'root_template' } @page_args;
|
||||
# Remove non page sections of the configuration file
|
||||
# from the generated list of pages.
|
||||
@page_args= grep { $_ ne 'DBI' } @page_args;
|
||||
@page_args= grep { $_ ne 'root_template' } @page_args;
|
||||
|
||||
foreach my $page_arg (@page_args) {
|
||||
print "$page_arg\n";
|
||||
}
|
||||
exit;
|
||||
foreach my $page_arg (@page_args) {
|
||||
print "$page_arg\n";
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
#=== FUNCTION ================================================================
|
||||
# NAME: parse_csv
|
||||
# PURPOSE: Parses a simple string containing CSV data
|
||||
# PARAMETERS: $csv_in CSV string
|
||||
# RETURNS: An arrayref containing the parsed CSV elements
|
||||
# DESCRIPTION: The Text::CSV_XS module instance is created with the option
|
||||
# 'allow_whitespace' to be forgiving of any spaces around the
|
||||
# CSV elements and to strip them. Also, 'allow_loose_quotes' is
|
||||
# forgiving of really messed up CSV. The 'binary' option
|
||||
# permits any characters in the tags (expecting Unicode).
|
||||
# The fields parsed from the tag string is checked for the
|
||||
# existence of utf8 characters and encoded to ensure any found
|
||||
# are properly stored.
|
||||
# THROWS: No exceptions
|
||||
# COMMENTS: None
|
||||
# SEE ALSO: N/A
|
||||
#===============================================================================
|
||||
sub parse_csv {
|
||||
my ($csv_in) = @_;
|
||||
|
||||
my $csv = Text::CSV_XS->new(
|
||||
{ binary => 1,
|
||||
auto_diag => 1,
|
||||
allow_whitespace => 1,
|
||||
allow_loose_quotes => 1
|
||||
}
|
||||
);
|
||||
my $status = $csv->parse($csv_in);
|
||||
unless ( $status ) {
|
||||
warn "Failed to parse CSV '$csv_in'\n" ;
|
||||
return;
|
||||
}
|
||||
my @fields = $csv->fields();
|
||||
|
||||
@fields = map {utf8::encode($_) if utf8::is_utf8($_); $_} @fields;
|
||||
|
||||
return \@fields;
|
||||
}
|
||||
|
||||
#=== FUNCTION ================================================================
|
||||
# NAME: xml_entity
|
||||
# PURPOSE: Static filter to encode Unicode for XML
|
||||
# PARAMETERS: $text String to be processed
|
||||
# RETURNS: Processed text
|
||||
# DESCRIPTION:
|
||||
# THROWS: No exceptions
|
||||
# COMMENTS: None
|
||||
# SEE ALSO: N/A
|
||||
#===============================================================================
|
||||
sub xml_entity {
|
||||
my ($text) = @_;
|
||||
|
||||
encode_entities_numeric( $text );
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
# vim: syntax=perl:ts=8:sw=4:et:ai:tw=78:fo=tcrqn21:fdm=marker
|
||||
|
12
site.cfg
12
site.cfg
@@ -68,9 +68,9 @@ navigation: navigation-about.tpl.html
|
||||
content: content-correspondents.tpl.html
|
||||
filename: correspondents/index.html
|
||||
|
||||
# [contact]
|
||||
# navigation: navigation-about.tpl.html
|
||||
# content: content-contact.tpl.html
|
||||
[contact]
|
||||
navigation: navigation-about.tpl.html
|
||||
content: content-contact.tpl.html
|
||||
|
||||
[correspondent]
|
||||
navigation: navigation-about.tpl.html
|
||||
@@ -120,9 +120,9 @@ content: content-help_out.tpl.html
|
||||
navigation: navigation-get-shows.tpl.html
|
||||
content: content-download.tpl.html
|
||||
|
||||
# [stuff_you_need_to_know]
|
||||
# navigation: navigation-give-shows.tpl.html
|
||||
# content: content-stuff_you_need_to_know.tpl.html
|
||||
[stuff_you_need_to_know]
|
||||
navigation: navigation-give-shows.tpl.html
|
||||
content: content-stuff_you_need_to_know.tpl.html
|
||||
|
||||
[theme]
|
||||
navigation: navigation-give-shows.tpl.html
|
||||
|
@@ -34,13 +34,13 @@
|
||||
<p>HPR is entirely community driven. Policy decisions are proposed and discussed on the <a href="<!--% absolute_url(baseurl) %-->/maillist" >Mailing list</a>, which is open to anyone to join. Mailing list discussions are brought to the attention of the listening community on the first Monday of the month in the <a href="<!--% absolute_url(baseurl) %-->series/0047.html" >HPR Community News</a> show. This show is also <a href="<!--% absolute_url(baseurl) %-->recording.html#round_table" >open to anyone</a> to participate in. The schedule for the Community News shows can be downloaded as an <a href="<!--% absolute_url(baseurl) %-->HPR_Community_News_schedule.ics">iCal calendar</a> containing recording dates for the next 12 months. A reminder is also sent to the mailing list in the week before the recording.</p>
|
||||
<p>Our hosting is kindly provided to us by <a href="<!--% absolute_url(baseurl) %-->correspondents/0174.html">Josh Knapp</a> from <a href="https://anhonesthost.com/hosting/shared-hosting">AnHonestHost.com</a>, and he has the last word in issues related to site security. A changing team of volunteers called the "admins" or "Janitors", deal with the day to day operation of HPR. Acting as the first point of contact, processing the shows, coordinating policy discussions, removing spam, updating the website, etc. They are contactable via the email account admin @ HPR. They have no more say over policy than anyone else. Anyone who has shown a long term dedication to the project and is trusted by the community, can become an admin.
|
||||
</p>
|
||||
<p>See the section <a href="<!--% absolute_url(baseurl) %-->about.html#stuff_you_need_to_know" >stuff you need to know</a> for more information.</p>
|
||||
<p>Click <a href="<!--% absolute_url(baseurl) %-->stuff_you_need_to_know.html" >here</a> for more information.</p>
|
||||
<h3 id="recent_policy_changes">Recent Policy Changes</h3>
|
||||
<ul>
|
||||
<li><a href="https://lists.hackerpublicradio.com/pipermail/hpr/2021-July/004191.html">HPR will move #oggcastplanet on libera, and we will also include links to the matrix, and mastodon channel</a></li>
|
||||
<li><a href="https://lists.hackerpublicradio.com/pipermail/hpr/2021-August/004200.html">Existing shows will be flagged with the current version and new shows will default to "Attribution 4.0 International (CC BY 4.0)"</a></li>
|
||||
<li><a href="https://lists.hackerpublicradio.com/pipermail/hpr/2021-November/004328.html">The Intro Outro will be changed and the upload form will remove the option to add intro and outros.</a></li>
|
||||
<li><a href="https://lists.hackerpublicradio.com/pipermail/hpr/2021-December/004341.html">Removal of "by arranged permission" when posting to HPR</a></li>
|
||||
<li><a href="http://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-July/014969.html">HPR will move #oggcastplanet on libera, and we will also include links to the matrix, and mastodon channel</a></li>
|
||||
<li><a href="http://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-August/014973.html">Existing shows will be flagged with the current version and new shows will default to "Attribution 4.0 International (CC BY 4.0)"</a></li>
|
||||
<li><a href="http://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-November/015100.html">The Intro Outro will be changed and the upload form will remove the option to add intro and outros.</a></li>
|
||||
<li><a href="http://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-December/015114.html">Removal of "by arranged permission" when posting to HPR</a></li>
|
||||
</ul>
|
||||
<h2 id ="patrons" >Please support our Patrons<a href="<!--% absolute_url(baseurl) %-->about.html#patrons">.</a></h2>
|
||||
<p>
|
||||
@@ -98,18 +98,21 @@
|
||||
|
||||
<h2 id="stuff_you_need_to_know">1. Stuff you need to know<a href="<!--% absolute_url(baseurl) %-->about.html#stuff_you_need_to_know">.</a></h2>
|
||||
<ul>
|
||||
<li>HPR will stop as a project if there are not enough Shows.</li>
|
||||
<li>We do not <a href="<!--% absolute_url(baseurl) %-->about.html##syndication">syndicate</a> shows not produced for HPR.</li>
|
||||
<li>You are agreeing to <a href="<!--% absolute_url(baseurl) %-->about.html##license">license</a> your show CC BY-SA 4.0.</li>
|
||||
<li>You have <a href="<!--% absolute_url(baseurl) %-->about.html#permission">permission</a> to redistribute your show in its entirety.</li>
|
||||
<li>Your audio will <a href="<!--% absolute_url(baseurl) %-->about.html#not_moderated">not be moderated.</a></li>
|
||||
<li>Your show will be signaled as containing <a href="<!--% absolute_url(baseurl) %-->about.html#explicit">explicit</a> content.</li>
|
||||
<li>You determine where in the <a href="<!--% absolute_url(baseurl) %-->about.html#schedule">schedule</a> your show will be released.</li>
|
||||
<li>We use <a href="<!--% absolute_url(baseurl) %-->about.html#utf8">UTF-8</a> end to end.</li>
|
||||
<li>Your show will be heard by an <a href="<!--% absolute_url(baseurl) %-->about.html#international">International</a> Audience.</li>
|
||||
<li>We also need <a href="<!--% absolute_url(baseurl) %-->about.html#reserve_queue">reserve</a> shows.</li>
|
||||
<li>You will no longer be allowed to edit HPR pages on <a href="<!--% absolute_url(baseurl) %-->about.html#wikipedia">Wikipedia</a>.</li>
|
||||
<li>HPR will stop as a project if there are not enough <a href="stuff_you_need_to_know.php#no_shows_no_hpr">Shows</a>.</li>
|
||||
<li>We do not <a href="stuff_you_need_to_know.php#syndication">syndicate</a> shows not produced for HPR.</li>
|
||||
<li>You are agreeing to <a href="stuff_you_need_to_know.php#license">license</a> your show CC BY-SA 4.0.</li>
|
||||
<li>You have <a href="stuff_you_need_to_know.php#permission">permission</a> to redistribute your show in its entirety.</li>
|
||||
<li>Your audio will <a href="stuff_you_need_to_know.php#not_moderated">not be moderated.</a></li>
|
||||
<li>Your show will be signaled as containing <a href="stuff_you_need_to_know.php#explicit">explicit</a> content.</li>
|
||||
<li>You determine where in the <a href="stuff_you_need_to_know.php#schedule">schedule</a> your show will be released.</li>
|
||||
<li>We use <a href="stuff_you_need_to_know.php#utf8">UTF-8</a> end to end.</li>
|
||||
<li>Your show will be heard by an <a href="stuff_you_need_to_know.php#international">International</a> Audience.</li>
|
||||
<li>We also need <a href="stuff_you_need_to_know.php#reserve_queue">reserve</a> shows.</li>
|
||||
<li>You will no longer be allowed to edit HPR pages on <a href="stuff_you_need_to_know.php#wikipedia">Wikipedia</a>.</li>
|
||||
</ul>
|
||||
<p>
|
||||
<a href="stuff_you_need_to_know.php">More information.</a>
|
||||
</p>
|
||||
|
||||
<h2 id="select_a_topic">2. Select a Topic<a href="<!--% absolute_url(baseurl) %-->about.html#select_a_topic">.</a></h2>
|
||||
<p>
|
||||
@@ -248,7 +251,7 @@
|
||||
<h2 id="mailinglist">All policy decisions are made by the HPR Community<a href="#mailinglist">.</a></h2>
|
||||
<p>
|
||||
The community decides the HPR policies.
|
||||
Please join the <a href="<!--% absolute_url(baseurl) %-->/maillist">HPR Mailing List</a> to participate.
|
||||
Please join the <a href="https://hackerpublicradio.org/mailman/listinfo/hpr_hackerpublicradio.org">HPR Mailing List</a> to participate.
|
||||
</p>
|
||||
|
||||
<h2 id="no_shows_no_hpr">HPR will stop as a project if there are not enough shows<a href="#no_shows_no_hpr">.</a></h2>
|
||||
@@ -334,7 +337,7 @@
|
||||
Any host can select any free slot a up to year in advance. However the audio must be ready at time of picking a slot so that it can be upload immediately afterwards.
|
||||
</p>
|
||||
<p>
|
||||
In exceptional circumstances it may be necessary to reserve a slot while not having the audio available, but this must be approved by the <a href="<!--% absolute_url(baseurl) %-->/maillist">HPR Mailing List</a> in advance.
|
||||
In exceptional circumstances it may be necessary to reserve a slot while not having the audio available, but this must be approved by the <a href="https://hackerpublicradio.org/mailman/listinfo/hpr_hackerpublicradio.org">HPR Mailing List</a> in advance.
|
||||
Be sure to allow as much time as possible, and include a reason why you feel it is necessary to reserve the slot.
|
||||
</p>
|
||||
<p>
|
||||
@@ -504,10 +507,10 @@
|
||||
|
||||
<h1 id="requesting_slot">Picking a slot for your show</h1>
|
||||
<p>
|
||||
Any host can select any free slot a up to year in advance, by recording their show and uploading it to the desired slot. In exceptional circumstances it may be necessary to reserve a slot while not having the audio available, but this must be approved by the <a href="<!--% absolute_url(baseurl) %-->/maillist">HPR mailing list</a> in advance. Be sure to allow as much time as possible, and include a reason why you feel it is necessary to reserve the slot.
|
||||
Any host can select any free slot a up to year in advance, by recording their show and uploading it to the desired slot. In exceptional circumstances it may be necessary to reserve a slot while not having the audio available, but this must be approved by the <a href="http://hackerpublicradio.org/mailman/listinfo/hpr_hackerpublicradio.org">HPR mailing list</a> in advance. Be sure to allow as much time as possible, and include a reason why you feel it is necessary to reserve the slot.
|
||||
</p>
|
||||
<p>
|
||||
This is intended only for exceptional circumstances, such as a scheduled interview where we would like the audio to be released as soon after the event as possible, or to cover an important topical situation that has occurred. Due to the extended time now needed to post shows to external sites, the extra work this entails and the disruptive effect of reservations, we will no longer be allowing them except in very rare cases of the type mentioned above. [<a href="https://lists.hackerpublicradio.com/pipermail/hpr/2018-February/003482.html">?</a>]
|
||||
This is intended only for exceptional circumstances, such as a scheduled interview where we would like the audio to be released as soon after the event as possible, or to cover an important topical situation that has occurred. Due to the extended time now needed to post shows to external sites, the extra work this entails and the disruptive effect of reservations, we will no longer be allowing them except in very rare cases of the type mentioned above. [<a href="http://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2018-February/014260.html">?</a>]
|
||||
</p>
|
||||
<p>
|
||||
You can post your show by going to the <a href="http://<?php print "${HTTP_HOST}";?>/calendar.php">Calendar</a> page. Once you have selected a date you will be redirected to the <a href="http://<?php print "${HTTP_HOST}";?>/request.php">request page</a>, where you will be asked to select your show and email address. We will send a link to where you can upload your show to this address and therefore it must be a valid working address that you can access quickly. We intend to use <a href="https://www.gnupg.org/">GPG</a> to speed up the validation of hosts, so you may wish to use an email address that has an associated public key available on public key servers.
|
||||
@@ -687,7 +690,7 @@
|
||||
<li><p>Similarly, a <em>summary</em> helps to add more information describing the show so a potential listener can decide whether to listen to it or not.</p></li>
|
||||
<li><p>Each show is expected to have certain mandatory attributes listed <a href="#what-are-the-mandatory-elements-of-an-hpr-show">below</a>.</p></li>
|
||||
<li><p>HPR shows are usually expected to be informative or educational, and as such some sort of accompanying written material is highly desirable. This might consist of brief notes, links to relevant web sites, or possibly longer notes and examples. Photographs, diagrams and example files are also welcome if the host feels it helps to get the message across.</p></li>
|
||||
<li><p>Shows are released under a <a href="">Creative Commons Attribution-ShareAlike 3.0 Unported</a> license. See <a href="<!--% absolute_url(baseurl) %-->about.html#stuff_you_need_to_know"><em>Stuff you need to know</em></a> for much more detail about this and related issues.</p></li>
|
||||
<li><p>Shows are released under a <a href="">Creative Commons Attribution-ShareAlike 3.0 Unported</a> license. See <a href="http://hackerpublicradio.org/stuff_you_need_to_know.php"><em>Stuff you need to know</em></a> for much more detail about this and related issues.</p></li>
|
||||
<li><p>As a contributor you can choose when your show will be released. We only release one show a day, during week days, but if a slot is free you can claim it. Go to the <a href="http://hackerpublicradio.org/calendar.php"><em>calendar</em></a> page to do this. You need to have your show ready to upload before you reserve a slot though.</p></li>
|
||||
</ul>
|
||||
<h2 data-number="0.3" id="can-i-submit-a-show-made-for-another-podcast"><span class="header-section-number">0.3</span> Can I submit a show made for another podcast?</h2>
|
||||
@@ -777,13 +780,13 @@
|
||||
<h2 data-number="0.12" id="does-hobbypublicradio.com-have-anything-to-do-with-hpr"><span class="header-section-number">0.12</span> Does <code>hobbypublicradio.com</code> have anything to do with HPR?</h2>
|
||||
<ul>
|
||||
<li><p>Some environments prevent access to sites which use the word <code>'hacker'</code> or <code>'hackers'</code> in their names (or content in extreme cases). The site names <code>hobbypublicradio.{com,net,org}</code> have been created, which link to the main HPR site, in order to get around this restriction.</p></li>
|
||||
<li><p>See the mailing list thread here: <a href="https://lists.hackerpublicradio.com/pipermail/hpr/2015-February/002493.html" class="uri">https://lists.hackerpublicradio.com/pipermail/hpr/2015-February/002493.html</a></p></li>
|
||||
<li><p>See the mailing list thread here: <a href="http://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2015-February/013267.html" class="uri">http://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2015-February/013267.html</a></p></li>
|
||||
</ul>
|
||||
<h2 data-number="0.13" id="how-can-i-talk-to-other-hpr-hosts-and-listeners"><span class="header-section-number">0.13</span> How can I talk to other HPR hosts and listeners?</h2>
|
||||
<ul>
|
||||
<li>You have a number of choices:
|
||||
<ul>
|
||||
<li>The mailing list <a href="mailto:hpr@hackerpublicradio.org" class="email">hpr@hackerpublicradio.org</a> is where various policy matters are discussed and announcements made. You need to be a member of the list to post to it. Visit the <a href="<!--% absolute_url(baseurl) %-->/maillist" ><em>listinfo page</em></a> to sign up.</li>
|
||||
<li>The mailing list <a href="mailto:hpr@hackerpublicradio.org" class="email">hpr@hackerpublicradio.org</a> is where various policy matters are discussed and announcements made. You need to be a member of the list to post to it. Visit the <a href="http://hackerpublicradio.org/maillist"><em>listinfo page</em></a> to sign up.</li>
|
||||
<li>You can join the <strong>#oggcastplanet</strong> channel on IRC. Visit the <a href="http://webchat.freenode.net/?channels=oggcastplanet">freenode.net</a> network to sign up.</li>
|
||||
<li>A number of HPR messages may be found on Twitter (tag <strong>#hpr</strong>) and Mastodon (tag <strong>#hpr</strong>).</li>
|
||||
<li><strong>TBA - Matrix? Telegram?</strong></li>
|
||||
|
21
templates/content-contact.tpl.html
Normal file
21
templates/content-contact.tpl.html
Normal file
@@ -0,0 +1,21 @@
|
||||
<article>
|
||||
<header>
|
||||
<h1>Contact</h1>
|
||||
</header>
|
||||
<p>We are always looking for more hosts...</p>
|
||||
<ul>
|
||||
<li>email: <strong>admin -at- hackerpublicradio org</strong><br />
|
||||
<em>As an anti-spam measure you will get an error back but we do get your email.</em></li>
|
||||
<li>Website: <a href="http://www.www.hackerpublicradio.org" target="_blank">www.www.hackerpublicradio.org</a></li>
|
||||
<li>Mailist: <a href="http://www.hackerpublicradio.org/maillist" target="_blank">Maillist</a></li>
|
||||
<li><a href="https://web.libera.chat/gamja/?channels=oggcastplanet" target="_blank">#oggcastplanet</a></li>
|
||||
<li><a href="https://www.facebook.com/home.php?sk=group_130169220378872¬if_t=group_r2j" target="_blank">Facebook</a></li>
|
||||
<li><a href="https://www.linkedin.com/company/hackerpublicradio/" target="_blank">Linked-In</a></li>
|
||||
<li><a href="http://itunes.apple.com/us/podcast/hacker-public-radio/id281699640" target="_blank">iTunes</a></li>
|
||||
</ul>
|
||||
<h2>Mail List</h2>
|
||||
<p>
|
||||
HPR is governed by the community, so decisions about how Hacker Public Radio should be run are made on the mailing list you can join it by going to :<br />
|
||||
<a href="http://www.hackerpublicradio.org/maillist">http://www.hackerpublicradio.org/maillist</a>
|
||||
</p>
|
||||
</article>
|
@@ -8,15 +8,14 @@
|
||||
<table class="hosts">
|
||||
<th >Avatar</th>
|
||||
<th >Name & Host ID</th>
|
||||
<th >License</th>
|
||||
<th >license</th>
|
||||
<th >Last Show</th>
|
||||
<!--% FOREACH host IN DBI.query(
|
||||
'select h.hostid, h.host, h.license, e.date,
|
||||
h.local_image
|
||||
from hosts as h
|
||||
inner join (select hostid, max(date) as date from eps group by hostid) as e
|
||||
on h.hostid = e.hostid
|
||||
order by h.host'
|
||||
on h.hostid = e.hostid '
|
||||
) %-->
|
||||
<tr height="80">
|
||||
<td><!--% get_avatar(host.hostid, host.host, host_cnt > 8) %--></td>
|
||||
|
@@ -5,14 +5,14 @@
|
||||
<!--% 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(query_episode_maxmin) %-->
|
||||
<!--% query_episodes = DBI.prepare(query_episode_maxmin)
|
||||
%-->
|
||||
<!--% episode_result = query_episodes.execute(id, id, id, id, id) %-->
|
||||
<!--% FOREACH episode IN episode_result %-->
|
||||
<!--% in_window = ( episode.id > episode.latest || episode.id < ( episode.latest - 20 ) ? 0 : 1 ) %-->
|
||||
<!--% episode_navigation = step_navigation(baseurl,episode) %-->
|
||||
<article>
|
||||
<header>
|
||||
<h1>hpr<!--% zero_pad_left(episode.id) %--> :: <!--% episode.title %--></h1>
|
||||
<h1>hpr<!--% episode.id %--> :: <!--% episode.title %--></h1>
|
||||
<h3><!--% episode.summary %--></h3>
|
||||
<p class="meta"><!--% episode_navigation %-->
|
||||
</p>
|
||||
@@ -55,7 +55,7 @@ Subscribe to the comments <a href="<!--% absolute_path(baseurl) %-->comments.rss
|
||||
<!--% FOREACH comment IN comments_result %-->
|
||||
<h5 id="comment_<!--% comment.id %-->">Comment #<!--% comment_index %--> posted on <!--% comment.comment_timestamp %--> by <!--% comment.comment_author_name %--></h5>
|
||||
<h4><!--% comment.comment_title %--></h4>
|
||||
<!--% comment.comment_text FILTER html_para %-->
|
||||
<!--% comment.comment_text %-->
|
||||
<!--% comment_index = comment_index + 1 %-->
|
||||
<!--% END %-->
|
||||
|
||||
@@ -78,7 +78,7 @@ Subscribe to the comments <a href="<!--% absolute_path(baseurl) %-->comments.rss
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Title:</td>
|
||||
<td><input required type="text" name="comment_title" size="50" maxlength="100" placeholder="What is your comment about?"></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>
|
||||
@@ -87,41 +87,13 @@ Subscribe to the comments <a href="<!--% absolute_path(baseurl) %-->comments.rss
|
||||
<tr>
|
||||
<td>Anti Spam Question:</td>
|
||||
<td>
|
||||
What does the letter <strong>P</strong> in <em>HPR</em> stand for? <br />
|
||||
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>
|
||||
<!--% IF in_window %-->
|
||||
<tr><td>
|
||||
</tr>
|
||||
<input type="hidden" name="spammer" value="No">
|
||||
<input type="hidden" name="hostid" value="<!--% episode.hostid %-->">
|
||||
<input type="hidden" name="justification" value="No justification is asked for or required.">
|
||||
</td></tr>
|
||||
<!--% ELSE %-->
|
||||
<!-- . -->
|
||||
<tr>
|
||||
<td>Are you a spammer?</td>
|
||||
<td>
|
||||
<input required checked="checked" type="radio" name="spammer" id="spammer_yes" value="Yes">
|
||||
<label for="spammer_yes">Yes</label>
|
||||
<input required type="radio" name="spammer" id="spammer_no" value="No">
|
||||
<label for="spammer_no">No</label>
|
||||
</td>
|
||||
</tr>
|
||||
<!-- . -->
|
||||
<tr>
|
||||
<td>Who hosted this show?</td>
|
||||
<td>
|
||||
<input required type="text" name="hostid" size="20" maxlength="5" placeholder="Type the host number"></td>
|
||||
<td>
|
||||
<!-- . -->
|
||||
<tr>
|
||||
<td>What does HPR mean to you?</td>
|
||||
<td><textarea required name="justification" maxlength="200" rows="4" cols="50" placeholder="Convince us you are part of the community."></textarea></td>
|
||||
</tr>
|
||||
<!--% END %-->
|
||||
<tr><td>
|
||||
<input type="hidden" name="eps_id" value="<!--% episode.id %-->">
|
||||
</td></tr>
|
||||
</table>
|
||||
<input type="submit" value="Next">
|
||||
</fieldset>
|
||||
|
@@ -1,10 +1,10 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<h1 id="requesting_slot">Picking a slot for your show</h1>
|
||||
<p>
|
||||
Any host can select any free slot a up to year in advance, by recording their show and uploading it to the desired slot. In exceptional circumstances it may be necessary to reserve a slot while not having the audio available, but this must be approved by the <a href="<!--% absolute_url(baseurl) %-->/maillist">HPR mailing list</a> in advance. Be sure to allow as much time as possible, and include a reason why you feel it is necessary to reserve the slot.
|
||||
Any host can select any free slot a up to year in advance, by recording their show and uploading it to the desired slot. In exceptional circumstances it may be necessary to reserve a slot while not having the audio available, but this must be approved by the <a href="http://hackerpublicradio.org/mailman/listinfo/hpr_hackerpublicradio.org">HPR mailing list</a> in advance. Be sure to allow as much time as possible, and include a reason why you feel it is necessary to reserve the slot.
|
||||
</p>
|
||||
<p>
|
||||
This is intended only for exceptional circumstances, such as a scheduled interview where we would like the audio to be released as soon after the event as possible, or to cover an important topical situation that has occurred. Due to the extended time now needed to post shows to external sites, the extra work this entails and the disruptive effect of reservations, we will no longer be allowing them except in very rare cases of the type mentioned above. [<a href="https://lists.hackerpublicradio.com/pipermail/hpr/2018-February/003482.html">?</a>]
|
||||
This is intended only for exceptional circumstances, such as a scheduled interview where we would like the audio to be released as soon after the event as possible, or to cover an important topical situation that has occurred. Due to the extended time now needed to post shows to external sites, the extra work this entails and the disruptive effect of reservations, we will no longer be allowing them except in very rare cases of the type mentioned above. [<a href="http://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2018-February/014260.html">?</a>]
|
||||
</p>
|
||||
<p>
|
||||
You can post your show by going to the <a href="<!--% hub_baseurl %-->calendar.php">Calendar</a> page. Once you have selected a date you will be redirected to the <a href="<!--% absolute_url(baseurl) %-->request.html">request page</a>, where you will be asked to select your show and email address. We will send a link to where you can upload your show to this address and therefore it must be a valid working address that you can access quickly. We intend to use <a href="https://www.gnupg.org/">GPG</a> to speed up the validation of hosts, so you may wish to use an email address that has an associated public key available on public key servers.
|
||||
|
@@ -11,6 +11,7 @@
|
||||
</ul>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->contribute.html">Give Shows</a> ← Upload your podcast show here.</li>
|
||||
<ul>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html">Info</a> ← Stuff you need to know before uploading a show.</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->theme.html">Theme</a> ← Information about HPR Theme Music.</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->requested_topics.html">Topics</a> ← Requested topics.</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->recording.html">Recording</a> ← How to record a podcast.</li>
|
||||
@@ -26,7 +27,7 @@
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->correspondents/index.html">Hosts</a> ← A list of all our Hosts.</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->contact.html">Contact</a> ← How to get in touch with us.</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->promote.html">Promote HPR</a> ← Ways you can spread the word.</li>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->comments_viewer.html">Show Comments</a> ← Read the latest comments left on shows.</li>
|
||||
<li><a href="https://www.hackerpublicradio.org/comments_viewer.php">Show Comments</a> ← Read the latest comments left on shows.</li>
|
||||
</ul>
|
||||
<li><a href="<!--% absolute_path(baseurl) %-->search.html">Search</a> ← Search HPR</li>
|
||||
</ul>
|
||||
|
162
templates/content-stuff_you_need_to_know.tpl.html
Normal file
162
templates/content-stuff_you_need_to_know.tpl.html
Normal file
@@ -0,0 +1,162 @@
|
||||
<h1 id="agreement">Stuff you need to know<a href="#agreement">.</a></h1>
|
||||
<p>
|
||||
This is some important information that you will need to know before uploading to HPR.
|
||||
</p>
|
||||
|
||||
<h2 id="wikipedia">You will no longer be allowed to edit HPR pages on Wikipedia<a href="#wikipedia">.</a></h2>
|
||||
<p>
|
||||
Once you upload a show, you will no longer be allowed to edit pages relating to <a href="https://en.wikipedia.org/wiki/Hacker_Public_Radio">Hacker Public Radio</a> in <a href="https://en.wikipedia.org/wiki/Wikipedia:FAQ/Organizations">Wikipedia</a>.
|
||||
</p>
|
||||
|
||||
<h2 id="mailinglist">All policy decisions are made by the HPR Community<a href="#mailinglist">.</a></h2>
|
||||
<p>
|
||||
The community decides the HPR policies.
|
||||
Please join the <a href="https://hackerpublicradio.org/mailman/listinfo/hpr_hackerpublicradio.org">HPR Mailing List</a> to participate.
|
||||
</p>
|
||||
|
||||
<h2 id="no_shows_no_hpr">HPR will stop as a project if there are not enough shows<a href="#no_shows_no_hpr">.</a></h2>
|
||||
<p>
|
||||
Hacker Public Radio is dedicated to sharing knowledge.
|
||||
We release about 260 shows a year, which is probably more than all of the other FOSS podcasts put together.
|
||||
If you listen to HPR, then we would love you to <a target="_blank" href="<!--% absolute_path(baseurl) %-->contribute.html">contribute</a> one show a year.
|
||||
Remember once that all the emergency shows have been used up and there are no more shows in the queue, HPR as a project will stop.
|
||||
|
||||
</p>
|
||||
<h2 id="patrons">Support our Patrons<a href="#patrons">.</a></h2>
|
||||
<p>
|
||||
Our hosting is kindly provided to us by <a href="<!--% absolute_path(baseurl) %-->correspondents/0174.html">Josh Knapp</a> from <a href="https://anhonesthost.com/hosting/shared-hosting">AnHonestHost.com</a>, and The Internet Archive at <a href="https://archive.org/donate/">Archive.org</a>.
|
||||
We encourage you to support our Patrons.
|
||||
Over the years kind people have donated services and supported equipment for our conferences.
|
||||
|
||||
</p>
|
||||
<h2 id="syndication">We do not syndicate non HPR Shows<a href="#syndication">.</a></h2>
|
||||
<p>
|
||||
HPR is founded on the principle of Hackers sharing knowledge.
|
||||
For this reason we are only releasing material created exclusively for HPR.
|
||||
We will continue to promote new podcasts and other creative commons material, but if you wish to have your show promoted, then please contact our sister site <a href="https://freeculturepodcasts.org/">Free Culture Podcasts</a>.
|
||||
</p>
|
||||
<p>
|
||||
That said, if there is a piece of creative commons content that you would like to promote, then feel free to record a regular show.
|
||||
There you can introduce the content and explain why it is important, providing links to where we can get more information etc., and then include one example episode.
|
||||
</p>
|
||||
|
||||
<h2 id="license">You are agreeing to license your show CC-BY-SA<a href="#license">.</a></h2>
|
||||
<p>
|
||||
All our shows are now released under a <a href="https://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)</a> license, which means that while you continue to retain the copyright to your show, you are allowing us (and everyone else) to use it provided we give you attribution and that we release it under the same license.
|
||||
Click the <a href="https://creativecommons.org/licenses/by-sa/4.0/">link</a> for more information.
|
||||
</p>
|
||||
|
||||
<h2 id="permission">You have permission to redistribute your show in its entirety<a href="#permission">.</a></h2>
|
||||
<p>
|
||||
Never include content, for example music, in your show that you do not have permission to redistribute.
|
||||
Try to avoid using any content in your show that can not be redistributed under a <a href="https://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) </a> license.
|
||||
If you are redistributing under another Creative Commons license, GNU Free Documentation License, public domain, or FLOSS software license, then please signal that when you upload your show. We do not post other copyrighted content, even if it is made available under fair use, or by arranged permission.
|
||||
</p>
|
||||
|
||||
<h2 id="not_moderated">The audio of your show will not be moderated<a href="#not_moderated">.</a></h2>
|
||||
<p>
|
||||
We do not vet, edit, moderate or in any way censor any of the audio you submit, we trust you to do that.
|
||||
Aside from checking snippets for audio quality/spam checking, we have a policy that we don't listen to the shows before they are aired.
|
||||
This is a long standing tradition arising from the fact that HPR is a community of peers who believe that any host has as much right to submit shows as any other.
|
||||
<br />
|
||||
We <strong>do</strong> transcode the audio into different formats.
|
||||
</p>
|
||||
<p>
|
||||
Please note that this only relates to the audio you upload.
|
||||
The rest of the meta-data (branding/summaries/tags/show notes/etc.), are managed by the HPR Community, and <strong>may</strong> be edited.
|
||||
The show <a href="<!--% absolute_path(baseurl) %-->eps/hpr2210/index.html">hpr2210 :: On Freedom of Speech and Censorship</a> describes the agreed approach to this topic.
|
||||
</p>
|
||||
|
||||
</p>
|
||||
|
||||
<h2 id="explicit">Your show will be signaled as containing explicit content<a href="#explicit">.</a></h2>
|
||||
<p>
|
||||
Given that we are an open forum for free speech we signal all our shows as "explicit" with the assumption that the listeners will apply the required discretion when playing the shows in public.
|
||||
That said the majority of our content is technical in nature and therefore is often considered appropriate for any audience.
|
||||
If you feel that your show will be considered <strong>inoffensive in every region of the world</strong> then you can signal that when you upload the show.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
When dealing with content that is "explicit" or contains material that would best be suited for a mature audience, it has become traditional to include a short warning at the very beginning of the show before the intro, to allow listeners time to switch off the episode should they so desire.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/hpr2210/index.html">hpr2210 :: On Freedom of Speech and Censorship</a> describes the agreed approach to this topic.
|
||||
</p>
|
||||
|
||||
<h2 id="schedule">You determine when your show will be released<a href="#schedule">.</a></h2>
|
||||
<p>
|
||||
The HPR Schedule is entirely community driven and we recommend that <strong>you</strong> pick the date or show number as then you know when your show will be released.
|
||||
However the slots will only be allocated once the shows have been successfully processed.
|
||||
Any missing information can result in a show missing the requested slot.
|
||||
Once the slots have been allocated it is not possible to move them.
|
||||
</p>
|
||||
|
||||
<h2 id="reserving">All reservations need to be approved<a href="#reserving">.</a></h2>
|
||||
<p>
|
||||
Any host can select any free slot a up to year in advance, by recording their show and uploading it to the desired slot.
|
||||
In exceptional circumstances it may be necessary to reserve a slot while not having the audio available, but this must be approved by the <a href="https://hackerpublicradio.org/mailman/listinfo/hpr_hackerpublicradio.org">HPR Mailing List</a> in advance.
|
||||
Be sure to allow as much time as possible, and include a reason why you feel it is necessary to reserve the slot.
|
||||
<br />
|
||||
This is intended only for exceptional circumstances, such as a scheduled interview where we would like the audio to be released as soon after the event as possible, or to cover an important topical situation that has occurred.
|
||||
Due to the extended time now needed to post shows to external sites, the extra work this entails and the disruptive effect of reservations, we will no longer be allowing them except in very rare cases of the type mentioned above.
|
||||
</p>
|
||||
<p>
|
||||
The following are standing reservations:
|
||||
<ul>
|
||||
<li>Anniversary episodes.</li>
|
||||
<li>HPR Community News on the first Monday of the month.</li>
|
||||
<li>The first day of the fourth month.</li>
|
||||
<li>The days following new year.</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<h2 id="utf8">We use UTF-8 end to end<a href="#utf8">.</a></h2>
|
||||
<blockquote>See the video "<a href="https://www.youtube.com/watch?v=MijmeoH9LT4">Characters, Symbols and the Unicode Miracle - Computerphile</a>" for an interesting background to ASCII and <a href="https://en.wikipedia.org/wiki/UTF-8">UTF-8</a>.
|
||||
</blockquote>
|
||||
|
||||
<h2 id="accessibility">Keep accessibility in mind<a href="#accessibility">.</a></h2>
|
||||
<p>
|
||||
When you includes output from the command line in the show notes, posting screen-shots of console or terminal output makes it impossible for screen readers to access the text.
|
||||
Always try to include the raw output ( eg: embedded in <pre> tags)
|
||||
<br />
|
||||
Include descriptive language in any link texts.
|
||||
<br />
|
||||
Avoid structures like: <em>"For accessibility information click <a href="#accessibility">here</a>"</em><br />
|
||||
Rather use: <em>"For more information click our <a href="#accessibility">accessibility page</a>"</em><br />
|
||||
</p>
|
||||
|
||||
<h2 id="international">Your show will be heard by an International Audience<a href="#international">.</a></h2>
|
||||
<p>
|
||||
We have people listening from all over the world, who may not have the same cultural background as yourself, therefore you should be as clear as possible when giving details.
|
||||
For example always give temperatures in both Celsius and Fahrenheit, measurements in Metric and Imperial, dates in <strong>YYYY-MM-DD</strong> <a href="https://en.wikipedia.org/wiki/ISO_8601">iso8601</a> format, and abbreviations using the <a href="https://en.wikipedia.org/wiki/NATO_phonetic_alphabet">NATO phonetic alphabet</a>.
|
||||
Never assume that your audience knows what age a sixth grader is, or how big a 20 Cent Euro coin is.
|
||||
Keep in mind that keyboard layouts are also different so make sure to specify the key shape or the position inrelation to a common known standard.
|
||||
For example:
|
||||
</p>
|
||||
<blockquote>The at sign normally situated above the 2 key on a US keyboard, and has a unicode number of U+0040.
|
||||
For more information see <a href="https://en.wikipedia.org/wiki/At_sign">Wikipedia</a></blockquote>
|
||||
<p>
|
||||
<a href="https://xkcd.com/1179/"><img src="../images/iso_8601.png" title="ISO 8601 was published on 06/05/88 and most recently amended on 12/01/04." alt="An xkcd cartoon showing ISO 8601" /></a>
|
||||
</p>
|
||||
|
||||
<h2 id="emergency_queue">Feed the emergency queue<a href="#emergency_queue">.</a></h2>
|
||||
<p>
|
||||
The emergency queue is intended only to be used in the cases where there is still a gap in the schedule 24 hours prior to release.
|
||||
The shows will by their very nature need to be "timeless".
|
||||
That means your topic should still be relevant in four years or more.
|
||||
People will be able to hear the show on the website but they will not be included in any feeds until release.
|
||||
</p>
|
||||
<p>
|
||||
Please begin all shows with text similar to:
|
||||
<br />
|
||||
<em>
|
||||
"This is an emergency show, if you are hearing this then HPR needs shows ASAP.
|
||||
Please consider contributing a show.
|
||||
Email admin at hacker public radio dot org for more information."
|
||||
</em>
|
||||
</p>
|
||||
<p>
|
||||
We expect that we need at least 10 shows in the emergency queue in order to give people enough time to record and submit shows.
|
||||
Please contact admin at hpr if you want to submit an emergency show.
|
||||
</p>
|
@@ -26,7 +26,7 @@
|
||||
<li>
|
||||
<h3 id="outro">HPR Outro Music </h3>
|
||||
<p>
|
||||
This is automatically added after you upload your show.
|
||||
This can be added is automatically added after you upload your show.
|
||||
</p>
|
||||
</li>
|
||||
</ol>
|
||||
|
@@ -11,7 +11,7 @@
|
||||
<meta http-equiv="X-Clacks-Overhead" content="GNU Terry Pratchett" />
|
||||
<meta http-equiv="last-modified" content="<!--% format_feed_date(date.now) %-->">
|
||||
<meta name="keywords" content="Technology, Tech News, Education, Training" />
|
||||
<meta name="description" content="Hacker Public Radio is a podcast that releases shows every weekday Monday through Friday. Our shows are produced by the community (you) and can be on any topic that is of interest to hackers and hobbyists." />
|
||||
<meta name="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">
|
||||
@@ -81,10 +81,7 @@
|
||||
<nav class="column">
|
||||
<h2>Social</h2>
|
||||
<ul>
|
||||
<li><a href="<!--% absolute_url(baseurl) %-->/maillist" >Mailing list</a></li>
|
||||
<li><a href="https://botsin.space/@hpr" >Mastodon</a></li>
|
||||
<li><a href="https://matrix.to/#/#hpr:matrix.org" >Matrix</a></li>
|
||||
<li><a href="mumble://chatter.skyehaven.net:64738/Hacker%20Public%20Radio?version=1.2.0" >Mumble</a></li>
|
||||
<li><a href="http://hackerpublicradio.org/mailman/listinfo/hpr_hackerpublicradio.org" target="_blank">Maillist</a></li>
|
||||
<li><a href="https://web.libera.chat/gamja/?channels=oggcastplanet" target="_blank">#oggcastplanet</a></li>
|
||||
<li><a href="https://twitter.com/HPR">Twitter.com</a></li>
|
||||
<li><a href="https://plus.google.com/u/0/s/hacker%20public%20radio" target="_blank">Google+</a></li>
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<!--% query_call_for_shows = '
|
||||
SELECT CASE WHEN COUNT(id) < 6 THEN True ELSE False END AS `request_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)
|
||||
'
|
||||
WHERE eps.date > NOW() AND eps.date < DATE_ADD(NOW(), INTERVAL 10 DAY)
|
||||
'
|
||||
%-->
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<!--% query_call_for_shows = '
|
||||
SELECT CASE WHEN COUNT(id) < 6 THEN True ELSE False END AS `request_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\')
|
||||
'
|
||||
WHERE eps.date > date(\'now\') AND eps.date < date(\'now\', \'+10 days\')
|
||||
'
|
||||
%-->
|
||||
|
@@ -1,8 +1,8 @@
|
||||
<!--% query_episode_maxmin = '
|
||||
WITH episode_maxmin AS (
|
||||
SELECT MAX(id) AS \'latest\', MIN(id) AS \'earliest\', ? AS \'id\'
|
||||
FROM eps
|
||||
WHERE eps.date <= UTC_DATE()
|
||||
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
|
||||
@@ -21,7 +21,7 @@
|
||||
FROM eps
|
||||
INNER JOIN episode_date
|
||||
ON eps.date > episode_date.date
|
||||
WHERE eps.date <= NOW()
|
||||
WHERE eps.date < NOW()
|
||||
),
|
||||
comment_tallies AS (
|
||||
SELECT
|
||||
|
@@ -1,8 +1,7 @@
|
||||
<!--% 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\')
|
||||
SELECT MAX(id) AS \'latest\', MIN(id) AS \'earliest\', ? AS \'id\'
|
||||
FROM eps
|
||||
),
|
||||
episode_date AS (
|
||||
SELECT eps.date
|
||||
@@ -21,7 +20,7 @@
|
||||
FROM eps
|
||||
INNER JOIN episode_date
|
||||
ON eps.date > episode_date.date
|
||||
WHERE eps.date <= date(\'now\')
|
||||
WHERE eps.date < date(\'now\')
|
||||
),
|
||||
comment_tallies AS (
|
||||
SELECT
|
||||
|
@@ -9,7 +9,7 @@
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE eps.date <= UTC_DATE()
|
||||
WHERE eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
|
||||
ORDER BY eps.id DESC'
|
||||
%-->
|
||||
|
||||
|
@@ -1,15 +1,14 @@
|
||||
<!--% query_episodes = 'SELECT
|
||||
eps.id,
|
||||
eps.explicit,
|
||||
eps.date, eps.license, eps.title, eps.summary,
|
||||
eps.duration, eps.notes, eps.tags,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email, hosts.local_image,
|
||||
miniseries.name AS series, miniseries.id AS seriesid
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE eps.date <= date(\'now\')
|
||||
ORDER BY eps.id + 0 DESC'
|
||||
<!--% 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
|
||||
ORDER BY eps.id + 0 DESC'
|
||||
%-->
|
||||
|
||||
|
@@ -1,2 +1,4 @@
|
||||
<!--% query_ids_episode = 'select eps.id from eps order by eps.id' %-->
|
||||
<!--% query_ids_episode = 'select eps.id from eps
|
||||
where eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY) '
|
||||
%-->
|
||||
|
||||
|
@@ -1,2 +1,3 @@
|
||||
<!--% query_ids_episode = 'select eps.id from eps order by eps.id' %-->
|
||||
<!--% query_ids_episode = 'select eps.id from eps'
|
||||
%-->
|
||||
|
||||
|
@@ -37,7 +37,7 @@
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
LEFT JOIN comment_tallies ON eps.id = comment_tallies.eps_id
|
||||
WHERE eps.date <= UTC_DATE()
|
||||
WHERE eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
|
||||
ORDER BY eps.id DESC
|
||||
LIMIT 10
|
||||
'
|
||||
@@ -54,7 +54,7 @@
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE eps.date <= UTC_DATE()
|
||||
WHERE eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
|
||||
ORDER BY eps.id DESC
|
||||
LIMIT 30 OFFSET 10
|
||||
'
|
||||
|
@@ -37,7 +37,7 @@
|
||||
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\')
|
||||
WHERE eps.date < date(\'now\', \'+1 days\')
|
||||
ORDER BY eps.id + 0 DESC
|
||||
LIMIT 10
|
||||
'
|
||||
@@ -54,7 +54,7 @@
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE eps.date <= date(\'now\')
|
||||
WHERE eps.date < date(\'now\', \'+1 days\')
|
||||
ORDER BY eps.id + 0 DESC
|
||||
LIMIT 30 OFFSET 10
|
||||
'
|
||||
|
@@ -6,7 +6,7 @@
|
||||
<channel>
|
||||
<title>Hacker Public Radio ~ Comment Feed</title>
|
||||
<link><!--% baseurl %-->about.html</link>
|
||||
<description>Comments Feed: Hacker Public Radio is a podcast that releases shows every weekday Monday through Friday. Our shows are produced by the community (you) and can be on any topic that is of interest to hackers and hobbyists.</description>
|
||||
<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>
|
||||
|
@@ -1,26 +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,
|
||||
assets.size AS length
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
INNER JOIN assets ON eps.id = assets.episode_id
|
||||
WHERE eps.date <= UTC_DATE()
|
||||
AND assets.extension = ?
|
||||
ORDER BY eps.date DESC
|
||||
LIMIT 10
|
||||
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(media_file_extension) %-->
|
||||
<!--% feed_result = query_hpr_feed.execute() %-->
|
||||
|
||||
|
@@ -1,26 +1,23 @@
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% query_hpr_feed = DBI.prepare('
|
||||
SELECT
|
||||
eps.id,
|
||||
eps.explicit,
|
||||
strftime(\'%H:%M:%S %d:%m:%Y\', date(eps.date)) AS date,
|
||||
eps.license, eps.duration,
|
||||
eps.title, eps.summary, eps.tags,
|
||||
eps.notes,
|
||||
hosts.local_image,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email,
|
||||
miniseries.name AS series, miniseries.id AS seriesid,
|
||||
assets.size AS length
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
INNER JOIN assets ON eps.id = assets.episode_id
|
||||
WHERE eps.date <= date(\'now\')
|
||||
AND assets.extension = ?
|
||||
ORDER BY eps.date DESC
|
||||
LIMIT 10
|
||||
SELECT
|
||||
eps.id,
|
||||
eps.explicit,
|
||||
strftime(\'%H:%M:%S %d:%m:%Y\', date(eps.date)) AS date,
|
||||
eps.license, eps.duration,
|
||||
eps.title, eps.summary, eps.tags,
|
||||
eps.notes,
|
||||
hosts.local_image,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email,
|
||||
miniseries.name AS series, miniseries.id AS seriesid
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE eps.date < date(\'now\', \'+1 days\')
|
||||
ORDER BY eps.date DESC
|
||||
LIMIT 10
|
||||
')
|
||||
%-->
|
||||
<!--% feed_result = query_hpr_feed.execute(media_file_extension) %-->
|
||||
<!--% feed_result = query_hpr_feed.execute() %-->
|
||||
|
||||
|
@@ -1,25 +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,
|
||||
assets.size AS length
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
INNER JOIN assets ON eps.id = assets.episode_id
|
||||
WHERE eps.date < UTC_DATE()
|
||||
AND assets.extension = ?
|
||||
ORDER BY eps.date DESC
|
||||
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(media_file_extension) %-->
|
||||
<!--% feed_result = query_hpr_feed.execute() %-->
|
||||
|
||||
|
@@ -1,25 +1,22 @@
|
||||
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
|
||||
<!--% query_hpr_feed = DBI.prepare('
|
||||
SELECT
|
||||
eps.id,
|
||||
eps.explicit,
|
||||
strftime(\'%H:%M:%S %d:%m:%Y\', date(eps.date)) AS date,
|
||||
eps.license, eps.duration,
|
||||
eps.title, eps.summary, eps.tags,
|
||||
eps.notes,
|
||||
hosts.local_image,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email,
|
||||
miniseries.name AS series, miniseries.id AS seriesid,
|
||||
assets.size AS length
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
INNER JOIN assets ON eps.id = assets.episode_id
|
||||
WHERE eps.date <= date(\'now\')
|
||||
AND assets.extension = ?
|
||||
ORDER BY eps.date DESC
|
||||
SELECT
|
||||
eps.id,
|
||||
eps.explicit,
|
||||
strftime(\'%H:%M:%S %d:%m:%Y\', date(eps.date)) AS date,
|
||||
eps.license, eps.duration,
|
||||
eps.title, eps.summary, eps.tags,
|
||||
eps.notes,
|
||||
hosts.local_image,
|
||||
hosts.hostid,
|
||||
hosts.host, hosts.email,
|
||||
miniseries.name AS series, miniseries.id AS seriesid
|
||||
FROM eps
|
||||
INNER JOIN hosts ON eps.hostid = hosts.hostid
|
||||
INNER JOIN miniseries ON eps.series = miniseries.id
|
||||
WHERE eps.date < date(\'now\', \'+1 days\')
|
||||
ORDER BY eps.date DESC
|
||||
')
|
||||
%-->
|
||||
<!--% feed_result = query_hpr_feed.execute(media_file_extension) %-->
|
||||
<!--% feed_result = query_hpr_feed.execute() %-->
|
||||
|
||||
|
@@ -1,15 +1,15 @@
|
||||
<!--% USE date %-->
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<rss version="2.0"
|
||||
xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"
|
||||
xmlns:atom="http://www.w3.org/2005/Atom"
|
||||
<rss version="2.0"
|
||||
xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"
|
||||
xmlns:atom="http://www.w3.org/2005/Atom"
|
||||
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" >
|
||||
<channel>
|
||||
<title>Hacker Public Radio</title>
|
||||
<link>https://www.hackerpublicradio.org/about.html</link>
|
||||
<itunes:subtitle>A daily show hosted by the community on topics that are of interest to hackers and hobbyists.</itunes:subtitle>
|
||||
<description>Hacker Public Radio is a podcast that releases shows every weekday Monday through Friday. Our shows are produced by the community (you) and can be on any topic that is of interest to hackers and hobbyists.</description>
|
||||
<itunes:subtitle>A daily show hosted the community on topics that are of interest to hackers and hobbyists.</itunes:subtitle>
|
||||
<description>Hacker Public Radio is an podcast that releases shows every weekday Monday through Friday. Our shows are produced by the community (you) and can be on any topic that are of interest to hackers and hobbyists.</description>
|
||||
<language>en-us</language>
|
||||
<itunes:category text="Technology">
|
||||
<itunes:category text="Tech News"/>
|
||||
@@ -22,14 +22,14 @@
|
||||
<itunes:author>Hacker Public Radio</itunes:author>
|
||||
<itunes:keywords>Community Radio, Tech Interviews, Linux, Open, Hobby, Software Freedom</itunes:keywords>
|
||||
<copyright>Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) License</copyright>
|
||||
<managingEditor>feedback@NOSPAM-hackerpublicradio.org (HPR Feedback)</managingEditor>
|
||||
<managingEditor>feedback@NOSPAM-hackerpublicradio.org (HPR Feedback)</managingEditor>
|
||||
<!-- <author>feedback@NOSPAM-hackerpublicradio.org (HPR Feedback)</author> -->
|
||||
<itunes:owner>
|
||||
<itunes:owner>
|
||||
<itunes:name>HPR Volunteer</itunes:name>
|
||||
<itunes:email>admin@hackerpublicradio.org</itunes:email>
|
||||
</itunes:owner>
|
||||
<webMaster>admin@hackerpublicradio.org (HPR Volunteer)</webMaster>
|
||||
<generator>site-generator</generator>
|
||||
<webMaster>admin@hackerpublicradio.org (HPR Volunteer)</webMaster>
|
||||
<generator>site-generator</generator>
|
||||
<docs>http://www.rssboard.org/rss-specification</docs>
|
||||
<ttl>43200</ttl>
|
||||
<skipDays>
|
||||
@@ -39,19 +39,19 @@
|
||||
<image>
|
||||
<url>https://www.hackerpublicradio.org/images/hpr_feed_small.png</url>
|
||||
<title>Hacker Public Radio</title>
|
||||
<link>https://www.hackerpublicradio.org/about.html</link>
|
||||
<link>https://www.hackerpublicradio.org/about.php</link>
|
||||
<description>The Hacker Public Radio Old Microphone Logo</description>
|
||||
<height>164</height>
|
||||
<width>144</width>
|
||||
</image>
|
||||
<googleplay:author>HPR Volunteer</googleplay:author>
|
||||
<googleplay:description>Hacker Public Radio is a podcast that releases shows every weekday Monday through Friday. Our shows are produced by the community (you) and can be on any topic that is of interest to hackers and hobbyists.</googleplay:description>
|
||||
<googleplay:description>Hacker Public Radio is an podcast that releases shows every weekday Monday through Friday. Our shows are produced by the community (you) and can be on any topic that are of interest to hackers and hobbyists.</googleplay:description>
|
||||
<googleplay:email>admin@hackerpublicradio.org</googleplay:email>
|
||||
<googleplay:image href="https://www.hackerpublicradio.org/images/hpr_feed_itunes.png"/>
|
||||
<googleplay:category text="Technology"/>
|
||||
<atom:link href="https://www.hackerpublicradio.org/<!--% filename %-->" rel="self" type="application/rss+xml" />
|
||||
<pubDate><!--% format_feed_date(date.now) %--></pubDate>
|
||||
|
||||
|
||||
<!--% INCLUDE $content %-->
|
||||
</channel>
|
||||
</rss>
|
||||
|
@@ -1,9 +1,10 @@
|
||||
<!--% 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) %-->
|
||||
<!--% 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 %-->
|
||||
<!--% IF results_call_for_shows.0.request_for_shows == 1 %-->
|
||||
<!--% USE date %-->
|
||||
<article>
|
||||
<header>
|
||||
@@ -11,6 +12,7 @@
|
||||
</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 %-->
|
||||
|
@@ -12,11 +12,7 @@ from the series <em><a href="<!--% baseurl %-->series/<!--% zero_pad_left(series
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO display_tags(tags) BLOCK %-->
|
||||
<span><label>Tags:</label> <em>
|
||||
<!--% FOREACH tag IN tags.csv_parse %-->
|
||||
<a href="<!--% absolute_path(baseurl) %-->tags.html#<!--% tag.lower %-->"><!--% tag %--></a><!--% IF loop.count == loop.size %-->.<!--% ELSE %-->,<!--% END %-->
|
||||
<!--% END %--></em>
|
||||
</span>
|
||||
<span><label>Tags:</label> <em><!--% tags %--></em>.</span>
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO display_listen_in(eps_id, episode_type) BLOCK %-->
|
||||
|
@@ -1,24 +1,23 @@
|
||||
<!--% PROCESS 'shared-utils.tpl.html' %-->
|
||||
<!--% MACRO display_item(episode, file_extension, audio_mime_type) BLOCK %-->
|
||||
<!--% USE HTML.Strip %-->
|
||||
<!--% IF audio_mime_type == "" %-->
|
||||
<!--% audio_mime_type = 'ogg' %-->
|
||||
<!--% END %-->
|
||||
<item>
|
||||
<itunes:explicit><!--% display_explicit_feed(episode.explicit) %--></itunes:explicit>
|
||||
<itunes:explicit><!--% display_explicit_feed(episode.explicit) %--></itunes:explicit>
|
||||
<googleplay:explicit><!--% display_explicit_feed(episode.explicit) %--></googleplay:explicit>
|
||||
<title>HPR<!--% zero_pad_left(episode.id) %-->: <!--% episode.title %--></title>
|
||||
<title>HPR<!--% zero_pad_left(episode.id) %-->: <!--% episode.title %--></title>
|
||||
<author><!--% episode.email %--> (<!--% episode.host %-->)</author>
|
||||
<googleplay:author><!--% episode.email %--> (<!--% episode.host %-->)</googleplay:author>
|
||||
<itunes:author><!--% episode.email %--> (<!--% episode.host %-->)</itunes:author>
|
||||
<googleplay:image href="https://www.hackerpublicradio.org/images/hpr_feed_itunes.png"/>
|
||||
<link>https://www.hackerpublicradio.org/eps/hpr<!--% zero_pad_left(episode.id) %-->/index.html</link>
|
||||
<link>https://www.hackerpublicradio.org/eps/hpr/<!--% zero_pad_left(episode.id) %-->/index.html</link>
|
||||
<description><![CDATA[<!--% episode.notes %-->]]>
|
||||
</description>
|
||||
<itunes:summary><![CDATA[<!--% episode.notes.substr(0, 4000) | html_strip | xml_entity %-->]]>
|
||||
<itunes:summary><![CDATA[<!--% episode.notes %-->]]>
|
||||
</itunes:summary>
|
||||
<pubDate><!--% format_feed_date(episode.date) %--></pubDate>
|
||||
<enclosure url="http://hackerpublicradio.org/eps/hpr<!--% zero_pad_left(episode.id) %-->.<!--% file_extension %-->" length="<!--% episode.length %-->" type="audio/<!--% audio_mime_type %-->"/>
|
||||
<guid>http://hackerpublicradio.org/eps/hpr<!--% zero_pad_left(episode.id) %-->.<!--% file_extension %--></guid>
|
||||
<enclosure url="http://hackerpublicradio.org/eps/hpr<!--% zero_pad_left(episode.id) %-->.<!--% file_extension %-->" length="<!--% episode.duration * 1000 %-->" type="audio/<!--% audio_mime_type %-->"/>
|
||||
<guid>http://hackerpublicradio.org/eps/hpr<!--% zero_pad_left(episode.id) %-->.<!--% file_extension %--></guid>
|
||||
</item>
|
||||
<!--% END %-->
|
||||
|
@@ -1,11 +1,11 @@
|
||||
<!--% 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) %-->
|
||||
<!--% 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 %-->
|
||||
@@ -17,7 +17,7 @@
|
||||
<!--% seconds = duration_sec % 60 %-->
|
||||
<!--% USE format %-->
|
||||
<!--% minutes_only = format("%d") %-->
|
||||
<!--% minutes = minutes_only(duration_sec / 60) %-->
|
||||
<!--% minutes = minutes_only(duration_sec / 60) %-->
|
||||
<!--% hours_only = format("%d") %-->
|
||||
<!--% hours = hours_only(minutes / 60) %-->
|
||||
<!--% IF hours >= 1 %-->
|
||||
@@ -57,39 +57,39 @@
|
||||
<!--% 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 %-->
|
||||
<!--% IF episode_type == "twat" %-->
|
||||
<!--% padding = 3 %-->
|
||||
<!--% media_folder = "eps/"; padding = 3 %-->
|
||||
<!--% ELSE %-->
|
||||
<!--% media_folder = "local/" %-->
|
||||
<!--% END %-->
|
||||
<!--% IF media_baseurl %-->
|
||||
<!--% transcription_types = "txt srt vtt" %-->
|
||||
<!--% USE String(transcription_types) %-->
|
||||
<!--% USE String(media_baseurl) %-->
|
||||
<!--% IF transcription_types.search(media_type) && media_baseurl.search('archive.org') %-->
|
||||
<!--% media_baseurl = "${media_baseurl}hpr\$eps_id/" %-->
|
||||
<!--% END %-->
|
||||
<!--% media_folder = "" %-->
|
||||
<!--% media_baseurl = media_baseurl.replace('\$eps_id', zero_pad_left(episode_id)) %-->
|
||||
<!--% END %-->
|
||||
<!--% media_basepath(baseurl, media_baseurl) %--><!--% media_folder %--><!--% episode_type %--><!--% zero_pad_left(episode_id, padding) %-->.<!--% media_type %-->
|
||||
<!--% END %-->
|
||||
|
||||
<!--% MACRO step_navigation(baseurl, links, folder) BLOCK %-->
|
||||
<!--% IF folder %-->
|
||||
<!--% folder = folder %--><!--% ELSE %--><!--% folder = "hpr" %-->
|
||||
<!--% END %-->
|
||||
<small><a href="<!--% absolute_path(baseurl) %-->eps/<!--% folder %--><!--% zero_pad_left(links.earliest) %-->/index.html" rel="first"><< First</a>,
|
||||
<!--% IF links.previous %-->
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/<!--% folder %--><!--% zero_pad_left(links.previous) %-->/index.html" rel="previous">< Previous</a>,
|
||||
<!--% ELSE %-->
|
||||
<span><</span> Previous,
|
||||
<!--% END %-->
|
||||
<!--% IF links.next %-->
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/<!--% folder %--><!--% zero_pad_left(links.next) %-->/index.html" rel="next">Next ></a>,
|
||||
<!--% ELSE %-->
|
||||
Next <span>></span>
|
||||
<!--% END %-->
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/<!--% folder %--><!--% zero_pad_left(links.latest) %-->/index.html" rel="last">Latest >></a></small>
|
||||
<small><a href="<!--% absolute_path(baseurl) %-->eps/<!--% folder %--><!--% zero_pad_left(links.earliest) %-->/index.html" rel="first"><< First</a>,
|
||||
<!--% IF links.previous %-->
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/<!--% folder %--><!--% zero_pad_left(links.previous) %-->/index.html" rel="previous">< Previous</a>,
|
||||
<!--% ELSE %-->
|
||||
<span><</span> Previous,
|
||||
<!--% END %-->
|
||||
<!--% IF links.next %-->
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/<!--% folder %--><!--% zero_pad_left(links.next) %-->/index.html" rel="next">Next ></a>,
|
||||
<!--% ELSE %-->
|
||||
Next <span>></span>
|
||||
<!--% END %-->
|
||||
<a href="<!--% absolute_path(baseurl) %-->eps/<!--% folder %--><!--% zero_pad_left(links.latest) %-->/index.html" rel="last">Latest >></a></small>
|
||||
<!--% END %-->
|
||||
|
Reference in New Issue
Block a user