Compare commits
	
		
			27 Commits
		
	
	
		
			kdmurrayhp
			...
			20409e9521
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 20409e9521 | |||
|  | 73dd71f2f0 | ||
|  | 06601c5d20 | ||
|  | eedd954a11 | ||
|  | a3b927f802 | ||
|  | 1853715a19 | ||
| b17daba4ed | |||
| 70d5983ede | |||
| 31a5994731 | |||
| aaaaa29d8e | |||
| 3662ebd0aa | |||
| c64ad492c8 | |||
| 0f57b99fbe | |||
| 48b3c51bb3 | |||
| 4e9f1457d5 | |||
| 4ae854f5e1 | |||
| af810c88bc | |||
|  | 92dce90753 | ||
|  | 65e4e1af5e | ||
|  | b5384408db | ||
|  | 1a84becd8d | ||
|  | d74c23bace | ||
|  | f1817e6820 | ||
|  | 493bae282b | ||
|  | dbc557d4c5 | ||
|  | 2099f0e130 | ||
|  | 29c9c827a4 | 
| @@ -41,8 +41,9 @@ apt install libconfig-std-perl \ | ||||
| ## Using CPAN to install the modules | ||||
|  | ||||
| A cross platform method to install the needed modules is the Perl CPAN application.  | ||||
| Make sure both the [make](https://www.gnu.org/software/make/manual/make.html)  | ||||
| command and the [cpan](https://perldoc.perl.org/CPAN) command are available.  | ||||
| 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: | ||||
| @@ -51,9 +52,21 @@ 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 | ||||
|   | ||||
| @@ -25,7 +25,7 @@ Static web page generator for the Hacker Public Radio website. | ||||
| 		- ``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 | ||||
| @@ -35,7 +35,7 @@ Static web page generator for the Hacker Public Radio website. | ||||
|     * Template::Plugin::HTML::Strip | ||||
|     * DBI | ||||
|     * Tie::DBI | ||||
|     * DBD::SQLite or DBD:mysql | ||||
|     * DBD::SQLite or DBD::mysql | ||||
|     * Date::Calc | ||||
|     * Text::CSV_XS | ||||
|     * HTML::Entities | ||||
| @@ -72,6 +72,8 @@ and add the label "**Feature Request**". | ||||
|  | ||||
| ## Authors and acknowledgment | ||||
| * Roan "Rho`n" Horning | ||||
| * Dave Morriss | ||||
| * gordons | ||||
| * Ken Fallon | ||||
| * norrist | ||||
|  | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								public_html/images/hosts/149.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								public_html/images/hosts/149.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 7.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public_html/images/hosts/421.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								public_html/images/hosts/421.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 7.5 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public_html/images/hosts/425.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								public_html/images/hosts/425.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 16 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public_html/images/hosts/433.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								public_html/images/hosts/433.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 8.0 KiB | 
| @@ -122,7 +122,6 @@ use Text::CSV_XS; | ||||
| use HTML::Entities qw(encode_entities); | ||||
| use Date::Calc; | ||||
| use DBI; | ||||
| use DBD::SQLite; | ||||
| use Tie::DBI; | ||||
| use Template; | ||||
| use Template::Plugin::Date; | ||||
|   | ||||
| @@ -582,9 +582,10 @@ | ||||
|  | ||||
|   <h1 id="reserve_queue">Feed the reserve queue<a href="<!--% absolute_url(baseurl,'about.html#reserve_queue') %-->">.</a></h1> | ||||
|   <p> | ||||
|   The reserve 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 reserve queue is intended only to be used in the cases where there is still a gap in the schedule one week prior to release.  | ||||
|   This was known as the emergency queue, but now can also be used when the hosts don't care when the shows are scheduled.  | ||||
|   They will be used on a first come first go basis, when there is no conflict with the scheduling guidelines. | ||||
|   These shows contain a message alerting listeners to the fact that we had free slots that were not filled. | ||||
|   </p> | ||||
|  | ||||
|   <hr /> | ||||
| @@ -592,11 +593,12 @@ | ||||
|   <h1 id="scheduling_guidelines">Scheduling Guidelines</h1> | ||||
|   <ol> | ||||
|   <li>You must have your audio recording ready to upload <strong>before</strong> you pick a slot.</li> | ||||
|   <li>New hosts, Interviews, and other time critical shows should use the first free slot.</li> | ||||
|   <li>Always try and fill any free slots that are available in the upcoming two weeks.</li> | ||||
|   <li>If the queue is filling up then please consider leaving some slots free for new contributors.</li> | ||||
|   <li>If you have a non urgent show then find a empty week and schedule it then.</li> | ||||
|   <li>If you are uploading a series of shows, consider scheduling one every two weeks.</li> | ||||
|   <li>Interviews may be released sooner.</li> | ||||
|   <li>When the queue is filling up then leave some slots free for new contributors.</li> | ||||
|   <li>Post non urgent shows into the first empty week.</li> | ||||
|   <li>If you are uploading a series of shows then post them one every two weeks.</li> | ||||
|   <li>If you have a non urgent show that is timeless, then add it to the <a href="<!--% absolute_url(baseurl,'about.html#reserve_queue') %-->">Reserve Queue</a>.</li> | ||||
|   </ol> | ||||
|    | ||||
|   <hr /> | ||||
|   | ||||
| @@ -3,15 +3,10 @@ | ||||
| <!--% PROCESS 'shared-utils.tpl.html' %--> | ||||
| <!--% PROCESS "queries-correspondent-${constants.database}.tpl.html" %--> | ||||
| <!--% USE DBI(constants.driver, constants.user, constants.password) %--> | ||||
| <!--% query_hpr_show_count = DBI.prepare(' | ||||
| 		SELECT id | ||||
| 		FROM eps | ||||
| 		WHERE eps.hostid = ? | ||||
| 		') | ||||
| %--> | ||||
| <!--% results_hpr_shows = DBI.prepare(query_hpr_shows) | ||||
| %--> | ||||
| <!--% hpr_shows_to_count = query_hpr_show_count.execute(id); %--> | ||||
| <!--% 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 %--> | ||||
|   | ||||
| @@ -110,9 +110,18 @@ Subscribe to the comments <a href="<!--% absolute_path(baseurl) %-->comments.rss | ||||
| 	</tr> | ||||
| <!-- . --> | ||||
| 	<tr> | ||||
| 	<td>What is the <strong>HOST_ID</strong> for the host of this show?</td> | ||||
| 	<td>Who is the <strong>host</strong> of this show?</td> | ||||
| 	<td> | ||||
| 	<input required type="text" name="hostid" size="20" maxlength="5" placeholder="Type the host number"></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> | ||||
|   | ||||
| @@ -4,27 +4,27 @@ | ||||
| <!--% PERL %--> | ||||
| $Template::Stash::PRIVATE = undef; # Allow . in tag | ||||
| <!--% END %--> | ||||
| <!--% USE String %--> | ||||
| <!--% uniq_tag_count = 0 %--> | ||||
| <!--% comma_re = '(?x)(?:^|,\s*)(?:"((?>[^"]*)(?:""[^"]*)*)"|([^",]*))'; %--> | ||||
| <!--# 'Moka5,interview, "computer science"' --> | ||||
| <!--% FOREACH episode IN DBI.query(query_tags); | ||||
|     ep_id = episode.id; | ||||
|     ep_tags = episode.tags; | ||||
|     FOREACH tag_str IN ep_tags.split(comma_re); | ||||
|     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 = '.'; # Unicode . | ||||
|         END; | ||||
|         IF all_tags.${first_char}.exists(tag); | ||||
|             all_tags.${first_char}.${tag}.count = all_tags.${first_char}.${tag}.count + 1; | ||||
|             all_tags.${first_char}.${tag}.urls.push(ep_id); | ||||
|         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}.count = 1; | ||||
|             all_tags.${first_char}.${tag_index}.count = 1; | ||||
|             uniq_tag_count = uniq_tag_count + 1; | ||||
|             all_tags.${first_char}.${tag}.urls = [ep_id]; | ||||
|             all_tags.${first_char}.${tag_index}.urls = [ep_id]; | ||||
|         END; | ||||
|     END; | ||||
| END %--> | ||||
| @@ -53,7 +53,7 @@ END %--> | ||||
| 	<ul class="columns3"> | ||||
|     <!--% FOREACH first_char IN all_first %--> | ||||
|         <!--% IF all_tags.${first_char} %--> | ||||
|             <li><a href="<!--% absolute_path(baseurl) %-->tags.html#<!--% all_tags.${first_char}.keys.sort.first %-->"><strong><!--% first_char %--></strong></a></li> | ||||
|             <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> | ||||
| @@ -63,11 +63,12 @@ END %--> | ||||
| 		<p class="ralign"><a href="<!--% absolute_path(baseurl) %-->tags.html#TOP">↑ Go to index</a></p> | ||||
| 	        <h3>Tags beginning with '<!--% first_char %-->'</h3> | ||||
| 	        <ul> | ||||
|                 <!--% FOREACH tag IN all_tags.${first_char}.keys.sort %--> | ||||
|                 <!--% 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 %-->"><strong><!--% tag %--></strong></a>:  | ||||
|     	        		<a id="<!--% tag_to_id(tag_id) %-->"><strong><!--% tag %--></strong></a>:  | ||||
|                         <!--% ep_links = [] %--> | ||||
|                         <!--% FOREACH ep_id IN all_tags.${first_char}.${tag}.urls.nsort; | ||||
|                         <!--% 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>'); | ||||
|   | ||||
| @@ -52,7 +52,7 @@ | ||||
|       </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/rho_n/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> | ||||
|     <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 /> | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <!--% query_hpr_shows = ' | ||||
| 		SELECT | ||||
| 	SELECT | ||||
| 		eps.id, | ||||
| 		eps.explicit, | ||||
| 		eps.date, eps.license, eps.duration, | ||||
| @@ -16,3 +16,9 @@ | ||||
| 	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) | ||||
| 	' | ||||
| %--> | ||||
|   | ||||
| @@ -16,3 +16,9 @@ | ||||
| 	ORDER BY eps.id + 0 DESC | ||||
| 	' | ||||
| %--> | ||||
| <!--% query_hpr_show_count = ' | ||||
| 	SELECT id | ||||
| 	FROM eps | ||||
| 	WHERE eps.hostid = ? AND eps.date < date(\'now\', \'+1 days\') | ||||
| 	' | ||||
| %--> | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|   <copyright>Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) License</copyright> | ||||
|   <managingEditor>feedback.nospam@nospam.hackerpublicradio.org (HPR Feedback)</managingEditor> | ||||
|   <webMaster>admin.nospam@nospam.hackerpublicradio.org (HPR Webmaster)</webMaster> | ||||
|   <generator>https://repo.anhonesthost.net/rho_n/hpr_generator</generator> | ||||
|   <generator>https://repo.anhonesthost.net/HPR/hpr_generator</generator> | ||||
|   <docs>https://www.rssboard.org/rss-specification</docs> | ||||
|   <ttl>600</ttl> | ||||
|   <image> | ||||
|   | ||||
| @@ -14,7 +14,7 @@ from the series <em><a href="<!--% baseurl %-->series/<!--% zero_pad_left(series | ||||
| <!--% MACRO display_tags(tags) BLOCK %--> | ||||
|     <span><label>Tags:</label> <em> | ||||
|         <!--% FOREACH tag IN tags.csv_parse %--> | ||||
|         <a href="<!--% absolute_path(baseurl) %-->tags.html#<!--% tag.lower %-->"><!--% tag %--></a><!--% IF loop.count == loop.size %-->.<!--% ELSE %-->,<!--% END %--> | ||||
|         <a href="<!--% absolute_path(baseurl) %-->tags.html#<!--% tag_to_id(tag) %-->"><!--% tag %--></a><!--% IF loop.count == loop.size %-->.<!--% ELSE %-->,<!--% END %--> | ||||
|         <!--% END %--></em> | ||||
|     </span> | ||||
| <!--% END %--> | ||||
|   | ||||
| @@ -49,6 +49,15 @@ | ||||
| <!--% iso8601_date.format(date_to_format) %--> | ||||
| <!--% END %--> | ||||
|  | ||||
| <!--% MACRO tag_to_id(tag, is_index) BLOCK %--> | ||||
| <!--% tag = tag.replace('\s+','_') %--> | ||||
| <!--% IF is_index %--> | ||||
|     <!--% tag.upper %--> | ||||
| <!--% ELSE %--> | ||||
|     <!--% tag.lower %--> | ||||
| <!--% END %--> | ||||
| <!--% END %--> | ||||
|  | ||||
| <!--% MACRO absolute_url(base, path) BLOCK %--> | ||||
| <!--% UNLESS base.empty %--> | ||||
|     <!--% UNLESS base.substr(-1) == '/' %--> | ||||
|   | ||||
							
								
								
									
										73
									
								
								utils/check-dependencies.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										73
									
								
								utils/check-dependencies.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| #!/bin/bash -  | ||||
| #=============================================================================== | ||||
| # | ||||
| #          FILE: check-dependencies.sh | ||||
| #  | ||||
| #         USAGE: ./check-dependencies.sh  | ||||
| #  | ||||
| #   DESCRIPTION: Check that Perl module dependencies for the hpr_generator  | ||||
| #		  are installed. | ||||
| #  | ||||
| #       OPTIONS: --- | ||||
| #  REQUIREMENTS: --- | ||||
| #          BUGS: --- | ||||
| #         NOTES: --- | ||||
| #        AUTHOR: Roan "Rho`n" Horning (roan.horning@gmail.com) | ||||
| #  ORGANIZATION:  | ||||
| #       CREATED: 09/05/2024 09:55:00 PM | ||||
| #      REVISION:  --- | ||||
| #=============================================================================== | ||||
|  | ||||
| set -o nounset                              # Treat unset variables as an error | ||||
|  | ||||
| #---  FUNCTION  ---------------------------------------------------------------- | ||||
| #          NAME: is_module_installed  | ||||
| #   DESCRIPTION: Tests if the supplied module is found on the system  | ||||
| #    PARAMETERS: Name of the denpendent Perl module | ||||
| #       RETURNS: 0 if not found, 1 if found | ||||
| #------------------------------------------------------------------------------- | ||||
| function is_module_installed { | ||||
| 	HR="----------------------" | ||||
| 	perl -e "use ${1} "  | ||||
| 	if  [ $? -ne 0 ] | ||||
| 	then | ||||
| 		echo ${HR} | ||||
| 	else | ||||
| 		echo "Found module ${1}" | ||||
| 		echo ${HR} | ||||
| 	fi | ||||
| } | ||||
|  | ||||
| MODULES=( \ | ||||
| 	 "Getopt::Long" \ | ||||
| 	 "Pod::Usage" \ | ||||
| 	 "Config::Std" \ | ||||
| 	 "Template" \ | ||||
| 	 "Template::Plugin::File" \ | ||||
| 	 "Template::Plugin::DBI" \ | ||||
| 	 "Template::Plugin::HTML::Strip" \ | ||||
| 	 "DBI" \ | ||||
| 	 "Tie::DBI" \ | ||||
| 	 "DBD::SQLite" \ | ||||
| 	 "DBD::mysql" \ | ||||
| 	 "Date::Calc" \ | ||||
| 	 "Text::CSV_XS" \ | ||||
| ) | ||||
|  | ||||
| echo "The following modules must be installed for the site-generator to function: " | ||||
| for module in "${MODULES[@]}" | ||||
| do | ||||
| 	echo "* ${module}" | ||||
| done | ||||
| echo "When MySQL is used, the DBD:mysql module is required (otherwise it is optional)" | ||||
| echo "When SQLite is used, then the DBD:SQLite module is required (otherwise it is optional)" | ||||
|  | ||||
| echo "Scanning for modules ..." | ||||
| echo "----------------------" | ||||
|  | ||||
| for module in "${MODULES[@]}" | ||||
| do | ||||
| 	is_module_installed "${module}" | ||||
| done | ||||
|  | ||||
| echo "Finished scanning." | ||||
		Reference in New Issue
	
	Block a user