The HPR Database is used to track the `status` of each show as it is been processed, using a normally hidden table `reservations`. It is not publicly available as it contains the IP address of the host uploading the show as a security measure. Once the show is processed the IP address is removed from the table.
Information about the show process is available to the Janitors via [stats.php](https://repo.anhonesthost.net/HPR/hpr_hub/src/branch/main/cms/stats.php).
A cron job `*/15 * * * * /home/hpr/bin/update-stats.bash > /dev/null 2>&1` runs every 15 minutes and saves the file to [https://hub.hackerpublicradio.org/stats.json](https://hub.hackerpublicradio.org/stats.json) for anyone to use.
## Input Directory Structure
The files are never processed by the front end HPR servers, and so all processing is done offline.
The files are downloaded by trusted Janitors that have the ability to `scp`/`rsync` the files from the HPR to a local machine for processing.
The directory structure is based on a combination of fields separated by the underscore (`_`) delimiter.
- Upload date and time `UTC_TIMESTAMP()` at reservation time.
The upload will produce at a minimum a `shownote.json` file. It may also include a host photo, and usually a media file for the episode. If the media file is not provided, then the Janitors will attempt to download it from the provided `url`. If that is not possible, then the host will be contacted to provide the show, and if they do not or if it will cause a delay, the show slot is freed up for another contributor.
Addition files and images may be provided by the host, eg: images, scripts, pdf documents etc.
Shows destined for the reserve queue are moved from the upload directory and placed in the reserve directory using the script [rename-reserve.bash](https://repo.anhonesthost.net/HPR/hpr-tools/src/branch/main/workflow/rename-reserve.bash).
This is run manually by the Janitors as it checks to see if a url to the show was provided, and attempts to download the linked file. When new hosts submit a show directly to the reserve queue, the Janitors will resubmit it to the first available slot in the normal queue. This is because new hosts need to have an entry created in the `hosts` table, but also because it gives the community an opportunity to welcome the new host.
Reserve shows are downloaded and submitted by the Janitors on behalf of the host. This follows the normal posting process where the host and Janitors are cc'd on the notification emails. The only difference is that the audio is edited to include a notification that the show is from the reserve queue, and that it is the Janitors that upload the show via the supplied link.
<tr><th>host</th><td>The name or handle of the host.</td><td>Emperor Ming</td></tr>
<tr><th>email</th>The hosts email address with the `@` replaced with `.nospam@nospam.` as an antispam measure<td></td><td>Emperor.Ming.nospam@nospam.example.com</td></tr>
<tr><th>profile</th><td>A html host profile</td><td><p>Follow me Mastodon: <a rel="me" href="https://mastodon.example.org/@Emperor.Ming">@Emperor.Ming@mastodon.example.org</a></p></td></tr>
<tr><th>license</th><td>One of the allowed licenses</td><td>CC-BY-SA</td></tr>
<tr><th>local_image</th><td>If a avatar is available directly from the host.</td><td>1</td></tr>
<tr><th>gpg</th><td>We can verify the hosts emails, with [thought to automatically verify](https://repo.anhonesthost.net/HPR/hpr-tools/issues/4).</td><td>1C7398B00F0239E8</td></tr>
<tr><th>valid</th><td>Allows temporary de-listing of host</td><td>0</td></tr>
<strong>Local Images</strong> uploaded when the host submits or <s><ahref="https://repo.anhonesthost.net/HPR/hpr_hub/issues/66">edits</a></s> their profile.
<strong>[Default Images](https://repo.anhonesthost.net/HPR/hpr_generator/src/branch/main/public_html/images/hpr_logo.png)</strong> added by [hpr_generator](https://repo.anhonesthost.net/HPR/hpr_generator/src/branch/main/templates/shared-avatar.tpl.html) when the host has no other image.
All the images are [currently](https://repo.anhonesthost.net/HPR/hpr_generator/issues/234) stored in the [hpr_generator](https://repo.anhonesthost.net/HPR/hpr_generator/src/branch/main/public_html/images/hosts) repository, and get transferred to the server using [hpr-publish.bash](https://repo.anhonesthost.net/HPR/hpr-tools/src/branch/main/workflow/hpr-publish.bash).
### Adding the episode to the `eps` table
The script [postshow.bash](https://repo.anhonesthost.net/HPR/hpr-tools/src/branch/main/workflow/postshow.bash) is run locally on the Janitors computer.
It calls the HPR CMS script [status.php](https://repo.anhonesthost.net/HPR/hpr_hub/src/branch/main/cms/status.php) to return a tab separated list of the shows in the queue.
It selects the first show with a status of `SHOW_SUBMITTED` and uses `rsync` to clone the directory locally. It then parses the `shownotes.json` file and extracts the shownotes object to a new file `shownotes.html`.
All embedded images are saved as local image files, with the format `hpr${ep_num}_${image_count}` based on "episode number", a underscore as delimiter, and then a sequential number of the image in the notes. eg `hpr9876_1.jpg`.
Where they are images larger than 400 pixels wide, a thumbnail is created with the same image name but suffixed with `_tn`. eg `hpr9876_1_tn.jpg`.
The Janitors then review the shownotes for issues.
The duration will be extracted from the media, and the other metadata from the `shownotes.json` file. After some checks it will be [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding).
The script allows overwriting of any value in the json file from the command line, and also prevents posting from a new host that has not yet been assigned a entry in the `hosts` table.
Once all the checks are done the script will `rsync` the following files back to the upload directory.
-`shownotes_origional.json` the original json file for reference.
-`shownotes.json` the human readable formatted json file.
-`shownotes.html` the extracted and edited show notes.
-`post_show.json` the json file used to create the `eps` table entry.
- Any additional images in the format `hpr${ep_num}_${image_count}.${ext}` and if greater than 400 pixels, then the thumbnail in the format `hpr${ep_num}_${image_count}_tn.${ext}`.
Then it will use the `curl` command to POST the show to [add_show_json.php](https://repo.anhonesthost.net/HPR/hpr_hub/src/branch/main/cms/add_show_json.php).
---
The HPR CMS script [add_show_json.php](https://repo.anhonesthost.net/HPR/hpr_hub/src/branch/main/cms/add_show_json.php) will validate the input, and add an entry into the `eps` table of the database.
```
--
-- Table structure for table `eps`
--
DROP TABLE IF EXISTS `eps`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `eps` (
`id` int(5) NOT NULL,
`date` date NOT NULL,
`title` varchar(100) NOT NULL,
`duration` int(5) NOT NULL,
`summary` varchar(100) NOT NULL,
`notes` text NOT NULL,
`hostid` int(10) NOT NULL,
`series` int(10) NOT NULL,
`explicit` tinyint(1) NOT NULL DEFAULT 1,
`license` varchar(11) NOT NULL DEFAULT 'CC-BY-SA',
/*!40101 SET character_set_client = @saved_cs_client */;
```
<table>
<thead>
<tr>
<th>Field</th>
<th>Description</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr><th>id</th><td>This is the Episode Number that will uniquely identify the show.</td><td>9278</td></tr>
<tr><th>date</th><td>The date the show air, namely when it gets put in the main feed.</td><td>2044-02-24</td></tr>
<tr><th>title</th><td>This will be a short descriptive title and will be used to describe the show.</td><td></td></tr>
<tr><th>duration</th><td>The length of the submitted show without branding in seconds.</td><td>2850</td></tr>
<tr><th>summary</th><td>This is a short 100 character summary of what the show is about. Used on the main page, on the mobile site, on printed brochures, on text to speech announcements, Mastodon etc.</td><td></td></tr>
<tr><th>notes</th><td>Additional descriptions and images in html format.</td><td></td></tr>
<tr><th>hostid</th><td>The hosts.hostid of the host.</td><td>789</td></tr>
<tr><th>series</th><td>The miniseries.id that the show belongs to.</td><td></td></tr>
<tr><th>explicit</th><td>Flags the show as [explicit](https://web.archive.org/web/20150326185817/http://www.apple.com/uk/itunes/podcasts/specs.html).</td><td>Clean or Yes</td></tr>
<tr><th>license</th><td>Which licenses.short_name the show is released under.</td><td>CC-BY-SA</td></tr>
<tr><th>tags</th><td>Add a list of comma separated tags that represent the essence of the show.</td><td></td></tr>
It should be possible to ship the entire backlog on physical media to someone, and have them plug it in and for any media player be able to play it. Each episode has it's own "album" which corresponds to a directory. The directory structure is kept as flat as possible with everything related to show eg: 9278 in a single directory `hpr9278`. This is the least common denominator, and in no way precludes web services, or other applications.
We do however need to support other functionality so the _Episodes_ are kept inside of the `eps` directory, the _Hosts_ are in `hosts/`, and _Series_ are in `series/`.
# Layers
We get files from different locations. The source files are delivered by the hosts, some are generated by processing, and others are added by the Janitors that cleanup the show notes.
All these are combined and end up as a complete entity, on one of the HPR [Origin servers](https://en.wikipedia.org/wiki/Upstream_server).
From there is delivered made available via RSS, etc.
TODO
## Upload
In our worked example a host uploads a show recorded in an audio file in [flac](https://en.wikipedia.org/wiki/FLAC) format.
The show is about a bash script which they also attach.
They describe the show in show notes, and include an image of the output.
files will be distributed using the C
The show processing supports the building of this structure,
This is how the
The `hpr_generator` places episodes are in `eps/`,
Everything related to a given show should be in the
We need to base our requirements on our own requirements and not those imposed by the IA.
It should be possible for someone to `rsync` the entire site and store it locally for use with a file manager/or media player.