Moved wiki files to an empty local repo
							
								
								
									
										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 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. | ||||||
|  |  | ||||||
|  |      | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | --- | ||||||
|  | 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: | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## 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 | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user