Compare commits
7 Commits
db39655199
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
8bad5945f6 | ||
|
be7cb01720 | ||
|
de0c54c99a | ||
|
7d26840371 | ||
|
80226491a7 | ||
|
389848f43a | ||
|
6f20932290 |
434
feedWatcher
434
feedWatcher
@@ -29,9 +29,9 @@
|
||||
# BUGS: ---
|
||||
# NOTES: ---
|
||||
# AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
|
||||
# VERSION: 0.1.2
|
||||
# VERSION: 0.1.4
|
||||
# CREATED: 2013-12-25 12:40:33
|
||||
# REVISION: 2023-01-10 22:44:38
|
||||
# REVISION: 2023-01-31 20:45:23
|
||||
#
|
||||
#-------------------------------------------------------------------------------
|
||||
# Released under the terms of the GNU Affero General Public License (AGPLv3)
|
||||
@@ -58,6 +58,7 @@ use Getopt::Long;
|
||||
use Pod::Usage;
|
||||
use Config::General;
|
||||
use List::MoreUtils qw{uniq};
|
||||
use Set::Array;
|
||||
use Log::Handler;
|
||||
|
||||
use Try::Tiny;
|
||||
@@ -93,7 +94,7 @@ use Data::Dumper;
|
||||
#
|
||||
# Version number (manually incremented)
|
||||
#
|
||||
our $VERSION = '0.1.2';
|
||||
our $VERSION = '0.1.4';
|
||||
|
||||
#
|
||||
# Script name
|
||||
@@ -106,6 +107,7 @@ our $VERSION = '0.1.2';
|
||||
my ( $action_mode, @urls, @deletions );
|
||||
my ( $rules, $robot_name ) = ( undef, "$PROG/$VERSION" );
|
||||
my ( $sth1, $h1, $rv, $search_target, $rejectcount );
|
||||
my ( $loadfile, $deletefile ) = ( '', '' );
|
||||
|
||||
my $feeds;
|
||||
|
||||
@@ -208,11 +210,16 @@ my $cfgfile
|
||||
my $dry_run = ( defined( $options{'dry-run'} ) ? $options{'dry-run'} : 0 );
|
||||
my $silent = ( defined( $options{silent} ) ? $options{silent} : 0 );
|
||||
|
||||
my $loadfile = $options{'load'};
|
||||
my $deletefile = $options{'delete'};
|
||||
my $load = $options{'load'};
|
||||
my $delete = $options{'delete'};
|
||||
my $inputfile = $options{'input'};
|
||||
|
||||
my $scan = ( defined( $options{scan} ) ? $options{scan} : 0 );
|
||||
my $refresh = ( defined( $options{refresh} ) ? $options{refresh} : 0 );
|
||||
my $expire = ( defined( $options{expire} ) ? $options{expire} : 0 );
|
||||
my $html = ( defined( $options{html} ) ? $options{html} : 0 );
|
||||
my $ignore_case
|
||||
= ( defined( $options{'ignore-case'} ) ? $options{'ignore-case'} : 0 );
|
||||
|
||||
my $check = $options{check};
|
||||
my $outfile = $options{out};
|
||||
@@ -230,7 +237,22 @@ my $template = $options{template};
|
||||
# Sanity
|
||||
#
|
||||
die "Choose either -load or -delete, not both\n"
|
||||
if (defined($loadfile) && defined($deletefile));
|
||||
if (defined($load) && defined($delete));
|
||||
die "Options -load and -delete should not be combined with -scan or -refresh\n"
|
||||
if ( ( defined($load) || defined($delete) ) && ( $scan || $refresh ) );
|
||||
|
||||
#
|
||||
# Check the -input=FILE option is used with -load or -delete and confirm the
|
||||
# existence and readability of the input file if specified.
|
||||
#
|
||||
if ( defined($inputfile) ) {
|
||||
die "Option -input=FILE must be used with -load or -delete\n"
|
||||
unless ($load || $delete);
|
||||
die "File in '-input=$inputfile' does not exist\n"
|
||||
unless -e $inputfile;
|
||||
die "File in '-input=$inputfile' is not readable\n"
|
||||
unless -r $inputfile;
|
||||
}
|
||||
|
||||
#
|
||||
# Check the configuration file
|
||||
@@ -238,28 +260,30 @@ die "Choose either -load or -delete, not both\n"
|
||||
die "Unable to find configuration file $cfgfile\n" unless ( -e $cfgfile );
|
||||
|
||||
#
|
||||
# Process the load option and the delete option, checking any files mentioned,
|
||||
# and determining the primary action we're aiming for.
|
||||
# Determine the action mode, reading a file and/or using URLs on the command
|
||||
# line.
|
||||
#
|
||||
if (optionalFile('load', $loadfile)) {
|
||||
if ($load) {
|
||||
$action_mode = 'load';
|
||||
$loadfile = $inputfile;
|
||||
_debug(
|
||||
$DEBUG > 0,
|
||||
"Action mode: $action_mode",
|
||||
( $loadfile eq ''
|
||||
? "Load from arguments"
|
||||
: "File to load: $loadfile"
|
||||
( defined($loadfile)
|
||||
? "File to load: $loadfile"
|
||||
: "Load from arguments"
|
||||
)
|
||||
);
|
||||
}
|
||||
elsif (optionalFile('delete', $deletefile)) {
|
||||
elsif ($delete) {
|
||||
$action_mode = 'delete';
|
||||
$deletefile = $inputfile;
|
||||
_debug(
|
||||
$DEBUG > 0,
|
||||
"Action mode: $action_mode",
|
||||
( $deletefile eq ''
|
||||
? "Delete from arguments"
|
||||
: "File to delete from $deletefile"
|
||||
( defined($deletefile)
|
||||
? "File to delete from: $deletefile"
|
||||
: "Delete from arguments"
|
||||
)
|
||||
);
|
||||
}
|
||||
@@ -267,13 +291,15 @@ else {
|
||||
$action_mode = 'none';
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# The copyright checking mode defaults to 'auto' if the option has no value,
|
||||
# or may be 'manual' or 'none'. If the option is not used at all it defaults
|
||||
# to 'none'. It's only relevant to the 'load' action though.
|
||||
#
|
||||
if ( $action_mode eq 'load' ) {
|
||||
if ( $action_mode eq 'load' && defined($check) ) {
|
||||
# if ( $action_mode eq 'load' && defined($check) ) {
|
||||
if ( defined($check) ) {
|
||||
$check =~ s/(^\s+|\s+$)//g;
|
||||
if ($check =~ /^$/) {
|
||||
$check = "auto";
|
||||
@@ -291,8 +317,10 @@ if ( $action_mode eq 'load' ) {
|
||||
emit($silent,"Copyright check mode = $check\n");
|
||||
}
|
||||
|
||||
emit($silent,"Dry run mode = " . ($dry_run ? "On" : "Off") . "\n");
|
||||
emit($silent,"----\n");
|
||||
if ($dry_run) {
|
||||
emit( $silent, "Dry run mode = On\n" );
|
||||
emit( $silent, "----\n" );
|
||||
}
|
||||
|
||||
# TODO: Does it make sense to have -load and -report, etc at the same time?
|
||||
#
|
||||
@@ -370,16 +398,19 @@ my $dbh
|
||||
$dbh->do('PRAGMA foreign_keys = ON');
|
||||
|
||||
#
|
||||
# Check we have something to do
|
||||
# Check we have something to do. NOTE: this check is a bit early because we
|
||||
# haven't read the input file yet, if there is one.
|
||||
#
|
||||
my $rows = countRows( $dbh, 'SELECT count(*) FROM urls' );
|
||||
my $work = (
|
||||
( scalar(@urls) > 0 && $action_mode =~ /load|delete/ )
|
||||
( ( scalar(@urls) > 0 || defined($inputfile) )
|
||||
&& $action_mode =~ /load|delete/
|
||||
)
|
||||
|| ( defined($report)
|
||||
|| defined($json)
|
||||
|| defined($opml)
|
||||
|| defined($template)
|
||||
|| $scan && $rows > 0 )
|
||||
|| defined($template) )
|
||||
|| ( ( $scan || $refresh ) && $rows > 0 )
|
||||
);
|
||||
|
||||
unless ($work) {
|
||||
@@ -388,7 +419,8 @@ unless ($work) {
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Set up logging keeping the default log layout except for the date
|
||||
# Set up logging keeping the default log layout except for the date. Enable
|
||||
# 'utf-8' mode (documented in Log::Handler::Output::File).
|
||||
#-------------------------------------------------------------------------------
|
||||
my $LOG = Log::Handler->new();
|
||||
|
||||
@@ -398,6 +430,7 @@ $LOG->add(
|
||||
filename => $logfile,
|
||||
minlevel => 0,
|
||||
maxlevel => 7,
|
||||
'utf-8' => 1,
|
||||
}
|
||||
);
|
||||
|
||||
@@ -495,7 +528,7 @@ if ($action_mode eq 'load') {
|
||||
@urls = loadUrls( $dbh, \@urls, $rules, \%keymap, $dry_run );
|
||||
}
|
||||
}
|
||||
elsif ($action_mode eq 'delete') {
|
||||
elsif ( $action_mode eq 'delete' ) {
|
||||
#
|
||||
# Process the delete file if there is one
|
||||
#
|
||||
@@ -507,7 +540,8 @@ elsif ($action_mode eq 'delete') {
|
||||
or die "$PROG : failed to open load file '$deletefile' : $!\n";
|
||||
chomp( @deletions = <$del> );
|
||||
close($del)
|
||||
or warn "$PROG : failed to close delete file '$deletefile' : $!\n";
|
||||
or warn
|
||||
"$PROG : failed to close delete file '$deletefile' : $!\n";
|
||||
|
||||
#
|
||||
# Add the loaded URLs to the array
|
||||
@@ -525,13 +559,55 @@ elsif ($action_mode eq 'delete') {
|
||||
# TODO: check that these URLs are actually in the database! Seems
|
||||
# silly to report "Failed to delete" when it's not there anyway!
|
||||
#
|
||||
#
|
||||
# There are URLs to delete. Process them one by one.
|
||||
#
|
||||
if ($dry_run) {
|
||||
emit( $silent,
|
||||
"Would have deleted " . scalar(@urls) . " URLs\n" )
|
||||
"Would have deleted "
|
||||
. scalar(@urls)
|
||||
. " URLs (after checking)\n" );
|
||||
}
|
||||
else {
|
||||
my @missing;
|
||||
|
||||
#
|
||||
# Check the URLs exist
|
||||
#
|
||||
$sth1 = $dbh->prepare(q{SELECT id from urls WHERE url = ?});
|
||||
foreach my $rec (@urls) {
|
||||
$rv = $sth1->execute($rec);
|
||||
if ( $dbh->err ) {
|
||||
warn $dbh->errstr;
|
||||
}
|
||||
$h1 = $sth1->fetchrow_hashref;
|
||||
unless ($h1) {
|
||||
emit( $silent, "Could not find URL $rec in the database\n" );
|
||||
$LOG->warning(
|
||||
"Failed to delete '$rec'; not in the database");
|
||||
push( @missing, $rec );
|
||||
}
|
||||
}
|
||||
|
||||
#
|
||||
# Remove the missing URLs from @urls
|
||||
#
|
||||
if (@missing) {
|
||||
my $sa1 = Set::Array->new(@urls);
|
||||
my $sa2 = Set::Array->new(@missing);
|
||||
@urls = $sa1->difference($sa2);
|
||||
}
|
||||
|
||||
#
|
||||
# If nothing is left we're done
|
||||
#
|
||||
unless (@urls) {
|
||||
warn "No URLs left after cleaning\n";
|
||||
}
|
||||
else {
|
||||
#
|
||||
# Delete what's left after cleaning
|
||||
#
|
||||
$sth1 = $dbh->prepare(q{DELETE from urls WHERE url = ?});
|
||||
foreach my $rec (@urls) {
|
||||
$rv = $sth1->execute($rec);
|
||||
@@ -539,12 +615,14 @@ elsif ($action_mode eq 'delete') {
|
||||
warn $dbh->errstr;
|
||||
}
|
||||
if ( $rv != 0 ) {
|
||||
emit ( $silent, "Deleted $rec ($rv rows)\n" );
|
||||
$LOG->info( "Deleted URL '$rec' from the database" );
|
||||
emit( $silent, "Deleted $rec ($rv rows)\n" );
|
||||
$LOG->info("Deleted URL '$rec' from the database");
|
||||
}
|
||||
else {
|
||||
emit ( $silent, "Failed to delete $rec\n" );
|
||||
$LOG->warning( "Failed to delete '$rec' from the database" );
|
||||
emit( $silent, "Failed to delete $rec\n" );
|
||||
$LOG->warning(
|
||||
"Failed to delete '$rec' from the database");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -556,9 +634,18 @@ elsif ($action_mode eq 'delete') {
|
||||
# TODO: Needs to be developed; does nothing at the moment.
|
||||
#-------------------------------------------------------------------------------
|
||||
if ($scan) {
|
||||
$LOG->warning( "Scan is not fully implemented yet" );
|
||||
warn "Refresh is not implemented yet\n";
|
||||
#$LOG->warning( "Scan is not fully implemented yet" );
|
||||
# Testing. Processes the first two feeds
|
||||
scanDB($dbh, \%keymap, $dry_run);
|
||||
# TODO: Currently broken
|
||||
#scanDB($dbh, \%keymap, $dry_run);
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Perform a feed refresh
|
||||
#-------------------------------------------------------------------------------
|
||||
if ($refresh) {
|
||||
warn "Refresh is not implemented yet";
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -569,7 +656,7 @@ if ( defined($report) ) {
|
||||
#
|
||||
# Reporting a specific title
|
||||
#
|
||||
my @matches = searchTitle( $dbh, $search_target );
|
||||
my @matches = searchTitle( $dbh, $search_target, $ignore_case );
|
||||
if (@matches) {
|
||||
#
|
||||
# Too many matches!
|
||||
@@ -861,7 +948,7 @@ sub loadUrls {
|
||||
# Perform a check on the copyright. The routine sets
|
||||
# $uridata{SAVE} = 0 if the copyright is not acceptable.
|
||||
#
|
||||
$uridata{CHECKMODE} = $check;
|
||||
$uridata{CHECKTYPE} = $check;
|
||||
if ( $check ne 'none' ) {
|
||||
unless (checkCopyright( $check, \%uridata )) {
|
||||
#
|
||||
@@ -964,6 +1051,8 @@ sub loadUrls {
|
||||
# PURPOSE: Search the database for a feed with a given title
|
||||
# PARAMETERS: $dbh database handle
|
||||
# $target search target
|
||||
# $ignore_case Boolean controlling whether it's a caseles
|
||||
# search
|
||||
# RETURNS: A list of titles
|
||||
# DESCRIPTION:
|
||||
# THROWS: No exceptions
|
||||
@@ -971,7 +1060,7 @@ sub loadUrls {
|
||||
# SEE ALSO: N/A
|
||||
#===============================================================================
|
||||
sub searchTitle {
|
||||
my ($dbh, $target) = @_;
|
||||
my ($dbh, $target, $ignore_case) = @_;
|
||||
|
||||
my ( $sql1, $sql2, $sth, $rv, $h );
|
||||
my ( $count, @result );
|
||||
@@ -991,11 +1080,16 @@ sub searchTitle {
|
||||
ORDER BY title
|
||||
};
|
||||
|
||||
#
|
||||
# Handle caseless searches
|
||||
#
|
||||
$target = ($ignore_case ? '(?i)' : '') . $target;
|
||||
|
||||
#
|
||||
# Count the number of matches
|
||||
#
|
||||
$sth = $dbh->prepare($sql1);
|
||||
$rv = $sth->execute($search_target);
|
||||
$rv = $sth->execute($target);
|
||||
if ( $dbh->err ) {
|
||||
warn $dbh->errstr;
|
||||
return;
|
||||
@@ -1010,7 +1104,7 @@ sub searchTitle {
|
||||
|
||||
if ( $count >= 1 ) {
|
||||
$sth = $dbh->prepare($sql2);
|
||||
$rv = $sth->execute($search_target);
|
||||
$rv = $sth->execute($target);
|
||||
if ( $dbh->err ) {
|
||||
warn $dbh->errstr;
|
||||
return;
|
||||
@@ -1027,6 +1121,67 @@ sub searchTitle {
|
||||
}
|
||||
}
|
||||
|
||||
#=== FUNCTION ================================================================
|
||||
# NAME: refreshFeeds
|
||||
# PURPOSE: To refresh the episodes on all feeds
|
||||
# PARAMETERS: $dbh database handle
|
||||
# RETURNS: Nothing
|
||||
# DESCRIPTION:
|
||||
# THROWS: No exceptions
|
||||
# COMMENTS: None
|
||||
# SEE ALSO: N/A
|
||||
#===============================================================================
|
||||
sub refreshFeeds {
|
||||
my ($dbh) = @_;
|
||||
|
||||
my ( $sql1, $sth1, $rv1, $h1 );
|
||||
my ( $aref, @urls, $DT, $stream, $feed );
|
||||
my ( %uridata, $encref, $enc_changes );
|
||||
|
||||
#
|
||||
# Query to return all feed URLs
|
||||
#
|
||||
$sql1 = q{SELECT id, url FROM urls WHERE urltype = 'Feed' ORDER BY title};
|
||||
|
||||
$sth1 = $dbh->prepare($sql1);
|
||||
$rv1 = $sth1->execute();
|
||||
if ( $dbh->err ) {
|
||||
warn $dbh->errstr;
|
||||
}
|
||||
|
||||
#
|
||||
# Collect everything as an arrayref pointing to a bunch of arrayrefs
|
||||
# containing the column details requested
|
||||
#
|
||||
$aref = $sth1->fetchall_arrayref;
|
||||
|
||||
#
|
||||
# Extract just the URL strings
|
||||
#
|
||||
@urls = map { $_->[1] } @{$aref};
|
||||
|
||||
#
|
||||
# Loop through the feed URLs
|
||||
#
|
||||
foreach my $url (@urls) {
|
||||
#
|
||||
# Get the feed as XML
|
||||
#
|
||||
$stream = getFeed($url);
|
||||
next unless $stream;
|
||||
|
||||
#
|
||||
# Parse the feed as an XML::Feed object
|
||||
#
|
||||
$feed = parseFeed($url,$stream);
|
||||
next unless $feed;
|
||||
|
||||
#
|
||||
# Turn the enclosures in the feed into an array of anonymous hashes
|
||||
#
|
||||
$encref = extractEnclosures($feed);
|
||||
}
|
||||
}
|
||||
|
||||
#=== FUNCTION ================================================================
|
||||
# NAME: scanDB
|
||||
@@ -1215,7 +1370,6 @@ sub scanDB {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
#=== FUNCTION ================================================================
|
||||
# NAME: scanFeed
|
||||
# PURPOSE: Performs a scan on a single feed
|
||||
@@ -1480,13 +1634,15 @@ sub reportFeed {
|
||||
'urls_link' => 'Link',
|
||||
'urls_modified' => 'Modified on',
|
||||
'urls_reason_accepted' => 'Reason accepted',
|
||||
'urls_status' => 'Status',
|
||||
'urls_summary' => 'Summary',
|
||||
'urls_title' => 'Title',
|
||||
'urls_url' => 'Feed URL',
|
||||
'urls_urltype' => 'URL type',
|
||||
'urls_parent_id' => 'Parent ID',
|
||||
'urls_child_count' => 'Child count',
|
||||
|
||||
);
|
||||
|
||||
@seq1 = (
|
||||
'urls_title',
|
||||
'urls_url',
|
||||
@@ -1498,6 +1654,7 @@ sub reportFeed {
|
||||
'urls_check_type',
|
||||
'urls_reason_accepted',
|
||||
'urls_description',
|
||||
'urls_summary',
|
||||
'urls_dns',
|
||||
'urls_generator',
|
||||
'urls_host_up',
|
||||
@@ -1508,7 +1665,9 @@ sub reportFeed {
|
||||
'urls_modified',
|
||||
'urls_parent_id',
|
||||
'urls_child_count',
|
||||
'urls_status',
|
||||
);
|
||||
|
||||
@seq2 = (
|
||||
'ep_title',
|
||||
'ep_enclosure',
|
||||
@@ -1527,9 +1686,23 @@ sub reportFeed {
|
||||
if ($feed) {
|
||||
print $fh "Channel:\n";
|
||||
foreach my $key (@seq1) {
|
||||
#
|
||||
# Format the feed description, summary and copyright with a left
|
||||
# margin using textFormat. Everything else gets a simpler layout.
|
||||
#
|
||||
if ($key =~ /^urls_(description|summary|copyright)$/) {
|
||||
printf $fh "%s\n",
|
||||
textFormat(
|
||||
coalesce( $feed->{$key}, '--' ),
|
||||
sprintf( " %-*s:", $lwidth, $keys{$key} ),
|
||||
'L', $lwidth + 4, 80
|
||||
);
|
||||
}
|
||||
else {
|
||||
printf $fh " %-*s: %s\n", $lwidth, $keys{$key},
|
||||
coalesce( $feed->{$key}, '--' );
|
||||
}
|
||||
}
|
||||
|
||||
print $fh "\nLatest episode:\n";
|
||||
foreach my $key (@seq2) {
|
||||
@@ -2011,38 +2184,6 @@ sub getFeed {
|
||||
}
|
||||
}
|
||||
|
||||
#=== FUNCTION ================================================================
|
||||
# NAME: start_handler
|
||||
# PURPOSE: HTTP::Parser handler for <title> events
|
||||
# PARAMETERS: <first> the name of the tag found
|
||||
# <second> the object being processed
|
||||
# RETURNS: Nothing (ignored anyway)
|
||||
# DESCRIPTION:
|
||||
# THROWS: No exceptions
|
||||
# COMMENTS: None
|
||||
# SEE ALSO: N/A
|
||||
#===============================================================================
|
||||
#sub start_handler {
|
||||
#
|
||||
# #
|
||||
# # Ignore any tags which are not 'title'
|
||||
# #
|
||||
# return if shift ne "title";
|
||||
#
|
||||
# #
|
||||
# # Define more handlers if we have a title. One to collect the title string
|
||||
# # and the other to abort the parse on encountering the end of the title.
|
||||
# #
|
||||
# my $self = shift;
|
||||
# $self->handler(text => sub { $main::html_title = shift }, "dtext");
|
||||
# $self->handler(
|
||||
# end => sub {
|
||||
# shift->eof if shift eq "title";
|
||||
# },
|
||||
# "tagname,self"
|
||||
# );
|
||||
#}
|
||||
|
||||
#=== FUNCTION ================================================================
|
||||
# NAME: getHTMLTitle
|
||||
# PURPOSE: Parse an HTML page to get data. At the moment this is just the
|
||||
@@ -2144,44 +2285,6 @@ sub parseFeed {
|
||||
|
||||
}
|
||||
|
||||
##=== FUNCTION ================================================================
|
||||
## NAME: parseFeedPP
|
||||
## PURPOSE: Parse a podcast feed that has already been downloaded
|
||||
## PARAMETERS: $feed_url URL of the feed previously downloaded
|
||||
## $feed_content String containing the content of the feed, for
|
||||
## parsing
|
||||
## RETURNS: An XML::FeedPP object containing the parsed feed or undef if the
|
||||
## parse failed
|
||||
## DESCRIPTION:
|
||||
## THROWS: No exceptions
|
||||
## COMMENTS: None
|
||||
## SEE ALSO: N/A
|
||||
##===============================================================================
|
||||
#sub parseFeedPP {
|
||||
# my ( $feed_url, $feed_content ) = @_;
|
||||
#
|
||||
# my $feed;
|
||||
#
|
||||
# try {
|
||||
# $feed = XML::FeedPP->parse( \$feed_content, -type => 'string' );
|
||||
# unless ($feed) {
|
||||
# #
|
||||
# # Something went wrong. Abort this feed
|
||||
# #
|
||||
# warn "Failed to parse $feed_url: ", XML::Feed->errstr, "\n";
|
||||
# return; # undef
|
||||
# }
|
||||
# }
|
||||
# catch {
|
||||
# warn "Failed to parse $feed_url: ", $@, "\n";
|
||||
# return;
|
||||
# }
|
||||
#
|
||||
# return $feed;
|
||||
#
|
||||
#}
|
||||
|
||||
|
||||
#=== FUNCTION ================================================================
|
||||
# NAME: storeFeed
|
||||
# PURPOSE: Stores feed attributes in a hash
|
||||
@@ -2259,10 +2362,10 @@ sub checkCopyright {
|
||||
$decision = 0;
|
||||
};
|
||||
|
||||
#
|
||||
# If accepted we want a reason
|
||||
#
|
||||
if ($decision) {
|
||||
#
|
||||
# If accepted we want a reason for this manual check
|
||||
#
|
||||
try {
|
||||
$reason = prompt(
|
||||
-in => *STDIN,
|
||||
@@ -2619,37 +2722,87 @@ sub updateEnclosures {
|
||||
}
|
||||
|
||||
#=== FUNCTION ================================================================
|
||||
# NAME: optionalFile
|
||||
# PURPOSE: Process an option of the form '-opt:s' where 's' is an
|
||||
# optional filename.
|
||||
# PARAMETERS: $optionName Name of option
|
||||
# $optionValue Value of option (assumed to be blank of
|
||||
# a filename)
|
||||
# RETURNS: A boolean: 1 (true) if there is a filename, 0 (false) if the
|
||||
# name has been omitted.
|
||||
# DESCRIPTION: The $optionValue will be blank or a filename. If the latter
|
||||
# then the existence of the file and its readbility are checked
|
||||
# and the script dies if either test fails.
|
||||
# NAME: textFormat
|
||||
# PURPOSE: Formats a block of text in an indented, wrapped style with
|
||||
# a label in the left column
|
||||
# PARAMETERS: $text The text to be formatted, as a scalar string
|
||||
# $tag The label to be added to the left of the top
|
||||
# line
|
||||
# $align Tag alignment, 'L' for left, otherwise right
|
||||
# $lmargin Width of the left margin (assumed to be big
|
||||
# enough for the tag)
|
||||
# $textwidth The width of all of the text plus left margin
|
||||
# (i.e. the right margin)
|
||||
# RETURNS: The formatted result as a string
|
||||
# DESCRIPTION: Chops the incoming text into words (thereby removing any
|
||||
# formatting). Removes any leading spaces. Loops through the
|
||||
# wordlist building them into lines of the right length to fit
|
||||
# between the left and right margins. Saves the lines in an
|
||||
# array. Adds the tag to the first line with the alignment
|
||||
# requested then returns the array joined into a string.
|
||||
# THROWS: No exceptions
|
||||
# COMMENTS: None
|
||||
# SEE ALSO: N/A
|
||||
# COMMENTS: Inspired by Text::Format but *much* simpler. In fact T::F is
|
||||
# a nasty thing to have to use; I couldn't get it to do what
|
||||
# this routine does.
|
||||
# TODO Make the routine more resilient to silly input values.
|
||||
# SEE ALSO:
|
||||
#===============================================================================
|
||||
sub optionalFile {
|
||||
my ( $optionName, $optionValue ) = @_;
|
||||
sub textFormat {
|
||||
my ( $text, $tag, $align, $lmargin, $textwidth ) = @_;
|
||||
|
||||
if (defined($optionValue)) {
|
||||
if ( $optionValue =~ /^$/ ) {
|
||||
return 1;
|
||||
my ( $width, $word );
|
||||
my ( @words, @buff, @wrap );
|
||||
|
||||
#
|
||||
# Build the tag early. If there's no text we'll just return the tag.
|
||||
#
|
||||
$tag = sprintf( "%*s",
|
||||
( $align =~ /L/i ? ( $lmargin - 1 ) * -1 : $lmargin - 1 ), $tag );
|
||||
|
||||
return $tag unless $text;
|
||||
|
||||
$text =~ s/(^\s+|\s+$)//g;
|
||||
return $tag unless $text;
|
||||
|
||||
#
|
||||
# Chop up the incoming text removing leading spaces
|
||||
#
|
||||
@words = split( /\s+/, $text );
|
||||
shift(@words) if ( @words && $words[0] eq '' );
|
||||
|
||||
#
|
||||
# Compute the width of the active text
|
||||
#
|
||||
$width = $textwidth - $lmargin;
|
||||
|
||||
#
|
||||
# Format the words into lines with a blank left margin
|
||||
#
|
||||
while ( defined( $word = shift(@words) ) ) {
|
||||
if ( length( join( ' ', @buff, $word ) ) < $width ) {
|
||||
push( @buff, $word );
|
||||
}
|
||||
else {
|
||||
die "File in '-$optionName=$optionValue' does not exist\n"
|
||||
unless -e $optionValue;
|
||||
die "File in '-$optionName=$optionValue' is not readable\n"
|
||||
unless -r $optionValue;
|
||||
return 1;
|
||||
push( @wrap, ' ' x $lmargin . join( ' ', @buff ) );
|
||||
@buff = ($word);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
#
|
||||
# Append any remainder
|
||||
#
|
||||
push( @wrap, ' ' x $lmargin . join( ' ', @buff ) ) if @buff;
|
||||
|
||||
#
|
||||
# Insert the tag into the first line
|
||||
#
|
||||
substr( $wrap[0], 0, $lmargin - 1 ) = $tag;
|
||||
|
||||
#
|
||||
# Return the formatted array as a string
|
||||
#
|
||||
return join( "\n", @wrap );
|
||||
|
||||
}
|
||||
|
||||
#=== FUNCTION ================================================================
|
||||
@@ -2825,8 +2978,9 @@ sub Options {
|
||||
|
||||
my @options = (
|
||||
"help", "manpage", "debug=i", "dry-run!",
|
||||
"silent!", "load:s", "delete:s", "scan!",
|
||||
"report:s", "html!", "check:s", "json:s",
|
||||
"silent!", "load", "delete", "input=s",
|
||||
"scan!", "refresh!", "expire!", "report:s",
|
||||
"ignore-case!", "html!", "check:s", "json:s",
|
||||
"opml:s", "config=s", "out=s", "rejects:s",
|
||||
"template:s",
|
||||
);
|
||||
@@ -2852,7 +3006,7 @@ feedWatcher - watch a collection of podcast feeds
|
||||
|
||||
=head1 VERSION
|
||||
|
||||
This documentation refers to I<feedWatcher> version 0.1.2
|
||||
This documentation refers to I<feedWatcher> version 0.1.4
|
||||
|
||||
|
||||
=head1 USAGE
|
||||
|
BIN
feedWatcher.db
BIN
feedWatcher.db
Binary file not shown.
102
feedWatcher.html
102
feedWatcher.html
@@ -262,6 +262,14 @@
|
||||
|
||||
|
||||
|
||||
<dt><a href="https://www.castofwonders.org">Cast of Wonders</a> (<a href="https://www.castofwonders.org/feed/podcast/">feed</a>)</dt>
|
||||
|
||||
|
||||
<dd>The Young Adult Speculative Fiction Podcast</dd>
|
||||
|
||||
|
||||
|
||||
|
||||
<dt><a href="https://destinationlinux.org">Destination Linux</a> (<a href="http://destinationlinux.org/feed/mp3/">feed</a>)</dt>
|
||||
|
||||
|
||||
@@ -270,10 +278,26 @@
|
||||
|
||||
|
||||
|
||||
<dt><a href="https://edictzero.com">Edict Zero</a> (<a href="https://edictzero.wordpress.com/feed/">feed</a>)</dt>
|
||||
<dt><a href="https://distrohoppersdigest.blogspot.com/">Distrohoppers' Digest</a> (<a href="https://distrohoppersdigest.blogspot.com/feeds/posts/default">feed</a>)</dt>
|
||||
|
||||
|
||||
<dd>Home of the Cyberpunk / Science Fiction Audio Drama series, Edict Zero - FIS & other features from Slipgate Nine Entertainment</dd>
|
||||
<dd>We are three Blokes who love Linux and trying out new stuff, we thought it would be interesting to share our experience of trying new Linux and BSD distributions and how we found it trying to live with them as our daily driver for up to a Month at a time, by recording a podcast about how we got on.</dd>
|
||||
|
||||
|
||||
|
||||
|
||||
<dt><a href="https://distrohoppersdigest.blogspot.com/">Distrohoppers' Digest</a> (<a href="https://distrohoppersdigest.blogspot.com/feeds/posts/default?alt=rss">feed</a>)</dt>
|
||||
|
||||
|
||||
<dd>We are three Blokes who love Linux and trying out new stuff, we thought it would be interesting to share our experience of trying new Linux and BSD distributions and how we found it trying to live with them as our daily driver for up to a Month at a time, by recording a podcast about how we got on.</dd>
|
||||
|
||||
|
||||
|
||||
|
||||
<dt><a href="https://edictzero.com">Edict Zero - FIS</a> (<a href="http://feeds.feedburner.com/EdictZero-Fis">feed</a>)</dt>
|
||||
|
||||
|
||||
<dd>Edict Zero - FIS is a science fiction audio drama series produced by Slipgate Nine Entertainment. It is a cross of futuristic sci-fi, law enforcement procedural, crime, suspense/mystery, and dark fantasy.</dd>
|
||||
|
||||
|
||||
|
||||
@@ -382,6 +406,14 @@
|
||||
|
||||
|
||||
|
||||
<dt><a href="https://gamesphere.show">Game Sphere</a> (<a href="https://gamesphere.show/rss">feed</a>)</dt>
|
||||
|
||||
|
||||
<dd>A podcast which takes a look at the interesting happenings inside the world of video games. From news and reviews to the deeper aspects of the industry. Join MattDLN & friends in a journey which takes them around the Game Sphere. Game Sphere is a podcast brought to you by the <a href="https://destinationlinux.network" rel="noopener" target="_blank">Destination Linux Network</a>!</dd>
|
||||
|
||||
|
||||
|
||||
|
||||
<dt><a href="https://geekspeak.org/">Geek Speak with Lyle Troxell</a> (<a href="https://geekspeak.org/episodes/rss.xml">feed</a>)</dt>
|
||||
|
||||
|
||||
@@ -390,7 +422,7 @@
|
||||
|
||||
|
||||
|
||||
<dt><a href="http://frontrowcrew.com/geeknights/monday/">GeekNights Mondays: Science Technology Computing</a> (<a href="http://feeds.feedburner.com/GNSciTech">feed</a>)</dt>
|
||||
<dt><a href="http://frontrowcrew.com/geeknights/monday/">GeekNights Mondays: Science Technology Computing</a> (<a href="https://feeds.feedburner.com/GNSciTech">feed</a>)</dt>
|
||||
|
||||
|
||||
<dd>GeekNights Mondays is the weekly sci/tech segment of GeekNights, featuring science, technology, computing, and more. We talk Linux, Windows, gadgets, you name it.</dd>
|
||||
@@ -414,6 +446,14 @@
|
||||
|
||||
|
||||
|
||||
<dt><a href="https://hardwareaddicts.org">Hardware Addicts</a> (<a href="https://hardwareaddicts.org/rss">feed</a>)</dt>
|
||||
|
||||
|
||||
<dd>If you’re addicted to Computer Hardware and technology, this podcast is for you. Hardware Addicts brings you the latest trends in tech along with brain filling tips and tricks to help you get the most out of your hardware. Join Ryan, Wendy, and Michael as we geek out on the physical technology that powers our addiction. Hardware Addicts is a podcast brought to you by the Destination Linux Network (https://destinationlinux.network/)!</dd>
|
||||
|
||||
|
||||
|
||||
|
||||
<dt><a href="https://www.eff.org/how-to-fix-the-internet-podcast">How to Fix the Internet</a> (<a href="https://feeds.eff.org/howtofixtheinternet">feed</a>)</dt>
|
||||
|
||||
|
||||
@@ -446,6 +486,14 @@
|
||||
|
||||
|
||||
|
||||
<dt><a href="https://donkluivert.cluster1.easy-hebergement.net">L'Apéro des Papas Manchots</a> (<a href="https://feeds.feedburner.com/easy-hebergement/EuLV">feed</a>)</dt>
|
||||
|
||||
|
||||
<dd>Le podcast traitant de Linux et de l'open source</dd>
|
||||
|
||||
|
||||
|
||||
|
||||
<dt><a href="http://radio.linuxquestions.org">LQ Radio</a> (<a href="http://feeds.feedburner.com/linuxquestions/LQRadioALL-ogg">feed</a>)</dt>
|
||||
|
||||
|
||||
@@ -542,6 +590,22 @@
|
||||
|
||||
|
||||
|
||||
<dt><a href="https://dlnxtend.com">Linux Out Loud</a> (<a href="https://feeds.fireside.fm/dlnxtend/rss">feed</a>)</dt>
|
||||
|
||||
|
||||
<dd>Linux Out Loud is a community powered podcast. We take conversations from the DLN Community from places like the DLN Discourse Forums, Telegram group, Discord server and more. We also take topics from other shows around the network to give our takes. Linux Out Loud podcast is brought to you by the Destination Linux Network (https://destinationlinux.network/)!</dd>
|
||||
|
||||
|
||||
|
||||
|
||||
<dt><a href="https://dlnxtend.com">Linux Out Loud</a> (<a href="https://dlnxtend.com/rss">feed</a>)</dt>
|
||||
|
||||
|
||||
<dd>Linux Out Loud is a community powered podcast. We take conversations from the DLN Community from places like the DLN Discourse Forums, Telegram group, Discord server and more. We also take topics from other shows around the network to give our takes. Linux Out Loud podcast is brought to you by the Destination Linux Network (https://destinationlinux.network/)!</dd>
|
||||
|
||||
|
||||
|
||||
|
||||
<dt><a href="http://sixgun.org">Linux Outlaws</a> (<a href="http://feeds.feedburner.com/linuxoutlaws">feed</a>)</dt>
|
||||
|
||||
|
||||
@@ -662,6 +726,14 @@
|
||||
|
||||
|
||||
|
||||
<dt><a href="https://parlonslinux.fr/@ParlonsLinuxFR">Parlons Linux</a> (<a href="https://parlonslinux.fr/@ParlonsLinuxFR/feed.xml">feed</a>)</dt>
|
||||
|
||||
|
||||
<dd><p>Ce Podcast est destiné a toute personne désirant apprendre de manière différente sur Linux. Mais également une porte ouverte à tout ceux qui désire crée leur podcast la plateforme est ouvert à tous.</p></dd>
|
||||
|
||||
|
||||
|
||||
|
||||
<dt><a href="https://podcastle.org/">PodCastle</a> (<a href="http://podcastle.org/feed/">feed</a>)</dt>
|
||||
|
||||
|
||||
@@ -758,6 +830,14 @@
|
||||
|
||||
|
||||
|
||||
<dt><a href="https://sudo.show">Sudo Show</a> (<a href="https://sudo.show/rss">feed</a>)</dt>
|
||||
|
||||
|
||||
<dd>The Sudo Show covers topics ranging from Open Source in business to Cloud Management, but we don't just talk about the technology. We discuss methodologies like DevOps and how to change your team and company cultures to build and grow your people! Need to get more done? Join us as we share our years of experience working from home including our tips and tricks for better productivity! The Sudo Show is a proud member of the TuxDigital Network (https://tuxdigital.com/)!</dd>
|
||||
|
||||
|
||||
|
||||
|
||||
<dt><a href="https://teaearlgreyhot.org/">Tea, Earl Grey, Hot !</a> (<a href="https://teaearlgreyhot.org/feed/podcast">feed</a>)</dt>
|
||||
|
||||
|
||||
@@ -870,6 +950,14 @@
|
||||
|
||||
|
||||
|
||||
<dt><a href="https://tuxdigital.com/podcasts/this-week-in-linux/">This Week in Linux</a> (<a href="https://tuxdigital.com/feed/thisweekinlinux-mp3/">feed</a>)</dt>
|
||||
|
||||
|
||||
<dd>Your Weekly Source for Linux News</dd>
|
||||
|
||||
|
||||
|
||||
|
||||
<dt><a href="http://www.asm.org/twim/">This Week in Microbiology</a> (<a href="http://feeds.feedburner.com/twim">feed</a>)</dt>
|
||||
|
||||
|
||||
@@ -934,6 +1022,14 @@
|
||||
|
||||
|
||||
|
||||
<dt><a href="https://cast.postmarketos.org/">postmarketOS Podcast</a> (<a href="https://cast.postmarketos.org/feed.rss">feed</a>)</dt>
|
||||
|
||||
|
||||
<dd>News/interviews/anecdotes around postmarketOS, straight from the source.</dd>
|
||||
|
||||
|
||||
|
||||
|
||||
<dt><a href="https://urandom-podcast.info/">urandom podcast</a> (<a href="http://feeds.feedburner.com/urandom-podcast/ogg">feed</a>)</dt>
|
||||
|
||||
|
||||
|
922
feedWatcher.json
922
feedWatcher.json
File diff suppressed because it is too large
Load Diff
@@ -42,16 +42,31 @@
|
||||
- Feed: https://ccjam.otherside.network/feed/podcast/
|
||||
- Copyright:
|
||||
|
||||
- **Cast of Wonders**
|
||||
- Website: https://www.castofwonders.org
|
||||
- Feed: https://www.castofwonders.org/feed/podcast/
|
||||
- Copyright: Copyright © 2011-2021
|
||||
|
||||
- **Destination Linux**
|
||||
- Website: https://destinationlinux.org
|
||||
- Feed: http://destinationlinux.org/feed/mp3/
|
||||
- Copyright:
|
||||
|
||||
- **Edict Zero**
|
||||
- Website: https://edictzero.com
|
||||
- Feed: https://edictzero.wordpress.com/feed/
|
||||
- **Distrohoppers' Digest**
|
||||
- Website: https://distrohoppersdigest.blogspot.com/
|
||||
- Feed: https://distrohoppersdigest.blogspot.com/feeds/posts/default
|
||||
- Copyright:
|
||||
|
||||
- **Distrohoppers' Digest**
|
||||
- Website: https://distrohoppersdigest.blogspot.com/
|
||||
- Feed: https://distrohoppersdigest.blogspot.com/feeds/posts/default?alt=rss
|
||||
- Copyright:
|
||||
|
||||
- **Edict Zero - FIS**
|
||||
- Website: https://edictzero.com
|
||||
- Feed: http://feeds.feedburner.com/EdictZero-Fis
|
||||
- Copyright: 2010-2011
|
||||
|
||||
- **English – Wikipediapodden**
|
||||
- Website: http://wikipediapodden.se
|
||||
- Feed: http://wikipediapodden.se/tag/english/feed/
|
||||
@@ -121,6 +136,11 @@
|
||||
- Feed: http://feeds.feedburner.com/GNULinuxRTM
|
||||
- Copyright: This work is licensed under Creative Commons Attribution 4.0
|
||||
|
||||
- **Game Sphere**
|
||||
- Website: https://gamesphere.show
|
||||
- Feed: https://gamesphere.show/rss
|
||||
- Copyright: © 2023 Game Sphere
|
||||
|
||||
- **Geek Speak with Lyle Troxell**
|
||||
- Website: https://geekspeak.org/
|
||||
- Feed: https://geekspeak.org/episodes/rss.xml
|
||||
@@ -128,7 +148,7 @@
|
||||
|
||||
- **GeekNights Mondays: Science Technology Computing**
|
||||
- Website: http://frontrowcrew.com/geeknights/monday/
|
||||
- Feed: http://feeds.feedburner.com/GNSciTech
|
||||
- Feed: https://feeds.feedburner.com/GNSciTech
|
||||
- Copyright: Creative Commons
|
||||
|
||||
- **Going Linux**
|
||||
@@ -141,6 +161,11 @@
|
||||
- Feed: http://hackerpublicradio.org/hpr_ogg_rss.php
|
||||
- Copyright: Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) License
|
||||
|
||||
- **Hardware Addicts**
|
||||
- Website: https://hardwareaddicts.org
|
||||
- Feed: https://hardwareaddicts.org/rss
|
||||
- Copyright: © 2023 Hardware Addicts
|
||||
|
||||
- **How to Fix the Internet**
|
||||
- Website: https://www.eff.org/how-to-fix-the-internet-podcast
|
||||
- Feed: https://feeds.eff.org/howtofixtheinternet
|
||||
@@ -161,6 +186,11 @@
|
||||
- Feed: http://feeds.feedburner.com/knightcastpodcast
|
||||
- Copyright: Creative commons apply ! Non commercial re-use is allowed.
|
||||
|
||||
- **L'Apéro des Papas Manchots**
|
||||
- Website: https://donkluivert.cluster1.easy-hebergement.net
|
||||
- Feed: https://feeds.feedburner.com/easy-hebergement/EuLV
|
||||
- Copyright: CC BY-NC-SA 4.0
|
||||
|
||||
- **LQ Radio**
|
||||
- Website: http://radio.linuxquestions.org
|
||||
- Feed: http://feeds.feedburner.com/linuxquestions/LQRadioALL-ogg
|
||||
@@ -221,6 +251,16 @@
|
||||
- Feed: https://linuxlads.com/feed_ogg.rss
|
||||
- Copyright: Released under the Creative Commons Attribution-Share Alike 3.0 Unported Licence
|
||||
|
||||
- **Linux Out Loud**
|
||||
- Website: https://dlnxtend.com
|
||||
- Feed: https://feeds.fireside.fm/dlnxtend/rss
|
||||
- Copyright: © 2023 Linux Out Loud
|
||||
|
||||
- **Linux Out Loud**
|
||||
- Website: https://dlnxtend.com
|
||||
- Feed: https://dlnxtend.com/rss
|
||||
- Copyright: © 2023 Linux Out Loud
|
||||
|
||||
- **Linux Outlaws**
|
||||
- Website: http://sixgun.org
|
||||
- Feed: http://feeds.feedburner.com/linuxoutlaws
|
||||
@@ -297,6 +337,11 @@ NonCommercial NoDerivs licence.
|
||||
- Feed: https://opensourcesecuritypodcast.libsyn.com/rss
|
||||
- Copyright: This work is licensed under the Creative Commons Attribution 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
|
||||
|
||||
- **Parlons Linux**
|
||||
- Website: https://parlonslinux.fr/@ParlonsLinuxFR
|
||||
- Feed: https://parlonslinux.fr/@ParlonsLinuxFR/feed.xml
|
||||
- Copyright: CC BY-SA 3.0
|
||||
|
||||
- **PodCastle**
|
||||
- Website: https://podcastle.org/
|
||||
- Feed: http://podcastle.org/feed/
|
||||
@@ -357,6 +402,11 @@ NonCommercial NoDerivs licence.
|
||||
- Feed: http://fsfe.org/news/podcast-opus.en.rss
|
||||
- Copyright: Copyright (c) Free Software Foundation Europe. Creative Commons BY-SA 4.0
|
||||
|
||||
- **Sudo Show**
|
||||
- Website: https://sudo.show
|
||||
- Feed: https://sudo.show/rss
|
||||
- Copyright: © 2023 Destination Linux Network
|
||||
|
||||
- **Tea, Earl Grey, Hot !**
|
||||
- Website: https://teaearlgreyhot.org/
|
||||
- Feed: https://teaearlgreyhot.org/feed/podcast
|
||||
@@ -427,6 +477,11 @@ NonCommercial NoDerivs licence.
|
||||
- Feed: http://feeds.twit.tv/twig.xml
|
||||
- Copyright: This work is licensed under a Creative Commons License - Attribution-NonCommercial-NoDerivatives 4.0 International - http://creativecommons.org/licenses/by-nc-nd/4.0/
|
||||
|
||||
- **This Week in Linux**
|
||||
- Website: https://tuxdigital.com/podcasts/this-week-in-linux/
|
||||
- Feed: https://tuxdigital.com/feed/thisweekinlinux-mp3/
|
||||
- Copyright:
|
||||
|
||||
- **This Week in Microbiology**
|
||||
- Website: http://www.asm.org/twim/
|
||||
- Feed: http://feeds.feedburner.com/twim
|
||||
@@ -467,6 +522,11 @@ NonCommercial NoDerivs licence.
|
||||
- Feed: http://fullcirclemagazine.org/category/podcast/feed/
|
||||
- Copyright:
|
||||
|
||||
- **postmarketOS Podcast**
|
||||
- Website: https://cast.postmarketos.org/
|
||||
- Feed: https://cast.postmarketos.org/feed.rss
|
||||
- Copyright: Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) License
|
||||
|
||||
- **urandom podcast**
|
||||
- Website: https://urandom-podcast.info/
|
||||
- Feed: http://feeds.feedburner.com/urandom-podcast/ogg
|
||||
|
@@ -2,8 +2,8 @@
|
||||
<opml version="1.1">
|
||||
<head>
|
||||
<title>Free Culture Podcasts</title>
|
||||
<dateCreated>2023-01-14 23:09:26</dateCreated>
|
||||
<dateModified>2023-01-14 23:09:26</dateModified>
|
||||
<dateCreated>2023-03-11 19:42:43</dateCreated>
|
||||
<dateModified>2023-03-11 19:42:43</dateModified>
|
||||
<ownerName></ownerName>
|
||||
<ownerEmail></ownerEmail>
|
||||
<expansionState></expansionState>
|
||||
@@ -22,8 +22,11 @@
|
||||
<outline description="The Ask Noah Show is a weekly talk radio show where we focus on Linux and Open Source technology. We invite the community to participate live on the air 1-855-450-6624. The show airs Tuesdays at 6pm CT on asknoahshow.com and at KEQQ 88.3 FM in Grand Forks ND. It's a free call 1-855-450-NOAH so join us and start on your way to owning your operating system, your software, and technology." htmlUrl="https://podcast.asknoahshow.com" text="Ask Noah Show" title="Ask Noah Show" xmlUrl="https://feeds.fireside.fm/asknoah/rss" />
|
||||
<outline description="CCHits.net is designed to provide a Chart for Creative Commons Music, in a way that is easily able to be integrated into other music shows that play Creative Commons Music. CCHits.net has a daily exposure podcast, playing one new track every day, a weekly podcast, playing the last week of tracks played on the podcast, plus the top rated three tracks from the previous week. There is also a monthly podcast which features the top rated tracks over the whole system." htmlUrl="https://cchits.net/daily" text="CCHits.net" title="CCHits.net" xmlUrl="https://cchits.net/daily/rss" />
|
||||
<outline description="Community music podcast – turn up the volume!!!" htmlUrl="https://ccjam.otherside.network/" text="CCJam" title="CCJam" xmlUrl="https://ccjam.otherside.network/feed/podcast/" />
|
||||
<outline description="The Young Adult Speculative Fiction Podcast" htmlUrl="https://www.castofwonders.org" text="Cast of Wonders" title="Cast of Wonders" xmlUrl="https://www.castofwonders.org/feed/podcast/" />
|
||||
<outline description="Destination Linux is a podcast made by people who love running Linux and is the flagship show for the Destination Linux Network." htmlUrl="https://destinationlinux.org" text="Destination Linux" title="Destination Linux" xmlUrl="http://destinationlinux.org/feed/mp3/" />
|
||||
<outline description="Home of the Cyberpunk / Science Fiction Audio Drama series, Edict Zero - FIS & other features from Slipgate Nine Entertainment" htmlUrl="https://edictzero.com" text="Edict Zero" title="Edict Zero" xmlUrl="https://edictzero.wordpress.com/feed/" />
|
||||
<outline description="We are three Blokes who love Linux and trying out new stuff, we thought it would be interesting to share our experience of trying new Linux and BSD distributions and how we found it trying to live with them as our daily driver for up to a Month at a time, by recording a podcast about how we got on." htmlUrl="https://distrohoppersdigest.blogspot.com/" text="Distrohoppers' Digest" title="Distrohoppers' Digest" xmlUrl="https://distrohoppersdigest.blogspot.com/feeds/posts/default" />
|
||||
<outline description="We are three Blokes who love Linux and trying out new stuff, we thought it would be interesting to share our experience of trying new Linux and BSD distributions and how we found it trying to live with them as our daily driver for up to a Month at a time, by recording a podcast about how we got on." htmlUrl="https://distrohoppersdigest.blogspot.com/" text="Distrohoppers' Digest" title="Distrohoppers' Digest" xmlUrl="https://distrohoppersdigest.blogspot.com/feeds/posts/default?alt=rss" />
|
||||
<outline description="Edict Zero - FIS is a science fiction audio drama series produced by Slipgate Nine Entertainment. It is a cross of futuristic sci-fi, law enforcement procedural, crime, suspense/mystery, and dark fantasy." htmlUrl="https://edictzero.com" text="Edict Zero - FIS" title="Edict Zero - FIS" xmlUrl="http://feeds.feedburner.com/EdictZero-Fis" />
|
||||
<outline description="En podcast om Wikipedia på svenska" htmlUrl="http://wikipediapodden.se" text="English – Wikipediapodden" title="English – Wikipediapodden" xmlUrl="http://wikipediapodden.se/tag/english/feed/" />
|
||||
<outline description="The Original Science Fiction Podcast" htmlUrl="https://escapepod.org" text="Escape Pod" title="Escape Pod" xmlUrl="http://escapepod.org/feed/" />
|
||||
<outline description="We Can and Must Find and Kill Bigfoot" htmlUrl="https://ExpeditionSasquatch.org" text="Expedition Sasquatch" title="Expedition Sasquatch" xmlUrl="https://expeditionsasquatch.org/episodes.mp3.rss" />
|
||||
@@ -37,14 +40,17 @@
|
||||
<outline description="???? ???? ???? ????" htmlUrl="http://www.hwhq.com/" text="GAMERadio" title="GAMERadio" xmlUrl="http://hwhq.com/rss.xml" />
|
||||
<outline description="GNU, Linux, coffee, and subversion. This podcast is founded in the ideals of anarcho-syndacalism, anti-facism, and human rights. I stand in solidarity with all peopele of colour, of marginalised communities, and the oppressed around the globe." htmlUrl="http://www.gnuworldorder.info" text="GNU World Order Linux Cast" title="GNU World Order Linux Cast" xmlUrl="https://gnuworldorder.info/ogg.xml" />
|
||||
<outline description="GNU/Linux RTM's goal is to highlight the quality Documentation created and freely distributed by the Open Source Community." htmlUrl="http://gnulinuxrtm.blogspot.com/" text="GNU/Linux RTM" title="GNU/Linux RTM" xmlUrl="http://feeds.feedburner.com/GNULinuxRTM" />
|
||||
<outline description="A podcast which takes a look at the interesting happenings inside the world of video games. From news and reviews to the deeper aspects of the industry. Join MattDLN & friends in a journey which takes them around the Game Sphere. Game Sphere is a podcast brought to you by the <a href="https://destinationlinux.network" rel="noopener" target="_blank">Destination Linux Network</a>!" htmlUrl="https://gamesphere.show" text="Game Sphere" title="Game Sphere" xmlUrl="https://gamesphere.show/rss" />
|
||||
<outline description="A weekly talk show about technology, science, and human creativity that excites, educates, and fosters curiosity. Discussions touch upon how technology affects society and how we react to that change. Hosts are passionate about explaining complex concepts in simple, easy to digest, chunks. We bridge the gaps between Geeks and the rest of humanity." htmlUrl="https://geekspeak.org/" text="Geek Speak with Lyle Troxell" title="Geek Speak with Lyle Troxell" xmlUrl="https://geekspeak.org/episodes/rss.xml" />
|
||||
<outline description="GeekNights Mondays is the weekly sci/tech segment of GeekNights, featuring science, technology, computing, and more. We talk Linux, Windows, gadgets, you name it." htmlUrl="http://frontrowcrew.com/geeknights/monday/" text="GeekNights Mondays: Science Technology Computing" title="GeekNights Mondays: Science Technology Computing" xmlUrl="http://feeds.feedburner.com/GNSciTech" />
|
||||
<outline description="GeekNights Mondays is the weekly sci/tech segment of GeekNights, featuring science, technology, computing, and more. We talk Linux, Windows, gadgets, you name it." htmlUrl="http://frontrowcrew.com/geeknights/monday/" text="GeekNights Mondays: Science Technology Computing" title="GeekNights Mondays: Science Technology Computing" xmlUrl="https://feeds.feedburner.com/GNSciTech" />
|
||||
<outline description="Once you become aware that there is a dependable, secure, capable, and modern computer system that rivals all others in popularity and actual use, you will want to try the Linux operating system on your computer. Perhaps you've been using a member of the Unix/Linux family - Linux, Android, ChromeOS, BSD or even OSX - for quite a while. If so, you are likely looking for new ways to optimize your technology for the way you work. Going Linux is for computer users who just want to use Linux to get things done. Are you new to Linux, upgrading from Windows to Linux, or just thinking about moving to Linux? This audio podcast provides you with practical, day-to-day advice on how to use Linux and its applications. Our goal is to help make the Linux experience easy for you." htmlUrl="https://goinglinux.com" text="Going Linux" title="Going Linux" xmlUrl="http://goinglinux.com/oggpodcast.xml" />
|
||||
<outline description="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." htmlUrl="http://hackerpublicradio.org/about.php" text="Hacker Public Radio" title="Hacker Public Radio" xmlUrl="http://hackerpublicradio.org/hpr_ogg_rss.php" />
|
||||
<outline description="If you’re addicted to Computer Hardware and technology, this podcast is for you. Hardware Addicts brings you the latest trends in tech along with brain filling tips and tricks to help you get the most out of your hardware. Join Ryan, Wendy, and Michael as we geek out on the physical technology that powers our addiction. Hardware Addicts is a podcast brought to you by the Destination Linux Network (https://destinationlinux.network/)!" htmlUrl="https://hardwareaddicts.org" text="Hardware Addicts" title="Hardware Addicts" xmlUrl="https://hardwareaddicts.org/rss" />
|
||||
<outline description="The internet is broken—but it doesn’t have to be. If you’re concerned about how surveillance, online advertising, and automated content moderation are hurting us online and offline, the Electronic Frontier Foundation’s How to Fix the Internet podcast offers a better way forward. EFF has been defending your rights online for over thirty years and is behind many of the biggest digital rights protections since the invention of the internet. Through curious conversations with some of the leading minds in law and technology, this podcast explores creative solutions to some of today’s biggest tech challenges. Hosted by EFF Executive Director Cindy Cohn and EFF Associate Director of Digital Strategy Jason Kelley, How to Fix the Internet will help you become deeply informed on vital technology issues as we work to build a better technological future together." htmlUrl="https://www.eff.org/how-to-fix-the-internet-podcast" text="How to Fix the Internet" title="How to Fix the Internet" xmlUrl="https://feeds.eff.org/howtofixtheinternet" />
|
||||
<outline description="The podcast of the makers of international open magazine" htmlUrl="http://internationalopenmagazine.org/category/podcast.html" text="International Open Podcast" title="International Open Podcast" xmlUrl="http://spielend-programmieren.at/intopenpodcast.xml" />
|
||||
<outline description="The most recent additions to the Internet Archive collections. This RSS feed is generated dynamically" htmlUrl="https://archive.org/" text="Internet Archive" title="Internet Archive" xmlUrl="http://feeds.feedburner.com/archive/Lqwl" />
|
||||
<outline description="The cross platform podcast that makes technology work for you and not the other way around. The place to go for all geeks who slide between Mac, iOS, Android, Linux and Windows offering an essential mix of hacks, tips, howto's and tweaks spiced up with a dash of geek culture. Also check out our Mediafeed that has both our audio and video episodes." htmlUrl="https://knightwise.com" text="Knightwise.com Audio Feed." title="Knightwise.com Audio Feed." xmlUrl="http://feeds.feedburner.com/knightcastpodcast" />
|
||||
<outline description="Le podcast traitant de Linux et de l'open source" htmlUrl="https://donkluivert.cluster1.easy-hebergement.net" text="L'Apéro des Papas Manchots" title="L'Apéro des Papas Manchots" xmlUrl="https://feeds.feedburner.com/easy-hebergement/EuLV" />
|
||||
<outline description="Open Talk... about Open Source and Linux" htmlUrl="http://radio.linuxquestions.org" text="LQ Radio" title="LQ Radio" xmlUrl="http://feeds.feedburner.com/linuxquestions/LQRadioALL-ogg" />
|
||||
<outline description="GNU/Linux Games/Entertainment Radio - Enjoying the lighter side of GNU/Linux" htmlUrl="http://thelinuxlink.net/lager" text="LaGER: GNU/Linux and Games/Entertainment Radio" title="LaGER: GNU/Linux and Games/Entertainment Radio" xmlUrl="http://feeds.feedburner.com/thelinuxlink/Paek" />
|
||||
<outline description="Late Night Linux is a podcast that takes a look at what’s happening with Linux and the wider tech industry. Every week, Joe, Félim, Graham and Will discuss the latest news and releases, and the broader issues and trends in the world of free and open source software." htmlUrl="https://latenightlinux.com" text="Late Night Linux (Ogg)" title="Late Night Linux (Ogg)" xmlUrl="http://latenightlinux.com/feed/ogg" />
|
||||
@@ -57,6 +63,8 @@
|
||||
<outline description="Linux in Da House is a show about One family that is 100% GNU/Linux." htmlUrl="http://linuxindahouse.com" text="Linux In Da House MP3 Feed" title="Linux In Da House MP3 Feed" xmlUrl="http://linuxindahouse.com/linuxindahouse_mp3.rss" />
|
||||
<outline description="A podcast about free and open source software, communism and the revolution" htmlUrl="https://linuxinlaws.eu" text="Linux Inlaws" title="Linux Inlaws" xmlUrl="https://linuxinlaws.eu/inlaws_rss.xml" />
|
||||
<outline description="Chat about Linux and all things connected" htmlUrl="https://linuxlads.com" text="Linux Lads" title="Linux Lads" xmlUrl="https://linuxlads.com/feed_ogg.rss" />
|
||||
<outline description="Linux Out Loud is a community powered podcast. We take conversations from the DLN Community from places like the DLN Discourse Forums, Telegram group, Discord server and more. We also take topics from other shows around the network to give our takes. Linux Out Loud podcast is brought to you by the Destination Linux Network (https://destinationlinux.network/)!" htmlUrl="https://dlnxtend.com" text="Linux Out Loud" title="Linux Out Loud" xmlUrl="https://feeds.fireside.fm/dlnxtend/rss" />
|
||||
<outline description="Linux Out Loud is a community powered podcast. We take conversations from the DLN Community from places like the DLN Discourse Forums, Telegram group, Discord server and more. We also take topics from other shows around the network to give our takes. Linux Out Loud podcast is brought to you by the Destination Linux Network (https://destinationlinux.network/)!" htmlUrl="https://dlnxtend.com" text="Linux Out Loud" title="Linux Out Loud" xmlUrl="https://dlnxtend.com/rss" />
|
||||
<outline description="New media, new rules" htmlUrl="http://sixgun.org" text="Linux Outlaws" title="Linux Outlaws" xmlUrl="http://feeds.feedburner.com/linuxoutlaws" />
|
||||
<outline description="A podcast for the new Linux user" htmlUrl="http://www.linuxreality.com" text="Linux Reality Podcast (MP3 Feed)" title="Linux Reality Podcast (MP3 Feed)" xmlUrl="http://feeds.feedburner.com/linuxreality" />
|
||||
<outline description="Verbal's Linux Trivia Podcast" htmlUrl="http://setbit.org/lt.html" text="Linux Trivia Podcast" title="Linux Trivia Podcast" xmlUrl="http://setbit.org/lt-ogg.xml" />
|
||||
@@ -72,6 +80,7 @@
|
||||
<outline description="A bi-weekly discussion of legal issues in the FLOSS world, including interviews, from the Software Freedom Law Center offices in New York. Presented by Karen Sandler and Bradley M. Kuhn." htmlUrl="http://www.softwarefreedom.org/podcast/http://www.softwarefreedom.org/" text="OggcastSoftware Freedom Law Center" title="OggcastSoftware Freedom Law Center" xmlUrl="http://www.softwarefreedom.org/feeds/podcast-mp3/" />
|
||||
<outline description="Creative Commons presents conversations with people working to make the Internet and our global culture more open and collaborative." htmlUrl="https://anchor.fm/creativecommons" text="Open Minds … from Creative Commons" title="Open Minds … from Creative Commons" xmlUrl="https://anchor.fm/s/4d70d828/podcast/rss" />
|
||||
<outline description="A security podcast geared towards those looking to better understand security topics of the day. Hosted by Kurt Seifried and Josh Bressers covering a wide range of topics including IoT, application security, operational security, cloud, devops, and security news of the day. There is a special open source twist to the discussion often giving a unique perspective on any given topic." htmlUrl="http://opensourcesecuritypodcast.com" text="Open Source Security Podcast" title="Open Source Security Podcast" xmlUrl="https://opensourcesecuritypodcast.libsyn.com/rss" />
|
||||
<outline description="<p>Ce Podcast est destiné a toute personne désirant apprendre de manière différente sur Linux. Mais également une porte ouverte à tout ceux qui désire crée leur podcast la plateforme est ouvert à tous.</p>" htmlUrl="https://parlonslinux.fr/@ParlonsLinuxFR" text="Parlons Linux" title="Parlons Linux" xmlUrl="https://parlonslinux.fr/@ParlonsLinuxFR/feed.xml" />
|
||||
<outline description="The Fantasy Fiction Podcast" htmlUrl="https://podcastle.org/" text="PodCastle" title="PodCastle" xmlUrl="http://podcastle.org/feed/" />
|
||||
<outline description="Um podcast descontraído sobre Ubuntu, a comunidade Ubuntu e tudo o que gira em volta do universo Ubuntu." htmlUrl="https://podcastubuntuportugal.org/" text="Podcast Ubuntu Portugal" title="Podcast Ubuntu Portugal" xmlUrl="https://podcastubuntuportugal.org/feed/podcast/" />
|
||||
<outline description="Cory Doctorow's Literary Works" htmlUrl="https://craphound.com" text="Podcast – Cory Doctorow's craphound.com" title="Podcast – Cory Doctorow's craphound.com" xmlUrl="http://feeds.feedburner.com/doctorow_podcast" />
|
||||
@@ -84,6 +93,7 @@
|
||||
<outline description="Spanking the bottom of ignorance since 2009" htmlUrl="http://www.skepticule.co.uk/" text="Skepticule" title="Skepticule" xmlUrl="http://www.skepticule.co.uk/feeds/posts/default?alt=rss" />
|
||||
<outline description="The regular podcast about Free Software and ongoing activities hosted by the FSFE" htmlUrl="https://fsfe.org/news/podcast" text="Software Freedom Podcast" title="Software Freedom Podcast" xmlUrl="http://fsfe.org/news/podcast.en.rss" />
|
||||
<outline description="The regular podcast about Free Software and ongoing activities hosted by the FSFE" htmlUrl="https://fsfe.org/news/podcast" text="Software Freedom Podcast" title="Software Freedom Podcast" xmlUrl="http://fsfe.org/news/podcast-opus.en.rss" />
|
||||
<outline description="The Sudo Show covers topics ranging from Open Source in business to Cloud Management, but we don't just talk about the technology. We discuss methodologies like DevOps and how to change your team and company cultures to build and grow your people! Need to get more done? Join us as we share our years of experience working from home including our tips and tricks for better productivity! The Sudo Show is a proud member of the TuxDigital Network (https://tuxdigital.com/)!" htmlUrl="https://sudo.show" text="Sudo Show" title="Sudo Show" xmlUrl="https://sudo.show/rss" />
|
||||
<outline description="An unofficial Star Trek fan podcast from the Other Side Podcast Network" htmlUrl="https://teaearlgreyhot.org/" text="Tea, Earl Grey, Hot !" title="Tea, Earl Grey, Hot !" xmlUrl="https://teaearlgreyhot.org/feed/podcast" />
|
||||
<outline description="Random audio musings on a random basis. With coffee. Probably. About The Big Slurp" htmlUrl="https://thelovebug.org/series/slurp/" text="The Big Slurp" title="The Big Slurp" xmlUrl="https://thelovebug.org/feed/podcast/slurp" />
|
||||
<outline description="Linux and open source tips, tricks and discussion. Free software, hardware and modern culture. The Binary Times Audiocast is created by Mark and Wayne, two chaps who just like using linux and open source software and want to spread the word. Linux is free and open source and it is an excellent choice of operating system for our ever changing times. This audiocast is released fortnightly." htmlUrl="https://www.thebinarytimes.net" text="The Binary Times Audiocast - ogg" title="The Binary Times Audiocast - ogg" xmlUrl="https://www.thebinarytimes.net/rss-ogg.xml" />
|
||||
@@ -98,6 +108,7 @@
|
||||
<outline description="The Linux Link Tech Show" htmlUrl="http://www.tllts.org" text="The Linux Link Tech Show Ogg-Vorbis Feed" title="The Linux Link Tech Show Ogg-Vorbis Feed" xmlUrl="http://www.thelinuxlink.net/tllts/tllts_ogg.rss" />
|
||||
<outline description="If you obsess about the details inside computers then on This Week in Computer Hardware, you'll find out the latest in motherboards, CPUs, GPUs, storage, RAM, power supplies, input devices, and monitors. Hosts Patrick Norton of TekThing and Sebastian Peak of PC Perspective bring you the newest hardware, talk benchmarks, and even dive into the not-yet-released products on the horizon. Although this show is no longer in production, you can enjoy past episodes in the TWiT Archives." htmlUrl="https://twit.tv/shows/this-week-in-computer-hardware" text="This Week in Computer Hardware (Audio)" title="This Week in Computer Hardware (Audio)" xmlUrl="http://feeds.twit.tv/twich.xml" />
|
||||
<outline description="Leo Laporte, Jeff Jarvis, Stacey Higginbotham, Ant Pruitt, and their guests talk about the latest Google and cloud computing news. Records live every Wednesday at 5:00pm Eastern / 2:00pm Pacific / 22:00 UTC." htmlUrl="https://twit.tv/shows/this-week-in-google" text="This Week in Google (Audio)" title="This Week in Google (Audio)" xmlUrl="http://feeds.twit.tv/twig.xml" />
|
||||
<outline description="Your Weekly Source for Linux News" htmlUrl="https://tuxdigital.com/podcasts/this-week-in-linux/" text="This Week in Linux" title="This Week in Linux" xmlUrl="https://tuxdigital.com/feed/thisweekinlinux-mp3/" />
|
||||
<outline description="This Week in Microbiology is a podcast about unseen life on Earth hosted by Vincent Racaniello and friends. Following in the path of his successful shows 'This Week in Virology' (TWiV) and 'This Week in Parasitism' (TWiP), Racaniello and guests produce an informal yet informative conversation about microbes which is accessible to everyone, no matter what their science background." htmlUrl="http://www.asm.org/twim/" text="This Week in Microbiology" title="This Week in Microbiology" xmlUrl="http://feeds.feedburner.com/twim" />
|
||||
<outline description="Your first podcast of the week is the last word in tech news. Join the top tech journalists and pundits in a roundtable discussion of the latest trends in tech. Records live every Sunday at 5:15pm Eastern / 2:15pm Pacific / 22:15 UTC." htmlUrl="https://twit.tv/shows/this-week-in-tech" text="This Week in Tech (Audio)" title="This Week in Tech (Audio)" xmlUrl="http://feeds.twit.tv/twit.xml" />
|
||||
<outline description="TuxJam is a family friendly show that blends Creative Commons music and Open Source goodness. This is an OGG feed." htmlUrl="https://tuxjam.otherside.network/" text="TuxJam OGG" title="TuxJam OGG" xmlUrl="https://tuxjam.otherside.network/?feed=podcast" />
|
||||
@@ -106,6 +117,7 @@
|
||||
<outline description="En podcast om Wikipedia på svenska" htmlUrl="http://wikipediapodden.se/prenumerera/" text="Wikipediapodden" title="Wikipediapodden" xmlUrl="http://wikipediapodden.se/feed/podcast/" />
|
||||
<outline description="Talking about the BSD family of free operating systems." htmlUrl="http://bsdtalk.blogspot.com/" text="bsdtalk" title="bsdtalk" xmlUrl="http://feeds.feedburner.com/Bsdtalk" />
|
||||
<outline description="The independent magazine for the Ubuntu Linux community." htmlUrl="https://fullcirclemagazine.org" text="podcast – Full Circle Magazine" title="podcast – Full Circle Magazine" xmlUrl="http://fullcirclemagazine.org/category/podcast/feed/" />
|
||||
<outline description="News/interviews/anecdotes around postmarketOS, straight from the source." htmlUrl="https://cast.postmarketos.org/" text="postmarketOS Podcast" title="postmarketOS Podcast" xmlUrl="https://cast.postmarketos.org/feed.rss" />
|
||||
<outline description="urandom: your unlimited source of medium quality randomness" htmlUrl="https://urandom-podcast.info/" text="urandom podcast" title="urandom podcast" xmlUrl="http://feeds.feedburner.com/urandom-podcast/ogg" />
|
||||
</body>
|
||||
</opml>
|
||||
|
BIN
feedWatcher.pdf
BIN
feedWatcher.pdf
Binary file not shown.
@@ -1,5 +1,8 @@
|
||||
[%# feedWatcher_4.tpl 2020-01-25 -%]
|
||||
[%# Generates simple lines each containing title and description per feed -%]
|
||||
|
||||
*The following is a list of Creative Commons podcasts recommended by the Hacker Public Radio community.*
|
||||
|
||||
[% i = 0 -%]
|
||||
[% WHILE i < feeds.size -%]
|
||||
[% IF feeds.$i.urls_description.length > 0 -%]
|
||||
@@ -7,8 +10,9 @@
|
||||
[% ELSE -%]
|
||||
[% desc = "[No description]" -%]
|
||||
[% END -%]
|
||||
[% feeds.$i.urls_title %]: [% desc %]
|
||||
**[% feeds.$i.urls_title %]**: [% desc %]
|
||||
[% i = i + 1 -%]
|
||||
|
||||
[% END -%]
|
||||
[%#
|
||||
# vim: syntax=tt2:ts=8:sw=4:ai:et:tw=78:fo=tcrqn21
|
||||
|
@@ -1,9 +1,25 @@
|
||||
--
|
||||
-- feedWatcher_schema.sql - version 0.0.10
|
||||
-- feedWatcher_schema.sql - version 0.0.11, 2023-02-01 22:19:15
|
||||
--
|
||||
-- Renamed 'feedWatcher.sql' => `feedWatcher_schema.sql' on 2021-08-31
|
||||
--
|
||||
|
||||
/*
|
||||
* Table 'settings'
|
||||
* ----------------
|
||||
*
|
||||
* Table of configuration settings. Not 100% comfortable with this as a way of
|
||||
* doing such stuff.
|
||||
*/
|
||||
|
||||
DROP TABLE IF EXISTS settings;
|
||||
|
||||
CREATE TABLE settings (
|
||||
expiry_threshold varchar(20),
|
||||
last_expiry timestamp
|
||||
);
|
||||
INSERT INTO settings (expiry_threshold) VALUES('-2 years');
|
||||
|
||||
/*
|
||||
* Table 'urls'
|
||||
* ------------
|
||||
|
BIN
fosdem_23.odt
Normal file
BIN
fosdem_23.odt
Normal file
Binary file not shown.
39
make_reports
39
make_reports
@@ -13,9 +13,9 @@
|
||||
# BUGS: ---
|
||||
# NOTES: ---
|
||||
# AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
|
||||
# VERSION: 0.0.1
|
||||
# VERSION: 0.0.3
|
||||
# CREATED: 2023-01-09 17:07:23
|
||||
# REVISION: 2023-01-09 17:39:22
|
||||
# REVISION: 2023-01-28 14:10:48
|
||||
#
|
||||
#===============================================================================
|
||||
|
||||
@@ -31,6 +31,8 @@ BASEDIR="$HOME/HPR/feed_watcher"
|
||||
|
||||
cd "$BASEDIR" || { echo "Failed to cd to $BASEDIR"; exit 1; }
|
||||
|
||||
FOSDEM23="$BASEDIR/Conferences/FOSDEM/2023"
|
||||
|
||||
#
|
||||
# Files and sanity checks
|
||||
#
|
||||
@@ -44,10 +46,19 @@ FWTPL3="$BASEDIR/feedWatcher_3.tpl"
|
||||
echo "Template $FWTPL3 appears to be missing"
|
||||
exit 1
|
||||
}
|
||||
FWTPL4="$BASEDIR/feedWatcher_4.tpl"
|
||||
[ -e "$FWTPL4" ] || {
|
||||
echo "Template $FWTPL4 appears to be missing"
|
||||
exit 1
|
||||
}
|
||||
FWHTML="$BASEDIR/feedWatcher.html"
|
||||
FWMKD="$BASEDIR/feedWatcher.mkd"
|
||||
FWPDF="$BASEDIR/feedWatcher.pdf"
|
||||
|
||||
FDMKD4="$FOSDEM23/feedWatcher_4.mkd"
|
||||
FDODT="$FOSDEM23/fosdem_23.odt"
|
||||
FDODT_LIVE="$BASEDIR/fosdem_23.odt"
|
||||
|
||||
#
|
||||
# Generate HTML, JSON and OPML reports.
|
||||
# The template defaults to 'feedWatcher.tpl', the JSON file to
|
||||
@@ -87,6 +98,30 @@ else
|
||||
echo "$FWPDF doesn't seem to have been written"
|
||||
fi
|
||||
|
||||
#
|
||||
# The ODF for FOSDEM. The template for Markdown first. The output is in the
|
||||
# directory Conferences/FOSDEM/2023/. Then pandoc to generate ODT from the
|
||||
# Markdown. We use a reference document (an older FOSDEM report) to set some
|
||||
# attributes.
|
||||
#
|
||||
$FW -tem="$FWTPL4" -out="$FDMKD4"
|
||||
if [[ -e "$FDMKD4" ]]; then
|
||||
echo "PDF written to $FDMKD4"
|
||||
|
||||
pandoc -f markdown --standalone -t odt --reference-doc=reference.odt \
|
||||
-o "$FDODT" "$FDMKD4"
|
||||
if [[ -e "$FDODT" ]]; then
|
||||
echo "Wrote the ODT file $FDODT"
|
||||
cp "$FDODT" "$FDODT_LIVE"
|
||||
echo "Copied ODT to $FDODT_LIVE"
|
||||
else
|
||||
echo "$FDODT doesn't seem to have been written"
|
||||
fi
|
||||
else
|
||||
echo "$FDMKD4 doesn't seem to have been written"
|
||||
echo "Can't run Pandoc"
|
||||
fi
|
||||
|
||||
exit
|
||||
|
||||
# vim: syntax=sh:ts=8:sw=4:ai:et:tw=78:fo=tcrqn21
|
||||
|
Reference in New Issue
Block a user