Moved wiki files to an empty local repo
parent
f3328b9f12
commit
4861c5c1d9
132
Comment-System.md
Normal file
132
Comment-System.md
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
# Comment System
|
||||||
|
|
||||||
|
The current comment system (2023-02-24) was written from scratch by HPR
|
||||||
|
volunteers. It replaced a proprietary (and rather unsatisfactory) system.
|
||||||
|
|
||||||
|
It has been in use since 2017, has proved reliable and has needed very
|
||||||
|
little maintenance.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
There are three main components of the system:
|
||||||
|
1. A database table called `comments` which holds each comment with its
|
||||||
|
metadata.
|
||||||
|
2. PHP code which takes in each comment from the comment form (available on
|
||||||
|
every show page) and converts it to a JSON format which is available to
|
||||||
|
authorised people on the website and is emailed to the `admin` list and to
|
||||||
|
`comments@hackerpublicradio.org`.
|
||||||
|
3. The scripts stored in the `Comment_system` directory on the Gitea repo.
|
||||||
|
These are capable of decoding the email or or taking the JSON files and
|
||||||
|
offering them for approval. If approved the comment is added to the
|
||||||
|
database, otherwise it is not added. The incoming file is stored for future
|
||||||
|
access if needed. The scripts communicate the decision to the PHP code on
|
||||||
|
the server and the intermediate files are cleaned up there.
|
||||||
|
|
||||||
|
## Database
|
||||||
|
|
||||||
|
The `comments` table has the following structure:
|
||||||
|
```
|
||||||
|
+---------------------+----------+------+-----+---------------------+----------------+
|
||||||
|
| Field | Type | Null | Key | Default | Extra |
|
||||||
|
+---------------------+----------+------+-----+---------------------+----------------+
|
||||||
|
| id | int(5) | NO | PRI | NULL | auto_increment |
|
||||||
|
| eps_id | int(5) | NO | MUL | NULL | |
|
||||||
|
| comment_timestamp | datetime | NO | | NULL | |
|
||||||
|
| comment_author_name | text | YES | | NULL | |
|
||||||
|
| comment_title | text | YES | | NULL | |
|
||||||
|
| comment_text | text | YES | | NULL | |
|
||||||
|
| last_changed | datetime | NO | | current_timestamp() | |
|
||||||
|
+---------------------+----------+------+-----+---------------------+----------------+
|
||||||
|
```
|
||||||
|
|
||||||
|
- `id` is an incrementing primary key
|
||||||
|
- `eps_id` is the primary key (show number) of the `eps` table to which the comment is linked
|
||||||
|
- `comment_timestamp` contains the time that the comment was submitted
|
||||||
|
- `comment_author_name` holds the name of the comment author as submitted (there are no checks against know hosts)
|
||||||
|
- `comment_title` holds the title submitted by the comment author
|
||||||
|
- `comment_text` contains the body of the comment
|
||||||
|
- `last_changed` contains the timestamp of the last change made to the comment (this is managed by a trigger called `before_comments_update`)
|
||||||
|
|
||||||
|
**Note** It's possible to edit a comment in the database. There is a command-line tool under the [Database](Database) directory which enables this,
|
||||||
|
using Vim as the editor. It's not documented at the moment.
|
||||||
|
|
||||||
|
## Server code
|
||||||
|
|
||||||
|
TBA
|
||||||
|
|
||||||
|
## Local processing
|
||||||
|
|
||||||
|
The management of comments was designed to be a local command-line process using a Perl script. A connection with the HPR database is needed and this
|
||||||
|
is achieved using an SSH tunnel. The `Pdmenu` menu system is used used to streamline things, but that's just a personal preference (though the
|
||||||
|
`.pdmenurc` menu definition file can be made available if required).
|
||||||
|
|
||||||
|
### Modes of working
|
||||||
|
|
||||||
|
There are two modes of working:
|
||||||
|
|
||||||
|
- An email is sent to `comments@hackerpublicradio.org` (a limited distribution address list). The email contains a JSON attachment with the comment
|
||||||
|
details.
|
||||||
|
- A copy of the JSON attachment file is stored in the directory `~hpr/comments` on the main server.
|
||||||
|
|
||||||
|
A single script called `process_comments` can handle the two modes. It expects two spool areas, one for email messages and the other for JSON files.
|
||||||
|
|
||||||
|
Email messages are written to the spool area (`CommentDrop`) by the Thunderbird MUA which has the ability to make message copies using a plugin. (More
|
||||||
|
details to follow.)
|
||||||
|
```
|
||||||
|
/home/cendjm/HPR/CommentDrop/
|
||||||
|
├── banned
|
||||||
|
├── processed
|
||||||
|
└── rejected
|
||||||
|
```
|
||||||
|
The sub-directories are where `process_comments` places the messages after processing (explained later).
|
||||||
|
|
||||||
|
JSON files are copied from the `comments` directory on the server into the JSON spool area (imaginatively) called `json`:
|
||||||
|
```
|
||||||
|
json
|
||||||
|
├── banned
|
||||||
|
├── processed
|
||||||
|
└── rejected
|
||||||
|
```
|
||||||
|
The sub-directories are used for the same purpose as in `CommentDrop` (explained later).
|
||||||
|
|
||||||
|
The JSON mode is only used when there are mail problems. The files are collected using `Pdmenu` which uses `scp` to achieve this.
|
||||||
|
|
||||||
|
**NOTE** These spool directory locations are "baked into" the `process_comments` script and should be in a configuration file.
|
||||||
|
|
||||||
|
### The `process_comments` script
|
||||||
|
|
||||||
|
This a Perl script which contains internal documentation (in POD format). Information about how to run the script can be obtained with the `-help`
|
||||||
|
option, or the full documentation can be viewed with the option `-doc`. A copy of the internal documentation is available in manual page format by
|
||||||
|
following [this documentation link](process_comments).
|
||||||
|
|
||||||
|
TBA
|
||||||
|
|
||||||
|
**NOTE** The script documentation is in need of updates.
|
||||||
|
|
||||||
|
### Screenshots
|
||||||
|
|
||||||
|
- Image 1:
|
||||||
|
- Running `process_comments` with three comments in the mail spool area. This example uses the `-verbose` option so a report of what messages have
|
||||||
|
been found is produced. The files have strange names generated from the mail subject, courtesy of the Thunderbird plugin.
|
||||||
|
- The first comment is offered for approval using a template to display the contents of the JSON attachment
|
||||||
|
- The options are `approve`, `ban`, `reject` and `ignore`. In this case choice `a` is selected to approve this comment.
|
||||||
|
|
||||||
|
![Image 1](images/process_comments_1.png)
|
||||||
|
|
||||||
|
- Image 2:
|
||||||
|
- All three comments have been processed, with each one being approved. The script actions the choices at the end.
|
||||||
|
- The (`-verbose`) output lists the comments being added to the database (attached to the relevant shows).
|
||||||
|
- Each mail message is moved to the `processed` sub-directory.
|
||||||
|
- The script communicates with the server requesting the deletion of the original JSON files, and the success return (`200/OK`) shows that this
|
||||||
|
has been completed.
|
||||||
|
|
||||||
|
![Image 2](images/process_comments_2.png)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
Back to [Home](Home) page
|
||||||
|
|
||||||
|
<!--
|
||||||
|
vim: syntax=markdown:ts=8:sw=4:ai:et:tw=150:fo=tcqn:fdm=marker
|
||||||
|
-->
|
109
Community-News.md
Normal file
109
Community-News.md
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
# Community News
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This directory contains various tools for managing the Community News shows:
|
||||||
|
|
||||||
|
- reserving Community News slots ahead of time
|
||||||
|
- making email to announce the upcoming Community News show recording
|
||||||
|
- managing the iCal calendar with Community News reservations in it
|
||||||
|
- making the show notes for the Community News shows (used for the recording and saved in the database)
|
||||||
|
|
||||||
|
## Functions
|
||||||
|
|
||||||
|
### Reserving Community News slots
|
||||||
|
|
||||||
|
The script used is called `reserve_cnews` and is capable of reserving a number of shows from a given date.
|
||||||
|
|
||||||
|
A copy of the internal documentation for this script (available through the `-help` option) is available in manual page format by following [this
|
||||||
|
documentation link](reserve_cnews).
|
||||||
|
|
||||||
|
#### Usage summary
|
||||||
|
|
||||||
|
```
|
||||||
|
$HOME/HPR/Community_News/reserve_cnews -config=$HOME/HPR/.hpr_livedb.cfg -from -count=1
|
||||||
|
```
|
||||||
|
The script is normally run with the live database configuration file, so the tunnel to the server must be open. The `-from` option can be used without
|
||||||
|
the date part which causes the script to find the reservation with the latest date and add more reservations beyond it. It is advised to use
|
||||||
|
`-count=1` because the default behaviour is to add 12 reservations which may be excessive.
|
||||||
|
|
||||||
|
At the time of writing (2023-04-10) 12 reservations are maintained, with one being added each month. This is done to help ensure hosts posting shows
|
||||||
|
into the future are less likely to clash with the first Monday of each month.
|
||||||
|
|
||||||
|
### Announcing the next Community News show
|
||||||
|
|
||||||
|
This function is managed by the script called `make_email`.
|
||||||
|
|
||||||
|
This script was written in 2013 with the intention that it would send out email to the *HPR* mailing list. This functionality was never implemented,
|
||||||
|
though it could probably be made to work now. The script has always been used to write the email to a file which is then copied into a message in an
|
||||||
|
email client and sent to this list.
|
||||||
|
|
||||||
|
A copy of the internal documentation for this script (available through the `-documentation` option) is available in manual page format by following
|
||||||
|
[this documentation link](make_email).
|
||||||
|
|
||||||
|
#### Usage summary
|
||||||
|
|
||||||
|
```
|
||||||
|
> $HOME/HPR/Community_News/mailer.testfile # Empty the default file
|
||||||
|
$HOME/HPR/Community_News/make_email -dbconf=$HOME/HPR/.hpr_livedb.cfg
|
||||||
|
xclip -i $HOME/HPR/Community_News/mailer.testfile
|
||||||
|
```
|
||||||
|
The first line empties the file `mailer.testfile` in the working directory (where the script exists). The `make_email` script is then run with the
|
||||||
|
live database configuration file (so the tunnel must be open) and every other option left in its default state. The `xclip` command can be used to
|
||||||
|
place the file in the clipboard so it can be pasted into the email.
|
||||||
|
|
||||||
|
### Refreshing the iCal calendar
|
||||||
|
|
||||||
|
TBA
|
||||||
|
|
||||||
|
### Community News show notes
|
||||||
|
|
||||||
|
The notes for the Community News shows released every month are built with a script, a `TT²` template and various files for inclusion.
|
||||||
|
|
||||||
|
#### `make_shownotes`
|
||||||
|
|
||||||
|
This is the main script and is written in Perl. It accesses the MySQL/MariaDB database to gather show, host and comment information. It writes the
|
||||||
|
notes for the selected show to the database. It needs the SSH tunnel to be set up before being run and to use this it requires the configuration file
|
||||||
|
set up for this purpose.
|
||||||
|
|
||||||
|
It's possible to select the required template but the default name used by the script is `shownote_template.tpl`. For convenience this is a symbolic
|
||||||
|
link to another file, and at the moment the target file is `shownote_template11.tpl`. Thus allowing the script to default the template name means the
|
||||||
|
latest version is used. This template generates HTML and embeds some CSS definitions that affect the layout of the notes.
|
||||||
|
|
||||||
|
TBA
|
||||||
|
|
||||||
|
A copy of the internal documentation for this script is available in manual page format by following [this documentation link](make_shownotes).
|
||||||
|
|
||||||
|
**NOTE** The script documentation is in need of updates.
|
||||||
|
|
||||||
|
<!--
|
||||||
|
aob_template.mkd_
|
||||||
|
build_AOB*
|
||||||
|
comments_only.tpl
|
||||||
|
mailnote_template2.tpl
|
||||||
|
mailnote_template.tpl
|
||||||
|
make_email*
|
||||||
|
make_meeting*
|
||||||
|
# make_shownotes*
|
||||||
|
reserve_cnews*
|
||||||
|
# shownote_template10.tpl
|
||||||
|
# shownote_template11.tpl
|
||||||
|
# shownote_template2.tpl
|
||||||
|
# shownote_template3.tpl
|
||||||
|
# shownote_template4.tpl
|
||||||
|
# shownote_template5.tpl
|
||||||
|
# shownote_template6.tpl
|
||||||
|
# shownote_template7.tpl
|
||||||
|
# shownote_template8.tpl
|
||||||
|
# shownote_template9.tpl
|
||||||
|
# shownote_template.tpl@
|
||||||
|
summarise_mail*
|
||||||
|
tag_contributors.tpl
|
||||||
|
-->
|
||||||
|
|
||||||
|
---
|
||||||
|
Back to [Home](Home) page
|
||||||
|
|
||||||
|
<!--
|
||||||
|
vim: syntax=markdown:ts=8:sw=4:ai:et:tw=150:fo=tcqn:fdm=marker
|
||||||
|
-->
|
23
Database.md
Normal file
23
Database.md
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# Database
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This directory contains tools for making a local snapshot of the MySQL/MariaDB database (used for testing and development), and for making database
|
||||||
|
edits from the command line on a remote system.
|
||||||
|
|
||||||
|
## Tools
|
||||||
|
|
||||||
|
### Database snapshots
|
||||||
|
|
||||||
|
TBA
|
||||||
|
|
||||||
|
### Database editing
|
||||||
|
|
||||||
|
TBA
|
||||||
|
|
||||||
|
---
|
||||||
|
Back to [Home](Home) page
|
||||||
|
|
||||||
|
<!--
|
||||||
|
vim: syntax=markdown:ts=8:sw=4:ai:et:tw=150:fo=tcqn:fdm=marker
|
||||||
|
-->
|
17
FAQ.md
Normal file
17
FAQ.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# FAQ
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This is a test document implementing the idea of a list of questions and answers of the sort often encountered on HPR. The idea was to place them in a
|
||||||
|
searchable document (perhaps using CSS to allow the answers to revealed on demand). The reasoning was that finding answers to questions was often
|
||||||
|
difficult; this page would provide links to the definitive answers, each with some sort of preamble.
|
||||||
|
|
||||||
|
A draft document was produced in 2021 but the idea was not seen as desirable. The work undertaken to produce this document was retained in case it
|
||||||
|
ever became of interest in the future.
|
||||||
|
|
||||||
|
---
|
||||||
|
Back to [Home](Home) page
|
||||||
|
|
||||||
|
<!--
|
||||||
|
vim: syntax=markdown:ts=8:sw=4:ai:et:tw=150:fo=tcqn:fdm=marker
|
||||||
|
-->
|
60
HPR_collection_URLs
Normal file
60
HPR_collection_URLs
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0001-Ep0010
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0011-Ep0020
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0041-Ep0050
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0051-Ep0060
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0061-Ep0070
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0071-Ep0080
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0081-Ep0090
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0091-Ep0100
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0101-Ep0110
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0111-Ep0120
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0121-Ep0130
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0131-Ep0140
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0141-Ep0150
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0151-Ep0160
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0161-Ep0170
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0171-Ep0180
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0181-Ep0190
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0191-Ep0200
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0201-Ep0210
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0211-Ep0220
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0221-Ep0230
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0231-Ep0240
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0241-Ep0250
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0251-Ep0260
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0261-Ep0270
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0271-Ep0280
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0281-Ep0290
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0291-Ep0300
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0301-Ep0310
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0311-Ep0320
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0321-Ep0330
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0331-Ep0340
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0341-Ep0350
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0351-Ep0360
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0361-Ep0370
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0371-Ep0380
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0381-Ep0390
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0391-Ep0400
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0401-Ep0410
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0411-Ep0420
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0421-Ep0430
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0431-Ep0440
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0441-Ep0450
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0451-Ep0460
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0461-Ep0470
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0471-Ep0480
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0481-Ep0490
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0491-Ep0500
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0501-Ep0510
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0511-Ep0520
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0521-Ep0530
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0531-Ep0540
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0541-Ep0550
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0551-Ep0560
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0561-Ep0570
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0571-Ep0580
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0581-Ep0590
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0591-Ep0600
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0601-Ep0610
|
||||||
|
https://archive.org/details/Hackerpublicradio.org-archiveEp0611-Ep0620
|
93
Home.md
93
Home.md
@ -1 +1,92 @@
|
|||||||
Welcome to the Wiki.
|
# Home page for hpr-admin wiki
|
||||||
|
|
||||||
|
This is a central place for notes about tools in the hpr-admin repository on Gitea
|
||||||
|
|
||||||
|
## List of projects under this heading:
|
||||||
|
|
||||||
|
This is a list of the directories in this repository, with some explanation of
|
||||||
|
what each one contains. This list is intended to link to much more detailed
|
||||||
|
information about the directory contents on this Wiki.
|
||||||
|
|
||||||
|
- [Comment_system](Comment-System):
|
||||||
|
- Two components:
|
||||||
|
- The PHP side which takes in each comment from the form (available on
|
||||||
|
every show page) and converts it to a JSON format which is available
|
||||||
|
to authorised people on the website and is emailed to the `admin`
|
||||||
|
list.
|
||||||
|
- The scripts stored in this directory on the Gitea repo. These are
|
||||||
|
capable of decoding the email or or taking the JSON files and
|
||||||
|
offering them for approval. If approved the comment is added to the
|
||||||
|
database, otherwise it is not added. The incoming file is stored for
|
||||||
|
future access if needed. The scripts communicate the decision to the
|
||||||
|
PHP code on the server and the intermediate files are cleaned up
|
||||||
|
there.
|
||||||
|
|
||||||
|
- [Community_News](Community-News):
|
||||||
|
- Various tools for reserving Community News slots ahead of time, making
|
||||||
|
the show notes for the Community News shows (used for the recording).
|
||||||
|
|
||||||
|
- [Database](Database):
|
||||||
|
- Tools for making a local snapshot of the MySQL/MariaDB database (used
|
||||||
|
for testing and development), and for making database edits from the
|
||||||
|
command line on a remote system.
|
||||||
|
|
||||||
|
- [FAQ](FAQ):
|
||||||
|
- Test document implementing the idea of a list of questions and answers
|
||||||
|
of the sort often encountered on HPR. The idea was to place them in a
|
||||||
|
searchable document (perhaps using CSS to allow the answers to revealed
|
||||||
|
on demand). The reasoning was that finding answers to questions was
|
||||||
|
often difficult; this page would provide links to the definitive
|
||||||
|
answers, each with some sort of preamble.
|
||||||
|
- The idea was not seen as desirable.
|
||||||
|
|
||||||
|
- hpr-website:
|
||||||
|
- A very old snapshot of the HPR site. Last updated in 2020 apparently.
|
||||||
|
It's not clear whether an equivalent exists elsewhere.
|
||||||
|
|
||||||
|
- [InternetArchive](Internet-Archive):
|
||||||
|
- Tools for uploading HPR shows to the Internet Archive (IA).
|
||||||
|
|
||||||
|
- Link_Checker:
|
||||||
|
- Rudiments of a project to scan HPR shows looking for links which have
|
||||||
|
vanished. The intention was to identify these and attempt to find the
|
||||||
|
latest copies on the *Wayback Machine* and replace the faulty URLs with
|
||||||
|
links to the saved copies.
|
||||||
|
|
||||||
|
- PostgreSQL_Database:
|
||||||
|
- Work was done to design and build an alternative database to the
|
||||||
|
MySQL/MariaDB version incorporating improvements to the database design
|
||||||
|
(one-to-many and many-to-many linkages for hosts and shows, tags and
|
||||||
|
shows, etc), and to make use of the advanced features offered by
|
||||||
|
PostgreSQL.
|
||||||
|
- Abandoned because of:
|
||||||
|
- Problems finding a hosting site for this database system
|
||||||
|
- Concern that maintenance of a complex database like the one
|
||||||
|
envisaged would be difficult given the lack of DBA experience
|
||||||
|
amongst the volunteers.
|
||||||
|
|
||||||
|
- Show_Submission:
|
||||||
|
- Tools for processing new shows arriving via the submission form.
|
||||||
|
- Brief overview:
|
||||||
|
- Shows arrive from the form as JSON data, audio file(s) and assets of
|
||||||
|
various sorts
|
||||||
|
- The note formats accepted are many, form plain text, through various
|
||||||
|
markup formats to HTML5.
|
||||||
|
- The tools here assist with the processing of the notes by making a
|
||||||
|
local copy of the JSON data and any assets (not usually the audio).
|
||||||
|
The notes are assembled locally and the end product - an HTML
|
||||||
|
fragment for addition to the database, and any assets like pictures
|
||||||
|
and scripts, are sent to the server.
|
||||||
|
- The final stages of audio preparation and posting of the complete
|
||||||
|
show are performed elsewhere.
|
||||||
|
|
||||||
|
|
||||||
|
## Miscellaneous
|
||||||
|
|
||||||
|
### To be incorporated into the above structure at some point
|
||||||
|
|
||||||
|
- [Working with the Internet Archive](Working-with-the-Internet-Archive)
|
||||||
|
|
||||||
|
<!--
|
||||||
|
vim: syntax=markdown:ts=8:sw=4:ai:et:tw=150:fo=tcqn:fdm=marker
|
||||||
|
-->
|
||||||
|
233
How-To-Do-Stuff.md
Normal file
233
How-To-Do-Stuff.md
Normal file
@ -0,0 +1,233 @@
|
|||||||
|
# How To Do Stuff
|
||||||
|
|
||||||
|
This is the TLDR part of the documentation
|
||||||
|
|
||||||
|
## Upload future shows to the IA
|
||||||
|
|
||||||
|
This task uses `future_upload`. It is best run in the morning in the UK/Europe
|
||||||
|
time zones since the IA servers are based on the west coast of the USA and it
|
||||||
|
will be the early hours of the morning there.
|
||||||
|
|
||||||
|
Sometimes the servers can be overloaded and attempts to upload will be met
|
||||||
|
with error messages and the uploader will retry. It is possible to check
|
||||||
|
whether an overload is likely by running the `ia` command, and this will be
|
||||||
|
added later.
|
||||||
|
|
||||||
|
Run the command:
|
||||||
|
```
|
||||||
|
./future_upload -d0
|
||||||
|
```
|
||||||
|
|
||||||
|
A lot of output will be generated because `make_metadata` is run in `verbose`
|
||||||
|
mode, and the `ia` command run to perform the uploads is naturally quite
|
||||||
|
verbose.
|
||||||
|
|
||||||
|
This script is documented elsewhere, but in brief, it does the following:
|
||||||
|
|
||||||
|
- Looks for all audio files in the holding area (`/data/IA/uploads`). These
|
||||||
|
will be called `hprDDDD.type` where `DDDD` is a four-digit number, and
|
||||||
|
`type` is an audio type such as `mp3` and `ogg`.
|
||||||
|
- Any shows found this way are checked to see if they are on the IA, and if
|
||||||
|
not they are queued for processing.
|
||||||
|
- Once the holding area has been scanned the queued shows are uploaded:
|
||||||
|
- Metadata is generated in the form of a CSV file by `make_metadata` with
|
||||||
|
instructions for uploading the show notes and audio files.
|
||||||
|
- A Bash script file is generated by `make_metadata` which contains
|
||||||
|
commands to upload non-audio files - if there are any.
|
||||||
|
- The CSV is fed to the `ia upload` command.
|
||||||
|
- The Bash script (if any) is run.
|
||||||
|
- It can take a few minutes to possibly hours for the shows to be fully loaded
|
||||||
|
and accessible on `archive.org`.
|
||||||
|
|
||||||
|
## Check the status of an upload
|
||||||
|
|
||||||
|
Once the upload has finished as far as the various scripts (like
|
||||||
|
`future_upload`) are concerned the IA software takes over on the various
|
||||||
|
servers. If you have the required authorisation (being an administrator of the
|
||||||
|
`HackerPublicRadio` collection) then it's possible to use the web page for a
|
||||||
|
given show to determine if all the IA tasks are complete.
|
||||||
|
|
||||||
|
Here is an example of what can be seen when the `History` link is activated:
|
||||||
|
|
||||||
|
![History for show hpr1462](images/IA_history_hpr1462.png)
|
||||||
|
|
||||||
|
## Refresh the show notes on the IA
|
||||||
|
|
||||||
|
If the notes in the database are changed on the HPR server it's necessary to
|
||||||
|
propagate the changes to the IA. At present this is done the *hard way* by
|
||||||
|
running `make_metadata` and then running `ia`.
|
||||||
|
|
||||||
|
When running `make_metadata` the mode chosen is just to generate the metadata
|
||||||
|
without downloading files for upload. The example below shows this being done
|
||||||
|
to correct the notes for show 3523. Note that the CSV file created is called
|
||||||
|
`metadata_3523.csv`.
|
||||||
|
|
||||||
|
The `ia` command just updates the IA metadata. It uses the bulk mode and reads
|
||||||
|
the CSV file created above, specified with `--spreadsheet` option.
|
||||||
|
|
||||||
|
What the warning messages returned by `ia` mean is unknown. These are not
|
||||||
|
always shown and the process always seems to work quite reliably.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ./make_metadata -from=3523 -out -meta -noassets
|
||||||
|
Output file: metadata_3523.csv
|
||||||
|
$ ia metadata --spreadsheet=metadata_3523.csv
|
||||||
|
hpr3523 - success: https://catalogd.archive.org/log/3114823140
|
||||||
|
hpr3523 - warning (400): no changes to _meta.xml
|
||||||
|
hpr3523 - warning (400): no changes to _meta.xml
|
||||||
|
hpr3523 - warning (400): no changes to _meta.xml
|
||||||
|
hpr3523 - warning (400): no changes to _meta.xml
|
||||||
|
hpr3523 - warning (400): no changes to _meta.xml
|
||||||
|
```
|
||||||
|
|
||||||
|
The `-noassets` option is important in case the item in question contains
|
||||||
|
*assets* - supplementary files such as photographs and examples. Without this
|
||||||
|
`make_metadata` will download any assets that there may be.
|
||||||
|
|
||||||
|
The `-out` option causes output to be written to a file where the name if
|
||||||
|
generated by the script. The `-meta` option means *metadata only* since we are
|
||||||
|
only changing metadata here.
|
||||||
|
|
||||||
|
To update multiple shows do as the following example which adds missing notes
|
||||||
|
to shows 3555 and 3568 (added on 2022-04-18):
|
||||||
|
```
|
||||||
|
$ ./make_metadata -list=3555,3568 -out -meta -noassets
|
||||||
|
Output file: metadata_3555-3568.csv
|
||||||
|
$ metadata=metadata_3555-3568.csv
|
||||||
|
$ ia metadata --spreadsheet=$metadata
|
||||||
|
hpr3555 - success: https://catalogd.archive.org/log/3231074147
|
||||||
|
hpr3568 - success: https://catalogd.archive.org/log/3231074213
|
||||||
|
```
|
||||||
|
|
||||||
|
## Delete a show from the IA
|
||||||
|
|
||||||
|
This occurs when a show needs to be removed from the HPR system and the IA.
|
||||||
|
Examples in the past have been:
|
||||||
|
|
||||||
|
- failure to get approval from a person or organisation to release the
|
||||||
|
content - perhaps delayed realisation that this is needed.
|
||||||
|
- show content that generates complaints or which might be legally dubious or
|
||||||
|
outright illegal.
|
||||||
|
|
||||||
|
The process described here is not true deletion, since when an IA identifier
|
||||||
|
(show in our case) has been created it cannot be deleted - except by IA
|
||||||
|
Administrators, who are usually very reluctant to do it.
|
||||||
|
|
||||||
|
What is done to the IA item is that it has all files removed and all of the
|
||||||
|
metadata is either removed or replaced by `Reserved`.
|
||||||
|
|
||||||
|
A script has been written to assist with this called `delete_ia_item` which
|
||||||
|
takes the episode identifier as an argument. By default it runs in *dry-run*
|
||||||
|
mode where no changes are made. The script checks that the item actually
|
||||||
|
exists on the IA, then it either reports what commands it will run (in
|
||||||
|
*dry-run* mode) or it performs the commands.
|
||||||
|
|
||||||
|
As of 2022-05-09 the live mode does not actually perform the commands, it
|
||||||
|
simply echoes them. This is because the script has not yet been fully tested
|
||||||
|
in a live situation. Once that has been done the commands will be made active.
|
||||||
|
|
||||||
|
The commands issued use the `ia` tool described elsewhere in the Wiki. It uses
|
||||||
|
`ia delete` to remove all the files then calls `ia metadata` a number of times
|
||||||
|
to change or remove metadata fields. In some cases the removal needs to know
|
||||||
|
what values to remove, so `ia metadata` is used to write all of the metadata
|
||||||
|
to a temporary file and the `jq` tool is used to parse out the required
|
||||||
|
values.
|
||||||
|
|
||||||
|
### TBA
|
||||||
|
|
||||||
|
- There is a way of hiding items on the IA, which it seems that an
|
||||||
|
administrator of a collection can implement. Not clear about this but it
|
||||||
|
warrants investigation.
|
||||||
|
|
||||||
|
## Deal with shows that are in the wrong collection
|
||||||
|
|
||||||
|
When a show is uploaded to the IA it should be assigned to the collection
|
||||||
|
called `'hackerpublicradio'`. Very rarely, it will be assigned to the default
|
||||||
|
collections: `'Community Audio'` and `'Community Collections'`, possibly
|
||||||
|
because the metadata (which specifies the collection) is faulty or isn't read
|
||||||
|
properly. This error has been quite rare over the history of uploading shows.
|
||||||
|
|
||||||
|
It was discovered on 2022-06-15 that show 2234 was in the wrong collections.
|
||||||
|
Tests were performed to see if any other shows had been wrongly assigned
|
||||||
|
without being noticed.
|
||||||
|
|
||||||
|
In case it ever happens again, here are the steps which were performed:
|
||||||
|
|
||||||
|
1. All of the identifiers in the `'hackerpublicradio'` collection were
|
||||||
|
downloaded with the command:\
|
||||||
|
`ia search "collection:hackerpublicradio" -f identifier -s 'identifier asc' > hackerpublicradio_collection.json`
|
||||||
|
|
||||||
|
1. This generates a file with JSON objects that look like:\
|
||||||
|
`{"identifier": "hpr3630"}`\
|
||||||
|
The list also contains the batches of shows uploaded before 2014.
|
||||||
|
|
||||||
|
1. An AWK script was written to find any gaps. The script is called
|
||||||
|
`check_IA_identifiers.awk`. See below for the script and how it was run.
|
||||||
|
|
||||||
|
1. The script was run against the JSON file, which had been filtered with `jq`
|
||||||
|
and it showed that the only missing show was 2243.
|
||||||
|
|
||||||
|
### AWK script `check_IA_identifiers.awk`
|
||||||
|
|
||||||
|
```awk
|
||||||
|
# check_IA_identifiers.awk, Dave Morriss, 2022-06-15
|
||||||
|
#
|
||||||
|
# Collect all 'hprxxxx' show identifiers into a hash
|
||||||
|
#
|
||||||
|
/^hpr/{
|
||||||
|
id[$1] = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Post process the hash. The range is 1..3630 because that's the minimum and
|
||||||
|
# maximum show numbers as of 2022-06-15
|
||||||
|
#
|
||||||
|
END{
|
||||||
|
min = 1
|
||||||
|
max = 3630
|
||||||
|
|
||||||
|
#
|
||||||
|
# Make a x loop counting from min to max
|
||||||
|
#
|
||||||
|
for (i = min; i <= max; i++) {
|
||||||
|
#
|
||||||
|
# Make an HPR show identifier
|
||||||
|
#
|
||||||
|
show = sprintf("hpr%04d",i)
|
||||||
|
|
||||||
|
#
|
||||||
|
# If the id is not in the hash report it. Note you can't do "(show not
|
||||||
|
# in id)" or "!(show in id)", which seems an AWK shortcoming.
|
||||||
|
#
|
||||||
|
if (show in id == 0) {
|
||||||
|
printf ">> %s\n",show
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# vim: syntax=awk:ts=8:sw=4:ai:et:tw=78:
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### Running the script `check_IA_identifiers.awk`
|
||||||
|
|
||||||
|
The way to run this is as follows:
|
||||||
|
```
|
||||||
|
$ awk -f check_IA_identifiers.awk < <(jq -r .identifier hackerpublicradio_collection.json | grep -E 'hpr[0-9]{4}')
|
||||||
|
>> hpr2243
|
||||||
|
```
|
||||||
|
|
||||||
|
The `jq` filter (in raw mode `-r`) outputs the value of the `identifier` key.
|
||||||
|
The `grep` excludes the older IA items uploaded before 2014.
|
||||||
|
|
||||||
|
The only show found was `hpr2243`.
|
||||||
|
|
||||||
|
### Correcting the collection(s) for a show
|
||||||
|
|
||||||
|
This can only be done by the IA staff. Send an email to `info@archive.org`
|
||||||
|
reporting the item and explaining the issue. The item should be in the
|
||||||
|
collections 'Hacker Public Radio' and 'Podcasts'.
|
||||||
|
|
||||||
|
<!--
|
||||||
|
vim: syntax=markdown:ts=8:sw=4:ai:et:tw=78:fo=tcqn:fdm=marker
|
||||||
|
-->
|
92
Internet-Archive-Workflow.md
Normal file
92
Internet-Archive-Workflow.md
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
# Internet Archive Workflow
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This section describes the processes used to upload Hacker Public Radio
|
||||||
|
episodes to the Internet Archive (`archive.org`).
|
||||||
|
|
||||||
|
**Note**: This text is taken from the Wiki built under GitLab several years
|
||||||
|
ago. It's in the process of being updated for the current practices developed
|
||||||
|
since then.
|
||||||
|
|
||||||
|
## History
|
||||||
|
|
||||||
|
We have been adding HPR shows to the Internet Archive since 2010 when shows
|
||||||
|
1-620 were uploaded as MP3 audio in blocks of 10.
|
||||||
|
|
||||||
|
There was a delay of four years before the current project began in 2014.
|
||||||
|
Since then shows have been uploaded individually, with show notes. The normal
|
||||||
|
cycle has been to upload the previous weeks' shows each weekend, and gradually
|
||||||
|
work through the older shows going back in time.
|
||||||
|
|
||||||
|
Originally in the current project, all that was uploaded was the WAV format
|
||||||
|
audio and the show notes. The WAV file was transcoded to other formats by the
|
||||||
|
Internet Archive software.
|
||||||
|
|
||||||
|
Towards the end of 2017 auxiliary files were uploaded for shows that have
|
||||||
|
them: files like pictures, examples, supplementary notes and so forth. Also,
|
||||||
|
in December 2017 we started pointing our feeds at the Internet Archive instead
|
||||||
|
of the HPR server, and, since the audio files transcoded on the Internet
|
||||||
|
Archive machines do not include audio tags, we began generating all the
|
||||||
|
formats ourselves, with tags, and uploaded them too. We also needed to upload
|
||||||
|
shows for the week ahead rather than the week just gone.
|
||||||
|
|
||||||
|
## Workflow
|
||||||
|
|
||||||
|
**Obsolete, needs work**
|
||||||
|
|
||||||
|
1. As part of the process of preparing a new show the audio is transcoded to a
|
||||||
|
variety of formats. The formats are: *flac*, *mp3*, *ogg*, *opus*, *spx*
|
||||||
|
and *wav*.
|
||||||
|
|
||||||
|
2. The audio files are copied to the Raspberry Pi `borg` in Ken's house from
|
||||||
|
the HPR server, and named `hpr<show>.<format>` as appropriate for the show
|
||||||
|
number and audio format (e.g. `hpr2481.wav`). They are stored in the
|
||||||
|
directory `/var/IA/uploads/`.
|
||||||
|
|
||||||
|
3. The upload process itself, uses the
|
||||||
|
[*internetarchive*](https://internetarchive.readthedocs.io/en/latest/installation.html)
|
||||||
|
tool. This provides the
|
||||||
|
[`ia`](https://internetarchive.readthedocs.io/en/latest/cli.html) command.
|
||||||
|
There is a bulk mode which the `ia` command offers, and this is what is
|
||||||
|
used. This takes a *comma separated variable* (CSV) file, which is
|
||||||
|
generated by an HPR tool called `make_metadata` which is currently run
|
||||||
|
under the account `perloid`.
|
||||||
|
|
||||||
|
4. The shows to be uploaded are checked for HTML errors. A script called
|
||||||
|
`clean_notes` is used which uses a Perl module called `HTML::Tidy` to check
|
||||||
|
for errors. Errors are corrected manually at this point. (TODO: explain in
|
||||||
|
more detail)
|
||||||
|
|
||||||
|
5. The `make_metadata` script generates data for a block of shows. It collects
|
||||||
|
any associated files and saves them in the `/var/IA/uploads/` directory. It
|
||||||
|
generates a CSV file which points to the various audio formats for each
|
||||||
|
show, as well as any associated files. Further details of what this tool
|
||||||
|
can do are provided in its [documentation](make_metadata).
|
||||||
|
|
||||||
|
6. During metadata creation the `make_metadata` script will halt if it finds
|
||||||
|
that a given show does not have a summary (extremely rare for new shows) or
|
||||||
|
tags (sadly fairly common). It is possible to override this step, but it is
|
||||||
|
preferable to supply the missing elements because they are of great use on
|
||||||
|
`archive.org`.
|
||||||
|
|
||||||
|
7. Having created the metadata in a CSV file this is processed with the `ia`
|
||||||
|
tool. This is run in *bulk upload* mode, it reads the CSV file and creates
|
||||||
|
an item on archive.org. It uploads any audio files listed in the CSV file
|
||||||
|
as well as any associated files. (TODO: add an example)
|
||||||
|
|
||||||
|
8. Once all uploads have completed the script
|
||||||
|
[`delete_uploaded`](delete_uploaded) is run to delete files in
|
||||||
|
`/var/IA/uploads` which have been uploaded. The VPS does not have much disk
|
||||||
|
space so deleting unnecessary files is important.
|
||||||
|
|
||||||
|
*To be continued*
|
||||||
|
|
||||||
|
## Example commands
|
||||||
|
|
||||||
|
---
|
||||||
|
Back to [home](home) page
|
||||||
|
|
||||||
|
<!--
|
||||||
|
vim: syntax=markdown:ts=8:sw=4:ai:et:tw=78:fo=tcqn:fdm=marker
|
||||||
|
-->
|
24
Internet-Archive.md
Normal file
24
Internet-Archive.md
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# InternetArchive
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
We upload all HPR shows to the Internet Archive (referred to as the *IA* here).
|
||||||
|
|
||||||
|
Each show is an IA *item* with an URL such as: `https://archive.org/details/hpr0144`. Here the number `0144` is the show number using 4 digits with
|
||||||
|
leading zeroes.
|
||||||
|
|
||||||
|
A show consists of a front page built from the HTML copied from the HPR database. Attached to the item are all the files associated with the show;
|
||||||
|
always the audio files and any other *assets* such as photographs, added text, scripts, etc. The intention is to make the copy of the show on the IA
|
||||||
|
stand-alone. For historical reasons, there were some shows where not all associated files had been uploaded. However, a project which ended in
|
||||||
|
December 2022 uploaded all of the missing assets.
|
||||||
|
|
||||||
|
In 2023 text transcripts of the audio of hpr shows are being generated. All of the older shows had their transcripts generated and placed on the HPR
|
||||||
|
server. At the time of writing (2023-02-26) the uploading of the transcripts to the IA has not taken place. New show transcripts are being added to IA
|
||||||
|
items, but this is not the case for the backlog of old shows.
|
||||||
|
|
||||||
|
---
|
||||||
|
Back to [Home](Home) page
|
||||||
|
|
||||||
|
<!--
|
||||||
|
vim: syntax=markdown:ts=8:sw=4:ai:et:tw=150:fo=tcqn:fdm=marker
|
||||||
|
-->
|
179
Working-with-the-Internet-Archive.md
Normal file
179
Working-with-the-Internet-Archive.md
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
## Overview
|
||||||
|
|
||||||
|
We upload all HPR shows to the Internet Archive (referred to as the *IA*
|
||||||
|
here).
|
||||||
|
|
||||||
|
Each show is an IA *item* with an URL such as:
|
||||||
|
`https://archive.org/details/hpr0144`. Here the number `0144` is the show
|
||||||
|
number using 4 digits with leading zeroes.
|
||||||
|
|
||||||
|
A show consists of a front page built from the HTML copied from the HPR
|
||||||
|
database. Attached to the item are all the files associated with the show;
|
||||||
|
always the audio files and any other *assets* such as photographs, added text,
|
||||||
|
scripts, etc. The intention is to make the copy of the show on the IA
|
||||||
|
stand-alone. For historical reasons, there are some shows where not all
|
||||||
|
associated files have yet been uploaded. There should be a record of these,
|
||||||
|
but nothing has yet been done to add missing files.
|
||||||
|
|
||||||
|
### Status
|
||||||
|
|
||||||
|
- At the time of writing, 2022-03-05, most of the older shows in the range
|
||||||
|
1-870 have been uploaded (in reverse numerical order) but the last three
|
||||||
|
(1-3) have not, due to a naming clash.
|
||||||
|
|
||||||
|
- Update 2022-08-04: the naming clash mentioned above was cleared and all
|
||||||
|
shows have now been uploaded. The project to re-upload certain shows is
|
||||||
|
ongoing. This will ensure all *assets* are on the IA and that any metadata
|
||||||
|
is up to date.
|
||||||
|
|
||||||
|
## History
|
||||||
|
|
||||||
|
We have been adding HPR shows to the Internet Archive since 2010 when shows
|
||||||
|
1-620 were uploaded as MP3 audio in batches of 10. For example, the audio for
|
||||||
|
shows 121-130 exist as the batch:
|
||||||
|
<https://archive.org/details/Hackerpublicradio.org-archiveEp0121-Ep0130>
|
||||||
|
|
||||||
|
There was a delay of four years before the current project began in 2014.
|
||||||
|
Since then shows have been uploaded individually, with show notes. The original
|
||||||
|
cycle was to upload the previous weeks' shows each weekend, and gradually
|
||||||
|
work through the older shows going back in time.
|
||||||
|
|
||||||
|
The main tools used are [`make_metadata`](make_metadata) (a locally-developed
|
||||||
|
Perl script) and `ia` (a Python script created by IA programmers).
|
||||||
|
|
||||||
|
Originally in the current project, all that was uploaded was the WAV format
|
||||||
|
audio and the show notes. The WAV file was transcoded to other formats by the
|
||||||
|
Internet Archive software.
|
||||||
|
|
||||||
|
Towards the end of 2017 auxiliary files were uploaded for shows that have
|
||||||
|
them: files like pictures, examples, supplementary notes and so forth. Also,
|
||||||
|
in December 2017 we started pointing our RSS feeds at the Internet Archive instead
|
||||||
|
of the HPR server, and, since the audio files transcoded on the Internet
|
||||||
|
Archive machines do not include audio tags, we began generating all the
|
||||||
|
formats ourselves, with tags, and uploaded them too. We also needed to upload
|
||||||
|
shows for the week ahead rather than the week just gone. A script called
|
||||||
|
`weekly_upload` performed the necessary steps top preload shows. This is not
|
||||||
|
currently used.
|
||||||
|
|
||||||
|
In early 2021 the upload strategy was changed. A script called
|
||||||
|
[`future_upload`](future_upload) was written which determines if there are
|
||||||
|
shows to upload from the cacheing area on `borg`. It does this by consulting a
|
||||||
|
history file and by querying the IA itself. If shows are found they are
|
||||||
|
uploaded.
|
||||||
|
|
||||||
|
At around the same time, a script called [`past_upload`](past_upload) was
|
||||||
|
written to upload shows in the range 1-870. This collects the show audio from
|
||||||
|
the HPR server - which is just MP3 format - transcodes it into all of the
|
||||||
|
formats required on the IA, and uploads the results. This is run on a regular
|
||||||
|
basis from `borg`, processing five shows a day so as not to overload the IA
|
||||||
|
servers.
|
||||||
|
|
||||||
|
A SQLite database exists (called `ia.db`) which is used to hold information
|
||||||
|
about shows uploaded to the IA. This is useful to keep track of what has been
|
||||||
|
done, it is used when generating the monthly Community News show notes, and is
|
||||||
|
intended to be incorporated into the planned new HPR database design.
|
||||||
|
|
||||||
|
## Software and other components
|
||||||
|
|
||||||
|
This is an alphabetic list of scripts, for reference:
|
||||||
|
|
||||||
|
### archive_metadata
|
||||||
|
|
||||||
|
This Bash script adds metadata files (produced by `make_metadata` - see below)
|
||||||
|
to a compressed `tar` file (called `meta.tar.bz2`) and deletes the originals.
|
||||||
|
There is currently no mechanism for purging the oldest files stored in this
|
||||||
|
way.
|
||||||
|
|
||||||
|
### check_week
|
||||||
|
|
||||||
|
This Bash script is used to check what shows exist in the HPR database for a
|
||||||
|
particular week (by week number) and whether these shows have been uploaded to
|
||||||
|
the IA. It was created to prevent gaps from appearing in the sequence of shows
|
||||||
|
on the IA, caused by too infrequent runs of `future_upload`.
|
||||||
|
|
||||||
|
Documentation may be found [here](check_week).
|
||||||
|
|
||||||
|
### collect_show_data
|
||||||
|
|
||||||
|
This Bash script is used to collect data from the IA in JSON format for adding
|
||||||
|
to the SQLite database (`ia.db`). This is being done on a local workstation
|
||||||
|
rather than on `borg`, but the database is being kept on Gitea and a copy
|
||||||
|
stored on `borg:~perloid/InternetArchive/ia.db` which is synchronised daily.
|
||||||
|
|
||||||
|
### future_upload
|
||||||
|
|
||||||
|
This Bash script runs on `borg` where it performs show uploads by looking at
|
||||||
|
the cache of show files (`/var/IA/uploads`) and determining which have not yet
|
||||||
|
been uploaded to the IA. Since the checks interrogate the IA and are
|
||||||
|
expensive, the script maintains a history file in `.future_upload.dat` which
|
||||||
|
lists the shows that have been uploaded.
|
||||||
|
|
||||||
|
Documentation may be found [here](future_upload).
|
||||||
|
|
||||||
|
### make_metadata
|
||||||
|
|
||||||
|
This Perl script generates CSV metadata for driving the upload of HPR shows to
|
||||||
|
the Internet Archive. The script is mainly called from other scripts, because
|
||||||
|
its use is rather complex. The script itself contains its own documentation, a
|
||||||
|
copy of which is included [here](make_metadata).
|
||||||
|
|
||||||
|
### past_upload
|
||||||
|
|
||||||
|
A Bash script for uploading older shows to the IA on `borg`. Downloads the
|
||||||
|
audio (always `mp3` for older shows) and transcodes it to the formats used for
|
||||||
|
newer shows, maintaining id3 tags and so forth along the way. Generates CSV
|
||||||
|
metadata with `make_metadata` and uploads the shows with the `ia` tool.
|
||||||
|
|
||||||
|
Documentation may be found [here](past_upload).
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
Aside from Perl modules (which are documented in the relevant POD sections in
|
||||||
|
the scripts), the various Bash scripts perform checks on pre-requisite files
|
||||||
|
and tools.
|
||||||
|
|
||||||
|
This is a list of these pre-requisites, starting with Bash and Perl scripts:
|
||||||
|
|
||||||
|
### ~/bin/close_tunnel
|
||||||
|
|
||||||
|
A Bash script to close down the SSH tunnel opened by `open_tunnel`
|
||||||
|
|
||||||
|
### ~/bin/function_lib.sh
|
||||||
|
|
||||||
|
A file of shared Bash functions.
|
||||||
|
|
||||||
|
### ~/bin/open_tunnel
|
||||||
|
|
||||||
|
A Bash script used to open an SSH tunnel to the HPR server so that scripts can
|
||||||
|
easily access the MariaDB database there.
|
||||||
|
|
||||||
|
### ~/bin/transfer_tags
|
||||||
|
|
||||||
|
A Perl script which transfers `id3` tags from a main file to a number of
|
||||||
|
subsidiary files.
|
||||||
|
|
||||||
|
### ~/bin/tunnel_is_open
|
||||||
|
|
||||||
|
A Bash script that tests whether the SSH tunnel is open.
|
||||||
|
|
||||||
|
### ia
|
||||||
|
|
||||||
|
A Python script from the Internet Archive used to interact with the IA
|
||||||
|
servers. This is used to interrogate the state of the collection on the IA and
|
||||||
|
to upload files.
|
||||||
|
|
||||||
|
The tool can be installed as described here: [installing
|
||||||
|
*internetarchive*](https://archive.org/services/docs/api/internetarchive/installation.html)
|
||||||
|
This provides the `ia` command.
|
||||||
|
|
||||||
|
### jq
|
||||||
|
|
||||||
|
The JSON parser used to manipulate JSON files imported from the IA.
|
||||||
|
|
||||||
|
## Links
|
||||||
|
|
||||||
|
- [How To Do Stuff](How-To-Do-Stuff)
|
||||||
|
|
||||||
|
<!--
|
||||||
|
vim: syntax=markdown:ts=8:sw=4:ai:et:tw=78:fo=tcqn:fdm=marker
|
||||||
|
-->
|
38
check_week.md
Normal file
38
check_week.md
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
```
|
||||||
|
check_week - version: 0.0.2
|
||||||
|
|
||||||
|
Usage: ./check_week [-h] [week_no]
|
||||||
|
|
||||||
|
Checks a future week to ensure all the shows are on the Internet Archive.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h Print this help
|
||||||
|
-i Ignore shows missing from the database during the
|
||||||
|
chosen week. Normally the script does not proceed if
|
||||||
|
there are fewer than 5 shows in a week.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
week_no (optional, default current week) the week number to be
|
||||||
|
examined. This is a number in the range 1..52.
|
||||||
|
Anything else is illegal.
|
||||||
|
|
||||||
|
Environment variables
|
||||||
|
check_week_DEBUG If set to a non-zero value then the debugging
|
||||||
|
statements in the script are executed. Otherwise if
|
||||||
|
set to zero, or if the variable is absent no debug
|
||||||
|
information is produced. The variable can be set
|
||||||
|
using the 'export' command or on the same line as the
|
||||||
|
command calling the script. See the example below.
|
||||||
|
|
||||||
|
Examples
|
||||||
|
./check_week # Check the current week
|
||||||
|
./check_week -i # Check the current week ignoring missing shows
|
||||||
|
./check_week 6 # Check week 6 of the current year
|
||||||
|
|
||||||
|
check_week_DEBUG=1 ./check_week # Run with debugging enabled
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
<!--
|
||||||
|
vim: syntax=markdown:ts=8:sw=4:ai:et:tw=78:fo=tcqn:fdm=marker
|
||||||
|
-->
|
94
future_upload.md
Normal file
94
future_upload.md
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
## `future_upload`
|
||||||
|
|
||||||
|
### Description
|
||||||
|
|
||||||
|
This is a Bash script which uploads **all** shows which have not yet been
|
||||||
|
uploaded. It is not possible to skip any shows which are in the pending state.
|
||||||
|
It is possible to limit the number of shows uploaded in a run however - see
|
||||||
|
below.
|
||||||
|
|
||||||
|
The script can be found on `borg` at `~perloid/InternetArchive`. It examines
|
||||||
|
the directory `/data/IA/uploads`. It scans all the files it finds there which
|
||||||
|
conform to the (POSIX extended) regular expression `'hpr[0-9]4.*'`. It uses
|
||||||
|
these to recognise shows (every time the file name changes from `hpraaaa.*` to
|
||||||
|
`hprbbbb.*` it performs checks on show `hpraaaa`).
|
||||||
|
|
||||||
|
The script determines whether the show is already on the IA. Shows on the IA
|
||||||
|
have names (identifiers in IA terms) which conform to the pattern
|
||||||
|
`hpr<number>`. Because these searches of the IA are expensive, only newly
|
||||||
|
discovered shows are checked in this way. If a show is already on the IA the
|
||||||
|
identifier is stored in a cache file called `.future_upload.dat`.
|
||||||
|
|
||||||
|
The assumption is made that any show not already on the IA is eligible for
|
||||||
|
upload. With the advent of show state information available through a CMS
|
||||||
|
query, it is now possible to ignore shows which do not have the status
|
||||||
|
`MEDIA_TRANSCODED`. This addition has not been made as yet (dated 2022-05-11).
|
||||||
|
|
||||||
|
The script collects a list of all shows ready for upload up to a limit of 20.
|
||||||
|
The IA servers can become saturated by requests that are over a certain size,
|
||||||
|
so we limit the number of shows per run to help with this. There is currently
|
||||||
|
no way to change this upper limit without editing the script, but it is
|
||||||
|
possible to request a lower limit with the `-l` option.
|
||||||
|
|
||||||
|
A check is made on each show eligible for uploading to ensure that all of the
|
||||||
|
expected files are available. All of the transcoded audio formats are looked
|
||||||
|
for, and if any are missing the script aborts.
|
||||||
|
|
||||||
|
Next the script runs `make_metadata` - if it is in live mode. In dry-run mode
|
||||||
|
it simply reports what would have happened. It determines the names of the
|
||||||
|
output files itself; it uses the same algorithm as `make_metadata` to ensure
|
||||||
|
the calling script uses the correct names.
|
||||||
|
|
||||||
|
Note: It may be desirable to add a means whereby `make_metadata` could return
|
||||||
|
the file names it uses in a future release.
|
||||||
|
|
||||||
|
Calling `make_metadata` will cause the generation of a CSV file and a Bash
|
||||||
|
script. It the run is successful the CSV "spreadsheet" is passed to the
|
||||||
|
command `ia upload --spreadsheet=<name>` and if this is successful the Bash
|
||||||
|
script (if any) will be run.
|
||||||
|
|
||||||
|
Any errors will result in the upload process being aborted.
|
||||||
|
|
||||||
|
If the uploads are successful the IA identities (shows) are written to the
|
||||||
|
cache file.
|
||||||
|
|
||||||
|
## Help output
|
||||||
|
|
||||||
|
This is what is output when the command `./future_upload -h` is run.
|
||||||
|
|
||||||
|
```
|
||||||
|
future_upload - version: 0.0.5
|
||||||
|
|
||||||
|
Usage: ./future_upload [-h] [-v] [-D] [-d {0|1}] [-r] [-l cp]
|
||||||
|
|
||||||
|
Uploads HPR shows to the Internet Archive that haven't yet been uploaded. This
|
||||||
|
is as an alternative to uploading the next 5 shows each week for the coming
|
||||||
|
week.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h Print this help
|
||||||
|
-v Run in verbose mode where more information is reported
|
||||||
|
-D Run in debug mode where a lot more information is
|
||||||
|
reported
|
||||||
|
-d 0|1 Dry run: -d 1 (the default) runs the script in dry-run
|
||||||
|
mode where nothing is uploaded but the actions that
|
||||||
|
will be taken are reported; -d 0 turns off dry-run
|
||||||
|
mode and the actions will be carried out.
|
||||||
|
-r Run in 'remote' mode, using the live database over an
|
||||||
|
(already established) SSH tunnel. Default is to run
|
||||||
|
against the local database.
|
||||||
|
-l N Control the number of shows that can be uploaded at
|
||||||
|
once. The range is 1 to 20.
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
1. When running on 'borg' the method used is to run in faux 'local' mode.
|
||||||
|
This means we have an open tunnel to the HPR server (mostly left open) and
|
||||||
|
the default file .hpr_db.cfg points to the live database via this tunnel.
|
||||||
|
So we do not use the -r option here. This is a bit of a hack! Sorry!
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
<!--
|
||||||
|
vim: syntax=markdown:ts=8:sw=4:ai:et:tw=78:fo=tcqn:fdm=marker
|
||||||
|
-->
|
BIN
images/IA_history_hpr1462.png
Normal file
BIN
images/IA_history_hpr1462.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 167 KiB |
BIN
images/process_comments_1.png
Normal file
BIN
images/process_comments_1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 52 KiB |
BIN
images/process_comments_2.png
Normal file
BIN
images/process_comments_2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 56 KiB |
277
make_email.md
Normal file
277
make_email.md
Normal file
@ -0,0 +1,277 @@
|
|||||||
|
# NAME
|
||||||
|
|
||||||
|
make\_email - generates an HPR Community News recording invitation email
|
||||||
|
|
||||||
|
# VERSION
|
||||||
|
|
||||||
|
This documentation refers to make\_email version 0.2.5
|
||||||
|
|
||||||
|
# USAGE
|
||||||
|
|
||||||
|
make_email [-help] [-documentation] [-debug=N] [-month=DATE] [-[no]mail]
|
||||||
|
[-from=FROM_ADDRESS] [-to=TO_ADDRESS] [-date=DATE] [-start=START_TIME]
|
||||||
|
[-end=END_TIME] [-config=FILE] [-dbconfig=FILE]
|
||||||
|
|
||||||
|
./make_email -dbconf=$HOME/HPR/.hpr_livedb.cfg -date=2022-12-27
|
||||||
|
|
||||||
|
# OPTIONS
|
||||||
|
|
||||||
|
- **-help**
|
||||||
|
|
||||||
|
Prints a brief help message describing the usage of the program, and then exits.
|
||||||
|
|
||||||
|
- **-documentation** **-man**
|
||||||
|
|
||||||
|
Prints the entire embedded documentation for the program, then exits.
|
||||||
|
|
||||||
|
Another way to see the full documentation use:
|
||||||
|
|
||||||
|
**perldoc ./make\_email**
|
||||||
|
|
||||||
|
- **-debug=N**
|
||||||
|
|
||||||
|
Enables debugging mode when N > 0 (zero is the default, no debugging output).
|
||||||
|
The levels are:
|
||||||
|
|
||||||
|
Values are:
|
||||||
|
|
||||||
|
1. Reports all of the settings taken from the configuration file, the provided
|
||||||
|
command line options or their default values. The report is generated early on
|
||||||
|
in the processing of these values. Use **-debug=2** for information about the
|
||||||
|
next stages.
|
||||||
|
2. Reports the following (as well as the data for level 1):
|
||||||
|
- .
|
||||||
|
|
||||||
|
Details of the start date chosen
|
||||||
|
|
||||||
|
- .
|
||||||
|
|
||||||
|
Details of the year, name of month, readable date, and recording start and end
|
||||||
|
times.
|
||||||
|
|
||||||
|
- .
|
||||||
|
|
||||||
|
The subject line chosen for the email.
|
||||||
|
|
||||||
|
- .
|
||||||
|
|
||||||
|
The date of the show being searched for in the database.
|
||||||
|
|
||||||
|
- .
|
||||||
|
|
||||||
|
The number of the show found in the database.
|
||||||
|
|
||||||
|
- **-month=DATE**
|
||||||
|
|
||||||
|
Defines the month for which the email will be generated using a date in that
|
||||||
|
month. Normally (without this option) the current month is chosen and the date
|
||||||
|
of recording computed with in it. The month specified here is provided as
|
||||||
|
a ISO8601 date such as 2014-03-08 (meaning March 2014) or 1-Jan-2017 (meaning
|
||||||
|
January 2017). Only the year and month parts are used but a valid day must be
|
||||||
|
present.
|
||||||
|
|
||||||
|
- **-\[no\]mail**
|
||||||
|
|
||||||
|
\*\* NOTE \*\* The sending of mail does not work at present, and **-nomail** should
|
||||||
|
always be used.
|
||||||
|
|
||||||
|
Causes mail to be sent (**-mail**) or not sent (**-nomail**). If the mail is
|
||||||
|
sent then it is sent via the local MTA (in the assumption that there is one).
|
||||||
|
If this option is omitted, the default is **-nomail**, in which case the
|
||||||
|
message is appended to the file **mailer.testfile** in the current directory.
|
||||||
|
|
||||||
|
- **-from=FROM\_ADDRESS**
|
||||||
|
|
||||||
|
\*\* NOTE \*\* The sending of mail does not work at present.
|
||||||
|
|
||||||
|
This option defines the address from which the message is to be sent. This
|
||||||
|
address is used in the message header; the message envelope will contain the
|
||||||
|
_real_ sender.
|
||||||
|
|
||||||
|
- **-to=TO\_ADDRESS**
|
||||||
|
|
||||||
|
\*\* NOTE \*\* The sending of mail does not work at present.
|
||||||
|
|
||||||
|
This option defines the address to which the message is to be sent.
|
||||||
|
|
||||||
|
- **-date=DATE**
|
||||||
|
|
||||||
|
This is an option provides a non-default date for the recording. Normally the
|
||||||
|
script computes the next scheduled date based on the algorithm "Saturday
|
||||||
|
before the first Monday of the next month" starting from the current date or
|
||||||
|
the start of the month given in the **-month=DATE** option. If for any reason
|
||||||
|
a different date is required then this may be specified via this option.
|
||||||
|
|
||||||
|
The recording date should be given as an ISO8601 date (such as 2014-03-08).
|
||||||
|
|
||||||
|
- **-start=START\_TIME**
|
||||||
|
|
||||||
|
The default start time is defined in the configuration file, but if it is
|
||||||
|
necessary to change it, this option can be used to do it. The **START\_TIME**
|
||||||
|
value must be a valid **HH:MM** time specification.
|
||||||
|
|
||||||
|
- **-end=END\_TIME**
|
||||||
|
|
||||||
|
The default end time is defined in the configuration file, but if it is
|
||||||
|
necessary to change it, this option can be used to do it. The **END\_TIME**
|
||||||
|
value must be a valid **HH:MM** time specification.
|
||||||
|
|
||||||
|
- **-config=FILE**
|
||||||
|
|
||||||
|
This option defines a configuration file other than the default
|
||||||
|
**.make\_email.cfg**. The file must be formatted as described below in the
|
||||||
|
section _CONFIGURATION AND ENVIRONMENT_.
|
||||||
|
|
||||||
|
- **-dbconfig=FILE**
|
||||||
|
|
||||||
|
This option defines a database configuration file other than the default
|
||||||
|
**.hpr\_db.cfg**. The file must be formatted as described below in the section
|
||||||
|
_CONFIGURATION AND ENVIRONMENT_.
|
||||||
|
|
||||||
|
The default file is configured to open a local copy of the HPR database. An
|
||||||
|
alternative is **.hpr\_livedb.cfg** which assumes an SSH tunnel to the live
|
||||||
|
database and attempts to connect to it. Use the script _open\_tunnel_ to open
|
||||||
|
the SSH tunnel.
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
Makes and sends(\*) an invitation email for the next Community News with times per
|
||||||
|
timezone. The message is structured by a Template Toolkit template, so its
|
||||||
|
content can be adjusted without changing this script.
|
||||||
|
|
||||||
|
In normal operation the script computes the date of the next recording using
|
||||||
|
the algorithm "Saturday before the first Monday of the next month" starting
|
||||||
|
from the current date or the start of the month (and year) given in the
|
||||||
|
**-month=DATE** option.
|
||||||
|
|
||||||
|
It uses the recording date (**-date=DATE** option) to access the MySQL database
|
||||||
|
to find the date on which the show will be released. It does that so the notes
|
||||||
|
on that show can be viewed by the volunteers recording the show. These notes
|
||||||
|
are expanded to be usable during the recording, with comments relating to
|
||||||
|
earlier shows being displayed in full, and any comments missed in the last
|
||||||
|
recording highlighted. Comments made to shows during the past month can be
|
||||||
|
seen as the shows are visited and discussed.
|
||||||
|
|
||||||
|
The email generated by the script is sent to the HPR mailing list, usually on
|
||||||
|
the Monday prior to the weekend of the recording.
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
\* Mail sending does not work at present.
|
||||||
|
|
||||||
|
# DIAGNOSTICS
|
||||||
|
|
||||||
|
- **Unable to find ...**
|
||||||
|
|
||||||
|
The configuration file specified in **-config=FILE** (or the default file)
|
||||||
|
could not be found.
|
||||||
|
|
||||||
|
- **Use only one of -month=MONTH or -date=DATE**
|
||||||
|
|
||||||
|
These options are mutually exclusive. See their specifications earlier in this
|
||||||
|
document.
|
||||||
|
|
||||||
|
- **Missing start/end time(s)**
|
||||||
|
|
||||||
|
One or both of the start and end times is missing, either from the configuration file or
|
||||||
|
from the command line options.
|
||||||
|
|
||||||
|
- **Missing template file ...**
|
||||||
|
|
||||||
|
The template file specified in the configuration file could not be found.
|
||||||
|
|
||||||
|
- **Various database messages**
|
||||||
|
|
||||||
|
The program can generate warning messages from the database.
|
||||||
|
|
||||||
|
- **Invalid -date=DATE option '...'**
|
||||||
|
|
||||||
|
An invalid date has been supplied via this option.
|
||||||
|
|
||||||
|
- **Date is in the past '...'**
|
||||||
|
|
||||||
|
The date specified in **-date=DATE** is in the past.
|
||||||
|
|
||||||
|
- **Invalid -month=DATE option '...'**
|
||||||
|
|
||||||
|
An invalid date has been supplied via this option.
|
||||||
|
|
||||||
|
- **Date is in the past '...'**
|
||||||
|
|
||||||
|
The month specified in **-month=DATE** is in the past.
|
||||||
|
|
||||||
|
- **Various Template Toolkit messages**
|
||||||
|
|
||||||
|
The program can generate warning messages from the Template.
|
||||||
|
|
||||||
|
- **Couldn't send message: ...**
|
||||||
|
|
||||||
|
The email mesage has been constructed but could not be sent. See the error
|
||||||
|
returned by the mail subsystem for more information.
|
||||||
|
|
||||||
|
# CONFIGURATION AND ENVIRONMENT
|
||||||
|
|
||||||
|
## EMAIL CONFIGURATION
|
||||||
|
|
||||||
|
The program obtains the settings it requires for preparing the email from
|
||||||
|
a configuration file, which by default is called **.make\_email.cfg**. This file
|
||||||
|
needs to contain the following data:
|
||||||
|
|
||||||
|
<email>
|
||||||
|
server = MUMBLE_SERVER_NAME
|
||||||
|
port = MUMBLE_PORT
|
||||||
|
room = NAME_OF_ROOM
|
||||||
|
starttime = 18:00:00
|
||||||
|
endtime = 20:00:00
|
||||||
|
template = NAME_OF_TEMPLATE
|
||||||
|
</email>
|
||||||
|
|
||||||
|
## DATABASE CONFIGURATION
|
||||||
|
|
||||||
|
The program obtains the credentials it requires for connecting to the HPR
|
||||||
|
database by loading them from a configuration file. The default file is called
|
||||||
|
**.hpr\_db.cfg** and should contain the following data:
|
||||||
|
|
||||||
|
<database>
|
||||||
|
host = 127.0.0.1
|
||||||
|
port = PORT
|
||||||
|
name = DBNAME
|
||||||
|
user = USER
|
||||||
|
password = PASSWORD
|
||||||
|
</database>
|
||||||
|
|
||||||
|
The file **.hpr\_livedb.cfg** should be available to allow access to the
|
||||||
|
database over an SSH tunnel which has been previously opened.
|
||||||
|
|
||||||
|
# DEPENDENCIES
|
||||||
|
|
||||||
|
DBI
|
||||||
|
Date::Calc
|
||||||
|
Date::Parse
|
||||||
|
DateTime
|
||||||
|
DateTime::Format::Duration
|
||||||
|
DateTime::TimeZone
|
||||||
|
Getopt::Long
|
||||||
|
Mail::Mailer
|
||||||
|
Pod::Usage
|
||||||
|
Template
|
||||||
|
|
||||||
|
# BUGS AND LIMITATIONS
|
||||||
|
|
||||||
|
There are no known bugs in this script.
|
||||||
|
Please report problems to Dave Morriss (Dave.Morriss@gmail.com)
|
||||||
|
Patches are welcome.
|
||||||
|
|
||||||
|
# AUTHOR
|
||||||
|
|
||||||
|
Dave Morriss (Dave.Morriss@gmail.com) 2013 - 2023
|
||||||
|
|
||||||
|
# LICENCE AND COPYRIGHT
|
||||||
|
|
||||||
|
Copyright (c) Dave Morriss (Dave.Morriss@gmail.com). All rights reserved.
|
||||||
|
|
||||||
|
This program is free software. You can redistribute it and/or modify it under
|
||||||
|
the same terms as perl itself.
|
||||||
|
|
||||||
|
---
|
||||||
|
Back to [Community_News](Community-News) page
|
||||||
|
|
582
make_metadata.md
Normal file
582
make_metadata.md
Normal file
@ -0,0 +1,582 @@
|
|||||||
|
# NAME
|
||||||
|
|
||||||
|
make\_metadata - Generate metadata from the HPR database for Archive.org
|
||||||
|
|
||||||
|
# VERSION
|
||||||
|
|
||||||
|
This documentation refers to make\_metadata version 0.4.11
|
||||||
|
|
||||||
|
# USAGE
|
||||||
|
|
||||||
|
make_metadata [-help] [-documentation]
|
||||||
|
|
||||||
|
make_metadata -from=FROM [-to=TO] [-count=COUNT] [-output[=FILE]]
|
||||||
|
[-script[=FILE]] [-[no]meta_only] [-[no]fetch]
|
||||||
|
[-[no]assets] [-[no]silent] [-[no]verbose] [-[no]test]
|
||||||
|
[-[no]ignore_missing] [-config=FILE] [-dbconfig=FILE] [-debug=N]
|
||||||
|
|
||||||
|
make_metadata -list=LIST [-output[=FILE]] [-script[=FILE]]
|
||||||
|
[-[no]meta_only] [-[no]fetch] [-[no]assets] [-[no]silent]
|
||||||
|
[-[no]verbose] [-[no]test] [-[no]ignore_missing] [-config=FILE]
|
||||||
|
[-dbconfig=FILE] [-debug=N]
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
make_metadata -from=1234 -nofetch
|
||||||
|
|
||||||
|
make_metadata -from=1234 -to=1235
|
||||||
|
|
||||||
|
make_metadata -from=1234 -count=10
|
||||||
|
|
||||||
|
make_metadata -from=1 -to=3 -output=metadata_1-3.csv
|
||||||
|
|
||||||
|
make_metadata -from=1500 -to=1510 -out=metadata_1500-1510.csv -verbose
|
||||||
|
|
||||||
|
make_metadata -from=1500 -to=1510 -out=metadata_%d-%d.csv -verbose
|
||||||
|
|
||||||
|
make_metadata -from=500 -to=510 -out=metadata_%04d-%04d.csv -verbose
|
||||||
|
|
||||||
|
make_metadata -from=1500 -to=1510 -out -verbose
|
||||||
|
|
||||||
|
make_metadata -from=1500 -to=1510 -out
|
||||||
|
|
||||||
|
make_metadata -from=1675 -to=1680 -out=metadata_%d-%d.csv -meta_only
|
||||||
|
|
||||||
|
make_metadata -from=1450 -test
|
||||||
|
|
||||||
|
make_metadata -list='1234,2134,2314' -out -meta_only
|
||||||
|
|
||||||
|
make_metadata -list="931,932,933,935,938,939,940" -out -meta -ignore
|
||||||
|
|
||||||
|
make_metadata -dbconf=.hpr_livedb.cfg -from=1234 -to=1235
|
||||||
|
|
||||||
|
make_metadata -from=3004 -out -meta_only -noassets
|
||||||
|
|
||||||
|
# OPTIONS
|
||||||
|
|
||||||
|
- **-help**
|
||||||
|
|
||||||
|
Reports brief information about how to use the script and exits. To see the
|
||||||
|
full documentation use the option **-documentation** or **-man**. Alternatively,
|
||||||
|
to generate a PDF version use the _pod2pdf_ tool from
|
||||||
|
_http://search.cpan.org/~jonallen/pod2pdf-0.42/bin/pod2pdf_. This can be
|
||||||
|
installed with the cpan tool as App::pod2pdf.
|
||||||
|
|
||||||
|
- **-documentation** or **-man**
|
||||||
|
|
||||||
|
Reports full information about how to use the script and exits. Alternatively,
|
||||||
|
to generate a PDF version use the _pod2pdf_ tool from
|
||||||
|
_http://search.cpan.org/~jonallen/pod2pdf-0.42/bin/pod2pdf_. This can be
|
||||||
|
installed with the cpan tool as App::pod2pdf.
|
||||||
|
|
||||||
|
- **-debug=N**
|
||||||
|
|
||||||
|
Run in debug mode at the level specified by _N_. Possible values are:
|
||||||
|
|
||||||
|
- **0**
|
||||||
|
|
||||||
|
No debugging (the default).
|
||||||
|
|
||||||
|
- **1**
|
||||||
|
|
||||||
|
TBA
|
||||||
|
|
||||||
|
- **2**
|
||||||
|
|
||||||
|
TBA
|
||||||
|
|
||||||
|
- **3**
|
||||||
|
|
||||||
|
TBA
|
||||||
|
|
||||||
|
- **4 and above**
|
||||||
|
|
||||||
|
The metadata hash is dumped.
|
||||||
|
|
||||||
|
Each call of the function _find\_links\_in\_notes_ is reported. On finding an
|
||||||
|
<a> or <img> tag the _uri_ value is shown, as is any fragment and the related
|
||||||
|
link. The original file is reported here.
|
||||||
|
|
||||||
|
Each call of the function _find\_links\_in\_file_ is reported. On finding an
|
||||||
|
<a> or <img> tag the _uri_ value is shown, as is any fragment and the related
|
||||||
|
link. The original file is reported here, and if a link is to be ignored this
|
||||||
|
is reported.
|
||||||
|
|
||||||
|
- **-from=NUMBER**
|
||||||
|
|
||||||
|
This option defines the starting episode number of a group. It is mandatory to
|
||||||
|
provide either the **-from=NUMBER** option or the **-list=LIST** option (see
|
||||||
|
below).
|
||||||
|
|
||||||
|
- **-to=NUMBER**
|
||||||
|
|
||||||
|
This option specifies the final episode number of a group. If not given the
|
||||||
|
script generates metadata for the single episode indicated by **-from**.
|
||||||
|
|
||||||
|
The value given here must be greater than or equal to that given in the
|
||||||
|
**-from** option. The option must not be present with the **-count** option.
|
||||||
|
|
||||||
|
The difference between the episode numbers given by the **-from** and **-to**
|
||||||
|
options must not be greater than 20.
|
||||||
|
|
||||||
|
- **-count=NUMBER**
|
||||||
|
|
||||||
|
This option specifies the number of episodes to process (starting from the
|
||||||
|
episode number specified by the **-from**) option. The option must not be
|
||||||
|
present with the **-to** option.
|
||||||
|
|
||||||
|
The number of episodes specified must not be greater than 20.
|
||||||
|
|
||||||
|
- **-list=LIST**
|
||||||
|
|
||||||
|
This option is an alternative to **-from=NUMBER** and its associated modifying
|
||||||
|
options. The **LIST** is a comma-separated list of not necessarily consecutive
|
||||||
|
episode numbers, and must consist of at least one and no more than 20 numbers.
|
||||||
|
|
||||||
|
This option is useful for the case when non-sequential episode numbers are to
|
||||||
|
be uploaded, and is particularly useful when repairing elements of particular
|
||||||
|
episodes (such as adding summary fields and tags) where they have already
|
||||||
|
been uploaded.
|
||||||
|
|
||||||
|
For example, the following shows have no summary and/or tags, but the shows
|
||||||
|
are already in the IA. The missing items have been provided, so we wish to
|
||||||
|
update the HTML part of the upload:
|
||||||
|
|
||||||
|
$ ./make_metadata -list='2022,2027,2028,2029,2030,2033' -out -meta
|
||||||
|
Output file: metadata_2022-2033.csv
|
||||||
|
|
||||||
|
- **-output\[=FILE\]**
|
||||||
|
|
||||||
|
This option specifies the file to receive the generated CSV data. If omitted
|
||||||
|
the output is written to **metadata.csv** in the current directory.
|
||||||
|
|
||||||
|
The file name may contain one or two instances of the characters '%d', with
|
||||||
|
a leading width specification if desired (such as '%04d'). These will be
|
||||||
|
substituted by the **-from=NUMBER** and **-to=NUMBER** values or if
|
||||||
|
**-from=NUMBER** and **-count=NUMBER** are used, the second number will be the
|
||||||
|
appropriate endpoint (adding the count to the starting number). If neither of
|
||||||
|
the **-to=NUMBER** and **-count=NUMBER** options are used then there should only
|
||||||
|
be one instance of '%d' or the script will abort.
|
||||||
|
|
||||||
|
If no value is provided to **-output** then a suitable template will be
|
||||||
|
generated. It will be 'metadata\_%04d.csv' if one episode is being processed, and
|
||||||
|
'metadata\_%04d-%04d.csv' if a range has been specified.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
./make_metadata -from=1430 -out=metadata_%04d.csv
|
||||||
|
|
||||||
|
the output file name will be **metadata\_1430.csv**. The same effect can be
|
||||||
|
achieved with:
|
||||||
|
|
||||||
|
./make_metadata -from=1430 -out=
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
./make_metadata -from=1430 -out
|
||||||
|
|
||||||
|
- **-script\[=FILE\]**
|
||||||
|
|
||||||
|
This option specifies the file to receive commands required to upload certain
|
||||||
|
files relating to a show. If omitted the commands are written to **script.sh**
|
||||||
|
in the current directory.
|
||||||
|
|
||||||
|
The file name may contain one or two instances of the characters '%d', with
|
||||||
|
a leading width specification if desired (such as '%04d'). These will be
|
||||||
|
substituted by the **-from=NUMBER** and **-to=NUMBER** values or if
|
||||||
|
**-from=NUMBER** and **-count=NUMBER** are used, the second number will be the
|
||||||
|
appropriate endpoint (adding the count to the starting number). If neither of
|
||||||
|
the **-to=NUMBER** and **-count=NUMBER** options are used then there should only
|
||||||
|
be one instance of '%d' or the script will abort.
|
||||||
|
|
||||||
|
If no value is provided to **-script** then a suitable template will be
|
||||||
|
generated. It will be 'script\_%04d.sh' if one episode is being processed, and
|
||||||
|
'script\_%04d-%04d.sh' if a range has been specified.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
./make_metadata -from=1430 -script=script_%04d.sh
|
||||||
|
|
||||||
|
the output file name will be **script\_1430.sh**. The same effect can be
|
||||||
|
achieved with:
|
||||||
|
|
||||||
|
./make_metadata -from=1430 -script=
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
./make_metadata -from=1430 -script
|
||||||
|
|
||||||
|
- **-\[no\]fetch**
|
||||||
|
|
||||||
|
This option controls whether the script attempts to fetch the MP3 audio file
|
||||||
|
from the HPR website should there be no WAV file in the upload area. The
|
||||||
|
default setting is **-fetch**.
|
||||||
|
|
||||||
|
Normally the script is run as part of the workflow to upload the metadata and
|
||||||
|
audio to archive.org. The audio is expected to be a WAV file and to be in the
|
||||||
|
location referenced in the configuration file under the 'uploads' label.
|
||||||
|
However, not all of the WAV files exist for older shows.
|
||||||
|
|
||||||
|
When the WAV file is missing and **-fetch** is selected or defaulted, the
|
||||||
|
script will attempt to download the MP3 version of the audio and will store it
|
||||||
|
in the 'uploads' area for the upload script (**ias3upload.pl** or **ia**) to
|
||||||
|
send to archive.org. If the MP3 file is not found then the script will abort.
|
||||||
|
|
||||||
|
If **-fetch** is specified (or defaulted) as well as **-nometa\_only** (see
|
||||||
|
below) then the audio file fetching process will not be carried out. This is
|
||||||
|
because it makes no sense to fetch this file if it's not going to be
|
||||||
|
referenced in the metadata.
|
||||||
|
|
||||||
|
- **-\[no\]assets**
|
||||||
|
|
||||||
|
This option controls the downloading of any assets that may be associated with
|
||||||
|
a show. Assets are the files held on the HPR server which are referenced by
|
||||||
|
the show. Examples might be photographs, scripts, and supplementary notes.
|
||||||
|
Normally all such assets are collected and stored in the upload area and are
|
||||||
|
then sent to the archive via the script. The notes sent to the archive are
|
||||||
|
adjusted to refer to these notes on archive.org, making the HPR episode
|
||||||
|
completely self-contained.
|
||||||
|
|
||||||
|
- **-\[no\]meta\_only** (alias **-\[no\]noaudio**)
|
||||||
|
|
||||||
|
This option controls whether the output file will contain a reference to the
|
||||||
|
audio file(s) or only the metadata. The default is **-nometa\_only** meaning that
|
||||||
|
the file reference(s) and the metadata are present.
|
||||||
|
|
||||||
|
Omitting the file(s) allows the metadata to be regenerated, perhaps due to
|
||||||
|
edits and corrections in the database, and the changes to be propagated to
|
||||||
|
archive.org. If the file reference(s) exist(s) in the metadata file then the
|
||||||
|
file(s) must be available at the time the uploader is run.
|
||||||
|
|
||||||
|
Note that making changes this way is highly preferable to editing the entry on
|
||||||
|
archive.org using the web-based editor. This is because there is a problem
|
||||||
|
with the way HTML entities are treated and this can cause the HTML to be
|
||||||
|
corrupted.
|
||||||
|
|
||||||
|
- **-\[no\]silent**
|
||||||
|
|
||||||
|
The option enables (**-silent**) and disables (**-nosilent**) _silent mode_.
|
||||||
|
When enabled the script reports nothing on STDOUT. If the script cannot find
|
||||||
|
the audio files and downloads the MP3 version from the HPR site for upload to
|
||||||
|
archive.org then the downloads are reported on STDERR. This cannot be
|
||||||
|
disabled, though the STDERR output could be redirected to a file or to
|
||||||
|
/dev/null.
|
||||||
|
|
||||||
|
If **-silent** is specified with **-verbose** then the latter "wins".
|
||||||
|
|
||||||
|
The script runs with silent mode disabled by default. When **-nosilent** is
|
||||||
|
used with **-noverbose** the script reports the output file name and nothing
|
||||||
|
else.
|
||||||
|
|
||||||
|
- **-\[no\]verbose**
|
||||||
|
|
||||||
|
This option enables (**-verbose**) and disables (**-noverbose**)
|
||||||
|
_verbose mode_. When enabled the script reports the metadata it has collected
|
||||||
|
from the database before writing it to the output file. The data is reported
|
||||||
|
in a more readable mode than examining the CSV file, although another script
|
||||||
|
**show\_metadata** is also available to help with this.
|
||||||
|
|
||||||
|
If **-verbose** is specified with **-silent** then the former "wins".
|
||||||
|
|
||||||
|
The script runs with verbose mode disabled by default.
|
||||||
|
|
||||||
|
- **-\[no\]ignore\_missing**
|
||||||
|
|
||||||
|
The script checks each episode to ensure it has a summary and tags. If either
|
||||||
|
of these fields is missing then a warning message is printed for that episode
|
||||||
|
(unless **-silent** has been chosen), and if any episodes are lacking this
|
||||||
|
information the script aborts without producing metadata. If the option
|
||||||
|
**-ignore\_missing** is selected then the warnings are produced (dependent on
|
||||||
|
**-silent**) but the script runs to completion.
|
||||||
|
|
||||||
|
The default setting is **-noignore\_missing**; the script checks and aborts if
|
||||||
|
any summaries or tags are missing.
|
||||||
|
|
||||||
|
- **-\[no\]test**
|
||||||
|
|
||||||
|
DO NOT USE!
|
||||||
|
|
||||||
|
This option enables (**-test**) and disables (**-notest**)
|
||||||
|
_test mode_. When enabled the script generates metadata containing various
|
||||||
|
test values.
|
||||||
|
|
||||||
|
In test mode the following changes are made:
|
||||||
|
|
||||||
|
- .
|
||||||
|
|
||||||
|
The item names, which normally contain 'hprnnnn', built from the episode
|
||||||
|
number, have 'test\_' prepended to them.
|
||||||
|
|
||||||
|
- .
|
||||||
|
|
||||||
|
The collection, which is normally a list containing 'hackerpublicradio' and
|
||||||
|
'podcasts', is changed to 'test\_collection'. Items in this collection are
|
||||||
|
normally deleted by Archive.org after 30 days.
|
||||||
|
|
||||||
|
- .
|
||||||
|
|
||||||
|
The contributor, which is normally 'HackerPublicRadio' is changed to
|
||||||
|
'perlist'.
|
||||||
|
|
||||||
|
**NOTE** The test mode only works for the author!
|
||||||
|
|
||||||
|
- **-config=FILE**
|
||||||
|
|
||||||
|
This option allows an alternative script configuration file to be used. This
|
||||||
|
file defines various settings relating to the running of the script - things
|
||||||
|
like the place to look for the files to be uploaded. It is rare to need to use
|
||||||
|
any other file than the default since these are specific to the environmewnt
|
||||||
|
in which the script runs. However, this has been added at the same time as an
|
||||||
|
alternative database configuration option was added.
|
||||||
|
|
||||||
|
See the CONFIGURATION AND ENVIRONMENT section below for the file format.
|
||||||
|
|
||||||
|
If the option is omitted the default file is used: **.make\_metadata.cfg**
|
||||||
|
|
||||||
|
- **-dbconfig=FILE**
|
||||||
|
|
||||||
|
This option allows an alternative database configuration file to be used. This
|
||||||
|
file defines the location of the database, its port, its name and the username
|
||||||
|
and password to be used to access it. This feature was added to allow the
|
||||||
|
script to access alternative databases or the live database over an SSH
|
||||||
|
tunnel.
|
||||||
|
|
||||||
|
See the CONFIGURATION AND ENVIRONMENT section below for the file format.
|
||||||
|
|
||||||
|
If the option is omitted the default file is used: **.hpr\_db.cfg**
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
This script generates metadata suitable for uploading Hacker Public Radio
|
||||||
|
episodes to the Internet Archive (archive.org).
|
||||||
|
|
||||||
|
The metadata is in comma-separated variable (CSV) format suitable for
|
||||||
|
processing with an upload script. The original upload script was called
|
||||||
|
**ias3upload.pl**, and could be obtained from
|
||||||
|
_https://github.com/kngenie/ias3upload_. This script is no longer supported
|
||||||
|
and **make\_metadata** no longer generates output suitable for it (though it is
|
||||||
|
simple to make it compatible if necessary). The replacement script is called
|
||||||
|
**internetarchive** which is a Python tool which can also be run from the
|
||||||
|
command line. It can be found at _https://github.com/jjjake/internetarchive_.
|
||||||
|
|
||||||
|
The **make\_metadata** script generates CSV from the HPR database. It looks up
|
||||||
|
details for each episode selected by the options, and performs various
|
||||||
|
conversions and concatenations. The goal is to prepare items for the Internet
|
||||||
|
Archive with as much detail as the format can support.
|
||||||
|
|
||||||
|
The resulting CSV file contains a header line listing the field names required
|
||||||
|
by archive.org followed by as many CSV lines of episode data as requested (up
|
||||||
|
to a limit of 20).
|
||||||
|
|
||||||
|
Since the upload method uses the HTTP protocol with fields stored in headers,
|
||||||
|
there are restrictions on the way HTML can be formatted in the **Details**
|
||||||
|
field. The script converts newlines, which are not allowed into _<br/_> tags
|
||||||
|
where necessary.
|
||||||
|
|
||||||
|
HPR shows often have associated files, such as pictures, examples, long-form
|
||||||
|
notes and so forth. The script finds these and downloads them to the cache
|
||||||
|
area where the audio is kept and writes the necessary lines to the CSV file to
|
||||||
|
ensure they are uploaded with the show. It modifies any HTML which links to
|
||||||
|
these files to link to the archive.org copies in order to make the complete
|
||||||
|
show self-contained.
|
||||||
|
|
||||||
|
# DIAGNOSTICS
|
||||||
|
|
||||||
|
- **Configuration file ... not found**
|
||||||
|
|
||||||
|
One or more of the configuration files has not been found.
|
||||||
|
|
||||||
|
- **Path ... not found**
|
||||||
|
|
||||||
|
The path specified in the **uploads** definition in the configuration file
|
||||||
|
**.make\_metadata.cfg** does not exist. Check the configuration file.
|
||||||
|
|
||||||
|
- **Configuration data missing**
|
||||||
|
|
||||||
|
While checking the configuration file(s) the script has detected that settings
|
||||||
|
are missing. Check the details specified below and provide the missing
|
||||||
|
elements.
|
||||||
|
|
||||||
|
- **Mis-match between @fields and %dispatch!**
|
||||||
|
|
||||||
|
An internal error in the script has been detected where the elements of the
|
||||||
|
@fields array do not match the keys of the %dispatch hash. This is probably the
|
||||||
|
result of a failed attempt to edit either of these components.
|
||||||
|
|
||||||
|
Correct the error and run the script again.
|
||||||
|
|
||||||
|
- **Invalid list; no elements**
|
||||||
|
|
||||||
|
There are no list elements in the **-list=LIST** option.
|
||||||
|
|
||||||
|
- **Invalid list; too many elements**
|
||||||
|
|
||||||
|
There are more than the allowed 20 elements in the list specified by the
|
||||||
|
**-list=LIST** option.
|
||||||
|
|
||||||
|
- **Failed to parse -list=...**
|
||||||
|
|
||||||
|
A list was specified that did not contain a CSV list of numbers.
|
||||||
|
|
||||||
|
- **Invalid starting episode number (...)**
|
||||||
|
|
||||||
|
The value used in the **-from** option must be greater than 0.
|
||||||
|
|
||||||
|
- **Do not combine -to and -count**
|
||||||
|
|
||||||
|
Using both the **-to** and **-count** is not permitted (and makes no sense).
|
||||||
|
|
||||||
|
- **Invalid range; ... is greater than ...**
|
||||||
|
|
||||||
|
The **-from** episode number must be less than or equal to the **-to** number.
|
||||||
|
|
||||||
|
- **Invalid range; range is too big (>20)**
|
||||||
|
|
||||||
|
The difference between the starting and ending episode number is greater than
|
||||||
|
20.
|
||||||
|
|
||||||
|
- **Invalid - too many '%d' sequences in '...'**
|
||||||
|
|
||||||
|
There were more than two '%d' sequences in the the name of the output file if
|
||||||
|
a range of episodes is being processed, or more than one if a single episode
|
||||||
|
has been specified.
|
||||||
|
|
||||||
|
- **Invalid - too few '%d' sequences in '...'**
|
||||||
|
|
||||||
|
There were fewer than two '%d' sequences in the the name of the output file
|
||||||
|
when a range of episodes was being processed.
|
||||||
|
|
||||||
|
- **Unable to open ... for output: ...**
|
||||||
|
|
||||||
|
The script was unable to open the requested output file.
|
||||||
|
|
||||||
|
- **Unable to find or download ...**
|
||||||
|
|
||||||
|
The script has not found a _.WAV_ file in the cache area so has attempted to
|
||||||
|
download the _MP3_ copy of the audio from the HPR website. This process has
|
||||||
|
failed.
|
||||||
|
|
||||||
|
- **Failed to find requested episode**
|
||||||
|
|
||||||
|
An episode number could not be found in the database. This error is not fatal.
|
||||||
|
|
||||||
|
- **Nothing to do**
|
||||||
|
|
||||||
|
After processing the range of episodes specified the script could not find
|
||||||
|
anything to do. This is most often caused by all of the episodes in the range
|
||||||
|
being invalid.
|
||||||
|
|
||||||
|
- **Aborted due to missing summaries and/or tags**
|
||||||
|
|
||||||
|
One or more of the shows being processed does not have a summary or tags. The
|
||||||
|
script has been told not to ignore this so has aborted before generating
|
||||||
|
metadata.
|
||||||
|
|
||||||
|
- **HTML::TreeBuilder failed to parse notes: ...**
|
||||||
|
|
||||||
|
The script failed to parse the HTML in the notes of one of the episodes. This
|
||||||
|
indicates a serious problem with these notes and is fatal since these notes
|
||||||
|
need to be corrected before the episode is uploaded to the Internet Archive.
|
||||||
|
|
||||||
|
- **HTML::TreeBuilder failed to process ...: ...**
|
||||||
|
|
||||||
|
While parsing the HTML in a related file the parse has failed. The file being
|
||||||
|
parsed is reported as well as the error that was encountered. This is likely
|
||||||
|
due to bad HTML.
|
||||||
|
|
||||||
|
- **Unable to open ... for writing: ...**
|
||||||
|
|
||||||
|
The script is attempting to open an HTML file which it has downloaded to
|
||||||
|
write back edited HTML, yet the open has failed. The filename is in the error
|
||||||
|
message as is the cause of the error.
|
||||||
|
|
||||||
|
# CONFIGURATION AND ENVIRONMENT
|
||||||
|
|
||||||
|
This script reads two configuration files in **Config::General** format
|
||||||
|
(similar to Apache configuration files) for the path to the files to be
|
||||||
|
uploaded and for credentials to access the HPR database. Two files are used
|
||||||
|
because the database configuration file is used by several other scripts.
|
||||||
|
|
||||||
|
The general configuration file is **.make\_metadata.cfg** (although this can be
|
||||||
|
overridden through the **-config=FILE** option) and contains the following
|
||||||
|
lines:
|
||||||
|
|
||||||
|
uploads = "<path to files>"
|
||||||
|
filetemplate = "hpr%04d.%s"
|
||||||
|
baseURL = "http://hackerpublicradio.org"
|
||||||
|
URLtemplate = "http://hackerpublicradio.org/local/%s"
|
||||||
|
IAURLtemplate = "http://archive.org/download/%s/%s"
|
||||||
|
|
||||||
|
The _uploads_ line defines where the WAV files are to be found (currently
|
||||||
|
_/var/IA/uploads_ on the VPS). The same area is used to store downloaded MP3
|
||||||
|
files and any supplementary files associated with the episode.
|
||||||
|
|
||||||
|
The _filetemplate_ line defines the format of an audio file such as
|
||||||
|
_hpr1234.wav_. This should not be changed.
|
||||||
|
|
||||||
|
The _baseURL_ line defines the common base for download URLs. It is used when
|
||||||
|
parsing and standardising URLs relating to files on the HPR server.
|
||||||
|
|
||||||
|
The _URLtemplate_ line defines the format of the URL required to download the
|
||||||
|
MP3 audio. This should not be changed except in the unlikely event that the
|
||||||
|
location of audio files on the server changes.
|
||||||
|
|
||||||
|
The _IAURLtemplate_ line defines the format of URLs on archive.org which is
|
||||||
|
used when generating new links in HTML notes or supplementary files.
|
||||||
|
|
||||||
|
The database configuration file is **.hpr\_db.cfg** (although this can be
|
||||||
|
overridden through the **-dbconfig=FILE** option).
|
||||||
|
|
||||||
|
The layout of the file should be as follows:
|
||||||
|
|
||||||
|
<database>
|
||||||
|
host = 127.0.0.1
|
||||||
|
port = PORT
|
||||||
|
name = DATABASE
|
||||||
|
user = USERNAME
|
||||||
|
password = PASSWORD
|
||||||
|
</database>
|
||||||
|
|
||||||
|
# DEPENDENCIES
|
||||||
|
|
||||||
|
Carp
|
||||||
|
Config::General
|
||||||
|
DBI
|
||||||
|
Data::Dumper
|
||||||
|
File::Find::Rule
|
||||||
|
File::Path
|
||||||
|
Getopt::Long
|
||||||
|
HTML::Entities
|
||||||
|
HTML::TreeBuilder
|
||||||
|
IO::HTML
|
||||||
|
LWP::Simple
|
||||||
|
List::MoreUtils
|
||||||
|
List::Util
|
||||||
|
Pod::Usage
|
||||||
|
Text::CSV_XS
|
||||||
|
|
||||||
|
# BUGS AND LIMITATIONS
|
||||||
|
|
||||||
|
There are no known bugs in this module.
|
||||||
|
Please report problems to Dave Morriss (Dave.Morriss@gmail.com)
|
||||||
|
Patches are welcome.
|
||||||
|
|
||||||
|
# AUTHOR
|
||||||
|
|
||||||
|
Dave Morriss (Dave.Morriss@gmail.com)
|
||||||
|
|
||||||
|
# LICENCE AND COPYRIGHT
|
||||||
|
|
||||||
|
Copyright (c) 2014-2019 Dave Morriss (Dave.Morriss@gmail.com).
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This module is free software; you can redistribute it and/or
|
||||||
|
modify it under the same terms as Perl itself. See perldoc perlartistic.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
<!--
|
||||||
|
vim: syntax=markdown:ts=8:sw=4:ai:et:tw=78:fo=tcqn:fdm=marker
|
||||||
|
-->
|
566
make_shownotes.md
Normal file
566
make_shownotes.md
Normal file
@ -0,0 +1,566 @@
|
|||||||
|
# NAME
|
||||||
|
|
||||||
|
make\_shownotes - Make HTML show notes for the Hacker Public Radio Community News show
|
||||||
|
|
||||||
|
# VERSION
|
||||||
|
|
||||||
|
This documentation refers to **make\_shownotes** version 0.1.3
|
||||||
|
|
||||||
|
# USAGE
|
||||||
|
|
||||||
|
make_shownotes [-help] [-doc] [-from=DATE] [-[no]comments]
|
||||||
|
[-[no]markcomments] [-[no]ctext] [-lastrecording=DATETIME]
|
||||||
|
[-[no]silent] [-out=FILE] [-episode=[N|auto]] [-[no]overwrite]
|
||||||
|
[-mailnotes[=FILE]] [-anyotherbusiness=FILE] [-template=FILE]
|
||||||
|
[-config=FILE] [-interlock=PASSWORD]
|
||||||
|
|
||||||
|
# OPTIONS
|
||||||
|
|
||||||
|
- **-help**
|
||||||
|
|
||||||
|
Displays a brief help message describing the usage of the program, and then exits.
|
||||||
|
|
||||||
|
- **-doc**
|
||||||
|
|
||||||
|
Displays the entirety of the documentation (using a pager), and then exits. To
|
||||||
|
generate a PDF version use:
|
||||||
|
|
||||||
|
pod2pdf make_shownotes --out=make_shownotes.pdf
|
||||||
|
|
||||||
|
- **-from=DATE**
|
||||||
|
|
||||||
|
This option is used to indicate the month for which the shownotes are to be
|
||||||
|
generated. The script is able to parse a variety of date formats, but it is
|
||||||
|
recommended that ISO8601 YYYY-MM-DD format be used (for example 2014-06-30).
|
||||||
|
|
||||||
|
The day part of the date is ignored and only the month and year parts are
|
||||||
|
used.
|
||||||
|
|
||||||
|
If this option is omitted the current month is used.
|
||||||
|
|
||||||
|
- **-\[no\]comments**
|
||||||
|
|
||||||
|
This option controls whether the comments pertaining to the selected month are
|
||||||
|
included in the output. If the option is omitted then no comments are included
|
||||||
|
(**-nocomments**).
|
||||||
|
|
||||||
|
- **-\[no\]markcomments** or **-\[no\]mc**
|
||||||
|
|
||||||
|
This option controls whether certain comments are marked in the HTML. The
|
||||||
|
default is **-nomarkcomments**. The option can be abbreviated to **-mc** and
|
||||||
|
**-nomc**.
|
||||||
|
|
||||||
|
The scenario is that we want to use the notes the script is generating while
|
||||||
|
making a Community News recording and we also want them to be the show notes
|
||||||
|
in the database once the show has been released.
|
||||||
|
|
||||||
|
Certain comments relating to shows earlier than this month were already
|
||||||
|
discussed last month because they were made before that show was recorded. We
|
||||||
|
don't want to read them again during this show, so a means of marking them is
|
||||||
|
needed.
|
||||||
|
|
||||||
|
The script determines the date of the last recording (or it can be specified
|
||||||
|
with the **-lastrecording=DATETIME** option, or its abbreviation
|
||||||
|
**-lr=DATETIME**) and passes it to the template. The template can then compare
|
||||||
|
this date with the dates of the relevant comments and take action to highlight
|
||||||
|
those we don't want to re-read. It is up to the template to do what is
|
||||||
|
necessary to highlight them.
|
||||||
|
|
||||||
|
The idea is that we will turn off the marking before the notes are released
|
||||||
|
\- they are just for use by the people recording the episode.
|
||||||
|
|
||||||
|
Another action is taken during the processing of comments when this option is
|
||||||
|
on. On some months of the year the recording is made during the month itself
|
||||||
|
because the first Monday of the next month is in the first few days of that
|
||||||
|
month. For example, in March 2019 the date of recording is the 30th, and the
|
||||||
|
show is released on April 1st. Between the recording and the release of the
|
||||||
|
show there is time during which more comments could be submitted.
|
||||||
|
|
||||||
|
Such comments should be in the notes for March (and these can be regenerated
|
||||||
|
to make sure this is so) but they will not have been read on the March
|
||||||
|
recording. The **make\_shownotes** script detects this problem and, if
|
||||||
|
**-markcomments** is set (and comments enabled) will show a list of any
|
||||||
|
eligible comments in a red highlighted box. This is so that the volunteers
|
||||||
|
recording the show can ensure they read comments that have slipped through
|
||||||
|
this loophole. The display shows the entire comment including the contents,
|
||||||
|
but disappears when the notes are refreshed with **-nomarkcomments** (the
|
||||||
|
default).
|
||||||
|
|
||||||
|
In this mode the preamble warning about comments to be ignored used to be
|
||||||
|
included, but now it is skipped if there are no such comments. This means one
|
||||||
|
switch can serve two purposes.
|
||||||
|
|
||||||
|
- **-lastrecording=DATETIME** or **-lr=DATETIME**
|
||||||
|
|
||||||
|
As mentioned for **-markcomments**, the date of the last recording can be
|
||||||
|
computed in the assumption that it's on the Saturday before the first Monday
|
||||||
|
of the month at 18:00. However, on rare occasions it may be necessary to
|
||||||
|
record on an earlier date and time, which cannot be computed. This value can
|
||||||
|
be defined with this option.
|
||||||
|
|
||||||
|
The format can be an ISO 8601 date followed by a 24-hour time, such as
|
||||||
|
'2020-01-25 18:00'. If the time is omitted it defaults to 18:00.
|
||||||
|
|
||||||
|
- **-\[no\]ctext**
|
||||||
|
|
||||||
|
This option controls whether the comment text itself is listed with comments.
|
||||||
|
This is controlled by the template, but the current default template only
|
||||||
|
shows the text in the **Past shows** section of the output. The default
|
||||||
|
state is **-noctext** in which the comment texts are not written.
|
||||||
|
|
||||||
|
- **-\[no\]silent**
|
||||||
|
|
||||||
|
This option controls whether the script reports details of its progress
|
||||||
|
to STDERR. If the option is omitted the report is generated (**-nosilent**).
|
||||||
|
|
||||||
|
The script reports: the month it is working on, the name of the output file
|
||||||
|
(if appropriate) and details of the process of writing notes to the database
|
||||||
|
(if the **-episode=\[N|auto\]** option is selected).
|
||||||
|
|
||||||
|
- **-mailnotes\[=FILE\]**
|
||||||
|
|
||||||
|
If desired, the show notes may include a section about recent discussions on
|
||||||
|
the HPR mailing list. Obviously, this text will change every month, so this
|
||||||
|
option provides a way in which an external file can be included in the show
|
||||||
|
notes.
|
||||||
|
|
||||||
|
The filename may be omitted which is a way in which a **BLOCK** directive can
|
||||||
|
be placed in the template and used rather than the file. The **BLOCK** must be
|
||||||
|
named **default\_mail** because this is the name the script uses in this
|
||||||
|
circumstance. See **shownote\_template8.tpl** for an example of its use.
|
||||||
|
|
||||||
|
The template must contain instructions to include the file or block. The file
|
||||||
|
name is stored in a variable '**includefile**' in the template. Directives of
|
||||||
|
the following form may be added to achive this:
|
||||||
|
|
||||||
|
[%- IF includefile.defined %]
|
||||||
|
Constant header, preamble, etc
|
||||||
|
[%- INCLUDE $includefile %]
|
||||||
|
Other constant text or tags
|
||||||
|
[%- END %]
|
||||||
|
|
||||||
|
The first directive causes the whole block to be ignored if there is no
|
||||||
|
**-mailnotes** option. The use of the **INCLUDE** directive means that the
|
||||||
|
included file may contain Template directives itself if desired.
|
||||||
|
|
||||||
|
See existing templates for examples of how this is done.
|
||||||
|
|
||||||
|
- **-anyotherbusiness=FILE** or **-aob=FILE**
|
||||||
|
|
||||||
|
If desired the shownotes may contain an 'Any other business' section. This is
|
||||||
|
implemented in a template thus:
|
||||||
|
|
||||||
|
[% IF aob == 1 -%]
|
||||||
|
<h2>Any other business</h2>
|
||||||
|
[% INCLUDE $aobfile -%]
|
||||||
|
[%- END %]
|
||||||
|
|
||||||
|
The template variable **aob** is set to 1 if a (valid) file has been provided,
|
||||||
|
and the name of the file is in **aobfile**.
|
||||||
|
|
||||||
|
The included file is assumed to be HTML.
|
||||||
|
|
||||||
|
- **-out=FILE**
|
||||||
|
|
||||||
|
This option defines an output file to receive the show notes. If the option is
|
||||||
|
omitted the notes are written to STDOUT, allowing them to be redirected if
|
||||||
|
required.
|
||||||
|
|
||||||
|
The output file name may contain the characters '**%s**'. This denotes the point
|
||||||
|
at which the year and month in the format **YYYY-MM** are inserted. For example
|
||||||
|
if the script is being run for July 2014 the option:
|
||||||
|
|
||||||
|
-out=shownotes_%s.html
|
||||||
|
|
||||||
|
will cause the generation of the file:
|
||||||
|
|
||||||
|
shownotes_2014-07.html
|
||||||
|
|
||||||
|
- **-episode=\[N|auto\]**
|
||||||
|
|
||||||
|
This option provides a means of specifying an episode number in the database to
|
||||||
|
receive the show notes.
|
||||||
|
|
||||||
|
It either takes a number, or it takes the string '**auto**' which makes the
|
||||||
|
script find the correct show number.
|
||||||
|
|
||||||
|
First the episode number has to have been reserved in the database. This is
|
||||||
|
done by running the script '**reserve\_cnews**'. This makes a reservation with
|
||||||
|
the title "HPR Community News for <monthname> <year>". Normally Community News
|
||||||
|
slots are reserved several months in advance.
|
||||||
|
|
||||||
|
Close to the date of the Community News show recording this script can be run
|
||||||
|
to write show notes to the database. For example:
|
||||||
|
|
||||||
|
./make_shownotes -from=1-Dec-2014 -out=/dev/null \
|
||||||
|
-comm -tem=shownote_template5.tpl -ep=auto
|
||||||
|
|
||||||
|
This will search for the episode with the title "HPR Community News for
|
||||||
|
December 2014" and will add notes if the field is empty. Note that it is
|
||||||
|
necessary to direct the output to /dev/null since the script needs to write
|
||||||
|
a copy of the notes to STDOUT or to a file. In this case we request comments
|
||||||
|
to be added to the notes, and we use the template file
|
||||||
|
**shownote\_template5.tpl** which generates an HTML snippet suitable for the
|
||||||
|
database.
|
||||||
|
|
||||||
|
The writing of the notes to the database will fail if the field is not empty.
|
||||||
|
See the **-overwrite** option for how to force the notes to be written.
|
||||||
|
|
||||||
|
If the **-episode=\[N|auto\]** option is omitted no attempt is made to write to
|
||||||
|
the database.
|
||||||
|
|
||||||
|
- **-\[no\]overwrite**
|
||||||
|
|
||||||
|
This option is only relevant in conjunction with the **-episode=\[N|auto\]**
|
||||||
|
option. If **-overwrite** is chosen the new show notes will overwrite any notes
|
||||||
|
already in the database. If **-nooverwrite** is selected, or the option is
|
||||||
|
omitted, no over writing will take place - it will only be possible to write
|
||||||
|
notes to the database if the field is empty.
|
||||||
|
|
||||||
|
- **-template=FILE**
|
||||||
|
|
||||||
|
This option defines the template used to generate the notes. The template is
|
||||||
|
written using the **Template** toolkit language.
|
||||||
|
|
||||||
|
If the option is omitted then the script uses the file
|
||||||
|
**shownote\_template.tpl** in the same directory as the script. If this file
|
||||||
|
does not exist then the script will exit with an error message.
|
||||||
|
|
||||||
|
For convenience **shownote\_template.tpl** is a soft link which points to the
|
||||||
|
file which is the current default. This allows the development of versions
|
||||||
|
without changing the usual way this script is run.
|
||||||
|
|
||||||
|
- **-config=FILE**
|
||||||
|
|
||||||
|
This option allows an alternative configuration file to be used. This file
|
||||||
|
defines the location of the database, its port, its name and the username and
|
||||||
|
password to be used to access it. This feature was added to allow the script
|
||||||
|
to access alternative databases or the live database over an SSH tunnel.
|
||||||
|
|
||||||
|
See the CONFIGURATION AND ENVIRONMENT section below for the file format.
|
||||||
|
|
||||||
|
If the option is omitted the default file is used: **.hpr\_db.cfg**
|
||||||
|
|
||||||
|
- **-interlock=PASSWORD**
|
||||||
|
|
||||||
|
This option was added to handle the case where the notes for a Community News
|
||||||
|
episode have been posted after the show was recorded, but, since the recording
|
||||||
|
date was not the last day of the month further comments could be added after
|
||||||
|
upload. Logically these comments belong in the previous month's shownotes, so
|
||||||
|
we'd need to add them retrospecively.
|
||||||
|
|
||||||
|
Up until the addition of this option the script would not allow the
|
||||||
|
regeneration of the notes. This option requires a password to enable the
|
||||||
|
feature, but the password is in a constant inside the script. This means that
|
||||||
|
it's difficult to run in this mode by accident, but not particulary difficult
|
||||||
|
if it's really needed.
|
||||||
|
|
||||||
|
Take care not to run in this mode if the notes have been edited after they
|
||||||
|
were generated!
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This script generates notes for the next Hacker Public Radio _Community News_
|
||||||
|
show. It does this by collecting various details of activity from the HPR
|
||||||
|
database and passing them to a template. The default template is called
|
||||||
|
**shownote\_template.tpl** and this generates HTML, but any suitable textual
|
||||||
|
format could be generated if required, by using a different template.
|
||||||
|
|
||||||
|
## Data Gathering
|
||||||
|
|
||||||
|
Four types of information are collected by the script:
|
||||||
|
|
||||||
|
- -
|
||||||
|
|
||||||
|
Details of new hosts who have released new shows in the selected month
|
||||||
|
|
||||||
|
- -
|
||||||
|
|
||||||
|
Details of shows which have been released in the selected month
|
||||||
|
|
||||||
|
- -
|
||||||
|
|
||||||
|
Details of topics on the mailing list in the past month can be included. This
|
||||||
|
is only done if the **-mailnotes=FILE** option is used. This option must
|
||||||
|
reference a file of HTML, which may contain Template directives if required.
|
||||||
|
|
||||||
|
- -
|
||||||
|
|
||||||
|
Comments which have been submitted to the HPR website in the selected month.
|
||||||
|
These need to be related to shows in the current period or in the past.
|
||||||
|
Comments made about shows which have not yet been released (but are visible on
|
||||||
|
the website) are not included even though they are made in the current month.
|
||||||
|
|
||||||
|
Comments are only gathered if the **-comments** option is selected.
|
||||||
|
|
||||||
|
## Report Generation
|
||||||
|
|
||||||
|
The four components listed above are formatted in the following way by the
|
||||||
|
default template.
|
||||||
|
|
||||||
|
- **New Hosts**
|
||||||
|
|
||||||
|
These are formatted as a list of links to the hostid with the host's name.
|
||||||
|
|
||||||
|
- **Shows**
|
||||||
|
|
||||||
|
These are formatted into an HTML table containing the show number, title and
|
||||||
|
host name. The show title is a link to the show page on the HPR website. The
|
||||||
|
host name is a link to the host page on the website.
|
||||||
|
|
||||||
|
- **Mailing list discussions**
|
||||||
|
|
||||||
|
If there have been significant topics on the mailing list in the month in
|
||||||
|
question then these can be summarised in this section. This is done by
|
||||||
|
preparing an external HTML file and referring to it with the
|
||||||
|
**-mailnotes=FILE** option. If this is done then the file is included into the
|
||||||
|
template.
|
||||||
|
|
||||||
|
See the explanation of the **-mailnotes** option for more details.
|
||||||
|
|
||||||
|
- **Comments**
|
||||||
|
|
||||||
|
These are formatted with <article> tags separated by horizontal lines.
|
||||||
|
A <header> shows the author name and title and a <footer> displays a link to
|
||||||
|
the show and the show's host and the show title is also included. The body of
|
||||||
|
the article contains the comment text with line breaks.
|
||||||
|
|
||||||
|
## Variable, Field and Hash names
|
||||||
|
|
||||||
|
If you wish to write your own template refer to the following lists for the
|
||||||
|
names of items. Also refer to the default template **shownote\_template.tpl**
|
||||||
|
for the techniques used there. (Note that **shownote\_template.tpl** is a link
|
||||||
|
to the current default template, such as **shownote\_template8.tpl**).
|
||||||
|
|
||||||
|
The hash and field names available to the template are as follows
|
||||||
|
|
||||||
|
- **Global variables**
|
||||||
|
|
||||||
|
Variable Name Details
|
||||||
|
------------- -------
|
||||||
|
review_month The month name of the report date
|
||||||
|
review_year The year of the report date
|
||||||
|
comment_count The number of comments in total
|
||||||
|
past_count The number of comments on old shows
|
||||||
|
skip_comments Set when -comments is omitted
|
||||||
|
mark_comments Set when -markcomments is used
|
||||||
|
ctext Set when the comment bodies in the 'Past shows'
|
||||||
|
section are to be shown
|
||||||
|
last_recording The date the last recording was made
|
||||||
|
(computed if -markcomments is selected) in
|
||||||
|
Unixtime format
|
||||||
|
last_month The month prior to the month for which the notes are
|
||||||
|
being generated (computed if -markcomments is
|
||||||
|
selected) in 'YYYY-MM' format
|
||||||
|
|
||||||
|
- **New Hosts**
|
||||||
|
|
||||||
|
The name of the hash in the template is **hosts**. The hash might be empty if
|
||||||
|
there are no new hosts in the month. See the default template for how to
|
||||||
|
handle this.
|
||||||
|
|
||||||
|
Field Name Details
|
||||||
|
---------- -------
|
||||||
|
host Name of host
|
||||||
|
hostid Host id number
|
||||||
|
|
||||||
|
- **Show Details**
|
||||||
|
|
||||||
|
The name of the hash in the template is **shows**. Note that there are more
|
||||||
|
fields available than are used in the default template. Note also that certain
|
||||||
|
field names are aliases to avoid clashes (e.g. eps\_hostid and ho\_hostid).
|
||||||
|
|
||||||
|
Field Name Details
|
||||||
|
---------- -------
|
||||||
|
eps_id Episode number
|
||||||
|
date Episode date
|
||||||
|
title Episode title
|
||||||
|
length Episode duration
|
||||||
|
summary Episode summary
|
||||||
|
notes Episode show notes
|
||||||
|
eps_hostid The numerical host id from the 'eps' table
|
||||||
|
series The series number from the 'eps' table
|
||||||
|
explicit The explicit marker for the show
|
||||||
|
eps_license The license for the show
|
||||||
|
tags The show's tags as a comma-delimited string
|
||||||
|
version ?Obsolete?
|
||||||
|
eps_valid The valid value from the 'eps' table
|
||||||
|
ho_hostid The host id number form the 'hosts' table
|
||||||
|
ho_host The host name
|
||||||
|
email The hosts's email address (true address - caution)
|
||||||
|
profile The host's profile
|
||||||
|
ho_license The default license for the host
|
||||||
|
ho_valid The valid value from the 'hosts' table
|
||||||
|
|
||||||
|
- **Mailing List Notes**
|
||||||
|
|
||||||
|
The variable **includefile** contains the path to the file (which may only be
|
||||||
|
located in the same directory as the script).
|
||||||
|
|
||||||
|
- **Comment Details**
|
||||||
|
|
||||||
|
Two hashes are created for comments. The hash named **past** contains comments
|
||||||
|
to shows before the current month, and **current** contains comments to this
|
||||||
|
month's shows. Note that these hashes are only populated if the **-comments**
|
||||||
|
option is provided. Both hashes have the same structure.
|
||||||
|
|
||||||
|
Field Name Details
|
||||||
|
---------- -------
|
||||||
|
episode Episode number
|
||||||
|
identifier_url Full show URL
|
||||||
|
title Episode title
|
||||||
|
date Episode date
|
||||||
|
host Host name
|
||||||
|
hostid Host id number
|
||||||
|
timestamp Comment timestamp in ISO8601 format
|
||||||
|
comment_author_name Name of the commenter
|
||||||
|
comment_title Title of comment
|
||||||
|
comment_text Text of the comment
|
||||||
|
comment_timestamp_ut Comment timestamp in Unixtime format
|
||||||
|
in_range Boolean (0/1) denoting whether the comment was made
|
||||||
|
in the target month
|
||||||
|
index The numerical index of the comment for a given show
|
||||||
|
|
||||||
|
The purpose of the **in\_range** value is to denote whether a comment was made
|
||||||
|
in the target month. This is used in the script to split the comments into the
|
||||||
|
**past** and **current** hashes. It is therefore of little use in the template,
|
||||||
|
but is retained in case it might be useful. The **index** value can be used in
|
||||||
|
the template to refer to the comment, make linking URLs etc. It is generated
|
||||||
|
by the script (unfortunately it couldn't be done in the SQL).
|
||||||
|
|
||||||
|
## Filters
|
||||||
|
|
||||||
|
A filter called **decode\_entities** is available to the template. The reason
|
||||||
|
for creating this was when the HTML of a comment is being listed as text
|
||||||
|
(Unicode actually). Since comment text is stored in the database as HTML with
|
||||||
|
entities when appropriate this is needed to prevent the plain text showing
|
||||||
|
_&amp;_ and the like verbatim. It is currently used in **comments\_only.tpl**.
|
||||||
|
|
||||||
|
# DIAGNOSTICS
|
||||||
|
|
||||||
|
- **Unable to find configuration file ...**
|
||||||
|
|
||||||
|
The nominated configuration file in **-config=FILE** (or the default file)
|
||||||
|
cannot be found.
|
||||||
|
|
||||||
|
- **Episode number must be greater than zero**
|
||||||
|
|
||||||
|
The **-episode=N** option must use a positive number.
|
||||||
|
|
||||||
|
- **Episode must be a number or 'auto'**
|
||||||
|
|
||||||
|
The **-episode=** option must be followed by a number or the word 'auto'
|
||||||
|
|
||||||
|
- **Error: Unable to find includefile ...**
|
||||||
|
|
||||||
|
The include file referred to in the error message is missing.
|
||||||
|
|
||||||
|
- **Error: Unable to find template ...**
|
||||||
|
|
||||||
|
The template file referred to in the error message is missing.
|
||||||
|
|
||||||
|
- **Invalid -from=DATE option '...'**
|
||||||
|
|
||||||
|
The date provided through the **-from=DATE** option is invalid. Use an ISO8601
|
||||||
|
date in the format YYYY-MM-DD.
|
||||||
|
|
||||||
|
- **Unable to open ... for writing: ...**
|
||||||
|
|
||||||
|
The file specified in the **-out=FILE** option cannot be written to. This may
|
||||||
|
be because you do not have permission to write to the file or directory.
|
||||||
|
Further information about why this failed should be included in the message.
|
||||||
|
|
||||||
|
- **Unable to initialise for writing: ...**
|
||||||
|
|
||||||
|
The script was unable to open STDOUT for writing the report. Further
|
||||||
|
information about why this failed should be included in the message.
|
||||||
|
|
||||||
|
- **Error: wrong show selected**
|
||||||
|
|
||||||
|
The **-episode=N** option has been selected and the script is checking the
|
||||||
|
numbered show but has not found a Community News title.
|
||||||
|
|
||||||
|
- **Error: show ... has a date in the past**
|
||||||
|
|
||||||
|
The **-episode=** option has been selected and a Community News show entry has
|
||||||
|
been found in the database. However, this entry is for today's show or is in
|
||||||
|
the past, which is not permitted. It is possible to override this restriction
|
||||||
|
by using the **-interlock=PASSWORD** option. See the relevant documentation for
|
||||||
|
details.
|
||||||
|
|
||||||
|
- **Error: show ... already has notes**
|
||||||
|
|
||||||
|
The **-episode=** option has been selected and a Community News show entry has
|
||||||
|
been found in the database. However, this entry already has notes associated
|
||||||
|
with it and the **-overwrite** option has not been specified.
|
||||||
|
|
||||||
|
- **Error: episode ... does not exist in the database**
|
||||||
|
|
||||||
|
The **-episode=N** option has been selected but the script cannot find this
|
||||||
|
episode number in the database.
|
||||||
|
|
||||||
|
- **Error: Unable to find an episode for this month's notes**
|
||||||
|
|
||||||
|
The **-episode=auto** option has been selected but the script cannot find the
|
||||||
|
episode for the month being processed.
|
||||||
|
|
||||||
|
Possible reasons for this are that the show has not been reserved in the
|
||||||
|
database or that the title is not as expected. Use **reserve\_cnews** to reserve
|
||||||
|
the slot. The title should be "HPR Community News for <monthname> <year>".
|
||||||
|
|
||||||
|
# CONFIGURATION AND ENVIRONMENT
|
||||||
|
|
||||||
|
The script obtains the credentials it requires to open the HPR database from
|
||||||
|
a configuration file. The name of the file it expects is **.hpr\_db.cfg** in the
|
||||||
|
directory holding the script. To change this will require changing the script.
|
||||||
|
|
||||||
|
The configuration file format is as follows:
|
||||||
|
|
||||||
|
<database>
|
||||||
|
host = 127.0.0.1
|
||||||
|
port = PORT
|
||||||
|
name = DATABASE
|
||||||
|
user = USERNAME
|
||||||
|
password = PASSWORD
|
||||||
|
</database>
|
||||||
|
|
||||||
|
# DEPENDENCIES
|
||||||
|
|
||||||
|
Carp
|
||||||
|
Config::General
|
||||||
|
Date::Calc
|
||||||
|
Date::Parse
|
||||||
|
DateTime
|
||||||
|
DateTime::Duration
|
||||||
|
DBI
|
||||||
|
Getopt::Long
|
||||||
|
Pod::Usage
|
||||||
|
Template
|
||||||
|
Template::Filters
|
||||||
|
|
||||||
|
# BUGS AND LIMITATIONS
|
||||||
|
|
||||||
|
There are no known bugs in this module.
|
||||||
|
Please report problems to Dave Morriss (Dave.Morriss@gmail.com)
|
||||||
|
Patches are welcome.
|
||||||
|
|
||||||
|
# AUTHOR
|
||||||
|
|
||||||
|
Dave Morriss (Dave.Morriss@gmail.com)
|
||||||
|
|
||||||
|
# LICENCE AND COPYRIGHT
|
||||||
|
|
||||||
|
Copyright (c) 2014-2019 Dave Morriss (Dave.Morriss@gmail.com). All rights reserved.
|
||||||
|
|
||||||
|
This module is free software; you can redistribute it and/or
|
||||||
|
modify it under the same terms as Perl itself. See perldoc perlartistic.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
---
|
||||||
|
Back to [Community_News](Community-News) page
|
||||||
|
|
49
past_upload.md
Normal file
49
past_upload.md
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
```
|
||||||
|
past_upload - version: 0.0.6
|
||||||
|
|
||||||
|
Usage: ./past_upload [-h] [-r] [-v] [-d {0|1}] start [count]
|
||||||
|
|
||||||
|
Generates the necessary metadata and script and uses them to upload HPR audio
|
||||||
|
and other show-related files held on the VPS to the Internet Archive. This
|
||||||
|
script is similar to 'weekly_upload' but it's for dealing with older shows
|
||||||
|
where we only have the MP3 audio.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h Print this help
|
||||||
|
-v Run in verbose mode where more information is reported
|
||||||
|
-d 0|1 Dry run: -d 1 (the default) runs the script in dry-run
|
||||||
|
mode where nothing is changed but the actions that
|
||||||
|
will be taken are reported; -d 0 turns off dry-run
|
||||||
|
mode and the actions will be carried out.
|
||||||
|
-r Run in 'remote' mode, using the live database over an
|
||||||
|
(already established) SSH tunnel. Default is to run
|
||||||
|
against the local database.
|
||||||
|
-Y Answer 'Y' to the confirmation question (really don't
|
||||||
|
ask at all)
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
start the starting show number to be uploaded
|
||||||
|
count (optional, default 1) the number of shows to be
|
||||||
|
uploaded; cannot exceed 20
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
1. When running on 'borg' the method used is to run in faux 'local' mode.
|
||||||
|
This means we have an open tunnel to the HPR server (mostly left open) and
|
||||||
|
the default file .hpr_db.cfg points to the live database via this tunnel.
|
||||||
|
So we do not use the -r option here. This is a bit of a hack! Sorry!
|
||||||
|
|
||||||
|
TODO: Needs fix!
|
||||||
|
|
||||||
|
2. There are potential problems when a show has no tags which haven't been
|
||||||
|
fully resolved. The make_metadata script fails in default mode when it
|
||||||
|
finds such a show, but this (weekly_upload) script can continue on and run
|
||||||
|
the generated script which uploads the source audio files. This can mean
|
||||||
|
the IA items end up as books! In this mode the description is not stored
|
||||||
|
and so there are no show notes.
|
||||||
|
```
|
||||||
|
|
||||||
|
<!--
|
||||||
|
vim: syntax=markdown:ts=8:sw=4:ai:et:tw=78:fo=tcqn:fdm=marker
|
||||||
|
-->
|
||||||
|
|
444
process_comments.md
Normal file
444
process_comments.md
Normal file
@ -0,0 +1,444 @@
|
|||||||
|
# NAME
|
||||||
|
|
||||||
|
process\_comments
|
||||||
|
|
||||||
|
> Process incoming comment files as email messages or JSON files
|
||||||
|
|
||||||
|
# VERSION
|
||||||
|
|
||||||
|
This documentation refers to process\_comments version 0.2.6
|
||||||
|
|
||||||
|
# USAGE
|
||||||
|
|
||||||
|
./process_comments [-help] [-doc] [-debug=N] [-[no]dry-run]
|
||||||
|
[-verbose ...] [-[no]live] [-[no]json] [-config=FILE]
|
||||||
|
|
||||||
|
./process_comments -dry-run
|
||||||
|
./process_comments -debug=3 -dry-run
|
||||||
|
./process_comments -verbose
|
||||||
|
./process_comments -help
|
||||||
|
./process_comments -json
|
||||||
|
./process_comments -config=.hpr_livedb.cfg
|
||||||
|
|
||||||
|
# OPTIONS
|
||||||
|
|
||||||
|
- **-help**
|
||||||
|
|
||||||
|
Prints a brief help message describing the usage of the program, and then exits.
|
||||||
|
|
||||||
|
- **-doc**
|
||||||
|
|
||||||
|
Prints the entire embedded documentation for the program, then exits.
|
||||||
|
|
||||||
|
- **-debug=N**
|
||||||
|
|
||||||
|
Enables debugging mode when N > 0 (zero is the default). The levels are:
|
||||||
|
|
||||||
|
- **1**
|
||||||
|
|
||||||
|
N/A
|
||||||
|
|
||||||
|
- **2**
|
||||||
|
|
||||||
|
N/A
|
||||||
|
|
||||||
|
- **3**
|
||||||
|
|
||||||
|
Prints all of the information described at the previous levels.
|
||||||
|
|
||||||
|
Prints the files found in the mail spool area.
|
||||||
|
|
||||||
|
Prints the internal details of the email, listing the MIME parts (if there are any).
|
||||||
|
|
||||||
|
Prints the length of the MIME part matching the desired type, in lines.
|
||||||
|
|
||||||
|
Prints the entirety of the internal structure holding details of the mail file
|
||||||
|
and the comment it contains. This follows the moderation pass.
|
||||||
|
|
||||||
|
Prints the SQL that has been constructed to update the database.
|
||||||
|
|
||||||
|
- **-\[no\]dry-run**
|
||||||
|
|
||||||
|
Controls the program's _dry-run_ mode. It is off by default. In dry-run mode
|
||||||
|
the program reports what it would do but makes no changes. When off the
|
||||||
|
program makes all the changes it is designed to perform.
|
||||||
|
|
||||||
|
- **-verbose**
|
||||||
|
|
||||||
|
This option may be repeated. For each repetition the level of verbosity is
|
||||||
|
increased. By default no verbosity is in effect and the program prints out the
|
||||||
|
minimal amount of information.
|
||||||
|
|
||||||
|
Verbosity levels:
|
||||||
|
|
||||||
|
- **1**
|
||||||
|
|
||||||
|
Prints the name of each mail (or JSON) file as it's processed.
|
||||||
|
|
||||||
|
Prints any error messages during message validation, which are also being
|
||||||
|
logged (unless in dry-run mode) and saved for reporting later.
|
||||||
|
|
||||||
|
Prints a notification if the comment is added to the database (or that this
|
||||||
|
would have happened in dry-run mode).
|
||||||
|
|
||||||
|
Prints messages about the moving of each mail (or JSON) file from the
|
||||||
|
processing area, along with any errors accumulated for that file. In dry-run
|
||||||
|
mode simply indicates what would have happened.
|
||||||
|
|
||||||
|
Prints the response code received from the server when invoking the interface
|
||||||
|
for updating comment files there. If in dry-run mode the message produced
|
||||||
|
merely indicates what would have happened.
|
||||||
|
|
||||||
|
If validation failed earlier on then further information is produced about the
|
||||||
|
final actions taken on these files.
|
||||||
|
|
||||||
|
- **2**
|
||||||
|
|
||||||
|
Prints the addresses each mail message is being sent to (unless in JSON mode).
|
||||||
|
|
||||||
|
- **3**
|
||||||
|
|
||||||
|
Prints the JSON contents of each mail message (or of each JSON file).
|
||||||
|
|
||||||
|
- **-\[no\]delay**
|
||||||
|
|
||||||
|
This option controls whether the script imposes a delay on comments. The idea
|
||||||
|
is that if comments are used to rant on a subject or to pass misinformation
|
||||||
|
delaying them will help to defuse the situation.
|
||||||
|
|
||||||
|
The default state is **-nodelay**; a delay is not imposed. Selecting **-delay**
|
||||||
|
means that comments have to be at least 24 hours old before they are
|
||||||
|
processed. The length of the delay cannot currently be changed without
|
||||||
|
altering the script.
|
||||||
|
|
||||||
|
- **-\[no\]live**
|
||||||
|
|
||||||
|
This option determines whether the program runs in live mode or not. The
|
||||||
|
default varies depending on which system it is being run on.
|
||||||
|
|
||||||
|
IT SHOULD NOT USUALLY BE NECESSARY TO USE THIS!
|
||||||
|
|
||||||
|
In live mode the program makes changes to the live database and sends messages
|
||||||
|
to the live web interface when a comment has been processed. With live mode
|
||||||
|
off the program assumes it is writing to a clone of the database and it does
|
||||||
|
not inform the webserver that a comment has been processed.
|
||||||
|
|
||||||
|
The default for the copy of the program on the VPS is that live mode is ON.
|
||||||
|
Otherwise the default is that live mode is OFF. The setting is determined by
|
||||||
|
the sed script called **fixup.sed** on the VPS. This needs to be run whenever
|
||||||
|
a new version of the program is released. This is done as follows:
|
||||||
|
|
||||||
|
sed -i -f fixup.sed process_comments
|
||||||
|
|
||||||
|
- **-\[no\]json**
|
||||||
|
|
||||||
|
This option selects JSON mode, which makes the script behave in a different
|
||||||
|
way from the default mode (**-nojson** or MAIL mode) where it processes email
|
||||||
|
containing comments.
|
||||||
|
|
||||||
|
In JSON mode the script looks in a sub-directory called _json/_ where it
|
||||||
|
expects to find JSON files. The normal way in which these files arrive in this
|
||||||
|
directory is by using _scp_ to copy them from the HPR server (the directory
|
||||||
|
is _/home/hpr/comments_). This is a provision in case the normal route of
|
||||||
|
sending out email messages has failed for some reason. It also saves the user
|
||||||
|
from setting up the mail handling infrastructure that would otherwise be
|
||||||
|
needed.
|
||||||
|
|
||||||
|
In JSON mode the mail handling logic is not invoked, files are searched for in
|
||||||
|
the _json/_ directory and each file is processed, moderation is requested and
|
||||||
|
the comment is added to the database. In \`**-live**\` mode the server is informed
|
||||||
|
that the comment has been processed.
|
||||||
|
|
||||||
|
The _json/_ directory needs to have three sub-directories: _processed_,
|
||||||
|
_banned_ and _rejected_. The script will place the processed files into
|
||||||
|
these sub-directories according to the moderation choice made. This makes it
|
||||||
|
easier to see what actions were taken and helps avoid repeated processing of
|
||||||
|
the same comment.
|
||||||
|
|
||||||
|
- **-config=FILE**
|
||||||
|
|
||||||
|
This option defines a configuration file other than the default
|
||||||
|
_.hpr\_db.cfg_. The file must be formatted as described below in the section
|
||||||
|
_CONFIGURATION AND ENVIRONMENT_.
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
A script to process new comments, moderate them and add them to the HPR
|
||||||
|
database.
|
||||||
|
|
||||||
|
In the new HPR comment system (released September 2017) a new web form is
|
||||||
|
presented in association with each show. The form can be used to submit
|
||||||
|
a comment on the show in question and takes some standard fields: the name of
|
||||||
|
the commenter, the title of the comment and the body of the comment itself.
|
||||||
|
|
||||||
|
Once the comment has been submitted its contents are formatted as a JSON
|
||||||
|
object and are sent as a mail attachment to the address
|
||||||
|
_comments@hackerpublicradio.org_.
|
||||||
|
|
||||||
|
Recipients of these mail messages can then perform actions on these comments
|
||||||
|
to cause them to be added to the HPR database. These actions are: approve the
|
||||||
|
comment, block it (because it is inappropriate or some form of Spam and we
|
||||||
|
want to prevent any further messages from the associated IP address), or
|
||||||
|
reject it (delete it). There is also an ignore option which skips the current
|
||||||
|
comment in this run of the script.
|
||||||
|
|
||||||
|
This script can process an entire email message which has been saved to a file
|
||||||
|
or a file containing the JSON object (as in the email attachment). When
|
||||||
|
processing email it is expected that it will be found in a maildrop directory,
|
||||||
|
and when finished the messages will be placed in sub-directories according to
|
||||||
|
what actions were carried out. A similar logic is used for JSON files; they
|
||||||
|
are expected to be in a drop area and are moved to sub-directroies after
|
||||||
|
processing.
|
||||||
|
|
||||||
|
## MAIL HANDLING
|
||||||
|
|
||||||
|
One way of handling incoming mail is to use a mail client which is capable of
|
||||||
|
saving messages sent to the above address in the spool area mentioned earlier.
|
||||||
|
For example, Thunderbird can do this by use of a filter and a plugin. Other
|
||||||
|
MUA's will have similar capabilities.
|
||||||
|
|
||||||
|
When this script is run on the mail spool area it will process all of the
|
||||||
|
files it finds. For each file it will check its validity in various ways,
|
||||||
|
display the comment then offer a moderation menu. The moderation options are
|
||||||
|
described below.
|
||||||
|
|
||||||
|
### APPROVE
|
||||||
|
|
||||||
|
If a comment is approved then it will be added to the database, the associated
|
||||||
|
mail file will be moved to a sub-directory (by default called '_processed_'),
|
||||||
|
and the HPR server will be notified of this action.
|
||||||
|
|
||||||
|
### BAN
|
||||||
|
|
||||||
|
If a comment is banned then it will not be added to the database. The mail
|
||||||
|
file will be moved to the sub-directory '_banned_' and the HPR server will be
|
||||||
|
informed that the IP address associated with the comment should be placed on
|
||||||
|
a black list.
|
||||||
|
|
||||||
|
### REJECT
|
||||||
|
|
||||||
|
If a comment is rejected it is not written to the database, the mail file is
|
||||||
|
moved to the sub-directory '_rejected_' and the HPR server informed that the
|
||||||
|
comment can be deleted.
|
||||||
|
|
||||||
|
### IGNORE
|
||||||
|
|
||||||
|
If a comment is ignored it is simply left in the mail spool and no further
|
||||||
|
processing done on it. It will be eligible for processing again when the
|
||||||
|
script is next run.
|
||||||
|
|
||||||
|
## JSON FILE HANDLING
|
||||||
|
|
||||||
|
As described under the description of the **-\[no\]json** option, the script
|
||||||
|
allows the processing of a multiple JSON files each containing a single
|
||||||
|
comment. The JSON is checked and all of the comment fields are verified, then
|
||||||
|
the moderation process is begun.
|
||||||
|
|
||||||
|
Moderation in this case consists of the same steps as described above except
|
||||||
|
that no mail file actions are taken and the JSON file is moved to
|
||||||
|
a sub-directory after processing.
|
||||||
|
|
||||||
|
# DIAGNOSTICS
|
||||||
|
|
||||||
|
- **Unable to find configuration file ...**
|
||||||
|
|
||||||
|
Type: fatal
|
||||||
|
|
||||||
|
The nominated configuration file referenced in **-config=FILE** was not found.
|
||||||
|
|
||||||
|
- **No mail found; nothing to do**
|
||||||
|
|
||||||
|
Type: fatal
|
||||||
|
|
||||||
|
No mail files were found in the mail spool area requiring processing.
|
||||||
|
|
||||||
|
- **No JSON files found; nothing to do**
|
||||||
|
|
||||||
|
Type: fatal
|
||||||
|
|
||||||
|
No JSON files were found in the JSON spool area requiring processing.
|
||||||
|
|
||||||
|
- **Failed to read JSON file '...' ...**
|
||||||
|
|
||||||
|
Type: fatal
|
||||||
|
|
||||||
|
A JSON file in the spool area could not be read with a JSON parser.
|
||||||
|
|
||||||
|
- **Failed to parse comment timestamp ...**
|
||||||
|
|
||||||
|
Type: fatal
|
||||||
|
|
||||||
|
The timestamp must be converted to a format compatible with MySQL/MariaDB but
|
||||||
|
during this process the parse failed.
|
||||||
|
|
||||||
|
- **Failed to open input file '...' ...**
|
||||||
|
|
||||||
|
Type: fatal
|
||||||
|
|
||||||
|
A mail file in the spool area could not be opened.
|
||||||
|
|
||||||
|
- **Failed to move ...**
|
||||||
|
|
||||||
|
Type: warning
|
||||||
|
|
||||||
|
A mail file could not be moved to the relevant sub-directory.
|
||||||
|
|
||||||
|
- **Failed to close input file '...' ...**
|
||||||
|
|
||||||
|
Type: warning
|
||||||
|
|
||||||
|
A mail file in the spool area could not be closed.
|
||||||
|
|
||||||
|
- **Various error messages from the database subsystem**
|
||||||
|
|
||||||
|
Type: fatal, warning
|
||||||
|
|
||||||
|
An action on the database has been flagged as an error.
|
||||||
|
|
||||||
|
- **Various error messages from the Template toolkit**
|
||||||
|
|
||||||
|
Type: fatal
|
||||||
|
|
||||||
|
An action relating to the template used for the display of the comment has
|
||||||
|
been flagged as an error.
|
||||||
|
|
||||||
|
- **Invalid call to 'call\_back' subroutine; missing key**
|
||||||
|
|
||||||
|
Type: warning
|
||||||
|
|
||||||
|
The routine 'call\_back' was called incorrectly. The key was missing.
|
||||||
|
|
||||||
|
- **Invalid call to 'call\_back' subroutine; invalid action**
|
||||||
|
|
||||||
|
Type: warning
|
||||||
|
|
||||||
|
The routine 'call\_back' was called incorrectly. The action was invalid.
|
||||||
|
|
||||||
|
- **Error from remote server indicating failure**
|
||||||
|
|
||||||
|
Type: warning
|
||||||
|
|
||||||
|
While attempting to send an action to the remote server with the 'call\_back'
|
||||||
|
subroutine an error message was received.
|
||||||
|
|
||||||
|
# CONFIGURATION AND ENVIRONMENT
|
||||||
|
|
||||||
|
## CONFIGURATION
|
||||||
|
|
||||||
|
The script obtains the credentials it requires to open the HPR database from
|
||||||
|
a configuration file. The name of the file it expects is **.hpr\_db.cfg** in the
|
||||||
|
directory holding the script. This can be changed through the **-config=FILE**
|
||||||
|
option if required, though the alternative file must conform to the format
|
||||||
|
below.
|
||||||
|
|
||||||
|
The configuration file format is as follows:
|
||||||
|
|
||||||
|
<database>
|
||||||
|
host = 127.0.0.1
|
||||||
|
port = PORT
|
||||||
|
name = DATABASE
|
||||||
|
user = USERNAME
|
||||||
|
password = PASSWORD
|
||||||
|
</database>
|
||||||
|
|
||||||
|
These settings can be used to connect to an SSH tunnel which has been
|
||||||
|
connected from a remote system (like the VPS) to the live database. Assuming
|
||||||
|
the port chosen for this is 3307 something like the following could be used:
|
||||||
|
|
||||||
|
<database>
|
||||||
|
host = 127.0.0.1
|
||||||
|
port = 3307
|
||||||
|
name = hpr_hpr
|
||||||
|
user = hpr_hpr
|
||||||
|
password = "**censored**"
|
||||||
|
</database>
|
||||||
|
|
||||||
|
A typical Bash script for opening a tunnel might be:
|
||||||
|
|
||||||
|
#!/bin/bash
|
||||||
|
SSHPORT=22
|
||||||
|
LOCALPORT=3307
|
||||||
|
REMOTEPORT=3306
|
||||||
|
ssh -p ${SSHPORT} -f -N -L localhost:${LOCALPORT}:localhost:${REMOTEPORT} hpr@hackerpublicradio.org
|
||||||
|
|
||||||
|
## TEMPLATE
|
||||||
|
|
||||||
|
The program displays the comment that is currently being processed for
|
||||||
|
moderation. It uses a template along with the Perl **Template** module to do
|
||||||
|
this. By default this template is called **process\_comments.tpl**. This can
|
||||||
|
currently be changed only by changing the program itself.
|
||||||
|
|
||||||
|
The template is provided with the following data:
|
||||||
|
|
||||||
|
file a scalar containing the name of the file being processed
|
||||||
|
|
||||||
|
db a hash containing the details of the show to which the
|
||||||
|
comment relates, returned from a database query:
|
||||||
|
id the episode number
|
||||||
|
date the date of the episode
|
||||||
|
title the episode title
|
||||||
|
host the host name
|
||||||
|
|
||||||
|
comment a hash containing the fields from the comment:
|
||||||
|
eps_id the episode number
|
||||||
|
comment_timestamp date and time of the comment
|
||||||
|
comment_author_name comment author
|
||||||
|
comment_title comment title
|
||||||
|
comment_text comment text
|
||||||
|
justification justification for posting (if
|
||||||
|
relevant)
|
||||||
|
key unique comment key
|
||||||
|
|
||||||
|
# DEPENDENCIES
|
||||||
|
|
||||||
|
Carp
|
||||||
|
Config::General
|
||||||
|
DBI
|
||||||
|
Data::Dumper
|
||||||
|
DateTime::Format::ISO8601
|
||||||
|
Encode
|
||||||
|
File::Copy
|
||||||
|
File::Find::Rule
|
||||||
|
File::Slurper
|
||||||
|
Getopt::Long
|
||||||
|
HTML::Entities
|
||||||
|
HTML::Restrict
|
||||||
|
IO::Prompter
|
||||||
|
JSON
|
||||||
|
LWP::UserAgent
|
||||||
|
List::Util
|
||||||
|
Log::Handler
|
||||||
|
MIME::Parser
|
||||||
|
Mail::Address
|
||||||
|
Mail::Field
|
||||||
|
Mail::Internet
|
||||||
|
Pod::Usage
|
||||||
|
SQL::Abstract
|
||||||
|
Template
|
||||||
|
TryCatch
|
||||||
|
|
||||||
|
# BUGS AND LIMITATIONS
|
||||||
|
|
||||||
|
There are no known bugs in this module.
|
||||||
|
Please report problems to Dave Morriss (Dave.Morriss@gmail.com)
|
||||||
|
Patches are welcome.
|
||||||
|
|
||||||
|
# AUTHOR
|
||||||
|
|
||||||
|
Dave Morriss (Dave.Morriss@gmail.com)
|
||||||
|
|
||||||
|
# LICENCE AND COPYRIGHT
|
||||||
|
|
||||||
|
Copyright (c) 2017, 2018 Dave Morriss (Dave.Morriss@gmail.com). All rights
|
||||||
|
reserved.
|
||||||
|
|
||||||
|
This module is free software; you can redistribute it and/or
|
||||||
|
modify it under the same terms as Perl itself. See perldoc perlartistic.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
---
|
||||||
|
Back to [Comment_system](Comment-System) page
|
||||||
|
|
186
reserve_cnews.md
Normal file
186
reserve_cnews.md
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
# NAME
|
||||||
|
|
||||||
|
reserve\_cnews - reserve Community News shows in the HPR database
|
||||||
|
|
||||||
|
# VERSION
|
||||||
|
|
||||||
|
This documentation refers to **reserve\_cnews** version 0.0.14
|
||||||
|
|
||||||
|
# USAGE
|
||||||
|
|
||||||
|
./reserve_cnews [-help] [-from[=DATE]] [-count=COUNT]
|
||||||
|
[-[no]dry-run] [-[no]silent] [-config=FILE] [-debug=N]
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
./reserve_cnews -help
|
||||||
|
./reserve_cnews
|
||||||
|
./reserve_cnews -from=1-June-2014 -dry-run
|
||||||
|
./reserve_cnews -from=15-Aug-2015 -count=6
|
||||||
|
./reserve_cnews -from=2015-12-06 -count=1 -silent
|
||||||
|
./reserve_cnews -from -count=1
|
||||||
|
./reserve_cnews -from -count=2 -debug=4
|
||||||
|
./reserve_cnews -config=.hpr_livedb.cfg -from=1-March-2019 -dry-run
|
||||||
|
|
||||||
|
# OPTIONS
|
||||||
|
|
||||||
|
- **-help**
|
||||||
|
|
||||||
|
Prints a brief help message describing the usage of the program, and then exits.
|
||||||
|
|
||||||
|
- **-from=DATE** or **-from**
|
||||||
|
|
||||||
|
This option defines the starting date from which reservations are to be
|
||||||
|
created. The program ignores the day part, though it must be provided, and
|
||||||
|
replaces it with the first day of the month.
|
||||||
|
|
||||||
|
The date format should be **DD-Mon-YYYY** (e.g. 12-Jun-2014), **DD-MM-YYYY**
|
||||||
|
(e.g. 12-06-2014) or **YYYY-MM-DD** (e.g. 2014-06-12).
|
||||||
|
|
||||||
|
If this option is omitted the current date is used.
|
||||||
|
|
||||||
|
If the **DATE** part is omitted the script will search the database for the
|
||||||
|
reservation with the latest date and will use it as the starting point to
|
||||||
|
generate **-count=COUNT** (or the default 12) reservations.
|
||||||
|
|
||||||
|
- **-count=COUNT**
|
||||||
|
|
||||||
|
This option defines the number of slots to reserve.
|
||||||
|
|
||||||
|
If this option is omitted then 12 slots are reserved.
|
||||||
|
|
||||||
|
- **-\[no\]dry-run**
|
||||||
|
|
||||||
|
This option in the form **-dry-run** causes the program omit the step of adding
|
||||||
|
reservations to the database. In the form **-nodry-run** or if omitted, the
|
||||||
|
program will perform the update(s).
|
||||||
|
|
||||||
|
- **-\[no\]silent**
|
||||||
|
|
||||||
|
This option in the form **-silent** causes the program omit the reporting of
|
||||||
|
what it has done. In the form **-nosilent** or if omitted, the program will
|
||||||
|
report what it is doing.
|
||||||
|
|
||||||
|
- **-config=FILE**
|
||||||
|
|
||||||
|
This option defines a configuration file other than the default
|
||||||
|
_.hpr\_db.cfg_. The file must be formatted as described below in the section
|
||||||
|
_CONFIGURATION AND ENVIRONMENT_.
|
||||||
|
|
||||||
|
- **-debug=N**
|
||||||
|
|
||||||
|
Sets the level of debugging. The default is 0: no debugging.
|
||||||
|
|
||||||
|
Values are:
|
||||||
|
|
||||||
|
1. Produces details of some of the built-in values used.
|
||||||
|
2. Produces any output defined for lower levels as well as details of the values
|
||||||
|
taken from the database for use when reserving the show(s).
|
||||||
|
3. Produces any output defined for lower levels as well as:
|
||||||
|
- .
|
||||||
|
|
||||||
|
Details of how the \`-from\` date is being interpreted: default, computed from
|
||||||
|
the database or explicit. The actual date being used is reported.
|
||||||
|
|
||||||
|
- .
|
||||||
|
|
||||||
|
Details of all dates chosen and their associated sho numbers using the
|
||||||
|
algorithm "first Monday of the month".
|
||||||
|
|
||||||
|
- .
|
||||||
|
|
||||||
|
The show title chosen for each reservation is displayed as well as the summary.
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
Hacker Public Radio produces a Community News show every month. The show is
|
||||||
|
recorded on the Saturday before the first Monday of the month, and should be
|
||||||
|
released as soon as possible afterwards.
|
||||||
|
|
||||||
|
This program reserves future slots in the database for upcoming shows. It
|
||||||
|
computes the date of the first Monday of all of the months in the requested
|
||||||
|
sequence then determines which show number matches that date. It writes rows
|
||||||
|
into the _reservations_ table containing the episode number, the host
|
||||||
|
identifier ('HPR Admins') and the reason for the reservation.
|
||||||
|
|
||||||
|
It is possible that an HPR host has already requested the slot that this
|
||||||
|
program determines it should reserve. When this happens the program increments
|
||||||
|
the episode number and checks again, and repeats this process until a free
|
||||||
|
slot is discovered.
|
||||||
|
|
||||||
|
It is also possible that a reservation has previously been made in the
|
||||||
|
_reservations_ table. When this case occurs the program ignores this
|
||||||
|
particular reservation.
|
||||||
|
|
||||||
|
# DIAGNOSTICS
|
||||||
|
|
||||||
|
- **Invalid date ...**
|
||||||
|
|
||||||
|
The date element of the **-from=DATE** option is not valid. See the description
|
||||||
|
of this option for details of what formats are acceptable.
|
||||||
|
|
||||||
|
- **Various database messages**
|
||||||
|
|
||||||
|
The program can generate warning messages from the database.
|
||||||
|
|
||||||
|
- **Unable to find host '...' - cannot continue**
|
||||||
|
|
||||||
|
The script needs to find the id number relating to the host that will be used
|
||||||
|
for Community News episodes. It does this by looking in the hosts table for
|
||||||
|
the name "HPR Volunteers". If this cannot be found, perhaps because it has
|
||||||
|
been changed, then the script cannot continue. The remedy is to change the
|
||||||
|
variable $hostname to match the new name.
|
||||||
|
|
||||||
|
- **Unable to find series '...' - cannot continue**
|
||||||
|
|
||||||
|
The script needs to find the id number relating to the series that will be
|
||||||
|
used for Community News episodes. It does this by looking in the miniseries
|
||||||
|
table for the name "HPR Community News". If this cannot be found, perhaps
|
||||||
|
because it has been changed, then the script cannot continue. The remedy is to
|
||||||
|
change the variable $seriesname to match the new name.
|
||||||
|
|
||||||
|
# CONFIGURATION AND ENVIRONMENT
|
||||||
|
|
||||||
|
The program obtains the credentials it requires for connecting to the HPR
|
||||||
|
database by loading them from a configuration file. The file is called
|
||||||
|
**.hpr\_db.cfg** and should contain the following data:
|
||||||
|
|
||||||
|
<database>
|
||||||
|
host = 127.0.0.1
|
||||||
|
port = PORT
|
||||||
|
name = DBNAME
|
||||||
|
user = USER
|
||||||
|
password = PASSWORD
|
||||||
|
</database>
|
||||||
|
|
||||||
|
# DEPENDENCIES
|
||||||
|
|
||||||
|
Config::General
|
||||||
|
Data::Dumper
|
||||||
|
Date::Calc
|
||||||
|
Date::Parse
|
||||||
|
DBI
|
||||||
|
Getopt::Long
|
||||||
|
Pod::Usage
|
||||||
|
|
||||||
|
# BUGS AND LIMITATIONS
|
||||||
|
|
||||||
|
There are no known bugs in this module.
|
||||||
|
Please report problems to Dave Morriss (Dave.Morriss@gmail.com)
|
||||||
|
Patches are welcome.
|
||||||
|
|
||||||
|
# AUTHOR
|
||||||
|
|
||||||
|
Dave Morriss (Dave.Morriss@gmail.com)
|
||||||
|
|
||||||
|
# LICENCE AND COPYRIGHT
|
||||||
|
|
||||||
|
Copyright (c) 2014 - 2023 Dave Morriss (Dave.Morriss@gmail.com). All
|
||||||
|
rights reserved.
|
||||||
|
|
||||||
|
This module is free software; you can redistribute it and/or
|
||||||
|
modify it under the same terms as Perl itself. See perldoc perlartistic.
|
||||||
|
|
||||||
|
---
|
||||||
|
Back to [Community_News](Community-News) page
|
||||||
|
|
Loading…
Reference in New Issue
Block a user