59 Commits
main ... main

Author SHA1 Message Date
32f93f76ee Replace spaces in filenames, and sanatise all other extended utf8 2025-09-10 21:24:42 +02:00
9b4d64c2b1 encode filenames 2025-09-08 16:58:26 +02:00
8970692dc8 The sql format needs to be different 2025-09-08 16:08:57 +02:00
02671e10e7 2025-09-08_08-25-59Z_Monday database changed 2025-09-08 10:25:59 +02:00
602bbc4e9e Move HPR/hpr_hub#88 2025-09-08 09:48:46 +02:00
d6f567d9ea encoding comments, add id to schedule export 2025-08-21 16:49:38 +02:00
8743922705 Merge pull request 'Fix upload form layout' (#95) from hub94_Upload-form-fields-need-changes into main
Reviewed-on: HPR/hpr_hub#95
2025-06-26 23:55:40 +00:00
7dfac7fc16 Fix upload form layout
Make sure tables cells are vertically aligned to the top of the cells.
2025-06-25 22:36:47 -04:00
3b737fb286 #90 Prefixing file names with the key 2025-06-20 14:19:19 +02:00
7cc2fcf479 restoring spx 2025-06-05 22:29:11 +02:00
1906de88d3 2025-05-24_01-46-54Z_Saturday database changed 2025-05-24 03:46:54 +02:00
9a7314247d 2025-05-23_22-44-16Z_Friday database changed 2025-05-24 00:44:16 +02:00
4f3a1657a2 2025-05-21_08-21-55Z_Wednesday 2025-05-21 10:21:55 +02:00
dcb8b9a872 Fix prepadding shownotes and increase max upload size. 2025-05-10 06:59:06 +02:00
Ken Fallon
136378cf7e Merge pull request 'I84 - fix broken link in Upload -> Contribute' (#85) from paulj/hpr_hub:fix-contribute-link-in-upload-main-menu into main
Reviewed-on: HPR/hpr_hub#85
2025-02-04 06:01:17 +00:00
Paul Jewell
faca25007d I84 - fix broken link in Upload -> Contribute 2025-02-03 08:03:34 +01:00
Ken Fallon
7882b5f994 Merge pull request 'opus and removing spx' (#83) from I41_New_opus_feed into main
Reviewed-on: HPR/hpr_hub#83
2025-01-26 16:29:26 +00:00
5f1fb269ce opus and removing spx 2025-01-26 17:27:13 +01:00
Ken Fallon
6e7b739fbd Merge pull request 'I41_New_opus_feed' (#82) from I41_New_opus_feed into main
Reviewed-on: HPR/hpr_hub#82
2025-01-26 14:34:52 +00:00
2fc60e5f19 link to code 2025-01-26 15:34:01 +01:00
0c73c23394 Removed spx support and added opus 2025-01-26 15:32:00 +01:00
64bb28b4b4 The show processing needs to be refactored #5 2025-01-17 21:58:55 +01:00
70fe1cac27 The show processing needs to be refactored #5 2025-01-17 21:57:22 +01:00
1a748c01f6 The show processing needs to be refactored #5 2025-01-16 22:00:08 +01:00
a6044e16a7 The show processing needs to be refactored #5 2025-01-14 20:22:36 +01:00
Ken Fallon
821b7ff1b6 Merge pull request 'Add link to the episode the comment is on' (#80) from I79_Add_link_to_the_comment_episode into main
Reviewed-on: HPR/hpr_hub#80
2025-01-14 16:57:13 +00:00
f959958de1 Add link to the episode the comment is on 2025-01-14 17:56:31 +01:00
Ken Fallon
eb4444ebd9 Merge pull request 'Allow head method' (#78) from I77_Allow_head_requests_for_ccdn into main
Reviewed-on: HPR/hpr_hub#78
2025-01-14 16:47:13 +00:00
7b15121b8f Allow head method 2025-01-14 17:46:28 +01:00
Ken Fallon
8f8900db97 Merge pull request 'Fix for the reserve show confirmation and missing ;' (#76) from I74_Thank_You_for_recording_hpr9999_for_release_on_1970-01-01 into main
Reviewed-on: HPR/hpr_hub#76
2025-01-14 16:36:15 +00:00
50da7ea056 Fix for the reserve show confirmation and missing ; 2025-01-14 17:35:20 +01:00
35d938019a Switched to json only posting 2024-12-27 13:19:31 +01:00
b4acb758a7 Simplified and flattened the stats to json only 2024-12-26 21:26:56 +01:00
568252ab7c Moved to tools/workflow 2024-12-24 17:56:56 +01:00
c60905e5de Support for WYSIWYG upload server side 2024-12-24 17:25:14 +01:00
a553beafd5 Support for WYSIWYG upload 2024-12-24 15:52:25 +01:00
71124ab014 Removing processing tools from hpr-hub repo to workflow 2024-12-24 13:46:17 +01:00
77cb19ddb6 Remove spaces etc from filenames on server 2024-12-24 13:17:25 +01:00
d87c9ed979 Untracked changes in hprtranscode 2024-12-24 13:13:53 +01:00
1d14028ba0 Add two untracked scripts 2024-12-24 13:12:28 +01:00
a8897cc793 The magick convert is deprecated 2024-12-24 13:02:58 +01:00
2ac5bd0e51 Various emergency fixes 2024-11-25 18:23:43 +01:00
4dcdb38d86 Changed the sort on status 2024-11-25 17:45:47 +01:00
Ken Fallon
06af0e06be Merge pull request 'Added the warning and link to feedback to the shownotes' (#59) from I52_Add_comment_link_to_the_end_of_the_shownotes_in_the_rss_feed into main
Reviewed-on: HPR/hpr_hub#59
2024-10-31 10:24:05 +00:00
297d2040db Added the warning and link to feedback to the shownotes 2024-10-31 11:21:19 +01:00
17e46fea75 irss-future is now in rss.php 2024-10-31 07:48:13 +01:00
Ken Fallon
043288e5e4 Merge pull request 'Added support to add/update metadata on multiple assets via a json file' (#56) from I226_Asset_table_management into main
Reviewed-on: HPR/hpr_hub#56
2024-10-27 12:16:27 +00:00
3fc4da18ed Added support to add/update metadata on multiple assets via a json file 2024-10-26 19:31:07 +02:00
Ken Fallon
1615626c42 Merge pull request 'Fix future feed by removing gomax and adding future switch' (#55) from I54_Future_feed_not_working_after_switching_to_ccdn into main
Reviewed-on: HPR/hpr_hub#55
2024-10-23 08:37:41 +00:00
236cd08e6f Removed gomax as it was not used and it didn't work
Added a future switch to switch before `now()` and after
Cleaned up some commented out lines
2024-10-23 10:18:52 +02:00
Ken Fallon
50945b9968 Merge pull request 'The addition of a ccdn redirector and updating the link to media to point to it' (#53) from 225_Switch_url_for_media_to_hpr_ccdn into main
Reviewed-on: HPR/hpr_hub#53
Reviewed-by: Roan Horning <rho_n@josh@anhonesthost.com>
2024-10-23 07:36:34 +00:00
b2708a2b3f The addition of a ccdn redirector and updating the link to media to point to it 2024-10-21 17:35:20 +02:00
faa14cd6da 2024-10-20_21-12-39_CEST 2024-10-20 21:12:39 +02:00
8bf6aad70b Fix stats page hpr shows with playtime 2024-10-10 11:02:03 +02:00
112f443a04 Fix stats page hpr shows 2024-10-10 10:48:23 +02:00
7fdf12df28 Added the Scheduling Guidelines to the upload page 2024-10-09 20:17:49 +02:00
f19938a0c2 2024-10-04_17-33-29Z_Friday 2024-10-04 19:33:29 +02:00
dd2c9e6382 2024-09-28_18-02-01Z_Saturday database changed 2024-09-28 20:02:01 +02:00
Ken Fallon
4b8f414d63 Merge pull request 'Added an episode counter for feed generation to determine whether or not to include show notes.' (#42) from kdmurrayhpr/hpr_hub:main into main
Reviewed-on: HPR/hpr_hub#42
2024-09-24 07:08:23 +00:00
53 changed files with 14182 additions and 45164 deletions

View File

@@ -1,79 +0,0 @@
#!/bin/bash -
#
# Copied from a 'history' file on archive.org and turned into a script
#
set -o nounset # Treat unset variables as an error
SCRIPT=${0##*/}
#=== FUNCTION ================================================================
# NAME: cleanup_temp
# DESCRIPTION: Cleanup temporary files in case of a keyboard interrupt
# (SIGINT) or a termination signal (SIGTERM) and at script
# exit
# PARAMETERS: * - names of temporary files to delete
# RETURNS: Nothing
#===============================================================================
function cleanup_temp {
for tmp in "$@"; do
[ -e "$tmp" ] && rm --force "$tmp"
done
exit 0
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if [[ $# -eq 0 ]]; then
echo "Usage: $SCRIPT audio_file"
exit 1
fi
AUDIO="$1"
IMAGE="${AUDIO%.*}.png"
if [[ ! -e $AUDIO ]]; then
echo "$SCRIPT: audio file $AUDIO not found"
exit 1
fi
#
# Make a temporary file (called /tmp/XXXX.png) and set traps to delete them
#
TMP1=$(mktemp -p /tmp XXXXXXXX.png) || {
echo "$SCRIPT: creation of temporary file failed!"
exit 1
}
trap 'cleanup_temp $TMP1' SIGHUP SIGINT SIGPIPE SIGTERM EXIT
#
# Make a temporary PNG file from the audio. The original uses a 'timeout' call
# but I can't get it to work for me.
#
ffmpeg -v 0 -analyzeduration 900000000000 -probesize 200M -threads 2 -i "$AUDIO" \
-filter_complex aformat=channel_layouts=mono,showwavespic=colors=white:s=3200x800 \
-frames:v 1 -f apng - 2>/dev/null | \
convert - -background black -alpha remove -alpha off "$TMP1" 2>/dev/null | cat > /dev/null 2>&1
#
# Not clear what's being done to the image here, but it produces a useful end
# result, or seems to!
#
convert -background black "$TMP1" -gravity center -background black -transparent white - | \
convert - -gravity South -background white -splice 0x5 -background black -splice 0x5 - | \
convert - -trim - | \
convert - -gravity South -chop 0x5 - | \
convert - -gravity North -background white -splice 0x5 -background black -splice 0x5 - | \
convert - -trim - | \
convert - -gravity North -chop 0x5 - | \
convert - -resize '800x200!' "$IMAGE"
#
# The original renamed the temporary file to be the target image file, but
# that's probably becausae part of this is done in a Docker container. Doesn't
# seem appropriate here
#
# vim: syntax=sh:ts=8:sw=4:ai:et:tw=78:fo=tcrqn21

View File

@@ -1,7 +0,0 @@
#!/bin/bash
pw=$(grep -E '^\$databasePassword = ' /home/hpr/php/credentials.php | awk -F "'" '{print $2}' )
pw=${pw##* }
mysqldump --user=hpr_hpr --password="$pw" -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database --databases hpr_hpr > /home/hpr/hpr_hpr.sql
mysqldump --databases hpr_hpr --add-drop-database --tz-utc --host=localhost --user=hpr_hpr --password="$pw" > /home/hpr/mysqldump.sql
mysqldump --user=hpr_hpr --password="$pw" -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database --databases hpr_hpr --ignore-table=hpr_hpr.reservations > /home/hpr/www/hpr.sql

View File

@@ -1,610 +0,0 @@
#!/usr/bin/env bash
# Copyright Ken Fallon - Released into the public domain. http://creativecommons.org/publicdomain/
#============================================================
PATH=$PATH:/home/ken/sourcecode/hpr/hpr_hub/bin/
#source /home/ken/tmp/pip3.9/bin/activate
TEMP_DIR="/var/tmp/"
CHANNELS="1"
FIXAUDIO="1"
ARTIST="EMPTY"
TITLE="EMPTY"
YEAR="EMPTY"
SLOT="EMPTY"
basedir="/var/IA"
upload_dir="${basedir}/uploads"
theme="${basedir}/theme.wav"
outro="${basedir}/2022-03-07-outro.wav"
ttsserver="http://localhost:5500"
processing_dir="/home/ken/tmp/hpr/processing"
git_image_dir="/home/ken/sourcecode/hpr/HPR_Public_Code/www/images/hosts"
acceptable_duration_difference="2" # Seconds
thedate=$(/usr/bin/date -u +%Y-%m-%d_%H-%M-%SZ_%A)
echo "Processing the next HPR Show in the queue"
if [ $( curl -s -o /dev/null -w "%{http_code}" -X 'GET' "${ttsserver}/api/voices" -H 'accept: */*' ) != "200" ]
then
echo "Please start the tts-server \"podman run -it -p 5500:5500 synesthesiam/opentts:en\""
exit
fi
function abs_diff {
echo $(($1 >= $2 ? $1 - $2 : $2 - $1))
}
function create_tts_summary {
HPR_summary="$( cat "hpr${ep_num}_summary.txt" )"
echo "INFO: Converting text \"${HPR_summary}\" to speech."
curl -X 'GET' -G --data-urlencode "voice=coqui-tts:en_ljspeech" --data-urlencode "text=${HPR_summary}" --data-urlencode "vocoder=high" --data-urlencode "denoiserStrength=0.03" --data-urlencode "cache=false" ${ttsserver}/api/tts -H 'accept: */*' --output ~hpr${ep_num}_summary.wav
}
###################
# Locate media directory
#
#
show_type=""
if [[ -f "${1}" && -n "${2}" ]]
then
echo "DEBUG: Show type is local" 1>&2
show_type="local"
mediafile="${1}"
media_dir="$( dirname "${mediafile}" )"
ep_num="${2}"
echo "The duration is \"$( \date -ud "1970-01-01 $( ffprobe -i "${mediafile}" 2>&1| awk -F ': |, ' '/Duration:/ { print $2 }' )" +%s )\"."
else
echo "DEBUG: Show type is remote" 1>&2
show_type="remote"
response=$( curl --silent --netrc-file ${HOME}/.netrc "https://hub.hackerpublicradio.org/cms/status.php" | \
grep 'SHOW_POSTED' | \
head -1 | \
sed 's/,/ /g' )
echo "DEBUG: Getting server response" 1>&2
if [ -z "${response}" ]
then
echo "INFO: There appear to be no more shows with the status \"SHOW_POSTED\"."
echo "Getting a list of all the reservations."
curl --silent --netrc-file ${HOME}/.netrc "https://hub.hackerpublicradio.org/cms/status.php"
exit 3
fi
timestamp_epoc="$( echo ${response} | awk '{print $1}' )"
ep_num="$( echo ${response} | awk '{print $2}' )"
ep_date="$( echo ${response} | awk '{print $3}' )"
key="$( echo ${response} | awk '{print $4}' )"
status="$( echo ${response} | awk '{print $5}' )"
email="$( echo ${response} | awk '{print $6}' )"
#source_dir="hpr:/home/hpr/upload/${timestamp_epoc}_${ep_num}_${ep_date}_${key}"
dest_dir="${timestamp_epoc}_${ep_num}_${ep_date}_${key}"
media_dir="${processing_dir}/${timestamp_epoc}_${ep_num}_${ep_date}_${key}"
fi
echo "DEBUG: Checking variables" 1>&2
if [ -z "${show_type}" ]
then
echo "sorry, variable \"show_type\" is not set."
exit
fi
if [ -z "${media_dir}" ]
then
echo "sorry, variable \"media_dir\" is not set."
exit
fi
if [ ! -d "${media_dir}" ]
then
echo "sorry, directory \"media_dir: ${media_dir}\" does not exist"
exit 1
fi
echo detox -v "${media_dir}/"
detox -vr "${media_dir}/"
if [[ "$( find "${media_dir}" \( -iname "hpr${ep_num}.wav" -o -iname "hpr${ep_num}.mp3" -o -iname "hpr${ep_num}.ogg" -o -iname "hpr${ep_num}.spx" -o -iname "hpr${ep_num}_summary.txt" -o -iname "hpr${ep_num}_summary.wav" -o -iname "hpr${ep_num}.wav" -o -iname "*_mez.wav" -o -iname "*_sox_norm.wav" -o -iname "*_mezzanine.wav" -o -iname "*_tmp.pcm" -o -iname "hpr${ep_num}_intro.wav" -o -iname "~hpr${ep_num}_summary.wav" -o -iname "~~hpr${ep_num}_summary.wav" -o -iname "*_tmp.log" -o -iname "silence.wav" -o -iname "hpr${ep_num}_norm.wav" \) | wc -l )" -ne 0 ]]
then
echo "Files for this episode already exist."
find "${media_dir}" \( -iname "hpr${ep_num}.wav" -o -iname "hpr${ep_num}.mp3" -o -iname "hpr${ep_num}.ogg" -o -iname "hpr${ep_num}.spx" -o -iname "hpr${ep_num}_summary.txt" -o -iname "hpr${ep_num}_summary.wav" -o -iname "hpr${ep_num}.wav" -o -iname "*_mez.wav" -o -iname "*_sox_norm.wav" -o -iname "*_mezzanine.wav" -o -iname "*_tmp.pcm" -o -iname "hpr${ep_num}_intro.wav" -o -iname "~hpr${ep_num}_summary.wav" -o -iname "~~hpr${ep_num}_summary.wav" -o -iname "*_tmp.log" -o -iname "silence.wav" -o -iname "hpr${ep_num}_norm.wav" \)
read -p "Shall I remove them ? (N|y) ? " -n 1 -r
echo # (optional) move to a new line
if [[ ! $REPLY =~ ^[yY]$ ]]
then
echo "skipping...."
exit
else
echo "Removing old files ...."
find "${media_dir}" \( -iname "hpr${ep_num}.wav" -o -iname "hpr${ep_num}.mp3" -o -iname "hpr${ep_num}.ogg" -o -iname "hpr${ep_num}.spx" -o -iname "hpr${ep_num}_summary.txt" -o -iname "hpr${ep_num}_summary.wav" -o -iname "hpr${ep_num}.wav" -o -iname "*_mez.wav" -o -iname "*_sox_norm.wav" -o -iname "*_mezzanine.wav" -o -iname "*_tmp.pcm" -o -iname "hpr${ep_num}_intro.wav" -o -iname "~hpr${ep_num}_summary.wav" -o -iname "~~hpr${ep_num}_summary.wav" -o -iname "*_tmp.log" -o -iname "silence.wav" -o -iname "hpr${ep_num}_norm.wav" \) -delete -print
fi
fi
#####################################################
# Process media
media=$( find "${media_dir}" -type f -exec file {} \; | grep -Ei 'audio|mpeg|video|MP4' | awk -F ': ' '{print $1}' )
if [ -z "${media}" ]
then
echo "ERROR: Can't find any media in \"${media_dir}/\""
find "${media_dir}/" -type f
exit 1
fi
mediafile=""
echo "Found more than one media file. Please select which one to use ?"
if [ "$( echo "${media}" | wc -l )" -ne 1 ]
then
select this_media in $( echo "${media}" )
do
echo "INFO: You selected \"${this_media}\"."
ls -al "${this_media}"
mediafile="${this_media}"
break
done
else
echo "INFO: Selecting media as \"${media}\"."
mediafile="${media}"
fi
# extract file name and extension
fname="$( basename "${mediafile%.*}" )"
ext="${mediafile/*./}"
cd "${media_dir}/"
pwd
echo "INFO: Processing hpr${ep_num} from ${email}"
echo "INFO: Working directory is \"${media_dir}/\""
echo ""
if [ -z "${mediafile}" ]
then
echo "sorry, variable \"mediafile\" is not set."
exit
fi
if [ -z "${fname}" ]
then
echo "sorry, variable \"fname\" is not set."
exit
fi
if [ -z "${ext}" ]
then
echo "sorry, variable \"ext\" is not set."
exit
fi
if [ ! -f "${mediafile}" ]
then
echo "sorry, media file \"${mediafile}\" does not exist"
exit
fi
echo "--------------------------------------------------------------------------------" | tee -a ${fname}_tmp.log
echo "File information for \"${mediafile}\"" | tee -a ${fname}_tmp.log
ffprobe ${mediafile} 2>&1 | grep Audio:
mediainfo ${mediafile}
audio2image.bash ${mediafile}
xdg-open ${mediafile%.*}.png >/dev/null 2>&1 &
unset REPLY
until [[ $REPLY =~ ^[yYnN]$ ]]
do
read -p "Source Waveform look ok ? (N|y) ? " -n 1 -r
echo ""
done
if [[ ! $REPLY =~ ^[yY]$ ]]
then
echo "skipping.... $REPLY"
exit
fi
re='^[0-9]+$'
if ! [[ $ep_num =~ $re ]]
then
echo "error: episode \"${ep_num}\" is not a number"
exit 1
fi
if [ ! -f "${outro}" ]
then
echo "sorry, file \"${outro}\" does not exist"
exit 1
fi
if [ ! -f "${theme}" ]
then
echo "sorry, file \"${theme}\" does not exist"
exit 1
fi
if [ ! -r "${mediafile}" ]
then
echo "sorry, media file \"${mediafile}\" is not readable"
exit
fi
if [ $(ffprobe "${mediafile}" 2>&1 | grep "Audio:" | wc -l ) -eq 0 ]
then
echo "sorry, media file \"${mediafile}\" has no audio track"
exit
fi
xdg-open "https://hackerpublicradio.org/eps/hpr${ep_num}/index.html" >/dev/null 2>&1 &
mpv -vo=null "${mediafile}"
unset REPLY
until [[ $REPLY =~ ^[yYnN]$ ]]
do
read -p "Is the audio ok (n|Y) ? " -n 1 -r
echo ""
done
if [[ ! $REPLY =~ ^[yY]$ ]]
then
echo "skipping.... $REPLY"
exit
fi
echo "--------------------------------------------------------------------------------"
echo "Geting metadata for hpr${ep_num}"
while read -r line
do
field=$(echo $line | awk -F ':' '{print $1}')
case $field in
"HPR_summary")
HPR_summary=$(echo $line | grep "HPR_summary: " | cut -c 14- )
continue
;;
"HPR_album")
HPR_album=$(echo $line | grep "HPR_album: " | cut -c 12- )
continue
;;
"HPR_artist")
HPR_artist=$(echo $line | grep "HPR_artist: " | cut -c 13- )
continue
;;
"HPR_comment")
HPR_comment=$(echo $line | grep "HPR_comment: " | cut -c 14- )
continue
;;
"HPR_genre")
HPR_genre=$(echo $line | grep "HPR_genre: " | cut -c 12- )
continue
;;
"HPR_title")
HPR_title=$(echo $line | grep "HPR_title: " | cut -c 12- )
continue
;;
"HPR_track")
HPR_track=$(echo $line | grep "HPR_track: " | cut -c 12- )
continue
;;
"HPR_year")
HPR_year=$(echo $line | grep "HPR_year: " | cut -c 11- )
continue
;;
"HPR_duration")
HPR_duration=$(echo $line | grep "HPR_duration: " | cut -c 15- )
continue
;;
"HPR_explicit")
HPR_explicit=$(echo $line | grep "HPR_explicit: " | cut -c 15- )
continue
;;
"HPR_license")
HPR_license=$(echo $line | grep "HPR_license: " | cut -c 14- )
continue
;;
esac
done < <( curl --silent --netrc-file ${HOME}/.netrc "https://hub.hackerpublicradio.org/cms/say.php?id=${ep_num}" )
if [[ -z "$HPR_album" || -z "$HPR_artist" || -z "$HPR_comment" || -z "$HPR_genre" || -z "$HPR_title" || -z "$HPR_track" || -z "$HPR_year" || -z "$HPR_summary" || -z "$HPR_duration" || -z "$HPR_explicit" || -z "$HPR_license" ]]
then
echo "Could not find information on ${ep_num}. Has the show been posted ?"
exit;
fi
echo "--------------------------------------------------------------------------------"
echo "album : $HPR_album"
echo "artist : $HPR_artist"
echo "comment : $HPR_comment"
echo "genre : $HPR_genre"
echo "title : $HPR_title"
echo "track : $HPR_track"
echo "year : $HPR_year"
echo "summary : $HPR_summary"
echo "duration : $HPR_duration"
echo "explicit : $HPR_explicit"
echo "license : $HPR_license"
echo "media_dir : ${media_dir}"
echo "mediafile : ${mediafile}"
echo "fname : ${fname}"
echo "ext : ${ext}"
if [[ $HPR_duration == "0" ]]
then
echo "The duration is set to 0. Please update the show with the correct time."
exit;
fi
#============================================================
# Preproc`s the source file
echo "--------------------------------------------------------------------------------" | tee -a ${fname}_tmp.log
echo "Prepare mezzanine file" | tee -a ${fname}_tmp.log
ffmpeg -y -i ${mediafile} -ar 44100 -ac $CHANNELS ${fname}_mezzanine.wav > ${fname}_tmp.log 2>&1
echo "--------------------------------------------------------------------------------" | tee -a ${fname}_tmp.log
echo "Add HPR Branding" | tee -a ${fname}_tmp.log
echo "Creating the summary" | tee -a ${fname}_tmp.log
#echo "$HPR_summary" - | text2wave -F 44100 - -o hpr${ep_num}_summary.wav #festival --tts
#echo "$HPR_summary" - | espeak -w ~hpr${ep_num}_summary.wav
echo "$HPR_summary" > "hpr${ep_num}_summary.txt"
create_tts_summary_ok="not-ok"
while [ "${create_tts_summary_ok}" != "OK" ]
do
create_tts_summary
xdg-open "hpr${ep_num}_summary.txt" 2>&1 &
mpv --speed=1.8 ~hpr${ep_num}_summary.wav
read -p "Is the text to speech correct (y|N) ? " -n 1 -r
echo # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]
then
create_tts_summary_ok="OK"
else
echo "WARN: Please correct the text and try again."
inotifywait --event modify "hpr${ep_num}_summary.txt"
fi
done
echo "INFO: TTS complete."
ffmpeg -y -i ~hpr${ep_num}_summary.wav -ar 44100 ~~hpr${ep_num}_summary.wav >> ${fname}_tmp.log 2>&1
sox -V2 -n -r 44100 -c 1 silence.wav trim 0.0 6.0 >> ${fname}_tmp.log 2>&1
sox -V2 silence.wav ~~hpr${ep_num}_summary.wav hpr${ep_num}_summary.wav >> ${fname}_tmp.log 2>&1
echo "Adding the theme" | tee -a ${fname}_tmp.log
sox -V2 -m "hpr${ep_num}_summary.wav" "${theme}" "hpr${ep_num}_intro.wav" >> ${fname}_tmp.log 2>&1
echo "Creating the sandwitch: \"hpr${ep_num}_intro.wav\" \"${fname}_mezzanine.wav\" \"${outro}\" \"hpr${ep_num}.wav\" " | tee -a ${fname}_tmp.log
sox -V2 "hpr${ep_num}_intro.wav" "${fname}_mezzanine.wav" "${outro}" "hpr${ep_num}.wav" >> ${fname}_tmp.log 2>&1
echo "Normalizing the wav files" | tee -a ${fname}_tmp.log
#sox --temp "${TEMP_DIR}" --norm hpr${ep_num}.wav hpr${ep_num}_norm.wav
ffmpeg -y -i hpr${ep_num}.wav -af loudnorm=I=-16:LRA=11:TP=-1.5 hpr${ep_num}_norm.wav >> ${fname}_tmp.log 2>&1
mv -v hpr${ep_num}_norm.wav ${upload_dir}/hpr${ep_num}.wav >> ${fname}_tmp.log 2>&1
echo "--------------------------------------------------------------------------------" | tee -a ${fname}_tmp.log
echo "File information" | tee -a ${fname}_tmp.log
ffprobe ${upload_dir}/hpr${ep_num}.wav 2>&1 | grep Audio:
mediainfo ${upload_dir}/hpr${ep_num}.wav
audio2image.bash ${upload_dir}/hpr${ep_num}.wav
xdg-open ${upload_dir}/hpr${ep_num}.png >/dev/null 2>&1 &
read -p "Processed Waveform look ok ? (N|y) ? " -n 1 -r
echo # (optional) move to a new line
if [[ ! $REPLY =~ ^[yY]$ ]]
then
echo "skipping...."
exit
fi
rm -v ${upload_dir}/hpr${ep_num}.png
echo "--------------------------------------------------------------------------------"
echo "Geting transcript of hpr${ep_num}"
whisper --model tiny --language en --output_dir "${media_dir}" "${upload_dir}/hpr${ep_num}.wav" | tee -a ${fname}_tmp.log
ls -al "${media_dir}/hpr${ep_num}".*
xdg-open "${media_dir}/hpr${ep_num}".txt 2>&1 &
echo mpv --no-audio-display --audio-channels=stereo --speed="3.5" "${media_dir}/hpr${ep_num}".txt
unset REPLY
until [[ $REPLY =~ ^[yYnN]$ ]]
do
read -p "Processed transcript look ok ? (N|y) ? " -n 1 -r
echo ""
done
if [[ ! $REPLY =~ ^[yY]$ ]]
then
echo "skipping.... $REPLY"
exit
fi
mkdir "${upload_dir}/hpr${ep_num}" >/dev/null 2>&1
cp -v "${media_dir}/hpr${ep_num}".vtt "${upload_dir}/hpr${ep_num}/hpr${ep_num}.vtt" | tee -a ${fname}_tmp.log
cp -v "${media_dir}/hpr${ep_num}".srt "${upload_dir}/hpr${ep_num}/hpr${ep_num}.srt" | tee -a ${fname}_tmp.log
cp -v "${media_dir}/hpr${ep_num}".txt "${upload_dir}/hpr${ep_num}/hpr${ep_num}.txt" | tee -a ${fname}_tmp.log
cp -v "${media_dir}/hpr${ep_num}".tsv "${upload_dir}/hpr${ep_num}/hpr${ep_num}.tsv" | tee -a ${fname}_tmp.log
cp -v "${media_dir}/hpr${ep_num}".json "${upload_dir}/hpr${ep_num}/hpr${ep_num}.json" | tee -a ${fname}_tmp.log
echo "--------------------------------------------------------------------------------" | tee -a ${fname}_tmp.log
echo "Convert to opus" | tee -a ${fname}_tmp.log
ffmpeg -y -i ${upload_dir}/hpr${ep_num}.wav ${upload_dir}/hpr${ep_num}.opus 2>> ${fname}_tmp.log 1>&2
echo "--------------------------------------------------------------------------------" | tee -a ${fname}_tmp.log
echo "Convert to flac" | tee -a ${fname}_tmp.log
ffmpeg -y -i ${upload_dir}/hpr${ep_num}.wav ${upload_dir}/hpr${ep_num}.flac 2>> ${fname}_tmp.log 1>&2
echo "--------------------------------------------------------------------------------" | tee -a ${fname}_tmp.log
echo "Convert to mp3" | tee -a ${fname}_tmp.log
ffmpeg -y -i ${upload_dir}/hpr${ep_num}.wav ${upload_dir}/hpr${ep_num}.mp3 2>> ${fname}_tmp.log 1>&2
echo "--------------------------------------------------------------------------------" | tee -a ${fname}_tmp.log
echo "Convert to ogg" | tee -a ${fname}_tmp.log
#ffmpeg -y -i ${upload_dir}/hpr${ep_num}.wav ${upload_dir}/hpr${ep_num}.ogg 2>> ${fname}_tmp.log 1>&2
ffmpeg -y -i ${upload_dir}/hpr${ep_num}.wav -acodec libopus -f ogg ${upload_dir}/hpr${ep_num}.ogg 2>> ${fname}_tmp.log 1>&2
echo "--------------------------------------------------------------------------------" | tee -a ${fname}_tmp.log
echo "Convert to spx" | tee -a ${fname}_tmp.log
ffmpeg -y -i ${upload_dir}/hpr${ep_num}.wav ${upload_dir}/hpr${ep_num}.spx 2>> ${fname}_tmp.log 1>&2
### End conversion
intro_duration="$( mediainfo --Output=XML --Full "hpr${ep_num}_intro.wav" | xmlstarlet sel -T -t -m '/_:MediaInfo/_:media/_:track[@type="Audio"]' -v '_:Duration' -n | awk -F '.' '{print $1}' )"
outro_duration="$( mediainfo --Output=XML --Full "${outro}" | xmlstarlet sel -T -t -m '/_:MediaInfo/_:media/_:track[@type="Audio"]' -v '_:Duration' -n | awk -F '.' '{print $1}' )"
source_duration="$( mediainfo --Output=XML --Full "${mediafile}" | xmlstarlet sel -T -t -m '/_:MediaInfo/_:media/_:track[@type="Audio"]' -v '_:Duration' -n | awk -F '.' '{print $1}' )"
expected_duration=$(( ${intro_duration} + ${HPR_duration} + ${outro_duration} ))
echo "Intro(${intro_duration}) + Show(${HPR_duration}) + Outro(${outro_duration}) = ${expected_duration}"
media_error="0"
for check_file in \
${upload_dir}/hpr${ep_num}.wav \
${upload_dir}/hpr${ep_num}.opus \
${upload_dir}/hpr${ep_num}.flac \
${upload_dir}/hpr${ep_num}.mp3 \
${upload_dir}/hpr${ep_num}.spx \
${upload_dir}/hpr${ep_num}.ogg
do
# ${upload_dir}/hpr${ep_num}.spx
echo "INFO: Processing the file \"${check_file}\""
if [[ ! -s "${check_file}" ]]
then
echo "ERROR: Something went wrong encoding of the file \"${check_file}\""
exit
else
mediainfo --Output=XML --Full "${check_file}" | xmlstarlet sel -T -t -m '/_:MediaInfo/_:media/_:track[@type="Audio"]' -v '_:Duration' -n | awk -F '.' '{print $1}'
this_duration=$( mediainfo --Output=XML --Full "${check_file}" | xmlstarlet sel -T -t -m '/_:MediaInfo/_:media/_:track[@type="Audio"]' -v '_:Duration' -n | awk -F '.' '{print $1}' )
if [[ $(abs_diff "${this_duration}" "${expected_duration}" ) -le "${acceptable_duration_difference}" ]]
then
echo "INFO: The file \"${check_file}\" duration of ${this_duration} () is close enough to ${expected_duration}"
else
echo "ERROR: The file \"${check_file}\" actual duration of ${this_duration} is not close enough to posted duration of ${expected_duration}."
echo " Fix or update the posted duration to ${source_duration}."
media_error="1"
fi
#${expected_duration}
fi
done
echo "Source: ${source_duration}"
if [[ "${media_error}" -eq "1" ]]
then
echo "ERROR: Media is not encoded correctly"
exit
else
echo "INFO: Media duration is correct"
fi
if [[ ! -s ${upload_dir}/hpr${ep_num}.wav ]] || [[ ! -s ${upload_dir}/hpr${ep_num}.opus ]] || [[ ! -s ${upload_dir}/hpr${ep_num}.flac ]] || [[ ! -s ${upload_dir}/hpr${ep_num}.mp3 ]] || [[ ! -s ${upload_dir}/hpr${ep_num}.ogg ]] || [[ ! -s ${upload_dir}/hpr${ep_num}.spx ]]
then
echo "ERROR: Something went wrong encoding the files"
exit 1
fi
echo "--------------------------------------------------------------------------------" | tee -a ${fname}_tmp.log
echo "Fixing Tags" | tee -a ${fname}_tmp.log
fix_tags -album="$HPR_album" -artist="$HPR_artist" -comment="${HPR_comment} The license is ${HPR_license}" -genre="$HPR_genre" -title="$HPR_title" -track="$HPR_track" -year="$HPR_year" ${upload_dir}/hpr${ep_num}* 2>> ${fname}_tmp.log 1>&2
fix_tags ${upload_dir}/hpr${ep_num}*
#echo "Changing the file dates to the time of upload"
touch -r ${mediafile} hpr${ep_num}*
touch -r ${mediafile} ${upload_dir}/hpr${ep_num}*
ls -al hpr${ep_num}* ${upload_dir}/hpr${ep_num}* | tee -a ${fname}_tmp.log
# # echo "--------------------------------------------------------------------------------" | tee -a ${fname}_tmp.log
# # echo "Getting info for the asset table" | tee -a ${fname}_tmp.log
# #
# # echo "INSERT INTO assets (episode_id,filename,extension,size,sha1sum,mime_type,file_type) VALUES"
# #
# # for asset_file in \
# # ${upload_dir}/hpr${ep_num}.wav \
# # ${upload_dir}/hpr${ep_num}.opus \
# # ${upload_dir}/hpr${ep_num}.flac \
# # ${upload_dir}/hpr${ep_num}.mp3 \
# # ${upload_dir}/hpr${ep_num}.spx \
# # ${upload_dir}/hpr${ep_num}.ogg
# # do
# # size="$( ls -al "${asset_file}" | awk '{print $5}' )"
# # sha1sum="$( sha1sum "${asset_file}" | awk '{print $1}' )"
# # mime_type=$( file --dereference --brief --mime "${asset_file}" )
# # file_type=$( file --dereference --brief "${asset_file}" )
# # echo "(${ep_num},'${filename}','${extension}','${size}','${sha1sum}','${mime_type}','${file_type}'),"
# # done
echo "--------------------------------------------------------------------------------" | tee -a ${fname}_tmp.log
echo "Transferring files to Servers" | tee -a ${fname}_tmp.log
#rsync -ave ssh --partial --progress --ignore-existing ${upload_dir}/hpr${ep_num}.mp3 ${upload_dir}/hpr${ep_num}.ogg ${upload_dir}/hpr${ep_num}.spx hpr:www/eps/
#firefox "https://hackerpublicradio.org/local/hpr${ep_num}.mp3" >/dev/null 2>&1 &
#firefox "https://hackerpublicradio.org/local/hpr${ep_num}.ogg" >/dev/null 2>&1 &
firefox "file://${upload_dir}/hpr${ep_num}.mp3" >/dev/null 2>&1 &
firefox "file://${upload_dir}/hpr${ep_num}.ogg" >/dev/null 2>&1 &
#firefox "https://hackerpublicradio.org/eps.php?id=${ep_num}" >/dev/null 2>&1 &
#mpv "http://hackerpublicradio.org/local/hpr${ep_num}.spx" "http://hackerpublicradio.org/local/hpr${ep_num}.ogg" "http://hackerpublicradio.org/local/hpr${ep_num}.mp3" "file://${upload_dir}/hpr${ep_num}.spx" "file://${upload_dir}/hpr${ep_num}.opus" "file://${upload_dir}/hpr${ep_num}.ogg" "file://${upload_dir}/hpr${ep_num}.mp3" "file://${upload_dir}/hpr${ep_num}.flac"
mpv "file://${upload_dir}/hpr${ep_num}.spx" "file://${upload_dir}/hpr${ep_num}.opus" "file://${upload_dir}/hpr${ep_num}.ogg" "file://${upload_dir}/hpr${ep_num}.mp3" "file://${upload_dir}/hpr${ep_num}.flac"
read -p "Remove files for \"${fname}\" (y|N) ? " -n 1 -r
echo # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]
then
mediafilename=$(basename "${mediafile}")
mediaextension="${mediafilename##*.}" # "
# ssh hpr -t "mkdir /home/hpr/www/eps/hpr${ep_num}" >/dev/null 2>&1
# rsync -ave ssh --partial --progress --ignore-existing "${mediafile}" hpr:www/eps/hpr${ep_num}/hpr${ep_num}_source.${mediaextension} | tee -a ${fname}_tmp.log
#
# rsync -ave ssh --partial --progress --ignore-existing "${media_dir}/hpr${ep_num}.wav".vtt hpr:www/eps/hpr${ep_num}/hpr${ep_num}.vtt | tee -a ${fname}_tmp.log
# rsync -ave ssh --partial --progress --ignore-existing "${media_dir}/hpr${ep_num}.wav".srt hpr:www/eps/hpr${ep_num}/hpr${ep_num}.srt | tee -a ${fname}_tmp.log
# rsync -ave ssh --partial --progress --ignore-existing "${media_dir}/hpr${ep_num}.wav".txt hpr:www/eps/hpr${ep_num}/hpr${ep_num}.txt | tee -a ${fname}_tmp.log
#
# ssh hpr -t "ls -al /home/hpr/www/eps/hpr${ep_num}*"
# cp -v "${mediafile}" "${upload_dir}/hpr${ep_num}_source.${mediaextension}"
#echo "Remove temp files"
rm -v ~hpr${ep_num}_summary.wav ~~hpr${ep_num}_summary.wav silence.wav
rm -v ${fname}_mezzanine.wav ${fname}_tmp*.pcm ${fname}_tmp.log ${fname}_mez.wav
#mv -v ${fname}* hpr${ep_num}* *_${ep_num}_* /var/IA/done/
# wget --timeout=0 -q "http://hackerpublicradio.org/hpr_ogg_rss.php?gomax=1" -O - | xmlstarlet val --err -
# wget --timeout=0 -q "http://hackerpublicradio.org/hpr_mp3_rss.php?gomax=1" -O - | xmlstarlet val --err -
# wget --timeout=0 -q "http://hackerpublicradio.org/hpr_spx_rss.php?gomax=1" -O - | xmlstarlet val --err -
# wget --timeout=0 -q "http://hackerpublicradio.org/rss-future.php" -O - | xmlstarlet val --err -
echo "INFO: rsync -ave ssh --partial --progress ${upload_dir}/hpr${ep_num}* borg:/data/IA/uploads/"
rsync -ave ssh --partial --progress ${upload_dir}/hpr${ep_num}* borg:/data/IA/uploads/
echo "$( ssh borg -t "ls -al /data/IA/uploads/hpr${ep_num}*" ; ls -al ${upload_dir}/hpr${ep_num}* )" | grep "hpr${ep_num}" | awk '{print $5, $NF}' | sort
if [ ${show_type} == "remote" ]
then
echo "INFO: Setting the status"
# SHOW_SUBMITTED → METADATA_PROCESSED → SHOW_POSTED → MEDIA_TRANSCODED → UPLOADED_TO_IA → UPLOADED_TO_RSYNC_NET
curl --netrc-file ${HOME}/.netrc "https://hub.hackerpublicradio.org/cms/status.php?ep_num=${ep_num}&status=MEDIA_TRANSCODED"
curl --silent --netrc-file ${HOME}/.netrc "https://hub.hackerpublicradio.org/cms/status.php"
fi
else
echo "skipping...."
echo "cp -v \"${mediafile}\" \"${upload_dir}/hpr${ep_num}_source.${mediaextension}\""
echo "rm -v ${fname}_mezzanine.wav ${fname}_tmp*.pcm ${fname}_tmp.log ${fname}_mez.wav"
#echo "mv -v ${fname}* hpr${ep_num}* *_${ep_num}_* /var/IA/done/"
echo "wget --timeout=0 -q \"http://hackerpublicradio.org/hpr_ogg_rss.php?gomax=1\" -O - | xmlstarlet val --err -"
echo "wget --timeout=0 -q \"http://hackerpublicradio.org/hpr_mp3_rss.php?gomax=1\" -O - | xmlstarlet val --err -"
echo "wget --timeout=0 -q \"http://hackerpublicradio.org/hpr_spx_rss.php?gomax=1\" -O - | xmlstarlet val --err -"
echo "rsync -ave ssh --partial --progress ${upload_dir}/ borg:/data/IA/uploads/"
fi

View File

@@ -1,4 +0,0 @@
#!/bin/bash
pw=$(grep -E '^\$databasePassword = ' /home/hpr/php/credentials.php | awk -F "'" '{print $2}' )
pw=${pw##* }
mysql --host=localhost --user=hpr_hpr --password="$pw" hpr_hpr

View File

@@ -1,260 +0,0 @@
#!/usr/bin/env bash
# Copyright Ken Fallon - Released into the public domain. http://creativecommons.org/publicdomain/
#============================================================
source /home/ken/tmp/pip3.9/bin/activate
PATH=$PATH:/home/ken/sourcecode/hpr/hpr_hub/bin/
processing_dir="/home/ken/tmp/hpr/processing"
git_image_dir="/home/ken/sourcecode/hpr/HPR_Public_Code/www/images/hosts"
echo "Processing the next HPR Show in the queue"
###################
# Get the show
#
#
response=$( curl --silent --netrc-file ${HOME}/.netrc "https://hub.hackerpublicradio.org/cms/status.php" | \
grep 'METADATA_PROCESSED' | \
head -1 | \
sed 's/,/ /g' )
if [ -z "${response}" ]
then
echo "INFO: There appear to be no more shows with the status \"METADATA_PROCESSED\"."
echo "Getting a list of all the reservations."
curl --silent --netrc-file ${HOME}/.netrc "https://hub.hackerpublicradio.org/cms/status.php" | sort -n
exit 3
fi
timestamp_epoc="$( echo ${response} | awk '{print $1}' )"
ep_num="$( echo ${response} | awk '{print $2}' )"
ep_date="$( echo ${response} | awk '{print $3}' )"
key="$( echo ${response} | awk '{print $4}' )"
status="$( echo ${response} | awk '{print $5}' )"
email="$( echo ${response} | awk '{print $6}' )"
email_unpadded="$( echo $email | sed 's/.nospam@nospam./@/g' )"
upload_dir="/home/hpr/upload/${timestamp_epoc}_${ep_num}_${ep_date}_${key}"
source_dir="hpr:${upload_dir}"
dest_dir="${timestamp_epoc}_${ep_num}_${ep_date}_${key}"
ssh hpr -t "detox -v ${upload_dir}/"
echo "INFO: Downloading hpr${ep_num} from ${email_unpadded}"
echo ""
echo rsync -ave ssh --partial --progress ${source_dir}/ ${processing_dir}/${dest_dir}/
rsync -ave ssh --partial --progress ${source_dir}/ ${processing_dir}/${dest_dir}/
echo ""
echo "INFO: Working directory is \"${processing_dir}/${dest_dir}/\""
echo ""
shownotes_json="${processing_dir}/${dest_dir}/shownotes.json"
if [ ! -s "${shownotes_json}" ]
then
echo "ERROR: \"${shownotes_json}\" is missing"
exit 2
fi
if [ "$( file "${shownotes_json}" | grep -ic "text" )" -eq 0 ]
then
echo "ERROR: \"${shownotes_json}\" is not a text file"
exit 3
fi
jq '.' "${shownotes_json}" | sponge "${shownotes_json}"
###################
# Get the media
#
remote_media="$( jq --raw-output '.metadata.POST.url' "${processing_dir}/${dest_dir}/shownotes.json" )"
if [ -n "${remote_media}" ]
then
echo "INFO: Fetching remote media from \"${remote_media}\""
wget --timestamping --directory-prefix="${processing_dir}/${dest_dir}/" "${remote_media}"
if [ $? -ne 0 ]
then
echo "ERROR: Could not get the remote media"
exit 5
fi
fi
shownotes_html="${processing_dir}/${dest_dir}/shownotes.html"
if [ ! -s "${shownotes_html}" ]
then
echo "ERROR: \"${shownotes_html}\" is missing"
exit 4
fi
shownotes_txt="${processing_dir}/${dest_dir}/shownotes.txt"
if [ ! -s "${shownotes_txt}" ]
then
echo "ERROR: \"${shownotes_txt}\" is missing"
exit 7
fi
xdg-open "${shownotes_txt}" >/dev/null 2>&1 &
xdg-open "${shownotes_json}" >/dev/null 2>&1 &
xdg-open "${shownotes_html}" >/dev/null 2>&1 &
read -p "Does the metadata 'look ok ? (N|y) ? " -n 1 -r
echo # (optional) move to a new line
if [[ ! $REPLY =~ ^[yY]$ ]]
then
echo "skipping...."
exit 22
fi
media=$( find "${processing_dir}/${dest_dir}/" -type f -exec file {} \; | grep -Ei 'audio|mpeg|video|MP4' | awk -F ': ' '{print $1}' )
if [ -z "${media}" ]
then
echo "ERROR: Can't find any media in \"${processing_dir}/${dest_dir}/\""
find "${processing_dir}/${dest_dir}/" -type f
exit 1
fi
the_show_media=""
if [ "$( echo "${media}" | wc -l )" -ne 1 ]
then
echo "Multiple files found. Which one do you want to use ?"
select this_media in $( echo "${media}" )
do
echo "INFO: You selected \"${this_media}\"."
ls -al "${this_media}"
the_show_media="${this_media}"
break
done
else
echo "INFO: Selecting media as \"${media}\"."
the_show_media="${media}"
fi
duration=$( \date -ud "1970-01-01 $( ffprobe -i "${the_show_media}" 2>&1| awk -F ': |, ' '/Duration:/ { print $2 }' )" +%s )
###################
# Gather episode information
#
if [ "$( curl --silent --write-out '%{http_code}' http://hackerpublicradio.org/say.php?id=${ep_num} --output /dev/null )" == 200 ]
then
echo "ERROR: The Episode hpr${ep_num} has already been posted"
exit 6
fi
if [ "$( jq --raw-output '.metadata.Episode_Number' ${shownotes_json} )" != "${ep_num}" ]
then
echo "ERROR: The Episode_Number: \"${ep_num}\" was not found in \"${shownotes_json}\""
exit 10
fi
if [ "$( jq --raw-output '.metadata.Episode_Date' ${shownotes_json} )" != "${ep_date}" ]
then
echo "ERROR: The Episode_Date: \"${ep_date}\" was not found in \"${shownotes_json}\""
exit 8
fi
if [ "$( jq --raw-output '.host.Host_Email' ${shownotes_json} )" != "${email_unpadded}" ]
then
echo "ERROR: The Host_Email: \"${email_unpadded}\" was not found in \"${shownotes_json}\""
exit 9
fi
###################
# Assemble the components
#
# https://newbedev.com/how-to-urlencode-data-for-curl-command/
hostid="$( jq --raw-output '.host.Host_ID' ${shownotes_json} | jq --slurp --raw-input @uri | sed -e 's/%0A"$//g' -e 's/^"//g' )"
host_name="$( jq --raw-output '.host.Host_Name' ${shownotes_json} | jq --slurp --raw-input @uri | sed -e 's/%0A"$//g' -e 's/^"//g' )"
title=$( jq --raw-output '.episode.Title' ${shownotes_json} | jq --slurp --raw-input @uri | sed -e 's/%0A"$//g' -e 's/^"//g' )
summary="$( jq --raw-output '.episode.Summary' ${shownotes_json} | jq --slurp --raw-input @uri | sed -e 's/%0A"$//g' -e 's/^"//g' )"
series="$( jq --raw-output '.episode.Series' ${shownotes_json} | jq --slurp --raw-input @uri | sed -e 's/%0A"$//g' -e 's/^"//g' )"
series_name="$( jq --raw-output '.episode.Series_Name' ${shownotes_json} | jq --slurp --raw-input @uri | sed -e 's/%0A"$//g' -e 's/^"//g' )"
explicit="$( jq --raw-output '.episode.Explicit' ${shownotes_json} | jq --slurp --raw-input @uri | sed -e 's/%0A"$//g' -e 's/^"//g' )"
episode_license="$( jq --raw-output '.episode.Show_License' ${shownotes_json} | jq --slurp --raw-input @uri | sed -e 's/%0A"$//g' -e 's/^"//g' )"
tags="$( jq --raw-output '.episode.Tags' ${shownotes_json} | jq --slurp --raw-input @uri | sed -e 's/%0A"$//g' -e 's/^"//g' )"
host_license=$( jq --raw-output '.host.Host_License' ${shownotes_json} | jq --slurp --raw-input @uri | sed -e 's/%0A"$//g' -e 's/^"//g' )
host_profile=$( jq --raw-output '.host.Host_Profile' ${shownotes_json} | jq --slurp --raw-input @uri | sed -e 's/%0A"$//g' -e 's/^"//g' )
# notes="$( grep -P ":\t" ${shownotes_txt} | awk -F "\t" '{print $2}' )"
notes="$( cat "${shownotes_html}" | jq --slurp --raw-input @uri | sed -e 's/%0A"$//g' -e 's/^"//g' )"
if [ $# -gt 0 ]
then
declare -A hash
for argument
do
if [[ $argument =~ ^[^=]+=.*$ ]]
then
this_key="${argument%=*}" # "${} Kate format hack
this_value="${argument#*=}" # "${} Kate format hack
this_value="$( echo "${this_value}" | jq --slurp --raw-input @uri | sed -e 's/%0A"$//g' -e 's/^"//g' )"
eval "${this_key}=${this_value}"
echo "INFO: Replacing \"${this_key}\" with \"${this_value}\"."
fi
done
fi
if [ "${hostid}" == '0' ]
then
echo "ERROR: The hostid is 0. Create the host and use \"hostid=???\" to override"
exit 11
fi
# # # # has to be done here as we need to know the hostid
# # # host_photo="$( jq --raw-output '.metadata.FILES.host_photo.name' ${shownotes_json} )"
# # # if [ -n "${host_photo}" ]
# # # then
# # # host_photo="${processing_dir}/${dest_dir}/photo"
# # # host_avatar="${git_image_dir}/${hostid}.png"
# # # echo "INFO: Found host photo \"${host_photo}\""
# # # gm convert "${host_photo}" -resize x80 "${host_avatar}"
# # # xdg-open "${host_avatar}"
# # # read -p "Does the avatar 'look ok ? (N|y) ? " -n 1 -r
# # # echo # (optional) move to a new line
# # # if [[ ! $REPLY =~ ^[yY]$ ]]
# # # then
# # # echo "ERROR: Problem with avatar...."
# # # exit 12
# # # else
# # # echo "INFO: Copying avatar to the server."
# # # scp "${host_avatar}" hpr:www/images/hosts/
# # # fi
# # # fi
###################
# Post show to HPR
#
post_show="${processing_dir}/${dest_dir}/post_show.txt"
post_show_response="${processing_dir}/${dest_dir}/post_show_response.txt"
echo "key=${key}&ep_num=${ep_num}&ep_date=${ep_date}&email=${email}&title=${title}&duration=${duration}&summary=${summary}&series=${series}&series_name=${series_name}&explicit=${explicit}&episode_license=${episode_license}&tags=${tags}&hostid=${hostid}&host_name=${host_name}&host_license=${host_license}&host_profile=${host_profile}&notes=${notes}" > ${post_show}
echo "Sending:"
cat "${post_show}"
echo "key=${key}
ep_num=${ep_num}
ep_date=${ep_date}
email=${email}
title=${title}
duration=${duration}
summary=${summary}
series=${series}
series_name=${series_name}
explicit=${explicit}
episode_license=${episode_license}
tags=${tags}
hostid=${hostid}
host_name=${host_name}
host_license=${host_license}
host_profile=${host_profile}
notes=${notes}"
wget --post-file="${post_show}" "https://hub.hackerpublicradio.org/cms/add_show.php" -O - #"${post_show_response}"
# /home/ken/sourcecode/personal/bin/hpr-publish.bash
#
# xdg-open "https://hackerpublicradio.org/eps/hpr${ep_num}/index.html" >/dev/null 2>&1 &

View File

@@ -1,52 +0,0 @@
#!/usr/bin/env bash
# Copyright Ken Fallon - Released into the public domain. http://creativecommons.org/publicdomain/
#============================================================
upload_dir="/home/hpr/upload"
reserve_dir="/home/hpr/reserve"
hub_dir="/home/hpr/hub"
reserve_file="${hub_dir}/reserve.txt"
while read reserve_show_dir
do
echo "Processing \"${reserve_show_dir}\""
shownotes="${reserve_show_dir}/shownotes.json"
if [ ! -s "${shownotes}" ]
then
echo "ERROR: \"${shownotes}\" not found"
exit 1
fi
host_id="$( jq --raw-output '.host.Host_ID' "${shownotes}" )"
if [ "${host_id}" -eq "0" ]
then
echo "ERROR: New host detected \"${host_id}\" post the first show to the regular queue."
exit 1
fi
metadata_url="$( jq --raw-output '.metadata.url' "${shownotes}" )"
if [ -n "${metadata_url}" ]
then
save_name=$( basename "${metadata_url}" | sed -e 's/[^A-Za-z0-9.]/_/g' -e 's/__/_/g' )
wget "${metadata_url}" -O "${reserve_show_dir}/${save_name}"
if [ ! -s "${reserve_show_dir}/${save_name}" ]
then
echo "ERROR: \"${metadata_url}\" needs to be downloaded as \"${reserve_show_dir}/${save_name}\""
exit 1
fi
fi
Host_ID="$( jq --raw-output '.host.Host_ID' "${shownotes}" )"
Host_Name="$( jq --raw-output '.host.Host_Name' "${shownotes}" | sed -e 's/[^A-Za-z0-9]/_/g' -e 's/__/_/g' )"
Key="$( jq --raw-output '.metadata.Key' "${shownotes}" )"
Timestamp="$( jq --raw-output '.metadata.Timestamp' "${shownotes}" )"
Title="$( jq --raw-output '.episode.Title' "${shownotes}" | sed -e 's/[^A-Za-z0-9]/_/g' -e 's/__/_/g')"
Timestamp_Epoch="$( \date -u +%s -d "${Timestamp}" )"
mv -v "${reserve_show_dir}" "${reserve_dir}/${Timestamp_Epoch}_${Host_ID}_${Key}_${Host_Name}_${Title}"
done < <( find "${upload_dir}" -type d -iname "*_9999_*" )
ls -1 "${reserve_dir}" | awk -F '_' '{ $2=""; $3=""; print}' | while read line
do
upload_epoch="$( echo "${line}" | awk '{print $1}' )"
upload_iso8601="$( \date -d "@${upload_epoch}" +%Y-%m-%d )"
echo "${upload_iso8601} $( echo ${line} | awk '{ $1=""; print}' )"
done > "${reserve_file}"
cat "${reserve_file}"

View File

@@ -1,5 +0,0 @@
#!/usr/bin/env bash
# Copyright Ken Fallon - Released into the public domain. http://creativecommons.org/publicdomain/
#============================================================
curl --silent --netrc-file ${HOME}/.netrc "https://hub.hackerpublicradio.org/cms/status.php"

View File

@@ -1,8 +0,0 @@
#!/bin/bash
hub_dir="/home/hpr/hub"
for format in txt csv json xml
do
curl --silent --netrc-file /home/hpr/.netrc https://hub.hackerpublicradio.org/cms/stats.php?format=${format} --output ${hub_dir}/stats.${format}
done

View File

@@ -1,406 +0,0 @@
<?php
require "/home/hpr/php/include.php";
date_default_timezone_set('UTC');
function goback() {
header( "Location: " . $_SERVER["HTTP_REFERER"] ) ;
exit;
}
logextra( "Starting add_show.php");
if ( $_SERVER['REQUEST_METHOD'] !== 'POST' ) {
problem("ERROR: It is not a POST");
}
logextra( "It is a POST" );
if ( empty($_SERVER["REMOTE_ADDR"]) ) {
problem("ERROR: No REMOTE_ADDR");
}
else {
$ip = $_SERVER["REMOTE_ADDR"];
}
logextra( "We have a IP of $ip" );
if (count($_POST) !== 15) {
logextra( "POST is not 15" );
if (count($_POST) !== 17) {
# 19 is for mosaic
# if this reports 0 is could be that the max upload is not set correctly in php.ini.
problem("ERROR: Incorrect number of POST entries ".count($_POST) );
}
}
logextra( "Correct number of POST entries" );
if ( isset( $_POST['key'] ) and strlen( $_POST['key'] ) === 45 and strlen( htmlspecialchars( stripslashes( strip_tags( $_POST['key'] ) ) ) ) === 45 and ctype_xdigit( $_POST['key'] ) ) {
$db_key = htmlspecialchars( stripslashes( strip_tags( $_POST['key'] ) ) );
}
else {
problem("ERROR: no key");
}
logextra( "Field lengths are correct" );
$query = "SELECT * FROM reservations WHERE reservations.key = '$db_key' ";
$result = @mysqli_query($connection, $query);
$db = mysqli_fetch_array($result, MYSQLI_ASSOC);
logextra( "Getting this reservation from the db" );
if ( $db["key"] != $db_key ) {
problem("ERROR: Could not find the reservation in the db");
}
logextra( "Found this reservation from the db" );
if ( empty($_POST["title"]) or strlen($_POST["title"]) > 100 ) {
problem("ERROR: Title length is not OK");
}
logextra( "Title length is OK" );
$title = $_POST["title"];
if ( empty($_POST["summary"]) or strlen( $_POST["summary"]) > 200 or strlen(str_replace('\\', '', $_POST["summary"])) > 100 ) {
problem("ERROR: Summary length is not OK");
}
logextra( "Summary length is OK" );
$summary = $_POST["summary"];
if ( empty($_POST["explicit"]) ) {
problem("ERROR: explicit is missing");
}
logextra( "explicit exists" );
if ( strcmp($_POST["explicit"], "Yes") !== 0 ) {
logextra( "explicit is not yes" );
if ( strcmp($_POST["explicit"], "Clean") !== 0 ) {
problem("ERROR: explicit needs to be either Yes or Clean");
}
}
logextra( "explicit is either Yes or Clean" );
$explicit = $_POST["explicit"];
if ( $explicit === "Clean" ) {
$explicit = 0;
}
else {
$explicit = 1;
}
if ( empty($_POST["episode_license"]) or strlen($_POST["episode_license"]) < 4 or strlen($_POST["episode_license"]) > 11 ) {
problem("ERROR: episode_license length is not fine");
}
logextra( "episode_license length is fine" );
if ( !(
strcmp($_POST["episode_license"], "CC-BY-SA") === 0 or
strcmp($_POST["episode_license"], "CC-BY-NC-SA") === 0 or
strcmp($_POST["episode_license"], "CC-BY-NC-ND") === 0 or
strcmp($_POST["episode_license"], "CC-0") === 0 or
strcmp($_POST["episode_license"], "CC-BY-NC") === 0 or
strcmp($_POST["episode_license"], "CC-BY") === 0 or
strcmp($_POST["episode_license"], "Other") === 0 )
) {
problem("ERROR: license is not a valid value");
}
logextra( "license is a valid value" );
$episode_license = $_POST["episode_license"];
if ( empty($_POST["notes"]) or strlen($_POST["notes"]) > 40000 ) {
problem("ERROR: Notes are missing not less than max");
}
logextra( "Notes are not missing and are less than max" );
$notes = $_POST["notes"];
if ( ( empty($_POST["series"]) and ($_POST["series"] != 0 ) ) or (strlen($_POST["series"]) > 3 ) ) {
problem("ERROR: Series id is not in the correct range");
}
$series = $_POST["series"];
if ( (strval(intval($series)) != strval($series)) ){
problem("ERROR: series is not an int");
}
logextra( "series is int" );
$result_series = mysqli_query($connection, "SELECT name FROM miniseries WHERE id='$series'");
logextra( "Series id is in the correct range \"$series\"" );
if (!isset($result_series)) {
problem("ERROR: Series has not been found");
}
$db_series_name_array = mysqli_fetch_row( $result_series );
$db_series_name = $db_series_name_array[0];
if ( empty($db_series_name) ) {
problem("ERROR: Series name \"${db_series_name}\" is missing from db ");
}
logextra( "Series name has been found in db: \"$db_series_name\"" );
if ( empty($_POST["series_name"]) ) {
problem("ERROR: series_name length is not fine");
}
$series_name = $_POST["series_name"];
if ( $series_name != $db_series_name ) {
problem("ERROR: series_name \"$series_name\" and db_series_name \"$db_series_name\" don't match.");
}
logextra( "series_name checkes passed: \"$series_name\"" );
if ( !empty($_POST["tags"]) and strlen($_POST["tags"]) > 100 ) {
problem("ERROR: Tags are not the correct length");
}
logextra( "Tags are the correct length" );
$tags = $_POST["tags"];
#############
# Host checks
if ( empty($_POST["host_name"]) or strlen($_POST["host_name"]) > 40 ) {
problem("ERROR: host_name is not set and not the correct length");
}
logextra( "host_name is set and correct length" );
$host_name = $_POST["host_name"];
if ( strlen($_POST["host_profile"]) > 2000 ) {
problem("ERROR: host_profile is not the correct length");
}
logextra( "host_profile is correct length" );
$host_profile = $_POST["host_profile"];
if ( empty($_POST["host_license"]) or strlen($_POST["host_license"]) < 4 or strlen($_POST["host_license"]) > 11 ) {
problem("ERROR: host_license is not in the correct range");
}
logextra( "host_license is in the correct range" );
if ( !(
strcmp($_POST["host_license"], "CC-BY-SA") === 0 or
strcmp($_POST["host_license"], "CC-BY-NC-SA") === 0 or
strcmp($_POST["host_license"], "CC-BY-NC-ND") === 0 or
strcmp($_POST["host_license"], "CC-0") === 0 or
strcmp($_POST["host_license"], "CC-BY-NC") === 0 or
strcmp($_POST["host_license"], "CC-BY") === 0 or
strcmp($_POST["host_license"], "Other") === 0 )
) {
problem("ERROR: host_license is not a predfined value");
}
logextra( "host_license is a predfined value" );
$host_license = $_POST["host_license"];
if ( $_POST["hostid"] == 0 ) {
problem("ERROR: hostid is 0");
}
logextra( "hostid is not 0" );
if ( empty($_POST["hostid"]) ) {
problem("ERROR: hostid doesn't exists ");
}
logextra( "hostid exists " );
$result = mysqli_query($connection, 'SELECT MAX(hostid) FROM hosts;');
if (!isset($result)) {
problem("ERROR: could not get the max host from db");
}
$maxhost_array = mysqli_fetch_row( $result );
$maxhost = $maxhost_array[0];
logextra( "retrieved the max host from db" );
$hostid = $_POST["hostid"];
if ( (strval(intval($hostid)) != strval($hostid)) ){
problem("ERROR: host id is not an int");
}
logextra( "host id is int" );
if ( ( intval($hostid) < 0 ) or ( intval($hostid) > $maxhost ) ){
problem("ERROR: host id \"$hostid\" is not in the correct range \" $maxhost \"");
}
logextra( "host id is int, and in the correct range" );
$query = "SELECT * FROM `hosts` WHERE `hostid` = '$hostid' and `host` = '$host_name';";
$result = @mysqli_query($connection, $query);
$db = mysqli_fetch_array($result, MYSQLI_ASSOC);
logextra( "Getting this host from the db" );
if ( ( $db["hostid"] != $hostid ) or ( $db["host"] != $host_name ) ) {
problem("ERROR: Could not find the host \"" . $db["hostid"] ."\", \"" . $db["host"] . "\" in the db \"${hostid}\", \"${host_name}\"" . $query );
}
logextra( "Found this reservation from the db" );
if ( ( $db["profile"] != "$host_profile" ) or ( $db["license"] != "$host_license" ) ) {
logextra("The host_license is different to that in the db");
$host_profile = mysqli_real_escape_string( $connection, $host_profile );
$host_license = mysqli_real_escape_string( $connection, $host_license );
$query = "UPDATE `hosts` SET `profile` = '$host_profile', `license` = '$host_license' WHERE `hosts`.`hostid` = '$hostid';";
$result = mysqli_query($connection, $query );
if (!isset($result)) {
problem("ERROR: could not update the host profile");
} else {
logextra( "Updating the host profile" );
}
}
logextra( "The host_license is the same to that in the db" );
##############
# Episode Check
// SHOW_SUBMITTED → METADATA_PROCESSED → SHOW_POSTED → MEDIA_TRANSCODED → UPLOADED_TO_IA → UPLOADED_TO_RSYNC_NET
if ( !empty($_POST["ep_num"]) and isset( $_POST["ep_num"] ) ) {
$ep_num = intval( $_POST["ep_num"] );
}
else {
problem("ERROR: ep_num is empty");
}
// // SELECT MAX(ep_num) FROM `reservations` → 3627
// // SELECT MIN(ep_num) FROM `reservations` WHERE ep_num > 0 → 3582
//
$result = mysqli_query($connection, 'SELECT MAX(ep_num) FROM `reservations`;');
if (!isset($result)) {
problem("ERROR: Can't get max eps from reservations");
}
$max_eps_array = mysqli_fetch_row( $result );
$max_eps = $max_eps_array[0];
mysqli_free_result($result);
$result = mysqli_query($connection, 'SELECT MIN(ep_num) FROM `reservations` WHERE ep_num > 0;');
if (!isset($result)) {
problem("ERROR: Can't get min eps from reservations");
}
$min_eps_array = mysqli_fetch_row( $result );
$min_eps = $min_eps_array[0];
mysqli_free_result($result);
if ( empty( $ep_num ) ) {
problem("ERROR: ep_num is empty");
}
if ( $ep_num < $min_eps ) {
problem("ERROR: ep_num is too small");
}
if ( $ep_num > $max_eps ) {
problem("ERROR: ep_num is too big");
}
if ( intval($ep_num) === 0 ) {
problem("ERROR: ep_num is 0");
}
else {
$ep_num = intval($ep_num);
}
$result = mysqli_query($connection, "SELECT ep_num FROM reservations WHERE ep_num='$ep_num' AND status='METADATA_PROCESSED';");
if (!isset($result)) {
problem("ERROR: Cant get info from reservations db");
}
$db_ep_num_array = mysqli_fetch_row( $result );
$db_ep_num = $db_ep_num_array[0];
mysqli_free_result($result);
if ( $db_ep_num != $ep_num ){
problem("ERROR: Cant find $ep_num with status of METADATA_PROCESSED");
}
$result = mysqli_query($connection, "SELECT `id` FROM `eps` WHERE `id` = '$ep_num';");
if (!isset($result)) {
problem("ERROR: The show $ep_num is already in the eps db");
}
$db_ep_num_array = mysqli_fetch_row( $result );
$db_ep_num = $db_ep_num_array[0];
mysqli_free_result($result);
if ( !empty( $db_ep_num ) ) {
problem("ERROR: $ep_num is already in the eps table");
}
if ( intval($db_ep_num) === $ep_num ) {
problem("ERROR: $ep_num is already in the eps table");
}
logextra( "ep_num checkes passed: $ep_num" );
if ( !preg_match("/^\d{4}-\d{2}-\d{2}$/", $_POST["ep_date"]) ) {
problem("ERROR: ep_date fails the regex match ");
}
else {
$ep_date = $_POST["ep_date"];
}
if ( strtotime($ep_date) === false ) {
problem("ERROR: ep_date didn't convert to date");
}
else {
$ep_date_epoch = strtotime($ep_date);
}
logextra( "ep_date checkes passed: $ep_date" );
if ( !empty($_POST["duration"]) and isset( $_POST["duration"] ) ) {
$duration = intval( $_POST["duration"] );
}
else {
problem("ERROR: duration is empty");
}
if ( empty( $duration ) ) {
problem("ERROR: duration is empty");
}
if ( $duration < 50 ) {
problem("ERROR: duration is too small");
}
if ( $duration > 26830 ) {
problem("ERROR: duration is too big");
}
if ( intval($duration) === 0 ) {
problem("ERROR: duration is 0");
}
else {
$duration = intval($duration);
}
logextra( "duration checkes passed: $duration" );
$title = mysqli_real_escape_string( $connection, $title );
$summary = mysqli_real_escape_string( $connection, $summary );
$notes = mysqli_real_escape_string( $connection, $notes );
$tags = mysqli_real_escape_string( $connection, $tags );
$query_add = "INSERT INTO eps VALUES ('$ep_num', '{$ep_date}', '{$title}', '{$duration}', '{$summary}', '{$notes}', '{$hostid}', '{$series}', '{$explicit}', '{$episode_license}', '{$tags}', '0', '0', '0')";
$result = mysqli_query($connection, $query_add );
if(!$result) {
problem("ERROR: DB problem - The show $ep_num was not added to the eps db.");
}
if (mysqli_errno( $connection )) {
$error = "MySQL error ".mysqli_errno( $connection ).": ".mysqli_error()."\n";
problem("ERROR: MySQL error- The show $ep_num was not added to the eps db.\n$error");
}
$result = mysqli_query($connection, "SELECT `id` FROM `eps` WHERE `id` = '$ep_num';");
if (!isset($result)) {
problem("ERROR: DB problem - The show $ep_num has not been added to the eps db");
}
$db_ep_num_array = mysqli_fetch_row( $result );
$db_ep_num = $db_ep_num_array[0];
mysqli_free_result($result);
if (mysqli_errno( $connection )) {
$error = "MySQL error ".mysqli_errno( $connection ).": ".mysqli_error()."\n";
problem("ERROR: MySQL error- The show $ep_num was not added to the eps db.\n$error");
}
$result = mysqli_query($connection, "UPDATE reservations SET `status` = 'SHOW_POSTED' WHERE `ep_num` = '$ep_num' AND status='METADATA_PROCESSED';" );
if (!isset($result)) {
problem("ERROR: DB problem - The show $ep_num has not been added to the eps db");
}
if (mysqli_errno( $connection )) {
$error = "MySQL error ".mysqli_errno( $connection ).": ".mysqli_error()."\n";
problem("ERROR: Could not update the show reservation to SHOW_POSTED in the db");
}
logextra( "Finished $ep_num ." );
?>

577
cms/add_show_json.php Normal file
View File

@@ -0,0 +1,577 @@
<?php
require "/home/hpr/php/include.php";
date_default_timezone_set('UTC');
// executed by postshow.bash
// curl --netrc-file $HOME/.netrc --verbose --request POST https://hub.hackerpublicradio.org/cms/add_show_json.php --data-ascii @post_show.json --header "Content-Type: application/json"
logextra( "Starting add_show_json.php");
//Make sure that it is a POST request.
if(strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0){
throw new Exception('Request method must be POST!');
}
//Make sure that the content type of the POST request has been set to application/json
$contentType = isset($_SERVER["CONTENT_TYPE"]) ? trim($_SERVER["CONTENT_TYPE"]) : '';
if(strcasecmp($contentType, 'application/json') != 0){
throw new Exception('Content type must be: application/json');
}
//Receive the RAW post data.
$content = trim(file_get_contents("php://input"));
//Attempt to decode the incoming RAW post data from JSON.
$decoded_json = json_decode($content, true);
//If json_decode failed, the JSON is invalid.
if(!is_array($decoded_json)){
problem( "Received content contained invalid JSON!" );
}
if ( empty($_SERVER["REMOTE_ADDR"]) ) {
problem("No REMOTE_ADDR");
}
else {
$ip = $_SERVER["REMOTE_ADDR"];
}
logextra( "We have a IP of $ip" );
// Check the key
$provided_key = $decoded_json['key'];
if ( isset( $provided_key ) and strlen( $provided_key ) === 45 and strlen( htmlspecialchars( stripslashes( strip_tags( $provided_key ) ) ) ) === 45 and ctype_xdigit( $provided_key ) ) {
$db_key = htmlspecialchars( stripslashes( strip_tags( $provided_key ) ) );
}
else {
problem("no valid key found");
}
logextra( "Found Valid \$key: $db_key" );
// Check if this is a known reservation
$query = "SELECT * FROM reservations WHERE reservations.key = '$db_key' ";
$result = @mysqli_query($connection, $query);
if($result === FALSE) {
problem( "No result returned for this query \"$query\"" );
}
$db = mysqli_fetch_array($result, MYSQLI_ASSOC);
logextra( "Getting this reservation from the db" );
if ( $db["key"] != $db_key ) {
problem("Could not find the reservation in the db");
}
logextra( "Found this reservation from the db" );
// Check title
$provided_title = urldecode( $decoded_json["title"] );
if ( empty($provided_title) or strlen($provided_title) > 100 ) {
problem("Title length is not OK");
}
logextra( "Title length is OK" );
$title = $provided_title;
// Check summary
$provided_summary = urldecode( $decoded_json["summary"] );
if ( empty($provided_summary) or strlen( $provided_summary) > 200 or strlen(str_replace('\\', '', $provided_summary)) > 100 ) {
problem("Summary length is not OK");
}
logextra( "Summary length is OK" );
$summary = $provided_summary;
// Check Adult flag
$provided_explicit = urldecode( $decoded_json["explicit"] );
if ( empty($provided_explicit) ) {
problem("explicit is missing");
}
logextra( "explicit exists" );
if ( strcmp($provided_explicit, "Yes") !== 0 ) {
logextra( "explicit is not yes" );
if ( strcmp($provided_explicit, "Clean") !== 0 ) {
problem("explicit needs to be either Yes or Clean");
}
}
logextra( "explicit is either Yes or Clean" );
$explicit = $provided_explicit;
if ( $explicit === "Clean" ) {
$explicit = 0;
}
else {
$explicit = 1;
}
// Check notes
$provided_notes = urldecode( $decoded_json["notes"] );
if ( empty($provided_notes) or strlen($provided_notes) > 100000 ) {
problem("Notes are missing not less than max");
}
logextra( "Notes are present and are under the max length" );
$notes = $provided_notes;
// Check episode Lisence
$provided_episode_license = urldecode( $decoded_json["episode_license"] );
if ( empty($provided_episode_license) or strlen($provided_episode_license) < 4 or strlen($provided_episode_license) > 11 ) {
problem("episode_license length is not fine");
}
logextra( "episode_license length is fine" );
$query = "SELECT short_name FROM licenses WHERE short_name = '$provided_episode_license'";
$result = @mysqli_query($connection, $query);
if($result === FALSE) {
problem( "No result returned for this query \"$query\"" );
}
else {
$db = mysqli_fetch_array($result, MYSQLI_ASSOC);
if ( empty($db["short_name"]) ) {
problem( "No result returned for this short_name:\"${provided_episode_license}\"" );
}
}
$episode_license = $provided_episode_license;
logextra( "episode_license is a valid value \"${episode_license}\"" );
// Check Series ID
$provided_series_id = urldecode( $decoded_json["series_id"] );
if ( ( empty($provided_series_id) and ($provided_series_id != 0 ) ) or (strlen($provided_series_id) > 3 ) ) {
problem("Series id is not in the correct range");
}
logextra( "series length is fine" );
if ( (strval(intval($provided_series_id)) != strval($provided_series_id)) ){
problem("series is not an int");
}
logextra( "series is int" );
$query = "SELECT COUNT(id) AS count_id FROM miniseries WHERE id='$provided_series_id'";
$result = @mysqli_query($connection, $query);
if($result === FALSE) {
problem( "No result returned for this query \"$query\"" );
}
else {
$db = mysqli_fetch_array($result, MYSQLI_ASSOC);
if ( empty($db["count_id"]) ) {
problem( "No result count returned for this miniseries:\"${provided_series_id}\"" );
}
$count_id = $db["count_id"];
if ( $count_id === 0 ) {
problem( "No result returned for this query \"$query\"" );
}
}
$series_id = $provided_series_id;
logextra( "Series ID was found \"$series_id\"" );
// Check Series Name
$provided_series_name = urldecode( $decoded_json["series_name"] );
if ( empty( $provided_series_name ) or strlen( $provided_series_name ) < 3 or strlen( $provided_series_name ) > 50 ) {
problem("series_name length is not correct");
}
$query = "SELECT name FROM miniseries WHERE id='$series_id'";
$result = @mysqli_query($connection, $query);
if($result === FALSE) {
problem( "No result returned for this query \"$query\"" );
}
else {
$db = mysqli_fetch_array($result, MYSQLI_ASSOC);
if ( empty($db["name"]) ) {
problem( "No result name returned for this miniseries:\"${series_id}\"" );
}
$db_series_name = $db["name"];
}
logextra( "Series name has been found in db: \"$db_series_name\"" );
if ( $provided_series_name != $db_series_name ) {
problem("Provided series_name \"$provided_series_name\" and db_series_name \"$db_series_name\" don't match.");
}
$series_name = $provided_series_name;
logextra( "Series Name was found \"$series_name\"" );
// Check Tags
$provided_tags = urldecode( $decoded_json["tags"] );
if ( empty( $provided_tags ) or strlen( $provided_tags ) < 3 or strlen( $provided_tags ) > 100 ) {
problem("Tags are not the correct length");
}
logextra( "Tags are the correct length" );
$tags = $provided_tags;
// Check Host ID
$provided_hostid = urldecode( $decoded_json["hostid"] );
if ( empty( $provided_hostid ) or ( $provided_hostid === 0 ) or ( $provided_hostid > 999 ) or ( strlen( $provided_hostid ) > 3 ) or ( strval( intval( $provided_hostid ) ) != strval( $provided_hostid ) ) ) {
problem("Host id is not in the correct range \"${provided_hostid}\"");
}
logextra( "host id length is fine" );
$query = "SELECT COUNT(hostid) AS count_hostid FROM hosts WHERE hostid='$provided_hostid'";
$result = @mysqli_query($connection, $query);
if($result === FALSE) {
problem( "No result returned for this query \"$query\"" );
}
else {
$db = mysqli_fetch_array($result, MYSQLI_ASSOC);
if ( empty($db["count_hostid"]) ) {
problem( "No result count returned for this hostid:\"${provided_hostid}\"" );
}
$count_hostid = $db["count_hostid"];
if ( $count_hostid === 0 ) {
problem( "No result returned for this query \"$query\"" );
}
}
$host_id = $provided_hostid;
logextra( "Host ID was found \"$host_id\"" );
// Check Host Name
$provided_host_name = urldecode( $decoded_json["host_name"] );
if ( empty( $provided_host_name ) or strlen( $provided_host_name ) < 3 or strlen( $provided_host_name ) > 50 ) {
problem("host_name length is not correct");
}
$query = "SELECT host FROM hosts WHERE hostid='$host_id'";
$result = @mysqli_query($connection, $query);
if($result === FALSE) {
problem( "No result returned for this query \"$query\"" );
}
else {
$db = mysqli_fetch_array($result, MYSQLI_ASSOC);
if ( empty($db["host"]) ) {
problem( "No result host name returned for this host_id:\"${host_id}\"" );
}
$db_host_name = $db["host"];
}
logextra( "Host name has been found in db: \"$db_host_name\"" );
if ( $provided_host_name != $db_host_name ) {
problem("Provided host_name \"$provided_host_name\" and db_host_name \"$db_host_name\" don't match.");
}
$host_name = $provided_host_name;
logextra( "Host ID was found \"$host_name\"" );
// Check Host Lisence
$provided_host_license = urldecode( $decoded_json["host_license"] );
if ( empty($provided_host_license) or strlen($provided_host_license) < 4 or strlen($provided_host_license) > 11 ) {
problem("host_license length is not fine");
}
logextra( "host_license length is fine" );
$query = "SELECT short_name FROM licenses WHERE short_name = '$provided_host_license'";
$result = @mysqli_query($connection, $query);
if($result === FALSE) {
problem( "No result returned for this query \"$query\"" );
}
else {
$db = mysqli_fetch_array($result, MYSQLI_ASSOC);
if ( empty($db["short_name"]) ) {
problem( "No result returned for this short_name:\"${provided_host_license}\"" );
}
}
$host_license = $provided_host_license;
logextra( "host_license is a valid value \"${host_license}\"" );
// Check Episode Date
$provided_ep_date = urldecode( $decoded_json["ep_date"] );
if ( !preg_match( "/^\d{4}-\d{2}-\d{2}$/", $provided_ep_date ) ) {
problem("ep_date fails the regex match \"${provided_ep_date}\"");
}
if ( strtotime( $provided_ep_date ) === false ) {
problem("ep_date didn't convert to date \"${provided_ep_date}\"");
}
$ep_date_epoch = strtotime( $provided_ep_date );
$ep_date = $provided_ep_date;
logextra( "ep_date checkes passed: $ep_date, $ep_date_epoch" );
// Check Host Profile
$provided_host_profile = urldecode( $decoded_json["host_profile"] );
if ( strlen( $provided_host_profile ) > 2000 ) {
problem("host_profile is not the correct length");
}
logextra( "host_profile is correct length" );
$host_profile = $provided_host_profile;
// Check Host email
$provided_email = urldecode( $decoded_json["email"] );
if ( empty( $provided_email ) or ( strlen( $provided_email ) > 100 ) ) {
problem("Host email is not in the correct length \"${provided_email}\"");
}
logextra( "host email length is fine" );
if (!filter_var($provided_email, FILTER_VALIDATE_EMAIL)) {
problem("Host email is not in the correct format. \"${provided_email}\"");
}
logextra( "host email passes validation $provided_email" );
$query = "SELECT COUNT(email) AS count_email FROM hosts WHERE email='$provided_email'";
$result = @mysqli_query($connection, $query);
if($result === FALSE) {
problem( "No result returned for this query \"$query\"" );
}
else {
$db = mysqli_fetch_array($result, MYSQLI_ASSOC);
if ( empty($db["count_email"]) ) {
problem( "The email address is not in the database:\"${provided_email}\"" );
}
$count_email = $db["count_email"];
if ( $count_email === 0 ) {
problem( "No result returned for this query \"$query\"" );
}
}
$email = $provided_email;
logextra( "Host email was found in the database \"$email\"" );
// Confirm the provided Host ID, hostname and email match in the db.
$query = "SELECT COUNT(hostid) AS count_hostid FROM hosts WHERE hostid='$host_id' AND host = '$host_name' AND email='$provided_email'";
$result = @mysqli_query($connection, $query);
if($result === FALSE) {
problem( "No result returned for this query \"$query\"" );
}
else {
$db = mysqli_fetch_array($result, MYSQLI_ASSOC);
if ( empty($db["count_hostid"]) ) {
problem( "The email address is not in the database:\"${provided_email}\"" );
}
$count_hostid = $db["count_hostid"];
if ( $count_hostid === 0 ) {
problem( "No result returned for this query \"$query\"" );
}
}
logextra( "Host email and host id were found in the database \"$host_id\", \"$host_name\", \"$email\", " );
// Check Duration
$provided_duration = urldecode( $decoded_json["duration"] );
if ( empty( $provided_duration ) or $provided_duration < 120 or $provided_duration > 43200 ) {
problem("Duration id is not in the correct range");
}
logextra( "Duration length is fine" );
$duration = $provided_duration;
logextra( "Duration was found \"$duration\"" );
// Check Episode Number
$provided_ep_num = intval( urldecode( $decoded_json["ep_num"] ) );
if ( !isset( $provided_ep_num ) ) {
problem("ep_num is not set ");
}
if ( empty( $provided_ep_num ) ) {
problem("ep_num is empty ");
}
// SELECT MAX(ep_num) FROM `reservations` → 3627
// SELECT MIN(ep_num) FROM `reservations` WHERE ep_num > 0 → 3582
$result = mysqli_query($connection, 'SELECT MAX(ep_num) FROM `reservations`;');
if (!isset($result)) {
problem("Can't get max eps from reservations");
}
$max_eps_array = mysqli_fetch_row( $result );
$max_eps = $max_eps_array[0];
mysqli_free_result($result);
$result = mysqli_query($connection, 'SELECT MIN(ep_num) FROM `reservations` WHERE ep_num > 0;');
if (!isset($result)) {
problem("Can't get min eps from reservations");
}
$min_eps_array = mysqli_fetch_row( $result );
$min_eps = $min_eps_array[0];
mysqli_free_result($result);
if ( $provided_ep_num < $min_eps ) {
problem("ep_num is too small");
}
if ( $provided_ep_num > $max_eps ) {
problem("ep_num is too big");
}
if ( intval($provided_ep_num) === 9999 ) {
problem("ep_num is a reserved show 9999");
}
if ( intval($provided_ep_num) === 0 ) {
problem("ep_num is 0");
}
$ep_num = intval($provided_ep_num);
// Workflow Check
// SHOW_SUBMITTED → SHOW_POSTED → MEDIA_TRANSCODED → UPLOADED_TO_IA → UPLOADED_TO_RSYNC_NET
$result = mysqli_query($connection, "SELECT ep_num FROM reservations WHERE ep_num='$ep_num' AND status='SHOW_SUBMITTED';");
if (!isset($result)) {
problem("Cant get info from reservations db");
}
$db_ep_num_array = mysqli_fetch_row( $result );
$db_ep_num = $db_ep_num_array[0];
mysqli_free_result($result);
if ( $db_ep_num != $ep_num ){
problem("Cant find $ep_num with status of SHOW_SUBMITTED");
}
$query = "SELECT COUNT(id) AS count_id FROM eps WHERE id = '$ep_num'";
$result = @mysqli_query($connection, $query);
if($result === FALSE) {
problem( "No result returned for this query \"$query\"" );
}
else {
$db = mysqli_fetch_array($result, MYSQLI_ASSOC);
$count_id = $db["count_id"];
if ( $count_id != 0 ) {
problem( "$count_id An existing episode has been posted with this episode id:\"${ep_num}\"" );
}
}
logextra( "The episode ID \"$ep_num\" has not already been assigned" );
/////////////////////////////////////////////////////////////////////////
// Update database - Actual Changes
// Update host_profile
$query = "SELECT profile FROM hosts WHERE hostid = '$host_id' and host = '$host_name'";
$result = @mysqli_query($connection, $query);
if($result === FALSE) {
problem( "No result returned for this query \"$query\"" );
}
$db = mysqli_fetch_array($result, MYSQLI_ASSOC);
if ( $db["profile"] != "$host_profile" ) {
logextra("The host_profile is different to that in the db");
$host_profile = mysqli_real_escape_string( $connection, $host_profile );
$query = "UPDATE `hosts` SET `profile` = '$host_profile' WHERE `hosts`.`hostid` = '$host_id';";
$result = mysqli_query($connection, $query );
if (!isset($result)) {
problem("could not update the host profile");
} else {
logextra( "Updating the host profile" );
}
}
logextra( "The profile is the same to that in the db" );
// Update license
$query = "SELECT license FROM hosts WHERE hostid = '$host_id' and host = '$host_name'";
$result = @mysqli_query($connection, $query);
if($result === FALSE) {
problem( "No result returned for this query \"$query\"" );
}
else {
$db = mysqli_fetch_array($result, MYSQLI_ASSOC);
if ( empty( $db["license"] ) ) {
problem( "No result returned for this license:\"${provided_episode_license}\"" );
}
}
$db_license = $db["license"];
if ( strcmp( $host_license, $db_license ) !== 0 ) {
logextra("The host_license \"$host_license\" is not the same to that in the db \"$db_license\"");
$host_license = mysqli_real_escape_string( $connection, $host_license );
$query = "UPDATE `hosts` SET `license` = '$host_license' WHERE `hosts`.`hostid` = '$host_id';";
$result = mysqli_query($connection, $query );
if (!isset($result)) {
problem("could not update the host license");
} else {
logextra( "Updating the host license" );
}
}
else {
logextra( "The host_license is the same to that in the db \"$host_license\"" );
}
$title = mysqli_real_escape_string( $connection, $title );
$summary = mysqli_real_escape_string( $connection, $summary );
$notes = mysqli_real_escape_string( $connection, $notes );
$tags = mysqli_real_escape_string( $connection, $tags );
$query_add = "INSERT INTO eps VALUES ('$ep_num', '{$ep_date}', '{$title}', '{$duration}', '{$summary}', '{$notes}', '{$host_id}', '{$series_id}', '{$explicit}', '{$episode_license}', '{$tags}', '0', '0', '0')";
$result = mysqli_query($connection, $query_add );
if(!$result) {
problem("DB problem - The show $ep_num was not added to the eps db.");
}
if (mysqli_errno( $connection )) {
$error = "MySQL error ".mysqli_errno( $connection ).": ".mysqli_error()."\n";
problem("MySQL error- The show $ep_num was not added to the eps db.\n$error");
}
logextra( "Added the entry: $query_add" );
$result = mysqli_query($connection, "SELECT `id` FROM `eps` WHERE `id` = '$ep_num';");
if (!isset($result)) {
problem("DB problem - The show $ep_num has not been added to the eps db");
}
$db_ep_num_array = mysqli_fetch_row( $result );
$db_ep_num = $db_ep_num_array[0];
mysqli_free_result($result);
if (mysqli_errno( $connection )) {
$error = "MySQL error ".mysqli_errno( $connection ).": ".mysqli_error()."\n";
problem("MySQL error- The show $ep_num was not added to the eps db.\n$error");
}
$result = mysqli_query($connection, "UPDATE reservations SET `status` = 'SHOW_POSTED' WHERE `ep_num` = '$ep_num' AND status='SHOW_SUBMITTED';" );
if (!isset($result)) {
problem("DB problem - The show $ep_num has not been added to the eps db");
}
if (mysqli_errno( $connection )) {
$error = "MySQL error ".mysqli_errno( $connection ).": ".mysqli_error()."\n";
problem("Could not update the show status to SHOW_POSTED in the db");
}
logextra( "Finished $ep_num ." );
?>

444
cms/assets.php Normal file
View File

@@ -0,0 +1,444 @@
<?php
## Recent Changes
# $allowed_content_type moved to include.php
require "/home/hpr/php/include.php";
date_default_timezone_set('UTC');
// curl --netrc-file $HOME/.netrc --verbose --request POST https://hub.hackerpublicradio.org/cms/assets.php --data-ascii @assets.json --header "Content-Type: application/json"
//Make sure that it is a POST request.
if ( strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0 && strcasecmp($_SERVER['REQUEST_METHOD'], 'GET') != 0 ){
throw new Exception('Request method must be POST!');
}
if ( strcasecmp($_SERVER['REQUEST_METHOD'], 'GET') == 0 ){
executeGET();
}
if ( strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') == 0 ){
executePOST();
}
function executeGET() {
global $connection;
$asset_array = array ();
if (isset($_GET['id'])) {
$id = $_GET['id'];
$result = mysqli_query($connection, 'SELECT MAX(id) FROM eps;');
if (!isset($result)) {
logextra( "unable to execute SELECT MAX(id) FROM eps;" );
problem( "2f1497d7734f5dc7ce04e1a343cbd4cb" );
die('Could not query:' . mysqli_error());
}
$maxhost_array = mysqli_fetch_row( $result );
$maxhost = $maxhost_array[0];
$num_get_args=0;
foreach($_GET as $k => $v) {
++$num_get_args;
}
if ( (strval(intval($id)) != strval($id)) OR ( intval($id) <= 0 ) OR ( intval($id) > $maxhost ) OR ( $num_get_args > 1 ) ){
logextra( "The id \"$id\" is not valid." );
problem( "6b070390632e12a962338d2e31464f9f" );
exit;
}
$query = "SELECT id FROM eps WHERE id = '$id'";
$result = @mysqli_query($connection, $query);
if($result === FALSE) {
logextra( "Cud not run SELECT id FROM eps WHERE id = $id" );
problem( "568dff032398640456d749135358a88b" );
}
else {
$db = mysqli_fetch_array($result, MYSQLI_ASSOC);
if ( empty($db["id"]) ) {
logextra( "The \"$id\" is not in the database" );
http_response_code(404);
die();
}
}
$ep_retrieve = "SELECT CONCAT( 'hpr', LPAD(CONVERT(`episode_id`,VARCHAR(4)),4,'0')) as episode, episode_id, filename, extension, `size`, sha1sum, mime_type
FROM assets
WHERE episode_id = '$id'
ORDER BY episode_id ASC;";
}
else {
$ep_retrieve = "SELECT CONCAT( 'hpr', LPAD(CONVERT(`episode_id`,VARCHAR(4)),4,'0')) as episode, episode_id, filename, extension, `size`, sha1sum, mime_type
FROM assets
ORDER BY episode_id ASC;";
}
if ($result = mysqli_query($connection, $ep_retrieve)) {
while ($row = mysqli_fetch_array($result)) {
$episode = $row['episode'];
$episode_id = $row['episode_id'];
$filename = $row['filename'];
$extension = $row['extension'];
$size = $row['size'];
$sha1sum = $row['sha1sum'];
$mime_type = $row['mime_type'];
$asset_array["$episode"][$filename] = array (
"episode_id" => $episode_id,
"filename" => $filename,
"extension" => $extension,
"size" => $size,
"sha1sum" => $sha1sum,
"mime_type" => $mime_type
);
}
}
header('Content-Type: application/json');
header("Content-disposition: inline; filename=hpr_stats.json");
echo json_encode($asset_array, JSON_NUMERIC_CHECK);
}
function executePOST() {
global $connection, $allowed_extensions, $allowed_content_type;
//Make sure that the content type of the POST request has been set to application/json
$contentType = isset($_SERVER["CONTENT_TYPE"]) ? trim($_SERVER["CONTENT_TYPE"]) : '';
if(strcasecmp($contentType, 'application/json') != 0){
throw new Exception('Content type must be: application/json');
}
//Receive the RAW post data.
$content = trim(file_get_contents("php://input"));
//Attempt to decode the incoming RAW post data from JSON.
$decoded = json_decode($content, true);
//If json_decode failed, the JSON is invalid.
if(!is_array($decoded)){
logextra( "Received content contained invalid JSON!" );
problem( "0e0e69415750c96f19d234f83270fdea" );
}
foreach($decoded['assets'] as $asset) {
// Check episode_id
if ( isset( $asset['episode_id'] ) ) {
$provided_episode_id = $asset['episode_id'];
$provided_episode_id = filter_var($provided_episode_id, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH);
$result = mysqli_query($connection, 'SELECT MAX(id) FROM eps;');
if (!isset($result)) {
logextra( "Can't connect to db" );
problem( "4c85d7b9e1d2eb741cdb60fd9f97b852" );
die('Could not query:' . mysqli_error());
}
$maxhost_array = mysqli_fetch_row( $result );
$maxhost = $maxhost_array[0];
$num_get_args=0;
foreach($_GET as $k => $v) {
++$num_get_args;
}
if (strval(intval($provided_episode_id)) != strval($provided_episode_id)) {
logextra( "ID is not a valid number because strval(intval($provided_episode_id)) != strval($provided_episode_id))" );
problem( "b2babb5bebde79e08ddf3c780c56615d" );
}
if ( intval($provided_episode_id) <= 0 ){
logextra( "ID is not a valid number because intval($provided_episode_id) <= 0" );
problem( "b245522d0582e61612e8b7dcdb0e0f4c" );
}
if ( intval($provided_episode_id) > $maxhost ){
logextra( "ID is not a valid number because intval($provided_episode_id) > $maxhost" );
problem( "c6feadcf0b6eda204cbfba6824aa2c7a" );
}
if ( $num_get_args > 1 ){
logextra( "ID is not a valid number because \$num_get_args: $num_get_args > 1" );
problem( "ba22518c5ced567cd0b855206985f036" );
}
$query = "SELECT id FROM eps WHERE id = '$provided_episode_id'";
$result = @mysqli_query($connection, $query);
if($result === FALSE) {
logextra( "No result returned for this query \"SELECT id FROM eps WHERE id = '$provided_episode_id'\"" );
problem( "fa0778750519cb140b4076c844b3ec78" );
}
else {
$db = mysqli_fetch_array($result, MYSQLI_ASSOC);
if ( empty($db["id"]) ) {
logextra( "No result returned for this id:\"${id}\"" );
problem( "1e09df9f3896da3e80507ea4538a4aca" );
}
}
$episode_id = $provided_episode_id;
logextra( "Found Valid \$episode_id: $episode_id" );
}
else {
logextra( "No episode_id provided" );
problem( "eae535cc88680a5bdab4e7bb4e54d83e" );
exit;
}
// Check filename
if ( isset( $asset['filename'] ) ) {
$provided_filename = $asset['filename'];
$provided_filename = filter_var($provided_filename, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH);
$this_dirname = dirname("$provided_filename", 2);
if ( empty($this_dirname) ) {
logextra( "no dirname" );
problem("b23ed28377cf4cf36cbf01931377ddc7");
}
if ( $this_dirname === "/" ) {
logextra( "dirname is root" );
problem("b90228a9c4d008eab57304bd36b75a08");
}
$this_basename = basename($provided_filename);
if ( empty($this_basename) ) {
logextra( "Cound not extract basename from filename: $provided_filename" );
problem("44b5022e3a32605c6b0afdf7699ed153");
}
if ( $this_basename !== $provided_filename ) {
logextra( "filename: $provided_filename does not match name:$this_basename" );
problem("832f0283544692bd6691e3802e67099c");
}
$this_ext = pathinfo($provided_filename, PATHINFO_EXTENSION);
if ( empty($this_ext) ) {
logextra( "The extension for \"$provided_filename\" is empty" );
problem("63166ba6572ac51b47804d9787152903");
}
$this_prefix =pathinfo($provided_filename, PATHINFO_FILENAME);
if ( empty($this_prefix) ) {
logextra( "The prefix for \"$provided_filename\" is empty" );
problem("9ad9a6b9e47e6960ff30442c3c808609");
}
if ( strlen($provided_filename) < 5 ) {
logextra( "The length of \"$provided_filename\" is less than 5" );
problem("e131ae01530f4098c299aaca0a6ee8e1");
}
if ( strlen($provided_filename) > 60 ) {
logextra( "The length of \"$provided_filename\" is greater than 60" );
problem("d90560ef4cac05954c93523d529ed20e");
}
if (!in_array( $this_ext, $allowed_extensions, true )) {
logextra( "This extension $this_ext, is not in the list of allowed_extensions" );
problem("dd98c84719083fb80fecbd0405504038 $this_ext");
}
$filename = $provided_filename;
logextra( "Found Valid \$filename: $filename" );
}
else {
logextra( "No filename provided" );
problem( "1edd3bcd2a16c152f0a97106372862f9" );
exit;
}
// Check extension
if ( isset( $asset['extension'] ) ) {
$provided_extension = $asset['extension'];
$provided_extension = filter_var($provided_extension, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH);
if ( $provided_extension !== $this_ext ) {
logextra( "The extensions provided \"$provided_extension\" and in the filename dont match \"$provided_filename\"" );
problem("ed58e1493aa56e0eaf50362cc6f64425");
}
if (!in_array( $provided_extension, $allowed_extensions, true )) {
logextra( "This extension $this_ext, is not in the list of allowed_extensions" );
problem("dc406b9151871e38ac69c2bf44fa74da");
}
$extension = $provided_extension;
logextra( "Found Valid \$extension: $extension" );
}
else {
logextra( "No extension provided" );
problem( "04b53ecd0ffa3faa68db1e541554903d" );
exit;
}
// Check size
if ( isset( $asset['size'] ) ) {
$provided_size = $asset['size'];
$provided_size = filter_var($provided_size, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH);
if (strval(intval($provided_size)) != strval($provided_size)) {
logextra( "The provided size is not a valid number because strval(intval($provided_size)) != strval($provided_size))" );
problem( "cc349935f0d80b40d5593b0fd54eaf58" );
}
if ( intval($provided_size) <= 0 ){
logextra( "The provided size is not a valid number because intval($provided_size) <= 0" );
problem( "91c54771bcf68f974c9aa8959f953dd8" );
}
if ( intval($provided_size) > 3500000000 ){
logextra( "The provided size is not a valid number because it's a lot larger than any show so far" );
problem( "8c085ec045b062e3a864e6fc22fceee4" );
}
$size = $provided_size;
logextra( "Found Valid \$size: $size" );
}
else {
logextra( "No size provided" );
problem( "a6d661c483c6d62d4df1df88a64118ce" );
exit;
}
// Check sha1sum
if ( isset( $asset['sha1sum'] ) ) {
$provided_sha1sum = $asset['sha1sum'];
$provided_sha1sum = filter_var($provided_sha1sum, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH);
if ( !preg_match('/^[0-9a-f]{40}$/i', $provided_sha1sum) ) {
logextra( "The format of the sha1sum is invalid $provided_sha1sum" );
problem( "e30c8db8a7e07ba69ef18f957f3e8843" );
}
$sha1sum = $provided_sha1sum;
logextra( "Found Valid \$sha1sum: $sha1sum" );
}
else {
logextra( "No sha1sum provided" );
problem( "cd3d303dbefec08016d567080116ef77" );
exit;
}
// Check mime_type
if ( isset( $asset['mime_type'] ) ) {
$provided_mime_type = $asset['mime_type'];
$provided_mime_type = filter_var($provided_mime_type, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH);
if ( !preg_match('/^[\w-]+\/[\w-]+(?:;\s*[\w-]+=[\w-]+)*$/i', $provided_mime_type) ) {
logextra( "The format of the mime_type is invalid \"$provided_mime_type\"" );
problem( "b36041a7d959730a9a541404db3b5025" );
}
list($content_type, $charset_type) = explode('; charset=', $provided_mime_type);
if ( !isset( $content_type ) ) {
logextra( "Can't find content_type in \"$provided_mime_type\"" );
problem( "c28ac580f5281ab2d97cbf052c92a25c" );
}
if ( empty( $content_type ) ) {
logextra( "Empty content_type in \"$provided_mime_type\"" );
problem( "fcec6e4039bc60daede3434e24c97a9f" );
}
if (!in_array( $content_type, $allowed_content_type, true )) {
logextra( "This content_type \"$content_type\", is not in the list of allowed_extensions" );
problem("4f29dcd2b3ef7efc5c4bc65be7a787ca");
}
if ( !isset( $charset_type ) ) {
logextra( "Can't find charset_type in \"$provided_mime_type\"" );
problem( "" );
}
if ( empty( $charset_type ) ) {
logextra( "Empty charset_type in \"$provided_mime_type\"" );
problem( "" );
}
$allowed_charset_type = array( "binary", "us-ascii", "utf-8");
if (!in_array( $charset_type, $allowed_charset_type, true )) {
logextra( "This charset_type \"$charset_type\", is not in the list of allowed_extensions" );
problem("");
}
$mime_type = $provided_mime_type;
logextra( "Found Valid \$mime_type: $mime_type" );
}
else {
logextra( "No mime_type provided" );
problem( "0c85eb982665a4978fea8f85611fbe88" );
exit;
}
// Check file_type
if ( isset( $asset['file_type'] ) ) {
$provided_file_type = $asset['file_type'];
$provided_file_type = filter_var($provided_file_type, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH);
if ( strlen($provided_file_type) < 5 ) {
logextra( "The length of \"$provided_file_type\" is less than 5" );
problem("60839aaddc82e0fbe4f5da269c361cf6");
}
if ( strlen($provided_file_type) > 140 ) {
logextra( "The length of \"$provided_file_type\" is greater than 140" );
problem("cafbb1b0c9955b92303fe34102890fa3");
}
$file_type = $provided_file_type;
logextra( "Found Valid \$file_type: $file_type" );
}
else {
logextra( "No file_type provided" );
problem( "a1b6a02d68533f9749da16164cbe704e" );
exit;
}
// Write values to db
//$episode_id is a number
$filename = mysqli_real_escape_string( $connection, $filename );
$extension = mysqli_real_escape_string( $connection, $extension );
//$size is a number
$sha1sum = mysqli_real_escape_string( $connection, $sha1sum );
$mime_type = mysqli_real_escape_string( $connection, $mime_type );
$file_type = mysqli_real_escape_string( $connection, $file_type );
$query_replace = "REPLACE INTO assets VALUES ('$episode_id','{$filename}','{$extension}','$size','{$sha1sum}','{$mime_type}','{$file_type}')";
$result = mysqli_query($connection, $query_replace );
if(!$result) {
problem("ERROR: DB problem - The asset for \"$episode_id\" with filename of \"$filename\" was not added to the eps db.");
}
else{
logextra( "mysql_query.result: \"$result\"\n" );
}
if (mysqli_errno( $connection )) {
$error = "MySQL error ".mysqli_errno( $connection ).": ".mysqli_error()."\n";
problem("ERROR: MySQL error- The asset for \"$episode_id\" with filename of \"$filename\" was not added to the eps db.\n$error");
}
logextra( "Finished ." );
}
http_response_code(200);
}
?>

View File

@@ -134,13 +134,13 @@
$justification_ascii = "EXTENDED";
}
$comment_author_name_json = json_encode( $comment_author_name );
$comment_author_name_json = json_encode( htmlentities( $comment_author_name ) );
$comment_title_json = json_encode( $comment_title );
$comment_title_json = json_encode( htmlentities( $comment_title ) );
$comment_text_json = json_encode( $comment_text );
$comment_text_json = json_encode( htmlentities( $comment_text ) );
$justification_json = json_encode( $justification );
$justification_json = json_encode( htmlentities( $justification ) );
$comment_timestamp_json = json_encode( $comment_timestamp );

View File

@@ -6,7 +6,6 @@ date_default_timezone_set('UTC');
if ( $_SERVER['REQUEST_METHOD'] !== 'GET' ) {
naughty("5c965856fd6e1af9256c04d400698fae not GET methog");
}
$num_get_args=0;
foreach($_GET as $k => $v) {
@@ -56,7 +55,6 @@ if (count($files) === 0) {
else {
$file = $files[0];
}
list($begin, $file_ip, $end) = explode('_', $file);
if ( ! filter_var($file_ip, FILTER_VALIDATE_IP) ) {
@@ -93,14 +91,14 @@ if ( $action === 'approve' ) {
echo json_encode($db);
exit;
}
if ( $action === 'publish' ) {
$comment = file_get_contents("$file");
$json = json_decode($comment, true);
require "/home/hpr/public_html_hub/cms/comment_checks.php";
require "/home/hpr/public_html/cms/comment_checks.php";
$ep_num = mysqli_real_escape_string( $connection, $ep_num );
$comment_timestamp_db = mysqli_real_escape_string( $connection, $comment_timestamp_db );

View File

@@ -1,11 +1,14 @@
<?php
require "/home/hpr/php/include.php";
date_default_timezone_set('UTC');
if (isset($_GET['id'])) {
$id = $_GET['id'];
$result = mysqli_query($connection, 'SELECT MAX(id) FROM eps;');
if (!isset($result)) {
die('Could not query:' . mysqli_error());
problem( "45f606ad99fe4fca7430b7b5bba1c681" );
die('Could not query:' . mysqli_error());
}
$maxhost_array = mysqli_fetch_row( $result );
$maxhost = $maxhost_array[0];
@@ -14,26 +17,25 @@ if (isset($_GET['id'])) {
++$num_get_args;
}
if ( (strval(intval($id)) != strval($id)) OR ( intval($id) <= 0 ) OR ( intval($id) > $maxhost ) OR ( $num_get_args > 1 ) ){
exit;
problem( "ea860134910fecd136229e45262709d7" );
exit;
}
$query = "SELECT id FROM eps WHERE id = '$id'";
$result = @mysqli_query($connection, $query);
if($result === FALSE) {
call412( "a9564ebc3289b7a14551baf8ad5ec60a" );
problem( "dc5b8dae7ea2a7e70ac0b7ea65ce2d12" );
}
else {
$db = mysqli_fetch_array($result, MYSQLI_ASSOC);
if ( empty($db["id"]) ) {
call412( "a9564ebc3289b7a14551baf8ad5ec60a" );
problem( "2b6462ff2389405a796066dfc73ccf55" );
}
}
}
else {
call412( "a9564ebc3289b7a14551baf8ad5ec60a" );
problem( "ae1f3471af22d32d3bf2efc9130a00ae" );
exit;
}
Header('Content-type: text/tab-separated-values');
header("Content-disposition: inline; filename=say.txt");
$ep_retrieve = "SELECT
UNIX_TIMESTAMP(eps.date) AS timestamp,
@@ -88,42 +90,62 @@ if ($result = mysqli_query($connection, $ep_retrieve)) {
}
}
}
$HPR_summary = "This is Hacker Public Radio episode $id for " . date("l", $date) . " the " . date("jS", $date) . " of " . date("F Y", $date) . ". Todays show is entitled. ${title}.";
else {
http_response_code(404);
die();
}
$synopsis = "This is Hacker Public Radio episode $id for " . date("l", $date) . " the " . date("jS", $date) . " of " . date("F Y", $date) . ". Todays show is entitled. ${title}.";
if ($series > "0"){
$series_query = mysqli_query($connection, "SELECT name, description FROM miniseries WHERE id = '$series'");
$series_result = mysqli_fetch_array($series_query);
$series_title = $series_result['name'];
$desc = $series_result['description'];
$HPR_summary = "${HPR_summary} It is part of the series \"$series_title\"";
$synopsis = "${synopsis} It is part of the series \"$series_title\"";
}
$HPR_summary = "${HPR_summary} ${host_notes} and is about " . round($duration/60) . " minutes long. It carries ";
$synopsis = "${synopsis} ${host_notes} and is about " . round($duration/60) . " minutes long. It carries ";
if ($explicit == 0) {
$HPR_summary = "${HPR_summary} a clean flag. ";
$synopsis = "${synopsis} a clean flag. ";
$explicit = "Clean";
}
else{
$HPR_summary = "${HPR_summary} an explicit flag. ";
$synopsis = "${synopsis} an explicit flag. ";
$explicit = "Explicit";
}
if ( !empty( $summary ) ) {
$HPR_summary = "${HPR_summary}. The summary is. $summary";
$synopsis = "${synopsis}. The summary is. $summary";
}
if (strcmp($license, "CC-BY-SA" ) !== 0) {
$HPR_summary = "${HPR_summary}. Todays show is licensed under a $license_long_name license.";
$synopsis = "${synopsis}. Todays show is licensed under a $license_long_name license.";
}
$HPR_summary = str_replace($host,$espeak_name,$HPR_summary);
$synopsis = str_replace($host,$espeak_name,$synopsis);
echo "HPR_summary: ${HPR_summary}\n";
echo "HPR_album: Hacker Public Radio\n";
echo "HPR_artist: ${host}\n";
echo "HPR_hostid: ${hostid}\n";
echo "HPR_comment: https://hackerpublicradio.org ${explicit}; $summary\n";
echo "HPR_genre: Podcast\n";
echo "HPR_license: ${license}\n";
echo "HPR_title: ${title}\n";
echo "HPR_track: $id\n";
echo "HPR_year: " . date("Y", $date) . "\n";
echo "HPR_duration: ${duration}\n";
echo "HPR_explicit: ${explicit}\n";
?>
// --------------------------------------------
// Display the results
$arr = array(
'genre' => "Podcast",
'album' => "Hacker Public Radio",
'track' => "$id",
'year' => date("Y", $date),
'date' => date("Y-m-d", $date),
'artist' => "${host}",
'hostid' => "${hostid}",
'title' => "${title}",
'duration' => "${duration}",
'license' => "${license}",
'explicit' => "${explicit}",
'summary' => "${summary}",
'comment' => "https://hackerpublicradio.org ${explicit}; $summary",
'synopsis' => "${synopsis}"
);
header('Content-Type: application/json');
header("Content-disposition: inline; filename=hpr_stats.json");
echo json_encode($arr);
mysqli_close($connection);

View File

@@ -42,7 +42,7 @@ $current_episode_number = $current_episode_array[1];
// Populate array with future shows and reservations
$show_array = array ();
// REQUEST_UNVERIFIED → SHOW_SUBMITTED → METADATA_PROCESSED → SHOW_POSTED → MEDIA_TRANSCODED → UPLOADED_TO_IA → UPLOADED_TO_RSYNC_NET
// REQUEST_UNVERIFIED → SHOW_SUBMITTED → METADATA_PROCESSED → SHOW_POSTED → MEDIA_TRANSCODED → UPLOADED_TO_IA → UPLOADED_TO_CCDN
$ep_retrieve = "SELECT hosts.host, eps.id, eps.title, eps.date FROM eps, hosts WHERE eps.valid=1 AND eps.hostid = hosts.hostid AND eps.date >= '$current_episode_date' ORDER BY date DESC";
$ep_retrieve = "SELECT
@@ -73,14 +73,17 @@ if ($result = mysqli_query($connection, $ep_retrieve)) {
else {
$status = "Reserved";
}
$show_array[$id] = array ( "date" => date('Y-m-d', strtotime($date) ),
$show_array[$id] = array (
"id" => $id,
"date" => date('Y-m-d', strtotime($date) ),
"title" => $title,
"host" => $host,
"status" => $status
"status" => $status,
"workflow" => $status
);
}
}
// REQUEST_UNVERIFIED → SHOW_SUBMITTED → METADATA_PROCESSED → SHOW_POSTED → MEDIA_TRANSCODED → UPLOADED_TO_IA → UPLOADED_TO_RSYNC_NET
// REQUEST_UNVERIFIED → SHOW_SUBMITTED → METADATA_PROCESSED → SHOW_POSTED → MEDIA_TRANSCODED → UPLOADED_TO_IA → UPLOADED_TO_CCDN
// Populate array with currently processing shows EMAIL_LINK_CLICKED
$ep_retrieve = "
@@ -101,10 +104,12 @@ if ($result = mysqli_query($connection, $ep_retrieve)) {
$id = $row['ep_num'];
$date = $row['ep_date'];
$status = $row['status'];
$show_array[$id] = array ( "date" => date('Y-m-d', strtotime($date) ),
$show_array[$id] = array ( "id" => $id,
"date" => date('Y-m-d', strtotime($date) ),
"title" => $status,
"host" => "Unverified",
"status" => "Processing"
"status" => "Processing",
"workflow" => $status
);
}
}
@@ -119,10 +124,12 @@ if ($result = mysqli_query($connection, $ep_retrieve)) {
$date = $row['ep_date'];
$seconds_to_expiration = $row['seconds_to_expiration'];
$minutes = floor($seconds_to_expiration / 60) + 1;
$show_array[$id] = array ( "date" => date('Y-m-d', strtotime($date) ),
$show_array[$id] = array ( "id" => $id,
"date" => date('Y-m-d', strtotime($date) ),
"title" => " Available again in $minutes minutes",
"host" => "Unverified",
"status" => "Locked"
"status" => "Locked",
"workflow" => "Locked"
);
}
}
@@ -150,10 +157,12 @@ if ($result = mysqli_query($connection, $ep_retrieve)) {
$date = $row['date'];
$title = $row['title'];
$host = $row['host'];
$show_array[$id] = array ( "date" => date('Y-m-d', strtotime($date) ),
$show_array[$id] = array ( "id" => $id,
"date" => date('Y-m-d', strtotime($date) ),
"title" => $title,
"host" => $host,
"status" => "Finished"
"status" => "Finished",
"workflow" => "Finished"
);
}
}

126
cms/shownotes.php Normal file
View File

@@ -0,0 +1,126 @@
<?php
require "/home/hpr/php/include.php";
date_default_timezone_set('UTC');
if (isset($_GET['id'])) {
$id = $_GET['id'];
$result = mysqli_query($connection, 'SELECT MAX(id) FROM eps;');
if (!isset($result)) {
problem( "d7f47a123af3ea10628ce44d2146b40e" );
die('Could not query:' . mysqli_error());
}
$maxhost_array = mysqli_fetch_row( $result );
$maxhost = $maxhost_array[0];
$num_get_args=0;
foreach($_GET as $k => $v) {
++$num_get_args;
}
if ( (strval(intval($id)) != strval($id)) OR ( intval($id) <= 0 ) OR ( intval($id) > $maxhost ) OR ( $num_get_args > 1 ) ){
problem( "5d45cb79dd9426e7e4ab5595ac647a62" );
exit;
}
$query = "SELECT id FROM eps WHERE id = '$id'";
$result = @mysqli_query($connection, $query);
if($result === FALSE) {
problem( "b26e5cea3779b66c76bf1c3c266e1a51" );
}
else {
$db = mysqli_fetch_array($result, MYSQLI_ASSOC);
if ( empty($db["id"]) ) {
problem( "a5d5eab30290ba4460ceb337add11821" );
}
}
}
else {
problem( "39122c23e90fcf5cb9ca9e03a5c5a3c5" );
exit;
}
$ep_retrieve = "SELECT
UNIX_TIMESTAMP(eps.date) AS timestamp,
eps.title,
eps.duration,
eps.summary,
eps.tags,
hosts.host,
hosts.email,
hosts.license as host_license,
hosts.profile,
eps.hostid,
eps.series,
eps.notes,
miniseries.name as series_name,
eps.license as show_license,
eps.explicit
FROM
eps
LEFT JOIN hosts ON eps.hostid = hosts.hostid
LEFT JOIN miniseries ON miniseries.id = eps.series
WHERE
hosts.valid = '1'
AND eps.id = '$id'";
if ($result = mysqli_query($connection, $ep_retrieve)) {
while ($row = mysqli_fetch_array($result)) {
$date = $row['timestamp'];
$title = $row['title'];
$duration = $row['duration'];
$summary = $row['summary'];
$host = $row['host'];
$hostid = $row['hostid'];
$host_email = $row['email'];
$host_license = $row['host_license'];
$host_profile = $row['profile'];
$series = $row['series'];
$series_name = $row['series_name'];
$show_license = $row['show_license'];
$explicit = $row['explicit'];
$tags = $row['tags'];
$notes = $row['notes'];
}
}
else {
http_response_code(404);
die();
}
if ($explicit == 0) {
$explicit = "Clean";
}
else{
$explicit = "Explicit";
}
// --------------------------------------------
// Display the results
$arr = array(
'host' => array (
'Host_ID' => "${hostid}",
'Host_Name' => "${host}",
'Host_Email' => "${host_email}",
'Host_License' => "${host_license}",
'Host_Profile' => "${host_profile}"
),
'episode' => array (
'Title' => "${title}",
'Summary' => "${summary}",
'Explicit' => "${explicit}",
'Show_License' => "${show_license}",
'Series' => "${series}",
'Series_Name' => "${series_name}",
'Tags' => "${tags}",
'Show_Notes' => "${notes}"
),
'metadata' => array (
'Episode_Number' => "${id}",
'Episode_Date' => date("Y-m-d", $date)
)
);
header('Content-Type: application/json');
header("Content-disposition: inline; filename=hpr_stats.json");
echo json_encode($arr);
mysqli_close($connection);

View File

@@ -1,325 +1,133 @@
<?php
require "/home/hpr/php/include.php";
$format="json";
date_default_timezone_set('UTC');
if (isset($_GET['format'])){
if ($_GET['format'] === "txt") {
$format="txt";
}
if ($_GET['format'] === "json") {
$format="json";
}
if ($_GET['format'] === "xml") {
$format="xml";
}
if ($_GET['format'] === "csv") {
$format="csv";
}
$current_time = time();
$total_twt_shows = 300;
$twt_duration = 232812;
$start_date_twt = "2005-09-19";
$rename_date_hpr = "2007-12-31";
// --------------------------------------------
// Get the number of published shows
$ep_retrieve = "SELECT max(date) as latest_episode_release_date, max(id) as latest_episode_id from eps WHERE eps.date <= UTC_DATE();";
if ($result = mysqli_query($connection, $ep_retrieve)) {
$data=mysqli_fetch_assoc($result);
$latest_episode_release_date = $data['latest_episode_release_date'];
$latest_episode_id = intval( $data['latest_episode_id'] );
}
$twat_startdate = abs(strtotime(date("c")) - strtotime("2005-09-19T00:00:00Z"));
$twat_years = floor($twat_startdate / (365*60*60*24));
$twat_months = floor(($twat_startdate - $twat_years * 365*60*60*24) / (30*60*60*24));
$twat_days = floor(($twat_startdate - $twat_years * 365*60*60*24 - $twat_months*30*60*60*24)/ (60*60*24));
$agetwat = $twat_startdate;
// --------------------------------------------
// Shows in the Future Feed
$hpr_startdate = abs(strtotime(date("c")) - strtotime("2007-12-31T00:00:00Z"));
$hpr_years = floor($hpr_startdate / (365*60*60*24));
$hpr_months = floor(($hpr_startdate - $hpr_years * 365*60*60*24) / (30*60*60*24));
$hpr_days = floor(($hpr_startdate - $hpr_years * 365*60*60*24 - $hpr_months*30*60*60*24)/ (60*60*24));
$agehpr = $hpr_startdate;
$ep_retrieve = "SELECT COUNT( DISTINCT id ) as num_future_shows FROM eps WHERE eps.date > UTC_DATE() AND duration <> 0";
if ($result = mysqli_query($connection, $ep_retrieve)) {
$data=mysqli_fetch_assoc($result);
$num_future_shows = intval( $data['num_future_shows'] );
}
// --------------------------------------------
// Shows in the Reserve Queue
$last_show = mysqli_query($connection, "SELECT max(date), max(id) from eps");
$last_show_date = mysqli_fetch_row($last_show);
$totalshows=$last_show_date[1]+300;
$totalhpr=$last_show_date[1];
$ep_retrieve = "SELECT COUNT(*) as num_reserve_shows FROM reservations WHERE status='RESERVE_SHOW_SUBMITTED'";
if ($result = mysqli_query($connection, $ep_retrieve)) {
$data=mysqli_fetch_assoc($result);
$num_reserve_shows = intval( $data['num_reserve_shows'] );
}
// --------------------------------------------
// Get the number of hosts
$ep_retrieve = "SELECT hostid FROM hosts WHERE valid = '1' ORDER BY hostid ASC";
$num_of_hosts = "1";
$ep_retrieve = "SELECT COUNT( DISTINCT hostid ) as num_hosts FROM hosts WHERE valid = '1'";
if ($result = mysqli_query($connection, $ep_retrieve)) {
while ($row = mysqli_fetch_array($result)) {
$hostid = $row['hostid'];
$last_show = mysqli_query($connection, "SELECT max(date) from eps WHERE hostid='$hostid' AND valid = '1'");
$last_show_date = mysqli_fetch_row($last_show);
if (!empty($last_show_date[0])) {
$num_of_hosts++;
}
}
$data=mysqli_fetch_assoc($result);
$num_hosts = intval( $data['num_hosts'] );
}
// --------------------------------------------
// Get first free slot
// Get the next free slot
$query = mysqli_query($connection, "SELECT id + 1 FROM eps mo
WHERE NOT EXISTS
(
SELECT NULL
FROM eps mi
WHERE mi.id = mo.id + 1
)
ORDER BY
id
LIMIT 1");
$next_show_num_array = mysqli_fetch_row($query);
$next_show_num = $next_show_num_array[0];
$next_free_slot = "https://repo.anhonesthost.net/HPR/hpr_hub/issues/71";
// --------------------------------------------
// Get latest published show
$query = mysqli_query($connection, "SELECT max(date), max(id) from eps WHERE eps.date <= UTC_DATE()");
$current_episode_array = mysqli_fetch_row($query);
$current_episode_date = $current_episode_array[0];
$current_episode_number = $current_episode_array[1];
// --------------------------------------------
// Populate array with future shows
$un_delivered = -1;
$days_to_undelivered = 0;
$show_array = array ();
$ep_retrieve = "SELECT hosts.host, eps.id, eps.title, eps.date FROM eps, hosts WHERE eps.valid=1 AND eps.hostid = hosts.hostid AND eps.date >= '$current_episode_date' ORDER BY date DESC";
// playtime
$ep_retrieve = "SELECT SUM(duration) as total_playtime_all_hpr_shows_seconds FROM `eps`";
if ($result = mysqli_query($connection, $ep_retrieve)) {
while ($row = mysqli_fetch_array($result)) {
$id = $row['id'];
$id = fixid($id);
$date = $row['date'];
$title = $row['title'];
$host = $row['host'];
if ( file_exists("./eps/hpr$id.ogg") and file_exists("./eps/hpr$id.spx") and file_exists("./eps/hpr$id.mp3") ) {
$delivered = 1;
if ($un_delivered === -1 ) {
$days_to_undelivered++;
}
}
else {
$delivered = 0;
$un_delivered = $days_to_undelivered;
}
$show_array[$id] = array ( "date" => $date,
"title" => $title,
"host" => $host,
"delivered" => $delivered
);
}
$data=mysqli_fetch_assoc($result);
$total_playtime_all_hpr_shows_seconds = intval( $data['total_playtime_all_hpr_shows_seconds'] );
$total_playtime_all_shows_seconds = $twt_duration + $total_playtime_all_hpr_shows_seconds;
}
// --------------------------------------------
// Calculate the time to the next show
$next_show_date = date('Y-m-d', strtotime($show_array[$next_show_num - 1 ]["date"] . ' + 1 weekday'));
$days_to_wait = floor((strtotime($next_show_date) - strtotime(gmdate('Y-m-d')))/(60*60*24));
$total_playtime_all_shows_human_readable = convertSecToTime( $total_playtime_all_shows_seconds );
// --------------------------------------------
// Future Hosts
$ep_retrieve = "SELECT DISTINCT hostid FROM eps WHERE eps.date > UTC_DATE()";
// Comments
// $ep_retrieve = "SELECT id, type, date, title, notes, host, hostid FROM eps WHERE valid = '1' ORDER BY id DESC LIMIT 10";
if ($result = mysqli_query($connection, $ep_retrieve)) {
$num_future_hosts = mysqli_num_rows($result);
}
// --------------------------------------------
// Shows in the Queue
$ep_retrieve = "SELECT DISTINCT id FROM eps WHERE eps.date > UTC_DATE() AND duration <> 0";
// $ep_retrieve = "SELECT id, type, date, title, notes, host, hostid FROM eps WHERE valid = '1' ORDER BY id DESC LIMIT 10";
if ($result = mysqli_query($connection, $ep_retrieve)) {
$num_future_shows = mysqli_num_rows($result);
}
// --------------------------------------------
// Shows in the Queue
$result=mysqli_query($connection, "SELECT count(*) as total FROM `reservations` WHERE `status` LIKE 'SHOW_SUBMITTED' ORDER BY `ip` ASC ");
$data=mysqli_fetch_assoc($result);
$num_submitted_shows = $data['total'];
// --------------------------------------------
// Duration of all shows
$result=mysqli_query($connection, "SELECT SUM(duration) as total_duration FROM `eps`");
$data=mysqli_fetch_assoc($result);
$total_duration = $data['total_duration'];
$human_total_duration = convertSecToTime($total_duration);
// --------------------------------------------
// Reserve Shows
$result = mysqli_query($connection, 'SELECT COUNT(*) FROM reservations WHERE status="RESERVE_SHOW_SUBMITTED";');
if (!isset($result)) {
naughty("cac33babd8a24edd138087ef7e4280f6");
}
$reserve_array = mysqli_fetch_row( $result );
$reserve_shows = $reserve_array[0];
mysqli_free_result($result);
// --------------------------------------------
// workflow
$ep_retrieve = "SELECT status, COUNT(*) AS total FROM reservations WHERE status != 'RESERVE_SHOW_SUBMITTED' GROUP BY status;";
$workflow="\"workflow\": {";
if ($result = mysqli_query($connection, $ep_retrieve)) {
while ($row = mysqli_fetch_array($result)) {
$status = $row['status'];
$total = $row['total'];
$workflow=$workflow."
\"$status\": \"$total\",";
}
}
$workflow=$workflow."
\"RESERVE_SHOW_SUBMITTED\": \"$reserve_shows\"
},";
// --------------------------------------------
// duration
$result=mysqli_query($connection, "SELECT SUM(duration) as total_duration FROM `eps`");
$data=mysqli_fetch_assoc($result);
$total_duration = $data['total_duration'];
$human_total_duration = convertSecToTime($total_duration);
// --------------------------------------------
// Unprocessed comments
$comment_directory = "/home/hpr/comments";
$unprocessed_comments = iterator_count(new FilesystemIterator("$comment_directory", FilesystemIterator::SKIP_DOTS));
// --------------------------------------------
// Shows on the FTP server
// Calculations
$new_shows=0;
if ($handle = opendir('/home/hpr/upload')) {
while (false !== ($entry = readdir($handle))) {
if ( $entry != "." && $entry != "..") {
$new_shows++;
}
$total_released_shows = $latest_episode_id + $total_twt_shows;
$total_submitted_shows = $latest_episode_id + $total_twt_shows + $num_future_shows + $num_reserve_shows;
$project_age_seconds = strtotime( $start_date_twt ) - $current_time;
$project_age = convertSecToTime( $project_age_seconds );
// --------------------------------------------
// Display the workflow
$workflow = array();
$ep_retrieve = "SELECT status, COUNT(*) AS total FROM reservations WHERE status != 'RESERVE_SHOW_SUBMITTED' GROUP BY status;";
if ($result = mysqli_query($connection, $ep_retrieve)) {
while ($row = mysqli_fetch_array($result)) {
$workflow[ $row['status'] ] = $row['total'];
}
closedir($handle);
}
// --------------------------------------------
// Produce output
// Shows in the Reserve Queue
$current_time = time();
$ep_retrieve = "SELECT COUNT(*) AS num_unprocessed_shows FROM reservations WHERE status!='RESERVE_SHOW_SUBMITTED' AND status!='REQUEST_UNVERIFIED'";
if ($result = mysqli_query($connection, $ep_retrieve)) {
$data=mysqli_fetch_assoc($result);
$num_unprocessed_shows = intval( $data['num_unprocessed_shows'] );
}
// --------------------------------------------
// Display the results
$arr = array(
'stats_generated' => $current_time,
'start_date_twt' => $start_date_twt,
'rename_date_hpr' => $rename_date_hpr,
'latest_episode_release_date' => $latest_episode_release_date,
'project_age' => $project_age,
'latest_episode_id' => $latest_episode_id,
'total_twt_shows' => $total_twt_shows,
'total_released_shows' => $total_released_shows,
'num_future_shows' => $num_future_shows,
'num_reserve_shows' => $num_reserve_shows,
'total_submitted_shows' => $total_submitted_shows,
'num_hosts' => $num_hosts,
'days_to_next_free_slot' => "todo",
'total_playtime_all_shows_seconds' => $total_playtime_all_shows_seconds,
'total_playtime_all_shows_human_readable' => $total_playtime_all_shows_human_readable,
'next_free_slot' => $next_free_slot,
'unprocessed_comments' => $unprocessed_comments,
'num_unprocessed_shows' => $num_unprocessed_shows,
'show_processing_workflow' => $workflow
);
header('Content-Type: application/json');
header("Content-disposition: inline; filename=hpr_stats.json");
echo json_encode($arr);
if ($format === "json") {
header('Content-Type: application/json');
header("Content-disposition: inline; filename=hpr_stats.json");
echo "{
\"stats_generated\": ".$current_time.",
\"age\": {
\"start\": \"2005-09-19T00:00:00Z\",
\"rename\": \"2007-12-31T00:00:00Z\",
\"since_start\": {
\"total_seconds\": ".$agetwat.",
\"years\": ".$twat_years.",
\"months\": ".$twat_months.",
\"days\": ".$twat_days."
},
\"since_rename\": {
\"total_seconds\": ".$agehpr.",
\"years\": ".$hpr_years.",
\"months\": ".$hpr_months.",
\"days\": ".$hpr_days."
}
},
\"shows\": {
\"total\": ".$totalshows.",
\"twat\": 300,
\"hpr\": ".$totalhpr.",
\"duration\": ".$total_duration.",
\"human_duration\": \"".$human_total_duration."\"
},
\"hosts\": ".$num_of_hosts.",
\"slot\": {
\"next_free\": ".$days_to_wait.",
\"no_media\": ".$un_delivered."
},
$workflow
\"queue\": {
\"number_future_hosts\": ".$num_future_hosts.",
\"number_future_shows\": ".$num_future_shows.",
\"unprocessed_comments\": ".$unprocessed_comments.",
\"submitted_shows\": ".$num_submitted_shows.",
\"shows_in_workflow\": ".$new_shows.",
\"reserve\": ".$reserve_shows."
}
}
";
}
elseif ($format === "xml") {
header("Content-type: application/xml");
header("Content-disposition: inline; filename=hpr_stats.xml");
echo "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
<stats>
<stats_generated>".$current_time."</stats_generated>
<age>
<start>2005-09-19T00:00:00Z</start>
<rename>2007-12-31T00:00:00Z</rename>
<since_start>
<total_seconds>".$agetwat."</total_seconds>
<years>". $twat_years."</years>
<months>".$twat_months."</months>
<days>".$twat_days."</days>
</since_start>
<since_rename>
<total_seconds>".$agehpr."</total_seconds>
<years>".$hpr_years."</years>
<months>".$hpr_months."</months>
<days>".$hpr_days."</days>
</since_rename>
</age>
<shows>
<total>".$totalshows."</total>
<twat>300</twat>
<hpr>".$totalhpr."</hpr>
<duration>".$total_duration."</duration>
<human_duration>".$human_total_duration."</human_duration>
</shows>
<hosts>".$num_of_hosts."</hosts>
<slot>
<next_free>".$days_to_wait."</next_free>
<no_media>".$un_delivered."</no_media>
</slot>
<queue>
<number_future_hosts>".$num_future_hosts."</number_future_hosts>
<number_future_shows>".$num_future_shows."</number_future_shows>
<unprocessed_comments>".$unprocessed_comments."</unprocessed_comments>
<submitted_shows>".$num_submitted_shows."</submitted_shows>
<shows_in_workflow>".$new_shows."</shows_in_workflow>
<reserve>".$reserve_shows."</reserve>
</queue>
</stats>";
}
elseif ($format === "csv") {
header("Content-type: text/csv");
header("Content-disposition: inline; filename=hpr_stats.csv");
print "stats_generated,age_start,age_rename,age_since_start_total_seconds,age_since_start_years,age_since_start_months,age_since_start_days,age_since_rename_total_seconds,age_since_rename_years,age_since_rename_months,age_since_rename_days,shows_total,shows_twat,shows_hpr,hosts,slot_next_free,slot_no_media,number_future_hosts,number_future_shows,unprocessed_comments,shows_in_workflow,queue_reserve,duration\n";
print "${current_time},2005-09-19T00:00:00Z,2007-12-31T00:00:00Z,${agetwat},${twat_years},${twat_months},${twat_days},${agehpr},${hpr_years},${hpr_months},${hpr_days},${totalshows},300,${totalhpr},${num_of_hosts},${days_to_wait},${un_delivered},${num_future_hosts},${num_future_shows},${unprocessed_comments},${new_shows},${reserve_shows},${total_duration}\n";
}
else {
Header('Content-type: text/tab-separated-values');
header("Content-disposition: inline; filename=hpr_stats.txt");
printf("Started:\t%d years, %d months, %d days ago (2005-09-19)\n", $twat_years, $twat_months, $twat_days);
printf("Renamed HPR:\t%d years, %d months, %d days ago (2007-12-31)\n", $hpr_years, $hpr_months, $hpr_days);
echo "Total Shows:\t" . $totalshows . "\n";
echo "Total TWAT:\t300\n";
echo "Total HPR:\t" . $totalhpr . "\n";
echo "Duration:\t" . $total_duration . "\n";
echo "Human Duration:\t" . $human_total_duration . "\n";
echo "HPR Hosts:\t${num_of_hosts}\n";
echo "Days to next free slot:\t${days_to_wait}\n";
echo "Hosts in Queue:\t$num_future_hosts\n";
echo "Shows in Queue:\t$num_future_shows\n";
echo "Comments waiting approval:\t$unprocessed_comments\n";
echo "Files on the FTP Server:\t$new_shows\n";
echo "Number of Reserve Shows:\t$reserve_shows\n";
echo "Days until show without media:\t$un_delivered\n";
print "$current_time,$agetwat,$agehpr,$totalshows,300,$totalhpr,$num_of_hosts,$days_to_wait,$num_future_hosts,$num_future_shows,$unprocessed_comments,$new_shows,$reserve_shows,$un_delivered";
// print_r($show_array);
}
mysqli_close($connection);
?>

View File

@@ -203,7 +203,7 @@ if ($result = mysqli_query($connection, $ep_retrieve)) {
$show_array[$id] = array ( "date" => date('Y-m-d', strtotime($date) ),
"title" => $title,
"host" => $host,
"status" => "Waiting for media"
"status" => "Distributing media to the ccdn"
);
}
}
@@ -267,6 +267,17 @@ There are only <strong><?php echo "${days_to_wait}"; ?></strong> days to wait un
<li>Then <a aria-label="Help on Adding an episode" href="<?php echo "${baseurl}about.html#adding_an_episode"; ?>">fill in a form</a>.</li>
</ol>
<h2 id="scheduling_guidelines">Scheduling Guidelines</h2>
<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 <strong>upcoming two weeks</strong>.</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="https://hackerpublicradio.org/about.html#reserve_queue">Reserve Queue</a>.</li>
</ol>
<h2 id="reserve_queue">Add to the Reserve Queue ?</h2>
<p>

106
hub/ccdn.php Normal file
View File

@@ -0,0 +1,106 @@
<?php
# request.php > request_confirm.php > upload.php > upload_confirm.php
## Recent Changes
# Support multiple mirrors
require "/home/hpr/php/include.php";
$ip = $_SERVER["REMOTE_ADDR"];
if ( $_SERVER['REQUEST_METHOD'] !== 'GET' && $_SERVER['REQUEST_METHOD'] !== 'HEAD' ) {
naughty("34522f7b9ba88b319afa9f063b98905c");
}
if ( empty($_SERVER["REMOTE_ADDR"]) ) {
naughty("021dbd5f91f40918ea68fd0ca1a2e381");
}
if ( count($_GET) !== 1 ) {
naughty("f5df1c0d9accb7868e601b60cf2f5c06");
}
if ( isset($_GET["filename"]) ) {
$filename = $_GET["filename"];
if ( empty($filename) ) {
naughty("ef50f1353583f371903daba3abc9b3a4");
}
$filename = filter_var($filename, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH);
$dirname = dirname("$filename", 2);
if ( empty($dirname) ) {
naughty("71b6b14eef459e0404311257dad8ffe4");
}
if ( $dirname === "/" ) {
naughty("9e342e30b911e1ac3c5e831a6da6116b");
}
if ( !(
strcmp($dirname, "/correspondents") === 0 or
strcmp($dirname, "/eps") === 0 or
strcmp($dirname, "/series") === 0 )
) {
naughty("f157a8f5fedc7282c7a6469931223dbf");
}
$name = basename($filename); // To get file name
if ( empty($name) ) {
naughty("27ece7c2dba5caa5885ef40737270fd3");
}
$ext = pathinfo($filename, PATHINFO_EXTENSION); // To get extension
if ( empty($ext) ) {
naughty("c6a4329fe2f3c2c739ec666e956c2c5f");
}
$prefix = pathinfo($filename, PATHINFO_FILENAME); // File name without extension
if ( empty($prefix) ) {
naughty("f398399ec10ec9ab4b5b23ae43f21b01");
}
if ( strlen($filename) < 5 ) {
naughty("f78bf180af9239fc7fcf5fbc2b13b59b");
}
if ( strlen($filename) > 60 ) {
naughty("38e9a0cf7f650ac62e75c08269c9d913");
}
if (!in_array( $ext, $allowed_extensions, true )) {
logextra( "This extension $this_ext, is not in the list of allowed_extensions" );
naughty("545e49f7ac913863c6c3db40670ebb9d");
}
}
else {
naughty("0b78322e1c5010ba289c20250ca1fb1f");
}
if (
strcmp($dirname, "/eps") === 0 and
in_array( $ext, $allowed_extensions_common, true )
) {
$mirrors = array_merge($ccdn_hosts_common, $ccdn_hosts_complete);
}
else {
$mirrors = $ccdn_hosts_complete;
}
$mirror = 'https://' . $mirrors[ array_rand($mirrors, 1) ];
$pos = strpos($mirror, 'archive.org');
if ($pos !== false) {
$path = $mirror . '/download/' . $prefix . '/' . $name;
} else {
$path = $mirror . $filename;
}
logextra( "Sending request to ${path}" );
header("location:${path}");
?>

View File

@@ -25,8 +25,6 @@ if (strcasecmp('public', $_POST["anti_spam_question"]) !== 0) {
naughty("6aef421ce05e3ac34f4cd91ae3248a45");
}
$comment_directory = "/home/hpr/comments";
if ( ! file_exists( $comment_directory ) ) {
# Looks like the comments directory has not been created
naughty("d5342ea497f701656433e81fb5eed064");
@@ -273,7 +271,7 @@ $mailer->addBCC('admin@hobbypublicradio.org');
$mailer->AddAddress('comments@hackerpublicradio.org');
$mailer->isHTML(false);
$mailer->Subject = "New Comment for show hpr${eps_id} on ${ep_date} ${key}";
$mailer->MsgHTML("<p>hpr${eps_id} on ${ep_date} by ${host} with the title <strong>${title}</strong> \"${summary}\"</p>
$mailer->MsgHTML("<p><a href=\"https://hackerpublicradio.org/eps/hpr${eps_id}\">hpr${eps_id}</a> on ${ep_date} by ${host} with the title <strong>${title}</strong> \"${summary}\"</p>
<p>
See attachment for the json comment file.
</p>
@@ -318,6 +316,8 @@ $justification
);
$mailer->AltBody = "hpr${eps_id} on ${ep_date} by ${host} with the title ${title} \"${summary}\"</p>
https://hackerpublicradio.org/eps/hpr${eps_id}
See attachment for the json comment file.
There are now ${unprocessed_comments} unprocessed comments.

View File

@@ -46,6 +46,7 @@
<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="https://repo.anhonesthost.net/HPR/">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>

View File

@@ -2,7 +2,7 @@
<html lang="en">
<head>
<title>Hacker Public Radio ~ The Technology Community Podcast</title>
<base href="https://hub.hackerpublicradio.org/">
<base href="https://hub.hackerpublicradio.org/">
<meta charset="utf-8" />
<meta http-equiv="X-Clacks-Overhead" content="GNU Terry Pratchett" />
<meta http-equiv="last-modified" content="Thu, 28 Dec 2023 17:36:30 +0000">
@@ -17,10 +17,17 @@
#list1, #list2, #list3 {
display:none;
}
table.upload {
border-collapse: separate;
border-spacing: 0 0.75rem;
}
table.upload td {
vertical-align: top;
}
</style>
<link rel="shortcut icon" href="https://hackerpublicradio.org/hpr.ico" >
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Opus RSS" href="https://hackerpublicradio.org/hpr_opus_rss.php" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Ogg Vorbis RSS" href="https://hackerpublicradio.org/hpr_ogg_rss.php" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Speex RSS" href="https://hackerpublicradio.org/hpr_spx_rss.php" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio MP3 RSS" href="https://hackerpublicradio.org/hpr_mp3_rss.php" />
<link rel="alternate" type="application/rss+xml" title="Hacker Public Radio Comments RSS" href="https://hackerpublicradio.org/comments.rss" />
<link rel="license" title="CC BY-SA 4.0" href="https://creativecommons.org/licenses/by-sa/4.0/" />
@@ -57,7 +64,7 @@
<li><a href="https://hackerpublicradio.org/index.html"><strong>Home »</strong></a></li>
<li><a href="https://hackerpublicradio.org/syndication.html">Get Shows</a></li>
<li><a href="https://hackerpublicradio.org/about.html#so_you_want_to_record_a_podcast">Give Shows</a></li>
<li><a href="https://hackerpublicradio.org/help_out.html">Contribute</a></li>
<li><a href="https://hackerpublicradio.org/about.html#how_to_help">Contribute</a></li>
<li><a href="https://hackerpublicradio.org/tags.html">Tags</a></li>
<li><a href="https://hackerpublicradio.org/about.html">About</a></li>
<li><a href="https://hackerpublicradio.org/search.html">Search</a></li>
@@ -65,5 +72,6 @@
</nav>
</header>
<main id="maincontent">

11596
hub/quill.js Normal file

File diff suppressed because it is too large Load Diff

980
hub/quill.snow.css Normal file
View File

@@ -0,0 +1,980 @@
/*!
* Quill Editor v1.3.7
* https://quilljs.com/
* Copyright (c) 2014, Jason Chen
* Copyright (c) 2013, salesforce.com
*
*
*/
/*
Copyright (c) 2017-2024, Slab
Copyright (c) 2014, Jason Chen
Copyright (c) 2013, salesforce.com
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
.ql-container {
box-sizing: border-box;
font-family: Helvetica, Arial, sans-serif;
font-size: 13px;
height: 100%;
margin: 0px;
position: relative;
}
.ql-container.ql-disabled .ql-tooltip {
visibility: hidden;
}
.ql-container.ql-disabled .ql-editor ul[data-checked] > li::before {
pointer-events: none;
}
.ql-clipboard {
left: -100000px;
height: 1px;
overflow-y: hidden;
position: absolute;
top: 50%;
}
.ql-clipboard p {
margin: 0;
padding: 0;
}
.ql-editor {
box-sizing: border-box;
line-height: 1.42;
height: 100%;
outline: none;
overflow-y: auto;
padding: 12px 15px;
tab-size: 4;
-moz-tab-size: 4;
text-align: left;
white-space: pre-wrap;
word-wrap: break-word;
}
.ql-editor > * {
cursor: text;
}
.ql-editor p,
.ql-editor ol,
.ql-editor ul,
.ql-editor pre,
.ql-editor blockquote,
.ql-editor h1,
.ql-editor h2,
.ql-editor h3,
.ql-editor h4,
.ql-editor h5,
.ql-editor h6 {
margin: 0;
padding: 0;
counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;
}
.ql-editor ol,
.ql-editor ul {
padding-left: 1.5em;
}
.ql-editor ol > li,
.ql-editor ul > li {
list-style-type: none;
}
.ql-editor ul > li::before {
content: '\2022';
}
.ql-editor ul[data-checked=true],
.ql-editor ul[data-checked=false] {
pointer-events: none;
}
.ql-editor ul[data-checked=true] > li *,
.ql-editor ul[data-checked=false] > li * {
pointer-events: all;
}
.ql-editor ul[data-checked=true] > li::before,
.ql-editor ul[data-checked=false] > li::before {
color: #777;
cursor: pointer;
pointer-events: all;
}
.ql-editor ul[data-checked=true] > li::before {
content: '\2611';
}
.ql-editor ul[data-checked=false] > li::before {
content: '\2610';
}
.ql-editor li::before {
display: inline-block;
white-space: nowrap;
width: 1.2em;
}
.ql-editor li:not(.ql-direction-rtl)::before {
margin-left: -1.5em;
margin-right: 0.3em;
text-align: right;
}
.ql-editor li.ql-direction-rtl::before {
margin-left: 0.3em;
margin-right: -1.5em;
}
.ql-editor ol li:not(.ql-direction-rtl),
.ql-editor ul li:not(.ql-direction-rtl) {
padding-left: 1.5em;
}
.ql-editor ol li.ql-direction-rtl,
.ql-editor ul li.ql-direction-rtl {
padding-right: 1.5em;
}
.ql-editor ol li {
counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;
counter-increment: list-0;
}
.ql-editor ol li:before {
content: counter(list-0, decimal) '. ';
}
.ql-editor ol li.ql-indent-1 {
counter-increment: list-1;
}
.ql-editor ol li.ql-indent-1:before {
content: counter(list-1, lower-alpha) '. ';
}
.ql-editor ol li.ql-indent-1 {
counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;
}
.ql-editor ol li.ql-indent-2 {
counter-increment: list-2;
}
.ql-editor ol li.ql-indent-2:before {
content: counter(list-2, lower-roman) '. ';
}
.ql-editor ol li.ql-indent-2 {
counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9;
}
.ql-editor ol li.ql-indent-3 {
counter-increment: list-3;
}
.ql-editor ol li.ql-indent-3:before {
content: counter(list-3, decimal) '. ';
}
.ql-editor ol li.ql-indent-3 {
counter-reset: list-4 list-5 list-6 list-7 list-8 list-9;
}
.ql-editor ol li.ql-indent-4 {
counter-increment: list-4;
}
.ql-editor ol li.ql-indent-4:before {
content: counter(list-4, lower-alpha) '. ';
}
.ql-editor ol li.ql-indent-4 {
counter-reset: list-5 list-6 list-7 list-8 list-9;
}
.ql-editor ol li.ql-indent-5 {
counter-increment: list-5;
}
.ql-editor ol li.ql-indent-5:before {
content: counter(list-5, lower-roman) '. ';
}
.ql-editor ol li.ql-indent-5 {
counter-reset: list-6 list-7 list-8 list-9;
}
.ql-editor ol li.ql-indent-6 {
counter-increment: list-6;
}
.ql-editor ol li.ql-indent-6:before {
content: counter(list-6, decimal) '. ';
}
.ql-editor ol li.ql-indent-6 {
counter-reset: list-7 list-8 list-9;
}
.ql-editor ol li.ql-indent-7 {
counter-increment: list-7;
}
.ql-editor ol li.ql-indent-7:before {
content: counter(list-7, lower-alpha) '. ';
}
.ql-editor ol li.ql-indent-7 {
counter-reset: list-8 list-9;
}
.ql-editor ol li.ql-indent-8 {
counter-increment: list-8;
}
.ql-editor ol li.ql-indent-8:before {
content: counter(list-8, lower-roman) '. ';
}
.ql-editor ol li.ql-indent-8 {
counter-reset: list-9;
}
.ql-editor ol li.ql-indent-9 {
counter-increment: list-9;
}
.ql-editor ol li.ql-indent-9:before {
content: counter(list-9, decimal) '. ';
}
.ql-editor .ql-indent-1:not(.ql-direction-rtl) {
padding-left: 3em;
}
.ql-editor li.ql-indent-1:not(.ql-direction-rtl) {
padding-left: 4.5em;
}
.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right {
padding-right: 3em;
}
.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right {
padding-right: 4.5em;
}
.ql-editor .ql-indent-2:not(.ql-direction-rtl) {
padding-left: 6em;
}
.ql-editor li.ql-indent-2:not(.ql-direction-rtl) {
padding-left: 7.5em;
}
.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right {
padding-right: 6em;
}
.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right {
padding-right: 7.5em;
}
.ql-editor .ql-indent-3:not(.ql-direction-rtl) {
padding-left: 9em;
}
.ql-editor li.ql-indent-3:not(.ql-direction-rtl) {
padding-left: 10.5em;
}
.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right {
padding-right: 9em;
}
.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right {
padding-right: 10.5em;
}
.ql-editor .ql-indent-4:not(.ql-direction-rtl) {
padding-left: 12em;
}
.ql-editor li.ql-indent-4:not(.ql-direction-rtl) {
padding-left: 13.5em;
}
.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right {
padding-right: 12em;
}
.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right {
padding-right: 13.5em;
}
.ql-editor .ql-indent-5:not(.ql-direction-rtl) {
padding-left: 15em;
}
.ql-editor li.ql-indent-5:not(.ql-direction-rtl) {
padding-left: 16.5em;
}
.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right {
padding-right: 15em;
}
.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right {
padding-right: 16.5em;
}
.ql-editor .ql-indent-6:not(.ql-direction-rtl) {
padding-left: 18em;
}
.ql-editor li.ql-indent-6:not(.ql-direction-rtl) {
padding-left: 19.5em;
}
.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right {
padding-right: 18em;
}
.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right {
padding-right: 19.5em;
}
.ql-editor .ql-indent-7:not(.ql-direction-rtl) {
padding-left: 21em;
}
.ql-editor li.ql-indent-7:not(.ql-direction-rtl) {
padding-left: 22.5em;
}
.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right {
padding-right: 21em;
}
.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right {
padding-right: 22.5em;
}
.ql-editor .ql-indent-8:not(.ql-direction-rtl) {
padding-left: 24em;
}
.ql-editor li.ql-indent-8:not(.ql-direction-rtl) {
padding-left: 25.5em;
}
.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right {
padding-right: 24em;
}
.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right {
padding-right: 25.5em;
}
.ql-editor .ql-indent-9:not(.ql-direction-rtl) {
padding-left: 27em;
}
.ql-editor li.ql-indent-9:not(.ql-direction-rtl) {
padding-left: 28.5em;
}
.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right {
padding-right: 27em;
}
.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right {
padding-right: 28.5em;
}
.ql-editor .ql-video {
display: block;
max-width: 100%;
}
.ql-editor .ql-video.ql-align-center {
margin: 0 auto;
}
.ql-editor .ql-video.ql-align-right {
margin: 0 0 0 auto;
}
.ql-editor .ql-bg-black {
background-color: #000;
}
.ql-editor .ql-bg-red {
background-color: #e60000;
}
.ql-editor .ql-bg-orange {
background-color: #f90;
}
.ql-editor .ql-bg-yellow {
background-color: #ff0;
}
.ql-editor .ql-bg-green {
background-color: #008a00;
}
.ql-editor .ql-bg-blue {
background-color: #06c;
}
.ql-editor .ql-bg-purple {
background-color: #93f;
}
.ql-editor .ql-color-white {
color: #fff;
}
.ql-editor .ql-color-red {
color: #e60000;
}
.ql-editor .ql-color-orange {
color: #f90;
}
.ql-editor .ql-color-yellow {
color: #ff0;
}
.ql-editor .ql-color-green {
color: #008a00;
}
.ql-editor .ql-color-blue {
color: #06c;
}
.ql-editor .ql-color-purple {
color: #93f;
}
.ql-editor .ql-font-serif {
font-family: Georgia, Times New Roman, serif;
}
.ql-editor .ql-font-monospace {
font-family: Monaco, Courier New, monospace;
}
.ql-editor .ql-size-small {
font-size: 0.75em;
}
.ql-editor .ql-size-large {
font-size: 1.5em;
}
.ql-editor .ql-size-huge {
font-size: 2.5em;
}
.ql-editor .ql-direction-rtl {
direction: rtl;
text-align: inherit;
}
.ql-editor .ql-align-center {
text-align: center;
}
.ql-editor .ql-align-justify {
text-align: justify;
}
.ql-editor .ql-align-right {
text-align: right;
}
.ql-editor.ql-blank::before {
color: rgba(0,0,0,0.6);
content: attr(data-placeholder);
font-style: italic;
left: 15px;
pointer-events: none;
position: absolute;
right: 15px;
}
.ql-snow.ql-toolbar:after,
.ql-snow .ql-toolbar:after {
clear: both;
content: '';
display: table;
}
.ql-snow.ql-toolbar button,
.ql-snow .ql-toolbar button {
background: none;
border: none;
cursor: pointer;
display: inline-block;
float: left;
height: 24px;
padding: 3px 5px;
width: 28px;
}
.ql-snow.ql-toolbar button svg,
.ql-snow .ql-toolbar button svg {
float: left;
height: 100%;
}
.ql-snow.ql-toolbar button:active:hover,
.ql-snow .ql-toolbar button:active:hover {
outline: none;
}
.ql-snow.ql-toolbar input.ql-image[type=file],
.ql-snow .ql-toolbar input.ql-image[type=file] {
display: none;
}
.ql-snow.ql-toolbar button:hover,
.ql-snow .ql-toolbar button:hover,
.ql-snow.ql-toolbar button:focus,
.ql-snow .ql-toolbar button:focus,
.ql-snow.ql-toolbar button.ql-active,
.ql-snow .ql-toolbar button.ql-active,
.ql-snow.ql-toolbar .ql-picker-label:hover,
.ql-snow .ql-toolbar .ql-picker-label:hover,
.ql-snow.ql-toolbar .ql-picker-label.ql-active,
.ql-snow .ql-toolbar .ql-picker-label.ql-active,
.ql-snow.ql-toolbar .ql-picker-item:hover,
.ql-snow .ql-toolbar .ql-picker-item:hover,
.ql-snow.ql-toolbar .ql-picker-item.ql-selected,
.ql-snow .ql-toolbar .ql-picker-item.ql-selected {
color: #06c;
}
.ql-snow.ql-toolbar button:hover .ql-fill,
.ql-snow .ql-toolbar button:hover .ql-fill,
.ql-snow.ql-toolbar button:focus .ql-fill,
.ql-snow .ql-toolbar button:focus .ql-fill,
.ql-snow.ql-toolbar button.ql-active .ql-fill,
.ql-snow .ql-toolbar button.ql-active .ql-fill,
.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill,
.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill,
.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill,
.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill,
.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill,
.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill,
.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill,
.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill,
.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill,
.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill,
.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill,
.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill,
.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill,
.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill,
.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,
.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,
.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,
.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,
.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,
.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,
.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,
.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill {
fill: #06c;
}
.ql-snow.ql-toolbar button:hover .ql-stroke,
.ql-snow .ql-toolbar button:hover .ql-stroke,
.ql-snow.ql-toolbar button:focus .ql-stroke,
.ql-snow .ql-toolbar button:focus .ql-stroke,
.ql-snow.ql-toolbar button.ql-active .ql-stroke,
.ql-snow .ql-toolbar button.ql-active .ql-stroke,
.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke,
.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke,
.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke,
.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke,
.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke,
.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke,
.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,
.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,
.ql-snow.ql-toolbar button:hover .ql-stroke-miter,
.ql-snow .ql-toolbar button:hover .ql-stroke-miter,
.ql-snow.ql-toolbar button:focus .ql-stroke-miter,
.ql-snow .ql-toolbar button:focus .ql-stroke-miter,
.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter,
.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter,
.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,
.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,
.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,
.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,
.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,
.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,
.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,
.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter {
stroke: #06c;
}
@media (pointer: coarse) {
.ql-snow.ql-toolbar button:hover:not(.ql-active),
.ql-snow .ql-toolbar button:hover:not(.ql-active) {
color: #444;
}
.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill,
.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill,
.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill,
.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill {
fill: #444;
}
.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke,
.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke,
.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter,
.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter {
stroke: #444;
}
}
.ql-snow {
box-sizing: border-box;
}
.ql-snow * {
box-sizing: border-box;
}
.ql-snow .ql-hidden {
display: none;
}
.ql-snow .ql-out-bottom,
.ql-snow .ql-out-top {
visibility: hidden;
}
.ql-snow .ql-tooltip {
position: absolute;
transform: translateY(10px);
}
.ql-snow .ql-tooltip a {
cursor: pointer;
text-decoration: none;
}
.ql-snow .ql-tooltip.ql-flip {
transform: translateY(-10px);
}
.ql-snow .ql-formats {
display: inline-block;
vertical-align: middle;
}
.ql-snow .ql-formats:after {
clear: both;
content: '';
display: table;
}
.ql-snow .ql-stroke {
fill: none;
stroke: #444;
stroke-linecap: round;
stroke-linejoin: round;
stroke-width: 2;
}
.ql-snow .ql-stroke-miter {
fill: none;
stroke: #444;
stroke-miterlimit: 10;
stroke-width: 2;
}
.ql-snow .ql-fill,
.ql-snow .ql-stroke.ql-fill {
fill: #444;
}
.ql-snow .ql-empty {
fill: none;
}
.ql-snow .ql-even {
fill-rule: evenodd;
}
.ql-snow .ql-thin,
.ql-snow .ql-stroke.ql-thin {
stroke-width: 1;
}
.ql-snow .ql-transparent {
opacity: 0.4;
}
.ql-snow .ql-direction svg:last-child {
display: none;
}
.ql-snow .ql-direction.ql-active svg:last-child {
display: inline;
}
.ql-snow .ql-direction.ql-active svg:first-child {
display: none;
}
.ql-snow .ql-editor h1 {
font-size: 2em;
}
.ql-snow .ql-editor h2 {
font-size: 1.5em;
}
.ql-snow .ql-editor h3 {
font-size: 1.17em;
}
.ql-snow .ql-editor h4 {
font-size: 1em;
}
.ql-snow .ql-editor h5 {
font-size: 0.83em;
}
.ql-snow .ql-editor h6 {
font-size: 0.67em;
}
.ql-snow .ql-editor a {
text-decoration: underline;
}
.ql-snow .ql-editor blockquote {
border-left: 4px solid #ccc;
margin-bottom: 5px;
margin-top: 5px;
padding-left: 16px;
}
.ql-snow .ql-editor code,
.ql-snow .ql-editor pre {
background-color: #f0f0f0;
border-radius: 3px;
}
.ql-snow .ql-editor pre {
white-space: pre-wrap;
margin-bottom: 5px;
margin-top: 5px;
padding: 5px 10px;
}
.ql-snow .ql-editor code {
font-size: 85%;
padding: 2px 4px;
}
.ql-snow .ql-editor pre.ql-syntax {
background-color: #23241f;
color: #f8f8f2;
overflow: visible;
}
.ql-snow .ql-editor img {
max-width: 100%;
}
.ql-snow .ql-picker {
color: #444;
display: inline-block;
float: left;
font-size: 14px;
font-weight: 500;
height: 24px;
position: relative;
vertical-align: middle;
}
.ql-snow .ql-picker-label {
cursor: pointer;
display: inline-block;
height: 100%;
padding-left: 8px;
padding-right: 2px;
position: relative;
width: 100%;
}
.ql-snow .ql-picker-label::before {
display: inline-block;
line-height: 22px;
}
.ql-snow .ql-picker-options {
background-color: #fff;
display: none;
min-width: 100%;
padding: 4px 8px;
position: absolute;
white-space: nowrap;
}
.ql-snow .ql-picker-options .ql-picker-item {
cursor: pointer;
display: block;
padding-bottom: 5px;
padding-top: 5px;
}
.ql-snow .ql-picker.ql-expanded .ql-picker-label {
color: #ccc;
z-index: 2;
}
.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill {
fill: #ccc;
}
.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke {
stroke: #ccc;
}
.ql-snow .ql-picker.ql-expanded .ql-picker-options {
display: block;
margin-top: -1px;
top: 100%;
z-index: 1;
}
.ql-snow .ql-color-picker,
.ql-snow .ql-icon-picker {
width: 28px;
}
.ql-snow .ql-color-picker .ql-picker-label,
.ql-snow .ql-icon-picker .ql-picker-label {
padding: 2px 4px;
}
.ql-snow .ql-color-picker .ql-picker-label svg,
.ql-snow .ql-icon-picker .ql-picker-label svg {
right: 4px;
}
.ql-snow .ql-icon-picker .ql-picker-options {
padding: 4px 0px;
}
.ql-snow .ql-icon-picker .ql-picker-item {
height: 24px;
width: 24px;
padding: 2px 4px;
}
.ql-snow .ql-color-picker .ql-picker-options {
padding: 3px 5px;
width: 152px;
}
.ql-snow .ql-color-picker .ql-picker-item {
border: 1px solid transparent;
float: left;
height: 16px;
margin: 2px;
padding: 0px;
width: 16px;
}
.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg {
position: absolute;
margin-top: -9px;
right: 0;
top: 50%;
width: 18px;
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before,
.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before,
.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before {
content: attr(data-label);
}
.ql-snow .ql-picker.ql-header {
width: 98px;
}
.ql-snow .ql-picker.ql-header .ql-picker-label::before,
.ql-snow .ql-picker.ql-header .ql-picker-item::before {
content: 'Normal';
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {
content: 'Heading 1';
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {
content: 'Heading 2';
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {
content: 'Heading 3';
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {
content: 'Heading 4';
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {
content: 'Heading 5';
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
content: 'Heading 6';
}
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {
font-size: 2em;
}
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {
font-size: 1.5em;
}
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {
font-size: 1.17em;
}
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {
font-size: 1em;
}
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {
font-size: 0.83em;
}
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
font-size: 0.67em;
}
.ql-snow .ql-picker.ql-font {
width: 108px;
}
.ql-snow .ql-picker.ql-font .ql-picker-label::before,
.ql-snow .ql-picker.ql-font .ql-picker-item::before {
content: 'Sans Serif';
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before {
content: 'Serif';
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before {
content: 'Monospace';
}
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before {
font-family: Georgia, Times New Roman, serif;
}
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before {
font-family: Monaco, Courier New, monospace;
}
.ql-snow .ql-picker.ql-size {
width: 98px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label::before,
.ql-snow .ql-picker.ql-size .ql-picker-item::before {
content: 'Normal';
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before {
content: 'Small';
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before {
content: 'Large';
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before {
content: 'Huge';
}
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before {
font-size: 10px;
}
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before {
font-size: 18px;
}
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before {
font-size: 32px;
}
.ql-snow .ql-color-picker.ql-background .ql-picker-item {
background-color: #fff;
}
.ql-snow .ql-color-picker.ql-color .ql-picker-item {
background-color: #000;
}
.ql-toolbar.ql-snow {
border: 1px solid #ccc;
box-sizing: border-box;
font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;
padding: 8px;
}
.ql-toolbar.ql-snow .ql-formats {
margin-right: 15px;
}
.ql-toolbar.ql-snow .ql-picker-label {
border: 1px solid transparent;
}
.ql-toolbar.ql-snow .ql-picker-options {
border: 1px solid transparent;
box-shadow: rgba(0,0,0,0.2) 0 2px 8px;
}
.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label {
border-color: #ccc;
}
.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options {
border-color: #ccc;
}
.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected,
.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover {
border-color: #000;
}
.ql-toolbar.ql-snow + .ql-container.ql-snow {
border-top: 0px;
}
.ql-snow .ql-tooltip {
background-color: #fff;
border: 1px solid #ccc;
box-shadow: 0px 0px 5px #ddd;
color: #444;
padding: 5px 12px;
white-space: nowrap;
}
.ql-snow .ql-tooltip::before {
content: "Visit URL:";
line-height: 26px;
margin-right: 8px;
}
.ql-snow .ql-tooltip input[type=text] {
display: none;
border: 1px solid #ccc;
font-size: 13px;
height: 26px;
margin: 0px;
padding: 3px 5px;
width: 170px;
}
.ql-snow .ql-tooltip a.ql-preview {
display: inline-block;
max-width: 200px;
overflow-x: hidden;
text-overflow: ellipsis;
vertical-align: top;
}
.ql-snow .ql-tooltip a.ql-action::after {
border-right: 1px solid #ccc;
content: 'Edit';
margin-left: 16px;
padding-right: 8px;
}
.ql-snow .ql-tooltip a.ql-remove::before {
content: 'Remove';
margin-left: 8px;
}
.ql-snow .ql-tooltip a {
line-height: 26px;
}
.ql-snow .ql-tooltip.ql-editing a.ql-preview,
.ql-snow .ql-tooltip.ql-editing a.ql-remove {
display: none;
}
.ql-snow .ql-tooltip.ql-editing input[type=text] {
display: inline-block;
}
.ql-snow .ql-tooltip.ql-editing a.ql-action::after {
border-right: 0px;
content: 'Save';
padding-right: 0px;
}
.ql-snow .ql-tooltip[data-mode=link]::before {
content: "Enter link:";
}
.ql-snow .ql-tooltip[data-mode=formula]::before {
content: "Enter formula:";
}
.ql-snow .ql-tooltip[data-mode=video]::before {
content: "Enter video:";
}
.ql-snow a {
color: #06c;
}
.ql-container.ql-snow {
border: 1px solid #ccc;
}

7
hub/redirect.php Normal file
View File

@@ -0,0 +1,7 @@
<?php
# request.php > request_confirm.php > upload.php > upload_confirm.php
#require "/home/hpr/php/include.php";
?>
<?php
header('location:https://hub.hackerpublicradio.org/calendar.php');
?>

View File

@@ -1,5 +1,9 @@
<?php
# request.php > request_confirm.php > upload.php > upload_confirm.php
## Recent Change
# Support for WYSIWYG https://github.com/slab/quill BSD-3-Clause license
require "/home/hpr/php/include.php";
if ( $_SERVER['REQUEST_METHOD'] !== 'GET' and empty($_SERVER["REMOTE_ADDR"]) and count($_GET) !== 1 ) {
@@ -100,20 +104,23 @@ if ( !file_exists( $image_url )) {
// Main
$body="give";
// $body="give";
//$body="index_full";
include 'header.html';
?>
<body>
<link href="quill.snow.css" rel="stylesheet">
<script src="quill.js"></script>
<main id="maincontent">
<hr />
<?php
if ( $ep_num == 9999 ) {
echo "<h1>Uploading to the Reserve Queue.</h1>\n";
echo "<h2>Uploading to the Reserve Queue.</h2>\n";
}
else {
echo "<h1>Uploading hpr${ep_num} for release on ${ep_date}</h1>\n";
echo "<h2>Uploading hpr${ep_num} for release on ${ep_date}</h2>\n";
}
?>
<p>
@@ -121,13 +128,13 @@ include 'header.html';
</p>
<h2><?php echo $status ?></h2>
<form method="POST" action="upload_confirm.php" enctype="multipart/form-data">
<table>
<table class="upload">
<tr>
<td>Host Email (<a href="<?php echo "${baseurl}about.html#email"; ?>" target="_blank">?</a>):</td>
<td><?php echo $email;?></td>
</tr>
<tr>
<td style="vertical-align:top;">Image: (<a href="<?php echo "${baseurl}about.html#image"; ?>" target="_blank">?</a>)</td>
<td>Image: (<a href="<?php echo "${baseurl}about.html#image"; ?>" target="_blank">?</a>)</td>
<td>
<?php
echo "<img src=\"$image_url\" alt=\"host image\" /><br /><small><em>";
@@ -161,13 +168,17 @@ include 'header.html';
</td>
</tr>
<tr>
<td style="vertical-align:top;">Profile: (<a href="<?php echo "${baseurl}about.html#Profile"; ?>" target="_blank">?</a>)</td>
<!-- TODO https://xing.github.io/wysihtml5/ -->
<td><textarea name="host_profile" maxlength="2000" rows="10" cols="50" placeholder="Enter some text about yourself with links to your blog or other online presence."><?php echo htmlspecialchars($profile) ?></textarea></td>
<td>Profile: (<a href="<?php echo "${baseurl}about.html#Profile"; ?>" target="_blank">?</a>)</td>
<td>
<noscript>
<textarea name="host_profile" maxlength="2000" rows="10" cols="50" placeholder="Enter some text about yourself with links to your blog or other online presence."><?php echo htmlspecialchars($profile) ?></textarea>
</noscript>
<div id="editor_profile" name="host_profile"></div>
</td>
</tr>
</table>
<h2>Please fill in some information about this episode</h2>
<table>
<table class="upload">
<tr>
<td><strong>Title(*) (<a href="<?php echo "${baseurl}about.html#Title"; ?>" target="_blank">?</a>):</strong></td>
<td><input required type="text" name="title" size="50" maxlength="100" placeholder="Enter a short descriptive title for your show."></td>
@@ -176,12 +187,6 @@ include 'header.html';
<td><strong>Summary(*) (<a href="<?php echo "${baseurl}about.html#Short_Summary"; ?>" target="_blank">?</a>):</strong></td>
<td><input required type="text" name="summary" size="70" maxlength="100" placeholder="This is a short 100 character summary of what your show is about."></td>
</tr>
<tr>
<td style="vertical-align:top;"><strong>Theme: (<a href="<?php echo "${baseurl}about.html#Theme"; ?>" target="_blank">?</a>)</strong></td>
<td>
Please <strong>do not</strong> add a theme to your show: <small>See <a href="https://lists.hackerpublicradio.com/pipermail/hpr/2021-November/004328.html">Policy Decision</a> for more information.</small><br />
</td>
</tr>
<tr>
<td><strong>Explicit: (<a href="<?php echo "${baseurl}about.html#Explicit"; ?>" target="_blank">?</a>)</strong></td>
<td>
@@ -208,22 +213,29 @@ include 'header.html';
</tr>
<tr>
<td><strong>Notes(*) (<a href="<?php echo "${baseurl}about.html#show_notes"; ?>" target="_blank">?</a>):</strong></td>
<td><textarea required name="notes" maxlength="40000" rows="20" cols="70" placeholder="Please add your show notes here." ></textarea></td>
</tr>
<tr>
<td>Format: (<a href="<?php echo "${baseurl}about.html#shownotes_format"; ?>" target="_blank">?</a>)</td>
<td>
<small>What format if any did you just use in the show notes above ?</small><br />
<select name="shownotes_format">
<option value="plain_text" selected>Plain text</option>
<option value="html5">HTML5 (Preferred)</option>
<option value="Markdown_GitHub">Markdown (GitHub flavoured)</option>
<option value="Markdown_Pandoc">Markdown (Pandoc flavoured)</option>
<option value="restructured_text">RestructuredText</option>
<option value="txt2tags">txt2tags</option>
</select>
<noscript>
<textarea required name="notes" maxlength="40000" rows="20" cols="70" placeholder="Please add your show notes here." ></textarea>
</noscript>
<div id="editor_notes" name="notes"></div>
</td>
</tr>
<noscript>
<tr>
<td>Format: (<a href="<?php echo "${baseurl}about.html#shownotes_format"; ?>" target="_blank">?</a>)</td>
<td>
<small>What format if any did you just use in the show notes above ?</small><br />
<select name="shownotes_format">
<option value="plain_text" selected>Plain text</option>
<option value="html5">HTML5 (Preferred)</option>
<option value="Markdown_GitHub">Markdown (GitHub flavoured)</option>
<option value="Markdown_Pandoc">Markdown (Pandoc flavoured)</option>
<option value="restructured_text">RestructuredText</option>
<option value="txt2tags">txt2tags</option>
</select>
</td>
</tr>
</noscript>
<tr>
<td>Series: (<a href="<?php echo "${baseurl}about.html#series"; ?>" target="_blank">?</a>)</td>
<td>
@@ -246,7 +258,7 @@ include 'header.html';
</td>
</tr>
<tr>
<td style="vertical-align:top;"><strong>Upload Method: (<a href="<?php echo "${baseurl}about.html#upload_method"; ?>" target="_blank">?</a>)</strong></td>
<td><strong>Upload Method: (<a href="<?php echo "${baseurl}about.html#upload_method"; ?>" target="_blank">?</a>)</strong></td>
<td>
<em>You have the choice of the following upload options:</em> <br />
<p>
@@ -259,24 +271,14 @@ include 'header.html';
Please avoid services that require login or downloading via a browser.<br />
<input type="url" size="30" name="url" placeholder="https://example.com/hpr9999.flac">
</p>
<p>
<strong>3. Upload via an alternative method</strong>:
If you wish to send a show using another method then please discuss it with the HPR Volunteer at admin@hackerpublicradio.org.
</p>
<p>
<strong>4. Reserve a slot</strong>:
Leave upload option 1 and 2 empty if you have received prior approval for a reservation from the Community via the <a href="/mailman/listinfo/hpr_hackerpublicradio.org">HPR Mailing List</a> to either:
</p>
<ul>
<li>Reserve the show now and upload media later.</li>
<li>Send physical media by the postal service or deliver in person.<br />
<em>Make sure you plan in enough time to deliver your media.</em></li>
</ul>
</td>
</tr>
</table>
<?php echo "<input type=\"hidden\" name=\"hostid\" value=\"$hostid\">"; ?>
<?php echo "<input type=\"hidden\" name=\"key\" value=\"$key\">"; ?>
<script>
document.write(`<?php echo "<input type=\"hidden\" name=\"shownotes_format\" value=\"html5\">"; ?>`);
</script>
<br />
<input type="submit" name="submit_edit" value="Submit"> This will take a <strong>long time</strong>, leave the browser running. You will get an email once the upload is complete.
<?php
@@ -290,10 +292,49 @@ include 'header.html';
?>
<div id="progressbar">
<div></div>
</div>
<script>
const toolbarOptions = [
[{ 'header': [1, 2, 3, 4, 5, 6, false] }],
[{ 'list': 'ordered'}, { 'list': 'bullet' }],
['bold', 'italic', 'underline', 'strike'], // toggled buttons
['blockquote', 'code-block'],
['link', 'image'],
['clean'] // remove formatting button
];
const quill_profile = new Quill('#editor_profile', {
modules: {
toolbar: toolbarOptions
},
placeholder: 'Enter your personal profile here...',
theme: 'snow'
});
const form_profile = document.querySelector("form");
quill_profile.root.innerHTML = `<?php echo $profile ?>` .replace(/(<ul>|<ol>|<\/li>)(?:[\s]+)(<li>|<\/ul>|<\/ol>)/g, '$1$2');
form_profile.addEventListener("formdata", (event) => {
event.formData.append("host_profile", quill_profile.root.innerHTML);
});
const quill = new Quill('#editor_notes', {
modules: {
toolbar: toolbarOptions
},
placeholder: 'Enter your show notes here...',
theme: 'snow'
});
const form = document.querySelector("form");
form.addEventListener("formdata", (event) => {
event.formData.append("notes", quill.root.innerHTML);
});
</script>
</form>
</main>
<?php
include 'footer.html';
?>

View File

@@ -1,6 +1,12 @@
<?php
# request.php > request_confirm.php > upload.php > upload_confirm.php
## Recent Changes
# TODO disabled the max notes check. We need to re-enable after we get a feel for the max length
# Removed support for the txt file
# Removde the POST duplication from the json file
# No longer logs the post to log file
require "/home/hpr/php/include.php";
function goback() {
@@ -148,10 +154,14 @@ if ( !(
}
logextra( "license is a valid value" );
if ( empty($_POST["notes"]) or strlen($_POST["notes"]) > 40000 ) {
naughty("5860799406a323209b902d5104fe7bae");
}
logextra( "Notes are less than max" );
// TODO re-enable after we get a feel for the max length
// if ( empty($_POST["notes"]) or strlen($_POST["notes"]) > 100000 ) {
// naughty("5860799406a323209b902d5104fe7bae");
// }
// logextra( "Notes are less than max" );
$notes_length = strlen($_POST["notes"]);
logextra( "Notes are $notes_length long." );
if ( ( empty($_POST["series"]) and ($_POST["series"] != 0 ) ) or (strlen($_POST["series"]) > 3 ) ) {
naughty("f1c83b57821d562f66246d975ef28994");
@@ -247,12 +257,6 @@ if (!mkdir($dir_structure, 0777, true)) {
naughty("804c4be123ca0327840b76bf4f8eb19e");
}
$shownote_file = "${dir_structure}/shownotes.txt";
if ( file_exists( $shownote_file ) ) {
naughty("33370d1c5c19a6ca4ef3f3ce59158e57");
}
logextra( "The shownotes txt file exists $shownote_file" );
$shownote_file_json = "${dir_structure}/shownotes.json";
if ( file_exists( $shownote_file_json ) ) {
naughty("85c8df74d172794c49233c1a94c299fd");
@@ -264,40 +268,6 @@ $this_file = print_r($_FILES, true);
logextra( "Received $this_post, $this_file" );
$show_data = "------------------------------------------------------------";
$show_data = $show_data . "\nEpisode_Number:\t" . $ep_num;
$show_data = $show_data . "\nEpisode_Date:\t" . $ep_date;
$show_data = $show_data . "\nTimestamp:\t" . $db_timestamp;
$show_data = $show_data . "\nKey:\t" . $_POST['key'];
$show_data = $show_data . "\nHost_IP:\t" . $db_ip;
$show_data = $show_data . "\n------------------------------------------------------------";
$show_data = $show_data . "\nHost_ID:\t" . $_POST['hostid'];
$show_data = $show_data . "\nHost_Name:\t" . $_POST['host_name'];
$show_data = $show_data . "\nHost_Email:\t" . $db_email;
$show_data = $show_data . "\nHost_License:\t" . $_POST['host_license'];
$show_data = $show_data . "\nHost_Profile:\n" . $_POST['host_profile'];
$show_data = $show_data . "\n------------------------------------------------------------";
$show_data = $show_data . "\nTitle:\t" . $_POST['title'];
$show_data = $show_data . "\nSummary:\t" . $_POST['summary'];
$show_data = $show_data . "\nShownotes_Format:\t" . $_POST['shownotes_format'];
$show_data = $show_data . "\nExplicit:\t" . $_POST['explicit'];
$show_data = $show_data . "\nShow_License:\t" . $_POST['license'];
$show_data = $show_data . "\nSeries:\t" . $series;
$show_data = $show_data . "\nSeries_Name:\t" . $series_name;
$show_data = $show_data . "\nTags:\t" . $_POST['tags'];
$show_data = $show_data . "\nurl:\t" . $_POST['url'];
$show_data = $show_data . "\n------------------------------------------------------------";
$show_data = $show_data . "\nShow_Notes:\n" . $_POST['notes'];
$show_data = $show_data . "\n------------------------------------------------------------";
$show_data = $show_data . "\nPOST:\n" . $this_post;
$show_data = $show_data . "\n------------------------------------------------------------";
$show_data = $show_data . "\nFILES:\n" . $this_file;
$show_data = $show_data . "\n------------------------------------------------------------\n";
file_put_contents($shownote_file, stripslashes($show_data) );
logextra( "Wrote the $shownote_file" );
$show_data_json = array(
"host" => array(
"Host_ID" => $_POST['hostid'],
@@ -322,28 +292,24 @@ $show_data_json = array(
"Timestamp" => $db_timestamp,
"Key" => $_POST['key'],
"Host_IP" => $db_ip,
"POST" => $_POST,
"FILES" => $_FILES,
"url" => $_POST['url'],
"Shownotes_Format" => $_POST['shownotes_format'],
)
);
file_put_contents($shownote_file_json, json_encode($show_data_json) );
logextra( "Wrote the $shownote_file_json" );
file_put_contents($shownote_file_json, json_encode( $show_data_json ) );
$shownote_file_json_length = strlen( json_encode( $show_data_json ) );
logextra( "Wrote the shownotes which are $shownote_file_json_length long" );
if ( !file_exists( $dir_structure ) ) {
naughty("a1534e6d525352dce7183a2e22862049");
}
logextra( "The dir_structure still exists" );
if ( !file_exists( "$dir_structure/shownotes.txt" ) ) {
naughty("ab8051b531c120b8bffd2a5b25a19cc3");
}
logextra( "shownotes.txt still exists" );
if ( !file_exists( "$dir_structure/shownotes.json" ) ) {
naughty("a9564ebc3289b7a14551baf8ad5ec60a");
naughty("3eb02d6b9ea801d4c5909b4fac0ccd96");
}
logextra( "shownotes.json still exists" );
@@ -395,7 +361,11 @@ it with the HPR Volunteer at admin@hackerpublicradio.org
foreach($_FILES["media_files"]["tmp_name"] as $key => $val) {
if ( $_FILES["media_files"]["error"][ "$key"] == 0 ) {
$from = $_FILES["media_files"]["tmp_name"][ "$key"];
$to = "${dir_structure}/" . $_FILES["media_files"]["name"][ "$key"] ;
$to = $_FILES["media_files"]["name"][ "$key"];
$to = rawurlencode( "${to}" );
$to = str_replace("%20","_",$to);
$to = str_replace("%","~",$to);
$to = "${dir_structure}/${db_key}_${to}";
$moveResult = move_uploaded_file($from, $to);
if ($moveResult != true) {
echo "ERROR: File not moved correctly >$from< >$to<";
@@ -494,7 +464,7 @@ $mailer->addBCC('admin@hackerpublicradio.org');
$mailer->addBCC('admin@hobbypublicradio.org');
$mailer->AddAddress("$db_email");
$mailer->isHTML(false);
if ( $ep_num === 9999 ) {
if ( $ep_num == "9999" ) {
$mailer->Subject = "Thank you for uploading to the Reserve Queue";
$mailer->MsgHTML("<p><em>This email is an automatic reply. If you have not made this request then please ignore this email.</em></p>
<p>Thank You for recording an episode for the Reserve Queue.</p>
@@ -510,20 +480,20 @@ if ( $ep_num === 9999 ) {
else {
$mailer->Subject = "Thank you for uploading hpr${ep_num}::${ep_date}";
$mailer->MsgHTML("<p><em>This email is an automatic reply. If you have not made this request then please ignore this email.</em></p>
<p>Thank You for recording hpr${ep_num} for release on ${ep_date}.</p>
<p>Thank you for recording hpr${ep_num} for release on ${ep_date}.</p>
<pre>
$message
</pre>
<p>
Your show will now be processed by a HPR Volunteer.<br />
Thanks,<br />
HPR Bot
HPR Bot.
</p>");
}
$mailer->AltBody = "This email is an automatic reply. If you have not made this request then please ignore this email.
Thank You for recording hpr${ep_num} for release on ${ep_date}.
Thank you for recording hpr${ep_num}, for release on ${ep_date}.
$message

View File

@@ -17,8 +17,6 @@ if ( ! $pos === false) {
date_default_timezone_set("UTC");
if (!($connection = @ mysqli_connect("$databaseHostName", "$databaseUsername", "$databasePassword")))
die("Could not connect to database");
@@ -334,4 +332,18 @@ if ($pos !== false) {
$HPR_Names = "Hackers";
}
// General allowed Settings
$allowed_content_type = array( "application/json", "application/octet-stream", "application/ogg", "application/x-subrip", "audio/flac", "audio/mpeg", "audio/ogg", "audio/x-flac", "audio/x-wav", "image/jpeg", "image/png", "image/webp", "text/plain", "text/x-c", "video/3gpp", "video/mp4", "audio/x-m4a" );
$allowed_extensions = array("m4a", "wav", "flac", "opus", "ogg", "mp3", "jpg", "jpeg", "png", "webp", "srt", "txt", "spx" );
$allowed_extensions_common = array("opus", "ogg", "mp3", "jpg", "jpeg", "png", "webp", "srt", "txt", "spx" );
#$ccdn_hosts_common = array("alpha.nl.eu.mirror.hackerpublicradio.org", "hpr.nyc3.cdn.digitaloceanspaces.com" );
$ccdn_hosts_common = array("alpha.nl.eu.mirror.hackerpublicradio.org", "hpr.nyc3.cdn.digitaloceanspaces.com" );
#$ccdn_hosts_common = array( "hpr.nyc3.cdn.digitaloceanspaces.com" );
$ccdn_hosts_complete = array( "archive.org" );
?>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,516 +0,0 @@
(395,'CoGo','cogocogocogocogo.nospam@nospam.gmail.com','<p>\r\nBorn Again Christian<br />\r\nCNC hobbyist, worker<br />\r\nLove but can\'t afford aviation.\r\n</p>','CC-BY-SA',0,'',1,'Co Go'),
(396,'BlacKernel','izzyleibowitz.nospam@nospam.pm.me','<p>\r\n<strong>Name:</strong> Izzy Leibowitz \r\n<strong>Handle:</strong> BlacKernel</p>\r\n<hr />\r\n<h3>Bio</h3>\r\n<p>I was born at a very young age and, from there, the rest is history.</p>\r\n<p>It\'s not a skill set, it\'s a compultion.</p>\r\n<p>Just your average korn kob on the internet; strangely not using ksh.</p>\r\n<h3>System Fetch</h3>\r\n<p>\r\n<strong>Prefered Pronouns:</strong> Any (He/She/They/It/Your Majesty/Feared Ruler of the Forbidden Languages/etc)<br />\r\n<strong>Prefered Languages:</strong> Rust (compuled), Lua (scripting), Fish (shell scripting)<br />\r\n<strong>Prefered Shell:</strong> fish<br />\r\n<strong>Prefered OS:</strong> Slackware<br />\r\n<strong>Prefered DE:</strong> -XFCE- KDE (you guys were right after all)</p>\r\n<hr />\r\n<h4>Other Projects</h4>\r\n<p>\r\n<strong>SCP Foundation:</strong> <a href=\"https://scpwiki.com/drleibowitz\">Dr. Izzy Leibowitz</a></p>\r\n<h4>Contact Me</h4>\r\n<p>\r\n<strong>Email:</strong> <a href=\"mailto@izzyleibowitz@pm.me.html\">izzyleibowitz at pm dot me</a> \r\n<strong>Mastodon:</strong> <a href=\"https://nixnet.social/BlacKernel\">at blackernel at nixnet dot social</a>\r\n</p>','CC-BY-SA',0,'',1,'Black Kernel'),
(397,'hakerdefo','forever.jekyll.nospam@nospam.disroot.org','<ul>\r\n<li>Blog => <a href=\"https://hakerdefo.github.io/\">https://hakerdefo.github.io/</a></li>\r\n<li>Code => <a href=\"https://github.com/hakerdefo\">https://github.com/hakerdefo</a></li>\r\n</ul>','CC-BY-SA',0,'',1,'haker de fo'),
(398,'one_of_spoons','hpr.nospam@nospam.spoons.one','<p>Mastodon, though very rarely:<br />\r\n@one_of_spoons@hispagatos.space\r\n</p>','CC-BY-SA',0,'',1,'one of spoons'),
(399,'dnt','dnt.nospam@nospam.revolto.net','','CC-BY-SA',0,'',1,'D. N. T.'),
(401,'Mechatroniac','anarch0re.nospam@nospam.tutanota.com','<p>\r\nThe Mechatronics Maniac\r\n<br />\r\n<a href=\"https://www.bitchute.com/channel/mechatroniac/\">https://www.bitchute.com/channel/mechatroniac/</a>\r\n</p>','CC-BY-SA',0,'',1,'Mechatroniac'),
(402,'takov751','takov751.nospam@nospam.protonmail.com','<ul>\r\n<li>Twitter: <a href=\"https://twitter.com/takov751\">@takov751</a></li>\r\n<li>matrix: <a href=\"https://matrix.to/#/@takov751:matrix.org\">takov751:matrix.org</a></li>\r\n<li>email: takov751+hpr@protonmail.com</li>\r\n</ul>','CC-BY-SA',1,'',1,'takov 7 5 1'),
(404,'Sarah','sarah.nospam@nospam.giammarco.ca','<p>Librarian. Spends too much time on the internet.</p>','CC-BY-SA',0,'',1,'Sarah'),
(406,'binrc','binrc.nospam@nospam.protonmail.com','https://0x19.org\r\nthanks for listening :)','CC-BY-SA',0,'',1,'bin R. C.'),
(407,'Celeste','zceleste.nospam@nospam.protonmail.com','I once made a crocheted goose named Celeste in my free time and it has since become a sort of online avatar for me.','CC-BY-NC-SA',0,'',1,'Celeste'),
(405,'Lurking Prion','LurkingPrion.nospam@nospam.gmail.com','<p>\r\nLurking Prion (He/Him/His) is a cybersecurity enthusiast, evangelist, mentor, and professional with 20+ years experience in the Healthcare, Financial, Telecommunications, Managed Security Services Provider (MSSP), Hybrid Cloud Service Provider (CSP), and other unspecified business sectors...\r\n</p>\r\n<p>\r\nBeginning as a network administrator, Lurking Prion\'s career followed security as it progressed throughout the years in roles including:\r\n<ul>\r\n<li>Linux/Windows Systems Administrator</li>\r\n<li>Network Engineer</li>\r\n<li>Telecommunications Engineer</li>\r\n<li>Security Engineer and Architect</li>\r\n<li>Ethical Hacker</li>\r\n<li>Security Consultant</li>\r\n</ul>\r\n</p>\r\n<p>\r\nLurking Prion also has a passion for teaching. It is his mission to help build a new generation of cyber security professionals with a security mindset.\r\n</p>\r\n<p>\r\nLurking Prion may occasionally refer to himself as Robert.<br />\r\nLurking Prion likes coffee, dark beer, and dirty martinis.<br />\r\nLurking Prion only refers to himself in the third person when there is a lack of coffee or an abundance of stupidity.<br />\r\nLurking Prion\'s eye starts to twitch when all hell is about to break loose.<br />\r\nLurking Prion\'s spirit animal is DeadPool.\r\n</p>','CC-BY-SA',0,'',1,'Lurking Prion'),
(416,'screwtape','screwtape.nospam@nospam.sdf.org','Hi everyone! I like to write on the gopher and in common lisp. I am experimenting with idiomatic inclusion of formal ACL2 first order logic as part of larger ASDF3 common lisp system definitions that include side-effect modules.\r\n\r\nYou might know me from the gopher. gopher.club/1/users/screwtape\r\nI normally use openbsd, but in different contexts I often use NetBSD or FreeBSD and I also use Gentoo and Debian linux.','CC-BY-SA',0,'',1,'screw tape'),
(414,'Kinghezy','cbart387.nospam@nospam.gmail.com','','CC-BY-SA',0,'',1,'Kinghezy'),
(410,'Hipernike','hipernike.nospam@nospam.proton.me','','CC-BY-SA',0,'',1,'Hipernike'),
(70,'TheYellow1','TheYellow1.nospam@nospam.gmail.com','','CC-BY-SA',0,'',1,'The Yellow One'),
(71,'Will Jason','willjasen.nospam@nospam.charter.net','','CC-BY-SA',0,'',1,'Will Jason'),
(411,'Paul J','hpr.nospam@nospam.pauljohnstone.com','I am a full-stack developer','CC-BY-SA',0,'',1,'Paul J'),
(412,'m0dese7en','m0dese7en.nospam@nospam.mykolab.com','','CC-BY-SA',0,'',1,'Mode Seven'),
(413,'CCHits.net Team','show.nospam@nospam.cchits.net','CCHits.net is a website which produces a daily, weekly and sometimes even a monthly music podcast. Find out more at cchits.net','CC-BY',0,'',1,'CCHits dot net Team'),
(415,'enistello','enistello.nospam@nospam.tuta.io','@enistello@fosstodon.org','CC-BY-SA',0,'',1,'ennis tello'),
(417,'StarshipTux','wakko222.nospam@nospam.gmail.com','Linux Enthusiast, Podcast Addict','CC-BY-SA',0,'',1,'Star ship Tux'),
(418,'David Thrane Christiansen','david.nospam@nospam.davidchristiansen.dk','<p>\r\nI love programming languages and their implementations, and I especially love exploring new paradigms of writing programs. I\'m online at <a href=\"https://davidchristiansen.dk\">https://davidchristiansen.dk</a>.\r\n</p>','CC-BY',0,'',1,'David Thrane Christiansen'),
(419,'Ryuno-Ki','andre.jaenisch.nospam@nospam.posteo.de','Web-Developer and Consultant as a freelancer since 2023.\r\n\r\nHomepage: https://jaenis.ch/\r\nProfessional email: andre.jaenisch.wdc@posteo.net','CC-BY-SA',0,'',1,'Ryuno-Ki'),
(422,'Fred Black','fredrik.nospam@nospam.svenskaa.net','','CC-BY-SA',0,'',1,'Fred Black'),
(423,'Noodlez','contact.nospam@nospam.nathanielbarragan.xyz','Hello all! I\'m Noodlez, an HPR listener and now contributor. I like anything to do with Linux and Linux-adjacent (Like other Unixes), and programming, and other random things like retro gaming.','CC-BY-SA',0,'',1,'Noodlez');
/*!40000 ALTER TABLE `hosts` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `licenses`
--
DROP TABLE IF EXISTS `licenses`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `licenses` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`short_name` varchar(11) NOT NULL,
`long_name` varchar(40) NOT NULL,
`url` varchar(80) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `licenses`
--
LOCK TABLES `licenses` WRITE;
/*!40000 ALTER TABLE `licenses` DISABLE KEYS */;
INSERT INTO `licenses` (`id`, `short_name`, `long_name`, `url`) VALUES (1,'CC-0','Public Domain Dedication','http://creativecommons.org/publicdomain/zero/1.0/'),
(2,'CC-BY','Attribution','http://creativecommons.org/licenses/by/4.0'),
(3,'CC-BY-SA','Attribution-ShareAlike','http://creativecommons.org/licenses/by-sa/4.0'),
(4,'CC-BY-ND','Attribution-NoDerivs','http://creativecommons.org/licenses/by-nd/4.0'),
(5,'CC-BY-NC','Attribution-NonCommercial','http://creativecommons.org/licenses/by-nc/4.0'),
(6,'CC-BY-NC-SA','Attribution-NonCommercial-ShareAlike','http://creativecommons.org/licenses/by-nc-sa/4.0'),
(7,'CC-BY-NC-ND','Attribution-NonCommercial-NoDerivs','http://creativecommons.org/licenses/by-nc-nd/4.0');
/*!40000 ALTER TABLE `licenses` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `miniseries`
--
DROP TABLE IF EXISTS `miniseries`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `miniseries` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`description` text NOT NULL,
`private` tinyint(1) NOT NULL DEFAULT 0,
`image` text NOT NULL,
`valid` int(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=123 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `miniseries`
--
LOCK TABLES `miniseries` WRITE;
/*!40000 ALTER TABLE `miniseries` DISABLE KEYS */;
INSERT INTO `miniseries` (`id`, `name`, `description`, `private`, `image`, `valid`) VALUES (4,'Databases','This series will attempt to discuss various different aspects of Database design and operation.',0,'',1),
(5,'This Old Hack','fawkesfyre tales of hacking',1,'',1),
(6,'The Linux Boot Process','Dann talks about the linux boot process',1,'',1),
(7,'LPI Certifications','A series focusing on Linux Professional Institute Certifications (LPIC) <br><a href=\"https://www.lpi.org/\">https://www.lpi.org/ </a>',0,'',1),
(8,'Virtualization','Initiated by Deepgeek, this series contains contributions from many hosts on the topic of Virtualization\r\n',0,'',1),
(11,'Lightweight Apps','Reviews of light weight applications',0,'',1),
(14,'Beverages','The making and consuming of all types of fermented drinks, such as: brewing your own beer, beer tasting and home wine making',0,'',1),
(93,'Cooking','Cooking techniques, recipes, recommendations and cooking equipment',0,'',1),
(78,'Interviews','HPR Correspondents bring you Interviews from interesting people and projects',0,'',1),
(19,'SourceCast','<a href=\"https://sourcecast.org/\"> https://sourcecast.org/ </a> <br>',1,'',1),
(21,'Vulgar Esperanto','klaatu talks about Esperanto',0,'',1),
(22,'All Songs Considered','A Collection of Songs by various artists',0,'',1),
(23,'What\'s in My Toolkit','This is an open series where Hacker Public Radio Listeners can share with the community the items that they can\'t live without, what they find useful in day to day life.',0,'toolkit',1),
(25,'Programming 101','A series focusing on concepts and the basics of programming',0,'',1),
(26,'RoundTable','Panelists dicuss a topic each month.',0,'',1),
(82,'Vim Hints','<p>\r\nVarious contributors lead us on a journey of discovery of the Vim (and vi) editors.\r\n</p>\r\n<p>\r\nVim is a highly configurable text editor built to enable efficient text editing. It is an improved version of the vi editor distributed with most UNIX systems.\r\n</p>\r\n<p>\r\n<a href=\"https://www.vim.org/about.php\">https://www.vim.org/about.php</a>\r\n</p>',0,'',1),
(28,'NewsCast','What\'s happening in the News world',1,'',1),
(29,'How I got into tech','Started by monsterb, this series invites people to share with us how they found Linux. It has become traditional for first time hosts to share with us their journey to Linux. Indeed it has morphed to be way to share your journey in tech right up to your first contribution to HPR.',0,'',1),
(30,'Tit Radio','Welcome to TiT Radio! The only Hacker Public Radio show with super cow powers broadcasting live on ddphackradio.org every utter Saturday night at 11pm CST. You may be asking yourself \"What in tarnation is Tit Radio?\" Well, it\'s a potluck style roundtable of geeks talking about Free Software, GNU + Linux, and anything geeky the TiTs bring to the table. Chat with the TiTs over at irc.freenode.net #linuxcranks. Thats no bull.',1,'',1),
(34,'Talk Geek to me','deepgeek talks geek to his fans',1,'',1),
(35,'SELF Talks 2009','South East Linux Fest talks 2009',1,'',1),
(36,'Software Freedom Day Dundee 2009','Software Freedom Day Dundee 2009',1,'',1),
(38,'A Little Bit of Python','<p>\r\nInitially based on the podcast \"A Little Bit of Python\", by Michael Foord, Andrew Kuchling, Steve Holden, Dr. Brett Cannon and Jesse Noller. <a href=\"https://www.voidspace.org.uk/python/weblog/arch_d7_2009_12_19.shtml#e1138\">https://www.voidspace.org.uk/python/weblog/arch_d7_2009_12_19.shtml#e1138</a>\r\n</p>\r\n<p>\r\nNow the series is open to all.\r\n</p>',0,'',1),
(42,'Bash Scripting','This is an open series in which Hacker Public Radio Listeners can share their Bash scripting knowledge and experience with the community. General programming topics and Bash commands are explored along with some tutorials for the complete novice.',0,'',1),
(43,'HAM radio','A series about all things Amateur Radio/HAM Radio.',0,'',1),
(119,'Travel','This is an open series where our hosts can document their travel experiences',0,'',1),
(120,'Battling with English','Looking at the English language and highlighting some common anomalies, mistakes, mispellings, grammar problems and similar.',0,'',1),
(121,'HPR New Year Show','Our community welcomes in every time zone to the New Year in this annual event.',1,'',1),
(122,'Computer Strategy Games','<p>This series is about Computer Strategy Games or Video Games as defined by <a href=\"https://en.wikipedia.org/wiki/Video_game\">https://en.wikipedia.org/wiki/Video_game</a></p>',0,'',1),
(44,'Read \'n Code','The Read \'n Code podcast, the only podcast about literature and computer programming.',0,'',1),
(45,'Podcasting HowTo','This series is designed to help the new host begin podcasting and to give the experienced host some tips and tricks.<br />The series is open to all.',0,'',1),
(46,'Urban Camping','Tips and tricks for the Urban Camper',1,'',1),
(47,'HPR Community News','A monthly look at what has been going on in the HPR community. This is a regular show scheduled for the first Monday of the month.',1,'',1),
(48,'The Language Frontier','In this miniseries Skirlet discusses various different aspects of language.',1,'',1),
(52,'THEATER OF THE IMAGINATION','<p></p>\r\n<p>This is my series on Dramatic Audio Media, such as Old Time Radio (\"The Shadow\", \"Gunsmoke\", etc.), BBC Radio, and other classics -- but also, and most especially, the current renaissance of this art form, and how a person (like me, like you) can begin producing your own audio fiction or poetry or whatever for the enjoyment of countless others. This will be a learning process for me, and my mistakes might very well help you avoid any similar such in your own endeavors.</p>\r\n<p></p>',1,'',1),
(53,'HPR_AudioBookClub','HPR AudioBook Club',1,'',1),
(54,'Syndicated Thursdays','A chance to showcase other Creative Commons works. We try to expose podcasts, speeches, presentations, music, etc that you may not have heard. If you have suggestions for items then send your recommendation to admin at hpr and we\'ll add it to the queue.',0,'',1),
(57,'Hardware upgrades','Hosts share their experiences when upgrading their equipment.',0,'',1),
(58,'spics on tech','sikilpaake & badbit team up to give us a Mexican view of the hacker world.',1,'',1),
(95,'Tabletop Gaming','<p>In this series, initiated by klaatu, analog games of various sorts are described and reviewed. See <a href=\"https://en.wikipedia.org/wiki/Tabletop_game\">https://en.wikipedia.org/wiki/Tabletop_game</a> for details.</p>\r\n',0,'',1),
(96,'Penguicon','Penguicon is a Non-Profit, Open Source - Science Fiction Convention held in Southfield, Michigan.\r\n\r\nSee the website at <a href=\"https://www.penguicon.org/\">https://www.penguicon.org/</a> or the Wikipedia page at <a href=\"https://en.wikipedia.org/wiki/Penguicon\">https://en.wikipedia.org/wiki/Penguicon</a>\r\n',0,'',1),
(97,'FOSDEM','<p>FOSDEM is a free event for software developers to meet, share ideas and collaborate.</p>\r\n<p.Every year, thousands of developers of free and open source software from all over the world gather at the event in Brussels.</p>\r\n<ul>\r\n<li>Website: <a href=\"https://fosdem.org/\">https://fosdem.org/</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/FOSDEM\">https://en.wikipedia.org/wiki/FOSDEM</a></li>\r\n</ul>',0,'',1),
(61,'Networking','This series will try and explain the basics of networking to the listener as well as introduce more detailed topics.',0,'',1),
(62,'OggCamp','OggCamp<br />A Free Culture Unconference',0,'',1),
(63,'Packaging applications for GNU Linux and BSD','Klaatu submits a series on packaging applications for GNU Linux and BSD.',0,'',1),
(65,'Talk Geek to me News','',1,'',1),
(0,'general','',0,'',1),
(67,'Linux in the Shell','Linux In The Shell aims to explore the use of many commands a user can run in the Bash Shell. Tutorials include a write up with examples, an audio component about the write up, and a video component to demonstrate the usage of the command.<br />\r\nThe website is <a href=\"https://www.linuxintheshell.com/\">https://www.linuxintheshell.com/</a>',1,'',1),
(69,'Freedom is not Free ','Examining the difference between <b>freedom</b> and <b>free of cost</b>. In the world of free software the main emphasis is on the freedom to run, copy, distribute, study, change and improve the software, not on its lack of cost.',0,'',1),
(70,'LibreOffice','In this in-depth series on LibreOffice we examine Writer, Calc and Impress',0,'',1),
(71,'Mental Health','In this series we discuss issues surrounding mental health.',0,'',1),
(72,'Practical Math','Goal for the series: Embracing units, and carrying them along as you go, can help you work with confidence in using maths in your life.',0,'',1),
(73,'LinuxJAZZ','Shows about Bariman\'s experience as a jazz musician using Linux',1,'',1),
(74,'Privacy and Security','In this open series, you can contribute shows that are on the topic of Privacy and Security',0,'',1),
(75,'Podcast recommendations','This is an open series where Hacker Public Radio listeners can share and recommend podcasts that they listen to.',0,'podcasts',1),
(77,'Filesystems','In this series we explore various different filesystems.',0,'filesystems',1),
(79,'Accessibility','Shows about tearing down the barriers for our fellow hackers.',0,'',1),
(80,'5150 Shades of Beer','FiftyOneFifty leads this open series on all aspects of the Beer.',0,'',1),
(81,'Version Control','This is an open series in which Hacker Public Radio Listeners can share their knowledge and experience of version or revision control systems such as Bazaar, Mercurial, Subversion, CVS and Git.',0,'',1),
(83,'April Fools Shows','',1,'',1),
(84,'Compilers - how they work','In this series we examine how compilers work',0,'',1),
(94,'Learning Awk','Episodes about using Awk, the text manipulation language. It comes in various forms called awk, nawk, mawk and gawk, but the standard version on Linux is GNU Awk (gawk). It\'s a programming language optimised for the manipulation of delimited text.',0,'',1),
(87,'Uber Leet Hacker Force Radio','In this series sigFLUP speaks about her latest coding projects, plays music and conducts interviews',1,'',1),
(88,'Coffee','All aspects of making the perfect cup of Coffee',0,'',1),
(90,'Learning sed','Episodes about using sed, the Stream Editor. It\'s a non-interactive editor which you can use to make simple changes to data, which is how many people use it. However, sed also has a lot of hidden power, especially in the GNU version.',0,'',1),
(91,'Arduino and related devices','In this series various contributors talk about how to use and program Arduino single-board microcontrollers and related devices.<br />\r\nSee the Wikipedia article\r\n<a href=\"https://en.wikipedia.org/wiki/List_of_Arduino_boards_and_compatible_systems\">https://en.wikipedia.org/wiki/List_of_Arduino_boards_and_compatible_systems</a> for details of the range of devices.\r\n',0,'',1),
(98,'Apt Spelunking','<p>\r\n\"Apt spelunking\" is a silly term I made up for the act of searching through your package manager, App Store, Code Repo, etc with vague terms, and trying out random applications therein. <br />\r\n\r\nA public series started by Windigo.\r\n</p>',0,'',1),
(99,'Information Underground','Deepgeek, Klaatu, and Lostnbronx discuss things.',0,'',1),
(100,'Health and Healthcare','A open series about Health and Healthcare',0,'',1),
(101,'Sound Scapes','Come with us on a journey through sound.',0,'',1),
(102,'GNU Readline','GNU Readline is a software library that provides line-editing and history capabilities for interactive programs with a command-line interface, such as Bash. It is currently maintained by Chet Ramey as part of the GNU Project. This series looks at some of the features of this powerful library.',0,'',1),
(103,'Hobby Electronics','Building electronic devices and kits, repairing electronics and\r\nlearning about components and their uses.',0,'',1),
(104,'Introduction to Git','Initiated by Klaatu, this open series introduces Git and the concepts behind its use in a collaborative environment.',0,'',1),
(105,'Random Elements of Storytelling','lostnbronx leads us on an investigation of the fundamentals of story telling.',1,'',1),
(106,'YouTube Subscriptions','Where the HPR community members share their YouTube Subscriptions',0,'',1),
(107,'Haskell','<p>A series looking into the <a href=\"https://en.wikipedia.org/wiki/Haskell_(programming_language)\"> Haskell (programming language)</a></p>',0,'',1),
(108,'Social Media','Looking at aspects of Social Media - platforms, histories, popularity, philosophies, etc.',0,'',1),
(109,'Lord D Film Reviews','<p>A memorial series dedicated to our late host <a href=\"https://hackerpublicradio.org/correspondents.php?hostid=24\">Lord Drachenblut</a></p>\r\n\r\n<p>Five categories, each rated 0, 1, or 2, so that the final reviews range anywhere from 0 to 10, with 0 being the worst film ever, and 10, the best.</p>\r\n\r\n<p>Each category asks two yes-or-no questions. If the answer to both is no, that category gets a 0. If only one is a yes, it gets a 1. If both are a yes, it gets a 2.</p>\r\n\r\n<h4>Plot</h4>\r\n<ul>\r\n<li>Does it make sense, and/or is free of huge holes?</li>\r\n<li>Does it seem like it has not been done too often?</li>\r\n</ul>\r\n<h4>Main characters</h4>\r\n<ul>\r\n<li>Are they realistic?</li>\r\n<li>Do you care about them?</li>\r\n</ul>\r\n<h4>Genre</h4>\r\n<ul>\r\n<li>Does it work for the plot?</li>\r\n<li>Would this tale have been better in another genre?</li>\r\n</ul>\r\n<h4>Construction</h4>\r\n<ul>\r\n<li>Is the acting competent for the tale?</li>\r\n<li>Are the production and/or editing competent?</li>\r\n</ul>\r\n<h4>Payoff</h4>\r\n<ul>\r\n<li>Did the film makers manage to do what they seemed to be intending?</li>\r\n<li>Are you emotionally satisfied when the film is over?</li>\r\n</ul>\r\n',0,'',1),
(110,'Blockchain','A open series on the Blockchain, cryptographic hash, cryptocurrency, bitcoin etc',0,'',1),
(111,'Linux Inlaws','This is Linux Inlaws, a series on free and open source software, black humour, the revolution and freedom in general (this includes ideas and software) and generally having fun. ',1,'',1),
(112,'The art of writing','An open series on writing tools, media, supplies and techniques.',0,'',1),
(113,'GIMP','An overview of this open-source graphics program, with a focus on photographic issues.',0,'',1),
(114,'Model Hacking','Creating, restoring, painting all sorts of models from RPG characters to model cars.',1,'',1),
(115,'Bicycle Hacking','Maintaining, enhancing and repairing bikes; also the creation of new bikes from recycled ones.',0,'',1),
(116,'Languages','About human languages, including learning them and speaking them',0,'',1),
(117,'DOS','DOS is a general acronym for \"Disk Operating System\", though it came to refer to the operating system used in the IBM PC, particularly Microsoft\'s MS-DOS.',0,'',1),
(118,'Hack Radio Live','A series of syndicated shows about hacking, also available on https://hackradiolive.org/',1,'',1);
/*!40000 ALTER TABLE `miniseries` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `twat_eps`
--
DROP TABLE IF EXISTS `twat_eps`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `twat_eps` (
`id` int(5) NOT NULL DEFAULT 0,
`date` date NOT NULL,
`title` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci NOT NULL,
`duration` int(5) NOT NULL,
`summary` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci NOT NULL,
`notes` text CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci NOT NULL,
`hostid` int(10) NOT NULL,
`series` int(10) NOT NULL DEFAULT 0,
`explicit` tinyint(1) NOT NULL DEFAULT 1,
`license` varchar(11) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci NOT NULL DEFAULT 'CC-BY-NC-SA',
`tags` varchar(200) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci NOT NULL,
`version` int(5) NOT NULL DEFAULT 0,
`downloads` int(11) NOT NULL,
`valid` int(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`id`),
UNIQUE KEY `ep_num` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `twat_eps`
--
LOCK TABLES `twat_eps` WRITE;
/*!40000 ALTER TABLE `twat_eps` DISABLE KEYS */;
INSERT INTO `twat_eps` (`id`, `date`, `title`, `duration`, `summary`, `notes`, `hostid`, `series`, `explicit`, `license`, `tags`, `version`, `downloads`, `valid`) VALUES (9,'2005-09-29','Misc Stuff',1180,'','Linlin, J-Hood and the crew discuss tech',8,0,1,'CC-BY-NC-SA','',0,0,1),
(2,'2005-09-20','Cat5 Cables',874,'','droops and dosman talk about network cables',1,0,1,'CC-BY-NC-SA','',0,0,1),
(17,'2005-10-11','Open Source Project',532,'','getting involved with open source projects',4,0,1,'CC-BY-NC-SA','',0,0,1),
(3,'2005-09-21','Old and new dos',1040,'','dosman uses his old school skills to to talk about old and new dos',3,0,1,'CC-BY-NC-SA','',0,0,1),
(4,'2005-09-22','Future of Wifi',1383,'','J-Hood, LinLin and others talk about the future of wifi',6,0,1,'CC-BY-NC-SA','',0,0,1),
(5,'2005-09-25','PEAR',512,'','Rambling about the PEAR project and 35+ instances of uh or um',4,0,1,'CC-BY-NC-SA','',0,0,1),
(6,'2005-09-26','Enhancing Documentation',1190,'','A look at cross-platform, open source and free screen recoding utilities',7,0,1,'CC-BY-NC-SA','',0,0,1),
(7,'2005-09-27','Phreaknic',304,'','droops talks about phreaknic and hacking cons',1,0,1,'CC-BY-NC-SA','',0,0,1),
(8,'2005-09-28','Apt-get on Suse',291,'','droops installs apt-get on suse, so that he can use apt-get to take advantage of yast.',1,0,1,'CC-BY-NC-SA','',0,0,1),
(10,'2005-10-02','Network Sniffing',944,'','http://www.irongeek.com/i.php?page=security/AQuickIntrotoSniffers',9,0,1,'CC-BY-NC-SA','',0,0,1),
(11,'2005-10-03','vi',708,'','basics of vi, the best linux text editor',1,0,1,'CC-BY-NC-SA','',0,0,1),
(12,'2005-10-04','Programming Languages',698,'','Intro to programming lessons',10,0,1,'CC-BY-NC-SA','',0,0,1),
(13,'2005-10-05','Kanotix Lovefest',1119,'','pat and Dave \\\"Judland\\\" Bouley love some kanotix',11,0,1,'CC-BY-NC-SA','',0,0,1),
(14,'2005-10-06','Linux directory structure test',944,'','A synopsis of the Linux directory structure according to the file system standards and some tips on effective partitioning for Linux.',7,0,1,'CC-BY-NC-SA','',0,0,1),
(15,'2005-10-09','Computer Forensics',1167,'','a little late, but better late than never',3,0,1,'CC-BY-NC-SA','',0,0,1),
(16,'2005-10-10','Hot or Not',610,'','Schedas hot or not.',5,0,1,'CC-BY-NC-SA','',0,0,1),
(27,'2005-10-25','Securing your box for a hacker con. (uns',690,'','<a href=\\\"http://en.wikipedia.org/wiki/Iptables\\\">Iptables</a>\r\n\r\n\r\n<br><a href=\\\"http://www.netfilter.org/documentation/HOWTO//packet-filtering-HOWTO.html\\\">IPTables how-to</a>\r\n\r\n<br><a href=\\\"http://www.irongeek.com/i.php?page=security/roguefileshares\\\">Article on finding rogue file shares</a>\r\n\r\n<br>\r\n<a href=\\\"http://www.phreaknic.info\\\">PhreakNIC website</a>\r\n\r\n<br>\r\n<a href=\\\"http://en.wikipedia.org/wiki/Secure_shell\\\">SSH Info</a>\r\n<br>\r\n<a href=\\\"http://openssh.com/\\\">OpenSSH</a>\r\n<br>\r\n<a href=\\\"http://www.chiark.greenend.org.uk/~sgtatham/putty/\\\">PuTTY</a>\r\n<br>\r\n<a href=\\\"http://en.wikipedia.org/wiki/SOCKS\\\">SOCKS Info</a>\r\n<br><a href=\\\"http://www.freecap.ru/eng/?p=download\\\">FreeCap SOCKS Client (for Windows)\r\n</a>\r\n<br><a href=\\\"http://www.inet.no/dante/\\\">Dante SOCKS client (for Linux)\r\n</a>',9,0,1,'CC-BY-NC-SA','',0,0,1),
(18,'2005-10-13','Jason takes us for a ride....',875,'','To get food',13,0,1,'CC-BY-NC-SA','',0,0,1),
(19,'2005-10-13','Droops - Reads Electric Universe',750,'','droops reads from Electric Universe by David Bodanis',1,0,1,'CC-BY-NC-SA','',0,0,1),
(20,'2005-10-16','LIVE CDs',912,'','<a href=\\\"http://slax.linux-live.org/\\\"> SLAX</a><br>\r\n<a href=\\\"http://www.hakin9.org/en/\\\">Hackin9</a>',7,0,1,'CC-BY-NC-SA','',0,0,1),
(21,'2005-10-17','cell phones and bluetooth',546,'','No Shownotes Provided.',11,0,1,'CC-BY-NC-SA','',0,0,1),
(22,'2005-10-18','C# (c sharp)',1107,'','No Shownotes Provided.',14,0,1,'CC-BY-NC-SA','',0,0,1),
(23,'2005-10-19','More on Intel Processors',1874,'','No Shownotes Provided.',15,0,1,'CC-BY-NC-SA','',0,0,1),
(1,'2005-10-10','Special Episode',583,'','his is the intro episode of TWAT Radio, dosman talks about hyper/multi threading',3,0,1,'CC-BY-NC-SA','',0,0,1),
(24,'2005-10-20','Making CMD.EXE more like your *nix shell',571,'','No Shownotes Provided.',1,0,1,'CC-BY-NC-SA','',0,0,1),
(25,'2005-10-23','Setting up a home recording studio',1538,'','No Shownotes Provided.',46,0,1,'CC-BY-NC-SA','',0,0,1),
(26,'2005-10-24','Debian on a Sharp Zaureus',416,'','No Shownotes Provided.',17,0,1,'CC-BY-NC-SA','',0,0,1),
(28,'2005-10-26','Anti Forensics',1065,'','FireWire - all your memory are belong to us<br>\r\nhttp://md.hudora.de/presentations/#firewire-cansecwest<br>\r\n<br>\r\nAnti-forensics:<br>\r\nhttp://vidstrom.net/<br>\r\n<br>\r\nTalisker Anti <br>Forensic Tools:<br>\r\nhttp://www.networkintrusion.co.uk/foranti.htm<br>\r\n<br>\r\nThe Coroners Toolkit<br> (Dan Farmer and Wietse Venema)<br>\r\nhttp://www.porcupine.org/forensics/tct.html<br>\r\n<br>\r\nI made a statement about a paper Dennis Ritchie wrote, after finding it again it appears it was Ken Thompson that wrote it,<br> easy enough mistake to make ;)<br>\r\nhttp://cm.bell-labs.com/who/ken/trust.html<br>\r\n<br><br>',3,0,1,'CC-BY-NC-SA','',0,0,1),
(29,'2005-10-27','Edubuntu on an old computer for children',756,'','No Shownotes Provided.',1,0,1,'CC-BY-NC-SA','',0,0,1),
(30,'2005-10-30','TWAT Info',482,'','Twat is taking a break for a month. <br>We all need to take this month, make some episodes, get new listeners, get new hosts, and make twat so that it is updated every day.<br> p0trill0 is the new site admin, so that we will have more than one person trying to keep things updated.<br>\r\n<br>\r\nDec 1st will start Twat back up again, hopefully with more hosts and more interesting content.<br>\r\n<br>\r\nThanks to all that have gotten us this far.<br>\r\n<br>\r\ndroops had a bit of wine, so if you like infonomicon radio, you really need to listen to this one<br>\r\n\r\n',1,0,1,'CC-BY-NC-SA','',0,0,1),
(31,'2005-11-30','droops starts it off and then it quickly',1125,'','No Shownotes Provided.',1,0,1,'CC-BY-NC-SA','',0,0,1),
(32,'2005-12-01','Password Management',350,'','Many of us have the problem of trying to remember and un-godly amount of\r\npasswords for the various services and programs that we use on a daily\r\nbasis.<br> So I am gonna talk about portable password managment solutions. <br>All\r\nthe passwords are protected by one master password that is necessary to\r\noperating the software.<br> Some of the software packages also have the\r\nfunctionality of creating pseudo-random passwords on the fly, so if you need\r\na new password you dont have to make one up, the software will make one for\r\nyou and I promise it will be more secure than anything you can think of.<br>\r\n<br>\r\nhttp://www.roboform.com<br>\r\nhttp://www.keywarden.com<br>',2,0,1,'CC-BY-NC-SA','',0,0,1),
(33,'2005-12-04','sql injection',351,'','Sample Injection: OR1=1<br>\r\nQuery sent with this injection:<br> SELECT FROM users WHERE OR1=1<br>\r\n<br>\r\nSample ODBC Error:<br>\r\n<br>\r\nMicrosoft OLE DB <br>Provider for ODBC Drivers error 80040e14<br>\r\n<br>\r\n[Microsoft][ODBC SQL<br> Server Driver][SQL Server]Unclosed quotation mark before the character string \\\'.<br>\r\n<br>\r\n*****************/logon.asp,<br> line 4\r\n<br>\r\nhttp://us2.php.net/manual-lookup.php?pattern=escape_string<br>\r\n<br>\r\nth3j0k3r@gmail.com<br>',12,0,1,'CC-BY-NC-SA','',0,0,1),
(34,'2005-12-05','Piracy',2481,'','No Shownotes Provided.',18,0,1,'CC-BY-NC-SA','',0,0,1),
(35,'2005-12-06','Switches and Hubs',806,'','No Shownotes Provided.',19,0,1,'CC-BY-NC-SA','',0,0,1),
(36,'2005-12-07','Secure Deletion',729,'','No Shownotes Provided.',2,0,1,'CC-BY-NC-SA','',0,0,1),
(37,'2005-12-08','Various things',1212,'','Studio Buddy <br>\r\nhttp://www.studiobuddy.com<br>\r\nhttp://www.studiobuddy.com/thankyouindex.html<br>\r\n<br>\r\nMusicians Friend <br>\r\nhttp://www.musiciansfriend.com<br>\r\n<br>\r\nSweetwater <br>\r\nhttp://www.sweetwater.com<br>\r\n<br>\r\nAmerican Music Supply <br>\r\nhttp://www.americanmusical.com <br>',46,0,1,'CC-BY-NC-SA','',0,0,1),
(38,'2006-03-04','Dr^ZigMan & Lowtek Mystik',624,'','Sharing some of their recent hardware experiences.<br> Dr^ZigMan does the video Hack TV at Binrev Lowtek Mystik hosts Ninja Night School Radio at Podcast Incubator',27,0,1,'CC-BY-NC-SA','',0,0,1),
(39,'2005-12-12','Change MAC address',383,'','http://www.irongeek.com/i.php?page=security/changemac<br>\r\n<br>\r\nLinux Commands to change MAC address:<br>\r\n<br>\r\nifconfig eth0 down hw ether 00:00:00:00:00:01<br>\r\nifconfig eth0 up<br>\r\n<br>\r\nWindows Tools:<br>\r\n<br>\r\nMac Makeup<br>\r\n<br>\r\nSmac<br>\r\n<br>\r\nEtherchange<br>\r\n',9,0,1,'CC-BY-NC-SA','',0,0,1),
(40,'2005-12-13','Microsoft Virtual Desktop Manager',274,'','No Shownotes Provided.',1,0,1,'CC-BY-NC-SA','',0,0,1),
(41,'2005-12-14','Ultimate Linux box',508,'','No Shownotes Provided.',20,0,1,'CC-BY-NC-SA','',0,0,1),
(42,'2005-12-15','Seven Bits, No Waiting',229,'','No Shownotes Provided.',13,0,1,'CC-BY-NC-SA','',0,0,1),
(43,'2005-12-18','Sam File',712,'','Irongeeks PE Builder Tutorial<br>\r\n<br>\r\nSalas Password Renew Tool<br>\r\n<br>\r\nOffline NT Password & Registry Editor<br>\r\n<br>\r\nCain<br>\r\n<br>\r\nBKhive<br>\r\n<br>\r\nJohn the Ripper<br>\r\n<br>\r\nRainbowCrack<br>\r\n<br>\r\nOPHCRACK<br>\r\n<br>\r\nTurn off LM Hash storage<br>\r\n<br>\r\nIrongeeks Videos and articles on SAM<br> cracking:<br>\r\nLocal Sam Crack<br>\r\nLocal Sam Crack part 2<br>\r\nLocalPasswordCracking\r\n<br>SamDump2 in Auditor\r\n\r\n<br>\r\nSmac<br>\r\n<br>\r\nEtherchange<br>\r\n',9,0,1,'CC-BY-NC-SA','',0,0,1),
(44,'2005-12-20','Serial Port',323,'','<a href=\\\"http://www.lcdgallery.net/\\\">LCD Gallery</A>\r\n<br>\r\n<a href=\\\"http://www.eio.com/lcd2014.gif\\\">Diagram</a>\r\n',8,0,1,'CC-BY-NC-SA','',0,0,1),
(45,'2005-12-20','Tour of Boston Telephone System',915,'','No Shownotes Provided.',14,0,1,'CC-BY-NC-SA','',0,0,1),
(46,'2005-12-21','Package Management Systems',614,'','No Shownotes Provided.',11,0,1,'CC-BY-NC-SA','',0,0,1),
(47,'2005-12-22',' ',1502,'','http://desktopmanager.berlios.de/\r\n\r\nhttp://quicksilver.blacktree.com/\r\n\r\nFluxbox fbkeys entery:\r\n\r\nMod1 space :execCommand fbrun\r\n\r\nWindowmaker entery:\r\n\r\n(Run, SHORTCUT, Mod1+space, EXEC, %a(Run,Type command to run:)),\r\n\r\ncp parameters to copy partition to new location:\r\n\r\ncp -a same as -dpr\r\n\r\n * no-deference=dont follow links\r\n preserve links\r\n * reserve permissions\r\n * recursive\r\n\r\n',7,0,1,'CC-BY-NC-SA','',0,0,1),
(79,'2006-03-08','Paypal Integration',849,'','http://www.infonomicon.org/ziggy1/twat79/buynowbutton.inc.php.txt',27,0,1,'CC-BY-NC-SA','',0,0,1),
(48,'2005-12-26','Video cameras',1306,'','\r\n<a href=\\\"http://deadbeef.packetsniffers.org/beginners_guide.html\\\">More video production info:</a>\r\n',3,0,1,'CC-BY-NC-SA','',0,0,1),
(49,'2005-12-27','RPG Programming',2046,'','No Shownotes Provided.',2,0,1,'CC-BY-NC-SA','',0,0,1),
(50,'2005-12-28','Remote Logins',715,'','FreeNX can be found at <a href=\\\"http://freenx.berlios.de\\\">\r\nFreeNX can be found at</a>',21,0,1,'CC-BY-NC-SA','',0,0,1),
(51,'2005-12-29','YAPL',1148,'','Lowtek too!!\r\n',2,0,1,'CC-BY-NC-SA','',0,0,1),
(52,'2006-01-05','Asterisk@Home',704,'','<a href=\\\"http://asteriskathome.sourceforge.net\\\">http://asteriskathome.sourceforge.net</a><br>\r\n<a href=\\\"http://asterisk.org\\\">http://asterisk.org</a><br>\r\n<a href=\\\"http://www.voxilla.com\\\">voxilla.com</a><br>\r\n<a href=\\\"http://www.voip-info.org\\\">voip-info.org</a><br>\r\n<a href=\\\"http://www.nuphone.net\\\">nuphone.net</a><br>\r\n<a href=\\\"http://www.voipjet.com\\\">voipjet.com</a>',12,0,1,'CC-BY-NC-SA','',0,0,1),
(53,'2006-01-02','Emulation Station',545,'','Disclamer ( Be good and follow Rules! ) - http://www.electrostuff.net/romsmain.htm\r\n\r\nPictures And Two short movies of my rig. - http://www.electrostuff.net/phpbb2/viewtopic.php?p=34#34\r\n\r\nEmulators - http://www.emulator-zone.com/\r\n\r\nRoms - http://www.freeroms.com/ - http://www.rom-world.com ',22,0,1,'CC-BY-NC-SA','',0,0,1),
(54,'2006-01-03','Remote Control Hacking',932,'','No Shownotes Provided.',81,0,1,'CC-BY-NC-SA','',0,0,1),
(55,'2006-01-04','Listen',505,'','No Shownotes Provided.',24,0,1,'CC-BY-NC-SA','',0,0,1),
(56,'2006-01-05','QWERTY History',1339,'','No Shownotes Provided.',23,0,1,'CC-BY-NC-SA','',0,0,1),
(57,'2006-01-08','Hacker Salsa',519,'','No Shownotes Provided.',26,0,1,'CC-BY-NC-SA','',0,0,1),
(58,'2006-01-09','Softball Launcher',387,'','Dr^ZigMan discusses his thinking process during the initial development and\r\n“fabrication” of a softball launcher.\r\n\r\nMore information on <a href=\\\"http://www.gaffer.org/articles/Springs.html\\\"><br>\r\n\r\nspring constant k values </a>\r\n',27,0,1,'CC-BY-NC-SA','',0,0,1),
(59,'2006-01-10','VLAN\\\'s',1290,'','http://mcbx.dyndns.org/pub/TWATs/twat059_notes.txt',19,0,1,'CC-BY-NC-SA','',0,0,1),
(60,'2006-01-11',' DSDT.aml And Linux',756,'',' <p><a href=\\\"http://acpi.sourceforge.net/dsdt/index.php\\\">DSDT repository</a></p>\r\n <p><a href=\\\"http://gentoo-wiki.com/HOWTO_Fix_Common_ACPI_Problems\\\">Great how-to that got me Started</a></p>\r\n <p><a href=\\\"http://developer.intel.com/technology/iapc/acpi/downloads.htm\\\">Intels ASL Compiler</a></p>\r\n <p>You will need to have bison and flex-old install to make iasl</p>\r\n <p>To obtain your present dsdt file drop to term and type<br>\r\n cat /proc/acpi/dsdt &gt; dsdt.dat </p>\r\n\r\n <p>To decompile dsdt.dat and get a dsdt.dsl drop to term and type<br>\r\n ./iasl -d dsdt.dat </p>\r\n <p>To recompile dsdt.dsl and get a DSDT.aml drop to term and type<br>\r\n ./iasl -tc dsdt.dsl</p>',21,0,1,'CC-BY-NC-SA','',0,0,1),
(61,'2006-01-16','Windows browsing at work',484,'','http://www.htthost.com/\r\n\r\nhttp://www.ghostzilla.com/\r\n\r\nhttp://www.proxyplus.cz/\r\n\r\nTheYellow1- at- gmail.com',70,0,1,'CC-BY-NC-SA','',0,0,1),
(62,'2006-01-17','WRT hacking',293,'','Will Jason\r\n\r\n***Hacking the WRT54G***\r\n\r\n-WRT54G is a Linksys router and highly customizable with custom firmwares\r\n\r\n-WRT54G - 16 MB of RAM & 4 MB of Flash\r\nWRT54GS - 32 MB of RAM & 8 MB of Flash\r\n\r\n-WRT54GS version 5 is not hackable because of the reduced RAM and Flash size. Instead of running Linux, it runs VxWorks. Because of this, Linksys has released the WRT54GL to appeal to the modders of the community. WRT54GL is the same as the older version of the WRT54G.\r\n\r\n-Any other version of WRT54G or GS will work\r\n\r\n-If you have to pay for a good firmware, then youre getting ripped off\r\n\r\n-DD-WRT is for those who wants more options in the router without the configuration of everything else. Simply upload via the web interface and youre done.\r\n\r\n-OpenWRT has the ipkg package management system included and many packages are available to add. You could virtual host a site, run a small FTP server, or set up an Asterisk box. Id love to list all of the things you could do, but thatd take a while.\r\n\r\n-For free firmwares:\r\nDD-WRT > http://www.dd-wrt.com\r\nOpenWRT > http://www.openwrt.org\r\n\r\n-There are plenty more choices for firmwares, but I only named two. I think that theyre the best, but strictly opinion.\r\n\r\n-email me at willjasen -at- charter.net. I know I said Gmail on the show, but I thought I was prepared to switch, but Im not. ',71,0,1,'CC-BY-NC-SA','',0,0,1),
(63,'2006-01-17','TWAT',233,'','No Shownotes Provided.',1,0,1,'CC-BY-NC-SA','',0,0,1),
(64,'2006-01-19','Cygwin Exploits',404,'','No Shownotes Provided.',9,0,1,'CC-BY-NC-SA','',0,0,1),
(65,'2006-01-22','Xampp',274,'','http://www.apachefriends.org/de/\r\n\r\ntar xvfz xampp-linux-1.5.1.tar.gz -C /opt\r\n/opt/lampp/lampp start \r\n',1,0,1,'CC-BY-NC-SA','',0,0,1),
(66,'2006-01-23','Numbering Systems for noobs',0,'','============================\r\nDecimal (Base 10 system)\r\n\r\n143\r\n||1.1*3 +\r\n|1010*4 +\r\n100..100*1\r\n\r\n= 143\r\n\r\n============================\r\nBinary (Base 2 system)\r\n\r\n10001111\r\n|||||||1..1*1 +\r\n||||||22*1 +\r\n|||||4.4*1 +\r\n||||8..8*1 +\r\n|||16.16*0 +\r\n||32..32*0 +\r\n|6464*0 +\r\n128..128*1\r\n\r\n= 143 (decimal)\r\n\r\n============================\r\nHexadecimal (Base 16 system)\r\nShorthand for binary\r\n\r\n 10001111 (segment into groups of 4s)\r\n ^\r\n |\r\n1000 | 1111\r\n 8 F\r\n\r\n= 8F or 0×8F\r\n\r\n',46,0,1,'CC-BY-NC-SA','',0,0,1),
(68,'2006-01-25','Caffeine!',563,'','No Shownotes Provided.',8,0,1,'CC-BY-NC-SA','',0,0,1),
(70,'2006-01-26','Editing in linux',1448,'','Applications\r\n\r\nTranscode\r\n\r\nMplayer/Mencoder\r\n\\\\\r\n\r\nKino & Linux Digital Video\r\n\r\nLiVES\r\n\r\ntovid\r\n\r\nVideo Lan Client\r\n\r\nQdvdauthor',11,0,1,'CC-BY-NC-SA','',0,0,1),
(71,'2006-01-29','OAT\\\'s',329,'','No Shownotes Provided.',4,0,1,'CC-BY-NC-SA','',0,0,1),
(72,'2006-01-30','More goodness on video production in Lin',1468,'','PAT too!!!!',7,0,1,'CC-BY-NC-SA','',0,0,1),
(73,'2006-02-02','TWAT',139,'','no reason to listen to this one folks, we are talking the month of febuary off, to work on the show. We didnt plan for twat to be become so polular, and we need to get a few things done. First off we need more hosts and backup episodes, but we all know that, why are we all not helping? second of all, we need to get away from wordpress and build our own system. wordpress is nice as it is easy to edit, but its not real searchable, we cant have a chart of how many shows people have done, things are not formatted the same, so we are building our own cms. so take the month off, do something productive, and get some twat eps recorded.\r\n\r\nif you want to help with the website, we need a graphics guy, please email droops@gmail if you are any good at such things.\r\n\r\n',1,0,1,'CC-BY-NC-SA','',0,0,1),
(74,'2006-02-28','WRT Hacking',2199,'','yes!!!',81,0,1,'CC-BY-NC-SA','',0,0,1),
(75,'2006-03-01','DVD Copying',609,'','<a href=\\\"http://www.dvdshrink.org\\\">DVD Shrink</a><br>\r\n<a href=\\\"http://tinyurl.com/k4ms6\\\">DVD Decrypter</a><br>\r\n<a href=\\\"http://tinyurl.com/n7oj7%20\\\">PgcEdit</a><br>\r\n<a href=\\\"http://tinyurl.com/bgrv8\\\">How To Copy ArccOS & Plugin</a><br><br>\r\nCan you copy?<br>\r\n<a href=\\\"http://tinyurl.com/s44gs\\\"><br>\r\nCnet Info</a><br>\r\n<a href=\\\"http://tinyurl.com/qfe3m\\\">PCWorld</a>',22,0,1,'CC-BY-NC-SA','',0,0,1),
(76,'2006-03-05','Setting up an Icecast server',1490,'','<a href=\\\"http://www.icecast.org\\\">icecast homepage</a><br>\r\n<a href=\\\"http://www.xiph.org\\\">Xiph Foundation</a><br>\r\n<a href=\\\"http://muse.dyne.org\\\">MuSE - Multistreaming Engine</a><br>\r\n<a href=\\\"http://dynebolic.org\\\">Dynebolic - Live Multimedia Linux Distro</a><br><br>\r\nThat xargs command:<br>\r\nls *.[mp3,ogg]* | xargs -i echo http://myhost.org:8000/{}” > playlist.m3u',7,0,1,'CC-BY-NC-SA','',0,0,1),
(77,'2006-03-06','Cron Jobs',525,'','quick and drity cron jobs.',1,0,1,'CC-BY-NC-SA','',0,0,1),
(78,'2006-03-07','Jason Scott ',267,'','Jason Scott follows Droops to a new awakening.',13,0,1,'CC-BY-NC-SA','',0,0,1),
(80,'2006-03-09','Honeypots',434,'','http://www.honeynet.org/papers/uml/\r\n\r\nhttp://www.securityfocus.com/infocus/1803\r\n\r\nhttp://www.securityfocus.com/infocus/1805\r\n',10,0,1,'CC-BY-NC-SA','',0,0,1),
(81,'2006-03-12','AUDACITY GO!!',2680,'','Introduction of Audacity, and the basics of making a audiofile in Audacity. (44:40)\r\n<br>\r\nDownload OGG or MP3<br>\r\nhttp://www.twatech.org/eps/twat081.ogg<br>\r\nhttp://www.twatech.org/eps/twat081.mp3<br>\r\n\r\nAudacity Homepage & Audacity Forums (f.a.q. and other help)<br>\r\nhttp://audacity.sourceforge.net/<br>\r\nhttp://audacityteam.org/forum/<br>\r\n\r\ndB Power Amp for conversion of audio files. <br>\r\nhttp://www.dbpoweramp.com/<br>',23,0,1,'CC-BY-NC-SA','',0,0,1),
(83,'2006-03-15','Wireless Client Mode',834,'','No Shownotes Provided.',71,0,1,'CC-BY-NC-SA','',0,0,1),
(82,'2006-03-14','Windows Command Line',834,'','<a href=\\\"http://tinyurl.com/kmy\\\">Windows 2000 Command Line Reference</a> http://tinyurl.com/kmy<br />\r\n<a href=\\\"http://tinyurl.com/36leu\\\">Windows XP Command Line Reference</a> http://tinyurl.com/36leu<br />\r\n<a href=\\\"http://tinyurl.com/qaer3\\\">Windows 2003 Command Line Reference</a> http://tinyurl.com/qaer3<br />\r\n\r\n<a href=\\\"http://tinyurl.com/nuvhj\\\">REGFIND</a><br />\r\n<a href=\\\"http://tinyurl.com/isxm\\\">Description of the Microsoft Windows registry</a>',28,0,1,'CC-BY-NC-SA','',0,0,1),
(84,'2006-03-19','HTTrack',479,'','\r\n\r\n<a href=\\\"http://www.httrack.com \\\">\r\nHTTrack</a>',21,0,1,'CC-BY-NC-SA','',0,0,1),
(85,'2006-03-21','Cybiko',961,'','<a href=\\\"http://www.dbzoo.com/wiki/cybiko/cybiko/\\\">DBZoo\\\'s Cybiko Wiki </a>\r\n<br><br>\r\n<a href=\\\"http://thinkable.us/DevCybiko/\\\">DevCybiko:</a> The last best resource for Cybiko users. Active forums and a very good softare archive.\r\n',3,0,1,'CC-BY-NC-SA','',0,0,1),
(86,'2006-03-23','RFID',1880,'','Co-Host: Lowtek Mystik<br>\r\n<br>\r\nToday\'s show is all about RFID and an introduction into the technology and possibilites.<br>\r\n<br>\r\n<a href=\\\"http://www.rfidtoys.net/\">Software</a><br>\r\n<br>\r\n<a href=\\\"http://tinyurl.com/exm59\">Get the book</a><br>\r\n<br>\r\n<a href=\\\"http://tinyurl.com/g2c24\">125Khz Reader</a><br>\r\n',2,0,1,'CC-BY-NC-SA','',0,0,1),
(87,'2006-03-27','Pat - Me and Linux',688,'','No notes provided.',11,0,1,'CC-BY-NC-SA','',0,0,1),
(88,'2006-03-28','Building More Secure Web Applications',594,'','<a href=\\\"http://muffin.doit.org\\\">muffin</a><br />\r\n<a href=\\\"http://addneditcookies.mozdev.org\\\">add n edit cookies</a><br />\r\n<a href=\\\"http://refspoof.mozdev.org\\\">refspoof</a><br />\r\n<a href=\\\"http://chrispederick.com/work/webdeveloper\\\">web developer toolbar</a><br />\r\n<a href=\\\"http://chrispederick.com/work/useragentswitcher\\\">user-agent switcher</a><br /><br />\r\n<u>Comment System Looking for onmouseover</U><br />\r\n\r\nif ((isset($_POST)) && $_POST[\\\'name\\\'] != NULL && $_POST[\\\'comment\\\'] != NULL && $_POST[\\\'comment\\\'] != \\\"Enter your comment here!\\\" && !strstr($emaillower,\\\'onmouseover=\\\')) {\r\n',12,0,1,'CC-BY-NC-SA','',0,0,1),
(89,'2006-03-29','Fun at Security Cons',537,'','No Shownotes',9,0,1,'CC-BY-NC-SA','',0,0,1),
(90,'2006-03-30','Free-win32',611,'','Zerocost programs for Windows\r\n<br />\r\nWebsite: http://www.iunplug.nl/Windows',30,0,1,'CC-BY-NC-SA','',0,0,1),
(91,'2006-04-02','Computer Troubleshooting tips',704,'','Contact me at xcalibur1337 -at- gmail.com',31,0,1,'CC-BY-NC-SA','',0,0,1),
(92,'2006-04-03','DVD Region Unlocking',367,'','<a href=\\\"http://www.rpc1.org\\\">http://www.rpc1.org</a> Region free firmware database<br />\r\n<a href=\\\"http://www.doom9.org/Soft21/Regionfree/driveinfo22.zip\\\">drive info</a>',12,0,1,'CC-BY-NC-SA','',0,0,1),
(93,'2006-04-04','Terminal Servers and Thin Clients',555,'','<a href=\"http://www.ltsp.org\\\">Linux Terminal Server Project</a><br />\r\n\r\n<a href=\"http://tinyurl.com/59ml\">Windows Server 2003 Terminal Services</a><br />\r\n\r\n<a href=\"http://tinyurl.com/r486v\">\r\nWindows 2000 Terminal Services</a><br />\r\n\r\n<a href=\"http://tinyurl.com/84kx5\">Gamecube Linux</a><br />\r\n\r\n<a href=\"http://pxes.sourceforge.net\">PXES Linux</a>',32,0,1,'CC-BY-NC-SA','',0,0,1),
(94,'2006-04-05','Danger Sidekick Mod!',523,'','Adding a little color to the drab grey exterior, a quick walk through of how I painted my sidekick. Now my sidekick is l33t because It has a custom paintjob, and for less then you would spend on a USB key you can have an uber 1337 sidekick too!',27,0,1,'CC-BY-NC-SA','',0,0,1),
(95,'2006-04-10','Windows from commandline',947,'','<br>\r\n<a href=\\\"http://tinyurl.com/ac9d\\\">MSDN entry describing Services</a><br>\r\n<a href=\\\"http://tinyurl.com/s78tk\\\">SC.ZIP</a><br>\r\n<a href=\\\"http://tinyurl.com/p6kct\\\">SC For Window 2003 Manual</a><br>\r\n<a href=\\\"http://tinyurl.com/hx8nc\\\">SRVANY.ZIP</a><br>\r\n<a href=\\\"http://tinyurl.com/kh9lp\\\">SP4 Support Tools</a><br>',28,0,1,'CC-BY-NC-SA','',0,0,1),
(96,'2006-04-11','Linux Distros',1379,'','Article for Topic Idea <br>http://www.linuxforums.org/reviews/overview_of_the_ten_major_linux_distributions.html<br>\r\n<br>\r\n<br>\r\nDebian and Derivs.<br>\r\n<br>\r\nDebian http://www.debian.org/<br>\r\nDamn Small Linux http://www.damnsmalllinux.org/<br>\r\nKnoppix http://www.knoppix.com/<br>\r\nKanotix http://kanotix.com/index.php?&newlang=eng<br>\r\nMepis http://www.mepis.com/<br>\r\nUbuntu http://www.ubuntu.com/<br>\r\nXandros http://www.xandros.com/<br>\r\n<br>\r\nRpm Based<br>\r\n<br>\r\nFedora http://fedoraproject.org/wiki/<br>\r\nMandriva http://wwwnew.mandriva.com/<br>\r\nOpenSuSE http://en.opensuse.org/Welcome_to_openSUSE.org<br>\r\n<br>\r\nSource and Other<br>\r\n<br>\r\nSlackware http://www.slackware.com/<br>\r\nBackTrack http://www.remote-exploit.org/index.php/Main_Page<br>\r\nGentoo http://www.gentoo.org/<br>\r\nArchLinux http://www.archlinux.org/<br>\r\n<br>\r\nCheck Here for any Distro! http://distrowatch.com/<br>\r\n',21,0,1,'CC-BY-NC-SA','',0,0,1),
(97,'2006-04-13',' Physical Security Case Mods part 1',451,'','no notes',26,0,1,'CC-BY-NC-SA','',0,0,1),
(98,'2006-04-17','Audacity Tips',1124,'','\r\n\r\nTWAT 98 explains how to fix varried audio decibel levels and/or boost an audio t\r\nrack\\\'s decibel levels using tools in Audacity.',7,0,1,'CC-BY-NC-SA','',0,0,1),
(99,'2006-04-19','Water Cooling Rig',454,'','<a href=\"http://www.electrostuff.net/phpbb2/viewtopic.php?t=291\">Water Rig!</a>',22,0,1,'CC-BY-NC-SA','',0,0,1),
(100,'2006-04-23','The 100th Episode Spectacular',671,'','this episode is on default',33,0,1,'CC-BY-NC-SA','',0,0,1),
(101,'2006-04-24','Shoutcast',498,'','No shownotes Submitted.',34,0,1,'CC-BY-NC-SA','',0,0,1),
(102,'2006-04-25','Carriage Return',939,'','No notes',81,0,1,'CC-BY-NC-SA','',0,0,1),
(103,'2006-04-26','Notafighter',649,'','<a href=\\\"http://www.packetsniffers.org/projects/notafighter\\\">Notafighter</a>',3,0,1,'CC-BY-NC-SA','',0,0,1),
(104,'2006-04-27','Myth TV',700,'','MythTV Related websites and mailing lists:<br>\r\n<br>\r\n<a href=\\\"http://www.mythtv.org/\\\">http://www.mythtv.org/</a>\r\n<br><a href=\\\"http://www.mythtv.org/mailman/listinfo/mythtv-users/\\\">http://www.mythtv.org/mailman/listinfo/mythtv-users/</a>\r\n<br><a href=\\\"http://www.hauppauge.com/\\\">http://www.hauppauge.com/</a>\r\n<br><a href=\\\"http://www.pchdtv.com/hd_3000.html\\\">http://www.pchdtv.com/hd_3000.html</a>\r\n<br><a href=\\\"http://mysettopbox.tv/knoppmyth.html\\\"><http://mysettopbox.tv/knoppmyth.html/a>\r\n<br><a href=\\\"http://wilsonet.com/mythtv/fcmyth.php\\\">http://wilsonet.com/mythtv/fcmyth.php</a>\r\n<br><a href=\\\"http://ivtv.sourceforge.net/\\\">http://ivtv.sourceforge.net/</a>\r\n',11,0,1,'CC-BY-NC-SA','',0,0,1),
(105,'2006-04-30','Footprinting',715,'','No notes',35,0,1,'CC-BY-NC-SA','',0,0,1),
(106,'2006-05-01','Alternative Data Streams',557,'','<a href=\"http://www.irongeek.com/i.php?page=security/altds\\\">Alternative Data Streams</a>',9,0,1,'CC-BY-NC-SA','',0,0,1),
(107,'2006-05-02','Portable Tools',874,'','<a href=\\\"http://unxutils.sourceforge.net\\\">\\\"GNU utilities for Win32\\\"</a><br>\r\n<a href=\\\"http://cygwin.com\\\">Cygwin</a><br>\r\n<a href=\\\"http://www.dependencywalker.com\\\">Dependancy Walker</a><br>\r\n<a href=\\\"http://www.sysinternals.com\\\">Sysinternals is only ctrl+enter away</a><br>\r\n<a href=\\\"http://www.winpcap.org\\\">Windump</a><br>\r\n<a href=\\\"http://www.microolap.com/products/network/tcpdump/\\\">TCPDump</a><br>\r\n',28,0,1,'CC-BY-NC-SA','',0,0,1),
(108,'2006-05-03','NSLU 2',761,'','<a href=\\\"http://tinyurl.com/9bpgq\\\">http://tinyurl.com/9bpgq</a><br>\r\n<br><a href=\\\"http://nslu2-linux.org\\\"> NSLU2</a>\r\n',71,0,1,'CC-BY-NC-SA','',0,0,1),
(109,'2006-05-04','The Gizmo Project!',970,'','<a href=\\\"http://www.gizmoproject.com\\\"> The Gizmo Project</a>',23,0,1,'CC-BY-NC-SA','',0,0,1),
(110,'2006-05-07','Sound Treatment Solutions',1157,'','No notes provided',46,0,1,'CC-BY-NC-SA','',0,0,1),
(111,'2006-05-08','Physical Security Case Mods part 2',562,'','No Notes',26,0,1,'CC-BY-NC-SA','',0,0,1),
(112,'2006-05-14','Reverse Engineering Part 1',1051,'','Chapter #1 of Security Warrior.<br>\r\n<br>\r\nKn1ghtl0rd reads the first chapter of Security Warrior about assembly language for reverse engineering. This is a good topic that I am learning about and this book has some good information so I am giving you a preview of the kinds of stuff in this book. I am giving full credit to the authors for the content and I hope this inspires you to go out and get the book and learn more about RCE.<br>\r\n<br>\r\n<a href=\"http://www.amazon.com/gp/product/0596005458/sr=8-1/qid=1147725119/ref=pd_bbs_1/104-9598123-4775116?%5Fencoding=UTF8\">Security Warrior on Amazon</a><br>\r\n<br>\r\n',2,0,1,'CC-BY-NC-SA','',0,0,1),
(113,'2006-05-17','Newsgroups',365,'','Quickie about newsgroups, recorded from work. ',36,0,1,'CC-BY-NC-SA','',0,0,1),
(114,'2006-05-18','New Project',457,'','Me rambling on about a new project being launched. I know its not the most interesting twat but hey check it out, it may spark an interest in the new project.',12,0,1,'CC-BY-NC-SA','',0,0,1),
(115,'2006-05-21','Homo-nomicon',40,'','\\\"I\\\'m.... a sexy motherfucker.\\\"',4,0,1,'CC-BY-NC-SA','',0,0,1),
(116,'2006-05-22','Irc Scripting',338,'','<a href=\\\"http://www.electrostuff.net\\\">Electro Stuff!</a><br>\r\n<a href=\\\"http://techcooks.com/\\\">Tech Cooks!</a>',22,0,1,'CC-BY-NC-SA','',0,0,1),
(117,'2006-05-23','ToVid ',617,'','Linux Video Authoring!!!',11,0,1,'CC-BY-NC-SA','',0,0,1),
(118,'2006-05-25','Compiling software under Linux ',1824,'',' An overview of the ./configure, make, make inst\r\nall process; some tips and what not.',7,0,1,'CC-BY-NC-SA','',0,0,1),
(119,'2006-05-29','External Memory',505,'','Memorial Day!!!! Yay! <br>\r\n<br>\r\n\\\'DPG\\\' is Dollars per Gigs, or Price/Gigs.<br>\r\nThe lower the DPG, the better the deal!<br>\r\nExample: $125/100GB = 1.25 DPG<br>\r\n<br>\r\n<a href=\\\"http://www.TigerDirect.com\\\"> Tiger Direct</a><br>\r\n<a href=\\\"http://www.Geeks.com\\\">Geeks!</a><br>\r\n<br>\r\nTWAT theme in doublespeed! w00t w00t!<br>\r\n<br>\r\nxcalibur1337 [at] gmail [dot] com<br>\r\n',31,0,1,'CC-BY-NC-SA','',0,0,1),
(120,'2006-05-31','Firefox Secrets',340,'',' A couple of quick tips of features built into mozilla firefox<br>\r\n\r\n<a href=\\\"http://www.podcastincubator.com/dra\\\"> Lord Drachenblut</a>',24,0,1,'CC-BY-NC-SA','',0,0,1),
(121,'2006-07-02','Real Server',440,'','how to start the server <br>\r\n\\\"C:\\\\Program Files\\\\Real\\\\Helix Server\\\\Bin\\\\rmserver.exe\\\"<br> \\\"C:\\\\Program Files\\\\Real\\\\Helix Server\\\\rmserver.cfg\\\"<br>\r\n<br>\r\nyou can also save everything you setup on producer in a rpjf file<br>\r\n<br>\r\nexample rmserver.cfg<br>\r\n<br>\r\n\r\n<Var RTSPPort=\\\"25\\\"/><br>\r\n<Var PNAPort=\\\"70\\\"/><br>\r\n<Var HTTPPort=\\\"8080\\\"/><br>\r\n<Var MMSPort=\\\"1755\\\"/><br>\r\n<Var MonitorPort=\\\"9090\\\"/><br>\r\n<Var AdminPort=\\\"14185\\\"/><br>\r\n\r\n\r\n<br>\r\nscreen shot of main configure options for producer<br>\r\n\r\n<a href=\"http://rmccurdy.com/stuff/TWAT/twat_real_server.jpg\">\r\nScreenshot\r\n<br>',36,0,1,'CC-BY-NC-SA','',0,0,1),
(122,'2006-07-04','Getting started with PHP on windows',975,'','Think you might be interested in learning PHP? Here is a\r\nquick show to help you get started. In this show I go over most\r\neverything you need to do or aquire in order to start programming PHP.\r\n\r\n',37,0,1,'CC-BY-NC-SA','',0,0,1),
(123,'2006-07-05','Python',1180,'','Learning with python though examples<br><br>\r\n\r\nMicrosoft Windows XP [Version 5.1.2600]<br>\r\n(C) Copyright 1985-2001 Microsoft Corp.<br>\r\nC:\\\\>python<br>\r\nPython 2.4.3 (#69, Mar 29 2006, 17:35:34) [MSC v.1310 32 bit (Intel)] on win32<br>\r\nType \\\"help\\\", \\\"copyright\\\", \\\"credits\\\" or \\\"license\\\" for more information.<br>\r\n>>> print \\\"HELLO\\\" # Number signs will comment<br>\r\nHELLO<br>\r\n\r\n<br>\r\n>>> name = \\\"Cotton\\\" <br>\r\n# the variable \\\"name\\\" has been defined to the string \\\"Cotton\\\"<br>\r\n>>> def hello():<br>\r\n... print \\\"Hello there, %s\\\"%name<br>\r\n... <br>\r\n# hello() is now a function<br>\r\n>>> hello()<br>\r\nHello there, Cotton<br>\r\n\r\n<br>\r\n# alittle more complicated<br>\r\n<br>\r\n>>> def hello2(user): # we now made \\\"user\\\" and argument. <br>\r\n... print \\\"Hello there, %s\\\"% user<br>\r\n...<br>\r\n>>> hello2() <br>\r\n# U cannot call hello2(user) without an argument. <br>\r\nTraceback (most recent call last):<br>\r\n File \\\"<stdin>\\\", line 1, in ?<br>\r\n\r\nTypeError: hello2() takes exactly 1 argument (0 given)<br>\r\n<br>\r\n>>> hello2(\\\"infonomicon\\\")<br>\r\nHello there, infonomicon<br>\r\n<br>\r\n>>> nicks = [\\\"John\\\",\\\"Billy\\\", \\\"Python\\\", \\\"Cotton\\\", \\\"twat\\\"] #nicks has been defined as a list<br>\r\n>>> nicks<br>\r\n[\\\'John\\\', \\\'Billy\\\', \\\'Python\\\', \\\'Cotton\\\', \\\'twat\\\']<br>\r\n>>> for i in nicks:<br>\r\n... hello2(i)<br>\r\n\r\n...<br>\r\nHello there, John<br>\r\nHello there, Billy<br>\r\nHello there, Python<br>\r\nHello there, Cotton<br>\r\nHello there, twat<br>\r\n<br>\r\n# For more help, visit http://www.ibiblio.org/obp/thinkCSpy/ That site has helped me tremendously! <br>\r\n# Email me cbmailone[at]gmail[dot]com<br>\r\nGreat Python Tutorials:<br><br>\r\n<a href=\\\"http://www.ibiblio.org/obp/thinkCSpy/\\\">http://www.ibiblio.org/obp/thinkCSpy/</a><br>\r\n<a href=\\\"http://www.ibiblio.org/g2swap/byteofpython/read/index.html\\\">http://www.ibiblio.org/g2swap/byteofpython/read/index.html</a><br>\r\n<a href=\\\"http://diveintopython.org/toc/index.html\\\">http://diveintopython.org/toc/index.html</a><br',35,0,1,'CC-BY-NC-SA','',0,0,1),
(124,'2006-07-10','Bluecasing',470,'','<a href=\\\"http://www.irongeek.com/i.php?page=security/bluecasing1\\\">Bluecasing: War Nibbling, Bluetooth and Petty Theft</a>\r\n',9,0,1,'CC-BY-NC-SA','',0,0,1),
(125,'2006-07-16','Authentication With Apache',421,'','No notes submitted.',8,0,1,'CC-BY-NC-SA','',0,0,1),
(126,'2006-07-18','Caring for thumbdrives',1300,'','Everyone loves thumbdrives or otherwise USB data storage\r\ndevices. The moral of this story is be responsible & employ\r\nencryption.\r\n\r\nTrue Crypt can be used to encrypt practically anything, anywhere.\r\nSteve Gibson from Security Now covers True Crypt in podcast Episode\r\n#41.\r\n\r\nLexar sells a thumb drive that comes ready with encryption. Lexar\\\'s\r\nJump Drive Secure.',37,0,1,'CC-BY-NC-SA','',0,0,1),
(127,'2006-07-23','Getting Started With Snort',189,'','Snort is included with SuSE but not Red Hat. If you need it (or you want to upgrade), download the source distribution from http://www.snort.org and unpack it:\r\n<br /><br />\r\n$ tar xvpzf snort-*.tar.gz\r\n<br /><br />\r\nThen compile it:\r\n<br /><br />\r\n$ cd `ls -d snort-* | head -1`<br />\r\n$ ./configure<br />\r\n$ make\r\n<br /><br />\r\nand install the binary and manpage as root:\r\n<br /><br />\r\n# make install\r\n<br /><br />\r\nNext, create a logging directory. It should not be publicly readable, since it will contain potentially sensitive data:\r\n<br /><br />\r\n# mkdir -p -m go-rwx /var/log/snort\r\n<br /><br />\r\nFinally, install the configuration files and rules database:\r\n<br /><br />\r\n# mkdir -p /usr/local/share/rules<br />\r\n# cp etc/* rules/*.rules /usr/local/share/rules<br />',38,0,1,'CC-BY-NC-SA','',0,0,1),
(128,'2006-08-01','Retreating From Tech In Style',574,'','No notes submitted.',11,0,1,'CC-BY-NC-SA','',0,0,1),
(129,'2006-08-03','Building Packages for Arch Linux',1532,'','<h3>Building Packages for Arch Linux</h3>\r\n\r\n\r\n<p>For more information on building Arch Packages, consult the <a href=\\\"http://wiki.archlinux.org/index.php/ABS_-_The_Arch_Build_System\\\">Arch Build System How-to</a> on the Arch Wiki. </p>\r\n\r\n<p>The following is a sample PKGBUILD file for building MuSE. Note, the source file was on my system, so I did not specify a url for the source and have the package build system pull the source down from the server.</p>\r\n\r\npkgname=MuSE<br />\r\npkgver=0.9.2<br />\r\n\r\npkgrel=1<br />\r\npkgdesc=\\\"MuSE is an application for the mixing, encoding, and network streaming of sound: it can mix up to 6 encoded audio bitstreams (from files or network, mp3 or ogg) plus a souncard input signal, the resulting stream can be played locally on the sound card and/or encoded at different bitrates, recorded to harddisk and/or streamed to the net. When sent to a server, the resulting audio can be listened thru the net by a vast number of players available on different operating systems.\\\"<br />\r\nurl=\\\"http://muse.dyne.org/\\\"<br />\r\nlicense=\\\"gnu/gpl\\\"<br />\r\ndepends=(\\\'lame\\\' \\\'libogg\\\' \\\'libvorbis\\\' \\\'ncurses\\\' \\\'gtk\\\' \\\'libsndfile\\\')<br />\r\nmakedepends=()<br />\r\nconflicts=()<br />\r\nreplaces=()<br />\r\nbackup=()<br />\r\n\r\ninstall=<br />\r\nsource=($pkgname-$pkgver.tar.gz)<br />\r\nmd5sums=()<br />\r\n<br />\r\nbuild() {<br />\r\n cd $startdir/src/$pkgname-$pkgver<br />\r\n ./configure --prefix=/usr<br />\r\n make || return 1<br />\r\n\r\n make DESTDIR=$startdir/pkg install<br />\r\n}<br />\r\n',7,0,1,'CC-BY-NC-SA','',0,0,1),
(130,'2006-08-06','UltraVNC',680,'','<a target=blank href=\\\"http://ultravnc.sf.net\\\">http://ultravnc.sf.net</a><br>\r\n<a target=blank href=\\\"http://www.no-ip.com\\\">http://www.no-ip.com</a><br>\r\n<a target=blank href=\\\"http://www.dyndns.com\\\">http://www.dyndns.com</a><br>\r\n<a target=blank href=\\\"http://www.rmccurdy.com/stuff/TWAT/twat_SC_VNC.txt\\\">http://www.rmccurdy.com/stuff/twat_SC_VNC.txt</a> Example code bat file.<br>\r\n\r\n<a target=blank href=\\\"http://daymarerecords.com/music/AwwTistic/\\\">http://daymarerecords.com/music/AwwTistic</a> Music I produced that is in the show<br>',36,0,1,'CC-BY-NC-SA','',0,0,1),
(131,'2006-08-07','Firefox Tips',415,'','<p>Go to about:config and right click and go to new --> boolean and set the preference name to config.trim_on_minimize and set the boolean value to true.\r\n</p>\r\n<p>Now go to task manager -->process tab-->and look for firefox.exe and watch the memory usage drop when you minimize. I will have the show notes on my site, <a href=\"http://www.i-trash.org\\\">www.i-trash.org</a> if you missed anything. </p>\r\n\r\n',40,0,1,'CC-BY-NC-SA','',0,0,1),
(132,'2006-08-08','Office 2003 Voice recognition review',566,'','<br>Office 2003 bug fixes\r\n<br><a href=\\\"http://www.tau.ac.il/~itamarez/sr/mssr-2003.htm\\\">http://www.tau.ac.il/~itamarez/sr/mssr-2003.htm </a>\r\n<br>\r\n<br>voice recognition in Chinese \r\n<br><a href=\\\"http://office.microsoft.com/en-gb/assistance/HA010347511033.aspx\\\">http://office.microsoft.com/en-gb/assistance/HA010347511033.aspx </a>',39,0,1,'CC-BY-NC-SA','',0,0,1),
(133,'2006-08-09','XPlite and 2000lite',449,'','Lite PC\r\n<br>\r\n<a href=\\\"http://www.litepc.com/xplite.html\\\">http://www.litepc.com/xplite.html</a>',41,0,1,'CC-BY-NC-SA','',0,0,1),
(134,'2006-08-10','Apple Widgets',521,'','Very simple dissection of an apple widget.\r\n<p>\r\nDownload droops\\\' example at\r\n<br>\r\n<a href=\\\"http://infonomicon.org/widgets\\\">infonomicon.org/widgets</a>\r\n',1,0,1,'CC-BY-NC-SA','',0,0,1),
(135,'2006-08-13','How to Find a Job Online',504,'','No Show notes',36,0,1,'CC-BY-NC-SA','',0,0,1),
(136,'2006-08-14','Denial of Service',545,'','Wikipedia entry on Denial of Service <br>\r\n<a href=\\\"http://en.wikipedia.org/wiki/Denial-of-service_attack\\\">http://en.wikipedia.org/wiki/Denial-of-service_attack </a>\r\n<br><br>\r\nTcp Syn Floods <br>\r\n<a href=\\\"http://www.iss.net/security_center/advice/Exploits/TCP/SYN_flood/default.htm\\\">http://www.iss.net/security_center/advice/Exploits/TCP/SYN_flood/default.htm </a>\r\n<br><br>\r\nLand Attack wikipedia <br>\r\n<a href=\\\"http://en.wikipedia.org/wiki/LAND\\\"> http://en.wikipedia.org/wiki/LAND </a>',9,0,1,'CC-BY-NC-SA','',0,0,1),
(137,'2006-08-15','Securing the Asterisk Manager',615,'','No shownotes yet, i\\\'ll have a screenshot guide ready by the weekend and edit the shownotes when it\\\'s up. It should be straightforward enough anyways though.',12,0,1,'CC-BY-NC-SA','',0,0,1),
(138,'2006-08-17','Soft Moding an Xbox',592,'','No show notes',24,0,1,'CC-BY-NC-SA','',0,0,1),
(139,'2006-08-22','Honeypots',412,'','Honeypots (part 1 of 2)\r\n<BR>\r\n<br>\r\nIn computer terminology, a honeypot is a trap set to detect, deflect or in some manner counteract attempts at unauthorized use of information systems. Generally it consists of a computer, data or a network site that appears to be part of a network but which is actually isolated and protected, and which seems to contain information or a resource that would be of value to attackers. A honeypot that masquerades as an open proxy is known as a sugarcane.<br>\r\n<br>\r\n<a href=\"http://en.wikipedia.org/wiki/Honeypot\">http://en.wikipedia.org/wiki/Honeypot</a>\r\n<br>\r\n<br>\r\n\r\n',38,0,1,'CC-BY-NC-SA','',0,0,1),
(140,'2006-08-23','Running 32 bit apps in 64 bit Linux',544,'','<a href=\\\"http://www.getautomatix.com/\\\">http://www.getautomatix.com </a>\r\n<br>\r\n<a href=\"http://process-of-elimination.net/wiki/Ubuntu_32bit_CHROOT_for_AMD64 http://www.debian-administration.org/articles/356\">http://process-of-elimination.net/wiki/Ubuntu_32bit_CHROOT_for_AMD64 http://www.debian-administration.org/articles/356\r\n</a>\r\n<br>\r\n<a href=\"http://www.ubuntuforums.org/showthread.php?t=191205\">http://www.ubuntuforums.org/showthread.php?t=191205</a>\r\n<br>\r\n<a href=\"http://forums.gentoo.org/viewtopic-t-221361.html\">http://forums.gentoo.org/viewtopic-t-221361.html</a>\r\n<br>\r\n<br>\r\n\r\n\r\n\r\n',11,0,1,'CC-BY-NC-SA','',0,0,1),
(141,'2006-08-24','RSI - Repetitive Stress Injury',719,'','<a href=\\\"http://www.rsihelp.com\\\">RSI Help</a>\r\n<br>\r\n<a href=\\\"http://www.workrave.org\\\">Workrave - Linux & Windows</a>\r\n<br>\r\n<a href=\\\"http://ozy.student.utwente.nl/projects/antirsi/\\\">AntiRSI - OS X App</a>\r\n<br>\r\n<br>',7,0,1,'CC-BY-NC-SA','',0,0,1),
(142,'2006-08-27','Writely',512,'','<a href=\\\"http://www.writely.com/\\\">http://www.writely.com/</a>\r\n<br>\r\n<br>',12,0,1,'CC-BY-NC-SA','',0,0,1),
(143,'2006-08-28','CBBot',768,'','No Show notes',35,0,1,'CC-BY-NC-SA','',0,0,1),
(144,'2006-08-29','Nessus',355,'','<a href=\"http://www.twatech.org/shownotes/TWAT144Nessus_RC.txt\"> Example Nessus output </a>\r\n<br>\r\n<br>\r\n<a href=\"http://www.twatech.org/shownotes/TWAT144NESSUS_CGI.txt\">CGI Examples </a>\r\n<br>\r\n<br>\r\n<a href=\\\"http://en.wikipedia.org/wiki/Nessus_(software)\\\"> http://en.wikipedia.org/wiki/Nessus_(software)</a>\r\n<br>\r\n<br>\r\n<a href=\\\"http://www.nessus.org/\\\"> http://www.nessus.org/ </a>',36,0,1,'CC-BY-NC-SA','',0,0,1),
(145,'2006-09-04','Audio engineering',331,'','No Show Notes',42,0,1,'CC-BY-NC-SA','',0,0,1),
(146,'2006-09-05','Micropower TV',937,'','<a href=\\\"http://freeradio.org/\\\">http://freeradio.org/</a>\r\n<br>\r\n<br>\r\n<a href=\\\"http://fcc.gov/\\\">http://fcc.gov/</a>',43,0,1,'CC-BY-NC-SA','',0,0,1),
(147,'2006-09-06','VMware Player',799,'','<br>\r\n<a href=\"http://www.vmware.com/products/player/\\\">http://www.vmware.com/products/player/</a>\r\n<br>\r\n<br>',44,0,1,'CC-BY-NC-SA','',0,0,1),
(148,'2006-09-07','In the Payphone Lounge',238,'','featuring Jason Scott and Strom Carlson. Music:\r\n\\\"Cut\\\" by Nika Japaridze \r\n<br>\r\n<a href=\\\"http://www.archive.org/details/rest026\\\">http://www.archive.org/details/rest026</a>',13,0,1,'CC-BY-NC-SA','',0,0,1),
(149,'2006-09-10','Wireless Security',724,'','No Show Notes',35,0,1,'CC-BY-NC-SA','',0,0,1),
(150,'2006-09-12','Vpn\\\'s',693,'','<br>\r\n<a href=\\\"http://twatech.org/shownotes/150notes.txt\\\">Show Notes </a>\r\n<br>\r\n<br>',19,0,1,'CC-BY-NC-SA','',0,0,1),
(151,'2006-09-13','Skiddie Baiting',477,'','<br>\r\n<a href=\\\"http://irongeek.com/i.php?page=security/skiddy-baiting\\\">http://irongeek.com/i.php?page=security/skiddy-baiting </a>',9,0,1,'CC-BY-NC-SA','',0,0,1),
(152,'2006-09-14','Dynamic DNS',834,'','<a href=\"http://www.twatech.org/shownotes/notes152txt\\\">Show Notes',40,0,1,'CC-BY-NC-SA','',0,0,1),
(153,'2006-09-18','How to make your own xbox usb adpapter',268,'','No Show Notes',24,0,1,'CC-BY-NC-SA','',0,0,1),
(154,'2006-09-20','Sourcemage',316,'','<br>\r\n<a href=\\\"http://www.sourcemage.org/\\\"> http://www.sourcemage.org/ </a>\r\n<br>\r\n<br>',41,0,1,'CC-BY-NC-SA','',0,0,1),
(155,'2006-09-21','Cross Site Scripting',357,'','<br><a href=\\\"http://occ0de.wordpress.com/2006/09/19/hello-world/\\\">Link to full shownotes</a><br/>\r\n<a href=\\\"http://www.cgisecurity.com/articles/xss-faq.shtml\\\">Cgisecurity.com: Cross Site Scripting questions and answers</a><br/>\r\n<a href=\\\"http://en.wikipedia.org/wiki/Cross_site_scripting\\\">Cross-site scripting - Wikipedia entry</a><br/>\r\n<a href=\\\"http://seclists.org/\\\">SecLists.org Security Mailing List Archives</a><br/>\r\n<a href=\\\"http://twatech.org/index.php?page=118\\\">TWAT ep. 33 - SQL Injection, by Livinded</a><br/>\r\n<a href=\\\"http://ha.ckers.org/xss.html\\\">XSS (Cross Site Scripting) Cheat Sheet</a><br/>\r\n<a href=\\\"http://www.grc.com/securitynow.htm\\\">Security Now Episodes</a><br/>\r\n<a href=\\\"http://www.noscript.net/\\\">NoScript Plugin for Firefox</a>\r\n<br>\r\n<br>',45,0,1,'CC-BY-NC-SA','',0,0,1),
(156,'2006-09-24','Safari Bookshelf',616,'','<br>\r\n<a href=\"http://safari.oreilly.com\"> http://safari.oreilly.com/ </a>\r\n<br>\r\n<br>',7,0,1,'CC-BY-NC-SA','',0,0,1),
(157,'2006-09-25','SnortSam',963,'','<br>\r\n<a href=\\\"http://www.rmccurdy.com/stuff/TWAT/snort/\\\"> http://www.rmccurdy.com/stuff/TWAT/snort/ </a>\r\n<br>\r\n<br>',36,0,1,'CC-BY-NC-SA','',0,0,1),
(158,'2006-09-26','NirCmd',365,'','<p>\r\nNirCmd info page:<br />\r\n<a href=\\\"http://www.nirsoft.net/utils/nircmd.html\\\">http://www.nirsoft.net/utils/nircmd.html</a>\r\n</p>\r\n\r\n<p>\r\nNirCmd download link (zip format):<br />\r\n<a href=\\\"http://www.nirsoft.net/utils/nircmd.zip\\\">http://www.nirsoft.net/utils/nircmd.zip</a>\r\n</p>\r\n\r\n<p>\r\nNirCmd help/command reference online:<br />\r\n<a href=\\\"http://www.nirsoft.net/utils/nircmd2.html#using\\\">http://www.nirsoft.net/utils/nircmd2.html#using</a>\r\n</p>',46,0,1,'CC-BY-NC-SA','',0,0,1),
(159,'2006-09-27','Cygwin and Bash scripting',1472,'','No Show Notes',81,0,1,'CC-BY-NC-SA','',0,0,1),
(160,'2006-09-28','RockBox Open Source Jukebox firmware',483,'','<Pre>ROCKBOX - OPEN SOURCE JUKEBOX FIRMWARE\r\n<a href=\\\"http://www.rockbox.org/\\\">http://www.rockbox.org/ </a>\r\n\r\n\r\n\r\nPresently works on\r\n * Archos: Jukebox 5000, 6000, Studio, Recorder, FM Recorder, Recorder V2 and Ondio\r\n * iriver: H100 and H300 series\r\n * iriver: H10 series\r\n * Apple: iPod 4th gen (grayscale and color), 5th gen (Video), Nano and Mini 1st/2nd gen\r\n * iAudio: X5 (including X5V and X5L)\r\n * Additional models are in development \r\n\r\nReach me at ksmurf [at] gmail [dot] com if you have any questions or comments </Pre>',21,0,1,'CC-BY-NC-SA','',0,0,1),
(161,'2006-10-01','Fedora Frog',690,'','<br>\r\nFedora Frog<br> \r\n<a href=\\\"http://easylinux.info/wiki/Fedora_frog\\\"> http://easylinux.info/wiki/Fedora_frog </a><br>\r\n<br>\r\nother handy guides to setting up Fedora Core 5<br> \r\n<a href=\\\"http://www.gagme.com/greg/linux/fc5-tips.php\\\"> http://www.gagme.com/greg/linux/fc5-tips.php </a> <br>\r\n<br> ',23,0,1,'CC-BY-NC-SA','',0,0,1),
(162,'2006-10-02','Basic Intro to Gimp',807,'','<br>\r\n<a href=\\\"http://www.gimp.org/\\\">http://www.gimp.org/</a>\r\n<br>\r\n<br>\r\n<a href=\\\"http://gimp-savvy.com/BOOK/index.html\\\"> http://gimp-savvy.com/BOOK/index.html </a>\r\n<br>\r\n<br>',47,0,1,'CC-BY-NC-SA','',0,0,1),
(163,'2006-10-03','Vpn part 2',456,'','<br>\r\n<a href=\\\"http://www.twatech.org/shownotes/notes.pdf\\\"> Show Notes </a>\r\n<br>\r\n<br>',19,0,1,'CC-BY-NC-SA','',0,0,1),
(164,'2006-10-04','Beginners guide to network Recon with Nm',401,'','<a href=\\\"http://insecure.org/stc/\\\">Fyodor\\\'s chapter on \\\"How to Own a Continent\\\"</a><br/>\r\n<code><pre>man nmap - Nmap man page<br/></pre></code>\r\n<a href=\\\"http://www.kismetwireless.net/\\\">Kismet</a><br/>\r\n<a href=\\\"http://kismac.de/\\\">Kismac</a><br/>\r\n<a href=\\\"http://en.wikipedia.org/wiki/Subnetwork\\\">Wikipedia, Subnetworking</a>',45,0,1,'CC-BY-NC-SA','',0,0,1),
(165,'2006-10-05','Wake On Lan',339,'','<a href=\\\"http://en.wikipedia.org/wiki/Wake-on-LAN\\\">Wikipedia Article</a>',12,0,1,'CC-BY-NC-SA','',0,0,1),
(166,'2006-10-08','Eggdrop',222,'','<br>\r\n<a href=\\\"http://www.eggheads.org/\\\">http://www.eggheads.org/</a> <br> <br>\r\n<a href=\\\"http://en.wikipedia.org/wiki/Eggdrop\\\"> http://en.wikipedia.org/wiki/Eggdrop </a>\r\n<br>\r\n<br>',38,0,1,'CC-BY-NC-SA','',0,0,1),
(167,'2006-10-09','Wireless Attacks for Dummies',641,'','No Show Notes',46,0,1,'CC-BY-NC-SA','',0,0,1),
(168,'2006-10-12','Newsgroup Reader',362,'','No Show Notes',36,0,1,'CC-BY-NC-SA','',0,0,1),
(169,'2006-10-15','GPS and Phreaknic',567,'','<br>\r\n<a href=\\\"http://irongeek.com/i.php?page=security/ut-41-gps-backtrack-linux-kismet\\\"> Irongeek\\\'s GPS article </a>\r\n<br>\r\n<br>',9,0,1,'CC-BY-NC-SA','',0,0,1),
(170,'2006-10-17','Basics of Supercomputers',333,'','No Show Notes',48,0,1,'CC-BY-NC-SA','',0,0,1),
(171,'2006-10-18','Custom Firefox search bar extension',478,'','<br>\r\nInspired by <a href=\\\"http://wiki.archlinux.org/index.php/Firefox_Tips_and_Tweaks\\\">http://wiki.archlinux.org/index.php/Firefox_Tips_and_Tweaks</a><br>\r\n\r\n<br>\r\n<br>\r\nClosing Music Anxiety of Influence - Insomniac<br> <a href=\\\"http://www.anxietyofinfluence.ca\\\">http://www.anxietyofinfluence.ca/ </a>\r\n',21,0,1,'CC-BY-NC-SA','',0,0,1),
(172,'2006-10-23','Torrent Flux',441,'','Get Torrent Flux at</br> \r\n\r\n<a href=\"http://www.torrentflux.com\">torrentflux.com </a> <br>\r\n<br>\r\nget torrent flux b4rt<br>\r\n<a href=\"http://tf-b4rt.berlios.de/features.html\">http://tf-b4rt.berlios.de/features.html </a> <br>\r\n<br>\r\nand a nice howto at<br>\r\n<a href=\"http://www.howtoforge.com/ubuntu_lamp_torrentflux_vmware_p2\">http://www.howtoforge.com/ubuntu_lamp_torrentflux_vmware_p2 </a><br>\r\n<br>\r\n\r\nI start you on page 2 because this guide is how to make a vmware appliance of torrentflux. <br>\r\nIf you want a vmware appliance just go back to page one and start there. <br>\r\n<br>\r\nIf you want to implent torrentflux-b4rt instead of torrentflux the steps should be the same but\r\na do warn to try at your own risk on either of these.\r\n',24,0,1,'CC-BY-NC-SA','',0,0,1),
(173,'2006-10-24','Bash History and Tab completion',891,'','<h4>Bash History and Tab Completion</h4>\r\n\r\n<p>when you log in the first time bash reads:\r\n<ul>\r\n<li>/etc/profile</li>\r\n<li>.profile (if exists in home dir)</li>\r\n<li>.bash_profile (if exists in home dir)</li>\r\n</ul>\r\n\r\nnon-login shells read:\r\n<ul>\r\n <li>.bashrc (if it exists)</li>\r\n</ul>\r\n</p>\r\n\r\n<p>If you want to increase your history size put this in your .bash_profile:\r\n<blockquote>export HISTSIZE=1000</blockquote>\r\n\r\nYou may want to also put that in your .bashrc for subsequent shells from your\r\nlogin shell, because this value will not be set until you log out and back in again. You can also \r\nissue export HISTSIZE=1000 in the shell to increase this, but value will not be set for any other or\r\nsubsequent shells started from your session.\r\n</p>\r\n',7,0,1,'CC-BY-NC-SA','',0,0,1),
(174,'2006-10-30','Halloween Remix',218,'','<BR>\r\nA little bit different of a show today basically just me fooling around in audacity playing with some mp3\\\'s hopefully you\\\'ll reconize most of the music <br>',39,0,1,'CC-BY-NC-SA','',0,0,1),
(175,'2006-11-01','Potato Cannon',724,'','<br>\r\n<a href=\\\"http://twatech.org/shownotes/notes.jpg\\\"> Potato Cannon Picture\r\n<br>\r\n<br>',3,0,1,'CC-BY-NC-SA','',0,0,1),
(176,'2006-11-02','Network Filesystems',1039,'','<br>\r\n<a href=\\\"http://us2.samba.org/samba/\\\">Samba</a><br > \r\n<a href=\\\"http://lists.samba.org/archive/samba/2006-February/117184.html\">Disable Printing in Samba</a><br>\r\n<a href=\\\"http://fuse.sourceforge.net/sshfs.html\\\" >sshFS</a><br>\r\nman exports<br>\r\nman nfs<br>\r\n<br>\r\n<br>',12,0,1,'CC-BY-NC-SA','',0,0,1),
(177,'2006-11-06','Useful Utilities',627,'','<br>\r\n<a href=\\\" http://0pencircuit.net/t0c/index.php?topic=47.msg511#msg511\\\"> List of Utilities </a>\r\n<br>\r\n<br>',36,0,1,'CC-BY-NC-SA','',0,0,1),
(178,'2006-11-07','Model M Keyboard Lovefest',461,'','Model M (currently down)<br>\r\n<a href=\\\"http://www.modelm.org/\\\">http://www.modelm.org/ </a> <br>\r\n<br>\r\n\r\nModel M Keyboard on Wikipedia<br>\r\n<a href=\\\"http://en.wikipedia.org/wiki/IBM_Model_M_keyboard\\\">http://en.wikipedia.org/wiki/IBM_Model_M_keyboard </a> <br>\r\n<br>\r\n\r\nCare and feeding of an IBM Model M keyboard<br>\r\n<a href=\\\"http://www.preater.com/modelm/\\\"> http://www.preater.com/modelm/ </a> <br>\r\n<br>\r\n\r\n\r\nClicky Keyboards <br>\r\n<a href=\\\"http://www.clickykeyboards.com\\\"> http://www.clickykeyboards.com </a> <br>\r\n<br>\r\n\r\nDiagram for making your own USB Model M <br>\r\n<a href=\\\"http://zevv.nl/experiments/ibm-usb/\\\">http://zevv.nl/experiments/ibm-usb/ </a> <br>\r\n<br>\r\nModern Model Ms <br>\r\n<a href=\\\"http://pckeyboards.stores.yahoo.net/keyboards.html\\\"> http://pckeyboards.stores.yahoo.net/keyboards.html </a> <br>\r\n<br>\r\n',9,0,1,'CC-BY-NC-SA','',0,0,1),
(179,'2006-11-09','Introduction to e-Learning and SCORM',455,'','No Show Notes',46,0,1,'CC-BY-NC-SA','',0,0,1),
(180,'2006-11-12','Dynamics Processing',476,'','No Show Notes',42,0,1,'CC-BY-NC-SA','',0,0,1),
(181,'2006-11-13','Firefox 2.0 Tips and Tricks',1461,'','\r\n\r\n<a href=\\\"http://twatech.org/shownotes/181shownotes.txt\\\"> Show Notes </a>',40,0,1,'CC-BY-NC-SA','',0,0,1),
(182,'2006-11-15','OpenBSD',565,'','No Show Notes',19,0,1,'CC-BY-NC-SA','',0,0,1),
(183,'2006-11-19','Jokosher',667,'','<br>\r\n<p>This episode was recorded and mixed to wav entirely with Jokosher. I then used lame to record the mp3, as I usually like to do. The last second of audio was cut off and try as I might, could not get it to export this last second, but you did not miss anything. Give jokosher a try and support the <a href=\\\"http://www.jokosher.org\\\">Jokosher Community</a>. This has the the potential to be a killer audio app for the FOSS community.</p>\r\n<br>\r\n<br>',7,0,1,'CC-BY-NC-SA','',0,0,1),
(184,'2006-11-20','Bad Things',1370,'','<br>\r\n<a href=\\\"http://twatech.org/shownotes/shownotes184.html\"> Show Notes</a> \r\n<br>',35,0,1,'CC-BY-NC-SA','',0,0,1),
(185,'2006-11-29','Twat Radio',60,'','No need to listen to this one guys We will be taking the month of december off to get more backup episodes and more monthly hosts If anyone wants to help out as a monthly host or just sumbit an episode please email us at twat.admin -at- gmail /dot/ com. I want to thank all our hosts for there hard work and hope everyone has a good holiday season.\r\n<br>\r\n-Enigma ',39,0,1,'CC-BY-NC-SA','',0,0,1),
(186,'2007-01-01','SciTE snippets',642,'','A quick intro to SciTE snippets. Touch base on why you should use them, what they do, and how to install it. Any questions just ask my on IRC, I\\\'m always there. Freenode #infonomicon BinRev #binrev<br>\r\n<a href=\\\"http://caladbolg.net/scite.php\\\">SciTE Website</a>\r\n<br>\r\n<a href=\\\"http://scite-tools.googlecode.com/svn/trunk/scripts/scite/snippets.lua\\\">snippets.lua</a><br />\r\n<a href=\\\"http://caladbolg.net/scite.php\\\">SciTE Website</a>\r\n<br><a href=\\\"http://scite-tools.googlecode.com/svn/trunk/scripts/ruby/ruby.lua\\\">ruby.lua</a><br /> \r\n<a href=\\\"http://pastie.caboo.se/30616\\\">My ruby.lua</a><br />',49,0,1,'CC-BY-NC-SA','',0,0,1),
(187,'2007-01-02','Lockpicking',1140,'','\r\nBuy lockpicks & bumping tools: <a href=\\\"http://www.lockpicks.com\\\">www.lockpicks.com</a><br><br>\r\n\r\nLocksport forums:<br>\r\n<a href=\\\"http://www.ezpicking.com\\\">EZ Picking</a><br>\r\n<a href=\\\"http://www.lockpicking101.com\\\">Lockpicking 101</a><br>\r\n<a href=\\\"http://forum.lockpicker.net\\\">Lock Picker Network</a><br><br>\r\n\r\nLocksport clubs:<br>\r\n<a href=\\\"http://www.toool.nl\\\">TOOOL</a><br>\r\n<a href=\\\"http://www.locksport.com\\\">LockSport International</a><br>\r\n<a href=\\\"http://www.bloomingtonfools.org\\\">Fraternal Order Of LockSport</a><br><br>\r\n\r\nOther resources:<br>\r\n<a href=\\\"http://www.lockenpedia.org\\\">Lockenpedia</a><br>\r\n<a href=\\\"http://www.toool.nl/blackbag\\\">BlackBag - Blog of Barry \\\"The Key\\\" of TOOOL</a><br>\r\n',3,0,1,'CC-BY-NC-SA','',0,0,1),
(188,'2007-01-03','Ruby',436,'','<a href=\\\"http://www.ruby-lang.org/en/\\\">Ruby</a><br />\r\n<a href=\\\"http://www.poignantguide.net/ruby\\\">Why\\\'s Poignant Guide and other references</a><br />',12,0,1,'CC-BY-NC-SA','',0,0,1),
(189,'2007-01-08','Pizza, Wii, and OSX',1112,'','No Show notes',50,0,1,'CC-BY-NC-SA','',0,0,1),
(190,'2007-01-10','Twat Remix',431,'','No Show Notes',51,0,1,'CC-BY-NC-SA','',0,0,1),
(191,'2007-01-16','ipod linux',454,'','<a href=\"http://www.ipodlinux.org\\\">http://www.ipodlinux.org </a>\r\n<br>\r\n<a href=\"http://www.it.fht-esslingen.de/~zimmerma/software/ltools.html\"> LTools </a>\r\n<br>\r\n<br>',48,0,1,'CC-BY-NC-SA','',0,0,1),
(192,'2007-01-17','htaccess',642,'','<a href=\\\"http://www.gotroot.com/\\\">http://www.gotroot.com/ </a> <br> <br>\r\n<a href=\\\"http://www.kuznetsov.uklinux.net/robots-tutorial.php\\\"> http://www.kuznetsov.uklinux.net/robots-tutorial.php </a><br><br>\r\n<a href=\\\"http://rmccurdy.com/stuff/TWAT/htaccess\\\"> http://rmccurdy.com/stuff/TWAT/htaccess </a> <br> <br>',36,0,1,'CC-BY-NC-SA','',0,0,1),
(193,'2007-01-18','Application Lock on Windows mobile smart phones',350,'','No Show Notes',41,0,1,'CC-BY-NC-SA','',0,0,1),
(194,'2007-01-21','Smoothwall',974,'','IDS = Intrusion Detection System <br>\r\n<a href=\"http://martybugs.net/smoothwall/\"> http://martybugs.net/smoothwall</a> <br>\r\n<a href=\\\"http://www.smoothwall.org/\\\"> http://www.smoothwall.org/ </a> <br>\r\n<a href=\\\"http://en.wikipedia.org/wiki/Intrusion-detection_system\\\"> http://en.wikipedia.org/wiki/Intrusion-detection_system </a> <br>\r\n<a href=\\\"http://www.netfilter.org/\\\"> Iptables</a> <br>\r\n<a href=\\\"http://www.i-hacked.com/content/view/91/71/\\\"> A Little Howto + links to good mods </a> <br>\r\n<a href=\\\"http://community.smoothwall.org/forum/viewforum.php?f=16\\\">Forum For Mods </a> <br>\r\n<a href=\\\"http://community.smoothwall.org/forum/viewtopic.php?t=2873\\\"> List Of Mods On forum </a> <br> \r\n<a href=\\\"http://www.i-trash.org/mail/\\\">Contact Me </a><br>',40,0,1,'CC-BY-NC-SA','',0,0,1),
(195,'2007-01-23','Free Online Courses',481,'','Free (Yes, it is free!) Java Programming (with Passion!)Online Course <br>\r\n<br>\r\n<a href=\\\"http://www.javapassion.com/javaintro/\\\"> http://www.javapassion.com/javaintro/ </a> <br>\r\n<br>\r\nReach me at ksmurf99 {at} gmail {dot} com with any questions or any other good courses <br>\r\n<br>\r\n<br>\r\n',21,0,1,'CC-BY-NC-SA','',0,0,1),
(196,'2007-01-24','Raid Arrays',501,'','<a href=\\\"http://en.wikipedia.org/wiki/Redundant_array_of_independent_disks\\\"> Wiki on Raid Arrays </a>\r\n<br>\r\nReach me at twat.admin {at} gmail {dot} com with any questions or comments \r\n<br>\r\n<br>\r\n<br>\r\n<pre>Correction: \r\nRAID 0: Striped Set \r\nRAID 1: Mirrored Set \r\n</pre>\r\n<br>\r\nI switched the two in my recording my mistake thanks to pat and Lord Drachenblut for catching it <br>\r\n<br>\r\nThe recording has been corrected \r\n<br>\r\n<br>',39,0,1,'CC-BY-NC-SA','',0,0,1),
(197,'2007-01-25','LDAP',410,'','No show Notes',52,0,1,'CC-BY-NC-SA','',0,0,1),
(198,'2007-01-29','GIS and Remote Sensing',1159,'','<a href=\\\"http://en.wikipedia.org/wiki/Geographic_information_system\\\"> http://en.wikipedia.org/wiki/Geographic_information_system </a><br>\r\n<br>\r\n<a href=\\\"http://grass.itc.it/download/index.php\\\"> http://grass.itc.it/download/index.php </a> <br>\r\n<br>\r\n<a href=\\\"http://www.geobase.ca/\\\"> \r\nhttp://www.geobase.ca/ </a> <br>\r\n<br>\r\n<a href=\\\"http://www.dpi.inpe.br/spring/english/index.html\\\">\r\nhttp://www.dpi.inpe.br/spring/english/index.html </a><br>\r\n<br>\r\n\r\n',18,0,1,'CC-BY-NC-SA','',0,0,1),
(199,'2007-01-30','Slast',402,'','<a href=\\\"http://www.slast.org\\\"> www.slast.org </a>\r\n<br>\r\n<br>',1,0,1,'CC-BY-NC-SA','',0,0,1),
(200,'2007-01-31','200th Episode Special',242,'','This one was done for the twat cd at the last <a href=\\\"http://www.notacon.org/\\\"> Notacon </a> and hasn\\\'t been release other than on the cd I figured it would be a good special episode for our 200th --Enjoy\r\n<br>\r\n<br>\r\nthanks to all of our hosts for their hard work \r\n<br>\r\n-Enigma',22,0,1,'CC-BY-NC-SA','',0,0,1),
(201,'2007-02-01','Project management and collaboration via Wiki',546,'','<a href=\\\"http://www.mediawiki.org/wiki/MediaWiki\\\">MediaWiki</a><br><br>\r\n<a href=\\\"http://twiki.org/\\\">TWiki</a><br>\r\n<br>',3,0,1,'CC-BY-NC-SA','',0,0,1),
(202,'2007-02-04','Wacom Tablets',461,'','<a href=\\\"http://linuxwacom.sourceforge.net/index.php/howto/main\\\"> Linux Wacom Tablet Project</a><br />\r\n<a href=\\\"http://hoopajoo.net/tips/content/20.html\\\">Helpful xorg.conf example</a>',12,0,1,'CC-BY-NC-SA','',0,0,1),
(203,'2007-02-06','Performace Monitoring with SysStat',696,'','SYSSTAT package for Linux<br>\r\nSystem performance tuning and performance history tracking is a necessity for Unix hosts that support growing projects and ever demanding users. RRDTool is another package that lets you graphically view this information. Today dosman discusses how to use both packages.<p>\r\n\r\n<a href=\\\"http://perso.orange.fr/sebastien.godard/index.html\\\">sysstat</a><br>\r\n<a href=\\\"http://oss.oetiker.ch/rrdtool/\\\">RRDTool</a><br>\r\nNovell\\\'s <a href=\\\"http://www.novell.com/coolsolutions/tools/15964.html\\\">Linux Monitoring Tool</a> Package<br>\r\n<br>\r\n<br>',3,0,1,'CC-BY-NC-SA','',0,0,1),
(204,'2007-02-07','French for Geeks: How to pick up chicks',1328,'','Seal and the Montreal 2600\r\n<br>\r\n<br>',18,0,1,'CC-BY-NC-SA','',0,0,1),
(205,'2007-02-08','Grid Computing',382,'','No Show Notes\r\n\r\n<br>\r\n<br>\r\n',48,0,1,'CC-BY-NC-SA','',0,0,1),
(206,'2007-02-12','Esperanto',300,'','No Show Notes',53,0,1,'CC-BY-NC-SA','',0,0,1),
(207,'2007-02-13','You are being watched',557,'','No Show Notes\r\n<br>\r\n<br>',36,0,1,'CC-BY-NC-SA','',0,0,1),
(208,'2007-02-15','AJAX',627,'','No Show Notes\r\n<br>\r\n<br>',41,0,1,'CC-BY-NC-SA','',0,0,1),
(209,'2007-02-22','Etherboot',1383,'','No Show Notes',54,0,1,'CC-BY-NC-SA','',0,0,1),
(210,'2007-02-25','RFA Remix #1 - Hacker Manifesto',344,'','This clip orginally is from <a href=\"http://www.oldskoolphreak.com/radio.html\"> Radio freek america 40 </a> which aired on 12/04/02\r\n\r\n<br>\r\n<br>',55,0,1,'CC-BY-NC-SA','',0,0,1),
(211,'2007-03-04','New Projects',514,'','<a href=\\\"http://www.hackerevents.org\\\"> www.hackerevents.org </a>\r\n<br>\r\n<br>\r\n<a href=\\\"http://www.eth0enigma.com\\\"> www.eth0enigma.com </a>\r\n<br>\r\n<br>\r\n<a href=\\\"http://813.binrevmeetings.com\\\"> Tampa Binrev meeting </a>\r\n<br>\r\n<br>\r\n<a href=\\\"http://www.insecuretech.com\\\"> www.insecuretech.com </a>\r\n<br>\r\n<br>\r\n<a href=\\\"http://www.wirelink.org\\\"> www.wirelink.org </a>\r\n<br>\r\n<br>\r\n\r\n',39,0,1,'CC-BY-NC-SA','',0,0,1),
(212,'2007-03-05','SNMP',641,'','No Show Notes\r\n<br>\r\n<br>',56,0,1,'CC-BY-NC-SA','',0,0,1),
(213,'2007-03-06','Natural Language Selection and AI',321,'','No Show Notes\r\n<br>\r\n<br>',57,0,1,'CC-BY-NC-SA','',0,0,1),
(214,'2007-03-07','VMWare clustering',514,'','No Show Notes',48,0,1,'CC-BY-NC-SA','',0,0,1),
(215,'2007-03-08','Free Dos',402,'','No Show Notes',42,0,1,'CC-BY-NC-SA','',0,0,1),
(216,'2007-03-12','Amazon Simple Storage Services',1024,'','<ul>\r\n<li><a href=\\\"http://www.amazon.com/S3-AWS-home-page-Money/b/ref=sc_fe_l_2/104-1189807-0595127?ie=UTF8&node=16427261&no=3435361&me=A36L942TSJ2AJA\\\">Amazon S3</a></li>\r\n<li><a href=\\\"http://www.jungledisk.com/index.shtml\\\">Jungle Disk</a></li>\r\n<li><a href=\\\"http://jets3t.s3.amazonaws.com/index.html\\\">JetS3</a></li>\r\n<li><a href=\\\"http://www.rjonna.com/ext/s3fox.php\\\">S3Fox</a></li>\r\n</ul>\r\nSong: Vienna Sausage by <a href=\\\"http://www.junkboxmusic.com\\\">Junkbox</a> \r\n',7,0,1,'CC-BY-NC-SA','',0,0,1),
(217,'2007-03-13','Nikto',383,'','No Show Notes',36,0,1,'CC-BY-NC-SA','',0,0,1),
(218,'2007-03-14','SIDs',674,'','<ul>\r\n<li><a href=\\\"http://www.microsoft.com/technet/sysinternals/FileAndDisk/PsTools.mspx\\\">PsTools</a></li>\r\n<li><a href=\\\"http://www.microsoft.com/technet/sysinternals/utilities/psgetsid.mspx\\\">PsGetSId</a></li>\r\n<li><a href=\\\"http://www.microsoft.com/technet/sysinternals/SystemInformation/PsInfo.mspx\\\">PsInfo</a></li>\r\n<li><a href=\\\"http://www.microsoft.com/technet/sysinternals/Security/NewSid.mspx\\\">NewSid</a></li>\r\n</ul>',52,0,1,'CC-BY-NC-SA','',0,0,1),
(219,'2007-03-19','Skype Wardialing',1242,'','No Show Notes\r\n<br>\r\n',58,0,1,'CC-BY-NC-SA','',0,0,1),
(220,'2007-03-20','GIS and iSCSI',1255,'','This is just a rundown of both iSCSI and GFS technologies.\r\nThe relative merits of each are compared against other similar\r\npurpose technologies.<br><br>',54,0,1,'CC-BY-NC-SA','',0,0,1),
(221,'2007-03-25','Binrev Remix #1 - Hackermedia',1437,'','this episode is a clip from episode 160 of binary Revolution Radio',1,0,1,'CC-BY-NC-SA','',0,0,1),
(222,'2007-03-26','Apple breaking thru',308,'','apples corporate anthem 1980\\\'s style\r\n<br>\r\n<br>',39,0,1,'CC-BY-NC-SA','',0,0,1),
(223,'2007-03-27','Maxivista',831,'','No show notes\r\n<br>',58,0,1,'CC-BY-NC-SA','',0,0,1),
(224,'2007-03-28','RFA Remix #2 Free Thinking ',659,'','original clip from Radio Freak America #54\r\n<br>\r\n<br>',55,0,1,'CC-BY-NC-SA','',0,0,1),
(225,'2007-03-29','Free Router! (till the 31st)',703,'','<a href=\\\"http://www.i-trash.org/?ls=Twatech\\\"> show notes </a> <br> <br>',40,0,1,'CC-BY-NC-SA','',0,0,1),
(226,'2007-04-03','Metasploit 3',740,'','<a href=\\\"http://www.metasploit.com/\\\">Metasploit Project</a><br />\r\nNot much to write up, just take a listen.<br />\r\nNote: Some of the information is a few weeks out of date, metasploit 3 has been released now and I\'m assuming that the web interface does work correctly.',12,0,1,'CC-BY-NC-SA','',0,0,1),
(227,'2007-04-04','Helix',657,'','\r\n<a href=\\\"http://www.e-fense.com/helix/\\\"> helix </a>\r\n<br>\r\n<a href=\\\"http://www.sleuthkit.org/autopsy/\\\"> autopsy </a>\r\n<br>\r\n<br>',39,0,1,'CC-BY-NC-SA','',0,0,1),
(228,'2007-04-05','Vmware lab',437,'','No Show Notes\r\n<br>\r\n<br>\r\n',58,0,1,'CC-BY-NC-SA','',0,0,1),
(229,'2007-04-08','NetSnmp',193,'','No Show Notes\r\n<br>\r\n<br>',48,0,1,'CC-BY-NC-SA','',0,0,1),
(230,'2007-04-09','Notacon Radio',450,'','<a href=\\\"http://www.notaconradio.org\\\"> Notaconradio.org </a>\r\n<br>\r\n<br>',42,0,1,'CC-BY-NC-SA','',0,0,1),
(231,'2007-04-10','Hosting a Lan Party',1364,'','No Show notes\r\n<br>\r\n<br>',56,0,1,'CC-BY-NC-SA','',0,0,1),
(232,'2007-04-12','portable apps',575,'','<a href=\\\"http://feeds.rmccurdy.com\\\"> http://feeds.rmccurdy.com </a> <br>\r\n<a href=\\\"http://en.wikipedia.org/wiki/Friday_the_13th\\\"> http://en.wikipedia.org/wiki/Friday_the_13th </a> <br>\r\n<a href=\\\"http://portableapps.com\\\"> http://portableapps.com </a> <br>\r\n<a href=\\\"http://cse.msstate.edu/%7Erwm8/hackingU3/\\\"> http://cse.msstate.edu/%7Erwm8/hackingU3/ </a> <br>\r\n<a href=\\\"http://rmccurdy.com/scripts/ftp.txt\\\"> http://rmccurdy.com/scripts/ftp.txt </a> <br>\r\n<a href=\\\"http://rmccurdy.com/scripts/firefox.txt\\\"> http://rmccurdy.com/scripts/firefox.txt </a> <br>\r\n<br>\r\n<br>\r\nmusic: <br>\r\nLady Sovereign_Public Warning\\\\06-my_england_192_lame_cbr.mp3 <br>\r\nJoanna_Newsom Peach, Plum, Pear<br>\r\n<br>',36,0,1,'CC-BY-NC-SA','',0,0,1),
(233,'2007-04-16','Gigavox Levelator',625,'','<a href=\\\"http://www.gigavox.com/levelator\\\">Levelator Download</a> <br> <br>\r\n',7,0,1,'CC-BY-NC-SA','',0,0,1),
(234,'2007-04-17','gtkdialog',550,'','droops talks about gtkdialog, an easy way of adding a gui to your bash scripts and beyond.\r\n<p />\r\n<a href=\\\"http://linux.pte.hu/~pipas/gtkdialog/\\\">gtkdialog homepage</a>\r\n<p />\r\n<a href=\\\"http://linux.pte.hu/~pipas/gtkdialog/screenshots.html\\\">gtk example screenshots</a>\r\n<p />\r\n<a href=\\\"http://infonomicon.org/text/gtkdialog_twat.txt\\\">droops\\\' network manager for twat\r\n<p />',1,0,1,'CC-BY-NC-SA','',0,0,1),
(235,'2007-05-07','BBS ',2201,'','a good interview about the history of BBS\\\'s ',59,0,1,'CC-BY-NC-SA','',0,0,1),
(236,'2007-05-08','Notacon wrapup',1349,'','<a href=\\\"http://www.notacon.org\\\">Notacon</a><br>\r\n<a href=\\\"http://demoparty.us/2007/wrapup.shtml\\\">BlockParty Wrapup</a><br>\r\n<a href=\\\"http://www.irongeek.com\\\">Irongeek\\\'s video from Notacon 4</a><br>\r\n<a href=\\\"http://www.notaconbathroomcam.com\\\">Notacon bathroom cam</a><br>\r\n<a href=\\\"http://www.hackerfoundation.org/wiki/index.php/Hackers_on_a_Plane\\\"> Hackers on a Plane</a><br>\r\n<a href=\\\"http://www.haycon.info\\\">Haycon</a><br>\r\n<br>',3,0,1,'CC-BY-NC-SA','',0,0,1),
(237,'2007-05-10','Picture Frames',967,'','No Show notes\r\n<br>\r\n<br>\r\n',58,0,1,'CC-BY-NC-SA','',0,0,1),
(238,'2007-05-11','The Computer Code hoedown',227,'','original audio by Shane Killian can be found at <br>\r\n<a href=\\\"http://audio.textfiles.com\\\"> audio.textfiles.com </a>\r\n<br>\r\n<br>',39,0,1,'CC-BY-NC-SA','',0,0,1),
(239,'2007-05-14','Myth TV',979,'','<a href=\\\"http://www.mythtv.org/\\\">http://www.mythtv.org/ </a>\r\n<br>\r\n<br>\r\n<a href=\\\"http://en.wikipedia.org/wiki/KnoppMyth\\\"> KnoppMyth wiki </a>',36,0,1,'CC-BY-NC-SA','',0,0,1),
(240,'2007-05-15','PWF',1659,'','<a href=\"http://www.oldskoolphreak.com\\\"> www.oldskoolphreak.com </a><br>\r\n<a href=\"http://www.oldskoolphreak.com/tfiles/pwf.txt\\\">www.oldskoolphreak.com/tfiles/pwf.txt </a><br>\r\n<a href=\"http://www.bellcoreradio.net\\\"> www.bellcoreradio.net </a><br>\r\n<a href=\"http://www.walmart.com\\\"> www.walmart.com </a><br>\r\n<br>',60,0,1,'CC-BY-NC-SA','',0,0,1),
(241,'2007-05-17','Text Editors of Choice',624,'','\r\n\r\n<a href=\\\"http://www.jedit.org\\\">Jedit</a>',7,0,1,'CC-BY-NC-SA','',0,0,1),
(242,'2007-05-21','Powering Up Windows',853,'','This is just a rundown of what can be done to turn a standard Windows installation into a more powerful OS. <br>\r\n<br>\r\n<a href=\\\"http://tinyurl.com/e5x2t\\\"> Windows Powershell info and download </a> <br>\r\n<a href=\\\"http://tinyurl.com/yfhasd\\\"> VBScript to Powershell conversion reference </a> <br>\r\n<a href=\\\"http://tinyurl.com/34oyc4\\\"> Sysinternals utilities info and download </a> <br>\r\n<a href=\\\"http://www.mingw.org/\\\">GNU tool sets </a> <br>\r\n<a href=\\\"http://www.cygwin.com/\\\">Cygwin </a> <br>\r\n<br>\r\n\r\n \r\n',54,0,1,'CC-BY-NC-SA','',0,0,1),
(243,'2007-05-22','Genetic Algorithms',611,'','<pre>The applications of genetic algorithms include:\r\n\r\nArtificial Creativity \r\nAutomated design\r\nCode-breaking\r\nDesign of water distribution systems\r\nElectronic circuit design\r\nFile allocation for a distributed system. \r\nGame Theory Equilibrium Resolution. \r\nLearning Robot behavior\r\nMolecular Structure Optimization\r\nProtein folding \r\nTimetabling problems\r\nTraining artificial neural networks\r\nand the Traveling Salesman Problem. \r\n</pre><br>\r\n<br>\r\n',61,0,1,'CC-BY-NC-SA','',0,0,1),
(244,'2007-05-24','Video Compression',507,'','No show Notes <br>\r\n<br>',58,0,1,'CC-BY-NC-SA','',0,0,1),
(245,'2007-05-28','Descrambled ',522,'','Joe Wecker of Don\\\'t Eat Pete sings the algorithm of DVDdescramble.c. Removed from mp3.com for its allegedly \\\"offensive lyrics\\\". <br>original audio at <a href=\\\"http://audio.textfiles.com\\\"> audio.textfiles.com </a> <br>\r\n<br>',39,0,1,'CC-BY-NC-SA','',0,0,1),
(246,'2007-05-30','daap',291,'','<a href=\\\"http://angrytelecomgeek.blogspot.com/2007/05/media-streaming-with-itunes-ubuntu-and.html\\\"> Media Streaming with I-Tunes, Ubuntu and mt-daapd </a><br>\r\n<br>',19,0,1,'CC-BY-NC-SA','',0,0,1),
(247,'2007-05-31','Binrev Remix #2 Deadly Halon!',885,'','original audio from <a href=\\\"http://www.binrev.com/radio/archive/binrev011.mp3\\\"> Binrev Radio Episode 11 </a>',55,0,1,'CC-BY-NC-SA','',0,0,1),
(248,'2007-06-01','H.264 Standard',432,'','\r\n<a href=\\\"http://en.wikipedia.org/wiki/H264\\\">Wikipedia - H.264 Standard</a> <br>\r\n<br>\r\n',58,0,1,'CC-BY-NC-SA','',0,0,1),
(249,'2007-06-07','So You Got Your Lame Ass Sued',3743,'','original audio from Defcon 9 presentation\r\n<br>\r\n<br>',13,0,1,'CC-BY-NC-SA','',0,0,1),
(250,'2007-06-08','PanoTools',502,'','<a href=\\\"http://www.kekus.com/\\\">www.kekus.com </a> <br>\r\n<a href=\\\"http://hugin.sourceforge.net\\\"> </a> <br> \r\n<a href=\"http://hugin.sourceforge.net\"> http://hugin.sourceforge.net </a> <br>\r\n<a href=\\\"http://panotools.info\\\"> http://panotools.info </a> <br>\r\n<a href=\\\"http://panotools.org\\\"> http://panotools.org </a> <br>\r\n\r\n',48,0,1,'CC-BY-NC-SA','',0,0,1),
(251,'2007-06-11','Projectors',761,'','<a href=\\\"http://muonics.net/blog/index.php?postid=15\\\">GRL Laser Tag</a><br>\r\n<a href=\\\"http://www.crazysquirrel.com/diy/projector-screen.jspx\\\">DIY Projector screens</a><br>',3,0,1,'CC-BY-NC-SA','',0,0,1),
(252,'2007-06-13','Network Access Control',1006,'','No Show Notes <br>\r\n<br>',62,0,1,'CC-BY-NC-SA','',0,0,1),
(253,'2007-06-14','Diversions',659,'','3 Diversions: <br>\r\n<br>\r\nKnetwalk - no url, sorry - check your distro repository <br>\r\nBriquolo - <a href=\\\"http://briquolo.free.fr\\\"> http://briquolo.free.fr </a> <br>\r\ndeskbar applet - <a href=\\\"http://raphael.slinckx.net/deskbar\\\"> http://raphael.slinckx.net/deskbar </a> <br>\r\n<br>\r\nhave fun. <br>\r\n<br>',7,0,1,'CC-BY-NC-SA','',0,0,1),
(254,'2007-06-15','stimulants',515,'','No Show Notes <br>\r\n<br>',63,0,1,'CC-BY-NC-SA','',0,0,1),
(255,'2007-06-18','Wireless Fun: Macbook Pro',583,'','<p>Wireless Fun on a Macbook Pro - Part One</p>\r\n<p><a href=\\\"http://www.istumbler.net/\\\">iStumbler website</a></p>\r\n<p><a href=\\\"http://kismac.de/\\\">kismac website</a></p>\r\n<p><a href=\\\"http://www.kismetwireless.net/Forum/Equipment/Messages/1170919945.7235651\\\">getting kismac to work on Macbook Pro</a></p>\r\n<p><a href=\\\"http://www.wireshark.org/download.html\\\">Get you sum Wireshark</a></p> <br>',16,0,1,'CC-BY-NC-SA','',0,0,1),
(256,'2007-06-19','alkix live cd ',775,'','<a href=\\\"http://www.alkix-live.com/\\\"> Alkix Live Cd </a> <br> <br>',64,0,1,'CC-BY-NC-SA','',0,0,1),
(257,'2007-06-20','plsql',4169,'','No Show Notes <br>\r\n<br>',55,0,1,'CC-BY-NC-SA','',0,0,1),
(258,'2007-06-27','mindmanager',309,'','\r\n<a href=\\\"http://www.mindjet.com/us/\\\">Mindjet Home Page</a>\r\n\r\n<br>\r\n\r\n\r\nCtrl+Shit+Alt+T brings 5 day trial into 21 day mode.<br>\r\n<br>',58,0,1,'CC-BY-NC-SA','',0,0,1),
(259,'2007-06-27','How to make a Twat Ep',1744,'','No show notes <br>\r\n<br>',60,0,1,'CC-BY-NC-SA','',0,0,1),
(260,'2007-07-02','Pidgeon Cam',845,'','No Show notes <br>\r\n<br>',3,0,1,'CC-BY-NC-SA','',0,0,1),
(261,'2007-07-09','NAS',1300,'','No show notes <br>\r\n<br>',55,0,1,'CC-BY-NC-SA','',0,0,1),
(262,'2007-07-11','zoneminder',336,'','No show notes <br>\r\n<br>\r\n\r\n\r\n',58,0,1,'CC-BY-NC-SA','',0,0,1),
(263,'2007-07-13','wubi installer and network extraction',662,'','<a href=\\\"http://wubi-installer.org/\\\"> http://wubi-installer.org/ </a> <br>\r\n<br>\r\n<a href=\\\"http://room362.com\\\"> room362.com </a>',62,0,1,'CC-BY-NC-SA','',0,0,1),
(264,'2007-07-16','This old hack',1488,'','Part 1 <br>\r\n<br>',66,0,1,'CC-BY-NC-SA','',0,0,1),
(265,'2007-07-17','nokia 770',312,'','<a href=\\\"http://www.nokiausa.com/770\\\"> nokiausa.com/770 </a> <br>\r\n<a href=\\\"http://www.maemo.org\\\"> maemo.org </a>\r\n<br>\r\n<br>',48,0,1,'CC-BY-NC-SA','',0,0,1),
(266,'2007-07-19','Package Management on OSX',640,'','<p>\r\n<a href=\\\"http://www.macports.org\\\">MacPorts Official Site</a><br />\r\n<a href=\\\"http://trac.macosforge.org/projects/macports/wiki/InstallingMacPorts\\\">MacPorts Installation Instructions</a><br />\r\n<a href=\\\"http://www.finkproject.org\\\">Fink Project Official Site</a>\r\n</p>',16,0,1,'CC-BY-NC-SA','',0,0,1),
(267,'2007-07-27','trixbox',433,'','<a href=\\\"http://www.trixbox.org/\\\"> trixbox.org </a>\r\n<br>\r\n<br>',58,0,1,'CC-BY-NC-SA','',0,0,1),
(268,'2007-07-30','ManHole Funk',204,'','No Show Notes <br>\r\n<br>',65,0,1,'CC-BY-NC-SA','',0,0,1),
(269,'2007-08-02','Windows Tricks',523,'','No Show notes <br>\r\n<br>',67,0,1,'CC-BY-NC-SA','',0,0,1),
(270,'2007-08-08','sql injection',621,'','\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n \r\n\r\n\r\n <a href=\\\"http://www.sqlpowerinjector.com/\\\">SQL Power Injector </a> <br>\r\n<a href=\\\"http://www.priamos-project.com/demo.htm\\\"> PRIAMOS </a> <br>\r\n<a href=\\\"http://www.0x90.org/releases/absinthe/download.php \\\"> Absinthe </a><br>\r\n\r\n<a href=\\\"http://www.twatech.org/agentinfo.php?host=operat0r\\\"> twat episode mod_security </a> <br>\r\n\r\n',36,0,1,'CC-BY-NC-SA','',0,0,1),
(271,'2007-08-09','Avoid Cpu Billing',834,'','<a href=\\\"http://www.cs.huji.ac.il/~dants/papers/Cheat07Security.pdf\\\"> http://www.cs.huji.ac.il/~dants/papers/Cheat07Security.pdf </a> <br> <br>',58,0,1,'CC-BY-NC-SA','',0,0,1),
(272,'2007-08-16','NAMBLA',482,'','<a href=\\\"http://www.nambla.org\\\"> Nambla </a>\r\n<br>\r\n<br>',60,0,1,'CC-BY-NC-SA','',0,0,1),
(273,'2007-08-22','ChatBots',512,'','Play with<br>\r\n<a href=\\\"http://www-ai.ijs.si/eliza-cgi-bin/eliza_script\\\"> http://www-ai.ijs.si/eliza-cgi-bin/eliza_script </a> <br>\r\n<a href=\\\"http://www.alicebot.org/\\\"> http://www.alicebot.org/ </a> <br>\r\n<a href=\\\"http://www.sitechatters.com/\\\"> http://www.sitechatters.com/ </a> <br>\r\n<a href=\\\"http://library.thinkquest.org/19314/langprog.htm\\\"> http://library.thinkquest.org/19314/langprog.htm </a> <br>\r\n<a href=\\\"http://www.alicebot.org/superbot.html\\\"> http://www.alicebot.org/superbot.html </a> <br>\r\nread: <br>\r\n<a href=\\\"http://cogsci.ucsd.edu/%7Ebatali/108b/lectures/natlang.txt\\\"> http://cogsci.ucsd.edu/%7Ebatali/108b/lectures/natlang.txt </a> <br>\r\n<a href=\\\"http://www.toddhester.net/chatbot.html\\\"> http://www.toddhester.net/chatbot.html </a> <br>\r\n<br>\r\n',57,0,1,'CC-BY-NC-SA','',0,0,1),
(274,'2007-08-23','Botanicalls',645,'','<a href=\\\"http://www.botanicalls.com\\\"> botanicalls.com </a> <br>\r\n<br>',25,0,1,'CC-BY-NC-SA','',0,0,1),
(275,'2007-08-29','Wireless Fun Part 2',553,'','<p>\r\n<a href=\\\"http://www.macports.org\\\">MacPorts Official Site</a><br />\r\n<a href=\\\"http://trac.macosforge.org/projects/macports/wiki/InstallingMacPorts\\\">MacPorts Installation Instructions</a><br />\r\n<a href=\\\"http://www.finkproject.org\\\">Fink Project Official Site</a>\r\n</p>\r\n<br>',16,0,1,'CC-BY-NC-SA','',0,0,1),
(276,'2007-08-30','The Age old Question',1230,'','orginal audio Binrev Radio 16\r\n<br>\r\n<br>',55,0,1,'CC-BY-NC-SA','',0,0,1),
(277,'2007-08-31','this old hack part 2',3633,'','part 2 of 3 \r\n<br>\r\n<br>',66,0,1,'CC-BY-NC-SA','',0,0,1),
(278,'2007-09-04','Cmake',933,'','<a href=\\\"http://www.cmake.org\\\"> www.cmake.org </a>\r\n<br>\r\n<br>',69,0,1,'CC-BY-NC-SA','',0,0,1),
(279,'2007-09-06','Curl',416,'','No show notes\r\n<br>\r\n<br>',36,0,1,'CC-BY-NC-SA','',0,0,1),
(280,'2007-09-07','Storage Space',955,'','No Show Notes\r\n<br>\r\n<br>',58,0,1,'CC-BY-NC-SA','',0,0,1),
(281,'2007-09-10','Smart Phones',2451,'','\r\nEgress (mobile RSS atom podcatcher) <br>\r\n\r\n<a href=\\\"http://www.garishkernels.net/software.html\\\"> http://www.garishkernels.net/software.html </a> <br>\r\n\r\n\r\n\r\n<br>\r\n\r\nTCPMP - The Core Pocket Media Player <br>\r\n\r\nif it\\\'s media, this plays it! <br>\r\n\r\n<a href=\\\"http://picard.exceed.hu/tcpmp\\\"> http://picard.exceed.hu/tcpmp </a> <br>\r\n\r\n\r\n\r\nStream YouTube, Google Video & Others w/TCPMP <br>\r\n\r\n<a href=\\\"http://tinyurl.com/2u7xlz\\\"> http://tinyurl.com/2u7xlz </a> <br>\r\n\r\n<a href=\\\"http://tinyurl.com/2oxpgb\\\"> http://tinyurl.com/2oxpgb </a> <br>\r\n\r\n<br>\r\n\r\nOpera (mobile web browser) <br>\r\n\r\n<a href=\\\"http://www.opera.com/products/mobile/products/wimmobileppc\\\"> http://www.opera.com/products/mobile/products/wimmobileppc </a> <br>\r\n\r\n\r\n\r\n<br>\r\n\r\nPocket IRC (mobile IRC!!) <br>\r\n\r\n<a href=\\\"http://pocketirc.com\\\"> http://pocketirc.com </a> <br>\r\n\r\n\r\n\r\n<br>\r\n\r\nAgile Messenger (MSN, AIM, ICQ, YAHOO, GOOGLE TALK, JABBER) <br>\r\n\r\n<a href=\\\"http://agilemobile.com\\\"> http://agilemobile.com </a> <br>\r\n\r\n\r\n\r\n<br>\r\n\r\nOctro Talk (Google Talk, Jabber) <br>\r\n\r\n<a href=\\\"http://octro.com\\\"> http://octro.com </a>\r\n\r\n\r\n\r\n<br>\r\n\r\nMini Stumbler (wifi scanner) <br>\r\n\r\n<a href=\\\"http://www.netstumbler.com/downloads\\\">http://www.netstumbler.com/downloads </a> <br>\r\n\r\n\r\n\r\n<br>\r\n\r\nWifi Fofum (wifi scanner) <br>\r\n\r\n<a href=\\\"http://www.acpecto-software.com/rw/applications/wififofum\\\"> http://www.acpecto-software.com/rw/applications/wififofum </a> <br>\r\n\r\n\r\n<br>\r\n\r\nPDAnet (PDA to laptop modem) <br>\r\n\r\n<a href=\\\"http://junefabrics.com/pdanet\\\"> http://junefabrics.com/pdanet </a> <br>\r\n\r\n<br>\r\n\r\n\r\n\r\nMicrosoft Live Search (mobile maps, locator, directions, etc)<br>\r\n\r\n<a href=\\\"http://www.microsoft.com/windowsmobile/livesearch/default.mspx\\\"> http://www.microsoft.com/windowsmobile/livesearch/default.mspx </a> <br>\r\n\r\n<br>\r\n<br>\r\n\r\n',25,0,1,'CC-BY-NC-SA','',0,0,1),
(282,'2007-09-12','Ptunnel',522,'','<a href=\\\"http://www.cs.uit.no/~daniels/PingTunnel/\\\">http://www.cs.uit.no/~daniels/PingTunnel/</a>',12,0,1,'CC-BY-NC-SA','',0,0,1),
(283,'2007-09-13','Grand Central',1265,'','No show notes\r\n<br>\r\n<br>',60,0,1,'CC-BY-NC-SA','',0,0,1),
(284,'2007-09-18','streaming mp3 files',400,'','No Show Notes\r\n<br>\r\n<br>',48,0,1,'CC-BY-NC-SA','',0,0,1),
(285,'2007-09-28','Make the switch',31,'','No show notes\r\n<br>\r\n<br>\r\n',13,0,1,'CC-BY-NC-SA','',0,0,1),
(286,'2007-11-05','Managing Time',1709,'','No show notes <br> <Br>',23,0,1,'CC-BY-NC-SA','',0,0,1),
(287,'2007-11-07','Clonezilla and Friends',738,'','No Show Notes <br> <br>',36,0,1,'CC-BY-NC-SA','',0,0,1),
(288,'2007-11-16','This week in twat',528,'','<pre>\r\n- Some new RFID Tech\r\n- Hard Drives sold with trojan horses installed\r\n- McGrew Security checks out crackmails.net\r\n</pre>',42,0,1,'CC-BY-NC-SA','',0,0,1),
(289,'2007-11-19','shmoocon meetup',270,'','<br>\r\nNo show notes\r\n<br>',62,0,1,'CC-BY-NC-SA','',0,0,1),
(290,'2007-11-21','Google 411',692,'','No show notes\r\n<br>\r\n',84,0,1,'CC-BY-NC-SA','',0,0,1),
(291,'2007-11-26','Ruby on Rails Primer',614,'','Archive: <a href=\\\"http://www.twatech.org/shownotes/twat-ep291.tar.gz\\\"> twat-ep291.tar.gz </a> <br>\r\n<pre>\r\n - Screenshots\r\n - Rails example\r\n - Rails resources\r\n</pre> ',64,0,1,'CC-BY-NC-SA','',0,0,1),
(292,'2007-11-29','From the Way back Machine',4400,'','orginal audio Defcon 7\r\n<br>\r\n',13,0,1,'CC-BY-NC-SA','',0,0,1),
(293,'2007-12-16','Telephonic Craptacular',640,'','No show notes\r\n<br>\r\n<br>',55,0,1,'CC-BY-NC-SA','',0,0,1),
(294,'2007-12-20','MC Frontalot mix',432,'','no show notes\r\n<br>\r\n<br>',68,0,1,'CC-BY-NC-SA','',0,0,1),
(295,'2007-12-21','Mirror Neurons',178,'','<a href=\\\"http://en.wikipedia.org/wiki/Mirror_neurons\\\"> http://en.wikipedia.org/wiki/Mirror_neurons </a><br>\r\n<a href=\\\"http://www.edge.org/discourse/mirror_neurons.html\\\"> http://www.edge.org/discourse/mirror_neurons.html</a><br>\r\n\r\n<a href=\\\"http://www.interdisciplines.org/mirror/papers/1\\\"> http://www.interdisciplines.org/mirror/papers/1 </a>\r\n<br>\r\n<br>\r\n\r\n',57,0,1,'CC-BY-NC-SA','',0,0,1),
(296,'2007-12-25','nagios',748,'','<a href= \\\"http://www.meulie.net/portal_plugins/forum/forum_viewtopic.php?9513.last\\\"> \r\nhttp://www.meulie.net/portal_plugins/forum/forum_viewtopic.php?9513.last </a> <br>\r\n( http auth dont use check_http !) <br>\r\n<a href=\\\"http://www.meulie.net/portal_plugins/forum/forum_viewtopic.php?1897\\\">\r\nhttp://www.meulie.net/portal_plugins/forum/forum_viewtopic.php?1897 </a> <br>\r\n<br>\r\n\r\n<a href=\\\"http://www.meulie.net/portal_plugins/forum/forum_viewtopic.php?1817\\\">\r\nhttp://www.meulie.net/portal_plugins/forum/forum_viewtopic.php?1817 </a> <br>\r\n<a href=\\\"http://www.nagios.org/faqs/viewfaq.php?faq_id=162\\\"> http://www.nagios.org/faqs/viewfaq.php?faq_id=162 ( debug ) </a><br>\r\n<a href=\\\"http://www.nagios.org/faqs/viewfaq.php?faq_id=324\\\"> http://www.nagios.org/faqs/viewfaq.php?faq_id=324 ( POST ) </a> <br>\r\n<a href=\\\"http://www.nagiosexchange.org/nagios-users.34.0.html?&tx_maillisttofaq_pi1%5Bsort%5D=all_replies%3A1&tx_maillisttofaq_pi1%5Bmode%5D=1&tx_maillisttofaq_pi1%5BshowUid%5D=2220\\\">\r\nnagios mailing list </a> <br>\r\n<a href=\\\"http://www.nagios.org/faqs/viewfaq.php?faq_id=157\\\">\r\nhttp://www.nagios.org/faqs/viewfaq.php?faq_id=157 </a>\r\n<br>\r\n<br>\r\n\r\n\r\n\r\n<a href=\\\"http://del.icio.us/operat0r/NRPE\\\">\r\nhttp://del.icio.us/operat0r/NRPE </a> <br>\r\n<a href=\\\"http://del.icio.us/operat0r/nagios\\\">\r\nhttp://del.icio.us/operat0r/nagios </a>\r\n<br>\r\n<br>\r\n\r\n\r\nNTLM FIX !!! ( for webinject ) <br>\r\n<a href=\\\"http://www.webinject.org/cgi-bin/forums/YaBB.cgi?board=Development;action=display;num=1185818423;start=0#0\\\">\r\nforum post </a> <br>\r\n<a href =\\\"http://www.webinject.org/cgi-bin/forums/YaBB.cgi?board=Development;action=display;num=1185818423;start=1#1\\\"> another forum post </a> <br>\r\n\r\n\r\nMUSIC: <br>\r\n\r\nThe Crystal Method Comin Back <br>\r\nState Of Bengal\\\\Visual Audio\\\\07-Hunters.mp3 <br>',36,0,1,'CC-BY-NC-SA','',0,0,1),
(297,'2007-12-26','Ever Onward IBM',160,'','IBM theme orginal audio from textfiles.com\r\n<br>\r\n<br>',39,0,1,'CC-BY-NC-SA','',0,0,1),
(298,'2007-12-27','Trashing with adam',768,'','No show notes\r\n<br>\r\n<br>',66,0,1,'CC-BY-NC-SA','',0,0,1),
(299,'2007-12-31','Iphone Madness',2785,'','some old audio I dug up <br>\r\nhosts include: <br>\r\nEnigma<br>\r\nfaceman <br>\r\nDrake Anubis <br>\r\nThoughtphreaker <br>\r\n',39,0,1,'CC-BY-NC-SA','',0,0,1),
(300,'2007-12-31','End Transmisson',258,'','check out <a href=\"http://www.hackerpublicradio.org\"> hackerpublicradio.org </a> \r\n<br>\r\n<br>',39,0,1,'CC-BY-NC-SA','',0,0,1),
(69,'0000-00-00','Phone Calls',0,'','More info on the Boston Phone System',0,0,1,'CC-BY-NC-SA','',0,0,1);
/*!40000 ALTER TABLE `twat_eps` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2023-11-28 16:10:05

21516
sql/hpr.sql

File diff suppressed because one or more lines are too long

View File

@@ -1,213 +0,0 @@
<?php
// TODO
// lisence
// filter by date
// if rss.php then use switches
// host out of eps
// explicit from db
#
$mimetype = "audio/ogg";
$format = "ogg";
require "/home/hpr/php/include.php";
$query = "SELECT hosts.host, eps.id, eps.series, eps.title, eps.notes, eps.date, hosts.email, eps.hostid, eps.explicit, eps.version, eps.valid, eps.duration, assets.size
FROM eps, hosts, assets
WHERE eps.valid=1
AND eps.hostid = hosts.hostid
AND eps.id = assets.episode_id
AND eps.duration > 0
AND eps.date >= UTC_DATE()";
if (isset($_GET['format'])) {
$this_format = $_GET['format'];
if ( $this_format === "mp3" ) {
$format = "mp3";
}
if ( $this_format === "ogg" ) {
$format = "ogg";
}
if ( $this_format === "spx" ) {
$format = "spx";
}
}
$query = "${query}\nAND assets.filename REGEXP \"^hpr[0-9]+.$format\"";
$query = "${query}\nAND assets.extension = '$format'";
$html = 1;
if (isset($_GET['html'])) {
$html = $_GET['html'];
if ( $html === "0" ) {
$html = 0;
}
}
$full = "1";
if (isset($_GET['full'])) {
$full = $_GET['full'];
if ( $full === "1" ) {
$feed = "total";
}
if ( $full === "0" ) {
$feed = "tenday";
}
}
if (isset($_GET['hostid'])) {
$hostid = $_GET['hostid'];
$hostid = intval($hostid);
if (is_int(intval($hostid))) {
$query = "$query AND hosts.hostid = '$hostid'";
}
}
if (isset($_GET['series'])) {
$series = $_GET['series'];
$series = intval($series);
if (is_int(intval($series))) {
$query = "$query AND eps.series = '$series'";
}
}
$query = "$query ORDER BY id DESC ";
if (isset($_GET['limit'])) {
$this_limit = $_GET['limit'];
$this_limit = intval($this_limit);
if (is_int(intval($this_limit))) {
$limit = $this_limit;
}
}
header("Content-type: application/xml");
header("Pragma: public");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
date_default_timezone_set('UTC');
print '<?xml version="1.0" encoding="UTF-8" ?>' . "\n";
?>
<rss version="2.0" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" >
<channel>
<title>Hacker Public Radio - Future Feed</title>
<link><?php print "${baseurl}"; ?>about.html</link>
<itunes:subtitle>A daily show hosted the community on topics that are of interest to hackers and hobbyists.</itunes:subtitle>
<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. This is the shows that are in the future feed.</description>
<language>en-us</language>
<itunes:category text="Technology">
<itunes:category text="Tech News"/>
</itunes:category>
<itunes:category text="Education">
<itunes:category text="Training"/>
</itunes:category>
<itunes:image href="<?php print "${baseurl}"; ?>images/hpr_feed_itunes.png"/>
<itunes:explicit>yes</itunes:explicit>
<itunes:author>Hacker Public Radio</itunes:author>
<itunes:keywords>Community Radio, Tech Interviews, Linux, Open, Hobby, Software Freedom</itunes:keywords>
<copyright>Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) License</copyright>
<managingEditor>feedback@NOSPAM-hackerpublicradio.org (HPR Feedback)</managingEditor>
<!-- <author>feedback@NOSPAM-hackerpublicradio.org (HPR Feedback)</author> -->
<itunes:owner>
<itunes:name>HPR Volunteer</itunes:name>
<itunes:email>admin@hackerpublicradio.org</itunes:email>
</itunes:owner>
<webMaster>admin@hackerpublicradio.org (HPR Volunteer)</webMaster>
<generator>kate</generator>
<docs>http://www.rssboard.org/rss-specification</docs>
<ttl>720</ttl>
<skipDays>
<day>Saturday</day>
<day>Sunday</day>
</skipDays>
<image>
<url><?php print "${baseurl}"; ?>images/hpr_feed_small.png</url>
<title>Hacker Public Radio</title>
<link><?php print "${baseurl}"; ?>about.html</link>
<description>The Hacker Public Radio Old Microphone Logo</description>
<height>164</height>
<width>144</width>
</image>
<googleplay:author>HPR Volunteer</googleplay:author>
<googleplay: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.</googleplay:description>
<googleplay:email>admin@hackerpublicradio.org</googleplay:email>
<googleplay:image href="<?php print "${baseurl}"; ?>images/hpr_feed_itunes.png"/>
<googleplay:category text="Technology"/>
<?php
print " <atom:link href=\"${baseurl}". str_replace('&', '&amp;', $_SERVER["REQUEST_URI"]) ."\" rel=\"self\" type=\"application/rss+xml\" />\n";
print " <pubDate>".date(DATE_RFC1123, strtotime(date('Y-m-d')))."</pubDate>\n";
//Set $r to SQL query for execution agains the table
if ($result = mysqli_query($connection, $query)) {
while ($row = mysqli_fetch_array($result)) {
$id = fixid(stripslashes($row['id']));
$version = $row['version'];
if ( $version === "0" ) {
$version = "";
}
else {
$version = ".${version}";
}
$episode_explicit = $row['explicit'];
if ($episode_explicit == 0) {
$episode_explicit = "Clean";
}
else{
$episode_explicit = "Explicit";
}
$url="${baseurl}eps/hpr${id}${version}";
if (isset($_GET['hostidinfilename'])) {
$hostidinfilename = $_GET['hostidinfilename'];
if ( $hostidinfilename === "1" ) {
$url = $url . "_host-" . htmlspecialchars(stripslashes(strip_tags($row["hostid"])));
}
}
if ( isset($_GET['seriesidinfilename']) ) {
$seriesidinfilename = $_GET['seriesidinfilename'];
if ( $seriesidinfilename === "1" ) {
$url = $url . "_series-" . htmlspecialchars(stripslashes(strip_tags($row["series"])));
}
}
$url = $url . "." . $format;
$itunes_summary = htmlspecialchars(stripslashes(strip_tags(substr($row["notes"],0,4000))));
$show_notes = $row["notes"];
$warning = "<p>This show has been flagged as $episode_explicit by the host.</p>\n";
$show_notes = $show_notes . utf8_encode ( $warning );
echo " <item>\n";
if ( $episode_explicit === "Clean" ) {
echo " <itunes:explicit>no</itunes:explicit>\n";
echo " <googleplay:explicit>No</googleplay:explicit>\n";
}
else {
echo " <itunes:explicit>yes</itunes:explicit>\n";
echo " <googleplay:explicit>Yes</googleplay:explicit>\n";
}
echo " <title>HPR$id: " . htmlspecialchars(stripslashes(strip_tags($row["title"]))) . "</title>\n";
// echo "<description> " . ($row["title"]) . "</description>\n";
$email_padded = formatemail($row['email']);
echo " <author>". $email_padded . " (" . htmlspecialchars(stripslashes(strip_tags($row["host"]))) .")</author>\n";
echo " <googleplay:author>". $email_padded . " (" . htmlspecialchars(stripslashes(strip_tags($row["host"]))) .")</googleplay:author>\n";
echo " <itunes:author>". $email_padded . " (" . htmlspecialchars(stripslashes(strip_tags($row["host"]))) .")</itunes:author>\n";
echo " <googleplay:image href=\"${baseurl}images/hpr_feed_itunes.png\"/>\n";
echo " <link>${baseurl}eps/hpr".$id."/index.html</link>\n";
echo " <description><![CDATA[" . $show_notes . "]]>\n</description>\n";
// echo " <googleplay:description><![CDATA[" . $show_notes . "]]>\n</googleplay:description>\n";
echo " <itunes:summary><![CDATA[" . $itunes_summary . "]]>\n</itunes:summary>\n";
echo " <pubDate>" .date(DATE_RFC1123, strtotime($row['date'])) . "</pubDate>\n";
$length = $row['size'];
echo " <enclosure url=\"$url\" length=\"$length\" type=\"$mimetype\"/>\n";
echo " <guid>" . $url . "</guid>\n";
echo " </item>\n";
}
}
//Display non-connection errors
//Close sql connection
mysqli_close($connection);
echo " </channel>
</rss>
";
?>

View File

@@ -35,6 +35,12 @@ switch ($atomurl) {
$mimetype = "audio/mpeg";
$feed = "total";
break;
case "/rss-future.php":
$format = "mp3";
$mimetype = "audio/mpeg";
$feed = "future";
$limit = 100;
break;
case "/hpr_ogg_rss.php":
$format = "ogg";
$mimetype = "audio/ogg";
@@ -45,13 +51,13 @@ switch ($atomurl) {
$mimetype = "audio/ogg";
$feed = "total";
break;
case "/hpr_spx_rss.php":
$format = "spx";
case "/hpr_opus_rss.php":
$format = "opus";
$mimetype = "audio/ogg";
$feed = "tenday";
break;
case "/hpr_total_spx_rss.php":
$format = "spx";
case "/hpr_total_opus_rss.php":
$format = "opus";
$mimetype = "audio/ogg";
$feed = "total";
break;
@@ -60,11 +66,6 @@ switch ($atomurl) {
$mimetype = "audio/mpeg";
$feed = "tenday";
break;
case "/rss1.php":
$format = "spx";
$mimetype = "audio/ogg";
$feed = "tenday";
break;
}
require "/home/hpr/php/include.php";
@@ -85,8 +86,8 @@ if (isset($_GET['format'])) {
$format = "ogg";
$mimetype = "audio/ogg";
}
if ( $this_format === "spx" ) {
$format = "spx";
if ( $this_format === "opus" ) {
$format = "opus";
$mimetype = "audio/ogg";
}
}
@@ -121,15 +122,11 @@ if (isset($_GET['full'])) {
}
}
$gomax = "0";
if (isset($_GET['gomax'])) {
$gomax = $_GET['gomax'];
if ( $gomax === "1" ) {
$gomax = "1";
}
if ( $feed === "future" ) {
$query = "${query}\nAND eps.date >= UTC_DATE() ";
}
if ( $gomax === "0" ) {
$query = "${query}\nAND eps.date <= UTC_DATE() ";
else {
$query = "${query}\nAND eps.date <= UTC_DATE() ";
}
if (isset($_GET['hostid'])) {
@@ -189,7 +186,6 @@ print '<?xml version="1.0" encoding="UTF-8" ?>' . "\n";
<itunes:keywords>Community Radio, Tech Interviews, Linux, Open, Hobby, Software Freedom</itunes:keywords>
<copyright>Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) License</copyright>
<managingEditor>feedback@NOSPAM-hackerpublicradio.org (HPR Feedback)</managingEditor>
<!-- <author>feedback@NOSPAM-hackerpublicradio.org (HPR Feedback)</author> -->
<itunes:owner>
<itunes:name>HPR Volunteer</itunes:name>
<itunes:email>admin@hackerpublicradio.org</itunes:email>
@@ -237,34 +233,19 @@ if ($result = mysqli_query($connection, $query)) {
else{
$episode_explicit = "Explicit";
}
$url="http://hackerpublicradio.org/eps/hpr${id}${version}";
if (isset($_GET['hostidinfilename'])) {
$hostidinfilename = $_GET['hostidinfilename'];
if ( $hostidinfilename === "1" ) {
$url = $url . "_host-" . htmlspecialchars(stripslashes(strip_tags($row["hostid"])));
}
}
if ( isset($_GET['seriesidinfilename']) ) {
$seriesidinfilename = $_GET['seriesidinfilename'];
if ( $seriesidinfilename === "1" ) {
$url = $url . "_series-" . htmlspecialchars(stripslashes(strip_tags($row["series"])));
}
}
$url = $url . "." . $format;
$url="https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr${id}/hpr${id}.${format}";
$itunes_summary = htmlspecialchars(stripslashes(strip_tags(substr($row["notes"],0,4000))));
if ( $html == 1 ) {
# $show_notes = "<p>This show has been flagged as $episode_explicit by the host.</p>\n" . $row["notes"];
$show_notes = $row["notes"];
$warning = "<p>This show has been flagged as $episode_explicit by the host.</p>\n";
$show_notes = "<p>This show has been flagged as $episode_explicit by the host.</p>\n";
$show_notes = $show_notes . $row["notes"];
$show_notes = $show_notes . "<p><a href=\"https://hackerpublicradio.org/eps/hpr${id}/index.html#comments\">Provide <strong>feedback</strong> on this episode</a>.</p>";
}
else {
# $show_notes = "This show has been flagged as $episode_explicit by the host.\n" . htmlspecialchars(stripslashes(strip_tags($row["notes"]))) ;
$show_notes = htmlspecialchars(stripslashes(strip_tags($row["notes"]))) ;
$warning = "This show has been flagged as $episode_explicit by the host.\n";
$show_notes = "This show has been flagged as $episode_explicit by the host.\n";
$show_notes = $show_notes . htmlspecialchars(stripslashes(strip_tags($row["notes"]))) ;
}
# $show_notes = utf8_encode ( $show_notes );
$warning = utf8_encode ( $warning );
echo " <item>\n";
if ( $episode_explicit === "Clean" ) {
echo " <itunes:explicit>no</itunes:explicit>\n";
@@ -289,7 +270,6 @@ if ($result = mysqli_query($connection, $query)) {
else {
echo " <description><![CDATA[" . $show_notes . "]]>\n</description>\n";
}
// echo " <googleplay:description><![CDATA[" . $show_notes . "]]>\n</googleplay:description>\n";
echo " <itunes:summary><![CDATA[" . $itunes_summary . "]]>\n</itunes:summary>\n";
echo " <pubDate>" .date(DATE_RFC1123, strtotime($row['date'])) . "</pubDate>\n";
$length = $row['size'];
@@ -301,8 +281,6 @@ if ($result = mysqli_query($connection, $query)) {
}
}
//Display non-connection errors
//Close sql connection
mysqli_close($connection);
echo " </channel>
</rss>