Archived
4
2

85 Commits

Author SHA1 Message Date
Roan Horning
10236d5705 Merge pull request 'Skip padding when id is empty string' (#114) from I110_Error-Argument-isnt-numeric into main
Reviewed-on: #114
2023-06-05 02:52:37 +00:00
33d98904e2 Skip padding when id is empty string 2023-06-04 22:40:55 -04:00
Ken Fallon
de58d9dc61 Merge pull request 'I112_Add_support_for_a_different_php_basename' (#113) from I112_Add_support_for_a_different_php_basename into main
Reviewed-on: #113
2023-06-01 16:04:23 +00:00
c9510516f1 Change php_baseurl to hub_baseurl in the template files 2023-05-31 10:25:17 +02:00
d828cdbce8 Rename php_baseurl to hub_baseurl 2023-05-30 20:48:32 +02:00
6211b9a033 Change dynamic site name to hub.hackerpublicradio.com 2023-05-30 20:10:08 +02:00
f95ff21c5e Remove references to absolute_path(php_baseurl) 2023-05-30 17:59:33 +02:00
69055d6e9c Added php_baseurl 2023-05-30 09:13:01 +02:00
52c5d02dbc Add config entry for php_baseurl 2023-05-30 09:10:27 +02:00
Ken Fallon
db5774f642 Added support for having a different php FQDN location from the main site via php_baseurl 2023-05-29 16:11:59 +02:00
Roan Horning
7dca1d75cb Merge pull request '[I107] Fix calculation of the days until next available episode timeslot' (#108) from I107_Error-generating-next-available-episode into main
Reviewed-on: #108
2023-05-18 13:09:18 +00:00
e7fe824302 Fix calculation of the days until next available episode timeslot
Do all date calulation in DB instead of naively adding 1 to the
day that is returned.
2023-05-18 09:04:04 -04:00
Roan Horning
69255693ef Merge pull request 'Implement Tags page' (#106) from I6_Implement_Tags_page into main
Reviewed-on: #106
2023-05-06 13:14:51 +00:00
8b218e2036 Fix episode url issues
Add absolute_path macro. Add eps folder to path. Pad episode number
in path.
2023-05-06 09:07:25 -04:00
Gordon Stanton
afc6b7518f Fixed link to Tags.
Get episode ID and episode tags from eps.
Generate the Tags page by looping through the tags, order by their first character.
Added tags page to the config.
2023-05-01 00:50:01 +10:00
Roan Horning
f3de654284 Update 'README.md'
Add new contributor: norrist
2023-04-02 14:36:34 +00:00
Roan Horning
d2bf821aa8 Merge pull request 'h_is_for_hackers' (#105) from norrist/hpr_generator:h_is_for_hackers into main
Reviewed-on: #105
2023-04-02 14:32:38 +00:00
91ce3c4325 add comments viewer and put links on separate lines 2023-04-02 14:32:38 +00:00
821ea9b62d H links to correspondents page 2023-04-02 14:32:38 +00:00
6c9d6239bb Update audio link to use media_path MACRO 2023-04-02 10:24:41 -04:00
Roan Horning
f2c9326e61 Merge pull request '[I70] Add audio links' (#104) from I70-Add_audio_links into main
Reviewed-on: #104
2023-04-02 13:08:42 +00:00
ebced513ad Add audio links to the episodes on a series page 2023-04-02 09:06:57 -04:00
a2863e5d84 Update layout of episode summary information. 2023-04-02 08:53:07 -04:00
1c94855de2 Update location of comments
The listen_now MACRO formating changed, requiring an update to the postion of the comments reference.
2023-04-02 08:50:04 -04:00
c6e909523f Add requested audio links
Have links to an episodes auido files appear in the Last 5 weeks section of the index page, on the full index page, and on individual host pages.
2023-04-02 07:24:43 -04:00
a9c4388cb0 Update listen_now MACRO
The ability to download and play the episode is being moved up in the episode description. Display content in a more condensed form.
2023-04-01 19:56:11 -04:00
24c2f9044e Update show_meta MACRO
Display comments as part of the show meta data
2023-04-01 19:37:38 -04:00
f045cdd32f Update display_comments_tally MACRO
Display on the number of comments. Show a message
when the show has now comments.
2023-04-01 19:34:09 -04:00
dc4377d588 Add arial-title attribute to episode download links 2023-04-01 19:29:00 -04:00
Roan Horning
4fa79187a9 Update 'README.md'
Add Ken Fallon
2023-03-31 21:00:50 +00:00
Roan Horning
d5406f3cce Merge pull request '[I101] This reflects the change to move the "play" button to the top of the episode' (#102) from I101_Move_play_button_to_the_top into main
Reviewed-on: #102
2023-03-31 20:56:32 +00:00
Ken Fallon
5369bea657 This reflects the change to move the "play" button to the top of the episode 2023-03-31 14:02:49 +02:00
Roan Horning
0e9ad6ba65 Merge pull request 'Added lazy loading attribute to images in show notes.' (#100) from I99_Lazy_load_notes_images into main
Reviewed-on: #100
2023-03-28 02:19:47 +00:00
Gordon Stanton
610e91ea9f Added lazy loading attribute to images in show notes. 2023-03-19 22:51:21 +11:00
Roan Horning
860ce671f8 Merge pull request 'Moved thumbnail image tag to Block with conditional lazy load.' (#95) from I90_Lazy_load_host_avatars into main
Reviewed-on: #95
2023-03-16 16:13:48 +00:00
Roan Horning
51d6188542 Merge branch 'main' into I90_Lazy_load_host_avatars 2023-03-14 03:20:35 +00:00
c9278c0dd6 Remove unused PROCESS directive 2023-03-13 23:16:37 -04:00
aabeca44f5 Refactor templates to use show_avatar MACRO 2023-03-13 23:15:46 -04:00
3a8b6db348 Add show_avatar MACRO 2023-03-13 23:14:35 -04:00
7a6ace156f Refactor template to use get_avatar MACRO 2023-03-13 23:13:25 -04:00
dee924e6a8 Rename MACRO host_thumb to get_avatar
Update to use lazy_load MACRO and minimize number of
arguments needed.
2023-03-13 23:10:36 -04:00
5b4421071f Add MACRO lazy_load
Macro which allows programatically setting the HTML5 img
loading attribute.
2023-03-13 23:03:15 -04:00
Roan Horning
61311b30dd Merge pull request '[I96] Add acknowledgement of gordons' (#98) from I96-updated_list_of_acknowledgements into main
Reviewed-on: #98
2023-03-14 00:50:52 +00:00
7406a9baa4 Add acknowledgement of gordons 2023-03-13 20:47:59 -04:00
Gordon Stanton
ce4aefe828 Renamed macro get_avatar to get_avatar_src as per suggestion.
Moved host_thumb macro into shared avatar template file.
Made condition of lazy loading a parameter.
2023-03-12 18:48:51 +11:00
Gordon Stanton
ebcd906300 Moved thumbnail image tag to Block with conditional lazy load. 2023-03-11 01:57:51 +11:00
Roan Horning
3b144ecaf5 Merge pull request '[I87] Getting Started tutorial' (#89) from I87-Getting_Started_tutorial into main
Reviewed-on: #89
2023-03-10 02:44:53 +00:00
fc7975379e Fix grammer issues 2023-03-09 21:42:36 -05:00
207eabec86 Add reference to the file GETTING_STARTED.md
Update the Installation instructions to include reference
to the Getting Started tutorial.
2023-03-09 21:39:53 -05:00
c9af4fbde8 Merge branch 'main' into I87-Getting_Started_tutorial 2023-03-09 21:04:02 -05:00
Roan Horning
e557f103b9 Merge pull request '[I91] Fix link to comments viewer in about navigation menu' (#94) from I91-Fix_comments_viewer_link into main
Reviewed-on: #94
2023-03-10 02:02:00 +00:00
ea8403c7b6 Fix link to comments viewer in about navigation menu 2023-03-09 20:59:26 -05:00
b16a1c3a5f Merge branch 'main' into I87-Getting_Started_tutorial 2023-03-09 20:38:48 -05:00
Roan Horning
8783ca5099 Merge pull request '[I92] paramertize paths for configuration, templates, and HTML files' (#93) from I92-templates_and_output_directory_options into main
Reviewed-on: #93
2023-03-10 01:34:21 +00:00
f65e892182 Add template and HTML folder configuration options
Allow user to set the path for the website templates and
output folders in the site.cfg file.
2023-03-09 20:25:25 -05:00
14bafbc3ab Add command line option for path to configuration file
Allow user to pass the path to the configuration file into the
site-generator.
2023-03-08 22:23:56 -05:00
231a50957f Fix clone command of repositories 2023-03-07 19:33:09 -05:00
Roan Horning
bdc28d21c4 Merge branch 'main' into I87-Getting_Started_tutorial 2023-03-08 00:22:37 +00:00
9310a8642d Add instructions for running the site-configurator 2023-03-07 19:11:19 -05:00
97a5d4ebbd Add instructions for configuring the site-generator 2023-03-07 19:09:33 -05:00
b420453abd Add instructions for creating HPR SQLite file 2023-03-07 19:06:29 -05:00
7feae31e11 Add helper script that creates the HPR SQLite file 2023-03-07 19:03:08 -05:00
d6068778ab Add instructions for installing Perl modules 2023-03-07 18:55:08 -05:00
82d761bf68 Update Clone the Repository section
Add reference to the gitlab.com mirror repository.
2023-03-07 18:53:03 -05:00
Roan Horning
0f4fdc2d46 Merge pull request 'Add lazy loading to host image' (#88) from I83_Lazy_load_host_images into main
Reviewed-on: #88
2023-03-04 22:00:52 +00:00
Roan Horning
d3c2401e28 Merge branch 'main' into I83_Lazy_load_host_images 2023-03-04 22:00:21 +00:00
Gordon Stanton
c744bdf175 Moved host thumbnail image tag to separate template file.
Added loading="lazy" to image tag.
Changed alt text to show host username.
2023-03-05 02:07:03 +11:00
16d6cf99aa Add instructions for cloning the repository 2023-03-04 09:27:56 -05:00
add4f338be Add Getting Started tutorial
Currently a very high level outline of the document.
2023-03-04 09:10:06 -05:00
Roan Horning
444c05f8f9 Merge pull request '[I82] creating sqlite db from hpr.sql' (#86) from I82_creating-sqlite-db-from-hpr.sql into main
Reviewed-on: #86
2023-03-04 05:00:40 +00:00
24a12a5af3 Update instructions for creating SQLite db
Update the main README file and the POD Installation section
of the site-configuration program.
2023-03-03 23:53:21 -05:00
add92ef20d Add utility script to refresh the local website
This script  will download latest MySQL dump file from
hacckerpublicradio.org. Generate a new hpr.db SQLite file,
and then regenerate all of the website files.
2023-03-03 23:32:35 -05:00
f8e397d0bd Add required script mysql2sqlite to repository
Converts MySQL dump to SQLite3 compatible dump
    (including MySQL KEY xxxxx statements from the CREATE block).

    Website: https://github.com/dumblob/mysql2sqlite
    The MIT License (MIT)
    Copyright (c) 2015 esperlu, 2016 dumblob
2023-03-03 23:00:50 -05:00
6d588dc558 Merge branch 'main' into I82_creating-sqlite-db-from-hpr.sql 2023-03-03 22:52:21 -05:00
Roan Horning
f0b0b5ea59 Merge pull request 'Fix database instructions in configuration file' (#85) from Fix_db_sqlite_settings into main
Reviewed-on: #85
2023-03-04 03:49:09 +00:00
a33fa197df Fix database instructions in configuration file
Add back instructions for SQLite
2023-03-03 22:44:05 -05:00
e7e752f1e8 Improve function messages 2023-03-03 21:47:29 -05:00
094287837c Put variables into local scope of the function
Forgot to use the local keyword when declaring the variables.
2023-03-03 21:44:35 -05:00
a53f201842 Code formatting with no functional changes 2023-03-03 20:46:34 -05:00
2ce1280cc0 Make functional stub function copy_to_public_dir 2023-03-03 20:45:16 -05:00
d45ca0de96 Make functional stub function make_hpr_sqlite_db 2023-03-03 20:42:42 -05:00
13aeb647ad Make functional stub function download_hpr_sql 2023-03-03 20:41:29 -05:00
ee6a4e601d Fill out function clean_working_dir 2023-02-27 23:30:24 -05:00
b544687f0f Fill out stub of make_working_dir function 2023-02-27 23:27:26 -05:00
0ed7efe93b Initial add of bash library for update utils
Stubs for functions to be used in update scripts.
2023-02-27 21:07:01 -05:00
35 changed files with 1074 additions and 106 deletions

202
GETTING_STARTED.md Normal file
View File

@@ -0,0 +1,202 @@
# Clone the repository
If git is not installed on the operating system, please install it now
(see the git documentation for [instructions on installing git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)).
To retrieve the code from the repository on anhonesthost.net (a username and
password are required), run:
`git clone https://repo.anhonesthost.net/rho_n/hpr_generator.git`
To retrieve the code from the repository on gitlab.com, run:
`git clone https://gitlab.com/roan.horning/hpr_generator.git`
On success, an "hpr_generator" directory will be created in the folder from
which the clone command was executed containing a local copy of the git repository.
# Install required Perl modules
Installing the Perl modules is the most finicky part of the installation process.
The needed Perl modules can be found using the operating system's package
manager or using the modules found in the
[Comprehensive Perl Archive Network (CPAN)](https://www.cpan.org/).
## Installing modules on Debian based Linux distributions
Run command (tested on Debian 11):
```
apt install libconfig-std-perl \
libtemplate-perl \
libtemplate-plugin-dbi-perl \
libdbd-sqlite3-perl libdate-calc-perl \
libtie-dbi-perl
```
## Using CPAN to install the modules
A cross platform method to install the needed modules is the Perl CPAN application.
Make sure both the [make](https://www.gnu.org/software/make/manual/make.html)
command and the [cpan](https://perldoc.perl.org/CPAN) command are available.
Install them using the operating system's package manager, or from source.
Run commands:
```
cpan Config::Std
cpan Template
cpan Template::Plugin::DBI
cpan DBD::SQLite
cpan Date::Calc
cpan Tie::DBI
```
# Create the HPR database
The hpr_generator relies on information from a database to generate many of the
files for the website (for example: index.html, series/index.html,
hpr_mp3.rss, etc). This data is available from a MySQL dump file found on
hackerpublicradio.org at URL "https://www.hackerpublicradio.org/hpr.sql".
The first step is to download the hpr.sql file. This can be done using your
browser, or by running one of the following commands:
`curl https://www.hackerpublicradio.org/hpr.sql --output ./hpr.sql`
or
`wget --directory-prefix=./ https://www.hackerpublicradio.org/hpr.sql`
## Creating an SQLite database file
The SQL of the hpr.sql file must be converted from MySQL specific statements to
SQLite specific statements. The mysql2sqlite script found in the utils directory
is used for this conversion. First remove the lines from hpr.sql that
mysql2sqlite can't handle:
`sed '/^DELIMITER ;;/,/^DELIMITER ;/d' < ./hpr.sql > ./hpr-sqlite.sql`
Next run the mysql2sqlite script piping its output into the sqlite3
program which creates the hpr.db file:
`./utils/mysql2sqlite ./hpr-sqlite.sql | sqlite3 ./hpr.db`
For convenience, the update-sqlite-db.sh script in the utils directory
automates the above steps (including downloading the hpr.sql file).
From the root of the local hpr_generator repository run:
`./utils/update-sqlite-db.sh`
# Configure the site-generator
In your favorite text editor, open the site.cfg file found in the root of the
"hpr_generator" folder. Full details about options for configuring the site.cfg
file are found in the comments within the file.
## Configuring the database connection
Any database supported by the Perl:DBI and Perl::DBD modules can be used with
the site-generator program. Currently the hpr_generator project works with
a MySQL or SQLite database.
Find the [DBI] section of the file. It should look like the following
```
[DBI]
# Configuration settings for SQLite
#database: sqlite
#driver: dbi:SQLite:hpr.db
#user: (not used - leave blank)
#password: (not used - leave blank)
# Configuration settings for MySQL
#database: mysql
#driver: dbi:mysql:database=hpr_hpr:hostname=localhost
#user: hpr-generator (Suggested user with read-only privileges)
#password: ********* (Password for user)
```
### SQLite
Remove the comment character from the start of the database and driver
option lines:
```
# Configuration settings for SQLite
database: sqlite
driver: dbi:SQLite:hpr.db
#user: (not used - leave blank)
#password: (not used - leave blank)
```
The hpr.db section of the driver option `dbi:SQLite:hpr.db` is the path
to the sqlite file. The default assumes the hpr.db file is located in the same
directory as the site-generator.
### MySQL
Remove the comment character from the start of the database, driver,
user, and password option lines:
```
# Configuration settings for MySQL
database: mysql
driver: dbi:mysql:database=hpr_hpr:hostname=localhost
user: hpr-generator
password: *********
```
This assumes that the MySQL database service is available at the localhost
hostname, that the database name (hpr_hpr) is the database created from
the hpr.sql dump file or manually created by you, that the user (hpr-generator)
was added by you and has read rights to the hpr_hpr database, and that the
password (replace ********* with the actual password) matches the password set
for the hpr-generator database user.
## Configuring the website for viewing locally
For HTML links to work when viewing the files on your local machine using the
"file://" protocal (i.e. using the "Open..." command in your browser, each HTML
file must include a \<base\> meta-data tag in the \<head\> section of its
contents. To configure this in the site.cfg file, find the [root_template]
section. It should look like the following:
```
[root_template]
content: page.tpl.html
#baseurl: OPTIONAL [i.e. file://<full path to local website directory>]
```
Below the #baseurl comment line add:
```
baseurl: file://</path/to>/hpr_generator/public_html
```
Replace \<path/to\> with the full path to the hpr_generator directory. For
example: `file:///home/rho_n/development/hpr_generator/public_html`
## Configuring the website media file links
If you do not want to host all the media files (currently, audio files and
transcription files), you can configure the `media_baseurl` option. This can
be added to the [root_template] section of the site.cfg file. Suggested
external site is archive.org. To use this site add:
```
media_baseurl: https://archive.org/download/hpr$eps_id/
```
# Run the site-generator
Run the site generator form the hpr_generator directory:
```
./site-generator --all
```
This will generate all the files for the website. For more examples and to see
all available options run:
```
./site-generator --help
```

View File

@@ -4,10 +4,15 @@ Static web page generator for the Hacker Public Radio website.
## Installation
* Clone or download this repository
* 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`
* 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
@@ -30,7 +35,8 @@ Static web page generator for the Hacker Public Radio website.
* Tie::DBI
* DBD::SQLite or DBD:mysql
* Date::Calc
* See the Getting Started tutorial (GETTING_STARTED.md) for more details on
installing the HPR generator.
## Usage
Generate two specific pages:
`site-generator index about`
@@ -60,3 +66,6 @@ and add the label "**Feature Request**".
## Authors and acknowledgment
* Roan "Rho`n" Horning
* gordons
* Ken Fallon
* norrist

View File

@@ -248,6 +248,11 @@ pre.comment {
line-height: 1.2rem;
}
h3.title { margin: 1.25rem 0 0.75rem 0 }
p.meta { margin: 0.25rem 0 }
p.summary { margin: 0.25rem 0 }
p.listen-in { margin-top: 0 }
@media only screen and (max-width: 680px) {
#container {width: 95%;}
img#hprlogo {float: left; max-width: 85px; padding: .35em;}

View File

@@ -8,12 +8,13 @@
site-generator [OPTION]... PAGE|PAGE=<comma separated list of ids>...
-a, --all generate all pages defined in configuration file
-l, --list print list of configured pages
-p, --preview print generated pages to standard out
-q, --quiet suppress progress information while generating pages
-v, --verbose print extended progress information while generating pages
--help print this help message
-a, --all generate all pages defined in configuration file
-c, --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).
@@ -36,12 +37,15 @@ 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
* 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.
@@ -106,15 +110,17 @@ sub main {
# Argument parsing
my $all;
my $configuration_path;
my $preview;
my $verbose;
my $quiet;
GetOptions(
'all' => \$all,
'list' => \&print_available_pages,
'preview' => \$preview,
'verbose' => \$verbose,
'quiet' => \$quiet,
'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;
@@ -123,10 +129,21 @@ sub main {
$verbose = 'quiet';
};
# Load config file
read_config "site.cfg" => my %config;
if (!$configuration_path) {
$configuration_path = "site.cfg";
}
my $tt = get_template_html($config{DBI});
my %config;
if ( -f $configuration_path ) {
# Load config file
read_config $configuration_path => %config;
}
else {
print STDOUT "Could not read configuration file: $configuration_path\n";
exit 1;
}
my $tt = get_template_html($config{DBI}, $config{app_paths});
# If command line option all is set, parse configuration file
# for all pages
@@ -137,7 +154,7 @@ 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;
@page_args= grep { $_ ne 'app_paths' } @page_args;
};
foreach my $page_arg (@page_args) {
@@ -190,8 +207,8 @@ sub get_template_html (\%@) {
# HTML comments to make the template file valid HTML.
#
return Template->new({
INCLUDE_PATH => './templates',
OUTPUT_PATH => './public_html',
INCLUDE_PATH => $_[1]{templates_path},
OUTPUT_PATH => $_[1]{output_path},
EVAL_PERL => 1,
START_TAG => '<!--%',
END_TAG => '%-->',
@@ -286,7 +303,7 @@ sub get_filename {
else {
$filename = $$config{'filename'};
my $padded_index = "";
if (exists $$config{'id'}) {
if (exists $$config{'id'} && $$config{'id'} ne "") {
$padded_index = sprintf("%04d", $$config{'id'});
}
$filename =~ s/\[id\]/$padded_index/;

View File

@@ -2,10 +2,21 @@
# with the database.
# dbi:<driver name [SQLite, CSV, ADO, mSQL, etc.]>:<database name>
[DBI]
database: mysql
driver: dbi:mysql:database=hpr_hpr:hostname=localhost
user: hpr-generator
password: zBozqN-Z2zNAz
# Configuration settings for SQLite
#database: sqlite
#driver: dbi:SQLite:hpr.db
#user: (not used - leave blank)
#password: (not used - leave blank)
# Configuration settings for MySQL
#database: mysql
#driver: dbi:mysql:database=hpr_hpr:hostname=localhost
#user: hpr-generator (Suggested user with read-only privileges)
#password: ********* (Password for user)
# Configure the location of the templates and the generated HTML
[app_paths]
templates_path: ./templates
output_path: ./public_html
# Configure the root template page which pulls in the navigation and
# content templates used by each page. An optional baseurl property may
@@ -15,6 +26,7 @@ password: zBozqN-Z2zNAz
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/
hub_baseurl: http://hub.hackerpublicradio.com/
media_baseurl: https://archive.org/download/hpr$eps_id/
# Configure the navigation menu and the content templates for each page
@@ -135,6 +147,10 @@ content: content-promote.tpl.html
navigation: navigation-about.tpl.html
content: content-sitemap.tpl.html
[tags]
navigation: navigation-main.tpl.html
content: content-tags.tpl.html
[twat_episode]
navigation: navigation-get-shows.tpl.html
content: content-twat_episode.tpl.html

View File

@@ -1,6 +1,6 @@
<h1>About HPR.</h1>
<h2 id="history">History<a href="#history">.</a></h2>
<p>Hacker Public Radio (HPR) is an Internet Radio show (podcast) that releases shows every weekday Monday through Friday. HPR has a long lineage going back to <a target="_blank" href="http://www.oldskoolphreak.com" target="_blank">Radio FreeK America</a>, <a target="_blank" href="http://www.binrev.com" target="_blank">Binary Revolution Radio</a> &amp; <a target="_blank" href="http://nomicon.info" target="_blank">Infonomicon</a>, and it is a direct continuation of <a target="_blank" href="<!--% absolute_url(baseurl) %-->twat.html" target="_blank">Twatech</a> radio. Please listen to StankDawg&#39;s &quot;<a target="_blank" href="<!--% absolute_url(baseurl) %-->eps/hpr0001.mp3" target="_blank">Introduction to HPR</a>&quot; for more information.</p>
<p>Hacker Public Radio (HPR) is an Internet Radio show (podcast) that releases shows every weekday Monday through Friday. HPR has a long lineage going back to <a target="_blank" href="http://www.oldskoolphreak.com" target="_blank">Radio FreeK America</a>, <a target="_blank" href="http://www.binrev.com" target="_blank">Binary Revolution Radio</a> &amp; <a target="_blank" href="http://nomicon.info" target="_blank">Infonomicon</a>, and it is a direct continuation of <a target="_blank" href="<!--% absolute_url(baseurl) %-->twat.html" target="_blank">Twatech</a> radio. Please listen to StankDawg&#39;s &quot;<a target="_blank" href="<!--% media_path(1, 'hpr', 'mp3', baseurl, media_baseurl) %-->" target="_blank">Introduction to HPR</a>&quot; for more information.</p>
<h2 id="community">The HPR Community<a href="#community">.</a></h2>
<p>What differentiates HPR from other podcasts is that the shows are crowd sourced from the community - fellow listeners like <strong><a target="_blank" href="<!--% absolute_url(baseurl) %-->contact.html" target="_blank">you</a></strong>. There is no restriction on how long the show can be, nor on the topic you can cover as long as they are not spam and <em>&quot;are of interest to <a target="_blank" href="http://en.wikipedia.org/wiki/Hacker_(hobbyist)" target="_blank">Hackers</a>&quot;</em>. If you want to see what topics have been covered so far just have a look at our <a target="_blank" href="<!--% absolute_url(baseurl) %-->eps/index.html" target="_blank">Archive</a>. We also allow for a <a target="_blank" href="<!--% absolute_url(baseurl) %-->series/index.html" target="_blank">series</a> of shows so that hosts can go into more detail on a topic.<p>

View File

@@ -1,5 +1,4 @@
<!--% 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" %-->

View File

@@ -55,7 +55,7 @@
<h2>4. Upload your show</h2>
<p>
Once you have your audio ready you can post your show by going to the <a href="https://www.hackerpublicradio.org/calendar.php">Calendar</a> page or press the <strong><a href="https://www.hackerpublicradio.org/calendar.php">⇧Upload⇧</strong></a> button.
Once you have your audio ready you can post your show by going to the <a href="<!--% hub_baseurl %-->calendar.php">Calendar</a> page or press the <strong><a href="<!--% hub_baseurl %-->calendar.php">⇧Upload⇧</strong></a> button.
</p>
<p>
After you have selected a date you will be redirected to the <a href="https://www.hackerpublicradio.org/request.php">request page</a>, where you will be asked to select your show and email address. We will send a link to where you can upload your show to this address and so it must be a valid working address that you can access quickly. We intend to use <a href="https://www.gnupg.org/">GPG</a> to speed up the validation of hosts, so you may wish to use an email address that has an associated public key available on public key servers.

View File

@@ -55,19 +55,20 @@
<!--% this_host = hosts.$id %-->
<h2 class="title">Correspondent</h2>
<h2><!--% this_host.host %--></h2>
<p><img src="<!--% absolute_path(baseurl) %-->images/<!--% get_avatar(this_host.hostid) %-->"
height="80" alt="Host Image" /><br>
<p><!--% get_avatar(this_host.hostid, this_host.host) %--><br>
<label>Host ID</label>: <!--% this_host.hostid %--><br><br>
<label>email:</label> <u><!--% this_host.email %--></u><br>
<label>episodes:</label> <strong><!--% hpr_show_count + twat_show_count %--></strong>
</p>
<!--% FOREACH hpr_show IN hpr_shows; %-->
<!--% show_summary(hpr_show, 'hide_host') %-->
<!--% END %-->
<!--% show_summary(hpr_show, 'hide_host') %-->
<p class="listen-in"><!--% display_listen_in(hpr_show.id) %--></p>
<!--% END %-->
<!--% FOREACH twat_show IN twat_shows; %-->
<!--% twat_show_summary(twat_show, 'hide_host') %-->
<p class="listen-in"><!--% display_listen_in(twat_show.id,"twat") %--></p>
<!--% END %-->
</article>
<p><a href="contribute.html">Become a Correspondent</a></p>

View File

@@ -1,9 +1,10 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS 'shared-avatar.tpl.html' %-->
<article>
<h2 class="title">Correspondents</h2>
<p>For more information on how to become a Correspondent see our <a href="<!--% absolute_path(baseurl) %-->contribute.html">contribute</a></center> page. To add a logo here, either email one to admin at hpr or setup your email on <a href="https://en.gravatar.com/">Gravatar</a>. To protect your browsing privacy we gather the images every hour and serve them directly from HPR.<p />
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% PROCESS 'shared-avatar.tpl.html' %-->
<!--% host_cnt = 0 %-->
<table class="hosts">
<th >Avatar</th>
<th >Name &amp; Host ID</th>
@@ -17,14 +18,14 @@
on h.hostid = e.hostid '
) %-->
<tr height="80">
<td><img src="<!--% absolute_path(baseurl) %-->images/<!--% get_avatar(host.hostid) %-->" height="80" width="80" alt="avatar" /></td>
<td><!--% get_avatar(host.hostid, host.host, host_cnt > 8) %--></td>
<td><strong><!--% host.host %--></strong><br>
Host ID: <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(host.hostid) %-->.html"><!--% host.hostid %--></a></td>
<td><!--% host.license %--></td>
<td><!--% host.date %--></td>
</tr>
</tr><!--% host_cnt = host_cnt + 1 %-->
<!--% END %-->
</table>
<p><a href="<!--% absolute_path(baseurl) %-->contribute.html">Become a Correspondent</a></p>

View File

@@ -16,22 +16,19 @@
<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 %-->
<p><!--% show_avatar(episode.hostid, episode.host) %-->
Hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(episode.hostid) %-->.html"><!--% episode.host %--></a> on <span><!--% episode.date %--></span> is flagged as <span><!--% display_explicit(episode.explicit) %--></span> and is released under a <span><!--% episode.license %--> license</span>. <br>
<!--% display_tags(episode.tags) %--> <br>
<!--% display_listen_in(episode.id) %--> |
<!--% display_comments_tally(episode.id, episode.eps_tally) %-->
<!--% display_tags(episode.tags) %-->
<label>Comments: </label><!--% display_comments_tally(episode.id, episode.eps_tally) %--> <br>
<!--% listen_now(episode, "hpr", baseurl, media_baseurl) %-->
</p>
<h3><!--% show_series(episode.series, episode.seriesid, "Part of the series") %--></h3>
<p><em><!--% episode.series_description %--></em></p>
</header>
<div><!--% episode.notes %--></div>
<footer>
<!--% show_transcript(episode, "hpr", baseurl, media_baseurl) %-->
<!--% listen_now(episode, "hpr", baseurl, media_baseurl) %-->
<p>
<!--% episode_navigation %-->
</p>

View File

@@ -11,6 +11,7 @@
<!--% FOREACH episodes IN DBI.query(query_episodes)
%-->
<!--% show_summary(episodes) %-->
<p class="listen-in"><!--% display_listen_in(episodes.id) %--></p>
<!--% END %-->
<h2 id="twat_episodes">Today With a Techie Archived Shows</h2>
<p>

View File

@@ -5,6 +5,24 @@
<!--% PROCESS 'shared-call_for_shows.tpl.html' %-->
<!--% INCLUDE 'content-index-announcement.tpl.html' %-->
<!--% PROCESS "queries-index-${constants.database}.tpl.html" %-->
<!--% MACRO tidy_notes(all_lines) BLOCK %-->
<!--% lines = all_lines %-->
<!--% after_html = all_lines %-->
<!--% img_re = '(?six)^(.*?)\<img ([^\>]+\>)(.+)$' %-->
<!--% lazy_re = '(?i)loading="lazy"' %-->
<!--% WHILE (matches = lines.match(img_re)) %-->
<!--% img_tag = matches.1 %-->
<!--% after_html = matches.2 %-->
<!--% matches.0 %-->
<!--% IF (img_tag.search(lazy_re)) %-->
<img <!--% img_tag %-->
<!--% ELSE %-->
<img loading="lazy" <!--% img_tag %-->
<!--% END %-->
<!--% lines = after_html %-->
<!--% END %-->
<!--% after_html %-->
<!--% END %-->
<hr>
<article>
<header>
@@ -16,11 +34,11 @@
%-->
<!--% 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) %-->
<!--% days_till_next_episode = calc.Delta_Days(date.format(date.now, '%Y'),date.format(date.now, '%m'),date.format(date.now, '%d'),next_available_episode_result.last_year,next_available_episode_result.last_month,next_available_episode_result.last_day) %-->
<!--% END %-->
<!--% USE date %-->
<!--% delta = date.calc.N_Delta_YMD(2005,9,19, date.format(date.now, '%Y'),date.format(date.now, '%m'),date.format(date.now, '%d')) %-->
<p>We started producing shows as <a href="<!--% 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>
<p>We started producing shows as <a href="<!--% absolute_path(baseurl) %-->eps/index.html#twat_episodes"><em>Today with a Techie</em></a> on 2005-09-19, <!--% delta.0 %--> years, <!--% delta.1 %--> months, <!--% delta.2 %--> days ago. our shows are produced by <a href="<!--% absolute_path(baseurl) %-->correspondents/index.html">listeners</a> like you and can be on any <a href="<!--% absolute_path(baseurl) %-->eps/index.html">topic</a> that <strong>"are of interest to <a href="https://en.wikipedia.org/wiki/hacker_(hobbyist)">hackers</a>"</strong>. if you listen to HPR then please consider contributing one show a year. if you <a href="<!--% absolute_path(baseurl) %-->contribute.html">record</a> your show now it could be <a href="<!--% hub_baseurl %-->calendar.php">released</a> in <strong><!--% days_till_next_episode %--></strong> days.</p>
</article>
<!--% display_call_for_shows() %-->
<article>
@@ -35,6 +53,7 @@
<hr>
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
<h1>Latest Shows</h1>
<!--% host_cnt = 0 %-->
<!--% FOREACH latest_episodes IN DBI.query(query_latest_episodes)
%-->
<hr>
@@ -42,21 +61,20 @@
<header>
<h1><a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(latest_episodes.id) %-->/index.html">hpr<!--% latest_episodes.id %--> :: <!--% latest_episodes.title %--></a></h1>
<h3><!--% latest_episodes.summary%--></h3>
<p class="meta"$><!--% IF get_avatar(latest_episodes.hostid) != 'hpr_logo.png' %-->
<img src="<!--% absolute_path(baseurl) %-->images/<!--% get_avatar(latest_episodes.hostid) %-->" height="80" width="80" alt="" /></a><!--% END %-->
<br>Hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(latest_episodes.hostid) %-->.html"><!--% latest_episodes.host %--></a> on <!--% latest_episodes.date %--> is flagged as <!--% display_explicit(latest_episodes.explicit) %--> and released under a <!--% latest_episodes.license %--> license. <br>
<!--% 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 class="meta"$><!--% show_avatar(latest_episodes.hostid, latest_episodes.host, host_cnt) %-->
Hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(latest_episodes.hostid) %-->.html"><!--% latest_episodes.host %--></a> on <!--% latest_episodes.date %--> is flagged as <!--% display_explicit(latest_episodes.explicit) %--> and released under a <!--% latest_episodes.license %--> license. <br>
<!--% display_tags(latest_episodes.tags) %-->
<span><!--% show_series(latest_episodes.series, latest_episodes.seriesid) %--></span>
<span><label>Comments: </label><!--% display_comments_tally(latest_episodes.id, latest_episodes.eps_tally) %--></span><br>
<!--% listen_now(latest_episodes, "hpr", baseurl, media_baseurl) %-->
</p>
</header>
<!--% latest_episodes.notes %-->
<!--% tidy_notes(latest_episodes.notes) %-->
<footer>
<!--% show_transcript(latest_episodes, "hpr", baseurl, media_baseurl) %-->
<!--% listen_now(latest_episodes, "hpr", baseurl, media_baseurl) %-->
</footer>
</article>
<!--% host_cnt = host_cnt + 1 %-->
<!--% END %-->
<article>
<header>
@@ -66,6 +84,7 @@
<!--% FOREACH last_5_weeks_episodes IN DBI.query(query_last_5_weeks_episodes)
%-->
<!--% show_summary(last_5_weeks_episodes) %-->
<p class="listen-in"><!--% display_listen_in(last_5_weeks_episodes.id) %--></p>
<!--% END %-->
</article>
<h1>Older Shows</h1>

View File

@@ -7,7 +7,7 @@
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://www.hackerpublicradio.org/calendar.php">Calendar</a> page. Once you have selected a date you will be redirected to the <a href="<!--% absolute_url(baseurl) %-->request.html">request page</a>, where you will be asked to select your show and email address. We will send a link to where you can upload your show to this address and therefore it must be a valid working address that you can access quickly. We intend to use <a href="https://www.gnupg.org/">GPG</a> to speed up the validation of hosts, so you may wish to use an email address that has an associated public key available on public key servers.
You can post your show by going to the <a href="<!--% hub_baseurl %-->calendar.php">Calendar</a> page. Once you have selected a date you will be redirected to the <a href="<!--% absolute_url(baseurl) %-->request.html">request page</a>, where you will be asked to select your show and email address. We will send a link to where you can upload your show to this address and therefore it must be a valid working address that you can access quickly. We intend to use <a href="https://www.gnupg.org/">GPG</a> to speed up the validation of hosts, so you may wish to use an email address that has an associated public key available on public key servers.
</p>
<p>
The audio of your show will not be moderated, however <em>the information provided in the upload form <strong>may be moderated</strong></em>. All publicly facing material is managed by the HPR Community as a whole, and not just the host providing the show. The show <a href="<!--% absolute_url(baseurl) %-->eps/hpr2210/index.html">hpr2210 :: On Freedom of Speech and Censorship</a> describes the agreed approach to this topic.
@@ -134,6 +134,6 @@
</li>
</ul>
<p>
Press submit and your show will be sent to the HPR Volunteers to be processed. Keep an eye on the <a href="http://www.hackerpublicradio.org/calendar.php">calendar</a> for when it is posted.
Press submit and your show will be sent to the HPR Volunteers to be processed. Keep an eye on the <a href="<!--% hub_baseurl %-->calendar.php">calendar</a> for when it is posted.
Your show information is used to process the media files, on the website, in the RSS feeds, and on social media sites.
</p>

View File

@@ -22,5 +22,6 @@
<!--% show_results = query_shows.execute(id) %-->
<!--% FOREACH show IN show_results %-->
<!--% show_summary(show) %-->
<p class="listen-in"><!--% display_listen_in(show.id) %--></p>
<!--% END %-->
</article>

View File

@@ -1,7 +1,7 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<h1>Sitemap</h1>
<ul>
<li><a href="https://www.hackerpublicradio/calendar.php"><strong>⇧Upload⇧</strong></a> ← Upload Your Show</li>
<li><a href="<!--% hub_baseurl %-->calendar.php"><strong>⇧Upload⇧</strong></a> ← Upload Your Show</li>
<li><a href="<!--% absolute_path(baseurl) %-->index.html"><strong>Home</strong></a> ← The HPR Homepage</li>
<li><a href="<!--% absolute_path(baseurl) %-->syndication.html">Get Shows</a> ← The RSS Syndication Feeds</li>
<ul>

View File

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

View File

@@ -52,10 +52,10 @@
<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 %-->
<p><!--% show_avatar(episode.hostid, episode.host) %-->
Hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(episode.hostid) %-->.html"><!--% episode.host %--></a> on <span><!--% episode.date %--></span> is flagged as <span><!--% display_explicit(episode.explicit) %--></span> and is released under a <span><!--% episode.license %--> license</span>. <br>
<!--% display_tags(episode.tags) %--> <br>
<!--% listen_now(episode, "twat", baseurl, media_baseurl) %-->
<!--% display_listen_in(episode.id, "twat") %-->
</p>
<h3><!--% show_series(episode.series, episode.seriesid, "Part of the series") %--></h3>
@@ -63,7 +63,6 @@ Hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pa
</header>
<div><!--% episode.notes %--></div>
<footer>
<!--% listen_now(episode, "twat", baseurl, media_baseurl) %-->
<p>
<!--% episode_navigation %-->
</p>

View File

@@ -1,10 +1,10 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<ul>
<li><a href="https://www.hackerpublicradio.org/calendar.php"><strong>⇧Upload⇧</strong></a></li>
<li><a href="<!--% hub_baseurl %-->calendar.php"><strong>⇧Upload⇧</strong></a></li>
<li><a href="<!--% absolute_path(baseurl) %-->index.html"><strong>Home</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->about.html">About »</strong></a></li>
<li><a href="<!--% absolute_path(baseurl) %-->correspondents/index.html">Hosts</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->contact.html">Contact</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->promote.html">Promote HPR</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->comments_viewer.php">Show Comments</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->comments_viewer.html">Show Comments</a></li>
</ul>

View File

@@ -1,6 +1,6 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<ul>
<li><a href="https://www.hackerpublicradio.org/calendar.php"><strong>⇧Upload⇧</strong></a></li>
<li><a href="<!--% hub_baseurl %-->"><strong>⇧Upload⇧</strong></a></li>
<li><a href="<!--% absolute_path(baseurl) %-->index.html"><strong>Home</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->help_out.html">Contribute »</strong></a></li>
<li><a href="<!--% absolute_path(baseurl) %-->contribute.html">Submit Show</a></li>

View File

@@ -1,6 +1,6 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<ul>
<li><a href="https://www.hackerpublicradio.org/calendar.php"><strong>⇧Upload⇧</strong></a></li>
<li><a href="<!--% hub_baseurl %-->"><strong>⇧Upload⇧</strong></a></li>
<li><a href="<!--% absolute_path(baseurl) %-->index.html"><strong>Home</strong></a></li>
<li><a href="<!--% absolute_path(baseurl) %-->syndication.html"><strong>Get Shows »</strong></a></li>
<li><a href="<!--% absolute_path(baseurl) %-->eps/index.html">Full Episode Guide</a></li>

View File

@@ -1,6 +1,6 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<ul>
<li><a href="https://www.hackerpublicradio.org/calendar.php"><strong>⇧Upload⇧</strong></a></li>
<li><a href="<!--% hub_baseurl %-->"><strong>⇧Upload⇧</strong></a></li>
<li><a href="<!--% absolute_path(baseurl) %-->index.html"><strong>Home</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->contribute.html">Give Shows »</strong></a>
<li><a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html">Info</a></li>

View File

@@ -1,11 +1,11 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<ul>
<li><a href="https://www.hackerpublicradio.org/calendar.php"><strong>⇧Upload⇧</strong></a></li>
<li><a href="<!--% hub_baseurl %-->calendar.php"><strong>⇧Upload⇧</strong></a></li>
<li><a href="<!--% absolute_path(baseurl) %-->index.html"><strong>Home »</strong></a></li>
<li><a href="<!--% absolute_path(baseurl) %-->syndication.html">Get Shows</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->contribute.html">Give Shows</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->help_out.html">Contribute</a></li>
<li><a href="http://www.hackerpublicradio.org/tags.php">Tags</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->tags.html">Tags</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->about.html">About</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->search.html">Search</a></li>
</ul>

View File

@@ -24,7 +24,7 @@
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Ogg Vorbis RSS" href="<!--% absolute_path(baseurl) %-->hpr_ogg.rss" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Speex RSS" href="<!--% absolute_path(baseurl) %-->hpr_spx.rss" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio MP3 RSS" href="<!--% absolute_path(baseurl) %-->hpr_mp3.rss" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Comments RSS" href="/comments_rss.php" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Comments RSS" href="<!--% hub_baseurl %-->comments_rss.php" />
<link rel="license" title="cc by 3.0" href="https://creativecommons.org/licenses/by-sa/3.0/" />
<link href="<!--% absolute_path(baseurl) %-->css/hpr.css" rel="stylesheet" />
<!--[if IE]>
@@ -43,7 +43,11 @@
<a href="<!--% absolute_path(baseurl) %-->sitemap.html">Site Map</a>
- <a href="#maincontent">skip to main content</a>
</p>
<h1 id="sitename">Hacker <a href="https://www.hackerpublicradio.org/comments_viewer.php">P</a>ublic <a href="<!--% absolute_path(baseurl) %-->syndication.html">R</a>adio</h1>
<h1 id="sitename">
<a href="<!--% absolute_path(baseurl) %-->correspondents/index.html">H</a>acker
<a href="<!--% absolute_path(baseurl) %-->comments_viewer.html">P</a>ublic
<a href="<!--% absolute_path(baseurl) %-->syndication.html">R</a>adio
</h1>
<h2>Your ideas, projects, opinions - podcasted.</h2>
<h3>New episodes Monday through Friday.</h3>
</div>

View File

@@ -6,9 +6,9 @@
)
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\'
DATE_FORMAT(DATE_ADD(MIN(last_date), INTERVAL 1 DAY), \'%Y\') AS \'last_year\',
DATE_FORMAT(DATE_ADD(MIN(last_date), INTERVAL 1 DAY), \'%d\') AS \'last_day\',
DATE_FORMAT(DATE_ADD(MIN(last_date), INTERVAL 1 DAY), \'%m\') AS \'last_month\'
FROM next_id
LEFT JOIN eps ON next_id.id_next = eps.id
WHERE eps.id IS NULL

View File

@@ -6,9 +6,9 @@
)
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\'
strftime(\'%Y\', DATE (MIN (last_date), \'+1 Days\')) AS \'last_year\',
strftime(\'%d\', DATE (MIN (last_date), \'+1 Days\')) AS \'last_day\',
strftime(\'%m\', DATE (MIN (last_date), \'+1 Days\')) AS \'last_month\'
FROM next_id
LEFT JOIN eps ON next_id.id_next = eps.id
WHERE eps.id IS NULL

View File

@@ -0,0 +1 @@
<!--% query_tags = 'SELECT id, tags FROM eps' %-->

View File

@@ -0,0 +1 @@
<!--% query_tags = 'SELECT id, tags FROM eps' %-->

View File

@@ -1,5 +1,16 @@
<!--% MACRO get_avatar(host_id) BLOCK %-->
<!--% MACRO lazy_load(is_lazy) BLOCK %-->
<!--% IF is_lazy %-->loading="lazy"<!--% END %-->
<!--% END %-->
<!--% MACRO get_avatar_src(host_id) BLOCK %-->
<!--% TRY %-->
<!--% USE File ("./public_html/images/hosts/${host_id}.png") %-->hosts/<!--% File.name %-->
<!--% CATCH File %-->hpr_logo.png<!--% END %-->
<!--% END %-->
<!--% MACRO get_avatar(host_id, host_name, is_lazy_loaded) BLOCK %-->
<img src="<!--% absolute_path(baseurl) %-->images/<!--% get_avatar_src(host_id) %-->" height="80" width="80" alt="Thumbnail of <!--% host_name | html %-->" <!--% lazy_load(is_lazy_loaded) %--> />
<!--% END %-->
<!--% MACRO show_avatar(host_id, host_name, is_lazy_loaded) BLOCK %-->
<!--% IF get_avatar_src(host_id) != 'hpr_logo.png' %-->
<a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(host_id) %-->.html"><!--% get_avatar(host_id, host_name, is_lazy_loaded) %--></a><br>
<!--% END %-->
<!--% END %-->

View File

@@ -19,20 +19,26 @@ from the series <em><a href="<!--% baseurl %-->series/<!--% zero_pad_left(series
<!--% 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>,
<a href="<!--% media_path(eps_id, episode_type, 'ogg', baseurl, media_baseurl) %-->" aria-label="Download <!--% episode_type %--><!--% zero_pad_left(eps_id) %--> as">ogg</a>,
<a href="<!--% media_path(eps_id, episode_type, 'spx', baseurl, media_baseurl) %-->" aria-label="Download <!--% episode_type %--><!--% zero_pad_left(eps_id) %--> as">spx</a>,
or
<!--% END %-->
<a href="<!--% media_path(eps_id, episode_type, 'mp3', baseurl, media_baseurl) %-->">mp3</a> format.
<a href="<!--% media_path(eps_id, episode_type, 'mp3', baseurl, media_baseurl) %-->" aria-label="Download <!--% episode_type %--><!--% zero_pad_left(eps_id) %--> as">mp3</a> format.
<!--% END %-->
<!--% MACRO display_comments_tally(eps_id, tally) BLOCK %-->
<a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(eps_id) %-->/index.html#comments">Comments (<!--% tally %-->)</a>.
<a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(eps_id) %-->/index.html#comments" aria-label="Comments for hpr<!--% zero_pad_left(eps_id) %-->"><!--% IF tally > 0 %--><!--% tally %--><!--% ELSE %-->(Be the first)<!--% END %--></a>.
<!--% END %-->
<!--% MACRO show_meta(show, hide_tags) BLOCK %-->
<span><label>Released:</label> <!--% show.date %-->.</span> <span><label>Duration:</label> <!--% display_episode_duration(show.duration) %-->.</span> <span><label>Flag:</label> <!--% display_explicit(show.explicit) %-->.</span> <span><!--% show_series(show.series, show.seriesid) %--></span> <br>
<!--% IF hide_tags == "" %--><!--% display_tags(tags) %--><!--% END %-->
<span><label>Released:</label> <!--% show.date %-->.</span>
<span><label>Duration:</label> <!--% display_episode_duration(show.duration) %-->.</span>
<span><label>Flag:</label> <!--% display_explicit(show.explicit) %-->.</span>
<span><!--% show_series(show.series, show.seriesid) %--></span> <br>
<!--% IF hide_tags == "" %--><!--% display_tags(show.tags) %--><!--% END %-->
<!--% IF show.comentsTally || show.commentsTally == 0 %-->
<span><label>Comments:</label> <!--% display_comments_tally(show.id, show.commentsTally) %--></span>
<!--% END %-->
<!--% END %-->
<!--% MACRO show_summary(show, hide_host) BLOCK %-->
@@ -41,9 +47,8 @@ or
hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(show.hostid) %-->.html"><!--% show.host %--></a>
<!--% END %-->
</h3>
<p class="meta"><!--% show_meta(show) %--><br>
<!--% show.summary %-->
</p>
<p class="meta"><!--% show_meta(show) %--></p>
<p class="summary"><!--% show.summary %--></p>
<!--% END %-->
<!--% MACRO twat_show_summary(show, hide_host) BLOCK %-->
@@ -52,8 +57,7 @@ or
hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(show.hostid) %-->.html"><!--% show.host %--></a>
<!--% END %-->
</h3>
<p class="meta"><!--% show_meta(show) %--><br>
<!--% show.summary %-->
</p>
<p class="meta"><!--% show_meta(show) %--></p>
<p class="summary"><!--% show.summary %--></p>
<!--% END %-->

View File

@@ -1,16 +1,12 @@
<!--% MACRO listen_now(episode, episode_type, baseurl, media_baseurl) BLOCK %-->
<h2>Listen Now</h2>
<p>Duration: <!--% display_episode_duration(episode.duration) %--></p>
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
<!--% MACRO listen_now(episode, episode_type, baseurl, media_baseurl, hide_duration) BLOCK %-->
<p><!--% display_listen_in(episode.id, episode_type) %--> Play now:<br>
<audio controls preload="none">
<source src="<!--% media_path(episode.id, episode_type, 'ogg', baseurl, media_baseurl) %-->" type="audio/ogg" >
<source src="<!--% media_path(episode.id, episode_type, 'mp3', baseurl, media_baseurl) %-->" type="audio/mpeg" >
</audio>
<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>
<!--% IF !hide_duration %--><br>
Duration: <!--% display_episode_duration(episode.duration) %--><!--% END %--></p>
<!--% END %-->

184
utils/lib_utils.sh Normal file
View File

@@ -0,0 +1,184 @@
#!/bin/bash -
#===============================================================================
#
# FILE: lib_utils.sh
#
# USAGE: ./lib_utils.sh
#
# DESCRIPTION: functions for scripts used to update local HPR installations
# using the HPR static site generator
#
# OPTIONS: ---
# REQUIREMENTS: mysql2sqlite (https://github.com/dumblob/mysql2sqlite)
# BUGS: ---
# NOTES: ---
# AUTHOR: Roan "Rho`n" Horning <roan.horning@gmail.com>
# CREATED: 02/26/2023 03:27:08 PM -5 UTC
# REVISION: ---
# LICENSE: GNU AGPLv3
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
#===============================================================================
set -o nounset # Treat unset variables as an error
#--- FUNCTION ----------------------------------------------------------------
# NAME: make_working_dir
# DESCRIPTION: Creates a local temporary working directory
# SEE: https://stackoverflow.com/questions/4632028/how-to-create-a-temporary-directory#answer-34676160
# PARAMETERS:
# RETURNS: The path to the working directory
#-------------------------------------------------------------------------------
function make_working_dir {
# the directory of the script
local DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# the temp directory used, within $DIR
# omit the -p parameter to create a temporal directory in
# the default location
local WORK_DIR=`mktemp -d -p "$DIR"`
# check if tmp dir was created
if [[ ! "$WORK_DIR" || ! -d "$WORK_DIR" ]]; then
echo "Could not create temp dir"
exit 1
fi
echo $WORK_DIR
}
#--- FUNCTION ----------------------------------------------------------------
# NAME: clean_working_dir
# DESCRIPTION: Remove local temporary working directory
# PARAMETERS: WORK_DIR -- Temporay directory to be delted
# RETURNS:
#-------------------------------------------------------------------------------
function clean_working_dir {
if [[ -d $1 ]] && expr $1 : '.*/tmp.*' ; then
rm -rf $1
echo "Deleted temp working directory $1"
else
echo "Did not delete directory: $1"
echo "Not a temporary directory."
fi
}
#--- FUNCTION ----------------------------------------------------------------
# NAME: download_hpr_sql
# DESCRIPTION: Download the HPR SQL dump file into a working directory
# PARAMETERS:
# RETURNS:
#-------------------------------------------------------------------------------
function download_hpr_sql {
if [[ ! -d $1 ]] || ! expr $1 : '.*/tmp.*' ;
then
echo "Please provide the temporary directory when calling this function"
return 1
fi
local CURL=`which curl`
local WGET=`which wget`
local HPR_URL=https://www.hackerpublicradio.org/hpr.sql
if [ -f $1/hpr.sql ];
then
echo "Removing temporary hpr.sql"
rm $1/hpr.sql
else
echo "No temporary hpr.sql to remove"
fi
if [ "$CURL" != "" ];
then
curl $HPR_URL --output $1/hpr.sql
echo "Downloaded hpr.sql via curl"
elif [ "$WGET" != "" ];
then
wget --directory-prefix=$1 $HPR_URL
echo "Downloaded hpr.sql via wget"
else
echo "Could not download file. Please install either curl or wget."
return 1
fi
}
#--- FUNCTION ----------------------------------------------------------------
# NAME: make_hpr_sqlite_db
# DESCRIPTION: Converts the hpr sql file into an sqlite db file
# PARAMETERS:
# RETURNS:
#-------------------------------------------------------------------------------
function make_hpr_sqlite_db {
if [[ ! -d $1 ]] || ! expr $1 : '.*/tmp.*' ;
then
echo "Please provide the temporary directory when calling this function"
return 1
fi
local MYSQL2SQLITE=`which mysql2sqlite`
local BIN_PATH=""
if [ "$MYSQL2SQLITE" = "" ];
then
if [ $# -gt 1 ] && [ -z "$2" ];
then
BIN_PATH=$2
else
BIN_PATH=`find . -type f -name "mysql2sqlite" -print | head -1`
if [ "$BIN_PATH" != "" ];
then
BIN_PATH=${BIN_PATH/mysql2sqlite//}
else
echo "Could not find mysql2sqlite script."
return 1
fi
fi
fi
echo $BIN_PATH
if [ -f $1/hpr.db ];
then
rm $1/hpr.db
fi
# Remove lines from hpr.sql that mysql2sqlite can't handle
sed '/^DELIMITER ;;/,/^DELIMITER ;/d' < $1/hpr.sql > $1/hpr-sqlite.sql
${BIN_PATH}mysql2sqlite $1/hpr-sqlite.sql | sqlite3 $1/hpr.db
echo "Created hpr.db"
}
#--- FUNCTION ----------------------------------------------------------------
# NAME: copy_to_public_dir
# DESCRIPTION: Move HPR sql and db files to public website folder
# PARAMETERS:
# RETURNS:
#-------------------------------------------------------------------------------
function copy_to_public_dir {
if [ $# -gt 1 ] && [ ! -z "$1" ] && [ ! -z "$2" ];
then
cp $1/hpr.sql $2/hpr.sql
cp $1/hpr.db $2/hpr.db
return 0
else
echo "Bad arguments. Can't copy files to public directory."
fi
}

289
utils/mysql2sqlite Executable file
View File

@@ -0,0 +1,289 @@
#!/usr/bin/awk -f
# Authors: @esperlu, @artemyk, @gkuenning, @dumblob
# FIXME detect empty input file and issue a warning
function printerr( s ){ print s | "cat >&2" }
BEGIN {
if( ARGC != 2 ){
printerr( \
"USAGE:\n"\
" mysql2sqlite dump_mysql.sql > dump_sqlite3.sql\n" \
" OR\n" \
" mysql2sqlite dump_mysql.sql | sqlite3 sqlite.db\n" \
"\n" \
"NOTES:\n" \
" Dash in filename is not supported, because dash (-) means stdin." )
no_END = 1
exit 1
}
# Find INT_MAX supported by both this AWK (usually an ISO C signed int)
# and SQlite.
# On non-8bit-based architectures, the additional bits are safely ignored.
# 8bit (lower precision should not exist)
s="127"
# "63" + 0 avoids potential parser misbehavior
if( (s + 0) "" == s ){ INT_MAX_HALF = "63" + 0 }
# 16bit
s="32767"
if( (s + 0) "" == s ){ INT_MAX_HALF = "16383" + 0 }
# 32bit
s="2147483647"
if( (s + 0) "" == s ){ INT_MAX_HALF = "1073741823" + 0 }
# 64bit (as INTEGER in SQlite3)
s="9223372036854775807"
if( (s + 0) "" == s ){ INT_MAX_HALF = "4611686018427387904" + 0 }
# # 128bit
# s="170141183460469231731687303715884105728"
# if( (s + 0) "" == s ){ INT_MAX_HALF = "85070591730234615865843651857942052864" + 0 }
# # 256bit
# s="57896044618658097711785492504343953926634992332820282019728792003956564819968"
# if( (s + 0) "" == s ){ INT_MAX_HALF = "28948022309329048855892746252171976963317496166410141009864396001978282409984" + 0 }
# # 512bit
# s="6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929093243025426876941405973284973216824503042048"
# if( (s + 0) "" == s ){ INT_MAX_HALF = "3351951982485649274893506249551461531869841455148098344430890360930441007518386744200468574541725856922507964546621512713438470702986642486608412251521024" + 0 }
# # 1024bit
# s="89884656743115795386465259539451236680898848947115328636715040578866337902750481566354238661203768010560056939935696678829394884407208311246423715319737062188883946712432742638151109800623047059726541476042502884419075341171231440736956555270413618581675255342293149119973622969239858152417678164812112068608"
# if( (s + 0) "" == s ){ INT_MAX_HALF = "44942328371557897693232629769725618340449424473557664318357520289433168951375240783177119330601884005280028469967848339414697442203604155623211857659868531094441973356216371319075554900311523529863270738021251442209537670585615720368478277635206809290837627671146574559986811484619929076208839082406056034304" + 0 }
# # higher precision probably not needed
FS=",$"
print "PRAGMA synchronous = OFF;"
print "PRAGMA journal_mode = MEMORY;"
print "BEGIN TRANSACTION;"
}
# historically 3 spaces separate non-argument local variables
function bit_to_int( str_bit, powtwo, i, res, bit, overflow ){
powtwo = 1
overflow = 0
# 011101 = 1*2^0 + 0*2^1 + 1*2^2 ...
for( i = length( str_bit ); i > 0; --i ){
bit = substr( str_bit, i, 1 )
if( overflow || ( bit == 1 && res > INT_MAX_HALF ) ){
printerr( \
NR ": WARN Bit field overflow, number truncated (LSBs saved, MSBs ignored)." )
break
}
res = res + bit * powtwo
# no warning here as it might be the last iteration
if( powtwo > INT_MAX_HALF ){ overflow = 1; continue }
powtwo = powtwo * 2
}
return res
}
# CREATE TRIGGER statements have funny commenting. Remember we are in trigger.
/^\/\*.*(CREATE.*TRIGGER|create.*trigger)/ {
gsub( /^.*(TRIGGER|trigger)/, "CREATE TRIGGER" )
print
inTrigger = 1
next
}
# The end of CREATE TRIGGER has a stray comment terminator
/(END|end) \*\/;;/ { gsub( /\*\//, "" ); print; inTrigger = 0; next }
# The rest of triggers just get passed through
inTrigger != 0 { print; next }
# CREATE VIEW looks like a TABLE in comments
/^\/\*.*(CREATE.*TABLE|create.*table)/ {
inView = 1
next
}
# end of CREATE VIEW
/^(\).*(ENGINE|engine).*\*\/;)/ {
inView = 0
next
}
# content of CREATE VIEW
inView != 0 { next }
# skip comments
/^\/\*/ { next }
# skip PARTITION statements
/^ *[(]?(PARTITION|partition) +[^ ]+/ { next }
# print all INSERT lines
( /^ *\(/ && /\) *[,;] *$/ ) || /^(INSERT|insert|REPLACE|replace)/ {
prev = ""
# first replace \\ by \_ that mysqldump never generates to deal with
# sequnces like \\n that should be translated into \n, not \<LF>.
# After we convert all escapes we replace \_ by backslashes.
gsub( /\\\\/, "\\_" )
# single quotes are escaped by another single quote
gsub( /\\'/, "''" )
gsub( /\\n/, "\n" )
gsub( /\\r/, "\r" )
gsub( /\\"/, "\"" )
gsub( /\\\032/, "\032" ) # substitute char
gsub( /\\_/, "\\" )
# sqlite3 is limited to 16 significant digits of precision
while( match( $0, /0x[0-9a-fA-F]{17}/ ) ){
hexIssue = 1
sub( /0x[0-9a-fA-F]+/, substr( $0, RSTART, RLENGTH-1 ), $0 )
}
if( hexIssue ){
printerr( \
NR ": WARN Hex number trimmed (length longer than 16 chars)." )
hexIssue = 0
}
print
next
}
# CREATE DATABASE is not supported
/^(CREATE DATABASE|create database)/ { next }
# print the CREATE line as is and capture the table name
/^(CREATE|create)/ {
if( $0 ~ /IF NOT EXISTS|if not exists/ || $0 ~ /TEMPORARY|temporary/ ){
caseIssue = 1
printerr( \
NR ": WARN Potential case sensitivity issues with table/column naming\n" \
" (see INFO at the end)." )
}
if( match( $0, /`[^`]+/ ) ){
tableName = substr( $0, RSTART+1, RLENGTH-1 )
}
aInc = 0
prev = ""
firstInTable = 1
print
next
}
# Replace `FULLTEXT KEY` (probably other `XXXXX KEY`)
/^ (FULLTEXT KEY|fulltext key)/ { gsub( /[A-Za-z ]+(KEY|key)/, " KEY" ) }
# Get rid of field lengths in KEY lines
/ (PRIMARY |primary )?(KEY|key)/ { gsub( /\([0-9]+\)/, "" ) }
aInc == 1 && /PRIMARY KEY|primary key/ { next }
# Replace COLLATE xxx_xxxx_xx statements with COLLATE BINARY
/ (COLLATE|collate) [a-z0-9_]*/ { gsub( /(COLLATE|collate) [a-z0-9_]*/, "COLLATE BINARY" ) }
# Print all fields definition lines except the `KEY` lines.
/^ / && !/^( (KEY|key)|\);)/ {
if( match( $0, /[^"`]AUTO_INCREMENT|auto_increment[^"`]/) ){
aInc = 1
gsub( /AUTO_INCREMENT|auto_increment/, "PRIMARY KEY AUTOINCREMENT" )
}
gsub( /(UNIQUE KEY|unique key) (`.*`|".*") /, "UNIQUE " )
gsub( /(CHARACTER SET|character set) [^ ]+[ ,]/, "" )
# FIXME
# CREATE TRIGGER [UpdateLastTime]
# AFTER UPDATE
# ON Package
# FOR EACH ROW
# BEGIN
# UPDATE Package SET LastUpdate = CURRENT_TIMESTAMP WHERE ActionId = old.ActionId;
# END
gsub( /(ON|on) (UPDATE|update) (CURRENT_TIMESTAMP|current_timestamp)(\(\))?/, "" )
gsub( /(DEFAULT|default) (CURRENT_TIMESTAMP|current_timestamp)(\(\))?/, "DEFAULT current_timestamp")
gsub( /(COLLATE|collate) [^ ]+ /, "" )
gsub( /(ENUM|enum)[^)]+\)/, "text " )
gsub( /(SET|set)\([^)]+\)/, "text " )
gsub( /UNSIGNED|unsigned/, "" )
gsub( /_utf8mb3/, "" )
gsub( /` [^ ]*(INT|int|BIT|bit)[^ ]*/, "` integer" )
gsub( /" [^ ]*(INT|int|BIT|bit)[^ ]*/, "\" integer" )
ere_bit_field = "[bB]'[10]+'"
if( match($0, ere_bit_field) ){
sub( ere_bit_field, bit_to_int( substr( $0, RSTART +2, RLENGTH -2 -1 ) ) )
}
# remove USING BTREE and other suffixes for USING, for example: "UNIQUE KEY
# `hostname_domain` (`hostname`,`domain`) USING BTREE,"
gsub( / USING [^, ]+/, "" )
# field comments are not supported
gsub( / (COMMENT|comment).+$/, "" )
# Get commas off end of line
gsub( /,.?$/, "" )
if( prev ){
if( firstInTable ){
print prev
firstInTable = 0
}
else {
print "," prev
}
}
else {
# FIXME check if this is correct in all cases
if( match( $1,
/(CONSTRAINT|constraint) ["].*["] (FOREIGN KEY|foreign key)/ ) ){
print ","
}
}
prev = $1
}
/ ENGINE| engine/ {
if( prev ){
if( firstInTable ){
print prev
firstInTable = 0
}
else {
print "," prev
}
}
prev=""
print ");"
next
}
# `KEY` lines are extracted from the `CREATE` block and stored in array for later print
# in a separate `CREATE KEY` command. The index name is prefixed by the table name to
# avoid a sqlite error for duplicate index name.
/^( (KEY|key)|\);)/ {
if( prev ){
if( firstInTable ){
print prev
firstInTable = 0
}
else {
print "," prev
}
}
prev = ""
if( $0 == ");" ){
print
}
else {
if( match( $0, /`[^`]+/ ) ){
indexName = substr( $0, RSTART+1, RLENGTH-1 )
}
if( match( $0, /\([^()]+/ ) ){
indexKey = substr( $0, RSTART+1, RLENGTH-1 )
}
# idx_ prefix to avoid name clashes (they really happen!)
key[tableName] = key[tableName] "CREATE INDEX \"idx_" \
tableName "_" indexName "\" ON \"" tableName "\" (" indexKey ");\n"
}
}
END {
if( no_END ){ exit 1}
# print all KEY creation lines.
for( table in key ){ printf key[table] }
print "END TRANSACTION;"
if( caseIssue ){
printerr( \
"INFO Pure sqlite identifiers are case insensitive (even if quoted\n" \
" or if ASCII) and doesnt cross-check TABLE and TEMPORARY TABLE\n" \
" identifiers. Thus expect errors like \"table T has no column named F\".")
}
}

54
utils/update-hpr-db.sh Executable file
View File

@@ -0,0 +1,54 @@
#!/bin/bash -
#===============================================================================
#
# FILE: update-hpr-db.sh
#
# USAGE: ./update-hpr-db.sh
#
# DESCRIPTION: Download MySQL hpr.sql file and create SQLite3 file
#
# OPTIONS: ---
# REQUIREMENTS: lib_utils.sh
# BUGS: ---
# NOTES: ---
# AUTHOR: Roan "Rho`n" Horning (roan.horning@gmail.com)
# ORGANIZATION:
# CREATED: 03/05/2023 07:21:29 PM
# REVISION: ---
# LICENSE: GNU AGPLv3
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
#===============================================================================
set -o nounset # Treat unset variables as an error
BASEDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
#
# Load library functions
#
LIB="$BASEDIR/lib_utils.sh"
[ -e $LIB ] || { echo "Unable to load functions.\n$LIB not found."; exit; }
source $LIB
WORKING_DIR=`make_working_dir`
download_hpr_sql $WORKING_DIR
make_hpr_sqlite_db $WORKING_DIR
copy_to_public_dir $WORKING_DIR `pwd`
clean_working_dir $WORKING_DIR

72
utils/update-hpr.sh Executable file
View File

@@ -0,0 +1,72 @@
#!/bin/bash -
#===============================================================================
#
# FILE: update-hpr.sh
#
# USAGE: ./update-hpr.sh
#
# DESCRIPTION: Script to update local statically generated HPR website
#
# OPTIONS: ---
# REQUIREMENTS: lib_utils.sh
# BUGS: ---
# NOTES: ---
# AUTHOR: Roan "Rho`n" Horning (roan.horning@gmail.com),
# ORGANIZATION:
# CREATED: 03/03/2023 09:26:29 PM
# REVISION: ---
# LICENSE: GNU AGPLv3
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
#===============================================================================
set -o nounset # Treat unset variables as an error
BASEDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
#
# Load library functions
#
LIB="$BASEDIR/lib_utils.sh"
[ -e $LIB ] || { echo "Unable to load functions.\n$LIB not found."; exit; }
source $LIB
WORKING_DIR=`make_working_dir`
download_hpr_sql $WORKING_DIR
make_hpr_sqlite_db $WORKING_DIR
copy_to_public_dir $WORKING_DIR `pwd`
mv hpr.sql public_html/
echo "Update static HTML files"
# Clean up previously generated files
rm -rf public_html/*.html public_html/correspondents public_html/eps public_html/series
git restore public_html/will-my-show-be-of-interest-to-hackers.html
# stash changes to configuration file to preserve DB settings
git stash
git pull
git stash pop
./site-generator --quiet --all
clean_working_dir $WORKING_DIR