Compare commits

...

340 Commits

Author SHA1 Message Date
270b4c0584 Merge pull request 'Add Promote HPR page' (#221) from i217-implement-promote-hpr-page into main
Reviewed-on: #221
2024-10-15 01:36:26 +00:00
ef17c94d58
Merge branch 'main' into i217-implement-promote-hpr-page 2024-10-14 21:31:44 -04:00
c19030787a Merge pull request '[I216] Add contact page' (#220) from i216-implement-contact-page into main
Reviewed-on: #220
2024-10-15 01:24:22 +00:00
8884a8517a Merge branch 'main' into i216-implement-contact-page 2024-10-15 01:23:43 +00:00
f68375dd5f Merge pull request 'Add Download Options page' (#219) from i215-implement-download-page into main
Reviewed-on: #219
2024-10-15 01:22:02 +00:00
7f604025e9 Merge branch 'main' into i215-implement-download-page 2024-10-15 01:20:36 +00:00
61de606208 Merge pull request '[I45-website] Refresh HPR layout with a light touch' (#218) from I45-website-refresh-light-touch into main
Reviewed-on: #218
2024-10-15 01:19:34 +00:00
a58934acbf Merge branch 'main' into I45-website-refresh-light-touch 2024-10-15 01:19:07 +00:00
9a83c13daf
Add Promote HPR page
Implement the template file and add reference to site.cfg.
2024-10-13 17:39:10 -04:00
e4e1813bc0
Fix URL for hackerpublicradio.org 2024-10-13 17:25:34 -04:00
b802a8a7b2
Add Contact page
Implement template file and add reference in site.cfg
2024-10-13 17:22:18 -04:00
84d868cf25
Add Download Options page
Implement template file and add download page to site.cfg
2024-10-13 17:02:05 -04:00
8f31864b83
Add id attribute to previous five weeks section 2024-10-12 11:06:41 -04:00
2b0b02ecb7
Remove uneeded in-line styling and tag attributes 2024-10-12 11:05:52 -04:00
9655c56ee6
Format CSS for consistency 2024-10-12 11:02:06 -04:00
87b7f7bde6
Create media breakpoint that matches original wide screen setting
For larger screens constrain viewing width and growth of font-size, and margins to approximately corresponding sizes of the original layout. Prevent things from getting too large.
2024-10-12 10:53:07 -04:00
69f19976fd
Use fluid responsive design for hr tag 2024-10-12 10:49:16 -04:00
6062cfd6b4
Clean up look of comment form 2024-10-12 10:47:29 -04:00
51adbcd938
Add fluid responsive design to page footer 2024-10-12 10:46:32 -04:00
7cd0cc3056
Add fluid responsive design to hosts table 2024-10-12 10:45:23 -04:00
d1539a3ca2
Add fluid responsive design to comment and code tags 2024-10-12 10:43:51 -04:00
ad89f1fb4f
Modify white space of main menu
Add some accessiblility touches: change cursor to pointer on hover, change link color on active event.
2024-10-12 10:42:18 -04:00
6b2a324730
Modify whitespace and sizing of headers in banner 2024-10-12 10:38:19 -04:00
e8f01ba5c5
Use fluid design for main container margins and padding 2024-10-12 10:24:27 -04:00
68e51c0a32
Initial reset of tags to use fluid responsive design
Use the clamping function to change the base font size as the size of the screen varies. Modify font-size, padding, and margin sizes to rely on the base font size (use rem units). In addition improve usage of white space by modifying line-height, margins, and padding of various tags.
2024-10-12 09:30:40 -04:00
a3e722589f Merge pull request '[I212] Fix general series page generation' (#213) from i212-fix-general-series-page-generation into main
Reviewed-on: #213
2024-10-09 11:15:33 +00:00
85d43851d1
Fix substring initial offset value
Remove only the leading comma character.
2024-10-08 21:49:58 -04:00
8b277607cf
Fix guard for unitialized variable
The original guard was preventing an id with value of
zero from being processed correctly.
2024-10-08 17:37:48 -04:00
39d2ef86ad Merge pull request '[I206] Change links for hpr_generator repository' (#211) from I206_change-links-for-hpr_generator-repository into main
Reviewed-on: #211
2024-10-03 03:33:08 +00:00
0f5d8650b3 Merge branch 'main' into I206_change-links-for-hpr_generator-repository 2024-10-03 03:31:44 +00:00
0e1ddf7006
Remove reference to Gitlab repository 2024-10-01 16:43:24 -04:00
7ac6a8c51f
Fix repository account from rho_n to HPR 2024-10-01 16:40:52 -04:00
12166b507b Merge pull request 'Change account from rho_n to HPR' (#209) from I206_change-links-for-hpr_generator-repository into main
Reviewed-on: #209
2024-09-30 20:38:57 +00:00
1ec5e78482 Merge branch 'main' into I206_change-links-for-hpr_generator-repository 2024-09-30 16:27:40 +00:00
24e1177c45 Merge pull request 'Use FILTER html_line_break to format comments' (#207) from I206-fix-episode-page-comment-formatting into main
Reviewed-on: #207
2024-09-30 16:24:29 +00:00
20409e9521
Change account from rho_n to HPR 2024-09-30 11:53:27 -04:00
f377f56002
Use FILTER html_line_break to format comments
For comments in an episode page, use the html_line_break filter
instead of the html_para filter. The html_line_break filter is
used in the comment viewer page.
2024-09-29 20:10:20 -04:00
73dd71f2f0 Merge pull request '[I132] tags page generation issues' (#205) from I132_tags_index_issues into main
Reviewed-on: #205
2024-09-28 15:49:44 +00:00
06601c5d20 Merge branch 'main' into I132_tags_index_issues 2024-09-28 15:49:25 +00:00
eedd954a11 Merge pull request 'Limit correspondent page episode count to released episodes' (#204) from I188_fix-correspondent-page-episode-count into main
Reviewed-on: #204
2024-09-28 15:44:53 +00:00
a3b927f802 Merge branch 'main' into I188_fix-correspondent-page-episode-count 2024-09-28 15:44:24 +00:00
1853715a19 Merge pull request '[I164] check for perl module dependencies' (#203) from I164_check-for-perl-module-dependencies into main
Reviewed-on: #203
2024-09-28 15:42:42 +00:00
b17daba4ed
Fix generation of tags index page
Replace white-space in ID attributes with the underscore
character. Fix generation of tags that start with the letter
k. The tag, keys, caused issues when used as a hash key.
2024-09-17 23:03:52 -04:00
70d5983ede
Parse db tag field with CSV parser module
The CSV parser module is being used in another
template. Make tag field parsing consistent.
2024-09-17 22:58:54 -04:00
31a5994731
Refactor template to use tag_to_id macro 2024-09-17 22:24:16 -04:00
aaaaa29d8e
Add macro tag_to_id 2024-09-15 15:42:46 -04:00
3662ebd0aa
Code formatting 2024-09-09 21:36:36 -04:00
c64ad492c8
Limit correspondent page episode count to released episodes
Fix for rho_n/hpr_generator#188
2024-09-08 12:23:45 -04:00
0f57b99fbe
Add instructions for the dependency check script 2024-09-08 09:30:40 -04:00
48b3c51bb3
Update instructions for installing modules via CPAN 2024-09-08 09:08:23 -04:00
4e9f1457d5
Fix typos in module names 2024-09-08 09:05:34 -04:00
4ae854f5e1
Remove unused module import
The dbi sqlite module is not directly used in the site-generator code.
The module is called by template files. Removing it allows the main
code to be database independent.
2024-09-08 09:01:17 -04:00
af810c88bc
Add bash script to check Perl module dependencies 2024-09-07 16:51:55 -04:00
92dce90753 Trixter avatar 2024-08-12 13:23:12 +00:00
65e4e1af5e Trollercoaster avatar 2024-08-11 16:10:44 +00:00
b5384408db Upload files to "public_html/images/hosts" 2024-08-07 09:21:46 +00:00
1a84becd8d Upload files to "public_html/images/hosts" 2024-08-07 09:20:42 +00:00
d74c23bace gemlog avatar 2024-08-07 09:18:33 +00:00
f1817e6820 Update templates/content-episode.tpl.html
Fix for 

HPR/hpr_hub#49
rho_n/hpr_generator#202
2024-07-17 19:21:05 +00:00
493bae282b Update README.md 2024-06-21 15:43:57 +00:00
dbc557d4c5 Changed the reserve to one week
This is because the IA is slow in processing the uploads resulting from DDOS attacks.
2024-06-11 16:51:31 +00:00
2099f0e130 Clarification of the reserve queue 2024-06-11 16:21:24 +00:00
29c9c827a4 Clarified the scheduling guidelines 2024-06-11 15:51:03 +00:00
c72c813b02 Merge pull request 'Fixed relative link to include the episode number, not just the domain root.' (#200) from kdmurrayhpr/hpr_generator:main into main
Reviewed-on: rho_n/hpr_generator#200
2024-06-04 20:03:30 +00:00
966a94647d Merge branch 'main' into main 2024-06-04 19:51:56 +00:00
e090bf8498 Fixed relative link to include the episode number, not just the domain root. 2024-06-04 12:50:23 -07:00
4d1d4c8c1d Merge pull request 'Added local anchor links for each individual comment' (#199) from kdmurrayhpr/hpr_generator:main into main
Reviewed-on: rho_n/hpr_generator#199
2024-06-04 19:29:36 +00:00
99aee89698 Merge branch 'kdmurrayhpr-main' 2024-06-04 10:37:36 -07:00
f6f2c01202 Merge branch 'main' into main 2024-06-04 17:36:41 +00:00
797039d182 Added local anchor links for each individual comment 2024-06-04 10:32:37 -07:00
93f22fb266 Merge pull request 'Changed Show summary to display Full Show name for Today with a Techie' (#198) from kdmurrayhpr/hpr_generator:main into main
Reviewed-on: rho_n/hpr_generator#198
2024-06-02 09:37:49 +00:00
eb0b752841 Merge branch 'main' into main 2024-06-01 00:31:37 +00:00
4c19b56643 Changed Show summary to display Full Show name for Today with a Techie 2024-05-31 17:29:54 -07:00
9766ec2c36 2024-05-30_18-53-17Z_Thursday Added link to the stats 2024-05-30 20:53:17 +02:00
392f9ba9e5 2024-05-30_15-08-16Z_Thursday Corrected Today With a Techie references 2024-05-30 17:08:16 +02:00
41979786eb 2024-05-28_18-28-21Z_Tuesday fixed ttl to 12h 2024-05-28 20:28:21 +02:00
a61f2a5222 Merge pull request 'Setting up static RSS feeds' (#196) from 140_2_Convert_the_RSS_feeds_from_php_to_the_static_site into main
Reviewed-on: rho_n/hpr_generator#196
2024-05-23 19:38:58 +00:00
Dave Morriss
ccba560ee3 Setting up static RSS feeds
site-generator: Changed the routine used to generate entities in
    'HTML::Entities'; see filter function 'xml_entity'

site.cfg: Added root variable 'http_baseurl' which defines the base URL
    using 'http'

templates/rss.tpl.xml: RSS template defining the channel and inserting
    the 'item' definitions; adjusted to be in step with the PHP version.

templates/shared-item.tpl.xml: RSS template used for each 'item' in an
    RSS feed; contains a call to 'HTML::Strip' which turns off the
    addition of spaces when removing tags; adjusted to be in step with
    the PHP version.

templates/shared-utils.tpl.html: Macro collection used by other
    templates; addition of temporay macro 'display_explicit_feed_2'
    which generates 'Yes/No' strings to be in step with the PHP version.
2024-05-23 20:14:42 +01:00
a2c69ec898 Merge pull request 'Replaced links to defunct websites with Wayback Machine links' (#193) from kdmurrayhpr/hpr_generator:main into main
Reviewed-on: rho_n/hpr_generator#193
2024-05-19 09:26:11 +00:00
1382fe5e2a Merge branch 'main' into main 2024-05-19 04:40:25 +00:00
54ba2dc318 Replaced open-source-musicial URL on requested topics with the latest wayback machine capture before shutdown 2024-05-18 21:21:41 -07:00
c2c2cb0cc2 Replaced broken links for Binrev, Infonomicon and RFA with the last most recent wayback machine crawls for those sites before they went down. 2024-05-18 21:10:28 -07:00
5ec9fd21e9 Merge pull request 'Fix broken link to tags page on about page' (#191) from kdmurrayhpr/hpr_generator:main into main
Reviewed-on: rho_n/hpr_generator#191
2024-05-18 15:22:48 +00:00
d053ec253a Merge pull request 'Fixed four queries to correct the episode flags' (#192) from 190_clean_shows_when_not into main
Reviewed-on: rho_n/hpr_generator#192
2024-05-18 15:19:09 +00:00
Dave Morriss
db6c0bedaa Fixed four queries to correct the episode flags
templates/queries-correspondent-mysql.tpl.html,
templates/queries-correspondent-sqlite.tpl.html,
templates/queries-index-mysql.tpl.html,
templates/queries-index-sqlite.tpl.html: All SQL queries used a CASE
    expression to return either 'Explicit' or 'Clean' depending on the
    0/1 setting of the 'explicit' column. However, the TT² templates
    using these queries were written to expect the numeric form. All the
    'CASE' expressions have been replaced by the field name and now the
    correct flag is being displayed.
2024-05-18 15:54:52 +01:00
0c000b17b9 Removed hashtag references; based on current searches those aren't useful anymore. 2024-05-18 01:54:46 -07:00
1853af5521 Added the Telegram link since that exists now. 2024-05-18 01:52:49 -07:00
f4530a3f48 Fix broken link to tags page on about page 2024-05-18 01:37:38 -07:00
5b2b2ce6d0 Merge pull request 'link to how to help section of about' (#189) from norrist/hpr_generator:fix_contribute_404 into main
Reviewed-on: rho_n/hpr_generator#189
Reviewed-by: Ken Fallon <ken_fallon@josh@anhonesthost.com>
2024-05-14 08:20:03 +00:00
6d8bdaa7a9 link to how to help section of about 2024-05-13 17:35:32 -05:00
2713664f86 2024-05-13_09-45-39Z_Monday Removed reference to advanced settings 2024-05-13 11:45:39 +02:00
eacd1e8425 2024-05-11_19-50-01Z_Saturday Fixed links to git repo 2024-05-11 21:50:01 +02:00
Ken Fallon
138c1e2d2b Update templates/content-about.tpl.html
Fixed the location for the mumble howto
2024-05-08 15:37:46 +00:00
Dave Morriss
b69cb913ea Added the Telegram link to page.tpl.html 2024-05-02 20:16:20 +01:00
Ken Fallon
467a14a72a Merge pull request 'Added host profile to the correspondent display' (#183) from 181_Host_Profile_not_showing into main
Reviewed-on: rho_n/hpr_generator#183
2024-03-04 19:12:59 +00:00
Dave Morriss
69dcb66d05 Added host profile to the correspondent display
templates/queries-correspondent-mysql.tpl.html,
templates/queries-correspondent-sqlite.tpl.html: enhanced the queries to
    include the 'profile' field.

templates/content-correspondent.tpl.html: the 'profile' string from
    whichever of the above two queries is invoked is displayed after the
    (obscured) 'email' address
2024-03-04 18:30:59 +00:00
Ken Fallon
1e451e156d Clarification on using url
Needs to be accessible without logins.
2024-02-29 15:08:22 +00:00
Ken Fallon
7c98273236 internal links in error 2024-01-21 17:15:23 +00:00
Ken Fallon
fcf624dc22 Fix for Comment system needs to support hostid #180 2024-01-08 18:43:07 +00:00
Ken Fallon
fc096c6fa6 typo # in id field 2024-01-04 15:44:21 +00:00
Ken Fallon
d34064d787 update to about anonymous post 2024-01-04 15:41:22 +00:00
Ken Fallon
4287028e25 IA donation drive and NYS are over 2024-01-02 11:56:54 +00:00
Ken Fallon
67f28d43e3 Updates for the NYE show 2023-12-30 17:56:32 +00:00
Ken Fallon
dc36d9de86 last few stray references to php 2023-12-29 13:04:39 +00:00
Ken Fallon
96642bc69f more typos 2023-12-29 12:56:18 +00:00
Ken Fallon
f432954891 Added missing escapes for tt2 2023-12-29 12:42:41 +00:00
Ken Fallon
3f32a39301 Fixing links and formatting 2023-12-29 12:12:10 +00:00
Ken Fallon
7d8af97f7d Merge pull request 'The links to the page itself were not working - used to quickly add links to about page to questions' (#179) from I121_Fix_anchor_links_on_about_page into main
Reviewed-on: rho_n/hpr_generator#179
2023-12-20 11:58:50 +00:00
130f603748 The links to the page itself were not working - used to quickly add links to about page to questions 2023-12-20 12:56:25 +01:00
Dave Morriss
eba235c503 Adjustments to the index page announcements 2023-12-19 21:56:02 +00:00
Ken Fallon
8bcf6bd0e8 new year show update
Added the hpr new yearshow updates
2023-12-10 15:11:46 +00:00
Ken Fallon
15cd9018b0 Merge pull request 'A further fix to the free slot algorithm' (#178) from fix4_next_available_episode into main
Reviewed-on: rho_n/hpr_generator#178
2023-11-18 20:56:20 +00:00
Dave Morriss
e5b5aac104 A further fix to the free slot algorithm
templates/content-index.tpl.html: the `TT²` algorithm can be simplified
    because the new query returns less. We get the date of the show
    before the free slot, and can increment it differently depending on
    whether the previous show is on a Friday or not - catering for
    weekends in other words!

templates/queries-index-mysql.tpl.html,
templates/queries-index-sqlite.tpl.html: using a 'find unused index
    numbers' query available in many places on the Internet, but
    modified to return the id number and date for the show *before* the
    next free slot.
2023-11-17 18:23:22 +00:00
Ken Fallon
0ef92840c8 Added an explanation as to why 2023-11-02 08:39:56 +00:00
Dave Morriss
79a788bda9 Added content to the announcement section 2023-11-01 16:00:33 +00:00
Ken Fallon
2e151ebae9 Merge pull request 'fix3_next_available_episode' (#176) from fix3_next_available_episode into main
Reviewed-on: rho_n/hpr_generator#176
2023-10-29 18:16:46 +00:00
Dave Morriss
097b50b30b Next free slot algorithm now in TT² form
templates/content-index.tpl.html: Now contains TT² code and an in-built
    query to determine the next free slot. No need for an external
    query. Old code that used to use this has been deleted.

templates/queries-index-mysql.tpl.html,
templates/queries-index-sqlite.tpl.html: Old queries called
    'query_next_available_episode' removed since no longer needed.
2023-10-29 17:32:02 +00:00
Dave Morriss
8325b2c0d1 Unwanted items commented out 2023-10-29 17:28:04 +00:00
Ken Fallon
a49bd6b08d Merge pull request 'fix2_next_available_episode' (#175) from fix2_next_available_episode into main
Reviewed-on: rho_n/hpr_generator#175
2023-10-20 14:23:03 +00:00
Dave Morriss
c8135d811d Bug fix of query to find days to next free slot
templates/queries-index-mysql.tpl.html,
templates/queries-index-sqlite.tpl.html:
    Rather than driving the search from the eps table itself, this
    version makes a counter that generates slot numbers from the current
    show number to the highest show number in the system. The counter is
    used to interrogate the eps table to find the first empty slot. This
    sems to be a more reliable approach (but time will tell).
2023-10-20 13:37:37 +01:00
Dave Morriss
dab80f1772 Using even more complex CTE query for testing 2023-10-16 23:01:30 +01:00
Dave Morriss
3ccd6101ee Removed unnecessary computations from query_next_available_episode 2023-10-12 19:36:03 +01:00
Dave Morriss
51d328203b Merge pull request 'Fixing days to next free slot' (#174) from fix_next_available_episode into main
Reviewed-on: rho_n/hpr_generator#174
2023-10-10 19:43:45 +00:00
Dave Morriss
366729a827 Fixing days to next free slot
templates/queries-index-mysql.tpl.html,
templates/queries-index-sqlite.tpl.html: Enhanced the query that finds
    the next free slot (query_next_available_episode). Also made it
    compute the days to the slot from the current day. The query returns
    data for calling Date::Calc to compute the number of days, but this
    calculation is no longer necessary. Next release will remove this.

templates/content-index.tpl.html: The number of days to the next free
    slot is reported here. The original Date::Calc computation which did
    this is no longer needed and has been removed since the query
    (query_next_available_episode) does it.
2023-10-10 17:55:44 +01:00
Dave Morriss
faac8c202e Updated README.md 2023-10-06 15:47:09 +01:00
Ken Fallon
3cf2f3a8e1 Merge pull request 'Making good an oversight in the IA_link PR' (#171) from IA_link_fix into main
Reviewed-on: rho_n/hpr_generator#171
2023-09-29 11:24:00 +00:00
Dave Morriss
83bb04f25c Making good an oversight in the IA_link PR 2023-09-29 10:56:56 +01:00
Ken Fallon
383ef45bb7 Merge pull request 'Added a link to the IA copy of the show' (#170) from IA_link into main
Reviewed-on: rho_n/hpr_generator#170
2023-09-29 08:15:21 +00:00
Dave Morriss
68c5e91552 Added a link to the IA copy of the show
site-generator: removed a subroutine prototype

templates/content-episode.tpl.html: added a new IA show link
2023-09-28 23:16:04 +01:00
Dave Morriss
35fa97e120 Cleaning up after bad merge 2023-09-09 23:26:15 +01:00
Dave Morriss
47a7493ef2 Merge branch '167_Several_templates_use_non-existent_absolute_url'
Somehow stuff got deleted - no idea why!
2023-09-09 23:10:07 +01:00
Dave Morriss
b4448caf16 Fixing 'absolute_url'
site-generator:

    Added all the modules that the script and the templates use to make
    it explicit what is required.

templates/shared-utils.tpl.html:

    Added a new TT² macro called 'absolute_url' which takes two
    arguments, the base and  the path or relative URL. It's fairly
    primitive but seems to work.

templates/content-about.tpl.html,
templates/content-recording.tpl.html,
templates/content-request_a_slot.tpl.html,
templates/content-requested_topics.tpl.html,
templates/page.tpl.html:

    All calls to 'absolute_url' changed to use two arguments, and the
    link definitions adjusted to match this change.
2023-09-09 17:54:19 +01:00
Dave Morriss
8e6c44c46c Merge branch 'main' of https://repo.anhonesthost.net/rho_n/hpr_generator 2023-09-06 18:51:56 +01:00
Dave Morriss
aba463099c Merge branch 'I162_Fix_broken_links_in_template_files' 2023-09-06 18:50:19 +01:00
Dave Morriss
3396413321 Merge pull request 'I162_Fix_broken_links_in_template_files' (#166) from I162_Fix_broken_links_in_template_files into main
Reviewed-on: rho_n/hpr_generator#166
2023-09-06 17:43:42 +00:00
d1832ae619 Changes recommended by Dave - missing php and typo 2023-09-06 19:35:22 +02:00
4c239f4f67 Cleaned up the temp cruft 2023-09-05 20:39:25 +02:00
796ee598e9 Added press information that was missing and updated the FAQ for wikipedia 2023-09-05 20:31:46 +02:00
4b2a030a5b Missed a reference to <!--% baseurl %--> 2023-09-03 18:02:09 +02:00
7009533e25 Fixing invalid links in the templates. 2023-09-03 17:51:03 +02:00
Dave Morriss
5a73e94cf7 Merge branch 'norrist-main'
Amendment from 'norrist' received with thanks.
2023-08-28 12:53:57 +01:00
norrist
99a54d5543 Add libtemplate-plugin-html-strip-perl to getting started
Corresponding commit for my automated build
14d3217274
2023-08-28 11:41:44 +00:00
Ken Fallon
f87199bd92 Merge pull request 'Fixed miscalculation triggering 'Call for shows'' (#161) from I160_Call_for_shows_section_shown_inappropriately into main
Reviewed-on: rho_n/hpr_generator#161
2023-08-27 15:44:13 +00:00
Dave Morriss
ccc1982c6c Fixed miscalculation triggering 'Call for shows'
templates/shared-call_for_shows.tpl.html:
    - Cosmetic change

templates/queries-call_for_shows-mysql.tpl.html:
templates/queries-call_for_shows-sqlite.tpl.html:
    - In a period of 10 days the minimum number of weekday-only shows
      is 6, not 7. Adjusted the queries appropriately.
2023-08-27 16:00:00 +01:00
Ken Fallon
d9392bad6c Merge pull request 'Fixing Unicode problems' (#159) from I158_Problems_with_Unicode_in_the_site-generator into main
Reviewed-on: rho_n/hpr_generator#159
2023-08-27 13:42:33 +00:00
Dave Morriss
d519936f98 Fixing Unicode problems
site-generator:
    - Modification to the POD documentation
    - Addition of 'use 5.012' which enables various later Perl features
    - Addition of "use open ':encoding(UTF-8)'" which forces 'utf8' for
      all IO
    - Addition of 'use Template::Plugin::HTML::Strip' for consistency
    - Removal of other methods of making the default 'utf8' for IO
    - Removal of "'ENCODING => 'utf8'" when setting up a new template
      object. This allows template files to contain Unicode, but doesn't
      seem to be necessary
    - Changes to subroutine 'parse_csv': more comments, clarification of
      warning message, explicit conversion of tags which are marked as
      'utf8' to this format using 'utf8::encode' from core Perl.
2023-08-27 13:22:11 +01:00
Ken Fallon
f1480d742f Merge pull request 'Add new perl modules to getting-started' (#156) from norrist/hpr_generator:main into main
Reviewed-on: rho_n/hpr_generator#156
2023-08-21 18:24:36 +00:00
norrist
7d1968c60b Add new perl modules to getting-started 2023-08-21 14:56:14 +00:00
Ken Fallon
c263646cf2 Merge pull request 'Fixing issue #140' (#155) from I140_Convert_the_RSS_feeds_from_php_to_the_static_site into main
Reviewed-on: rho_n/hpr_generator#155
2023-08-20 15:07:33 +00:00
Dave Morriss
dc138596ea Fixing issue #140
site-generator:

    Cosmetic adjustments. Additions to the POD documentation.
    Additions to module list.
    Additions to work better with UTF-8.
    Addition of functions 'parse_csv' and 'xml_entity'

templates/queries-episodes-sqlite.tpl.html:
templates/shared-utils.tpl.html:

    Cosmetic changes

templates/rss-query-hpr-mysql.tpl.xml:
templates/rss-query-hpr-sqlite.tpl.xml:
templates/rss-query-hpr_total-mysql.tpl.xml:
templates/rss-query-hpr_total-sqlite.tpl.xml:

    Enhancements to allow the query to collect the audio length from the
    'assets' table. The audio file extension is passed as an argument to
    the 'execute' statement.

templates/rss.tpl.xml:

    Cosmetic changes
    Changed one 'php' URL to 'html'.

templates/shared-episode-summary.tpl.html:

    Change to 'display_tags' macro to turn the 'eps.tags' field into
    a list of links. This works, but needs further development because
    using the tag strings as anchor ids is not reliable.

templates/shared-item.tpl.xml:

    Cosmetic changes.
    Addition of filter 'HTML.strip' which is used as a means of removing
    HTML tags from '<itunes:summary>' strings.
    Using new filter 'xml_entity' which converts all non-ASCII
    characters in the notes to numeric hexadecimal entities for
    '<itunes:summary>'.
    The '<enclosure>' tag now uses 'episode.length' rather than
    'episode.duration' which has been extracted from the 'assets' table.
2023-08-19 13:34:50 +01:00
Dave Morriss
8e1788147c Merge pull request 'Fixed the link to the mail list' (#151) from 2023-08-06-ken-fixes into main
Reviewed-on: rho_n/hpr_generator#151
2023-08-06 13:22:13 +00:00
0b841ba78f Fixed the link to the mail list
- added redirect via hpr_hub .htaccess file
- added links to mastodon, matrix, and mumble

Removed contact and stuff you need to know pages as these are now in the about page
2023-08-06 14:04:00 +02:00
Ken Fallon
7b6788731b Merge pull request 'Fixes to "step navigation", etc' (#149) from I148_The_lower_"step_navigation"_line_is_smaller_than_the_upper_one into main
Reviewed-on: rho_n/hpr_generator#149
2023-08-01 09:47:31 +00:00
Dave Morriss
31fed34212 Fixes to "step navigation", etc
public_html/css/hpr.css: Commented out the 'font-size: 75%;' in the CSS
    definition for '#maincontent footer p'. It was this that shrank the
    lower "step navigation" list in comparison to the upper one. The
    upper is in a '<header>' block and the lower in a '<footer>' block.

templates/content-episode.tpl.html: Fixed a typo.

templates/content-theme.tpl.html: Changed "This can be added" to "This
    is automatically added"

templates/queries-episode-sqlite.tpl.html: Fixed a transcription error
    from the 'mysql' version

templates/shared-utils.tpl.html: Modified the layout of the
    'step_navigation' macro to remove tabs which are being copied to the
    HTML. Just a minor cosmetic issue. Added a Vim modeline to the file
    to help with this.
2023-07-31 15:27:17 +01:00
Ken Fallon
d7d94b1ba7 Merge pull request 'I145 Various bug fixes' (#146) from I145_Various_bug_fixes into main
Reviewed-on: rho_n/hpr_generator#146
2023-07-23 18:45:38 +00:00
Dave Morriss
3f766544ac I145 Various bug fixes
site-generator: fixed an error in the POD documentation and added an
    example. Reformatted 'GetOptions' arguments. Fixed 'parse_page_arg'
    which started its returned array with an empty arrayref. Fixed code
    using this array which skipped this unwanted extra value. Fixed
    'get_ids_from_db' which turns a CSV list of shows into an array, but
    includes a blank element. Removed a few trailing spaces.

templates/content-correspondents.tpl.html: Capitalised "License". Added
    'order by h.host' to the internal query to get hosts sorted
    alphabetically.

templates/content-episode.tpl.html: Added a call to macro
    'zero_pad_left' to add leading zeroes to show number in the title.
    Added a call to 'FILTER html_para' when displaying comments (which
    are plain text). Added a test for whether the show being displayed
    is in the 20-show window before the current one to determine whether
    the short or long comment form is required. Added the code to
    generate the two form types depending on the earlier test.

templates/content-sitemap.tpl.html: Corrected the entry for "Show
    Comments" which contained an invalid URL.

templates/page.tpl.html: Grammar corrections in the '<head>' section.

templates/queries-episode-mysql.tpl.html: Adjusted the date tests in the
    CTE's which compare the episode date with today's date plus one day.
    Why add a day when the test is whether the episode date is less than
    or equal to the current one? Also, it seemed that MySQL/MariaDB
    might need to work with the UTC date rather than the local dat
    implied by 'NOW()'.

templates/queries-episode-sqlite.tpl.html: Similar adjustment to date
    tests in CTE's to the MySQL version. SQLite defaults to UTC however.

templates/queries-episodes-mysql.tpl.html: See above for notes about
    date tests and MySQL UTC dates. Same arguments here.

templates/queries-episodes-sqlite.tpl.html: Date test adjustment
    described above.

templates/queries-ids-episode-mysql.tpl.html: Removed the date test from
    the query so all episode numbers are returned. Added an 'order by'
    since the table can (could in the past) return numbers out of
    numerical sequence.

templates/queries-ids-episode-sqlite.tpl.html: Same change as for the
    MySQL version.

templates/queries-index-mysql.tpl.html: There are three queries here,
    returned as TT² variables. The one called 'query_latest_episodes'
    has been adjusted to use UTC and to avoid adding a day to the
    current date. The query called 'query_last_5_weeks_episodes' has
    been similarly adjusted.

templates/queries-index-sqlite.tpl.html: Changes for the same two
    queries, but just for the tests requiring today's date plus one day.

templates/rss-comments.tpl.xml: Grammar corrections in the
    '<channel><description>' section.

templates/rss.tpl.xml: Grammar corrections in various subsections of the
    '<channel>' section.

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

    Website: https://github.com/dumblob/mysql2sqlite
    The MIT License (MIT)
    Copyright (c) 2015 esperlu, 2016 dumblob
2023-03-03 23:00:50 -05:00
6d588dc558
Merge branch 'main' into I82_creating-sqlite-db-from-hpr.sql 2023-03-03 22:52:21 -05:00
Roan Horning
f0b0b5ea59 Merge pull request 'Fix database instructions in configuration file' (#85) from Fix_db_sqlite_settings into main
Reviewed-on: rho_n/hpr_generator#85
2023-03-04 03:49:09 +00:00
a33fa197df
Fix database instructions in configuration file
Add back instructions for SQLite
2023-03-03 22:44:05 -05:00
e7e752f1e8
Improve function messages 2023-03-03 21:47:29 -05:00
094287837c
Put variables into local scope of the function
Forgot to use the local keyword when declaring the variables.
2023-03-03 21:44:35 -05:00
a53f201842
Code formatting with no functional changes 2023-03-03 20:46:34 -05:00
2ce1280cc0
Make functional stub function copy_to_public_dir 2023-03-03 20:45:16 -05:00
d45ca0de96
Make functional stub function make_hpr_sqlite_db 2023-03-03 20:42:42 -05:00
13aeb647ad
Make functional stub function download_hpr_sql 2023-03-03 20:41:29 -05:00
ee6a4e601d
Fill out function clean_working_dir 2023-02-27 23:30:24 -05:00
b544687f0f
Fill out stub of make_working_dir function 2023-02-27 23:27:26 -05:00
0ed7efe93b
Initial add of bash library for update utils
Stubs for functions to be used in update scripts.
2023-02-27 21:07:01 -05:00
Roan Horning
b4e4187902 Merge pull request 'Fix URL's to series RSS feeds' (#80) from I78_Fix-link-to-series-RSS-links into main
Reviewed-on: rho_n/hpr_generator#80
2023-02-26 04:13:06 +00:00
431126e8a3
Fix URL's to series RSS feeds 2023-02-25 23:06:41 -05:00
Roan Horning
91ceefd88e Merge pull request '[I62] Hide display of future shows on series pages' (#79) from I62_Hide-display-of-future-shows-on-series-pages into main
Reviewed-on: rho_n/hpr_generator#79
2023-02-25 20:11:11 +00:00
8feb37e831
Hide display of future shows on series episodes page 2023-02-25 14:22:44 -05:00
4a34496f24
Hide display of future shows on series listings page 2023-02-25 11:44:56 -05:00
Roan Horning
f7e54233e2 Merge pull request '[I12] Implement comments_viewer page' (#77) from I12_Implement-comments-viewer into main
Reviewed-on: rho_n/hpr_generator#77
2023-02-25 01:44:50 +00:00
59875e772e
Implement comments_viewer page 2023-02-24 20:42:01 -05:00
Roan Horning
f84ee71b7c Merge pull request '[I75] Fix missing show transcipts[' (#76) from I75_Fix-missing-show-transcipts into main
Reviewed-on: rho_n/hpr_generator#76
2023-02-25 00:06:18 +00:00
927424901b
Add show_transcript MACRO to index and episode pages 2023-02-24 18:58:56 -05:00
27a84529c6
Create shared template for showing show transcripts
Used in main index page and individual episode pages.
2023-02-24 18:57:20 -05:00
59549daa63
Fix archive.org paths in media_path MACRO 2023-02-24 18:55:37 -05:00
Roan Horning
ec7a6ce379 Merge pull request 'Refactor RSS templates for either MySQL or SQLite' (#74) from I73-Fix_queries_for-RSS_feeds into main
Reviewed-on: rho_n/hpr_generator#74
2023-02-21 03:41:55 +00:00
756bdc0fa1
Refactor RSS templates for either MySQL or SQLite 2023-02-20 22:36:30 -05:00
b2eaea1eb8
Improve look of hosts table 2023-02-12 16:54:17 -05:00
Roan Horning
fe9bf574cf Merge pull request 'Update sydication template text' (#69) from I67-Update_syndication_page into main
Reviewed-on: rho_n/hpr_generator#69
2023-02-12 19:36:17 +00:00
309ea05c15
Update sydication template text
Now matches what is in the syndication.php page on
hakerpublicradio.org
2023-02-12 13:46:11 -05:00
Roan Horning
649d6c3746 Merge pull request 'Make tags page menu link hard coded' (#68) from I63_Fix-menu-link-to-tags-page into main
Reviewed-on: rho_n/hpr_generator#68
2023-02-12 18:10:12 +00:00
e41f6029aa
Make tags page menu link hard coded
Not implementing tags page in the static generator yet.
Make the link point to the php page on hackerpublicradio.org.
2023-02-12 13:07:06 -05:00
Roan Horning
4bd7c6f867 Merge pull request 'I64_Implement-Show-Transcript-section' (#66) from I64_Implement-Show-Transcript-section into main
Reviewed-on: rho_n/hpr_generator#66
2023-02-12 16:07:47 +00:00
138b0fdd1b
Add Show Transcript section to episode template 2023-02-12 10:58:43 -05:00
d437e66f0e
Update media_path MACRO for archive.org transciption files
The whisper transcription files are stored one directory
deeper on archive.org. Add checks and correct path when
passed txt, srt, or vtt media_type.
2023-02-12 10:53:50 -05:00
Roan Horning
a213efa695 Merge pull request '[I57] MySQL implementation' (#65) from MySQL into main
Reviewed-on: rho_n/hpr_generator#65
2023-02-12 12:59:13 +00:00
Roan Horning
314127441c Merge branch 'main' into MySQL 2023-02-12 12:57:38 +00:00
2a486cb58b
Add SQLite specific query templates 2023-02-08 16:05:36 -05:00
7c44f6b680
Remove New Year's Eve 2023 show announcement 2023-01-03 10:08:52 -05:00
71a63e1beb
Merge branch 'main' into MySQL 2022-12-31 18:39:25 -05:00
8e1232517a Update New Year's Eve show 2023 2022-12-31 15:55:39 -05:00
cb65d25cfc
Refactor MySQL database specific SQL 2022-11-28 22:47:53 -05:00
2b4802508d
Remove superflous WHERE condition 2022-11-28 19:55:51 -05:00
1312e3d374
Refactor MySQL database specific SQL 2022-11-28 19:52:39 -05:00
3cc6da57ad
Refactor MySQL database specific SQL 2022-11-28 19:49:06 -05:00
675f8fa9d5
Refactor MySQL database specific SQL 2022-11-27 14:04:12 -05:00
6f28bb2a16
Refactor MySQL database specific SQL 2022-11-27 13:54:14 -05:00
cb881558ca
Add database type constant for use in templates
This is used to select which database specific SQL query to use.
2022-11-27 13:11:14 -05:00
4e8edf2640
Merge branch 'main' into MySQL 2022-11-11 20:27:47 -05:00
Roan Horning
e86d2c010d Merge pull request '[I60] Implement call for shows feature' (#61) from I60_call-for-shows into main
Reviewed-on: rho_n/hpr_generator#61
2022-11-11 03:18:38 +00:00
f0fa21ae45
Implement call for shows feature
Add display_call_for_shows MACRO. Update index template to include
call to display_call_for_shows.
2022-11-10 22:14:55 -05:00
0b99483f0d
Update installation instruction to include details for MySQL 2022-10-22 21:11:57 -04:00
8c3874ad8b
Convert hpr total rss queries from SQLite to MySQL 2022-10-21 23:00:03 -04:00
6f95a33e67
Convert hpr rss queries from SQLite to MySQL 2022-10-21 22:53:13 -04:00
979c8b43e5
Convert twat episode page queries from SQLite to MySQL 2022-10-21 20:43:22 -04:00
e3abe5fd68
Convert series episode page queries from SQLite to MySQL 2022-10-21 20:11:19 -04:00
5612eeed42
Convert episode page queries from SQLite to MySQL 2022-10-21 20:07:53 -04:00
4af117fb7a
Convert episodes page queries from SQLite to MySQL 2022-10-21 19:52:53 -04:00
e1b0189275
Convert correspondent page queries from SQLite to MySQL 2022-10-21 19:46:31 -04:00
aad77f3c78
Convert index page queries from SQLite to MySQL 2022-10-20 23:24:56 -04:00
be1344e10c
Update database connection information 2022-10-20 23:23:00 -04:00
Roan Horning
308d03d63c Merge pull request '[I55] announcements template' (#56) from I55_announcements-template into main
Reviewed-on: rho_n/hpr_generator#56
2022-10-16 23:11:14 +00:00
0837e11bfe
Include announcement template in index template 2022-10-16 18:56:13 -04:00
06ace35c41
Add announcement template 2022-10-16 18:23:51 -04:00
6d0d1b99a6
Add page mumble-howto 2022-10-16 18:12:05 -04:00
fdeff3879a
Update links in the comments section of the episode template 2022-10-09 15:45:22 -04:00
b667c30d40
Update links on syndication page
Add missing external links. Update comments feed link to new statically
generated file.
2022-10-09 13:51:00 -04:00
b08f5c30df
Add missing USE date directive
Worked without it in local dev, but needed on hpr.horning.us
2022-10-08 12:35:56 -04:00
Roan Horning
d8613143d3 Merge pull request '[I41] Implement comments feed' (#54) from I41_Implement-comments-feed into main
Reviewed-on: rho_n/hpr_generator#54
2022-10-08 13:34:45 +00:00
3de4476a3f
Add comments feed template 2022-10-08 08:52:47 -04:00
4984ac3383
Add MACRO rss_show_series 2022-10-08 08:48:42 -04:00
e4463dc5ba
Zero pad the day's date 2022-10-08 08:44:47 -04:00
Roan Horning
bf8bf8daad Merge pull request '[I52] Allow audio content to be hosted on at different url' (#53) from I52_media_urls into main
Reviewed-on: rho_n/hpr_generator#53
2022-10-02 18:17:14 +00:00
1d4e6e15b7
Refactor templates to use media_path MACRO 2022-10-01 13:42:46 -04:00
d556e28e2d
Consume root_template properties generically
Allow user to define root_template properties in the site.cfg file
without need to modify site_generator program.
2022-10-01 13:33:59 -04:00
fb70ae6253
Add media_path MACRO to shared utilities
Generate the full URL of an audio file.
2022-10-01 13:23:36 -04:00
64ae9c4f86
Refactor media_baseurl MACRO to media_basepath MACRO
Prevent name collision with media_basepath root_template/page property
of same name. Also fix application of trailing forward slash to path
based on existence of baseurl property.
2022-10-01 13:18:35 -04:00
b0d31ee507
Allow user to modify zero_pad_left MACRO's padding
Add optional pad length argument
2022-10-01 12:51:11 -04:00
Roan Horning
6ac65212d7 Merge pull request '[I50] Fix ordering by episode id' (#51) from I50_Fix-ordering-by-episode-id into main
Reviewed-on: rho_n/hpr_generator#51
2022-09-22 01:47:25 +00:00
991b3dcec1
Update SQL query to order results by id 2022-09-21 21:18:48 -04:00
Roan Horning
1c9eb16934 Merge pull request '[I48] Fix MACRO step_navigation' (#49) from I48_Fix-step-navigation into main
Reviewed-on: rho_n/hpr_generator#49
2022-09-20 02:03:41 +00:00
2eaaa11a69
Fix MACRO step_navigation
Check for existence of folder arg instead of empty value.
2022-09-19 22:00:18 -04:00
3723303e31
Fix absolute path for media links 2022-09-18 19:21:19 -04:00
Roan Horning
db46938de6 Merge pull request '[I46] Extract Listen Now markup to macro' (#47) from I46_Extract-Listen-Now-markup-to-macro into main
Reviewed-on: rho_n/hpr_generator#47
2022-09-18 20:32:32 +00:00
3054d6519e
Refactor template to use media_baseurl MACRO 2022-09-18 16:27:47 -04:00
c6e7a3c239
Refactor templates to use listen_now MACRO 2022-09-18 16:23:35 -04:00
dbf011395c
Add MACRO listen_now 2022-09-18 16:21:00 -04:00
c817e3a17a
Add MACRO media_baseurl
Allow the audio files to be served from a different host
2022-09-18 16:18:05 -04:00
0edf9cc5a2
Fix missing id generation for twat episdoe files 2022-09-18 15:36:24 -04:00
Roan Horning
4d34f762d0 Merge pull request '[I43] Integrate twat episodes' (#45) from I43_Today-With-a-Techie-Archived-Shows into main
Reviewed-on: rho_n/hpr_generator#45
2022-09-17 21:47:38 +00:00
dbd9f8e973
Integrate twat episodes
Add twat shows to the full episodes index, the host pages.
Add individule twat episodes.
2022-09-17 17:28:39 -04:00
Ken Fallon
4fdb32934b Added viewport
Google reports issues with this so I added it
https://web.dev/responsive-web-design-basics/#viewport
2022-09-09 07:45:49 +00:00
Roan Horning
5bd96f69e0 Merge pull request 'Calculate date till next available episode slot' (#40) from I39_days-till-next-available-episode into main
Reviewed-on: rho_n/hpr_generator#40
2022-09-06 00:33:17 +00:00
38d2e7c363
Calculate date till next available episode slot 2022-09-05 20:26:12 -04:00
Roan Horning
7691209360 Merge pull request '[I37] Fix display of meta data on the episode page' (#38) from I37_Fix-display-meta-data-episode-page into main
Reviewed-on: rho_n/hpr_generator#38
2022-09-02 22:29:44 +00:00
f7216132a4
Update episode template to match current HPR layout and content 2022-09-02 18:23:50 -04:00
67a8a2bfa4
Add MACRO display_listen_in 2022-09-02 18:21:15 -04:00
cfd463d2b0
Add MACRO display_comments_tally 2022-09-01 23:05:59 -04:00
91cbc81a12
Add MACRO display_tags 2022-09-01 22:58:24 -04:00
Roan Horning
c1a83f8baf Merge pull request '[I35] Add episode comment tally' (#36) from I35_Add-comment-tally into main
Reviewed-on: rho_n/hpr_generator#36
2022-09-01 01:08:45 +00:00
3b72fe6d28
Add comments to episode page 2022-08-31 20:44:31 -04:00
76b976732b
Add comment tally to index page 2022-08-31 20:43:43 -04:00
Roan Horning
bf60d35ed1 Merge pull request '[I33] Format episode duration' (#34) from I33_episode-duration into main
Reviewed-on: rho_n/hpr_generator#34
2022-08-30 02:03:13 +00:00
e2cf52af6e
Use MACRO display_episode_duration in templates 2022-08-29 21:59:24 -04:00
414bae101a
Add MACRO display_episode_duration
Format duration as hh:mm:ss
2022-08-29 21:54:42 -04:00
130 changed files with 23368 additions and 1377 deletions

215
GETTING_STARTED.md Normal file
View File

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

View File

@ -3,51 +3,77 @@ Static web page generator for the Hacker Public Radio website.
## Installation
* Clone or download this repository
* Create the sqlite3 database from the files in the _sql directory. The default name for the database file is "hpr.db" and should be located in the root of the project directory. The name and location can be set in the site.cfg file.
* Two sql helper scripts are available to generate an empty database or a database filled with test data.
- For an empty database: `cat Create_Database_Empty.sql | sqlite3 hpr.db`
- For a database with test data: `cat Create_Database_Test.sql | sqlite3 hpr.db`
* SQLite v3.8.3 or greater is recommended. CTE WITH clauses are used in some template queries. Must convert WITH
clauses to sub-queries when using earlier versions of SQLite.
* With SQLite
* Create the sqlite3 database from the hpr.sql MySQL dump file available on
hackerpublicradio.org. The default name for the database file is "hpr.db"
and should be located in the root of the project directory. The name and
location can be set in the site.cfg file.
* An "update-hpr.sh" helper script is available in the utils directory. This
script will download the hpr.sql file, convert it to the SQLite hpr.db file,
and regenerate the website using the site-generator.
1. `cd` into the root of the project directory
2. Run `./utils/update-hpr.sh`
* SQLite v3.8.3 or greater is recommended. CTE WITH clauses are used in some template queries. Must convert WITH
clauses to sub-queries when using earlier versions of SQLite.
* With MySQL
* Create database hpr_hpr in the MySQL server from HPR dump file.
- ``sudo mysql --host=localhost < hpr.sql``
* Create a user that will be used by the site-generator.
- Suggested username: hpr-generator
- ``CREATE USER 'hpr-generator'@'localhost' IDENTIFIED BY '<password>';``
* Limit the user's privileges to EXECUTE and SELECT
- ``GRANT SELECT ON hpr_hpr.* TO 'hpr-generator'@'localhost';``
- ``GRANT EXECUTE ON `hpr_hpr`.* TO 'hpr-generator'@'localhost';``
* Install the needed Perl modules using preferred method (distribution packages, CPAN, etc.)
* GetOpt
* Getopt::Long
* Pod::Usage
* Config::Std
* Template
* Template::Plugin::File
* Template::Plugin::DBI
* Template::Plugin::Date
* Template::Plugin::HTML::Strip
* DBI
* Tie::DBI
* DBD::SQLite
* DBD::SQLite or DBD::mysql
* Date::Calc
* Text::CSV_XS
* HTML::Entities
* See the [Getting Started](GETTING_STARTED.md) tutorial for more details on
installing the HPR generator.
## Usage
Generate two specific pages:
`site-generator index about`
`site-generator index about`
Generate the whole site:
`site-generator --all`
`site-generator --all`
Generate pages based on the same template:
`site-generator correspondent=1,3,5..10`
## Support
Please [submit an Issue](https://repo.anhonesthost.net/rho_n/hpr_generator/issues),
Please [submit an Issue](https://repo.anhonesthost.net/HPR/hpr_generator/issues),
and add the label "**Help Request**" for help running or installing the site-generator.
For discussing HPR site generation in general, please [submit an Issue](https://repo.anhonesthost.net/rho_n/hpr_generator/issues) and add the label "**General Discussion**".
For discussing HPR site generation in general, please [submit an Issue](https://repo.anhonesthost.net/HPR/hpr_generator/issues) and add the label "**General Discussion**".
## Contributing
Happy to take any contributions or suggestions.
To contribute code or documentation, please create a fork of the project and [submit a pull request](https://repo.anhonesthost.net/rho_n/hpr_generator/pulls) or send a patch. If an issue exists that is related to your patch, please assign the issue to yourself, or if it is already assigned to someone else, please coordinate with them to minimize duplicated efforts.
To contribute code or documentation, please create a fork of the project and [submit a pull request](https://repo.anhonesthost.net/HPR/hpr_generator/pulls) or send a patch. If an issue exists that is related to your patch, please assign the issue to yourself, or if it is already assigned to someone else, please coordinate with them to minimize duplicated efforts.
If you have found an error in the code or the generated HTML, please [submit an Issue](https://repo.anhonesthost.net/rho_n/hpr_generator/issues),
If you have found an error in the code or the generated HTML, please [submit an Issue](https://repo.anhonesthost.net/HPR/hpr_generator/issues),
and add the label "**Bug Found**".
To make a suggestion, please [submit an Issue](https://repo.anhonesthost.net/rho_n/hpr_generator/issues),
To make a suggestion, please [submit an Issue](https://repo.anhonesthost.net/HPR/hpr_generator/issues),
and add the label "**Feature Request**".
## Authors and acknowledgment
* Roan "Rho`n" Horning
* Roan "Rho`n" Horning
* Dave Morriss
* gordons
* Ken Fallon
* norrist

View File

@ -1,262 +1,494 @@
@charset "utf-8";
/* Website design Copyright Ken Fallon - Released into the public domain/
http://creativecommons.org/publicdomain/
https://creativecommons.org/publicdomain/
*/
/*
* See the following for the modern CSS responsive design techniques used in this file:
* - MDN web docs: Responsive design
* -- https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Responsive_Design
* - Matthew James Tayler: Responsive Font Size (Optimal Text at Every Breakpoint)
* -- https://matthewjamestaylor.com/responsive-font-size
* - CSS-Tricks: Linearly Scale font-size with CSS clamp() Based on the Viewport
* -- https://css-tricks.com/linearly-scale-font-size-with-css-clamp-based-on-the-viewport/
*/
p.meta span label { font-weight: bold; }
@media only screen and (min-width: 479px) {
body {background: #dfdfdf;}
div, h1, h2, h3, h4, h5, h6, p, ul, ol, li, dl, dt, dd, img, form, fieldset, input, textarea, blockquote {
font-family: Verdana, Arial, Helvetica, sans-serif;/* 1em/1.5 OpenDyslexic, */
color: #4D4D4D; /* HPR Grey */
background: white;
html {
margin: 0;
padding: 0;
display: block;
}
body {
display: block;
background: #dfdfdf;
font-size: 1rem; /* fallback for browsers that don't support the clamp function) */
font-size: clamp(1rem, 15px + 0.3vw, 1.07rem);
margin: 0;
padding: 0;
}
#container {
width: 100%;
max-width: 58em;
margin: auto;
overflow: hidden;
padding: .5em;
border: thin solid;
div,
h1,
h2,
h3,
h4,
h5,
h6,
p,
ul,
ol,
li,
dl,
dt,
dd,
img,
form,
fieldset,
input,
textarea,
blockquote {
font-family: Verdana, Arial, Helvetica, sans-serif; /* 1em/1.5 OpenDyslexic, */
color: #4D4D4D; /* HPR Grey */
background: white;
}
.shadow {
-moz-box-shadow: 2px 3px 6px 3px #675958;
-webkit-box-shadow: 2px 3px 6px 3px #675958;
box-shadow: 2px 3px 6px 3px #675958;}
#hprlogo {
display: block;
position: relative;
top: 0;
left: 0;
border: 0;
margin: 0.75em;
float:left;
h1 {
font-size: 1.5rem;
margin: 1.25rem 0 0.75rem 0;
}
#hpr_banner {
display: block;
position: relative;
border: 0;
margin: 0.75em;
float: left;
h2,
article * h1 {
font-size: 1.45rem;
margin: 1.25rem 0 0.75rem 0;
}
#hpr_banner h1 {margin: -.25em 0em -.5em 0em;}
#hpr_banner h2 {font-size: 100%; font-weight: lighter; }
#hpr_banner h3 {font-size: 90%; font-weight: lighter; }
#accessible_menu {
font-size: small;
h3,
article * h2 {
font-size: 1.25rem;
margin: 1.25rem 0 0.75rem 0;
}
/* The main navigation menu */
.menu {
background: #4D4D4D; /* HPR Grey */
text-align: Left;
clear:both; /* Forces the menu to appear after the HPR Header block */
padding: 0em 0em;
margin: 0em 0em;
h4,
article * h3 {
font-size: 1.15rem;
margin: 1.25rem 0 0.75rem 0;
}
.menu ul ul { /* Causes the sub menus not to be displayed, until hover shows them */
display: none;
img {
max-width: 100%;
height: auto;
}
#main_menu li a {display: block;}
.menu ul li { padding: .25em 0em;}
ul {
padding-left: 1.15rem;
}
.menu ul { /* The menu bar background across screen */
background: #4D4D4D; /* HPR Grey */
color: white;
padding: 0 10px; /* Keeps sub menus to the left */
list-style: none;
position: relative;
margin: 0;
display: inline-table;
li {
line-height: 1.25;
}
.menu ul:after { /* Forces the dropdown to be a block with non float */
content: "";
clear: both;
display: block;
a {
text-decoration: none;
}
.menu ul li {
background: #4D4D4D; /* HPR Grey */
color: white;
float: left;
padding: .5em 1em;
a:hover {
cursor: pointer;
}
.menu ul li a {
background: #4D4D4D; /* HPR Grey */
color: white;
display: block;
text-decoration: none;
}
.menu ul ul {
background: #4D4D4D; /* HPR Grey */
color: white;
padding: 0;
position: absolute;
top: 100%;
}
.menu ul ul li {
background: #4D4D4D; /* HPR Grey */
color: white;
float: none;
position: relative;
}
.menu ul ul ul {
position: absolute;
left: 100%;
top:0;
}
hr {
background: #4D4D4D; /* HPR Grey */
border: 0;
height: 0.25em;
background: #4D4D4D;
border: 0;
height: 0.25em;
}
/* The multi colum footer layout */
#footer_page {
width:100%;
audio {
padding: .7em 0em .5em 0em;
clear: both;
position: relative;
z-index: auto;
}
.column {
width:12%;
background-color: white;
color: #4D4D4D; /* HPR Grey */
float:left;
margin:0 10px;
display: block;
.audcredit {
font-size: 75%;
margin-bottom: 1em;
}
.column li {
list-style:none;
padding: .25em 0em;
font-size: 85%;
p.meta {
line-height: 1.25;
}
p.meta span label {
font-weight: bold;
}
article>p,
#maincontent>p {
line-height: 1.45;
}
article#previous_five_weeks>* {
line-height: 1.35;
margin: 0;
padding: 0;
}
article#previous_five_weeks>h3 {
margin: 1.5rem 0 0.5rem 0;
}
#container {
max-width: 58rem;
margin: 0.25rem;
padding: 0.75rem; /* fallback for browsers that don't support the clamp function) */
padding: clamp(0.75rem, -0.25rem + 3vw, 2.0rem);
overflow: hidden;
background: white;
border: thin solid #4D4D4D;
}
.shadow {
-moz-box-shadow: 2px 3px 6px 3px #675958;
-webkit-box-shadow: 2px 3px 6px 3px #675958;
box-shadow: 2px 3px 6px 3px #675958;
}
.thick_bar {
width:100%;
background-color: #4D4D4D; /* HPR Grey */
color: white;
float:left;
clear: both;
height:1.5em;
padding: .5em 0em .5em 0em;
font-size: 1em;
margin: 1em 0em 1em 0em;
background-color: #4D4D4D;
color: white;
padding: 0.5rem;
margin: 1rem 0 1rem 0;
}
#more_info {margin: auto;}
nav.column { display: block; padding: 0em 1em 0em 1em;}
#copyright {
font-size: small;
width:100%;
float:left;
img#hprlogo {
max-width: 20vw;
padding-right: clamp(0.75rem, -0.25rem + 3vw, 1.5rem);
float: left;
margin-top: 1rem;
margin-bottom: clamp(0.75rem, -0.25rem + 2vw, 1.5rem);
}
article, #copyright p {
padding: 0 10px;
#hpr_banner {
/* display: inline-block; */
border: 0;
margin: 0 0 0rem 0;
padding: 0;
}
audio {padding: .7em 0em .5em 0em; clear: both; position: relative; z-index:auto;}
.audcredit { font-size: 75%;margin-bottom: 1em;}
h1.showtitle { font-size: 125%;}
/* Full Index Page styling */
#index_full h2.title {
font-weight: lighter;
margin-bottom: -.5em;
padding: .5em 0em 0em 0em;
font-size: 110%;}
#index_full p.meta {font-size: 85%;}
#small {
font-size: small;
#hpr_banner p {
margin: 0 0 0.5rem 0;
}
p.author { font-size: 85%;}
p.shownotes { padding: .5em;}
#maincontent footer p { font-size: 75%; margin-bottom: 1em;}
/* link styling */
a:link {text-decoration: none;}
table {
width:100%;
}
table, th, td {
border-collapse: collapse;
padding: 2px;
text-align: left;
}
table#t01, table#t01 th, table#t01 td {
border: 1px solid black;
}
table#t01 th, table#t01 td {
padding: 5px;
text-align: left;
}
table#t01 tr:nth-child(even) {
background-color: #eee;
}
table#t01 tr:nth-child(odd) {
background-color:#fff;
}
table#t01 th {
background-color: #4D4D4D;
color: white;
#hpr_banner h1#sitename {
font-size: clamp(1.44rem, -1rem + 3vw, 2rem);
letter-spacing: 0.06rem;
margin: 0;
padding: 0;
}
pre { /* Add background, border and scrollbar to <pre> */
background: #eee;
border: 1px solid #ddd;
overflow: auto;
clear: both;
#hpr_banner h2 {
font-size: clamp(0.74rem, -1rem + 2vw, 1rem);
font-weight: 510;
margin: 0 0 1rem 0;
padding: 0;
}
#hpr_banner h3 {
font-size: 1rem;
font-weight: normal;
margin: 0 0 0.5rem 0;
padding: 0;
}
header>hr {
clear: both;
}
#accessible_menu {
font-size: smaller;
}
/* The main navigation menu */
header>nav.menu {
display: block;
background-color: #4D4D4D; /* HPR Grey */
text-align: Left;
clear: both; /* Forces the menu to appear after the HPR Header block */
padding: 0;
margin: 0;
}
header>nav.menu ul {
margin: 0;
padding: 0.5rem;
background-color: inherit;
color: white;
}
header>nav.menu ul li {
display: inline-block;
background-color: inherit;
color: inherit;
line-height: 1.5;
margin: 0;
padding: 0;
padding-right: clamp(0.5rem, -0.25rem + 3vw, 2.5rem);
}
header>nav.menu ul li a {
color: white;
text-decoration: none;
display: block;
padding: 0.25rem 0;
}
header>nav.menu ul li a:hover {
border-bottom: thin solid white;
padding: 0.15rem 0;
-webkit-transition: 0.3s ease-in-out color;
-moz-transition: 0.3s ease-in-out color;
transition: 0.3s ease-in-out color;
}
header>nav.menu ul li a:visited {
color: #EDEDED;
}
a:active,
header>nav.menu ul li a:active {
color: red;
}
pre {
/* Add background, border and scrollbar to <pre> */
background: #eee;
border: 1px solid #ddd;
overflow: auto;
clear: both;
padding: 0.5rem
}
pre code {
padding-right: 0.5rem;
font-size: 0.85rem;
line-height: 1;
}
pre.comment {
white-space: pre-wrap;
line-height: 1.2rem;
}
table.hosts {
font-size: clamp(0.82rem, -0.25rem + 3vw, 1.0rem);
width: 100%;
background: white;
margin: 0 auto;
border-collapse: collapse;
display: inline-table;
}
@media only screen and (max-width: 680px) {
#container {width: 95%;}
img#hprlogo {float: left; max-width: 85px; padding: .35em;}
.column {width: 15%;}
h1 {font-size: 140%;}
h2 {font-size: 120%;}
h3 {font-size: 100%;}
nav.column { display: block; padding: 0em .25em 0em .25em;}
#footer_page li {font-size: 85%; padding: .5em .25em .5em .25em;}
footer p {font-size: 75%;}
audio {float: none; }
table.hosts tr:nth-child(even) {
background-color: #cccccc;
border-bottom: thick solid white;
}
@media only screen and (max-width: 479px) {
body {background: #ffffff; color: #4D4D4D; font-family: Verdana, Arial, Helvetica, sans-serif;/* 1em/1.5 OpenDyslexic, */}
li {font-size: 100%; padding: .75em 0em .75em 0em; margin-left: -.25em;}
img#hprlogo {float: left; max-width: 65px; padding: .35em;}
.column {width: auto;}
h1#sitename { clear: both;}
a:link {text-decoration: none;}
audio {padding: .7em 0em .5em 0em; width: 95%; max-width: 300px;}
.audcredit { font-size: 65%; margin-bottom: 1em;}
table.hosts tr:nth-child(odd) {
background-color: white;
border-bottom: thick solid white;
}
table.hosts tr td img {
vertical-align: middle;
max-height: 80px;
}
table.hosts th:first-child,
table.hosts td:first-child {
min-width: 60px;
max-width: 80px;
text-align: left;
}
table.hosts th:nth-child(2),
table.hosts td:nth-child(2) {
text-align: left;
padding-left: clamp(0.15rem, -0.25rem + 3vw, 0.5rem);
}
table.hosts th:nth-child(3),
table.hosts td:nth-child(3),
table.hosts th:nth-child(4),
table.hosts td:nth-child(4) {
width: 10%;
padding-right: clamp(0.10rem, -0.25rem + 3vw, 1rem);
}
body>div>footer {
margin-top: 2rem;
}
footer #more_info nav.column {
clear: both;
font-size: 0.9rem;
margin-left: 0.5rem;
}
footer #more_info nav.column ul li {
float: left;
margin-right: 1.5rem;
margin-bottom: 1rem;
}
footer #more_info nav.column h2 {
font-size: 1.35rem;
margin-top: 0.5rem;
}
footer h1.thick_bar {
clear: left;
font-size: 1.15rem;
}
footer #copyright {
font-size: smaller;
margin-left: 0.5rem;
margin-right: 0.5rem;
}
fieldset>table,
fieldset>table thead,
fieldset>table tbody,
fieldset>table tr,
fieldset>table th,
fieldset>table td,
fieldset>table td input,
fieldset>table td textarea {
display: block;
font-size: 1rem;
}
fieldset>table {
width: calc(100vw + -16vw + -1rem);
max-width: 100%;
}
fieldset>table td input,
fieldset>table td textarea {
width: calc(100vw + -16vw + -1.5rem);
max-width: 100%;
border: thin solid #DFDFDF;
margin-bottom: 0.5rem;
padding: 0.5rem;
}
fieldset>table td select {
margin-bottom: 0.5rem;
padding: 0.25rem;
}
fieldset>table td input[type="radio"] {
display: initial;
width: initial;
margin-bottom: 0.5rem;
}
fieldset>input {
background: #4D4D4D;
color: white;
font-weight: 600;
padding: 0.5rem;
border: thin solid #DFDFDF;
border-radius: 0.2rem;
}
@media only screen and (min-width: 58rem) {
#container {
margin: 0.5rem auto;
}
.shadow {
-moz-box-shadow: 1px 2px 5px 2px #675958;
-webkit-box-shadow: 1px 2px 5px 2px #675958;
box-shadow: 1px 2px 5px 2px #675958;
}
img#hprlogo {
margin-bottom: 1.5rem;
}
#hpr_banner {
float: left;
}
#hpr_banner h1#sitename {
font-size: 2rem;
}
#hpr_banner h2 {
font-size: 1rem;
}
header>hr {
clear: right;
}
footer #more_info nav.column {
clear: none;
float: left;
width: 19.5%;
margin-left: 0;
}
footer #more_info nav.column:first-child {
margin-left: 0.5rem;
}
footer #more_info nav.column ul li {
float: none;
margin-bottom: 0.5rem;
}
fieldset>table,
fieldset>table thead,
fieldset>table tbody,
fieldset>table tr,
fieldset>table th,
fieldset>table td,
fieldset>table td input,
fieldset>table td textarea {
display: revert;
width: revert;
}
fieldset>table tr {
vertical-align: baseline;
}
fieldset>table tr:nth-child(3) {
vertical-align: top;
}
fieldset>table tr:nth-child(3) td:first-child {
padding-top: 0.5rem;
}
fieldset>table tr:nth-last-child(3) td:first-child {
padding-top: 1rem;
}
fieldset>table tr:nth-last-child(2) {
vertical-align: top;
}
fieldset>table tr:nth-last-child(2) td:first-child {
padding-top: 0.75rem;
}
fieldset>table td input[type="radio"] {
margin-top: 1.5rem;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 405 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 838 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,68 +1,96 @@
#!/usr/bin/perl
# {{{ POD documentation
=head1 NAME
site-generator - HPR Site Generator
site-generator - HPR Site Generator
=head1 SYNOPSIS
site-generator [OPTION]... PAGE|PAGE=<comma separated list of ids>...
site-generator [OPTION]... PAGE|PAGE=<comma separated list of ids>...
-a, --all generate all pages defined in configuration file
-l, --list print list of configured pages
-p, --preview print generated pages to standard out
-q, --quiet suppress progress information while generating pages
-v, --verbose print extended progress information while generating pages
--help print this help message
-a, --all generate all pages defined in configuration file
-c, --configuration path to configuration file
-l, --list print list of configured pages
-p, --preview print generated pages to standard out
-q, --quiet suppress progress information while generating pages
-v, --verbose print extended progress information while generating pages
--help print this help message
Where I<PAGE> is a file name of a web page
or the special I<ALL> (to generate all pages).
Where I<PAGE> is a file name of a web page
or the special I<ALL> (to generate all pages).
Examples:
Examples:
Generate two specific pages:
site-generator index about
Generate two specific pages:
site-generator index about
Generate the whole site:
site-generator --all
Generate the whole site:
site-generator --all
Generate pages based on the same template:
site-generator correspondent=1,3,5..10
Generate two specific pages with a different configuration:
site-generator --configuration=site_sqlite.cfg index about
Generate pages based on the same template:
site-generator correspondent=1,3,5..10
=head1 DESCRIPTION
This is a site generator for the Hacker Public Radio website based upon the Perl Templates Toolkit.
This is a site generator for the Hacker Public Radio website based upon the
Perl Template Toolkit.
=head1 INSTALLATION
* Create the sqlite3 database from the files in the _sql directory. The default name for the
database file is "hpr.db" and should be located in the root of the project directory. The
name and location can be set in the site.cfg file.
* Two sql helper scripts are available to generate an empty database or a database filled with test data.
- For an empty database: `cat Create_Database_Empty.sql | sqlite3 hpr.db`
- For a database with test data: `cat Create_Database_Test.sql | sqlite3 hpr.db`
* SQLite v3.8.3 or greater is recommended. CTE WITH clauses are used in some template queries. Must convert WITH
clauses to sub-queries when using earlier versions of SQLite.
* Install the needed Perl modules using preferred method (distribution packages, CPAN, etc.)
* GetOpt
* Pod::Usage
* Config::Std
* Template
* Template::Plugin::File
* Template::Plugin::DBI
* DBI
* Tie::DBI
* DBD::SQLite
* Date::Calc
With SQLite
* Create the sqlite3 database from the hpr.sql MySQL dump file available on
hackerpublicradio.org. The default name for the database file is "hpr.db"
and should be located in the root of the project directory. The name and
location can be set in the site.cfg file.
* An "update-hpr.sh" helper script is available in the utils directory. This
script will download the hpr.sql file, convert it to the SQLite hpr.db file,
and regenerate the website using the site-generator.
1. `cd` into the root of the project directory
2. Run `./utils/update-hpr.sh`
* SQLite v3.8.3 or greater is recommended. CTE WITH clauses are used in some template queries.
Must convert WITH clauses to sub-queries when using earlier versions of SQLite.
With MySQL
* Create database hpr_hpr in the MySQL server from HPR dump file.
- sudo mysql --host=localhost < hpr.sql
* Create a user that will be used by the site-generator.
- Suggested username: hpr-generator
- CREATE USER 'hpr-generator'@'localhost' IDENTIFIED BY '<password>';
* Limit the user's privileges to EXECUTE and SELECT
- GRANT SELECT ON hpr_hpr.* TO 'hpr-generator'@'localhost';
- GRANT EXECUTE ON `hpr_hpr`.* TO 'hpr-generator'@'localhost';
Install the needed Perl modules using preferred method (distribution packages, CPAN, etc.)
* Config::Std
* DBD::SQLite or DBD:mysql
* DBI
* Data::Dumper
* Date::Calc
* GetOpt::Long
* HTML::Entities
* Pod::Usage
* Template
* Template::Plugin::DBI
* Template::Plugin::Date
* Template::Plugin::File
* Template::Plugin::HTML::Strip
* Text::CSV_XS
* Tie::DBI
=head1 AUTHOR
Roan Horning <roan.horning@no-spam.gmail.com>
Roan Horning <roan.horning@no-spam.gmail.com>
=head1 LICENSE
site-generator -- a static website generator for HPR
Copyright (C) 2022 Roan Horning
site-generator -- a static website generator for HPR
Copyright (C) 2022 Roan Horning
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
@ -75,228 +103,332 @@ This is a site generator for the Hacker Public Radio website based upon the Perl
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
along with this program. If not, see <https://www.gnu.org/licenses/>.
=cut
# }}}
use 5.012;
use strict;
use warnings;
use open ':encoding(UTF-8)';
use Getopt::Long qw(:config auto_help);
use Pod::Usage;
use Config::Std;
use Text::CSV_XS;
#use HTML::Entities qw(encode_entities_numeric);
use HTML::Entities qw(encode_entities);
use Date::Calc;
use DBI;
use Tie::DBI;
use Template;
use Template::Plugin::Date;
use Template::Plugin::DBI;
use Template::Plugin::HTML::Strip;
use Data::Dumper;
exit main();
sub main {
# Argument parsing
my $all;
my $preview;
my $verbose;
my $quiet;
GetOptions(
'all' => \$all,
'list' => \&print_available_pages,
'preview' => \$preview,
'verbose' => \$verbose,
'quiet' => \$quiet,
) or pod2usage(1);
pod2usage(1) unless @ARGV || $all;
my (@page_args) = @ARGV;
# Argument parsing
my $all;
my $configuration_path;
my $preview;
my $verbose;
my $quiet;
GetOptions(
'all' => \$all,
'configuration=s' => \$configuration_path,
'list' => \&print_available_pages,
'preview' => \$preview,
'verbose' => \$verbose,
'quiet' => \$quiet,
) or pod2usage(1);
pod2usage(1) unless @ARGV || $all;
my (@page_args) = @ARGV;
if ($quiet) {
$verbose = 'quiet';
};
if ($quiet) {
$verbose = 'quiet';
};
# Load config file
read_config "site.cfg" => my %config;
if (!$configuration_path) {
$configuration_path = "site.cfg";
}
my $tt = get_template_html($config{DBI});
my %config;
if ( -f $configuration_path ) {
# Load config file
read_config $configuration_path => %config;
}
else {
print STDOUT "Could not read configuration file: $configuration_path\n";
exit 1;
}
# If command line option all is set, parse configuration file
# for all pages
if ($all) {
@page_args = keys %config;
my $tt = get_template_html($config{DBI}, $config{app_paths});
# Remove non page sections of the configuration file
# from the generated list of pages.
@page_args= grep { $_ ne 'DBI' } @page_args;
@page_args= grep { $_ ne 'root_template' } @page_args;
};
foreach my $page_arg (@page_args) {
my %parsed_arg = parse_page_arg($page_arg);
if (exists($config{$parsed_arg{'page'}})) {
my $page_config = $config{$parsed_arg{'page'}};
$page_config->{'page'} = $parsed_arg{'page'};
#
# Define a TT² vmethod called 'csv_parse', it takes a scalar value and
# returns an arrayref. Also define a filter called 'xml_entity' which
# numerically encodes non-ASCII characters.
#
$tt->context->define_vmethod( 'scalar', 'csv_parse', \&parse_csv );
$tt->context->define_filter( 'xml_entity', \&xml_entity );
# Set page's root_template to the default root_template if the
# page root_template property is not set in the configuration file.
if (exists $page_config->{'root_template'} == 0) {
$page_config->{'root_template'} = $config{root_template}{content};
}
# If command line option all is set, parse configuration file
# for all pages
if ($all) {
@page_args = keys %config;
if (exists $config{root_template}{baseurl}) {
$page_config->{'baseurl'} = $config{root_template}{baseurl};
}
# Remove non page sections of the configuration file
# from the generated list of pages.
@page_args= grep { $_ ne 'DBI' } @page_args;
@page_args= grep { $_ ne 'root_template' } @page_args;
@page_args= grep { $_ ne 'app_paths' } @page_args;
if ($page_config->{'multipage'} && $page_config->{'multipage'} eq 'true') {
if (scalar @{$parsed_arg{'ids'}} == 1) {
@{$parsed_arg{'ids'}} = get_ids_from_db($tt, \$page_config);
}
foreach my $id (@{$parsed_arg{'ids'}}) {
$page_config->{'id'} = $id;
verbose ($verbose, "Generating page: $page_config->{'page'} with id: $id");
generate_page($tt, \$page_config, $preview);
}
}
else {
verbose ($verbose, "Generating page: $page_config->{'page'}");
generate_page($tt, \$page_config, $preview);
}
}
else {
verbose (1, "\nWarning: Page $parsed_arg{'page'} is not defined in the configuration file.");
}
}
};
foreach my $page_arg (@page_args) {
my %parsed_arg = parse_page_arg($page_arg);
if (exists($config{$parsed_arg{'page'}})) {
my $page_config = $config{$parsed_arg{'page'}};
$page_config->{'page'} = $parsed_arg{'page'};
# Set page's root_template to the default root_template if the
# page root_template property is not set in the configuration file.
if (exists $page_config->{'root_template'} == 0) {
$page_config->{'root_template'} = $config{root_template}{content};
}
# Set all config root_template properties as default page config properties
# except the previously set root_template content property
my @root_args = grep { $_ ne 'content' } keys %{$config{root_template}};
foreach my $root_arg (@root_args) {
if (exists $page_config->{$root_arg} == 0) {
$page_config->{$root_arg} = $config{root_template}{$root_arg};
}
}
if ($page_config->{'multipage'} && $page_config->{'multipage'} eq 'true') {
if (scalar @{$parsed_arg{'ids'}} == 0) {
@{$parsed_arg{'ids'}} = get_ids_from_db($tt, \$page_config);
}
foreach my $id (@{$parsed_arg{'ids'}}) {
$page_config->{'id'} = $id;
verbose ($verbose, "Generating page: $page_config->{'page'} with id: $id");
generate_page($tt, \$page_config, $preview);
}
}
else {
verbose ($verbose, "Generating page: $page_config->{'page'}");
generate_page($tt, \$page_config, $preview);
}
}
else {
verbose (1, "\nWarning: Page $parsed_arg{'page'} is not defined in the configuration file.");
}
}
verbose (1, "\nFinished processing the files.");
return 0;
return 0;
}
sub get_template_html (\%@) {
# For an HTML based Template file, define the
# template start and end tags to also function as
# HTML comments to make the template file valid HTML.
#
return Template->new({
INCLUDE_PATH => './templates',
OUTPUT_PATH => './public_html',
EVAL_PERL => 1,
START_TAG => '<!--%',
END_TAG => '%-->',
PRE_CHOMP => 1,
POST_CHOMP => 1,
CONSTANTS => {
driver => $_[0]{driver},
user => $_[0]{user},
password => $_[0]{password},
}
}) || die $Template::ERROR, "\n";
sub get_template_html {
# For an HTML based Template file, define the
# template start and end tags to also function as
# HTML comments to make the template file valid HTML.
#
return Template->new(
{ INCLUDE_PATH => $_[1]{templates_path},
OUTPUT_PATH => $_[1]{output_path},
EVAL_PERL => 1,
START_TAG => '<!--%',
END_TAG => '%-->',
PRE_CHOMP => 1,
POST_CHOMP => 1,
CONSTANTS => {
database => $_[0]{database},
driver => $_[0]{driver},
user => $_[0]{user},
password => $_[0]{password},
}
}
) || die $Template::ERROR, "\n";
}
sub generate_page {
my ($tt, $config, $preview) = @_;
my $html;
if (!$preview) {
$html = get_filename($$config);
}
$tt->process($$config->{root_template}, $$config, $html)
|| die $tt->error(), "\n";
sub generate_page {
my ( $tt, $config, $preview ) = @_;
my $html;
if ( !$preview ) {
$html = get_filename($$config);
}
$tt->process( $$config->{root_template},
$$config, $html
)
|| die $tt->error(), "\n";
}
sub verbose {
my ($verbose, $message) = @_;
if ($verbose) {
if ($verbose ne 'quiet') {
print STDOUT "$message\n";
}
}
else {
STDOUT->autoflush(1);
print STDOUT ".";
};
my ($verbose, $message) = @_;
if ($verbose) {
if ($verbose ne 'quiet') {
print STDOUT "$message\n";
}
}
else {
STDOUT->autoflush(1);
print STDOUT ".";
};
}
sub parse_page_arg {
my ($page_arg) = @_;
# Split page name from page ids if available.
my ($page, $ids) = split(/=/, $page_arg);
my @ids = [];
my ($page_arg) = @_;
# Split page name from page ids if available.
my ($page, $ids) = split(/=/, $page_arg);
my @ids;
$ids = "" unless defined $ids;
if(!$ids) {
$ids = "";
}
else {
# Parse the page ids and push them onto @ids array
my @ids_by_comma = split(/\,/, $ids);
foreach my $id_by_comma (@ids_by_comma) {
my @ids_for_range = split(/\.\./, $id_by_comma);
if ((scalar @ids_for_range) == 2) {
push @ids, $ids_for_range[0]..$ids_for_range[1];
}
elsif ((scalar @ids_for_range) == 1) {
push @ids, $ids_for_range[0];
}
else {
verbose (1, "\nWarning: Page $page id range $id_by_comma could not be parsed.");
}
}
}
return ('page' => $page, 'ids' => [@ids]);
# Parse the page ids and push them onto @ids array
my @ids_by_comma = split(/\,/, $ids);
foreach my $id_by_comma (@ids_by_comma) {
my @ids_for_range = split(/\.\./, $id_by_comma);
if ((scalar @ids_for_range) == 2) {
push @ids, $ids_for_range[0]..$ids_for_range[1];
}
elsif ((scalar @ids_for_range) == 1) {
push @ids, $ids_for_range[0];
}
else {
verbose (1, "\nWarning: Page $page id range $id_by_comma could not be parsed.");
}
}
return ('page' => $page, 'ids' => [@ids]);
}
sub get_ids_from_db {
# Use a template to generate a string of page identifiers.
# The template should return the string in the form of
# <comma><identifier><comma><identifier>...
#
my ($tt, $config) = @_;
my $selected_ids = "";
my $id_template = "ids-$$config->{'page'}.tpl.html";
# Use a template to generate a string of page identifiers.
# The template should return the string in the form of
# <comma><identifier><comma><identifier>...
#
my ($tt, $config) = @_;
my $selected_ids = "";
my $id_template = "ids-$$config->{'page'}.tpl.html";
$tt->process($id_template, $$config, \$selected_ids)
|| die $tt->error(), "\n";
return split(/,/, substr($selected_ids, 1));
$tt->process($id_template, $$config, \$selected_ids)
|| die $tt->error(), "\n";
# Starts with a newline and comma
return split(/,/, substr($selected_ids, 1));
}
sub get_filename {
my ($config) = @_;
my $filename = "output.html";
my $base_path = "";
my ($config) = @_;
my $filename = "output.html";
my $base_path = "";
if ($$config{'filename'}) {
if (substr($$config{'filename'}, -1) eq '/') {
$base_path = $$config{'filename'};
}
else {
$filename = $$config{'filename'};
my $padded_index = "";
if (exists $$config{'id'}) {
$padded_index = sprintf("%04d", $$config{'id'});
}
$filename =~ s/\[id\]/$padded_index/;
return $filename;
}
}
# Default naming if full filename configuration is not supplied.
if ($$config{'multipage'} && $$config{'multipage'} eq 'true') {
my $padded_index = sprintf("%04d", $$config{'id'});
$filename = "$base_path$$config{'page'}${padded_index}.html";
}
else {
$filename = "$base_path$$config{'page'}.html";
}
return $filename;
if ($$config{'filename'}) {
if (substr($$config{'filename'}, -1) eq '/') {
$base_path = $$config{'filename'};
}
else {
$filename = $$config{'filename'};
my $padded_index = "";
if (exists $$config{'id'} && $$config{'id'} ne "") {
$padded_index = sprintf("%04d", $$config{'id'});
}
$filename =~ s/\[id\]/$padded_index/;
return $filename;
}
}
# Default naming if full filename configuration is not supplied.
if ($$config{'multipage'} && $$config{'multipage'} eq 'true') {
my $padded_index = sprintf("%04d", $$config{'id'});
$filename = "$base_path$$config{'page'}${padded_index}.html";
}
else {
$filename = "$base_path$$config{'page'}.html";
}
return $filename;
}
sub print_available_pages {
# Load config file
read_config "site.cfg" => my %config;
# Load config file
read_config "site.cfg" => my %config;
my @page_args = sort (keys %config);
my @page_args = sort ( keys %config );
# Remove non page sections of the configuration file
# from the generated list of pages.
@page_args= grep { $_ ne 'DBI' } @page_args;
@page_args= grep { $_ ne 'root_template' } @page_args;
# Remove non page sections of the configuration file
# from the generated list of pages.
@page_args = grep { $_ ne 'DBI' } @page_args;
@page_args = grep { $_ ne 'root_template' } @page_args;
foreach my $page_arg (@page_args) {
print "$page_arg\n";
}
exit;
foreach my $page_arg (@page_args) {
print "$page_arg\n";
}
exit;
}
#=== FUNCTION ================================================================
# NAME: parse_csv
# PURPOSE: Parses a simple string containing CSV data
# PARAMETERS: $csv_in CSV string
# RETURNS: An arrayref containing the parsed CSV elements
# DESCRIPTION: The Text::CSV_XS module instance is created with the option
# 'allow_whitespace' to be forgiving of any spaces around the
# CSV elements and to strip them. Also, 'allow_loose_quotes' is
# forgiving of really messed up CSV. The 'binary' option
# permits any characters in the tags (expecting Unicode).
# The fields parsed from the tag string is checked for the
# existence of utf8 characters and encoded to ensure any found
# are properly stored.
# THROWS: No exceptions
# COMMENTS: None
# SEE ALSO: N/A
#===============================================================================
sub parse_csv {
my ($csv_in) = @_;
my $csv = Text::CSV_XS->new(
{ binary => 1,
auto_diag => 1,
allow_whitespace => 1,
allow_loose_quotes => 1
}
);
my $status = $csv->parse($csv_in);
unless ( $status ) {
warn "Failed to parse CSV '$csv_in'\n" ;
return;
}
my @fields = $csv->fields();
@fields = map {utf8::encode($_) if utf8::is_utf8($_); $_} @fields;
return \@fields;
}
#=== FUNCTION ================================================================
# NAME: xml_entity
# PURPOSE: Static filter to encode Unicode for XML
# PARAMETERS: $text String to be processed
# RETURNS: Processed text
# DESCRIPTION:
# THROWS: No exceptions
# COMMENTS: None
# SEE ALSO: N/A
#===============================================================================
sub xml_entity {
my ($text) = @_;
# encode_entities_numeric( $text );
encode_entities( $text );
return $text;
}
# vim: syntax=perl:ts=8:sw=4:et:ai:tw=78:fo=tcrqn21:fdm=marker

104
site.cfg
View File

@ -1,10 +1,24 @@
# Configure the Perl DBI driver to allow the templates communicate
# with the database.
# dbi:<driver name [SQLite, CSV, ADO, mSQL, etc.]>:<database name>
# For more information on Perl Template Toolkit see:
# http://template-toolkit.org/docs/manual/index.html
[DBI]
# Configuration settings for SQLite
database: sqlite
driver: dbi:SQLite:hpr.db
user:
password:
#user: (not used - leave blank)
#password: (not used - leave blank)
# Configuration settings for MySQL
#database: mysql
#driver: dbi:mysql:database=hpr_hpr:hostname=localhost
#user: hpr-generator (Suggested user with read-only privileges)
#password: ********* (Password for user)
# Configure the location of the templates and the generated HTML
[app_paths]
templates_path: ./templates
output_path: ./public_html
# Configure the root template page which pulls in the navigation and
# content templates used by each page. An optional baseurl property may
@ -13,6 +27,13 @@ password:
[root_template]
content: page.tpl.html
#baseurl: OPTIONAL [i.e. file://<full path to local website directory>]
#baseurl: file:///home/roan/Development/hpr/website/hpr_generator/public_html/
baseurl: https://hackerpublicradio.org/
http_baseurl: http://hackerpublicradio.org/
hub_baseurl: https://hub.hackerpublicradio.org/
media_baseurl: https://archive.org/download/hpr$eps_id/
generator_name: The HPR Robot
generator_email: robot.nospam@nospam.hackerpublicradio.org
# Configure the navigation menu and the content templates for each page
# of the site:
@ -48,10 +69,6 @@ navigation: navigation-about.tpl.html
content: content-correspondents.tpl.html
filename: correspondents/index.html
[contact]
navigation: navigation-about.tpl.html
content: content-contact.tpl.html
[correspondent]
navigation: navigation-about.tpl.html
content: content-correspondent.tpl.html
@ -80,58 +97,49 @@ content: content-episode.tpl.html
multipage: true
filename: eps/hpr[id]/index.html
[download]
navigation: navigation-get-shows.tpl.html
content: content-download.tpl.html
[syndication]
navigation: navigation-get-shows.tpl.html
content: content-syndication.tpl.html
[contribute]
navigation: navigation-give-shows.tpl.html
content: content-contribute.tpl.html
[search]
navigation: navigation-main.tpl.html
content: content-search.tpl.html
[help_out]
navigation: navigation-contribute.tpl.html
content: content-help_out.tpl.html
[download]
navigation: navigation-get-shows.tpl.html
content: content-download.tpl.html
[stuff_you_need_to_know]
navigation: navigation-give-shows.tpl.html
content: content-stuff_you_need_to_know.tpl.html
[theme]
navigation: navigation-give-shows.tpl.html
content: content-theme.tpl.html
[requested_topics]
navigation: navigation-give-shows.tpl.html
content: content-requested_topics.tpl.html
[recording]
navigation: navigation-give-shows.tpl.html
content: content-recording.tpl.html
[request_a_slot]
navigation: navigation-give-shows.tpl.html
content: content-request_a_slot.tpl.html
[podcatchers]
navigation: navigation-contribute.tpl.html
content: content-podcatchers.tpl.html
[promote]
navigation: navigation-about.tpl.html
content: content-promote.tpl.html
[sitemap]
navigation: navigation-about.tpl.html
content: content-sitemap.tpl.html
[tags]
navigation: navigation-main.tpl.html
content: content-tags.tpl.html
[twat_episode]
navigation: navigation-get-shows.tpl.html
content: content-twat_episode.tpl.html
multipage: true
filename: eps/twat[id]/index.html
media_baseurl: https://www.hackerpublicradio.org/eps/
[mumble-howto]
navigation: navigation-about.tpl.html
content: content-mumble-howto.tpl.html
[contact]
navigation: navigation-about.tpl.html
content: content-contact.tpl.html
[promote]
navigation: navigation-about.tpl.html
content: content-promote.tpl.html
[comments_viewer]
navigation: navigation-about.tpl.html
content: content-comments_viewer.tpl.html
[hpr_ogg]
root_template: rss.tpl.xml
content: rss-hpr.tpl.xml
@ -169,3 +177,7 @@ root_template: rss.tpl.xml
content: rss-hpr_total.tpl.xml
filename: hpr_total_spx.rss
media_file_extension: spx
[comments]
root_template: rss-comments.tpl.xml
filename: comments.rss

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,42 @@
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS 'shared-listen-now.tpl.html' %-->
<!--% PROCESS "queries-episode-${constants.database}.tpl.html" %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<h2>Comment Viewer</h2>
<p>Because of the spammers we have had to turn on comment moderation. Sorry about the delay this will cause.</p>
<p><a href="<!--% absolute_path(baseurl) %-->comments.rss">Subscribe</a> to the comment feed.</p>
<hr />
<!--% FOREACH item IN DBI.query('
SELECT C.*,
H.host, H.hostid AS host_id,
E.title AS episode_title,
E.date AS episode_date,
E.duration AS episode_duration,
M.id AS series_id, M.name AS series_name
FROM comments AS C
INNER JOIN eps AS E
ON C.eps_id = E.id
INNER JOIN hosts AS H
ON E.hostid = H.hostid
INNER JOIN miniseries AS M
ON E.series = M.id
ORDER BY C.comment_timestamp DESC
LIMIT 30
')
%-->
<article>
<header>
<h1><!--% item.comment_author_name %--> says: <!--% item.comment_title %--></h1>
<p><small>Posted at <!--% item.comment_timestamp %--> relating to the show <a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(item.eps_id) %-->/index.html">hpr<!--% item.eps_id %--></a> which was released on <!--% item.episode_date %--> by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(item.host_id) %-->.html"><!--% item.host %--></a> entitled <em><!--% item.episode_title %--></em></small>
</p>
</header>
<p class="comment">
<!--% item.comment_text FILTER html_line_break %-->
</p>
<footer>
Listen in <a href="<!--% media_path(item.eps_id, 'hpr', 'ogg', baseurl, media_baseurl) %-->">ogg</a>, <a href="<!--% media_path(item.eps_id, 'hpr', 'spx', baseurl, media_baseurl) %-->">spx</a>, or <a href="<!--% media_path(item.eps_id, 'hpr', 'mp3', baseurl, media_baseurl) %-->">mp3</a> format.</p></footer>
</article>
<hr />
<!--% END %-->

View File

@ -1,4 +1,4 @@
<article>
<article>
<header>
<h1>Contact</h1>
</header>
@ -6,7 +6,7 @@
<ul>
<li>email: <strong>admin -at- hackerpublicradio org</strong><br />
<em>As an anti-spam measure you will get an error back but we do get your email.</em></li>
<li>Website: <a href="http://www.www.hackerpublicradio.org" target="_blank">www.www.hackerpublicradio.org</a></li>
<li>Website: <a href="http://www.hackerpublicradio.org" target="_blank">www.hackerpublicradio.org</a></li>
<li>Mailist: <a href="http://www.hackerpublicradio.org/maillist" target="_blank">Maillist</a></li>
<li><a href="https://web.libera.chat/gamja/?channels=oggcastplanet" target="_blank">#oggcastplanet</a></li>
<li><a href="https://www.facebook.com/home.php?sk=group_130169220378872¬if_t=group_r2j" target="_blank">Facebook</a></li>
@ -18,4 +18,4 @@
HPR is governed by the community, so decisions about how Hacker Public Radio should be run are made on the mailing list you can join it by going to :<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.hackerpublicradio.org/maillist">http://www.hackerpublicradio.org/maillist</a>
</p>
</article>
</article>

View File

@ -1,87 +0,0 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% FOREACH correspondents IN DBI.query('
SELECT COUNT(hostid) AS \'tally\' FROM hosts;
') %-->
<h1>So you want to do a podcast ?</h1>
<p>Well you've come to the right place. Our goal here at HPR is to make it as easy as possible for you to get a podcast released. We take care of the hard bits so you don't need to. Recording your first show is always a daunting prospect but over <a href="<!--% absolute_path(baseurl) %-->correspondents/index.html"><!--% correspondents.tally %--></a> people like yourself have done it and so can you.
<!--% END %-->
</p>
<h2>1. Stuff you need to know</h2>
<ul>
<li>HPR will stop as a project if there are not enough <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#no_shows_no_hpr">Shows</a>.</li>
<li>We do not <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#syndication">syndicate</a> shows not produced for HPR.</li>
<li>You are agreeing to <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#license">license</a> your show CC BY-SA 4.0.</li>
<li>You have <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#permission">permission</a> to redistribute your show in its entirety.</li>
<li>Your audio will <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#not_moderated">not be moderated.</a></li>
<li>Your show will be signaled as containing <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#explicit">explicit</a> content.</li>
<li>You determine where in the <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#schedule">schedule</a> your show will be released.</li>
<li>We use <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#utf8">UTF-8</a> end to end.</li>
<li>Your show will be heard by an <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#international">International</a> Audience.</li>
<li>We also need <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#emergency_queue">emergency</a> shows.</li>
<li>You will no longer be allowed to edit HPR pages on <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html#wikipedia">Wikipedia</a>.</li>
</ul>
<p>
<a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html">More information.</a>
</p>
<h2>2. Select a Topic</h2>
<p>
The first thing you will need to do is decide on a topic for your show. You might already have an idea but if not you can have a look at our <a href="<!--% absolute_path(baseurl) %-->eps/index.html">Archive</a> page for examples of shows people have recorded in the past. You can also look at our <a href="<!--% absolute_path(baseurl) %-->requested_topics.html">Requested Topics</a>, or our <a href="<!--% absolute_path(baseurl) %-->series/index.html">Series</a> page to see if you can add your knowledge to the pool.
</p>
<p>
If you are <a href="<!--% absolute_path(baseurl) %-->will-my-show-be-of-interest-to-hackers.html">worried that your show may not be of interest to Hackers then follow this link</a> to check if it is.
</p>
<p>
If you can't think of anything to talk about then please just record a show telling us <a href="<!--% absolute_path(baseurl) %-->series/0029.html">how you got into tech</a> as a way to introducing yourself to the community.
</p>
<h2>3. Record your show</h2>
<p>
Please select <a href="<!--% absolute_path(baseurl) %-->recording.html">more detailed information on how to record a show</a>:
</p>
<ul>
<!-- <li>Recording with the <a href="<!--% absolute_path(baseurl) %-->recording.html#callin_numbers">telephone</a>.</li> -->
<li><a href="<!--% absolute_path(baseurl) %-->recording.html#portable_media_player">Recording with a portable media player</a>.</li>
<li><a href="<!--% absolute_path(baseurl) %-->recording.html#smart_phone">Recording with a smart phone</a>.</li>
<li><a href="<!--% absolute_path(baseurl) %-->recording.html#editing">Recording/Editing using your Computer</a>.</li>
<li><a href="<!--% absolute_path(baseurl) %-->recording.html#phone_interviews">Recording Interviews with the Phone</a>.</li>
<li><a href="<!--% absolute_path(baseurl) %-->recording.html#round_table">Recording round table discussions</a>.</li>
<li><a href="<!--% absolute_path(baseurl) %-->recording.html#background_music">Avoid Bedding/background music</a>.</li>
<li><a href="<!--% absolute_path(baseurl) %-->recording.html#encoding">We mix down to Mono</a>.</li>
<li><a href="<!--% absolute_path(baseurl) %-->recording.html#no_metadata">No need to add Metadata</a> to the file.</li>
</ul>
<p>Don't forget to <strong>introduce yourself</strong> in your show.</p>
<h2>4. Upload your show</h2>
<p>
Once you have your audio ready you can post your show by going to the <a href="https://www.hackerpublicradio.org/calendar.php">Calendar</a> page or press the <strong><a href="https://www.hackerpublicradio.org/calendar.php">⇧Upload⇧</strong></a> button.
</p>
<p>
After you have selected a date you will be redirected to the <a href="https://www.hackerpublicradio.org/request.php">request page</a>, where you will be asked to select your show and email address. We will send a link to where you can upload your show to this address and so it must be a valid working address that you can access quickly. We intend to use <a href="https://www.gnupg.org/">GPG</a> to speed up the validation of hosts, so you may wish to use an email address that has an associated public key available on public key servers.
</p>
<p>
<a href="<!--% absolute_path(baseurl) %-->request_a_slot.html">More Information</a>.
</p>
<h2>Questions ?</h2>
<p>
Got any questions not covered here, then just email <strong>"admin" at "www.hackerpublicradio.org"</strong>, and well get in touch with you with all you need to know about getting your show published.<br />
You can chat with other podcasters using IRC in the <strong>#oggcastplanet</strong> channel on the <a href="https://web.libera.chat/gamja/?channels=oggcastplanet">freenode.net</a> network. Follow us on <a href="https://identi.ca/group/hpr">identi.ca</a> (use the tag <strong>!hpr</strong>) and on <a href="https://twitter.com/hpr">Twitter</a> (use the tag <strong>#hpr</strong>). We have a <a href="https://www.facebook.com/home.php?sk=group_130169220378872">Facebook</a> and <a href="https://www.linkedin.com/groups?mostPopular=&amp;gid=3737302">LinkedIn</a> group, so please join and spread the word.</p>
<h2>Still Nervous</h2>
<p>
Fellow listeners like yourself contribute the shows and so we all know how hard it is to do that first show. You're probably worried that we won't like the topic. Well don't be, have a look at our <a href="<!--% absolute_path(baseurl) %-->eps/index.html">archive</a> to see how diverse the contributions have been. You're probably worried about the quality of your audio, that you sound funny, that English isn't your native language, that you suffer from a speech impediment, that your show has loads of ummms and awws in it, well don't be. We have plenty of hosts that fall into all these categories but continue to produce great shows.
</p>
<p>
At the end of the day the show is about the content and not the quality of the audio. That's not to say we won't help you with ways to improve the audio if you wish, or narrate your script if you can't or won't record it yourself. Drop into the IRC channel <a href="https://web.libera.chat/gamja/?channels=oggcastplanet">#oggcastplanet</a> where there are people who will help.<br />
</p>
<h2 id="motto">Our Mottos</h2>
<blockquote>Any audio is better than no audio.</blockquote>
<blockquote>Any topic of intrest to hackers.</blockquote>
<blockquote>It ain't a show unless it's on the server.</blockquote>
<blockquote>If you tell us you are doing a show, then you owe us a show.</blockquote>
<p>You don't need anyones permission to upload a show, but if you have any questions then drop into the <a href="https://web.libera.chat/gamja/?channels=oggcastplanet">#oggcastplanet</a> channel on freenode and chat with a live person 24/7.
</p>

View File

@ -1,50 +1,70 @@
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
<!--% PROCESS 'shared-avatar.tpl.html' %-->
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS "queries-correspondent-${constants.database}.tpl.html" %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% query_show_count = DBI.prepare('
SELECT id
FROM eps
WHERE eps.hostid = ? ')
<!--% results_hpr_shows = DBI.prepare(query_hpr_shows)
%-->
<!--% query_shows = DBI.prepare('
SELECT
eps.id,
CASE eps.explicit WHEN 1 THEN \'Explicit\' ELSE \'Clean\' END AS explicit ,
<!--% results_hpr_show_count = DBI.prepare(query_hpr_show_count) %-->
<!--% hpr_shows_to_count = results_hpr_show_count.execute(id); %-->
<!--% hpr_shows = results_hpr_shows.execute(id); %-->
<!--% hpr_show_count = 0 %-->
<!--% FOREACH show IN hpr_shows_to_count %-->
<!--% hpr_show_count = hpr_show_count +1; %-->
<!--% END %-->
<!--% query_twat_show_count = DBI.prepare('
SELECT id
FROM twat_eps AS eps
WHERE eps.hostid = ?
')
%-->
<!--% query_twat_shows = DBI.prepare('
SELECT
eps.id,
CASE eps.explicit WHEN 1 THEN \'Explicit\' ELSE \'Clean\' END AS explicit ,
eps.date, eps.license, eps.duration,
eps.title, eps.summary, eps.tags,
eps.title, eps.summary, eps.tags,
eps.notes,
hosts.local_image,
hosts.hostid,
hosts.host, hosts.email,
hosts.hostid,
hosts.host, hosts.email, hosts.profile,
miniseries.name AS series, miniseries.id AS seriesid
FROM eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
FROM twat_eps AS eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
WHERE hosts.hostid = ? AND eps.date < date(\'now\', \'+1 days\')
ORDER BY date DESC ')
WHERE hosts.hostid = ?
ORDER BY eps.id DESC
')
%-->
<!--% shows_to_count = query_show_count.execute(id); %-->
<!--% shows = query_shows.execute(id); %-->
<!--% show_count = 0 %-->
<!--% FOREACH show IN shows_to_count %-->
<!--% show_count = show_count +1; %-->
<!--% twat_shows_to_count = query_twat_show_count.execute(id); %-->
<!--% twat_shows = query_twat_shows.execute(id); %-->
<!--% twat_show_count = 0 %-->
<!--% FOREACH show IN twat_shows_to_count %-->
<!--% twat_show_count = twat_show_count +1; %-->
<!--% END %-->
<!--% hosts = DBI.tie('hosts', 'hostid') %-->
<article>
<!--% this_host = hosts.$id %-->
<h2 class="title">Correspondent</h2>
<h2><!--% this_host.host %--></h2>
<p><img src="<!--% absolute_path(baseurl) %-->images/<!--% get_avatar(this_host.hostid) %-->"
height="80" alt="Host Image" /><br>
<p><!--% get_avatar(this_host.hostid, this_host.host) %--><br>
<label>Host ID</label>: <!--% this_host.hostid %--><br><br>
<label>email:</label> <u><!--% this_host.email %--></u><br>
<label>episodes:</label> <strong><!--% show_count %--></strong>
<label>profile:</label> <!--% this_host.profile %--><br><br>
<label>episodes:</label> <strong><!--% hpr_show_count + twat_show_count %--></strong>
</p>
<!--% FOREACH show IN shows; %-->
<!--% FOREACH hpr_show IN hpr_shows; %-->
<!--% show_summary(show, 'hide_host') %-->
<!--% show_summary(hpr_show, 'hide_host') %-->
<p class="listen-in"><!--% display_listen_in(hpr_show.id) %--></p>
<!--% END %-->
<!--% FOREACH twat_show IN twat_shows; %-->
<!--% twat_show_summary(twat_show, 'hide_host') %-->
<p class="listen-in"><!--% display_listen_in(twat_show.id,"twat") %--></p>
<!--% END %-->
</article>
<p><a href="contribute.html">Become a Correspondent</a></p>
<p><a href="<!--% absolute_url(baseurl) %-->about.html#so_you_want_to_record_a_podcast">Become a Correspondent</a></p>

View File

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

View File

@ -1,13 +1,12 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<article>
<header>
<article>
<header>
<h1>Download Archive</h1>
<p>Please be aware that our Archive exceeds <strong>62Gb</strong> <em>(Ogg: 21Gb, Spx: 16Gb, mp3: 25Gb)</em>. We are happy for you to download them, but please make sure that you are not going to incur additional bandwidth charges on your side.</p>
<p>We will be happy to post you DVD's of the episodes anywhere in the world if bandwidth is an issue.</p>
</header>
<h2>Full Episode Guide</h2>
<p>
The <a href="<!--% absolute_path(baseurl) %-->eps/index.html">compete episode guide</a> is available to you, and it lists all the shows on one page going right back to the very first episode.
The <a href="./eps/index.html">compete episode guide</a> is available to you, and it lists all the shows on one page going right back to the very first episode.
</p>
<h2>Command line download</h2>
<p>
@ -54,4 +53,4 @@
<footer>
<p>Big to DeepGeek and the team for providing the BitTorrent service.</p>
</footer>
</article>
</article>

View File

@ -1,60 +1,138 @@
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
<!--% PROCESS 'shared-avatar.tpl.html' %-->
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS 'shared-listen-now.tpl.html' %-->
<!--% PROCESS 'shared-show-transcript.tpl.html' %-->
<!--% PROCESS "queries-episode-${constants.database}.tpl.html" %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% query_episodes = DBI.prepare('
WITH episode_maxmin AS (
SELECT MAX(id) AS \'latest\', MIN(id) AS \'earliest\', ? AS \'id\'
FROM eps
WHERE eps.date < date (\'now\', \'+1 days\')
),
episode_date AS (
SELECT eps.date
FROM eps
WHERE eps.id = ?
),
episode_previous AS (
SELECT MAX(id) AS \'previous\', ? AS \'id\'
FROM eps
INNER JOIN episode_date
ON eps.date < episode_date.date
WHERE eps.id > 1
),
episode_next AS (
SELECT MIN(id) AS \'next\', ? AS \'id\'
FROM eps
INNER JOIN episode_date
ON eps.date > episode_date.date
WHERE eps.date < date (\'now\')
)
SELECT eps.id, eps.date, eps.title, eps.duration,
eps.summary, eps.notes, eps.explicit, eps.license,
eps.tags, eps.version, eps.downloads, eps.valid,
episode_maxmin.latest, episode_maxmin.earliest,
episode_previous.previous, episode_next.next,
hosts.hostid, hosts.host,
miniseries.name AS \'series\', miniseries.id AS \'seriesid\'
FROM eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
INNER JOIN episode_maxmin ON eps.id = episode_maxmin.id
INNER JOIN episode_previous ON eps.id = episode_previous.id
INNER JOIN episode_next ON eps.id = episode_next.id
WHERE eps.id = ?
')
%-->
<!--% query_episodes = DBI.prepare(query_episode_maxmin) %-->
<!--% episode_result = query_episodes.execute(id, id, id, id, id) %-->
<!--% FOREACH episode IN episode_result %-->
<!--% in_window = ( episode.id > episode.latest || episode.id < ( episode.latest - 20 ) ? 0 : 1 ) %-->
<!--% episode_navigation = step_navigation(baseurl,episode) %-->
<article>
<header>
<h1>hpr<!--% episode.id %--> :: <!--% episode.title %--></h1>
<h1>hpr<!--% zero_pad_left(episode.id) %--> :: <!--% episode.title %--></h1>
<h3><!--% episode.summary %--></h3>
<p class="meta"><!--% step_navigation(baseurl,episode) %-->
<p class="meta"><!--% episode_navigation %-->
</p>
<p><!--% IF get_avatar(episode.hostid) != 'hpr_logo.png' %-->
<img src="<!--% absolute_path(baseurl) %-->images/<!--% get_avatar(episode.hostid) %-->" height="80" width="80" alt="" /></a><br><!--% END %-->
Hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(episode.hostid) %-->.html"><!--% episode.host %--></a>. <!--% show_meta(episode) %--></p>
<p><!--% show_avatar(episode.hostid, episode.host) %-->
Hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(episode.hostid) %-->.html"><!--% episode.host %--></a> on <span><!--% episode.date %--></span> is flagged as <span><!--% display_explicit(episode.explicit) %--></span> and is released under a <span><!--% episode.license %--> license</span>. <br>
<!--% display_tags(episode.tags) %-->
<label>Comments: </label><!--% display_comments_tally(episode.id, episode.eps_tally) %--> <br>
The show is available on the Internet Archive at: <a href="https://archive.org/details/hpr<!--% zero_pad_left(episode.id) %-->">https://archive.org/details/hpr<!--% zero_pad_left(episode.id) %--></a>
<!--% listen_now(episode, "hpr", baseurl, media_baseurl) %-->
</p>
<h3><!--% show_series(episode.series, episode.seriesid, "Part of the series") %--></h3>
<p><em><!--% episode.series_description %--></em></p>
</header>
<div><!--% episode.notes %--></div>
</article>
<footer>
<!--% show_transcript(episode, "hpr", baseurl, media_baseurl) %-->
<p>
<!--% episode_navigation %-->
</p>
</footer></article>
<!--% END %-->
<hr />
<h1>Comments</h1>
<p id="comments">
Subscribe to the comments <a href="<!--% absolute_path(baseurl) %-->comments.rss">RSS</a> feed.
</p>
<!--% query_comments = DBI.prepare('
SELECT
id,
comment_timestamp,
comment_author_name,
comment_title,
comment_text
FROM comments
WHERE eps_id = ?
')
%-->
<!--% comment_index = 1 %-->
<!--% comments_result = query_comments.execute(id) %-->
<!--% FOREACH comment IN comments_result %-->
<h5 id="comment_<!--% comment.id %-->"><a href="/eps/hpr<!--% zero_pad_left(episode.id) %-->/index.html#comment_<!--% comment.id %-->">Comment #<!--% comment_index %--></a> posted on <!--% comment.comment_timestamp %--> by <!--% comment.comment_author_name %--></h5>
<h4><!--% comment.comment_title %--></h4>
<p class="comment"><!--% comment.comment_text FILTER html_line_break %--></p>
<!--% comment_index = comment_index + 1 %-->
<!--% END %-->
<h2>Leave Comment</h2>
<p>
<strong>Note to Verbose Commenters</strong><br />
If you can't fit everything you want to say in the comment below then you really should <a href="<!--% absolute_url(baseurl) %-->about.html#so_you_want_to_record_a_podcast">record</a> a response show instead.
</p>
<p>
<strong>Note to Spammers</strong><br />
All comments are moderated. All links are checked by humans. We strip out all html. Feel free to <a href="<!--% absolute_url(baseurl) %-->about.html#so_you_want_to_record_a_podcast">record</a> a show about yourself, or your industry, or any other topic we may find interesting. <em>We also check shows for spam :)</em>.
</p>
<form method="POST" action="<!--% hub_baseurl %-->comment_confirm.php">
<fieldset>
<legend>Provide feedback</legend>
<table>
<tr>
<td>Your Name/Handle:</td>
<td><input required type="text" name="comment_author_name" size="40" maxlength="40" placeholder="Enter your name" ></td>
</tr>
<tr>
<td>Title:</td>
<td><input required type="text" name="comment_title" size="50" maxlength="100" placeholder="What is your comment about?"></td>
</tr>
<tr>
<td>Comment:</td>
<td><textarea required name="comment_text" maxlength="2000" rows="10" cols="50" placeholder="Place the comment here."></textarea></td>
</tr>
<tr>
<td>Anti Spam Question:</td>
<td>
What does the letter <strong>P</strong> in <em>HPR</em> stand for? <br />
<input required type="text" name="anti_spam_question" size="50" maxlength="100" placeholder="Type out what the P in HPR stands for."></td>
</tr>
<!--% IF in_window %-->
<tr><td>
<input type="hidden" name="spammer" value="No">
<input type="hidden" name="hostid" value="<!--% episode.hostid %-->">
<input type="hidden" name="justification" value="No justification is asked for or required.">
</td></tr>
<!--% ELSE %-->
<!-- . -->
<tr>
<td>Are you a spammer?</td>
<td>
<input required checked="checked" type="radio" name="spammer" id="spammer_yes" value="Yes">
<label for="spammer_yes">Yes</label>
<input required type="radio" name="spammer" id="spammer_no" value="No">
<label for="spammer_no">No</label>
</td>
</tr>
<!-- . -->
<tr>
<td>Who is the <strong>host</strong> of this show?</td>
<td>
<select required name="hostid" id="hostid">
<option value="Spammer" selected="selected">Spammer</option>
<option value="Spammer">Linus Torvalds</option>
<option value="Spammer">Marie Curie</option>
<option value="<!--% episode.hostid %-->"><!--% episode.host %--></option>
<option value="Spammer">Alan Turing</option>
<option value="Spammer">Terry Pratchett</option>
<option value="Spammer">Yuri Gagarin</option>
</select>
<td>
<td>
<!-- . -->
<tr>
<td>What does HPR mean to you?</td>
<td><textarea required name="justification" maxlength="200" rows="4" cols="50" placeholder="Convince us you are part of the community."></textarea></td>
</tr>
<!--% END %-->
<tr><td>
<input type="hidden" name="eps_id" value="<!--% episode.id %-->">
</td></tr>
</table>
<input type="submit" value="Next">
</fieldset>
</form>

View File

@ -1,4 +1,5 @@
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
<!--% PROCESS "queries-episodes-${constants.database}.tpl.html" %-->
<article>
<header>
<h1>Complete Archive of Shows.</h1>
@ -7,7 +8,17 @@
</p>
</header>
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% FOREACH episodes IN DBI.query('
<!--% FOREACH episodes IN DBI.query(query_episodes)
%-->
<!--% show_summary(episodes) %-->
<p class="listen-in"><!--% display_listen_in(episodes.id) %--></p>
<!--% END %-->
<h2 id="twat_episodes">Today With a Techie Archived Shows</h2>
<p>
<!-- Creative Commons License -->
<a rel="license" href="https://creativecommons.org/licenses/by-nc-sa/2.5/"><img alt="Creative Commons License" border="0" src="https://creativecommons.org/images/public/somerights20.png" width="88" height="31" /></a><br>The following work is licensed under a <a rel="license" href="https://creativecommons.org/licenses/by-nc-sa/2.5/">Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License</a>.</p>
<p>Today With a Techie Radio was brought to you by <a href="https://en.wikipedia.org/wiki/Infonomicon">The Infonomicon Computer Club</a></p>
<!--% FOREACH twat_episode IN DBI.query('
SELECT
eps.id,
eps.explicit,
@ -16,13 +27,14 @@
hosts.hostid,
hosts.host, hosts.email, hosts.local_image,
miniseries.name AS series, miniseries.id AS seriesid
FROM eps
FROM twat_eps as eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
WHERE eps.date < date(\'now\', \'+1 days\')
ORDER BY date DESC
ORDER BY eps.id DESC
')
%-->
<!--% show_summary(episodes) %-->
<!--% twat_show_summary(twat_episode) %-->
<!--% END %-->
</article>

View File

@ -1,11 +0,0 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<h1>Help Out.</h1>
<h2>Submit a show</h2>
<p>One of the best ways to help out is to <a href="<!--% absolute_path(baseurl) %-->contribute.html">contribute a show</a>. You can find out <a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html">everything you need to know here</a>. </p>
<h2>Suggest Topics</h2>
<p>If there is a technical topic you would like us to cover, or if you are looking for topics to record a show on, then look no further than our <a href="<!--% absolute_path(baseurl) %-->requested_topics.html">Requested topics</a> page.</p>
<h2>Podcatcher Support</h2>
<p>
Please report your experiences with our feeds to admin@hpr. We maintain a podcatcher <a href="<!--% absolute_path(baseurl) %-->podcatchers.html">compatibility list.</a>
</p>

View File

@ -0,0 +1 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->

View File

@ -1,96 +1,83 @@
<!--% PROCESS 'shared-avatar.tpl.html' %-->
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS 'shared-listen-now.tpl.html' %-->
<!--% PROCESS 'shared-show-transcript.tpl.html' %-->
<!--% PROCESS 'shared-call_for_shows.tpl.html' %-->
<!--% INCLUDE 'content-index-announcement.tpl.html' %-->
<!--% PROCESS "queries-index-${constants.database}.tpl.html" %-->
<!--% MACRO tidy_notes(all_lines) BLOCK %-->
<!--% lines = all_lines %-->
<!--% after_html = all_lines %-->
<!--% img_re = '(?six)^(.*?)\<img ([^\>]+\>)(.+)$' %-->
<!--% lazy_re = '(?i)loading="lazy"' %-->
<!--% WHILE (matches = lines.match(img_re)) %-->
<!--% img_tag = matches.1 %-->
<!--% after_html = matches.2 %-->
<!--% matches.0 %-->
<!--% IF (img_tag.search(lazy_re)) %-->
<img <!--% img_tag %-->
<!--% ELSE %-->
<img loading="lazy" <!--% img_tag %-->
<!--% END %-->
<!--% lines = after_html %-->
<!--% END %-->
<!--% after_html %-->
<!--% END %-->
<hr>
<article>
<header>
<h3>Welcome to HPR the Community Podcast</h3>
<h3>Welcome to HPR, the Community Podcast</h3>
</header>
<!--% USE date %-->
<!--% days_till_next_episode = 0 %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% USE date %-->
<!--% calc = date.calc %-->
<!--% episodes = DBI.query(query_next_available_episode).get_all() %-->
<!--% last_date = episodes.0.date.split('-') %-->
<!--% offset = (calc.Day_of_Week(last_date.0,last_date.1,last_date.2) == 5 ? 3 : 1) %-->
<!--% slot_date = calc.Add_Delta_Days(last_date.0,last_date.1,last_date.2,offset) %-->
<!--% now = calc.Today() %-->
<!--% days_till_next_episode = calc.Delta_Days(now.0,now.1,now.2,slot_date.0,slot_date.1,slot_date.2) %-->
<!--% delta = date.calc.N_Delta_YMD(2005,9,19, date.format(date.now, '%Y'),date.format(date.now, '%m'),date.format(date.now, '%d')) %-->
<p>We started producing shows as <a href="https://www.hackerpublicradio.org/twat.php"><em>Today with a Techie</em></a> on 2005-09-19, <!--% delta.0 %--> years, <!--% delta.1 %--> months, <!--% delta.2 %--> days ago. our shows are produced by <a href="<!--% absolute_path(baseurl) %-->correspondents/index.html">listeners</a> like you and can be on any <a href="<!--% absolute_path(baseurl) %-->eps/index.html">topic</a> that <strong>"are of interest to <a href="https://en.wikipedia.org/wiki/hacker_(hobbyist)">hackers</a>"</strong>. if you listen to HPR then please consider contributing one show a year. if you <a href="<!--% absolute_path(baseurl) %-->contribute.html">record</a> your show now it could be <a href="https://www.hackerpublicradio.org/calendar.php">released</a> in <strong>13</strong> days.</p>
<h4>Meet the team</h4>
<p>
<audio controls preload="none">";
<source src="<!--% absolute_path(baseurl) %-->media/promos/all-hpr-hosts.ogg" type="audio/ogg" >
<source src="<!--% absolute_path(baseurl) %-->media/promos/all-hpr-hosts.mp3" type="audio/mpeg" >
</audio>
</p>
<p>We started producing shows as <a href="<!--% absolute_path(baseurl) %-->eps/index.html#twat_episodes"><em>Today with a Techie</em></a> on 2005-09-19, <!--% delta.0 %--> years, <!--% delta.1 %--> months, <!--% delta.2 %--> days ago. Our shows are produced by <a href="<!--% absolute_path(baseurl) %-->correspondents/index.html">listeners</a> like you and can be on any <a href="<!--% absolute_path(baseurl) %-->eps/index.html">topics</a> that <strong>"are of interest to <a href="https://en.wikipedia.org/wiki/hacker_(hobbyist)">hackers</a>"</strong>. If you listen to HPR then please consider contributing one show a year. If you <a href="<!--% absolute_url(baseurl) %-->about.html#so_you_want_to_record_a_podcast">record</a> your show now it could be <a href="<!--% hub_baseurl %-->calendar.php">released</a> in <strong><!--% days_till_next_episode %--></strong> days.</p>
</article>
<!--% display_call_for_shows() %-->
<hr>
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
<h1>Latest Shows</h1>
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% FOREACH latest_episodes IN DBI.query('
SELECT
eps.id,
eps.explicit,
eps.date, eps.license, eps.duration,
eps.title, eps.summary, eps.tags,
eps.notes,
hosts.local_image,
hosts.hostid,
hosts.host, hosts.email,
miniseries.name AS series, miniseries.id AS seriesid
FROM eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
WHERE eps.date < date(\'now\', \'+1 days\')
ORDER BY date DESC
LIMIT 10
')
<!--% host_cnt = 0 %-->
<!--% FOREACH latest_episodes IN DBI.query(query_latest_episodes)
%-->
<hr>
<article>
<header>
<h1><a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(latest_episodes.id) %-->/index.html">hpr<!--% latest_episodes.id %--> :: <!--% latest_episodes.title %--></a></h1>
<h3><!--% latest_episodes.summary%--></h3>
<p class="meta"$><!--% IF get_avatar(latest_episodes.hostid) != 'hpr_logo.png' %-->
<img src="<!--% absolute_path(baseurl) %-->images/<!--% get_avatar(latest_episodes.hostid) %-->" height="80" width="80" alt="" /></a><!--% END %-->
<br>Hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(latest_episodes.hostid) %-->.html"><!--% latest_episodes.host %--></a> on <!--% latest_episodes.date %--> is flagged as <!--% display_explicit(latest_episodes.explicit) %--> and released under a <!--% latest_episodes.license %--> license. <br>
<strong>Tags:</strong> <!--% latest_episodes.tags %--><em></em>.<br>
<small>listen in <a href="local/hpr<!--% latest_episodes.id %-->.ogg">ogg</a>, <a href="local/hpr<!--% latest_episodes.id %-->.spx">spx</a>, or <a href="local/hpr<!--% latest_episodes.id %-->.mp3">mp3</a> format. <!--% show_series(latest_episodes.series, latest_episodes.seriesid) %-->
<a href="<!--% absolute_path(baseurl) %-->eps/hpr<!--% zero_pad_left(latest_episodes.id) %-->/index.html#comments">View comments.</a></small>
<p class="meta"$><!--% show_avatar(latest_episodes.hostid, latest_episodes.host, host_cnt) %-->
Hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(latest_episodes.hostid) %-->.html"><!--% latest_episodes.host %--></a> on <!--% latest_episodes.date %--> is flagged as <!--% display_explicit(latest_episodes.explicit) %--> and released under a <!--% latest_episodes.license %--> license. <br>
<!--% display_tags(latest_episodes.tags) %-->
<span><!--% show_series(latest_episodes.series, latest_episodes.seriesid) %--></span>
<span><label>Comments: </label><!--% display_comments_tally(latest_episodes.id, latest_episodes.eps_tally) %--></span><br>
<!--% listen_now(latest_episodes, "hpr", baseurl, media_baseurl) %-->
</p>
</header>
<!--% latest_episodes.notes %-->
<!--% tidy_notes(latest_episodes.notes) %-->
<footer>
<h2>listen now</h2>
<p>Duration: <!--% latest_episodes.duration %--></p>
<audio controls preload="none">
<source src="local/hpr<!--% latest_episodes.id %-->.ogg" type="audio/ogg" >
<source src="local/hpr<!--% latest_episodes.id %-->.mp3" type="audio/mpeg" >
</audio>
<ul>
<li>ogg: <a href="local/hpr<!--% latest_episodes.id %-->.ogg">/local/hpr<!--% latest_episodes.id %-->.ogg</a></li>
<li>spx: <a href="local/hpr<!--% latest_episodes.id %-->.spx">/local/hpr<!--% latest_episodes.id %-->.spx</a></li>
<li>mp3: <a href="local/hpr<!--% latest_episodes.id %-->.mp3">/local/hpr<!--% latest_episodes.id %-->.mp3</a></li>
</ul>
<!--% show_transcript(latest_episodes, "hpr", baseurl, media_baseurl) %-->
</footer>
</article>
<!--% host_cnt = host_cnt + 1 %-->
<!--% END %-->
<article>
<article id="previous_five_weeks">
<header>
<hr>
<h1>Previous five weeks</h1>
</header>
<!--% FOREACH last_5_weeks_episodes IN DBI.query('
SELECT
eps.id,
CASE eps.explicit WHEN 1 THEN \'Explicit\' ELSE \'Clean\' END AS explicit ,
eps.date, eps.license, eps.title, eps.summary,
eps.duration, eps.notes, eps.tags,
hosts.hostid,
hosts.host, hosts.email, hosts.local_image,
miniseries.name AS series, miniseries.id AS seriesid
FROM eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
WHERE eps.date < date(\'now\', \'+1 days\')
ORDER BY date DESC
LIMIT 30 OFFSET 10
')
<!--% FOREACH last_5_weeks_episodes IN DBI.query(query_last_5_weeks_episodes)
%-->
<!--% show_summary(last_5_weeks_episodes) %-->
<p class="listen-in"><!--% display_listen_in(last_5_weeks_episodes.id) %--></p>
<!--% END %-->
</article>
<h1>Older Shows</h1>

View File

@ -0,0 +1,189 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<p>In this article we will show you how to connect to the HPR Community Room on Mumble.</p>
<p>You can think of Mumble like visiting a hotel that has different meeting rooms. Some are locked to you, some only allow you access if you are registered, some you can join but only listen to. In most, like the HPR room, you can hear the other people in the room talking. If you talk they can also hear you. There is a chat section where text can be shared as well.</p>
<p>When using Mumble <strong><em>you should always use a microphone and headset</em></strong> positioned close to your mouth but slightly off to the side.</p>
<h2>Install the software</h2>
<p>The <a href="https://www.mumble.info/downloads/">Mumble website offers download and install instructions</a> for different operating systems.
</p>
<p>Once you have installed the client then connect to the <a href="mumble://chatter.skyehaven.net:64738/Hacker%20Public%20Radio?version=1.2.0">HPR Room on Mumble</a>.
<p>There is a first run wizard that will step you through the process of configuring Mumble the first time. This will open up a series of configuration options.</p>
<p>Press <strong>Next</strong> on the introduction.</p>
<p><img alt="intro screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/01-intro.png" ></p>
<p>The device selection page will allow you to select which audio to use. As this will be different for everyone we can't offer you much help here other than to say that the defaults are usually fine.</p>
<p>When you are done press <strong>Next</strong>.</p>
<p><img alt="device selection screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/02-device-selection.png" ></p>
<p>The device tuning page will allow you to fine tune the latency. Normally the defaults are usually fine.</p>
<p>When you are done press <strong>Next</strong>.</p>
<p><img alt="device tuning screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/03-device-tuning.png" ></p>
<p>The Volume Tuning page will allow you to set your audio levels. Normally the defaults are usually fine.</p>
<p>Then press <strong>Next</strong>.</p>
<p><img alt="volume tuning screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/04-volume.png" ></p>
<p>It is <strong>very important</strong> that you set <strong>Push to Talk (PTT)</strong>, as you will disturb the other people in the room if you select the other methods. It may seem to be working fine to you, but it <em>will</em> result in issues for the others.
</p>
<ul>
<li>Click "Push to Talk:"</li>
<li>Click in the area next to it and press the key you intend to use as the Push To Talk (PTT) Key</li>
</ul>
<p>Try and pick a key that you don't normally use or need. You may have to disable that key mapping in the operating system you are using.</p>
<p>Then press <strong>Next</strong>.</p>
<p><img alt="ptt screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/05-ptt.png" ></p>
<p>The Quality Settings page will allow you to adjust the bandwidth. Normally the defaults are usually fine.</p>
<p>It is <strong>very important</strong> that you <strong>Disable Text-To-Speech</strong>, as all notifications will be read back and will disturb the other people in the room. It may seem to be working fine to you, but it <em>will</em> result in issues for the others.</p>
<ul>
<li>Click "Disable Text-To-Speech and use sounds instead"</li>
</ul>
<p>Then press <strong>Next</strong>.</p>
<p><img alt="no tts screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/06-notts.png" ></p>
<p>The positional audio page will allow you to fine tune the latency. Normally the defaults are usually fine.</p>
<p>Just press <strong>Next</strong>.</p>
<p><img alt="positional audio screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/07-positional-audio.png" ></p>
<p>That's it the initial configuration is done.</p>
<p>Then press <strong>Finish</strong>.</p>
<p><img alt="stats screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/08-stats.png" ></p>
<p>You are expected to have a digital certificate when connecting to Mumble servers.</p>
<p>This screen will allow you to Automatically create one.</p>
<p>Just press <strong>Next</strong>.</p>
<p><img alt="cert screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/09-cert.png" ></p>
<p>That completes the first setup of Mumble.</p>
<p>Then press <strong>Finish</strong>.</p>
<p><img alt="finished screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/10-finished.png" ></p>
<hr>
<p>Now that you have the Mumble client set up we can now start the process of connecting to the <a href="mumble://chatter.skyehaven.net:64738/Hacker%20Public%20Radio?version=1.2.0">HPR Room on Mumble</a>.</p>
<p>If you opened Mumble by clicking the link above, then you may not see the following options, but we'll cover them here if at any time you need to add the HPR server again</p>
<p>Just open mumble and press <strong>Server - Connect</strong></p>
<p>Then press <strong>Add New...</strong>.</p>
<p><img alt="add new connection screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/20-add-new.png" ></p>
<p>You will need to enter the information for the HPR server:</p>
<ul>
<li>Address: <strong>chatter.skyehaven.net</strong></li>
<li>Port: 64738</li>
<li>Username: <strong><em>Your Username</em></strong></li>
<li>Label: chatter.skyehaven.net</li>
</ul>
<p>Think about your username a bit as if you register it on the server you will not be able to change it again.</p>
<p>Then press <strong>Next</strong>.</p>
<p><img alt="add new server screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/21-add-server.png" ></p>
<p>If you clicked the link to the <a href="mumble://chatter.skyehaven.net:64738/Hacker%20Public%20Radio?version=1.2.0">HPR Room on Mumble</a>, then you may be brought to the option to enter a username. Think about this a bit as if you register it on the server you will not be able to change it again.</p>
<p>Then press <strong>Next</strong>.</p>
<p><img alt="username screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/11-username.png" ></p>
<p>You will need to confirm the servers Certificate matches this:</p>
<p>
<pre>Digest (SHA-1): 09:22:05:88:D6:60:17:FD:39:8F:55:B0:F5:A0:45:DA:96:32:9C:23</pre>
</p>
<p>If it matches then press <strong>Yes</strong>.</p>
<p><img alt="accept cert screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/12-accept-cert.png" ></p>
<p>All going well you will be connected to the server. By default you will end up in the <strong>Root</strong> - think the lobby of an hotel !</p>
<p>You will see a lot of rooms with names of other podcasts that use the server.</p>
<p>Before connecting to any room it's good etiquette to make sure your audio is working correctly.</p>
<p>The room <strong>Audio Test</strong> will allow you to speak and the <strong>OpieTheRepeatherBot</strong> will record your speech and after 10 seconds will play it back for you.</p>
<p><em>Click and hold</em> on your username (<em>ken1</em> in this example) and <em>drag</em> yourself into the <strong>Audio Test</strong> room.</p>
<p><img alt="audio test screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/13-audio-test.png" ></p>
<p>You now know how to switch from room to room.</p>
<p>Try to say something. Remember to press the <strong>Push to talk (PTT)</strong>. Everyone forgets to do this but it will become second nature after a while.</p>
<p>A good test is to count to ten slowly.</p>
<p>When you are talking the server should change your icon from a green person to a <em>blue</em> one with <em>sound circles</em> around the head.</p>
<p><img alt="audio ping screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/14-audio-ping.png" ></p>
<p>The <strong>OpieTheRepeatherBot</strong> will create another client with the prefix <strong>Mimic-</strong> followed by your username.</p>
<p>In this example it is <em>Mimic-ken1</em>.</p>
<p>You should hear your audio back.</p>
<p><img alt="audio pong screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/15-audio-pong.png" ></p>
<p>If your audio is poor - as is often the case - then this gives you the opportunity to fix it before interrupting other people.</p>
<p>How you fix it will depend on the operating system that you are using and the exact nature of the problem.</p>
<p>A common problem is that the operating system uses the built in speaker and microphone from the laptop instead of your headset. A tip would be to press the <strong>Push to talk (PTT)</strong> button and tap the microphone of your head set lightly. If you don't hear the tapping then Mumble is probably getting the wrong microphone as input.</p>
<p>In the example below I clicked the Microphone icon in my taskbar and a application (<em>pavucontrol</em>) opened allowing me to set the correct microphone.</p>
<p><img alt="hpr room screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/22-pavucontrol-recording.png" ></p>
<p>While I was there I also checked to make sure that Mumble was playing audio to my headset.</p>
<p><img alt="hpr room screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/23-pavucontrol-playback.png" ></p>
<p>Satisfied that the audio is good, you can <em>click and drag</em> your icon to the <strong>HPR</strong> room.</p>
<p><img alt="hpr room screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/16-hpr-room.png" ></p>
<p>Some rooms require you to be registered to enter a room, to speak, to record, or to chat in the room.</p>
<p>To register first <em>Right Click</em> on your icon and a menu will open.</p>
<p>Press <strong>Register....</strong></p>
<p><img alt="register screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/17-register.png" ></p>
<p>Then press <strong>Yes</strong></p>
<p><img alt="register confirm screenshot" src="<!--% absolute_path(baseurl) %-->images/mumble-howto/18-register-confirm.png" ></p>
<p>That's it - you are now all set to use mumble.</p>

View File

@ -1,151 +0,0 @@
<h1>Podcast Clients Test Status</h1>
<table style="width:100%">
<caption></caption>
<tr>
<th>Name</th>
<th>MP3</th>
<th>OGG</th>
<th>SPX</th>
<th>HTML</th>
</tr>
<tr>
<td>gPodder</td>
<td>OK</td>
<td>OK</td>
<td>OK</td>
<td>?</td>
</tr>
<tr>
<td>Bashpodder</td>
<td>OK</td>
<td>OK</td>
<td>OK</td>
<td>?</td>
</tr>
<tr>
<td>podget</td>
<td>?</td>
<td>?</td>
<td>?</td>
<td>?</td>
</tr>
<tr>
<td>Akregator</td>
<td>?</td>
<td>OK</td>
<td>?</td>
<td>?</td>
</tr>
<tr>
<td>BeyondPod</td>
<td>?</td>
<td>OK</td>
<td>?</td>
<td>?</td>
</tr>
<tr>
<td>AntennaPod, Version 1.5.2.0</td>
<td>OK</td>
<td>?</td>
<td>?</td>
<td>Reading the itunes:summary which has no html.<br />Should we also enable html here as well - how to fix the 4k limit ?</td>
</tr>
<tr>
<td>PodKicker Pro for Android</td>
<td>?</td>
<td>FAIL</td>
<td>?</td>
<td>?</td>
</tr>
<tr>
<td>pocketcasts</td>
<td>?</td>
<td>FAIL</td>
<td>?</td>
<td>?</td>
</tr>
<tr>
<td>Podlisten</td>
<td>?</td>
<td>?</td>
<td>?</td>
<td>?</td>
</tr>
<tr>
<td>Soundwaves</td>
<td>?</td>
<td>?</td>
<td>?</td>
<td>?</td>
</tr>
<tr>
<td>Podax</td>
<td>?</td>
<td>?</td>
<td>?</td>
<td>?</td>
</tr>
<tr>
<td>PodKicker Pro</td>
<td>OK</td>
<td>FAIL</td>
<td>?</td>
<td>?</td>
</tr>
<tr>
<td>RssDemon</td>
<td>?</td>
<td>?</td>
<td>?</td>
<td>?</td>
</tr>
<tr>
<td>newsbeuter</td>
<td>?</td>
<td>?</td>
<td>?</td>
<td>?</td>
</tr>
<tr>
<td>iTunes</td>
<td>?</td>
<td>?</td>
<td>?</td>
<td>?</td>
</tr>
<tr>
<td>VLC</td>
<td>?</td>
<td>?</td>
<td>?</td>
<td>?</td>
</tr>
<tr>
<td><a href="https://github.com/jgoerzen/hpodder/wiki">hpodder</a></td>
<td>OK</td>
<td>OK</td>
<td>OK</td>
<td>?</td>
</tr>
<tr>
<td><a href="https://play.google.com/store/apps/details?id=com.podkicker">PodKicker Pro for Android</a></td>
<td>OK</td>
<td>?</td>
<td>?</td>
<td>OK</td>
</tr>
<tr>
<td>?</td>
<td>?</td>
<td>?</td>
<td>?</td>
<td>?</td>
</tr>
<tr>
<td>?</td>
<td>?</td>
<td>?</td>
<td>?</td>
<td>?</td>
</tr>
</table>

View File

@ -1,12 +1,11 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<article>
<article>
<header>
<h1>Please promote HPR</h1>
</header>
<p>Feel free to use the promotional material to spread the word in your podcasts, or have them played on to other shows.</p>
<h2>General HPR promotion</h2>
<ul>
<li><a href="<!--% absolute_path(baseurl) %-->media/promos/HPRpromoKlaatu.ogg">Klaatu explains HPR Daily podcast by the www.hackerpublicradio.org Community for the www.hackerpublicradio.org Community</a></li>
<li><a href="./media/promos/HPRpromoKlaatu.ogg">Klaatu explains HPR Daily podcast by the www.hackerpublicradio.org Community for the www.hackerpublicradio.org Community</a></li>
<!--<li><a href="../media/promos/HPRpromoNewsCast.ogg">A News Caster tells us about HPR</a></li>
<li><a href="../media/promos/HPRpromoSkirlet.ogg">Skirlet tells us we need to listen to HPR</a></li>-->
</ul>
@ -14,10 +13,10 @@
<h2>Requests for contributions</h2>
<p>
<ul>
<li><a href="<!--% absolute_path(baseurl) %-->media/promos/Jude-aka-Mrs_Peter64_HPR-needs-shows.flac">Jude Mrs. Peter64 HPR needs shows</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->media/promos/hpr-contributor-promo-sax.ogg">slick0 basenet theme</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->media/promos/hpr-contributor-promo-basenettheme.ogg">slick0 sax roll</a></li>
<li><a href="./media/promos/Jude-aka-Mrs_Peter64_HPR-needs-shows.flac">Jude Mrs. Peter64 HPR needs shows</a></li>
<li><a href="./media/promos/hpr-contributor-promo-sax.ogg">slick0 basenet theme</a></li>
<li><a href="./media/promos/hpr-contributor-promo-basenettheme.ogg">slick0 sax roll</a></li>
</ul>
</p>
</article>
</article>

View File

@ -35,7 +35,7 @@
Many of today's <a href="http://wiki.xiph.org/PortablePlayers">portable media players</a> support recording audio out of the box. Search for "Voice Recorder", to see if there is an application for your smartphone. Whichever option you have close to hand, try and set the recording to the best quality format (<a href="http://en.wikipedia.org/wiki/WAV">WAV</a> or <a href="http://en.wikipedia.org/wiki/FLAC">FLAC</a>), and set everything else to the highest setting. It's always the goal to get the best quality audio but here at Hacker Public Radio we value content over quality and so long as it's audible we'll take it.
</p>
<p>
Then just record your show, <a href="r<!--% absolute_url(baseurl) %-->equest_a_slot.html">request a slot</a>, and we'll do the rest.
Then just record your show, <a href="<!--% absolute_url(baseurl,'request_a_slot.html') %-->">request a slot</a>, and we'll do the rest.
</p>
<h2 id="smart_phone">Recording with a portable media player<a href="#smart_phone">.</a></h2>
@ -55,7 +55,7 @@
The majority of podcasters use <a href="http://audacity.sourceforge.net/download/">Audacity</a>. First set the Project Rate to 44100Hz, then you can either record your show in Audacity itself or import the file you recorded earlier and edit it as you wish.
</p>
<p>
<img width="600" src="<!--% absolute_url(baseurl) %-->images/contribute-audacity-record.png" alt="Audacity Can Record" title="Audacity Screenshot of Recording" >
<img width="600" src="<!--% absolute_url(baseurl,'images/contribute-audacity-record.png') %-->" alt="Audacity Can Record" title="Audacity Screenshot of Recording" >
</p>
<blockquote>Audacity is a free, easy-to-use and multilingual audio editor and recorder for Windows, Mac OS X, GNU/Linux and other operating systems.</blockquote>
<iframe width="640" height="390" src="//www.youtube.com/embed/ss8CyTwBOPY" style="border: none"></iframe>
@ -70,7 +70,7 @@
<li>Set <em>Bit depth</em> to <strong>24</strong>.</li>
</ol>
<p>
<img width="600" src="<!--% absolute_url(baseurl) %-->images/contribute-audacity-export.png" alt="Audacity Export Settings" title="Audacity Screenshot of an Export" >
<img width="600" src="<!--% absolute_url(baseurl,'images/contribute-audacity-export.png') %-->" alt="Audacity Export Settings" title="Audacity Screenshot of an Export" >
</p>
<h2 id="phone_interviews">Recording Interviews with the Phone<a href="#phone_interviews">.</a></h2>
@ -83,10 +83,10 @@
If you would like to record with multiple participants then you can use <a href="http://www.mumble.com/">Mumble</a>. Connect to <strong>chatter.skyehaven.net</strong> Port: <strong>64738 </strong>.<br />
Walk through the audio wizard and then pop into the <strong>Hacker Public Radio</strong> room. Once you are ready press the <strong>recording</strong> button, select <em>multichannel</em> and then <em>start</em>. That will record multiple tracks, one for each participant which you can edit and then submit.
<br />
Kwisher made a <a href="<!--% absolute_url(baseurl) %-->Mumble-How-To.pdf">Mumble tutorial</a> which you might find useful and Delwin has produced a number of short <a href="<!--% absolute_url(baseurl) %-->correspondents/0228.html">shows</a> on how to configure the audio quality.
Kwisher made a <a href="<!--% absolute_url(baseurl,'Mumble-How-To.pdf') %-->">Mumble tutorial</a> which you might find useful and Delwin has produced a number of short <a href="<!--% absolute_url(baseurl,'correspondents/0228.html') %-->">shows</a> on how to configure the audio quality.
</p>
<p>
<img width="600" src="<!--% absolute_url(baseurl) %-->images/contribute-mumble-record.png" alt="Audacity Can Record" title="Audacity Screenshot of Recording" >
<img width="600" src="<!--% absolute_url(baseurl,'images/contribute-mumble-record.png') %-->" alt="Audacity Can Record" title="Audacity Screenshot of Recording" >
</p>
<h2 id="background_music">Avoid Bedding/background music<a href="#background_music">.</a></h2>

View File

@ -1,16 +1,16 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<h1 id="requesting_slot">Picking a slot for your show</h1>
<p>
Any host can select any free slot a up to year in advance, by recording their show and uploading it to the desired slot. In exceptional circumstances it may be necessary to reserve a slot while not having the audio available, but this must be approved by the <a href="http://hackerpublicradio.org/mailman/listinfo/hpr_hackerpublicradio.org">HPR mailing list</a> in advance. Be sure to allow as much time as possible, and include a reason why you feel it is necessary to reserve the slot.
Any host can select any free slot a up to year in advance, by recording their show and uploading it to the desired slot. In exceptional circumstances it may be necessary to reserve a slot while not having the audio available, but this must be approved by the <a href="<!--% absolute_url(baseurl,'/maillist') %-->">HPR mailing list</a> in advance. Be sure to allow as much time as possible, and include a reason why you feel it is necessary to reserve the slot.
</p>
<p>
This is intended only for exceptional circumstances, such as a scheduled interview where we would like the audio to be released as soon after the event as possible, or to cover an important topical situation that has occurred. Due to the extended time now needed to post shows to external sites, the extra work this entails and the disruptive effect of reservations, we will no longer be allowing them except in very rare cases of the type mentioned above. [<a href="http://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2018-February/014260.html">?</a>]
This is intended only for exceptional circumstances, such as a scheduled interview where we would like the audio to be released as soon after the event as possible, or to cover an important topical situation that has occurred. Due to the extended time now needed to post shows to external sites, the extra work this entails and the disruptive effect of reservations, we will no longer be allowing them except in very rare cases of the type mentioned above. [<a href="https://lists.hackerpublicradio.com/pipermail/hpr/2018-February/003482.html">?</a>]
</p>
<p>
You can post your show by going to the <a href="http://www.hackerpublicradio.org/calendar.php">Calendar</a> page. Once you have selected a date you will be redirected to the <a href="<!--% absolute_url(baseurl) %-->request.html">request page</a>, where you will be asked to select your show and email address. We will send a link to where you can upload your show to this address and therefore it must be a valid working address that you can access quickly. We intend to use <a href="https://www.gnupg.org/">GPG</a> to speed up the validation of hosts, so you may wish to use an email address that has an associated public key available on public key servers.
You can post your show by going to the <a href="<!--% hub_baseurl %-->calendar.php">Calendar</a> page. Once you have selected a date you will be redirected to the <a href="<!--% absolute_url(baseurl,'request.html') %-->">request page</a>, where you will be asked to select your show and email address. We will send a link to where you can upload your show to this address and therefore it must be a valid working address that you can access quickly. We intend to use <a href="https://www.gnupg.org/">GPG</a> to speed up the validation of hosts, so you may wish to use an email address that has an associated public key available on public key servers.
</p>
<p>
The audio of your show will not be moderated, however <em>the information provided in the upload form <strong>may be moderated</strong></em>. All publicly facing material is managed by the HPR Community as a whole, and not just the host providing the show. The show <a href="<!--% absolute_url(baseurl) %-->eps/hpr2210/index.html">hpr2210 :: On Freedom of Speech and Censorship</a> describes the agreed approach to this topic.
The audio of your show will not be moderated, however <em>the information provided in the upload form <strong>may be moderated</strong></em>. All publicly facing material is managed by the HPR Community as a whole, and not just the host providing the show. The show <a href="<!--% absolute_url(baseurl,'eps/hpr2210/index.html') %-->">hpr2210 :: On Freedom of Speech and Censorship</a> describes the agreed approach to this topic.
</p>
<p><strong>Note:</strong> This email address will be published on the HPR website and will be given out in the feeds, so please use a <strong>public email</strong> address for this purpose. Where we publish it we pad it with dot nospam at-sign nospam dot. <br />
i.e. <em>hpr@example.com</em> becomes <em>hpr.nospam@nospam.example.com</em>. If you do not want to have your email exposed, please contact the admin@hpr team to arrange a alias.
@ -52,7 +52,7 @@
<li id="Short_Summary"><strong>Summary:</strong> <em>Mandatory</em><br />
This is a short 100 character summary of what your show is about. Please fill this out as it is used once the show has gone off the main page, on the mobile site, on printed brochures, on text to speech announcements, on twitter, mastodon etc.</li>
<li id="Theme"><strong>Theme:</strong> <em>Automatic</em><br />
The <a href="<!--% absolute_url(baseurl) %-->theme.html#intro">Intro</a>, and the <a href="<!--% absolute_url(baseurl) %-->theme.html#outro">Outro</a> will be added automatically. Please do not add it.
The <a href="<!--% absolute_url(baseurl,'theme.html#intro') %-->">Intro</a>, and the <a href="<!--% absolute_url(baseurl,'theme.html#outro') %-->">Outro</a> will be added automatically. Please do not add it.
</li>
<li id="Explicit"><strong>Explicit:</strong> <em>Mandatory</em><br />
See <a href="http://www.apple.com/uk/itunes/podcasts/specs.html#submitting">iTunes</a> for more information.</li>
@ -104,7 +104,7 @@
</li>
<li id="series"><strong>Series:</strong> <em>Optional</em><br />
Select the <a href="<!--% absolute_url(baseurl) %-->series.html">series</a> if any that your show is a part of.
Select the <a href="<!--% absolute_url(baseurl,'series.html') %-->">series</a> if any that your show is a part of.
</li>
<li id="tags"><strong>Tags:</strong> <em>Optional</em><br />
Add a list of comma separated tags. Pick the most important words from the shownotes. These are used to <a href="http://hackerpublicradio.org/tags.php">find shows via the tags page</a>.
@ -134,6 +134,6 @@
</li>
</ul>
<p>
Press submit and your show will be sent to the HPR Volunteers to be processed. Keep an eye on the <a href="http://www.hackerpublicradio.org/calendar.php">calendar</a> for when it is posted.
Press submit and your show will be sent to the HPR Volunteers to be processed. Keep an eye on the <a href="<!--% hub_baseurl %-->calendar.php">calendar</a> for when it is posted.
Your show information is used to process the media files, on the website, in the RSS feeds, and on social media sites.
</p>

View File

@ -15,16 +15,16 @@
<li>Music Theory</li>
<li>Installing a VPN to your home network</li>
<li>Init and System.d</li>
<li>Episodes for the <a href="<!--% absolute_url(baseurl) %-->series/0007.html">LPI</a>, or the Networking series.</li>
<li><a href="http://opensourcemusician.com/index.php/Beginning_Audio_Series_for_HPR_and_OSMP_Release">Beginning Audio Series for HPR and OSMP Release</a></li>
<li>Episodes for the <a href="<!--% absolute_url(baseurl,'series/0007.html') %-->">LPI</a>, or the Networking series.</li>
<li><a href="https://web.archive.org/web/20160629174556/opensourcemusician.com/index.php/Beginning_Audio_Series_for_HPR_and_OSMP_Release">Beginning Audio Series for HPR and OSMP Release</a></li>
<li>Hackintosh computers - what are they, why would you want one.</li>
<li>Grub 2.0 introduction and customization.</li>
<li>FM Transmitter hack to listen into internet streams</li>
<li>How I Got Into Accessible Computing</li>
<li>How to do knitting</li>
<li>How to build a house</li>
<li>Bitcoin howto <a href="<!--% absolute_url(baseurl) %-->eps/hpr0788/index.html">hpr0788</a></li>
<li>How to solder <a href="<!--% absolute_url(baseurl) %-->eps/hpr1037/index.html">hpr1037</a>, <a href="<!--% absolute_url(baseurl) %-->eps/hpr1047/index.html">hpr1047</a></li>
<li>Bitcoin howto <a href="<!--% absolute_url(baseurl,'eps/hpr0788/index.html') %-->">hpr0788</a></li>
<li>How to solder <a href="<!--% absolute_url(baseurl,'eps/hpr1037/index.html') %-->">hpr1037</a>, <a href="<!--% absolute_url(baseurl,'eps/hpr1047/index.html') %-->">hpr1047</a></li>
<li>How to weld</li>
<li>How to fix a car</li>
<li>Reviews of stream playing software, (for linuxheads who don't want to keep a browser tab open all the time)</li>

View File

@ -5,35 +5,41 @@
<hr />
<h2>Search Show Tags</h2>
<p>
<a href="http://www.hackerpublicradio.org/tags.php">Complete list of all the Tags</a></p>
<a href="<!--% absolute_path(baseurl) %-->tags.html">Complete list of all the Tags</a></p>
<hr />
<h2>Google</h2>
<form name="google-search" method="get" action="http://www.google.com/search">
<input type="hidden" name="sitesearch" value="http://www.hackerpublicradio.org/" />
<input name="q" type="text" />
<form name="google-search" method="get" action="https://www.google.com/search">
<input type="hidden" name="sitesearch" value="https://www.hackerpublicradio.org/" />
<input name="q" type="text" placeholder="Search HPR with Google"/>
<input type="submit" name="sa" value="Search HPR with Google" />
</form>
<br />
<a href="http://www.google.com/policies/privacy/">privacy policy</a>
<a href="https://www.google.com/policies/privacy/">privacy policy</a>
</p>
<hr />
<h2>DuckDuckGo</h2>
<p>
<iframe src="http://duckduckgo.com/search.html?site=www.hackerpublicradio.org&prefill=Search DuckDuckGo" style="overflow:hidden;margin:0;padding:0;width:408px;height:40px;" frameborder="0"></iframe>
<form method="get" id="search" action="https://duckduckgo.com/">
<input type="hidden" name="sites" value="https://www.hackerpublicradio.org/"/>
<input type="hidden" name="k8" value="#444444"/>
<input type="hidden" name="k9" value="#D51920"/>
<input type="hidden" name="kt" value="h"/>
<input type="text" name="q" maxlength="255" placeholder="Search HPR with DuckDuckGo"/>
<input type="submit" value="Search HPR with DuckDuckGo" />
</form>
<br />
<a href="https://duckduckgo.com/privacy">privacy policy</a>
</p>
<hr />
<h2>Bing</h2>
<p>
<form method="get" action="http://www.bing.com/search">
<form method="get" action="https://www.bing.com/search">
<input type="hidden" name="cp" value="utf-8" />
<input type="hidden" name="FORM" value="FREESS" />
<input type="text" name="q" size="30" />
<input type="submit" value="Search with Bing" />
<input type="text" name="q" size="30" placeholder="Search HPR with Bing"/>
<input type="submit" value="Search HPR with Bing" />
<input type="hidden" name="q1" value="site:www.hackerpublicradio.org" />
</form>
<br />
<a href="http://www.microsoft.com/privacystatement/en-us/bing/default.aspx">privacy policy</a>
<a href="https://www.microsoft.com/privacystatement/en-us/bing/default.aspx">privacy policy</a>
</p>
</article>

View File

@ -1,28 +1,16 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS "queries-series-${constants.database}.tpl.html" %-->
<article>
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<h1 class="title">In-Depth Series</h1>
<!--% FOREACH series IN DBI.query(
'SELECT miniseries.id, miniseries.name, miniseries.description,
miniseries.private, miniseries.image, miniseries.valid,
ep.number_of_episodes, ep.latest_show, ep.earliest_show
FROM miniseries
INNER JOIN
(SELECT series,
COUNT(eps.id) AS number_of_episodes,
MAX(eps.date) AS latest_show,
MIN(eps.date) AS earliest_show
FROM eps
GROUP BY series) AS ep ON ep.series = miniseries.id
ORDER BY name'
) %-->
<!--% FOREACH series IN DBI.query(query_episodes) %-->
<h2><a href="<!--% absolute_path(baseurl) %-->series/<!--% zero_pad_left(series.id) %-->.html"><!--% series.name %--></a></h2>
<ul>
<li>Number of episodes: <!--% series.number_of_episodes %--></li>
<li>Open/closed: <!--% display_choice(series.private, 'closed', 'open') %--></li>
<li>Date of earliest show: <!--% series.earliest_show %--></li>
<li>Date of latest show: <!--% series.latest_show %--></li>
<li>Series RSS feeds: <a href="hpr_ogg_rss.php?series=38">ogg</a>, <a href="hpr_spx_rss.php?series=38">spx</a>, <a href="hpr_mp3_rss.php?series=38">mp3</a></li>
<li>Series RSS feeds: <a href="<!--% absolute_path(baseurl) %-->hpr_ogg_rss.php?series=<!--% series.id %-->">ogg</a>, <a href="<!--% absolute_path(baseurl) %-->hpr_spx_rss.php?series=<!--% series.id %-->">spx</a>, <a href="<!--% absolute_path(baseurl) %-->hpr_mp3_rss.php?series=<!--% series.id %-->">mp3</a></li>
</ul>
<em><!--% series.description %--></em>
<!--% END %-->

View File

@ -1,20 +1,8 @@
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
<!--% PROCESS 'shared-avatar.tpl.html' %-->
<!--% PROCESS "queries-series_episodes-${constants.database}.tpl.html" %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% query_series = DBI.prepare('SELECT miniseries.id, miniseries.name,
miniseries.description,
miniseries.private, miniseries.image, miniseries.valid,
ep.number_of_episodes, ep.latest_show, ep.earliest_show
FROM miniseries
INNER JOIN
(SELECT series,
COUNT(eps.id) AS number_of_episodes,
MAX(eps.date) AS latest_show,
MIN(eps.date) AS earliest_show
FROM eps
GROUP BY series) AS ep ON ep.series = miniseries.id
WHERE miniseries.id = ?
ORDER BY name')
<!--% query_series = DBI.prepare(query_series_sql)
%-->
<!--% series_result = query_series.execute(id) %-->
<article>
@ -25,24 +13,15 @@
<li>Open/closed: open</li>
<li>Date of earliest show: <!--% series.earliest_show %--></li>
<li>Date of latest show: <!--% series.latest_show %--></li>
<li>Series RSS feeds: <a href="hpr_ogg_rss.php?series=79&full=1&gomax=1">ogg</a>, <a href="hpr_spx_rss.php?series=79&full=1&gomax=1">spx</a>, <a href="hpr_mp3_rss.php?series=79&full=1&gomax=1">mp3</a></li>
<li>Series RSS feeds: <a href="<!--% absolute_path(baseurl) %-->hpr_ogg_rss.php?series=<!--% series.id %-->&full=1&gomax=1">ogg</a>, <a href="<!--% absolute_path(baseurl) %-->hpr_spx_rss.php?series=<!--% series.id %-->&full=1&gomax=1">spx</a>, <a href="<!--% absolute_path(baseurl) %-->hpr_mp3_rss.php?series=<!--% series.id %-->&full=1&gomax=1">mp3</a></li>
</ul>
<div><em><!--% series.description %--></em></div>
<!--% END %-->
<!--% query_shows = DBI.prepare('SELECT
id, date, title,
duration, summary, notes,
explicit, eps.license, tags,
hosts.host, hosts.hostid
FROM eps
INNER JOIN hosts
ON eps.hostid = hosts.hostid
WHERE series = ?
ORDER BY date DESC
')
<!--% query_shows = DBI.prepare(query_shows_sql)
%-->
<!--% show_results = query_shows.execute(id) %-->
<!--% FOREACH show IN show_results %-->
<!--% show_summary(show) %-->
<p class="listen-in"><!--% display_listen_in(show.id) %--></p>
<!--% END %-->
</article>

View File

@ -1,33 +1,31 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<h1>Sitemap</h1>
<ul>
<li><a href="https://www.hackerpublicradio/calendar.php"><strong>⇧Upload⇧</strong></a> ← Upload Your Show</li>
<li><a href="<!--% hub_baseurl %-->calendar.php"><strong>⇧Upload⇧</strong></a> ← Upload Your Show</li>
<li><a href="<!--% absolute_path(baseurl) %-->index.html"><strong>Home</strong></a> ← The HPR Homepage</li>
<li><a href="<!--% absolute_path(baseurl) %-->syndication.html">Get Shows</a> ← The RSS Syndication Feeds</li>
<ul>
<li><a href="<!--% absolute_path(baseurl) %-->correspondents/index.html">Full Episode Guide</a> ← Complete list of all the Shows.</li>
<li><a href="<!--% absolute_path(baseurl) %-->series/index.html">In-Depth Series</a> ← Overview of the In-Depth Series.</li>
<li><a href="<!--% absolute_path(baseurl) %-->download.html">Download Options</a> ← How to download the entire archive.</li>
<li><a href="<!--% absolute_url(baseurl) %-->about.html#download">Download Options</a> ← How to download the entire archive.</li>
</ul>
<li><a href="<!--% absolute_path(baseurl) %-->contribute.html">Give Shows</a> ← Upload your podcast show here.</li>
<li><a href="<!--% absolute_url(baseurl) %-->about.html#so_you_want_to_record_a_podcast">Give Shows</a> ← Upload your podcast show here.</li>
<ul>
<li><a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html">Info</a> ← Stuff you need to know before uploading a show.</li>
<li><a href="<!--% absolute_path(baseurl) %-->theme.html">Theme</a> ← Information about HPR Theme Music.</li>
<li><a href="<!--% absolute_path(baseurl) %-->requested_topics.html">Topics</a> ← Requested topics.</li>
<li><a href="<!--% absolute_path(baseurl) %-->recording.html">Recording</a> ← How to record a podcast.</li>
<li><a href="<!--% absolute_path(baseurl) %-->request_a_slot.html">Scheduling</a> ← Picking a slot for your show.</li>
<li><a href="<!--% absolute_url(baseurl) %-->about.html#requested_topics">Topics</a> ← Requested topics.</li>
<li><a href="<!--% absolute_url(baseurl) %-->about.html#recording_a_podcast">Recording</a> ← How to record a podcast.</li>
<li><a href="<!--% absolute_url(baseurl) %-->about.html#requesting_slot">Scheduling</a> ← Picking a slot for your show.</li>
</ul>
<li><a href="<!--% absolute_path(baseurl) %-->help_out.html">Contribute</a> ← How you can help HPR.</li>
<li><a href="<!--% absolute_url(baseurl) %-->about.html#how_to_help">Contribute</a> ← How you can help HPR.</li>
<ul>
<li><a href="<!--% absolute_path(baseurl) %-->contribute.html">Submit Show</a> ← Upload your podcast show here.</li>
<li><a href="<!--% absolute_path(baseurl) %-->requested_topics.html">Topics</a> ← Requested topics.</li>
<li><a href="<!--% absolute_url(baseurl) %-->about.html#so_you_want_to_record_a_podcast">Submit Show</a> ← Upload your podcast show here.</li>
<li><a href="<!--% absolute_url(baseurl) %-->about.html#requested_topics">Topics</a> ← Requested topics.</li>
</ul>
<li><a href="<!--% absolute_path(baseurl) %-->about.html">About</a> ← Information about the History and Governance of HPR.</li>
<ul>
<li><a href="<!--% absolute_path(baseurl) %-->correspondents/index.html">Hosts</a> ← A list of all our Hosts.</li>
<li><a href="<!--% absolute_path(baseurl) %-->contact.html">Contact</a> ← How to get in touch with us.</li>
<li><a href="<!--% absolute_path(baseurl) %-->promote.html">Promote HPR</a> ← Ways you can spread the word.</li>
<li><a href="https://www.hackerpublicradio.org/comments_viewer.php">Show Comments</a> ← Read the latest comments left on shows.</li>
<li><a href="<!--% absolute_path(baseurl) %-->comments_viewer.html">Show Comments</a> ← Read the latest comments left on shows.</li>
</ul>
<li><a href="<!--% absolute_path(baseurl) %-->search.html">Search</a> ← Search HPR</li>
</ul>

View File

@ -1,162 +0,0 @@
<h1 id="agreement">Stuff you need to know<a href="#agreement">.</a></h1>
<p>
This is some important information that you will need to know before uploading to HPR.
</p>
<h2 id="wikipedia">You will no longer be allowed to edit HPR pages on Wikipedia<a href="#wikipedia">.</a></h2>
<p>
Once you upload a show, you will no longer be allowed to edit pages relating to <a href="https://en.wikipedia.org/wiki/Hacker_Public_Radio">Hacker Public Radio</a> in <a href="https://en.wikipedia.org/wiki/Wikipedia:FAQ/Organizations">Wikipedia</a>.
</p>
<h2 id="mailinglist">All policy decisions are made by the HPR Community<a href="#mailinglist">.</a></h2>
<p>
The community decides the HPR policies.
Please join the <a href="https://hackerpublicradio.org/mailman/listinfo/hpr_hackerpublicradio.org">HPR Mailing List</a> to participate.
</p>
<h2 id="no_shows_no_hpr">HPR will stop as a project if there are not enough shows<a href="#no_shows_no_hpr">.</a></h2>
<p>
Hacker Public Radio is dedicated to sharing knowledge.
We release about 260 shows a year, which is probably more than all of the other FOSS podcasts put together.
If you listen to HPR, then we would love you to <a target="_blank" href="<!--% absolute_path(baseurl) %-->contribute.html">contribute</a> one show a year.
Remember once that all the emergency shows have been used up and there are no more shows in the queue, HPR as a project will stop.
</p>
<h2 id="patrons">Support our Patrons<a href="#patrons">.</a></h2>
<p>
Our hosting is kindly provided to us by <a href="<!--% absolute_path(baseurl) %-->correspondents/0174.html">Josh Knapp</a> from <a href="https://anhonesthost.com/hosting/shared-hosting">AnHonestHost.com</a>, and The Internet Archive at <a href="https://archive.org/donate/">Archive.org</a>.
We encourage you to support our Patrons.
Over the years kind people have donated services and supported equipment for our conferences.
</p>
<h2 id="syndication">We do not syndicate non HPR Shows<a href="#syndication">.</a></h2>
<p>
HPR is founded on the principle of Hackers sharing knowledge.
For this reason we are only releasing material created exclusively for HPR.
We will continue to promote new podcasts and other creative commons material, but if you wish to have your show promoted, then please contact our sister site <a href="https://freeculturepodcasts.org/">Free Culture Podcasts</a>.
</p>
<p>
That said, if there is a piece of creative commons content that you would like to promote, then feel free to record a regular show.
There you can introduce the content and explain why it is important, providing links to where we can get more information etc., and then include one example episode.
</p>
<h2 id="license">You are agreeing to license your show CC-BY-SA<a href="#license">.</a></h2>
<p>
All our shows are now released under a <a href="https://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)</a> license, which means that while you continue to retain the copyright to your show, you are allowing us (and everyone else) to use it provided we give you attribution and that we release it under the same license.
Click the <a href="https://creativecommons.org/licenses/by-sa/4.0/">link</a> for more information.
</p>
<h2 id="permission">You have permission to redistribute your show in its entirety<a href="#permission">.</a></h2>
<p>
Never include content, for example music, in your show that you do not have permission to redistribute.
Try to avoid using any content in your show that can not be redistributed under a <a href="https://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) </a> license.
If you are redistributing under another Creative Commons license, GNU Free Documentation License, public domain, or FLOSS software license, then please signal that when you upload your show. We do not post other copyrighted content, even if it is made available under fair use, or by arranged permission.
</p>
<h2 id="not_moderated">The audio of your show will not be moderated<a href="#not_moderated">.</a></h2>
<p>
We do not vet, edit, moderate or in any way censor any of the audio you submit, we trust you to do that.
Aside from checking snippets for audio quality/spam checking, we have a policy that we don't listen to the shows before they are aired.
This is a long standing tradition arising from the fact that HPR is a community of peers who believe that any host has as much right to submit shows as any other.
<br />
We <strong>do</strong> transcode the audio into different formats.
</p>
<p>
Please note that this only relates to the audio you upload.
The rest of the meta-data (branding/summaries/tags/show notes/etc.), are managed by the HPR Community, and <strong>may</strong> be edited.
The show <a href="<!--% absolute_path(baseurl) %-->eps/hpr2210/index.html">hpr2210 :: On Freedom of Speech and Censorship</a> describes the agreed approach to this topic.
</p>
</p>
<h2 id="explicit">Your show will be signaled as containing explicit content<a href="#explicit">.</a></h2>
<p>
Given that we are an open forum for free speech we signal all our shows as "explicit" with the assumption that the listeners will apply the required discretion when playing the shows in public.
That said the majority of our content is technical in nature and therefore is often considered appropriate for any audience.
If you feel that your show will be considered <strong>inoffensive in every region of the world</strong> then you can signal that when you upload the show.
</p>
<p>
When dealing with content that is "explicit" or contains material that would best be suited for a mature audience, it has become traditional to include a short warning at the very beginning of the show before the intro, to allow listeners time to switch off the episode should they so desire.
</p>
<p>
<a href="<!--% absolute_path(baseurl) %-->eps/hpr2210/index.html">hpr2210 :: On Freedom of Speech and Censorship</a> describes the agreed approach to this topic.
</p>
<h2 id="schedule">You determine when your show will be released<a href="#schedule">.</a></h2>
<p>
The HPR Schedule is entirely community driven and we recommend that <strong>you</strong> pick the date or show number as then you know when your show will be released.
However the slots will only be allocated once the shows have been successfully processed.
Any missing information can result in a show missing the requested slot.
Once the slots have been allocated it is not possible to move them.
</p>
<h2 id="reserving">All reservations need to be approved<a href="#reserving">.</a></h2>
<p>
Any host can select any free slot a up to year in advance, by recording their show and uploading it to the desired slot.
In exceptional circumstances it may be necessary to reserve a slot while not having the audio available, but this must be approved by the <a href="https://hackerpublicradio.org/mailman/listinfo/hpr_hackerpublicradio.org">HPR Mailing List</a> in advance.
Be sure to allow as much time as possible, and include a reason why you feel it is necessary to reserve the slot.
<br />
This is intended only for exceptional circumstances, such as a scheduled interview where we would like the audio to be released as soon after the event as possible, or to cover an important topical situation that has occurred.
Due to the extended time now needed to post shows to external sites, the extra work this entails and the disruptive effect of reservations, we will no longer be allowing them except in very rare cases of the type mentioned above.
</p>
<p>
The following are standing reservations:
<ul>
<li>Anniversary episodes.</li>
<li>HPR Community News on the first Monday of the month.</li>
<li>The first day of the fourth month.</li>
<li>The days following new year.</li>
</ul>
</p>
<h2 id="utf8">We use UTF-8 end to end<a href="#utf8">.</a></h2>
<blockquote>See the video "<a href="https://www.youtube.com/watch?v=MijmeoH9LT4">Characters, Symbols and the Unicode Miracle - Computerphile</a>" for an interesting background to ASCII and <a href="https://en.wikipedia.org/wiki/UTF-8">UTF-8</a>.
</blockquote>
<h2 id="accessibility">Keep accessibility in mind<a href="#accessibility">.</a></h2>
<p>
When you includes output from the command line in the show notes, posting screen-shots of console or terminal output makes it impossible for screen readers to access the text.
Always try to include the raw output ( eg: embedded in &lt;pre&gt; tags)
<br />
Include descriptive language in any link texts.
<br />
Avoid structures like: <em>"For accessibility information click <a href="#accessibility">here</a>"</em><br />
Rather use: <em>"For more information click our <a href="#accessibility">accessibility page</a>"</em><br />
</p>
<h2 id="international">Your show will be heard by an International Audience<a href="#international">.</a></h2>
<p>
We have people listening from all over the world, who may not have the same cultural background as yourself, therefore you should be as clear as possible when giving details.
For example always give temperatures in both Celsius and Fahrenheit, measurements in Metric and Imperial, dates in <strong>YYYY-MM-DD</strong> <a href="https://en.wikipedia.org/wiki/ISO_8601">iso8601</a> format, and abbreviations using the <a href="https://en.wikipedia.org/wiki/NATO_phonetic_alphabet">NATO phonetic alphabet</a>.
Never assume that your audience knows what age a sixth grader is, or how big a 20 Cent Euro coin is.
Keep in mind that keyboard layouts are also different so make sure to specify the key shape or the position inrelation to a common known standard.
For example:
</p>
<blockquote>The at sign normally situated above the 2 key on a US keyboard, and has a unicode number of U+0040.
For more information see <a href="https://en.wikipedia.org/wiki/At_sign">Wikipedia</a></blockquote>
<p>
<a href="https://xkcd.com/1179/"><img src="../images/iso_8601.png" title="ISO 8601 was published on 06/05/88 and most recently amended on 12/01/04." alt="An xkcd cartoon showing ISO 8601" /></a>
</p>
<h2 id="emergency_queue">Feed the emergency queue<a href="#emergency_queue">.</a></h2>
<p>
The emergency queue is intended only to be used in the cases where there is still a gap in the schedule 24 hours prior to release.
The shows will by their very nature need to be "timeless".
That means your topic should still be relevant in four years or more.
People will be able to hear the show on the website but they will not be included in any feeds until release.
</p>
<p>
Please begin all shows with text similar to:
<br />
<em>
"This is an emergency show, if you are hearing this then HPR needs shows ASAP.
Please consider contributing a show.
Email admin at hacker public radio dot org for more information."
</em>
</p>
<p>
We expect that we need at least 10 shows in the emergency queue in order to give people enough time to record and submit shows.
Please contact admin at hpr if you want to submit an emergency show.
</p>

View File

@ -1,3 +1,50 @@
<h1>RSS Syndication</h1>
<article>
<header>
<h2>Subscribe to our Feeds</h2>
</header>
<p>
Great that you want to listen. Have a look below at the feeds that best suite your listening habits.
</p>
</article>
<article>
<header>
<h2><img src="<!--% absolute_path(baseurl) %-->images/feed.png" alt="rss logo"> The Community News Summary</h2>
<h3>One show a month</h3>
</header>
<p>
If you get overwhelmend by the amount of shows we produce, then this is a good place to start.
</p>
<p>
Every month, the HPR Janitors put down their mops had have a chat about all the shows, and what else has been going on in the HPR community. This is a regular show scheduled for the first Monday of the month.
</p>
<ul>
<li><a href="<!--% absolute_path(baseurl) %-->hpr_ogg_rss.php?series=47">ogg</a> Larger file size higher quality feed.</li>
<li><a href="<!--% absolute_path(baseurl) %-->hpr_spx_rss.php?series=47">mp3</a> Larger file size regular quality feed in a common format.</li>
<li><a href="<!--% absolute_path(baseurl) %-->hpr_mp3_rss.php?series=47">spx</a> Small file size lower quality feed. <br/>Ideal for dial-up/mobile connections.</li>
</ul>
<p>
We also maintain an <a href="https://archive.org/details/hackerpublicradio?and[]=subject%3A%22Community+News%22">Archive.org</a> page where you can get the shows in even more formats.
</p>
</article>
<article>
<header>
<h2><img src="<!--% absolute_path(baseurl) %-->images/feed.png" alt="rss logo"> Two week Audio feed</h2>
<h3>5 shows a week</h3>
</header>
<p>
Use these feeds to keep up to date with the latest HPR Episodes.
</p>
<ul>
<li><a href="<!--% absolute_url(baseurl) %-->hpr_ogg_rss.php">ogg</a> Larger file size higher quality feed.</li>
<li><a href="<!--% absolute_url(baseurl) %-->hpr_rss.php">mp3</a> Larger file size regular quality feed in a common format.</li>
<li><a href="<!--% absolute_url(baseurl) %-->hpr_spx_rss.php">spx</a> Small file size lower quality feed. <br/>Ideal for dial-up/mobile connections.</li>
</ul>
<p>
We also maintain an <a href="https://archive.org/details/hackerpublicradio">Archive.org</a> page where you can get the shows in even more formats. For more recent shows we are now including the original upload as delivered.
</p>
</article>
<article>
<header>
<h2><img src="<!--% absolute_path(baseurl) %-->images/feed.png" alt="rss logo"> Entire Archive Audio feed</h2>
@ -6,9 +53,9 @@
Use this feed to get the archived episodes. The feed themselves run over 15Mb in size and so use them to download the archived episodes and when you are up to date switch back to the Two Week Feeds listed above.
</p>
<ul>
<li><a href="<!--% absolute_path(baseurl) %-->hpr_total_ogg.rss">ogg feed</a> Warning over 50G</li>
<li><a href="<!--% absolute_path(baseurl) %-->hpr_total_spx.rss">spx feed</a> Warning over 22G</li>
<li><a href="<!--% absolute_path(baseurl) %-->hpr_total_mp3.rss">mp3 feed</a> Warning over 36G</li>
<li><a href="<!--% absolute_path(baseurl) %-->hpr_total_ogg_rss.php">ogg feed</a> Warning over 50G</li>
<li><a href="<!--% absolute_path(baseurl) %-->hpr_total_spx_rss.php">spx feed</a> Warning over 22G</li>
<li><a href="<!--% absolute_path(baseurl) %-->hpr_total_rss.php">mp3 feed</a> Warning over 36G</li>
</ul>
</article>
<article>
@ -19,7 +66,7 @@
Use this feed to get the shows as they are posted. The shows will be posted out of order as they come in and may be replaced/reposted if errors are found. This is intended as a means to provide find issues with metadata or the audio quality of new shows before they hit the main feed.
</p>
<ul>
<li><a href="rss-future.php">Shows as they are posted.</a> OGG Only</li>
<li><a href="<!--% absolute_path(baseurl) %-->rss-future.php">Shows as they are posted.</a> OGG Only</li>
</ul>
</article>
<article>
@ -27,6 +74,62 @@
<h2><img src="<!--% absolute_path(baseurl) %-->images/feed.png" alt="rss logo"> Comment feed</h2>
</header>
<ul>
<li><a href="http://www.hackerpublicradio.org/comments_rss.php">Listener contributed comments to the episodes</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->comments.rss">Listener contributed comments to the episodes</a></li>
</ul>
</article>
<hr />
<h1>Other Download Options</h1>
<article>
<header>
<h2>Site Replication Sources</h2>
</header>
<ul>
<li><a href="<!--% absolute_path(baseurl) %-->hpr.sql">Daily Database Dump in SQL Format</a></li>
<li><a href="https://repo.anhonesthost.net/explore/repos">All the HPR Source Code is on GitTea</a></li>
<li><a href="https://hub.hackerpublicradio.org/stats.json">Current Statistics on the HPR Project (updated every 15 mins)</a></li>
<ul>
</article>
<article>
<header>
<h2>External Sources</h2>
</header>
<ul>
<li><a href="https://archive.org/details/hackerpublicradio">Archive.org</a></li>
<li><a href="https://music.amazon.fr/podcasts/9d9e6211-ff78-4501-93b6-6a9e560c4dbd/hacker-public-radio">Amazon Music</a></li>
<li><a href="https://nl.radio.net/podcast/hacker-public-radio">Radio.net</a></li>
<li><a href="https://open.spotify.com/show/7e2hYcnHj9vKgUzsIOf4r3">Spotify</a></li>
<li><a href="https://player.fm/series/hacker-public-radio">PlayerFM</a></li>
<li><a href="https://podcasts.apple.com/us/podcast/hacker-public-radio/id281699640">iTunes</a></li>
<li><a href="https://podcasts.google.com/feed/aHR0cDovL2hhY2tlcnB1YmxpY3JhZGlvLm9yZy9ocHJfcnNzLnBocA">Google Podcasts</a></li>
<li><a href="https://toppodcast.com/podcast_feeds/hacker-public-radio/">Top Podcasts</a></li>
<li><a href="https://www.iheart.com/podcast/256-hacker-public-radio-30994513/" target="_blank">iHeart Radio</a></li>
<li><a href="https://www.listennotes.com/de/podcasts/hacker-public-radio-hacker-public-radio-mNH-jsI7LcJ/">Listen Notes</a></li>
<li><a href="https://www.mixcloud.com/hackerpublicradio/">MixCloud</a></li>
<li><a href="https://www.podchaser.com/podcasts/hacker-public-radio-76781">Podchaser</a></li>
<ul>
</article>
<article>
<header>
<h1>Download Archive</h1>
<p>Please be aware that our Archive exceeds <strong>62Gb</strong> <em>(Ogg: 21Gb, Spx: 16Gb, mp3: 25Gb)</em>. We are happy for you to download them, but please make sure that you are not going to incur additional bandwidth charges on your side.</p>
<p>We will be happy to post you DVD's of the episodes anywhere in the world if bandwidth is an issue.</p>
</header>
<h2>Full Episode Guide</h2>
<p>
The <a href="<!--% absolute_path(baseurl) %-->eps/index.html">compete episode guide</a> is available to you, and it lists all the shows on one page going right back to the very first episode.
</p>
<h2>Command line download</h2>
<p>
You can download the audio of the episodes directly from the command line using the following commands:
</p>
<ul>
<li>ogg:<br />
<span style="font-family:monospace;">curl '<!--% absolute_path(baseurl) %-->eps/hpr[0001-<!--% episode.latest %-->].ogg' -o "hpr#1.ogg"</span></li>
<li>spx:<br />
<span style="font-family:monospace;">curl '<!--% absolute_path(baseurl) %-->eps/hpr[0001-<!--% episode.latest %-->].spx' -o "hpr#1.spx"</span></li>
<li>mp3:<br />
<span style="font-family:monospace;">curl '<!--% absolute_path(baseurl) %-->eps/hpr[0001-<!--% episode.latest %-->].mp3' -o "hpr#1.mp3"</span></li>
</ul>
</article>

View File

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

View File

@ -1,42 +0,0 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<h1>HPR Theme Music</h1>
<p>
An HPR episode is composed of a few parts which are all now added automatically.
</p>
<ol>
<li>
<h3 id="Synopsis">Show Synopsis</h3>
<p>
We will take the <a href="<!--% absolute_path(baseurl) %-->contribute.html#show_notes_file_format">fields</a> from the Show Notes and use those to create a short summary of what the show is about.<br />
The format is:
</p>
<blockquote>
This is HPR episode ${show_number) entitled "${title}". It is hosted by ${hostname} and is ${duration} minutes long. The Summary: "${summary}"
</blockquote>
<p>Most of the information is taken from the <a href="<!--% absolute_path(baseurl) %-->request_a_slot.html">Show Notes</a><br />
<strong>Note:</strong> <em>This is automatically added after you upload your show.</em>
</p>
</li>
<li>
<h3 id="show">The Show</h3>
<p>
The most important bit. As long as you like, on any topic you like as long as it is <em>"of interest to Hackers"</em>.
</p>
</li>
<li>
<h3 id="outro">HPR Outro Music </h3>
<p>
This can be added is automatically added after you upload your show.
</p>
</li>
</ol>
<h2>Media Files</h2>
<ol>
<li><a href="http://www.hackerpublicradio.org/media/theme-music/">outro-music-MrX-ccbysa-accordion.wav</a> (2.8M)</li>
<li><a href="http://www.hackerpublicradio.org/media/theme-music/">outro-music-rollercostermusic.com-ccbysa-v1-ccbysa.wav</a> (31M)</li>
<li><a href="http://www.hackerpublicradio.org/media/theme-music/">outro-music-rollercostermusic.com-ccbysa-v2-ccbysa.wav</a> (26M)</li>
<li><a href="http://www.hackerpublicradio.org/media/theme-music/">outro-music-rollercostermusic.com-ccbysa-v3-ccbysa.wav</a> (31M)</li>
<li><a href="http://www.hackerpublicradio.org/media/theme-music/">outro-music-slick0-cc0.flac</a> (12M)</li>
<li><a href="http://www.hackerpublicradio.org/media/theme-music/">outro-speech-manon_fallon-cc0.flac</a> (4.6M)</li>
</ol>

View File

@ -0,0 +1,71 @@
<!--% PROCESS 'shared-episode-summary.tpl.html' %-->
<!--% PROCESS 'shared-avatar.tpl.html' %-->
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% PROCESS 'shared-listen-now.tpl.html' %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% query_episodes = DBI.prepare('
WITH episode_maxmin AS (
SELECT MAX(id) AS \'latest\', MIN(id) AS \'earliest\', ? AS \'id\'
FROM twat_eps AS eps
),
episode_date AS (
SELECT eps.date
FROM twat_eps AS eps
WHERE eps.id = ?
),
episode_previous AS (
SELECT MAX(id) AS \'previous\', ? AS \'id\'
FROM twat_eps AS eps
INNER JOIN episode_date
ON eps.date < episode_date.date
WHERE eps.id > 1
),
episode_next AS (
SELECT MIN(id) AS \'next\', ? AS \'id\'
FROM twat_eps AS eps
INNER JOIN episode_date
ON eps.date > episode_date.date
)
SELECT eps.id, eps.date, eps.title, eps.duration,
eps.summary, eps.notes, eps.explicit, eps.license,
eps.tags, eps.version, eps.downloads, eps.valid,
episode_maxmin.latest, episode_maxmin.earliest,
episode_previous.previous, episode_next.next,
hosts.hostid, hosts.host,
miniseries.name AS \'series\', miniseries.id AS \'seriesid\',
miniseries.description AS \'series_description\'
FROM twat_eps AS eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
INNER JOIN episode_maxmin ON eps.id = episode_maxmin.id
INNER JOIN episode_previous ON eps.id = episode_previous.id
INNER JOIN episode_next ON eps.id = episode_next.id
WHERE eps.id = ?
')
%-->
<!--% episode_result = query_episodes.execute(id, id, id, id, id) %-->
<!--% FOREACH episode IN episode_result %-->
<!--% episode_navigation = step_navigation(baseurl,episode,"twat") %-->
<article>
<header>
<h1><!--% episode.id %--> :: <!--% episode.title %--></h1>
<h3><!--% episode.summary %--></h3>
<p class="meta"><!--% episode_navigation %-->
</p>
<p><!--% show_avatar(episode.hostid, episode.host) %-->
Hosted by <a href="<!--% absolute_path(baseurl) %-->correspondents/<!--% zero_pad_left(episode.hostid) %-->.html"><!--% episode.host %--></a> on <span><!--% episode.date %--></span> is flagged as <span><!--% display_explicit(episode.explicit) %--></span> and is released under a <span><!--% episode.license %--> license</span>. <br>
<!--% display_tags(episode.tags) %--> <br>
<!--% listen_now(episode, "twat", baseurl, media_baseurl) %-->
<!--% display_listen_in(episode.id, "twat") %-->
</p>
<h3><!--% show_series(episode.series, episode.seriesid, "Part of the series") %--></h3>
<p><em><!--% episode.series_description %--></em></p>
</header>
<div><!--% episode.notes %--></div>
<footer>
<p>
<!--% episode_navigation %-->
</p>
</footer></article>
<!--% END %-->

View File

@ -1,8 +1,6 @@
<!--% PROCESS "queries-ids-episode-${constants.database}.tpl.html" %-->
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% FOREACH episode IN DBI.query(
'select eps.id from eps
where eps.date < date (\'now\', \'+1 days\') '
) %-->
<!--% FOREACH episode IN DBI.query(query_ids_episode) %-->
,<!--% episode.id %-->
<!--% END %-->

View File

@ -0,0 +1,7 @@
<!--% USE DBI(constants.driver, constants.user, constants.password) %-->
<!--% FOREACH episode IN DBI.query(
'select eps.id from twat_eps AS eps'
) %-->
,<!--% episode.id %-->
<!--% END %-->

View File

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

View File

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

View File

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

View File

@ -1,11 +1,11 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<ul>
<li><a href="https://www.hackerpublicradio.org/calendar.php"><strong>⇧Upload⇧</strong></a></li>
<li><a href="<!--% hub_baseurl %-->"><strong>⇧Upload⇧</strong></a></li>
<li><a href="<!--% absolute_path(baseurl) %-->index.html"><strong>Home</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->contribute.html">Give Shows »</strong></a>
<li><a href="<!--% absolute_url(baseurl) %-->about.html#so_you_want_to_record_a_podcast">Give Shows »</strong></a>
<li><a href="<!--% absolute_path(baseurl) %-->stuff_you_need_to_know.html">Info</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->theme.html">Theme</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->requested_topics.html">Topics</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->recording.html">Recording</a></li>
<li><a href="<!--% absolute_path(baseurl) %-->request_a_slot.html">Scheduling</a></li>
<li><a href="<!--% absolute_url(baseurl) %-->about.html#recording_a_podcast">Recording</a></li>
<li><!--% absolute_url(baseurl) %-->about.html#requesting_slot">Scheduling</a></li>
</ul>

View File

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

View File

@ -1,4 +1,5 @@
<!--% PROCESS 'shared-utils.tpl.html' %-->
<!--% USE date %-->
<!DOCTYPE HTML>
<html lang="en">
<head>
@ -8,8 +9,10 @@
<!--% END %-->
<meta charset="utf-8" />
<meta http-equiv="X-Clacks-Overhead" content="GNU Terry Pratchett" />
<meta http-equiv="last-modified" content="<!--% format_feed_date(date.now) %-->">
<meta name="keywords" content="Technology, Tech News, Education, Training" />
<meta name="description" content="Hacker Public Radio is an podcast that releases shows every weekday Monday through Friday. Our shows are produced by the community (you) and can be on any topic that are of interest to hackers and hobbyists." />
<meta name="description" content="Hacker Public Radio is a podcast that releases shows every weekday Monday through Friday. Our shows are produced by the community (you) and can be on any topic that is of interest to hackers and hobbyists." />
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Internal CSS -->
<style type="text/css">
article, aside, dialog, figure, footer, header, hgroup, menu, nav, section {
@ -19,12 +22,12 @@
display:none;
}
</style>
<link rel="shortcut icon" href="hpr.ico" >
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Ogg Vorbis RSS" href="<!--% absolute_path(baseurl) %-->hpr_ogg.rss" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Speex RSS" href="<!--% absolute_path(baseurl) %-->hpr_spx.rss" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio MP3 RSS" href="<!--% absolute_path(baseurl) %-->hpr_mp3.rss" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Comments RSS" href="/comments_rss.php" />
<link rel="license" title="cc by 3.0" href="https://creativecommons.org/licenses/by-sa/3.0/" />
<link rel="shortcut icon" href="<!--% absolute_url(baseurl) %-->hpr.ico" >
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Ogg Vorbis RSS" href="<!--% absolute_path(baseurl) %-->hpr_ogg_rss.php" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Speex RSS" href="<!--% absolute_path(baseurl) %-->hpr_spx_rss.php" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio MP3 RSS" href="<!--% absolute_path(baseurl) %-->hpr_mp3_rss.php" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Comments RSS" href="<!--% absolute_path(baseurl) %-->comments.rss" />
<link rel="license" title="CC BY-SA 4.0" href="https://creativecommons.org/licenses/by-sa/4.0/" />
<link href="<!--% absolute_path(baseurl) %-->css/hpr.css" rel="stylesheet" />
<!--[if IE]>
<link rel="stylesheet" href="<!--% absolute_path(baseurl) %-->css/hpr.css" media="screen" type="text/css" />
@ -36,21 +39,27 @@
<body id="give">
<div id="container" class="shadow">
<header>
<a href=""><img id="hprlogo" src="<!--% absolute_path(baseurl) %-->images/hpr_logo.png" alt=""></a>
<div id="hpr_banner">
<p id="accessible_menu">
<a href="<!--% absolute_path(baseurl) %-->sitemap.html">Site Map</a>
- <a href="#maincontent">skip to main content</a>
</p>
<h1 id="sitename">Hacker <a href="https://www.hackerpublicradio.org/comments_viewer.php">P</a>ublic <a href="<!--% absolute_path(baseurl) %-->syndication.html">R</a>adio</h1>
<h2>Your ideas, projects, opinions - podcasted.</h2>
<h3>New episodes Monday through Friday.</h3>
</div>
<hr />
<nav class="menu" role="navigation">
<a href="<!--% absolute_path(baseurl) %-->"><img id="hprlogo" src="<!--% absolute_path(baseurl) %-->images/hpr_logo.png" alt="hprlogo"></a>
<div id="hpr_banner">
<p id="accessible_menu">
<a href="<!--% absolute_path(baseurl) %-->sitemap.html">Site Map</a>
- <a href="#maincontent">skip to main content</a>
</p>
<h1 id="sitename">
<a href="<!--% absolute_path(baseurl) %-->correspondents/index.html">H</a>acker
<a href="<!--% absolute_path(baseurl) %-->comments_viewer.html">P</a>ublic
<a href="<!--% absolute_path(baseurl) %-->syndication.html">R</a>adio
</h1>
<h2>Your ideas, projects, opinions - podcasted.</h2>
<h3>New episodes every weekday Monday through Friday.<br />
<em><small>This page was <a href="https://repo.anhonesthost.net/HPR/hpr_generator">generated</a> by <a href="mailto:<!--% generator_email %-->"><!--% generator_name %--></a> at <time dateTime="<!--% format_iso8601_date(date.now) %-->"><!--% format_feed_date(date.now) %--></time></small></em></h3>
</div>
<hr />
<nav class="menu" role="navigation">
<!--% INCLUDE $navigation %-->
</nav>
</nav>
</header>
<main id="maincontent">
@ -58,7 +67,7 @@
</main>
<footer id="footer_page">
<h1 class="thick_bar"><span style="padding-left: 1em;">More Information...</span></h1>
<h1 class="thick_bar">More Information...</h1>
<div id="more_info">
<nav class="column">
<h2>Ancestry</h2>
@ -66,43 +75,52 @@
<li><a href="http://audio.textfiles.com/shows/radiofreekamerica/">Radio Freek America</a></li>
<li><a href="http://audio.textfiles.com/shows/binrev/">BinRev Radio</a></li>
<li><a href="http://audio.textfiles.com/shows/infonomicon/">Infonomicon</a></li>
<li><a href="http://audio.textfiles.com/shows/twat/">Talk With a Techie</a></li>
<li><a href="http://audio.textfiles.com/shows/twat/">Today With a Techie</a></li>
</ul>
</nav>
<nav class="column">
<h2>Social</h2>
<ul>
<li><a href="http://hackerpublicradio.org/mailman/listinfo/hpr_hackerpublicradio.org" target="_blank">Maillist</a></li>
<li><a href="<!--% absolute_url(baseurl,'/maillist') %-->" >Mailing list</a></li>
<li><a href="https://botsin.space/@hpr" >Mastodon</a></li>
<li><a href="https://matrix.to/#/#hpr:matrix.org" >Matrix</a></li>
<li><a href="mumble://chatter.skyehaven.net:64738/Hacker%20Public%20Radio?version=1.2.0" >Mumble</a></li>
<li><a href="https://web.libera.chat/gamja/?channels=oggcastplanet" target="_blank">#oggcastplanet</a></li>
<li><a href="https://t.me/+6fEhQrf5IEc4ZGU8">Telegram</a></li>
<li><a href="https://twitter.com/HPR">Twitter.com</a></li>
<li><a href="https://plus.google.com/u/0/s/hacker%20public%20radio" target="_blank">Google+</a></li>
<li><a href="https://www.facebook.com/home.php?sk=group_130169220378872¬if_t=group_r2j" target="_blank">Facebook</a></li>
<li><a href="https://www.facebook.com/HenryPartickReilly" target="_blank">Facebook</a></li>
<li><a href="https://www.linkedin.com/company/hackerpublicradio/" target="_blank">Linked-In</a></li>
<li><a href="http://itunes.apple.com/us/podcast/hacker-public-radio/id281699640" target="_blank">iTunes</a></li>
<li><a href="https://play.google.com/music/m/Igrhzh3izdb5qxv536ii6qpbgv4?t=Hacker_Public_Radio" target="_blank">Google Play</a></li>
</ul>
</nav>
</nav>
<nav class="column">
<h2>Affiliates</h2>
<h2>Unaffiliates</h2>
<ul>
<li><a href="http://www.hackradiolive.org/">Hack Radio Live</a></li>
<li><a href="http://www.binrev.com/">Binary Revolution</a></li>
<li><a href="http://hackermedia.org">Hackermedia</a></li>
<li><a href="http://www.nomicon.info/">Infonomicon</a></li>
<li><a href="http://www.packetsniffers.org/">Packetsniffers</a></li>
<li><a href="https://archive.org/details/hackerpublicradio">Archive.org</a></li>
<li><a href="https://music.amazon.fr/podcasts/9d9e6211-ff78-4501-93b6-6a9e560c4dbd/hacker-public-radio">Amazon Music</a></li>
<li><a href="https://podcasts.google.com/feed/aHR0cDovL2hhY2tlcnB1YmxpY3JhZGlvLm9yZy9ocHJfcnNzLnBocA">Google Podcasts</a></li>
<li><a href="https://www.iheart.com/podcast/256-hacker-public-radio-30994513/" target="_blank">iHeart Radio</a></li>
<li><a href="https://podcasts.apple.com/us/podcast/hacker-public-radio/id281699640">iTunes</a></li>
<li><a href="https://www.listennotes.com/de/podcasts/hacker-public-radio-hacker-public-radio-mNH-jsI7LcJ/">Listen Notes</a></li>
<li><a href="https://www.mixcloud.com/hackerpublicradio/">MixCloud</a></li>
<li><a href="https://player.fm/series/hacker-public-radio">PlayerFM</a></li>
<li><a href="https://www.podchaser.com/podcasts/hacker-public-radio-76781">Podchaser</a></li>
<li><a href="https://nl.radio.net/podcast/hacker-public-radio">Radio.net</a></li>
<li><a href="https://open.spotify.com/show/7e2hYcnHj9vKgUzsIOf4r3">Spotify</a></li>
<li><a href="https://toppodcast.com/podcast_feeds/hacker-public-radio/">Top Podcasts</a></li>
</ul>
</nav>
<nav class="column">
<h2>Commons</h2>
<ul>
<li><a href="https://freeculturepodcasts.org/">Free Culture Podcasts</a></li>
<li><a href="https://archive.org/details/hackerpublicradio">archive.org</a></li>
<li><a href="http://cchits.net/">cchits.net</a></li>
<li><a href="http://freemusi.cc/">FreeMusi.cc</a></li>
<li><a href="http://freesound.org/">freesound.org</a></li>
<li><a href="https://repo.anhonesthost.net/explore/repos" >HPR Source Code</a></li>
<li><a href="https://cchits.net/">cchits.net</a></li>
<li><a href="https://freesound.org/">freesound.org</a></li>
<li><a href="https://librivox.org/">librivox.org</a></li>
<li><a href="http://openclipart.org/">openclipart.org</a></li>
<li><a href="http://openfontlibrary.org/">openfontlibrary.org</a></li>
<li><a href="http://www.openrouteservice.org/">openrouteservice.org/</a></li>
<li><a href="https://openclipart.org/">openclipart.org</a></li>
<li><a href="https://openfontlibrary.org/">openfontlibrary.org</a></li>
<li><a href="https://www.openrouteservice.org/">openrouteservice.org/</a></li>
<li><a href="https://pixabay.com/">pixabay.com/</a></li>
</ul>
</nav>
@ -111,18 +129,18 @@
<ul>
<li><a href="https://anhonesthost.com/hosting/shared-hosting">AnHonestHost.com</a></li>
<li><a href="https://archive.org/donate/">Archive.org</a></li>
<li><a href="https://rsync.net/">rsync.net</a></li>
</ul>
</nav>
</div><!-- more_info -->
<h1 class="thick_bar"><span style="padding-left: 1em;">Copyright Information</span></h1>
<h1 class="thick_bar">Copyright Information</h1>
<div id="copyright">
<p>
Unless otherwise stated, our shows are released under a Creative Commons <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/">
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)</a> license.</p>
Unless otherwise stated, our shows are released under a <a rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/">
Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)</a> license.</p>
<p>
The <span property="dct:title">HPR Website Design</span> is released to the <a rel="license" href="http://creativecommons.org/publicdomain/mark/1.0/">Public Domain</a>.
The <span property="dct:title">HPR Website Design</span> is released to the <a rel="license" href="https://creativecommons.org/publicdomain/mark/1.0/">Public Domain</a>.
</p>
<hr />
</div><!-- copyright -->
<hr />
</footer>

View File

@ -0,0 +1,6 @@
<!--% query_call_for_shows = '
SELECT CASE WHEN COUNT(id) < 6 THEN True ELSE False END AS `request_for_shows`
FROM eps
WHERE eps.date > NOW() AND eps.date <= DATE_ADD(NOW(), INTERVAL 10 DAY)
'
%-->

View File

@ -0,0 +1,6 @@
<!--% query_call_for_shows = '
SELECT CASE WHEN COUNT(id) < 6 THEN True ELSE False END AS `request_for_shows`
FROM eps
WHERE eps.date > date(\'now\') AND eps.date <= date(\'now\', \'+10 days\')
'
%-->

View File

@ -0,0 +1,24 @@
<!--% query_hpr_shows = '
SELECT
eps.id,
eps.explicit,
eps.date, eps.license, eps.duration,
eps.title, eps.summary, eps.tags,
eps.notes,
hosts.local_image,
hosts.hostid,
hosts.host, hosts.email, hosts.profile,
miniseries.name AS series, miniseries.id AS seriesid
FROM eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
WHERE hosts.hostid = ? AND eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
ORDER BY eps.id DESC
'
%-->
<!--% query_hpr_show_count = '
SELECT id
FROM eps
WHERE eps.hostid = ? AND eps.date < DATE_ADD(NOW(), INTERVAL 1 DAY)
'
%-->

View File

@ -0,0 +1,24 @@
<!--% query_hpr_shows = '
SELECT
eps.id,
eps.explicit,
eps.date, eps.license, eps.duration,
eps.title, eps.summary, eps.tags,
eps.notes,
hosts.local_image,
hosts.hostid,
hosts.host, hosts.email, hosts.profile,
miniseries.name AS series, miniseries.id AS seriesid
FROM eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
WHERE hosts.hostid = ? AND eps.date < date(\'now\', \'+1 days\')
ORDER BY eps.id + 0 DESC
'
%-->
<!--% query_hpr_show_count = '
SELECT id
FROM eps
WHERE eps.hostid = ? AND eps.date < date(\'now\', \'+1 days\')
'
%-->

View File

@ -0,0 +1,51 @@
<!--% query_episode_maxmin = '
WITH episode_maxmin AS (
SELECT MAX(id) AS \'latest\', MIN(id) AS \'earliest\', ? AS \'id\'
FROM eps
WHERE eps.date <= UTC_DATE()
),
episode_date AS (
SELECT eps.date
FROM eps
WHERE eps.id = ?
),
episode_previous AS (
SELECT MAX(id) AS \'previous\', ? AS \'id\'
FROM eps
INNER JOIN episode_date
ON eps.date < episode_date.date
WHERE eps.id > 1
),
episode_next AS (
SELECT MIN(id) AS \'next\', ? AS \'id\'
FROM eps
INNER JOIN episode_date
ON eps.date > episode_date.date
WHERE eps.date <= NOW()
),
comment_tallies AS (
SELECT
eps_id,
COUNT(eps_id) AS eps_tally
FROM comments
GROUP BY eps_id
)
SELECT eps.id, eps.date, eps.title, eps.duration,
eps.summary, eps.notes, eps.explicit, eps.license,
eps.tags, eps.version, eps.downloads, eps.valid,
episode_maxmin.latest, episode_maxmin.earliest,
episode_previous.previous, episode_next.next,
hosts.hostid, hosts.host,
miniseries.name AS \'series\', miniseries.id AS \'seriesid\',
miniseries.description AS \'series_description\',
COALESCE (comment_tallies.eps_tally, 0) AS eps_tally
FROM eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
INNER JOIN episode_maxmin ON eps.id = episode_maxmin.id
INNER JOIN episode_previous ON eps.id = episode_previous.id
INNER JOIN episode_next ON eps.id = episode_next.id
LEFT JOIN comment_tallies ON eps.id = comment_tallies.eps_id
WHERE eps.id = ?
'
%-->

View File

@ -0,0 +1,51 @@
<!--% query_episode_maxmin = '
WITH episode_maxmin AS (
SELECT MAX(id) AS \'latest\', MIN(id) AS \'earliest\', ? AS \'id\'
FROM eps
WHERE eps.date <= date(\'now\')
),
episode_date AS (
SELECT eps.date
FROM eps
WHERE eps.id = ?
),
episode_previous AS (
SELECT MAX(id) AS \'previous\', ? AS \'id\'
FROM eps
INNER JOIN episode_date
ON eps.date < episode_date.date
WHERE eps.id > 1
),
episode_next AS (
SELECT MIN(id) AS \'next\', ? AS \'id\'
FROM eps
INNER JOIN episode_date
ON eps.date > episode_date.date
WHERE eps.date <= date(\'now\')
),
comment_tallies AS (
SELECT
eps_id,
COUNT(eps_id) AS eps_tally
FROM comments
GROUP BY eps_id
)
SELECT eps.id, eps.date, eps.title, eps.duration,
eps.summary, eps.notes, eps.explicit, eps.license,
eps.tags, eps.version, eps.downloads, eps.valid,
episode_maxmin.latest, episode_maxmin.earliest,
episode_previous.previous, episode_next.next,
hosts.hostid, hosts.host,
miniseries.name AS \'series\', miniseries.id AS \'seriesid\',
miniseries.description AS \'series_description\',
COALESCE (comment_tallies.eps_tally, 0) AS eps_tally
FROM eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
INNER JOIN episode_maxmin ON eps.id = episode_maxmin.id
INNER JOIN episode_previous ON eps.id = episode_previous.id
INNER JOIN episode_next ON eps.id = episode_next.id
LEFT JOIN comment_tallies ON eps.id = comment_tallies.eps_id
WHERE eps.id = ?
'
%-->

View File

@ -0,0 +1,15 @@
<!--% query_episodes = 'SELECT
eps.id,
eps.explicit,
eps.date, eps.license, eps.title, eps.summary,
eps.duration, eps.notes, eps.tags,
hosts.hostid,
hosts.host, hosts.email, hosts.local_image,
miniseries.name AS series, miniseries.id AS seriesid
FROM eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
WHERE eps.date <= UTC_DATE()
ORDER BY eps.id DESC'
%-->

View File

@ -0,0 +1,15 @@
<!--% query_episodes = 'SELECT
eps.id,
eps.explicit,
eps.date, eps.license, eps.title, eps.summary,
eps.duration, eps.notes, eps.tags,
hosts.hostid,
hosts.host, hosts.email, hosts.local_image,
miniseries.name AS series, miniseries.id AS seriesid
FROM eps
INNER JOIN hosts ON eps.hostid = hosts.hostid
INNER JOIN miniseries ON eps.series = miniseries.id
WHERE eps.date <= date(\'now\')
ORDER BY eps.id + 0 DESC'
%-->

View File

@ -0,0 +1,2 @@
<!--% query_ids_episode = 'select eps.id from eps order by eps.id' %-->

View File

@ -0,0 +1,2 @@
<!--% query_ids_episode = 'select eps.id from eps order by eps.id' %-->

Some files were not shown because too many files have changed in this diff Show More