AutoHotkey Community

It is currently May 27th, 2012, 1:47 am

All times are UTC [ DST ]




Post new topic Reply to topic  [ 19 posts ]  Go to page 1, 2  Next
Author Message
PostPosted: March 22nd, 2009, 11:05 am 
Hi!
I made this script because I am a heavy podcastoholic and I couldnt find any portable, decent, fast, tag-friendly, and automatic software to download my podcast.
I hope you find it useful,
Code:




; AHK POD
; This script downloads all new podcast from the podcast-adresses stored in the
; podcast.txt file in the scriptdirectory
; the podcast.txt file should contain lines such as
; http://downloads.bbc.co.uk/podcasts/worldservice/globalnews/rss.xml
;
; The script stores the podcasts in the pdir-folder for example
; G:\Podcasts\00Global_News\20090317@1751.mp3 and uses id3.exe
; (http://home.wanadoo.nl/squell/files/id3-078w.zip) to tag the podcast as album
; "00Global_News" and title "20090317@1751" which is the publish-date and time.
; I put an 00 before the album name because I want all my podcasts to be at the
; top of my albumlist. After downloading and tagging  the scripts ask you if you
; want to delete old podcasts as defined by the variable timedelete. If you want
; to download a specific podcast simply remove the line of your wanted podcast
; in the casts\yoursubriction.txt -file
;
; this script is based on maestrith script:
; http://www.autohotkey.com/forum/topic33847.html&highlight=itunes with an added
; functions. To have this script pop up as as run-option when you plugin your
; mp3/usb-device, compile the script to an exe-fil put the script in the
; root folder of your usb-device and edit or create an text-file called AUTORUN.INF
; in the root folder and put the following lines in that file
; [autorun]
; OPEN=AHK_pod.exe
; ACTION=Run AHK_pod.exe
;
; Hope you find the script usefull

#singleinstance, force

;the variable usbl is the devicelabel, eg the script can be run from a usb-device and works independet of lettername
usbl := SubStr(A_ScriptFullPath, 1, 1)

; change this variable to no if you whant to update the list off podcasts but dont download them
downloadnewpod := yes

; rename this to the directore where you whant to store your podcast directory
pdir = %usbl%:\podcasts


;days from current date to suggest delete of old mp3s
timedelete = 5


; script begins...
ifNotExist %A_ScriptFullPath%\casts
filecreatedir %A_ScriptFullPath%\casts

fileappend, <FDM_Downloads_Info_List>`n, download.xml
Loop, read, podcasts.txt
{
    Loop, parse, A_LoopReadLine, `n
    {
   urldownloadtofile, %A_LoopField%, download.dnl
   operation = update1
   gosub, strip
    }
}

fileappend, </FDM_Downloads_Info_List>, download.xml
fileread, download, download.xml
if download not contains <url>
{
 msgbox Nothing to download
 gosub exit
}


; asks for delete old mp3
stringleft, A_Now2, A_Now, 8
timedeletemsg := (A_Now2 - timedelete)
{
 Loop, %pdir%\*.mp3 , ,1
 {
  stringleft, filenamedate, A_LoopFileName,8
  If (filenamedate - timedeletemsg < 0)
   {
    fileappend, `n%A_LoopFileFullPath%, oldmp3.txt
   }   
 }
}

fileread, oldmp3, oldmp3.txt
if oldmp3 contains mp3
msgbox, 4,, Do you want to delete the following mp3-files? %oldmp3%
IfMsgBox Yes
Loop, read, oldmp3.txt
{
Filedelete, %A_LoopReadLine%
}
gosub exit
return

strip:
fileread, info, download.dnl
stringreplace, info, info, &amp;, %a_space%and%a_space%, all
stringreplace, info, info, <item>, ®, all
needle = Ui)"(http://[^[:space:]]*(m4v|mp4|mp3))"
loop, parse, info, ®
{
 RegExMatch(a_loopfield, "Ui)<description>(.*)</description>" ,description)
 RegExMatch(a_loopfield, "Ui)<pubdate>(.*)</pubdate>" ,pubdate)
 RegExMatch(a_loopfield, "U)<title>(.*)</title>", title)
 RegExMatch(a_loopfield, needle, url)
 gosub, fix
 if a_index = 1
 {
  file2 := regexreplace(title1,"i)[^a-z0-9[:space:])(]")
  file := regexreplace(file2," ", "_")
  fileread, compare, casts\%file%.txt
  continue
 }
 title1 := regexreplace(title1,"i)[^a-z0-9[:space:]]")
 gosub, date
 description1 := regexreplace(description1,"U)(\t|\n|\r|<.*>|\&..;|\[.*]|\||]\>|)")
 stringleft, description1, description1, 150
 url=
 gosub, %operation%
}
return

fix:
Loop
{
 regexmatch(url1, "`%(..)",ascii)
 StringReplace, url1, url1, `%%ascii1%, % Chr("0x" . ascii1), All
 if errorlevel <> 0
 break
}
return


update1:

fileread, compare, casts\%file%.txt
RegExMatch(compare, title1 ,found)
if found =
{
 fileappend, %date%®%title1%®%url1%®%description1%`n, casts\%file%.txt
 fileappend, <download>`n<url>%url1%</url>`n<group>Video\%name%</group>`n</download>`n,    download.xml
 saveDir = %usbl%:\Podcasts\00%file%
 fileName = %date%.mp3
 ifNotExist %savedir%
 filecreatedir %savedir%
 sleep 50
 if downloadnewpod contains yes
  {
   gosub downloadpodcast
  }
 sleep 100
 run id3 -2 -t "%date%" -l "00%file%" %savedir%\%date%.mp3,,hide

}
return


date:
d = 1
loop, parse, pubdate, %a_space%
{
 if a_loopfield =
 continue
 p%d% = %a_loopfield%
 d += 1
}
loop, 12
{
 month = %a_index%
 if StrLen(month)=1
 month = 0%month%
 formattime, out, 2008%month%01, MMM
 if out = %p3%
 {
  if a_index < 10
  p3 = 0%a_index%
  else
  p3 = %a_index%
 }
 p5gammal := regexreplace(p5,":", "")
 stringleft, p5new, p5gammal,4
}
if StrLen(p2) =1
p2 = 0%p2%
date = %p4%%p3%%p2%@%p5new%
return

exit:
filedelete download.xml
filedelete download.dnl
filedelete oldmp3.txt
exitapp
return


downloadpodcast:
Progress, X0 Y63 h75 w430 A M T,, ,%saveDir%\%fileName% , bold
         SetTimer, uProgress, 150
         totalFileSize := HttpQueryInfo(url1, 5)
         UrlDownloadToFile, %url1%, %saveDir%\%fileName%
         SetTimer, uProgress, off
         Progress, Off
         filegetSize,sizefil,%saveDir%\%fileName%
         if(sizefil = 1638)
         goto,nofile
       ;  msgbox,Download finished
return       

nofile:          ; When the file is not found, it creates a file of 1638 bytes
{
filedelete,%saveDir%\%fileName%
msgbox,File not found on the site.
}
return

uProgress:
   FileGetSize, fs, %saveDir%\%fileName% ,K
   a := Floor(fs/totalFileSize * 100*1024)
   b := Floor(fs/totalFileSize * 10000*1024)/100
   SetFormat, float, 0.2
   b += 0
TFileSize := totalFileSize / 1024
Tfs=%TFileSize%
Progress,%a%,%b%`%        downloaded: %fs% Kb.    of     %Tfs% Kb.
return

HttpQueryInfo(URL, QueryInfoFlag=21, Proxy="", ProxyBypass="") {
hModule := DllCall("LoadLibrary", "str", "wininet.dll")
If (Proxy != "")
AccessType=3
Else
AccessType=1
io_hInternet := DllCall("wininet\InternetOpenA"
, "str", "" ;lpszAgent
, "uint", AccessType
, "str", Proxy
, "str", ProxyBypass
, "uint", 0) ;dwFlags
If (ErrorLevel != 0 or io_hInternet = 0) {
DllCall("FreeLibrary", "uint", hModule)
return, -1
}
iou_hInternet := DllCall("wininet\InternetOpenUrlA"
, "uint", io_hInternet
, "str", url
, "str", "" ;lpszHeaders
, "uint", 0 ;dwHeadersLength
, "uint", 0x80000000 ;dwFlags: INTERNET_FLAG_RELOAD = 0x80000000 // retrieve the original item
, "uint", 0) ;dwContext
If (ErrorLevel != 0 or iou_hInternet = 0) {
DllCall("FreeLibrary", "uint", hModule)
return, -1
}
VarSetCapacity(buffer, 1024, 0)
VarSetCapacity(buffer_len, 4, 0)
Loop, 5
{
  hqi := DllCall("wininet\HttpQueryInfoA"
  , "uint", iou_hInternet
  , "uint", QueryInfoFlag ;dwInfoLevel
  , "uint", &buffer
  , "uint", &buffer_len
  , "uint", 0) ;lpdwIndex
  If (hqi = 1) {
    hqi=success
    break
  }
}
IfNotEqual, hqi, success, SetEnv, res, timeout
If (hqi = "success") {
p := &buffer
Loop
{
  l := DllCall("lstrlen", "UInt", p)
  VarSetCapacity(tmp_var, l+1, 0)
  DllCall("lstrcpy", "Str", tmp_var, "UInt", p)
  p += l + 1
  res := res  . "`n" . tmp_var
  If (*p = 0)
  Break
}
StringTrimLeft, res, res, 1
}
DllCall("wininet\InternetCloseHandle",  "uint", iou_hInternet)
DllCall("wininet\InternetCloseHandle",  "uint", io_hInternet)
DllCall("FreeLibrary", "uint", hModule)
return, res
}




Report this post
Top
  
Reply with quote  
 Post subject: some changes
PostPosted: March 22nd, 2009, 11:58 am 
I have made some changes to the script, I put some of the variables in an settings.txt file for easier use as a compiled script. The settings.txt and podcast.txt is automatically created if it not exist.

Code:

; AHK POD
; This script downloads all new podcast from the podcast-adresses stored in the
; podcast.txt file in the scriptdirectory
; the podcast.txt file should contain lines such as
; http://downloads.bbc.co.uk/podcasts/worldservice/globalnews/rss.xml
;
; The script stores the podcasts in the pdir-folder for example
; G:\Podcasts\00Global_News\20090317@1751.mp3 and uses id3.exe
; (http://home.wanadoo.nl/squell/files/id3-078w.zip) to tag the podcast as album
; "00Global_News" and title "20090317@1751" which is the publish-date and time.
; I put an 00 before the album name because I want all my podcasts to be at the
; top of my albumlist. After downloading and tagging  the scripts ask you if you
; want to delete old podcasts as defined by the variable timedelete. If you want
; to download a specific podcast simply remove the line of your wanted podcast
; in the casts\yoursubriction.txt -file
;
; If it is the first time you run the script it will create an settings.txt file
; with default values and an podcast.txt file with the above mentioned podcast.
; If you want to change the directory to were to download the podcasts edit the
; downloadpodcast_to variable and if you want to update the list of podcasts but dont
; download them change the downloadnewpod variable to no. The variable timedelete
; in the settings.txt defines the days from current date to suggest delete of old mp3s.
;
; this script is based on maestrith script:
; http://www.autohotkey.com/forum/topic33847.html&highlight=itunes with an added
; functions. To have this script pop up as as run-option when you plugin your
; mp3/usb-device, compile the script to an exe-fil put the script in the
; root folder of your usb-device and edit or create an text-file called AUTORUN.INF
; in the root folder and put the following lines in that file
; [autorun]
; OPEN=AHK_pod.exe
; ACTION=Run AHK_pod.exe
;
; Hope you find the script usefull

#singleinstance, force

;the variable usbl is the devicelabel, eg the script can be run from a usb-device and works independet of lettername
usbl := SubStr(A_ScriptFullPath, 1, 1)

; script begins...
; checking settings.txt-file
ifNotExist settings.txt
{
 IniWrite, yes, settings.txt, settings, downloadnewpod
 IniWrite, podcasts, settings.txt, settings, downloadpodcast_to
 IniWrite, 5, settings.txt, settings, timedelete
}
IniRead, downloadnewpod ,settings.txt, settings, downloadnewpod
IniRead, downloadpodcast_to ,settings.txt, settings,downloadpodcast_to
IniRead, timedelete ,settings.txt, settings,timedelete
pdir = %usbl%:\%downloadpodcast_to%


; checking podcasts.txt, compares new podcast and download new
ifNotExist casts
{
filecreatedir casts
}

ifNotExist podcasts.txt
{
 fileappend, http://downloads.bbc.co.uk/podcasts/worldservice/globalnews/rss.xml, podcasts.txt
}

fileappend, <FDM_Downloads_Info_List>`n, download.xml
Loop, read, podcasts.txt
{
    Loop, parse, A_LoopReadLine, `n
    {
   urldownloadtofile, %A_LoopField%, download.dnl
   operation = update1
   gosub, strip
    }
}

fileappend, </FDM_Downloads_Info_List>, download.xml
fileread, download, download.xml
if download not contains <url>
{
 msgbox Nothing to download
 gosub exit
}


; asks for delete old mp3
stringleft, A_Now2, A_Now, 8
timedeletemsg := (A_Now2 - timedelete)
{
 Loop, %pdir%\*.mp3 , ,1
 {
  stringleft, filenamedate, A_LoopFileName,8
  If (filenamedate - timedeletemsg < 0)
   {
    fileappend, `n%A_LoopFileFullPath%, oldmp3.txt
   }   
 }
}

fileread, oldmp3, oldmp3.txt
if oldmp3 contains mp3
msgbox, 4,, Do you want to delete the following mp3-files? %oldmp3%
IfMsgBox Yes
Loop, read, oldmp3.txt
{
Filedelete, %A_LoopReadLine%
}
gosub exit
return

strip:
fileread, info, download.dnl
stringreplace, info, info, &amp;, %a_space%and%a_space%, all
stringreplace, info, info, <item>, ®, all
needle = Ui)"(http://[^[:space:]]*(m4v|mp4|mp3))"
loop, parse, info, ®
{
 RegExMatch(a_loopfield, "Ui)<description>(.*)</description>" ,description)
 RegExMatch(a_loopfield, "Ui)<pubdate>(.*)</pubdate>" ,pubdate)
 RegExMatch(a_loopfield, "U)<title>(.*)</title>", title)
 RegExMatch(a_loopfield, needle, url)
 gosub, fix
 if a_index = 1
 {
  file2 := regexreplace(title1,"i)[^a-z0-9[:space:])(]")
  file := regexreplace(file2," ", "_")
  fileread, compare, casts\%file%.txt
  continue
 }
 title1 := regexreplace(title1,"i)[^a-z0-9[:space:]]")
 gosub, date
 description1 := regexreplace(description1,"U)(\t|\n|\r|<.*>|\&..;|\[.*]|\||]\>|)")
 stringleft, description1, description1, 150
 url=
 gosub, %operation%
}
return

fix:
Loop
{
 regexmatch(url1, "`%(..)",ascii)
 StringReplace, url1, url1, `%%ascii1%, % Chr("0x" . ascii1), All
 if errorlevel <> 0
 break
}
return


update1:

fileread, compare, casts\%file%.txt
RegExMatch(compare, title1 ,found)
if found =
{
 fileappend, %date%®%title1%®%url1%®%description1%`n, casts\%file%.txt
 fileappend, <download>`n<url>%url1%</url>`n<group>Video\%name%</group>`n</download>`n,    download.xml
 saveDir = %usbl%:\Podcasts\00%file%
 fileName = %date%.mp3
 ifNotExist %savedir%
 filecreatedir %savedir%
 sleep 50
 if downloadnewpod contains yes
  {
   gosub downloadpodcast
  }
 sleep 100
 run id3 -2 -t "%date%" -l "00%file%" %savedir%\%date%.mp3,,hide

}
return


date:
d = 1
loop, parse, pubdate, %a_space%
{
 if a_loopfield =
 continue
 p%d% = %a_loopfield%
 d += 1
}
loop, 12
{
 month = %a_index%
 if StrLen(month)=1
 month = 0%month%
 formattime, out, 2008%month%01, MMM
 if out = %p3%
 {
  if a_index < 10
  p3 = 0%a_index%
  else
  p3 = %a_index%
 }
 p5gammal := regexreplace(p5,":", "")
 stringleft, p5new, p5gammal,4
}
if StrLen(p2) =1
p2 = 0%p2%
date = %p4%%p3%%p2%@%p5new%
return

exit:
filedelete download.xml
filedelete download.dnl
filedelete oldmp3.txt
exitapp
return


downloadpodcast:
Progress, X0 Y63 h75 w430 A M T,, ,%saveDir%\%fileName% , bold
         SetTimer, uProgress, 150
         totalFileSize := HttpQueryInfo(url1, 5)
         UrlDownloadToFile, %url1%, %saveDir%\%fileName%
         SetTimer, uProgress, off
         Progress, Off
         filegetSize,sizefil,%saveDir%\%fileName%
         if(sizefil = 1638)
         goto,nofile
       ;  msgbox,Download finished
return       

nofile:          ; When the file is not found, it creates a file of 1638 bytes
{
filedelete,%saveDir%\%fileName%
msgbox,File not found on the site.
}
return

uProgress:
   FileGetSize, fs, %saveDir%\%fileName% ,K
   a := Floor(fs/totalFileSize * 100*1024)
   b := Floor(fs/totalFileSize * 10000*1024)/100
   SetFormat, float, 0.2
   b += 0
TFileSize := totalFileSize / 1024
Tfs=%TFileSize%
Progress,%a%,%b%`%        downloaded: %fs% Kb.    of     %Tfs% Kb.
return

HttpQueryInfo(URL, QueryInfoFlag=21, Proxy="", ProxyBypass="") {
hModule := DllCall("LoadLibrary", "str", "wininet.dll")
If (Proxy != "")
AccessType=3
Else
AccessType=1
io_hInternet := DllCall("wininet\InternetOpenA"
, "str", "" ;lpszAgent
, "uint", AccessType
, "str", Proxy
, "str", ProxyBypass
, "uint", 0) ;dwFlags
If (ErrorLevel != 0 or io_hInternet = 0) {
DllCall("FreeLibrary", "uint", hModule)
return, -1
}
iou_hInternet := DllCall("wininet\InternetOpenUrlA"
, "uint", io_hInternet
, "str", url
, "str", "" ;lpszHeaders
, "uint", 0 ;dwHeadersLength
, "uint", 0x80000000 ;dwFlags: INTERNET_FLAG_RELOAD = 0x80000000 // retrieve the original item
, "uint", 0) ;dwContext
If (ErrorLevel != 0 or iou_hInternet = 0) {
DllCall("FreeLibrary", "uint", hModule)
return, -1
}
VarSetCapacity(buffer, 1024, 0)
VarSetCapacity(buffer_len, 4, 0)
Loop, 5
{
  hqi := DllCall("wininet\HttpQueryInfoA"
  , "uint", iou_hInternet
  , "uint", QueryInfoFlag ;dwInfoLevel
  , "uint", &buffer
  , "uint", &buffer_len
  , "uint", 0) ;lpdwIndex
  If (hqi = 1) {
    hqi=success
    break
  }
}
IfNotEqual, hqi, success, SetEnv, res, timeout
If (hqi = "success") {
p := &buffer
Loop
{
  l := DllCall("lstrlen", "UInt", p)
  VarSetCapacity(tmp_var, l+1, 0)
  DllCall("lstrcpy", "Str", tmp_var, "UInt", p)
  p += l + 1
  res := res  . "`n" . tmp_var
  If (*p = 0)
  Break
}
StringTrimLeft, res, res, 1
}
DllCall("wininet\InternetCloseHandle",  "uint", iou_hInternet)
DllCall("wininet\InternetCloseHandle",  "uint", io_hInternet)
DllCall("FreeLibrary", "uint", hModule)
return, res
}






Report this post
Top
  
Reply with quote  
 Post subject:
PostPosted: January 16th, 2010, 5:02 am 
Offline

Joined: February 14th, 2007, 8:01 pm
Posts: 308
I am wondering if this fits this bill. I will try this, am desperate. Ahk is best. I was thinking of a mod to some link leech script, but with ability to keep tabs on what was downloaded successfully.


" Itunes deletes subscriptions after I move a file out to transcode to 1/5th the podcast size (they want us to buy a 40 gig unit. But if I did I would just want my 2000 album collection on it and about 2000 hours of voice and still have space issues). Juice suddenly stopped working (dunno, java, I guess. piece of crap.) Pod puppy is very unresponsive and loosing subscriptions too and loosing entire opml."


Podcast Client specifications:

unusual but essential:
able to know what is sucessfully downloaded
able to keep the log of sucessful dls and not redownload if a mp3 is deleted.
resume a dl if broken by bad isp.
bandwidth throttle and process priority.
auto opml backups, but not overwrite


usual essential:
stable
responsive
won't break if windows reinstall (ini not registry based or doc and setting based.)
no need to install python/dotnet/java to use! This, because these pieces of crap are huge and usually don't install properly.


Nice if:
added pod transcoding to smaller more efficient mp3s with lowpass/monoizing/vbr voice: 21-38 kps Saving ipod/drive space and battery/transfer time.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 16th, 2010, 5:14 am 
Offline

Joined: February 14th, 2007, 8:01 pm
Posts: 308
Testing now.

I don't yet get:
"If you want to download a specific podcast simply remove the line of your wanted podcast in the casts\yoursubriction.txt -file

isn't this the list of downloaded stuff? If so, shouldn't some triplicate backup be in order. Still don't understand yet the means. looks like it gets a download.dnl , ie. the podcast's xml. Then makes a download.xml then keeps track in the casts\yoursubscription.txt

First, shouldn't we be able to view any fresh, never before generated, list and be able to delete podcasts other clients already snatched? Then, I don't really see the download.xml corresponding to list of podcast to download. Rather it just keeps working on the download.dnl, leeching mp3 off it.

Sorry, I am tired here, but excited to see a promising client after all the disaters. Shame cause a podcast client done right, would sink radio. There would need to be wireless syncing too to really make it work for everyone and some huge memory.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 16th, 2010, 5:21 pm 
Offline

Joined: February 14th, 2007, 8:01 pm
Posts: 308
I guess first question before running off to work: I am running it all night and still downloading casts other podcasts already downloaded, before getting setup for new casts. I wonder if a way to avoid this. Most podcast clients generate a list of old podcasts and you check ones that are to be downloaded, to avoid this. I understand such a gui is time consuming. However, if the client checked all casts, leeched out possible links (minus list of ones already done), then gave user xx minutes to edit these txt files to delete lines of previously retrieved casts (even with other clients). At least do this on all new subscriptions not seen before on previous runs.

As it is, I will need to let run for a week, provided it doesn't crash. Then manually listen to each cast and delete ones sounding familiar. Since the naming scheme is only date based and not subject based. ( I subscribe, mainly, to stuff like how stuff works, hardcore history, naked scientist, Spanish lessons, et al where content doesn't get out dated easily and dates don't matter.) So a naming tweak is in order too.

I have a cable modem that disconnects randomly every 2 or so hours. So writing around that is needed. Also, bw throttling is needed. But using process lasso which can help bw prioritizing some.

I see joelh is a guest, not a member. Over all, for other thinking of trying, I will say, if everything downloads and gets caught up, I will back up the xml which indicateds already done casts, then continue to use. Ultimately, it should work better than podpuppy (et. al. as described), cause I don't dig it when they randomly lose my subscriptions and list of downloads--and ever unresponsive and freezes. Overtime, I will pour through the code to understand all lines of functions.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 17th, 2010, 7:45 pm 
Offline

Joined: February 14th, 2007, 8:01 pm
Posts: 308
I have been making changes. Firstly, and highest priority, I added a "DryRun=no" variable in settings.txt if yes, it will not really download the podcasts. The result will be all files in the cast dir are updated. The user then can manually delete the lines of the podcasts they want downloaded. A little crude, but good 20 minute fix.

I also hate the naming structure, so have been playing with that, but am unsure how this effects the oldmp3.txt, as of yet. Moreover I am still trying to grasp the msgbox to delete the failed mp3s. Is this deleting the lines in the cast dir?

So, obviously also, the cast directory needs to be renamed downloadedcastlist for the end user.

Also I added RunOnExit variable.. And a triplicate backup system of old podcast.txt and cast directories.

I can post code if anyone interested. Just let me know; I am monitoring. In mean time, I am testing code.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 18th, 2010, 10:54 pm 
Offline

Joined: February 14th, 2007, 8:01 pm
Posts: 308
Okay, I worked on script all yesterday and good part of today. I got most all my original specs, minus the resume. I hope someone can take it farther. Code below after prologue of needs.

Changelog over joelh posted:

-Fixed ahkpod inability to download xml that didn't fit profile: ex. how stuff works.
-fixed ability to only download episode we want with dry run option and then edit.
-Done:! Need to make list of post urldownload and b is not 100. fileappend, url1, ProbableUnsuccessfulDownloaDs and if this file is large on next run force open and edit on next run.
on manual exit the last "update" line (podcast) needs to be auto deleted from cast\particularlist.txt so it can be dl next time.
-Done; fixed naming scheme.
-added ability to run program on exit , like mp3squisher. (see akronedge.info)
-made it so not thinking we sucessfully downloaded files on isp outage.
-added ability to add subscriptions on startup.
-fixed id3 if not exist
-renamed the confusing 'cast' directory to DownloadedCasts for new users


ahkpod needs:

User friendly: doc outline:

Topics:
-what is it? A automated...
-sub html: what is a podcast and why less time than monkeying with radio
-sub html: What other podcast client that suck: Itunes deletes subscription if you manage the mp3s (as in transcoding them to smaller files). juice and ippodder stopped working on latest java update. Poppuppy is dotnet and unresponsive and looses subscription and dl'd lists. podcast ready is crap aimed at getting their content on your system.
-sub html: what is lacking to make main stream: squisher, and wireless auto syncing that auto deleted files after listening or at least moved out to holding area.
-specifications (windows scheduler dependent for regular automated use, built around a failing internet, run program like squisher at end, minimal gui, able to know what is sucessfully downloaded,able to keep the log of sucessful dls and not redownload if a mp3 is deleted, restart a dl if broken by bad isp. auto subscription/and dllists backups, but not overwrite,
stable
responsive
won't break if windows reinstall (ini not registry based or doc and setting based.)
no need to install python/dotnet/java to use! This, because these pieces of crap are huge and usually don't install properly.

More Header Topics:
INstallation
Usage
Scheduling with windows scheduler instructions
Quirks: mp4, crashing when throttled, crashing other scripts with same dll call
Limitation
External links (http://akronedge.info/wintersoft/mp3squisher/index.html (splashware) and bitsum.com for prioritizing that works and to file sync for sync up and mp4 converter, 3proxy.ru for throttling)
Credits

AHKpod Programming Needs:

On dry run, need to hide the gui. (better minimize scheme)
Need 3PROXY or throttling.
small free commandline mp4 to mp3 converter, since mp4 aren't any good with current squishing tools/players
more ini user flexibility on naming scheme
Need a clever way to open SuccessfullyDownloadedPodCastsList dir , if desired on startup (done on dry run, not startup)

to test: if other drive can be speced on setting txt; need choose folder and ifexist test for podcast folder in ini validation
test, priority
test if my filenamedeg only works with mp3


[code]

; AHK POD
; This script downloads all new podcast from the podcast-adresses stored in the
; %a_workingdir%\podcast-subscriptions.txt file
; The podcast.txt file should contain lines such as
; http://downloads.bbc.co.uk/podcasts/worldservice/globalnews/rss.xml
;

; The script stores the podcasts in the pdir-folder for example
; G:\Podcasts\00Global_News\20090317@1751.mp3 and uses id3.exe
; (http://home.wanadoo.nl/squell/files/id3-078w.zip) to tag the podcast as album
; "00Global_News" and title "20090317@1751" which is the publish-date and time.
; I put an 00 before the album name because I want all my podcasts to be at the
; top of my albumlist. After downloading and tagging the scripts ask you if you
; want to delete old podcasts as defined by the variable timedelete. If you want
;? to download a specific podcast simply remove the line of your wanted podcast
;? in the DownloadedCasts\yoursubriction.txt -file
;
; If it is the first time you run the script it will create an settings.txt file
; with default values and an podcast.txt file with the above mentioned podcast.
; If you want to change the directory to where to download the podcasts, edit the
; downloadpodcast_to variable and if you want to update the list of podcasts but dont
; download them change the downloadnewpod variable to no. The variable timedelete
; in the settings.txt defines the days from current date to suggest delete of old mp3s.
;
; this script is based on maestrith script:
; http://www.autohotkey.com/forum/topic33847.html&highlight=itunes with an added
; functions. To have this script pop up as as run-option when you plugin your
; mp3/usb-device, compile the script to an exe-fil put the script in the
; root folder of your usb-device and edit or create an text-file called AUTORUN.INF
; in the root folder and put the following lines in that file
; [autorun]
; OPEN=AHK_pod.exe
; ACTION=Run AHK_pod.exe
;
; Hope you find the script usefull

;Added manual downloader, written by maestrith
;Added list editor, for easier marking for download of podcasts after newly adding podcast.
;added: Much time writing around whacko xml like how stuff works and naked scientist and npr freshair
;added auto timeout gui for catchup/dryrun, manual downloader or regular run.
;import function is early beta in early feb 2010

; todos: Fix autolist editor so updates right pane in real time. To do this, need to rename /downloaded casts/podname-urlsplit.txt this way url can be matched to files that need editing.
; 2do: need skip current file (post is there a way to goto and kill url downloadtofile routine)

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

#singleinstance, force
settitlematchmode,2

;the variable usbl is the devicelabel, eg the script can be run from a usb-device and works independet of lettername
usbl := SubStr(A_ScriptFullPath, 1, 1)

; script begins...
; checking settings.txt-file

installs:
ifnotexist, html
filecreatedir, html
fileinstall, index.html, index.html
fileinstall, html\OtherClients.html,html\OtherClients.html
fileinstall, html\Taking your podcasts to another level.html,Taking your podcasts to another level.html
fileinstall, html\What is a Podcast and Why Bother.html, html\What is a Podcast and Why Bother.html
fileinstall, html\Find Podcasts.html, html\Find Podcasts.html
fileinstall, example-podcasts-subscriptions.txt,example-podcasts-subscriptions.txt
fileinstall, podcasts-subscriptions.txt,podcasts-subscriptions.txt

fileinstall, html\ahkpod.ico,html\ahkpod.ico
FileInstall, COPYING.txt,COPYING.txt
FileInstall,TOS.html,TOS.html
fileinstall, html\winlogo.gif,html\winlogo.gif
fileinstall, html\HowToUse.html,html\HowToUse.html
fileinstall, ahkpod.ahk,ahkpod.ahk

ifNotExist settings.txt
{

IniWrite, yes, settings.txt, settings, downloadnewpod
IniWrite, podcasts, settings.txt, settings, downloadpodcast_to
IniWrite, 5, settings.txt, settings, timedelete
;deg
IniWrite, No, settings.txt, settings, DryRun
IniWrite, RunOnExit, settings.txt, settings, RunOnExit
IniWrite, %a_space%, settings.txt, settings, RunOnExitWorkingDir
IniWrite, low, settings.txt, settings, priority
}
IniRead, downloadnewpod ,settings.txt, settings, downloadnewpod
IniRead, downloadpodcast_to ,settings.txt, settings,downloadpodcast_to
IniRead, timedelete ,settings.txt, settings,timedelete
IniRead, DryRun ,settings.txt, settings,DryRun ;deg
IniRead, RunOnExit ,settings.txt, settings,RunOnExit ;deg
IniRead, RunOnExitWorkingDir,settings.txt, settings,RunOnExitWorkingDir
IniRead, priority,settings.txt, settings,priority
filedelete, %a_workingdir%\downloadedthistime.txt
pdir = %usbl%:\%downloadpodcast_to%
FileCreateShortcut, %pdir%,DownloadedCasts\All-MyPodcasts-Directory Shortcut.lnk,%pdir%,MyPodcast Location

inivalidation: ;deg

ifnotexist, %a_workingdir%\xml
filecreatedir, %a_workingdir%\xml
if DryRun=Error
{
IniWrite, No, settings.txt, settings, DryRun
DryRun=Yes
}
if RunOnExit=Error
{
IniWrite, RunOnExit, settings.txt, settings, RunOnExit
RunOnExit=0
}
if RunOnExitWorkingDir=Error
{
IniWrite, %a_space%, settings.txt, settings, RunOnExitWorkingDir
}
if priority=Error
{
IniWrite, low, settings.txt, settings, priority
priority=low
}
process, priority, ahkpod.exe,%priority%

endinivalidation:

trays: ;deg
;Menu, tray, icon, mov.ico, ,
Menu, Tray, Tip, AHKPod!
menu, tray, Nostandard
menu, tray, add,Find Podcasts, getpodcasts
menu, tray, add,Edit Auto Subsciptions,EditSubsciptions
menu, tray, add,Edit Lists of Successful Downloads, listeditor
menu, tray, add, Open Current Xml, openxml
Menu, tray, add
Menu, tray, add, Schedule Run, Schedule
Menu, tray, add, Links of Helper Programs, Helpers
Menu, tray, add, Support, support
;menu, tray, add,AbortDownload , AbortDownload ;not possible
menu, tray, add,Exit , exitmanual
;Menu, Tray, Tip, AHK pod!
ifNotExist DownloadedCasts
{
filecreatedir DownloadedCasts
}

ifNotExist podcasts-subscriptions.txt
{
fileappend, ; %a_tab% BBC World News`n, podcasts-subscriptions.txt
fileappend, http://downloads.bbc.co.uk/podcasts/worldservice/globalnews/rss.xml, podcasts-subscriptions.txt
}
ifNotExist ignoreduds.txt
fileappend, Add any word on any line. If the word is found in url of an mp3`, then that mp3`, or ones like it`, cannot be tagged as a dud`, no matter the httpquery file size. Email author for diagnosis or bug fix.`n,ignoreduds.txt


fileappend, <FDM_Downloads_Info_List>`n, download.xml
setupdone:

IntroDialogs:
menu, tray, enable, Edit Lists of Successful Downloads
gosub, introgui1
sleep, 3000

winwaitclose, List Editor of Downloaded Stuff
winwaitclose, AHKPod: Intro Dialog
winwaitclose, ManualDownloader

/*
msgbox, , Edit podcast subscripton list?, Click 'yes' to continue normally. Click 'no' to edit podcast subscripton list,20 ;deg

ifmsgbox No
run, notepad.exe "%a_workingdir%\podcasts-subscriptions.txt"
else
continue=0
msgbox, 4, Normal or Dry Run, Click yes to run now normally?`n`nElse`,Click "No" to do a Dry Run. Great for first runs and after adding a podcast. This will build the downloaded list up to all possible casts. Just click desired casts with DownloadedCasts Editor`, to download the ones you want.,560 ;deg
*/

winwaitclose, List Editor of Downloaded Stuff
winwaitclose, AHKPod: Intro Dialog
ifmsgbox No
{

DryRun=yes
msgbox,0 , Dry Run to buildup list of possible podcasts.,This will take a while`,depending on number of subscriptions and number of files in list. Let program finish and start again. Be sure after dry run`, to edit the downloaded cast to download the ones you really want.,20
}
else
conti=0

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
starting:

backups:
filecopy, podcasts-subscriptions3.txt,podcasts-subscriptions4.txt,1 ;deg
filecopy, podcasts-subscriptions2.txt,podcasts-subscriptions3.txt,1 ;deg
filecopy, podcasts-subscriptions1.txt,podcasts-subscriptions2.txt,1 ;deg
filecopy, podcasts-subscriptions.txt,podcasts-subscriptions1.txt,1 ;deg

filecopydir, %a_workingdir%\DownloadedCasts3,%a_workingdir%\DownloadedCasts4,1 ;deg
filecopydir, %a_workingdir%\DownloadedCasts2,%a_workingdir%\DownloadedCasts3,1 ;deg
filecopydir, %a_workingdir%\DownloadedCasts1,%a_workingdir%\DownloadedCasts2,1 ;deg
filecopydir, %a_workingdir%\DownloadedCasts,%a_workingdir%\DownloadedCasts1,1 ;deg



menu, tray, disable, Edit Lists of Successful Downloads
fileread, duds,%a_workingdir%\duddownloads.txt
filemove,%a_workingdir%\duddownloads.txt,%a_workingdir%\duddownloads-lastrun.txt,1

; checking podcasts-subscriptions.txt, compares new podcast and download new

ReadingSubscriptions:
Loop, read, podcasts-subscriptions.txt
{
Loop, parse, A_LoopReadLine, `n
{
tempdryrun=0
ifinstring, A_LoopField,; ; lets skip semicolons and nearly blank lines
continue
stringmid, one, A_LoopField,1,1
if one=:
{
tempdryrun=1
stringreplace, LoopField, A_LoopField,:http,http
}
stringlen, alflen,A_LoopField
if alflen<10
continue
if tempdryrun=0
urldownloadtofile, %A_LoopField%, download.dnl
if tempdryrun=1
urldownloadtofile, %LoopField%, download.dnl
currentrss:=A_LoopField
Menu, Tray, Tip, AHKPod! %A_LoopField%
gosub, freshair2

;if freshair=1
; continue
freshair=0

operation = update1
gosub, strip
filecopy, %a_workingdir%\download.dnl, %a_workingdir%\xml\%file%.xml,1

}
}


fileappend, </FDM_Downloads_Info_List>, download.xml
fileread, download, download.xml
if download not contains <url>
{
msgbox,0,, Nothing to download ,12
;gosub exit
}

dating:
; asks for delete old mp3
stringleft, A_Now2, A_Now, 8
stringleft, yy, A_Now2,4
stringright, dd, A_Now2,2
stringmid, mm,A_Now2, 5,2
ym:=(mm-1)/12 ; ym is conversion of month to percent of year. actually ym:=(mm-1)/12 but irrelevant since both filedate and now are adding a month, and so cancel eachother out
yd:=dd/365
py:=ym+yd
Stringmid,py,py,3,26
A_Now2=%yy%.%py%

; actually yy mm dd needs to be translated into percent of year so yy.(ym+yd) ym=mm/12 and yd=dd/30(*1/12) and no of days=nod/365
timedelete:=timedelete/365


{
Loop, %pdir%\*.mp3 , ,1
{
FileGetTime, filenamedate, %A_LoopFileFullPath%, M
;msgbox, date is %filenamedate% on file %A_LoopFileName%
stringleft, filenamedate, filenamedate,8
;msgbox, %filenamedate%

stringleft, yy, filenamedate,4
stringright, dd, filenamedate,2
stringmid, mm,filenamedate, 5,2
ym:=(mm-1)/12
yd:=dd/365
py:=ym+yd
Stringmid,py,py,3,26
filenamedate=%yy%.%py%
date4del:=filenamedate+timedelete
due:=A_Now2 - date4del
;msgbox, filedate is %filenamedate% %yy% %mm% %dd%. days2del is %timedelete% ... now is %A_Now2%.. - dateof del is %date4del% and due is %due%
If ( due > 0)
{
;msgbox, overdue
fileappend, `n%A_LoopFileFullPath%, oldmp3.txt
}
}
}

gosub exit
return

strip:
fileread, info, download.dnl ;;read to get mp3url
stringreplace, info, info, &amp;, %a_space%and%a_space%, all
stringreplace, info, info, <item>, |, all
;needle = Ui)"<link>.*(mp3) ;deg
needle = Ui)"(http://[^[:space:]]*(m4v|mp4|mp3))"

freshair=0

loop, parse, info, |
{

RegExMatch(a_loopfield, "Ui)<description>(.*)</description>" ,description)
RegExMatch(a_loopfield, "Ui)<pubdate>(.*)</pubdate>" ,pubdate)

;RegExMatch(a_loopfield, "U)<title>(.*)</title>)<title%a_space%>(.*)</title>", title)
RegExMatch(a_loopfield, "U)<title(.*)</title>", title)

RegExMatch(a_loopfield, needle, url)
RegExMatch(a_loopfield, "Ui)<link>(.*)</link>|<link >(.*)</link>" , urla) ;deg
;RegExMatch(a_loopfield, "Ui)<link>(.*)</link>" , urla) ;deg
RegExMatch(a_loopfield, "<title>(.*)</title>" , titlea) ;deg
;* msgbox,url
gosub, fix
if a_index = 1
{
file2 := regexreplace(title1,"i)[^a-z0-9[:space:])(]")
file := regexreplace(file2," ", "_")
fileread, compare, DownloadedCasts\%file%.txt
continue
}
title1 := regexreplace(title1,"i)[^a-z0-9[:space:]]")
gosub, date
description1 := regexreplace(description1,"U)(\t|\n|\r|<.*>|\&..;|\[.*]|\||]\>|)")
stringleft, description1, description1, 150
url=
urla=
titlea=;deg
gosub, %operation%
}
return


fix:
Loop
{
regexmatch(url1, "`%(..)",ascii)
StringReplace, url1, url1, `%%ascii1%, % Chr("0x" . ascii1), All

regexmatch(urla1, "`%(..)",ascii) ;deg

StringReplace, urla1, urla1, `%%ascii1%, % Chr("0x" . ascii1), All ;deg
if errorlevel <> 0
break
}
return


update1:
comparing4append:

fileread, compare, DownloadedCasts\%file%.txt


RegExMatch(compare, url1 ,found)
if found <>
goto, forgetit
RegExMatch(compare, urla1 ,found)
if found <>
goto, forgetit

RegExMatch(compare, title1 ,found)
if found =
{
fileappend, %date%®%title1%®%url1%®%description1%`n, DownloadedCasts\%file%.txt
fileappend, <download>`n<url>%url1%</url>`n<group>Video\%name%</group>`n</download>`n, download.xml
saveDir = %usbl%:\Podcasts\00%file%
fileName = %date%.mp3
ifNotExist %savedir%
filecreatedir %savedir%

sleep 50
if downloadnewpod contains yes
{
gosub downloadpodcast
}


sleep 100
ifexist, %a_workingdir%\id3.exe ;deg
run id3.exe -2 -t "%date%" -l "00%file%" %title1%-%date%-%savedir2%.mp3,,hide
;run id3 -2 -t "%date%" -l "00%file%" %savedir%\%date%.mp3,,hide

}
forgetit:
forget=1
return
freshair=0

;/////////////////////////////////end regular
endregular:


date:
d = 1
loop, parse, pubdate, %a_space%
{
if a_loopfield =
continue
p%d% = %a_loopfield%
d += 1
}
loop, 12
{
month = %a_index%
if StrLen(month)=1
month = 0%month%
formattime, out, 2008%month%01, MMM
if out = %p3%
{
if a_index < 10
p3 = 0%a_index%
else
p3 = %a_index%
}
p5gammal := regexreplace(p5,":", "")
stringleft, p5new, p5gammal,4
}
if StrLen(p2) =1
p2 = 0%p2%
date = %p4%%p3%%p2%@%p5new%
return

exit:

autoexit=0
exitmanual:
gui,destroy
menu, tray, enable, Edit Lists of Successful Downloads
;msgbox,percent is %percent%
IniWrite, No, settings.txt, settings, DryRun
fileread, oldmp3, oldmp3.txt
MsgBox=no

if oldmp3 contains mp3
{
msgbox, 4,, Do you want to delete the following mp3-files? %oldmp3%,12
IfMsgBox, Yes
{
msgbox, 0,Delete the old., You choose Yes!,You choose Yes! Deleting.
Loop, read, oldmp3.txt
{
Filedelete, %A_LoopReadLine%
}
}
}

filedelete download.xml
filedelete download.dnl
filedelete oldmp3.txt
fileread, dtt,downloadedthistime.txt ;deg
msgbox,0, Done these, I downloaded: `n%dtt%,25 ;deg
;loop, DownloadedCasts\*.txt
; run, notepad.exe "%A_LoopFileName%"
ifexist, %a_workingdir%\duddownloads.txt
{
run, notepad.exe "%a_workingdir%\duddownloads.txt"
}
if DryRun=yes
{
msgbox,0, Instuctions, To download desired podcasts. Delete line in list of downloaded mp3s`, found in DownloadedCasts directory.,25
gosub, listeditor

}

pau:
sleep,5000
DetectHiddenWindows,off
winwaitclose, List Editor of Downloaded Stuff
winwaitclose,ManualDownloader
winwaitclose, Importing! Please stand by.

nowin:

;msgbox,0,,Click ok to exit program.,1200
if autoexit<>0
{
fileread, list, DownloadedCasts\%file%.txt
filedelete, %a_workingdir%\DownloadedCasts\%file%.txt
stringreplace, list, list, %date%®%title1%®%url1%®%description1%,%a_space%,1
fileappend, %list%, DownloadedCasts\%file%.txt
; msgbox, autoexiting
}

ifnotequal,RunOnExit,0 ;deg
{
ifexist, %RunOnExit%
run, %RunOnExit%,%RunOnExitWorkingDir% ;deg
}
exitapp
return

downloadpodcast:
savedir2:=savedir ;deg
savedir2 := regexreplace(savedir2,"i)[^a-z0-9[:space:]]") ;deg
stringreplace,savedir2,savedir2,JPodcasts00, ;deg
;filenamedeg = %savedir2%-%fileName%-%date%.mp3 ;deg
;filenamedeg = %savedir2%-%title1%-%fileName% ;deg
;;stringmid,savedir3,savedir2,1,16
;;filenamedeg = %savedir3%-%title1%-%fileName% ;deg

filenamedeg = %title1%-%date%-%savedir2%.mp3 ;deg

if tempdryrun=1
goto, skipdown
if DryRun=no
Progress, X0 Y63 h75 w430 A M T min,, ,%saveDir%\%filenamedeg% , bold ;deg %filename
winminimize,\00
SetTimer, uProgress, 150
totalFileSize := HttpQueryInfo(url1, 5)
totalFileSizea=0
ifnotinstring, url1, http
totalFileSizea := HttpQueryInfo(urla1, 5) ;deg

winminimize,\00
;&
fileName=title1

ifnotequal, DryRun, yes ;deg
{
; msgbox, %filenamedeg%
UrlDownloadToFile, %url1%, %saveDir%\%filenamedeg%
ifnotinstring, url1, http
UrlDownloadToFile, %urla1%, %saveDir%\%filenamedeg% ;deg
}

AbortDownload:

ad:

;below;historyzine will not return httpquery,

sleep,100 ;npr freshair xml lists links to stories not mp3s (which are javascript embedded in story.)
FileGetSize, fs, %saveDir%\%filenamedeg% ,K
if fs<90
filedelete,%saveDir%\%filenamedeg%

if fs>.3 ; test for got some file but no file size
{
if totalFileSizeall=
{
goto, skipdeadisptest

}
}

deadisptest:
if percent<.7
a=0
if a<.01
{
skipdud=0

if DryRun=Yes
goto, endduds
duds:
Loop, read,%a_workingdir%\ignoreduds.txt
{
ifinstring,url1,%A_LoopReadLine%
skipdud=1
;msgbox, skipdud %skipdud% . url1 is %url1% and A_LoopReadLine %A_LoopReadLine%
}
;msgbox,Dud!!`n`npercent is %percent% a=%a% b=%b% percent is %percent%..tfsa %totalFileSizeall%of %saveDir%\%filenamedeg%`, and filesize is %fs%`nand url1 is %url1%

if skipdud=0
{
fileappend, %date%®%title1%®%url1%®%description1%%a_tab%%a_tab%percent is %percent% a=%a% b=%b% percent is %percent%..tfsa %totalFileSizeall%`, and filesize is %fs%`n, duddownloads.txt
delthedud:
fileread, list, DownloadedCasts\%file%.txt
filemove, %a_workingdir%\DownloadedCasts\%file%.txt,%a_workingdir%\DownloadedCasts\%file%.old,1
stringreplace, list, list, %date%®%title1%®%url1%®%description1%,%a_space%,1
fileappend, %list%, DownloadedCasts\%file%.txt
}
endduds:
yy=9
}
skipdeadisptest:
bb=9
skipdown:
fileappend, %saveDir%\%filenamedeg%`n, downloadedthistime.txt ;deg
SetTimer, uProgress, off
Progress, Off
filegetSize,sizefil,%saveDir%\%fileName%
if(sizefil = 1638)
goto,nofile
; msgbox,Download finished
return

nofile: ; When the file is not found, it creates a file of 1638 bytes
{
ifnotequal, DryRun, yes ;deg
filedelete,%saveDir%\%fileName%
msgbox,File not found on the site.
}
return

uProgress:
FileGetSize, fs, %saveDir%\%fileNamedeg% ,K
totalFileSizeall :=totalFileSize+totalFileSizea ;deg

a := Floor(fs/totalFileSizeall * 100*1024) ;deg
b := Floor(fs/totalFileSizeall * 10000*1024)/100 ;deg
c := Floor(fs/totalFileSizea * 100*1024) ;deg
d := Floor(fs/totalFileSizea * 10000*1024)/100 ;deg
SetFormat, float, 0.2
b += 0
d += 0 ;deg
TFileSize := totalFileSize / 1024
Tfs=%TFileSize%
TFileSizea := totalFileSizea / 1024 ;deg
Tfsa=%TFileSizea% ;deg
e := a + c
f := b + d
Tfsall := tfs + Tfsa
percent := fs/Tfsall
if DryRun=no
Progress,%a%,%b%`% downloaded: %fs% Kb. of %Tfsall% Kb. ;deg
return

HttpQueryInfo(URL, QueryInfoFlag=21, Proxy="", ProxyBypass="") {
hModule := DllCall("LoadLibrary", "str", "wininet.dll")
If (Proxy != "")
AccessType=3
Else
AccessType=1
io_hInternet := DllCall("wininet\InternetOpenA"
, "str", "" ;lpszAgent
, "uint", AccessType
, "str", Proxy
, "str", ProxyBypass
, "uint", 0) ;dwFlags
If (ErrorLevel != 0 or io_hInternet = 0) {
DllCall("FreeLibrary", "uint", hModule)
return, -1
}
iou_hInternet := DllCall("wininet\InternetOpenUrlA"
, "uint", io_hInternet
, "str", url
, "str", "" ;lpszHeaders
, "uint", 0 ;dwHeadersLength
, "uint", 0x80000000 ;dwFlags: INTERNET_FLAG_RELOAD = 0x80000000 // retrieve the original item
, "uint", 0) ;dwContext
If (ErrorLevel != 0 or iou_hInternet = 0) {
DllCall("FreeLibrary", "uint", hModule)
return, -1
}
VarSetCapacity(buffer, 1024, 0)
VarSetCapacity(buffer_len, 4, 0)
Loop, 5
{
hqi := DllCall("wininet\HttpQueryInfoA"
, "uint", iou_hInternet
, "uint", QueryInfoFlag ;dwInfoLevel
, "uint", &buffer
, "uint", &buffer_len
, "uint", 0) ;lpdwIndex
If (hqi = 1) {
hqi=success
break
}
}
IfNotEqual, hqi, success, SetEnv, res, timeout
If (hqi = "success") {
p := &buffer
Loop
{
l := DllCall("lstrlen", "UInt", p)
VarSetCapacity(tmp_var, l+1, 0)
DllCall("lstrcpy", "Str", tmp_var, "UInt", p)
p += l + 1
res := res . "`n" . tmp_var
If (*p = 0)
Break
}
StringTrimLeft, res, res, 1
}
DllCall("wininet\InternetCloseHandle", "uint", iou_hInternet)
DllCall("wininet\InternetCloseHandle", "uint", io_hInternet)
DllCall("FreeLibrary", "uint", hModule)
return, res
}
return
;;;;;;;;;;;;;;;;;;;;;;;
EditSubsciptions:
run, notepad.exe "%a_workingdir%\podcasts-subscriptions.txt"
return

EditLists:
run, %a_workingdir%\DownloadedCasts
return

getpodcasts:
run, http://www.podcastalley.com/redirect.php?pod_id=14978
run, http://www.podbean.com/
run, http://www.google.com/search?hl=en&rlz=1C1GGLS_enUS329US329&q=audio+podcast+subscribe+&aq=f&oq=&aqi=
run, http://www.findpodcasts.com/popular.html
run, http://www.npr.org/rss/podcast/podcast_directory.php?type=title&value=all
run, http://podcastpickle.com/
run, %a_workingdir%\html\Find Podcasts.htm


return

helpers:
run, http://akronedge.info/wintersoft/mp3squisher/index.html
run, http://bitsum.com
run, http://autohotkey.com
return

support:
run, mailto:degarb@gmail.com
run, http://www.autohotkey.com/forum/viewtopic.php?p=324767#324767
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
openxml:
ifinstring, currentrss,http
run, %currentrss%
return
;;;;;;;;;;;;;;;;;;;;;;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


freshair2:
freshair:
fileread,downloadfa,%a_workingdir%\download.dnl


if downloadfa contains mp4,mp3,aac,mpg
{
goto, skipfreshair
}

freshair=1

stringreplace,podtitfa,downloadfa,title>,¬ ,all
;msgbox, %podtitfa%

loop,parse,podtitfa,¬
{

if a_index=2
{
title=%a_loopfield%
stringreplace,title,title,<title>,
stringreplace,title,title,</title>,
stringreplace,title,title,/,
stringreplace,title,title,^,
stringreplace,title,title,$,
stringreplace,title,title,`,,
stringreplace,title,title,:,
stringreplace,title,title,/,
stringreplace,title,title,',
stringreplace,title,title,",
stringreplace,title,title,!,
stringreplace,title,title,),
stringreplace,title,title,(,
stringreplace,title,title,;,
stringreplace,title,title,\,
stringreplace,title,title,<,
stringreplace,title,title,>,

titl=%title%
file=%title%

}
} ;got freshair name

stringreplace,outfa,downloadfa,<item>,¬ ,all

loop,parse,outfa,¬
{
RegExMatch(a_loopfield, "U)<title(.*)</title>", title)

ifinstring, title, title
{
stringreplace,title,title,<title>,
stringreplace,title,title,</title>,
stringreplace,title,title,/,
stringreplace,title,title,`,,
stringreplace,title,title,:,
stringreplace,title,title,/,
stringreplace,title,title,',
stringreplace,title,title,",
stringreplace,title,title,!,
stringreplace,title,title,),
stringreplace,title,title,(,
stringreplace,title,title,;,
stringreplace,title,title,\,
;msgbox, my %title% >%pubdate%> %description%
titl=%title%
}
RegExMatch(a_loopfield, "Ui)<link>(.*)</link>" ,linkfa)
listfa=%listfa%%linkfa1%`n
}

loop,parse,listfa,`n
{ ;parselist
if a_index=1
continue

if a_loopfield contains mp4,mp3,aac,mpg
{
;msgbox, trap2: OOps contains mp3
break
}
;msgbox, %a_loopfield% downloadingline 28
urldownloadtofile,%a_loopfield%,downloadfa.dnl ;;;;;;;;;;;;;;;;;;;;;;;;get sub xml
fileread,downloadfa,downloadfa.dnl
stringreplace,downloadfa,downloadfa,href=,¿,all
loop,parse,downloadfa,¿ ; final parse
{
RegExMatch(a_loopfield, "Ui)<description>(.*)</description>" ,description)
stringreplace,description,description,<description>,
stringreplace,description,description,</description>,

RegExMatch(a_loopfield, "Ui)<pubdate>(.*)</pubdate>" ,pubdate)
stringreplace,pubdate,pubdate,<pubdate>,
stringreplace,pubdate,pubdate,</pubdate>,

;RegExMatch(a_loopfield, "U)<title>(.*)</title>)<title%a_space%>(.*)</title>", title)
RegExMatch(a_loopfield, "U)<title(.*)</title>", title)

ifinstring, title, title
{
stringreplace,title,title,<title>,
stringreplace,title,title,</title>,
stringreplace,title,title,/,
stringreplace,title,title,`,,
stringreplace,title,title,:,
stringreplace,title,title,/,
stringreplace,title,title,',
stringreplace,title,title,",
stringreplace,title,title,!,
stringreplace,title,title,),
stringreplace,title,title,(,
stringreplace,title,title,;,
stringreplace,title,title,\,
titl=%title%
}
;>>>>>>>>>>>>


if a_loopfield contains mp3
{
RegExMatch(a_loopfield,"Ui).(.*)\.mp3",linkfa)
url1=%linkfa%
comparing:
fileread, compare, DownloadedCasts\%file%.txt
RegExMatch(compare, linkfa ,found)
if found =
{
;msgbox, sha not ther
fileappend, %date%®%titl%®%url1%®%description%`n, DownloadedCasts\%file%.txt
; fileappend, <download>`n<url>%url1%</url>`n<group>Video\%name%</group>`n</download>`n, download.xml
saveDir = %usbl%:\Podcasts\00%file%
ifNotExist %savedir%
filecreatedir %savedir%
;msgbox, notdone:mp3 matched %linkfa1%`n: %title%`n%titl%`n%file%

if dryrun<>yes
{
;msgbox, mp3 matched %linkfa1%`n: %title%`n%titl%`n%file%
filenamedeg=%titl%.mp3
Progress, X0 Y63 h75 w430 A M T min,, ,%saveDir%\%filenamedeg% , bold ;deg %filename
winminimize,\00
SetTimer, uProgress, 150
totalFileSize := HttpQueryInfo(url1, 5)
totalFileSizea=0
ifnotinstring, url1, http
totalFileSizea := HttpQueryInfo(urla1, 5) ;deg

winminimize,\00

titl:=substr(titl,1,28)
StringReplace, titl, titl, `%%ascii1%, % Chr("0x" . ascii1)
StringReplace, titl, titl, :,
stringreplace,titl,titl,/,
stringreplace,titl,titl,^,
stringreplace,titl,titl,$,
stringreplace,titl,titl,`,,
stringreplace,titl,titl,:,
stringreplace,titl,titl,/,
stringreplace,titl,titl,',
stringreplace,titl,titl,",
stringreplace,titl,titl,!,
stringreplace,titl,titl,),
stringreplace,titl,titl,(,
stringreplace,titl,titl,;,
stringreplace,titl,titl,\,
stringreplace,titl,titl,<,
stringreplace,titl,titl,>,

;fileappend,UrlDownloadToFile`, %linkfa1%.mp3`, %saveDir%\%titl%.mp3, problemurl.ahk

;
;clipboard= UrlDownloadToFile`, %linkfa1%.mp3`, %saveDir%\%titl%.mp3
;msgbox, %saveDir%-fa
ifnotexist, %saveDir%-fa
filecreatedir, %saveDir%-fa

UrlDownloadToFile, %linkfa1%.mp3, %saveDir%-fa\%titl%.mp3
sleep, 100
if fs<90
filedelete,%saveDir%\%filenamedeg%
fileappend, %saveDir%\%filenamedeg%`n, downloadedthistime.txt ;deg


;gosub, freshairfilesizecheck
} ;end dryrun...
} ;end found
skiper:
;msgbox, skipper :%found%
kjldf=1 ;
} ;endloop,parse,downloadfa
} ;?
} ;end parselist
;goto regular or continue


skipfreshair:
return

;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;
;;;;;;;;;;;;;;

freshairfilesizecheck:
FileGetSize, fs, %saveDir%\%filenamedeg% ,K
if fs<90
filedelete,%saveDir%\%filenamedeg%

if fs>.3 ; test for got some file but no file size
{
if totalFileSizeall=
{
goto, skipdeadisptestfa

}
}

;deadisptest
if percent<.7
a=0
if a<.01
skipdud=0
if DryRun=Yes
goto, enddudsfa

if skipdud=0
{
fileappend, %date%®%title1%®%url1%®%description1%%a_tab%%a_tab%percent is %percent% a=%a% b=%b% percent is %percent%..tfsa %totalFileSizeall%`, and filesize is %fs%`n, duddownloads.txt
delthedudfa:
fileread, list, DownloadedCasts\%file%.txt
filemove, %a_workingdir%\DownloadedCasts\%file%.txt,%a_workingdir%\DownloadedCasts\%file%.old,1
stringreplace, list, list, %date%®%title1%®%url1%®%description1%,%a_space%,1
fileappend, %list%, DownloadedCasts\%file%.txt
}
enddudsfa:
yy=9

skipdeadisptestfa:
bb=9

fileappend, %saveDir%\%filenamedeg%`n, downloadedthistime.txt ;deg

return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


listeditor:

#singleinstance, force
settitlematchmode,2
Gui, Font, Bold
Gui, Font, s14
Gui, Font, underline
gui, add, text,h20 x40 S52 ,List Editor for Downloaded Podcasts:
Gui, Font, s7
gui,add,button,x650 y10 gplist h7,Refresh Episode Listings

Gui, Font, normal
gui, add, listbox,vplist gplist sort w250 h300 x10
gui,add,listview,w550 h300 vpcast gpcasts altsubmit x+10,Episode

Gui, Font, Bold
Gui, Font, underline
gui, add, text,h30 x10 , Click on Left to select a subscription.%a_space%%a_space%%a_space%%a_space%%a_space%%a_tab%%a_tab%%a_space%%a_space%%a_space%& Double-Click on right box to delete items in your "Downloaded List", in order to download the item!
Gui, Font, s6
Gui, Font,
;gui, add, text,,
gui,add,edit,veditle w500 x10
gui,add,button,gadd,Add a new podcast or Edit subscription list ;need
Gui, Font, normal
;gui,add,button,gpopulate h7,Refresh Subscription List
gui,add,button,gstartdry h7,Start Another Dry Run
gui,add,button,gopenlists h7,Open Downloaded list directory
Gui, Font, Bold
Gui, Font, underline
gui,add,button,gstartdown w800,Start Downloading


gui, show,, List Editor of Downloaded Stuff

Populateautolisteditor:
GuiControl,, MainEdit
total=
guicontrol,,plist,|
Loop, DownloadedCasts\*.txt,,
{
stringreplace,file,a_loopfilename,.ini
total=%total%%file%|
}
GuiControl,,plist,%total%
return

plist: ;Left menu
gui,listview,pcast
lv_delete()
guicontrol,,pcasts,|
gui,submit,nohide

guicontrol,,pcast,|


;msgbox,%plist% : %Rowtext%
Loop, Read, %a_workingdir%\DownloadedCasts\%plist%
{
LV_Add("", A_LoopReadLine)
}
GuiControl,,pcast,%total%
return


pcasts: ; right menu
if a_guievent = Doubleclick
{
LV_GetText(RowText, A_EventInfo) ; Get the text from the row's first field.
Tooltip, Will download next run! Deleting "listed as downloaded": "%RowText%"
SetTimer, RemoveToolTip, 600

;LV_Delete()
fileread, chopthis,%a_workingdir%\DownloadedCasts\%plist%
stringreplace,chopthis,chopthis,%RowText%,
stringreplace,chopthis,chopthis,`r`n`r`n`r`n,`r`n,1
stringreplace,chopthis,chopthis,`r`n`r`n,`r`n,1
chopthis := RegExReplace(chopthis,"\R+", "`r`n")
;Loop
;{
; StringReplace, chopthis, chopthis, `r`n`r`n, `r`n, UseErrorLevel
; if ErrorLevel = 0 ; No more replacements needed.
; break
;}
;msgbox, %chopthis%
filemove, %a_workingdir%\DownloadedCasts\%plist%,%a_workingdir%\DownloadedCasts\%plist%.old,1
fileappend,%chopthis%,%a_workingdir%\DownloadedCasts\%plist%
}
;Loop, Read, %a_workingdir%\DownloadedCasts\%plist%
;
;{
; LV_Add("", A_LoopReadLine)
;}
;GuiControl,,pcast,%total%

return

Add:
operation=newcast
gui, submit, nohide
fileappend, `n%editle%,%a_workingdir%\podcasts-subscriptions.txt
ifwinnotexist, podcast-subscriptions
run, notepad.exe %a_workingdir%\podcasts-subscriptions.txt
sleep, 6000
msgbox,0,Adding subscriptions, Adding subscriptions will not show up in left panel until after a dry run.,12
WinMaximize, Adding subscriptions
return
return

startdry:
gui,destroy
dryrun=yes
goto, starting
return

startdown:
gui,destroy
dryrun=no
goto, starting
return

openlists:
run, %a_workingdir%\DownloadedCasts
return

RemoveToolTip:
SetTimer, RemoveToolTip, Off
ToolTip
return

guiclose1:
gui, destroy
return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

introgui1:
gui,add,button,gExitManual x1060 y1,x
Gui, Add, picture, x0 y0 w260 h250, %a_workingdir%\html\ahkpod.ico
Gui, Font, Bold
Gui, Font, s14
/*
gui, add, text,y5 S52 gEditSubs,Edit My Automatic Subscriptions
Gui, Font, s7
gui,add,button, gEditSubs h7,Edit My Auto Subscriptions
gui, add, text,

*/

;gui, add, text, S52 gGoListEditor,DownloadedCasts List Editor
;Gui, Font, s7
; gui,add,button,gGoListEditor h7,Edit My Downloaded Lists with "DownloadedCasts List Editor""
;gui, add, text,

;Gui, Font, bold
Gui, Font, s6
gui,add,button,x260 y20 gimportopml,Import Opml


Gui, Font, Bold
Gui, Font, s14
gui, add, text, S52 x260 y60 gManualDownloader, Manage Subscriptions: "ManualOnly" List and "Normal, Auto-Subscription" List
Gui, Font, s7
;gui, add, text,ManualDownloader,(This is a separate list of subscriptions that are never auto downloaded with normal run.`n Rather, the individual episode you mark for downloading, then click download marked.`n %a_tab%This is ideal for overly prolific podcasters.)
gui,add,button,gManualDownloader h7,Manage Subscriptions: Manual and Auto
Gui, Font, s7
gui, add, text

/*
Gui, Font, Bold
Gui, Font, s14
gui, add, text, S52 gDoDry, Do a List Building Run.
Gui, Font, s7
gui, add, text,gDoDry,(Great for first runs and after adding a podcast to regular/auto subscription list. `nThis will build the "Automatic Downloaded List" up to all possible casts. `n Just click desired episodes listed in "DownloadedCasts List Editor", to download the ones you want.)
gui,add,button,gDoDry h7,Do a Dry/List-Builder Run
gui, add, text,
Gui, Font, Bold
Gui, Font, s14
*/

Gui, Font, Bold
Gui, Font, s14, cred
gui, add, text, S52 gGo w800,Go Normal, Auto-Run!
Gui, Font, underline
Gui, Font, s26
gui,add,button,Default gGo h7 x530 y132 w170 h70 cRed,Go!
Gui, Font, normal
Gui, Font, bold
Gui, Font, s7
gui, add, text, x500 y240,(This dialog will time out in 3 minutes to do a normal run, for auto-subscriptions.)



SetTimer, go, 200000
gui, show,, AHKPod: Intro Dialog
return

go:
gui, submit
gui, destroy
return

DoDry:
dryrun=yes
gui, submit
gui, destroy
return

GoListEditor:
gui, submit
gui, destroy
goto, listeditor
return


EditSubs:
ifwinnotexist, podcast-subscriptions
run, notepad.exe %a_workingdir%\podcasts-subscriptions.txt
;goto, ManualDownloader
return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::::::
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::::::
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::::::
ManualDownloader:
msgbox,0,Explanation, There are two subscription lists: The "manual only" download list; and the "Automatic Subscription list"`n`n You can add subscriptions directly to the automatic list`, or add to manual list`,`n%a_tab% download episodes you want`,`n %a_tab%then`, right click and add to automatic list. ,12
menu, tray, disable, Edit Lists of Successful Downloads
ManualDownloaderref:

SetTimer, go,off
gui,destroy
Gui, add, tab, vMyTab h280 w380 cNavy,ManualSubscription List Editor|Automatic Subscription List Editor
Gui, Tab,ManualSubscription List Editor
gui, add, listbox,vplist1 gplist1 sort w300 h400
gui,add,listview,w800 h400 vpcast1 gpcasts1 altsubmit x+10,Episode Name|Downloaded|date|URL
gui,add,edit,vedit w500 x10
gui,add,button,gAdd1 x520 y435,Add Subscription!
;gui,add,button,gupdate2 y437 x10,Update selected podcast
;gui,add,button,gAdd1 y437,Add a New Podcast Subscription
;gui,add,button,gDelManSub y437 x300, Delete Selected Subscription!
gui,add,button,ggo1 x10 y467,Mark selected files for download
gui,add, button,gdownload1 y467 x300,Download marked files

;gui,add,button,gEraseAllManual x10,Erase all Manual Podcast Subscriptions!
gui,add,button,gGuiClose x800 y467, Close and move on.

Menu, MyRightMenu, Add, Add this subscription to Normal-Automatic Subscriptions.,addauto ; ScanDisk Right Click Info
Menu, MyRightMenu, Add, Delete this subscription from manual subscription list., DelManSub
Menu, MyRightMenu, Add,Update selected podcast,update2


tooltip, Right-click context menu available., 100, 150
sleep, 1000
SetTimer, RemoveToolTip, Off
ToolTip

ifnotexist, urlz.ulz
{
msgbox, 4, Choose, Do you want to look for the backup for subscriptions?
ifmsgbox yes
{
ifexist, urlz-last.ulz
filecopy, urlz-last.ulz, urlz.ulz
filecopydir, %a_workingdir%\casts-backup, %a_workingdir%\casts
}
else
msgbox, you chose no
}

Populate1:
total=
guicontrol,,plist1,|
loop, casts\*.ini
{
stringreplace,file,a_loopfilename,.ini
total=%total%%file%|
}
;msgbox, %total%
GuiControl,,plist1,%total%
;return

Gui, Tab, Automatic Subscription List Editor
;msgbox, Automatic Subscription List Editor
Gui, Font, Bold
Gui, Font, s14
Gui, Font, underline
gui, add, text,h20 x40 y27 S52 ,List Editor for Automatic Downloaded Podcasts:
;testing here
Gui, Font, s7
gui,add,button,x650 y27 gplistaa h7,Refresh Episode Listings

Gui, Font, normal
gui, add, listbox,vplista gplista sort w250 h300 x10 y50
gui,add,listview,w550 h300 vpcasta gpcastsa altsubmit x+10,Episode

Gui, Font, Bold
Gui, Font, underline
gui, add, text,h30 x10 y370 , Click on Left to select a subscription.%a_space%%a_space%%a_space%%a_space%%a_space%%a_tab%%a_tab%%a_space%%a_space%%a_space%& Double-Click on right box to delete items in your "Downloaded List", in order to download the item!
Gui, Font, s6
Gui, Font,
;gui, add, text,,
gui,add,edit,vedit0 w500 x10 y385
gui,add,button,gadd0 x530 y385,Add a new podcast or Edit subscription list ;need
Gui, Font, normal
Gui, Font, cNavy
;gui,add,button,gpopulate h7,Refresh Subscription List
gui,add,button,gstartdry x10 h7 y440 cNavy,Start Another Dry Run to Catchup all Auto-Subscriptions' Episode Lists!
gui, add, text,
gui, add, text,gDoDry x10 h7 ,A Dry Run is great after adding a podcast to regular/auto subscription list. `nThis will build the "Automatic Downloaded List" up to all possible casts. `n After a dry run, just double click desired episodes in right pane here, to download the ones you want.)`n`nIt is unnecessary if you add a subscription to manual list first, mark and download episodes you want, then right click a selected manual podcast, and add to auto list.

Gui, Font, Bold
Gui, Font, underline

gui,add,button,gstartdown w600 y440 x450 cNavy,Start Downloading New Auto Subscriptions!
Gui, Font, bold
Gui, Font, underline
Gui, Font, s5
gui,add,button,gSchedule x10,Scheduler

;Menu, MyRightMenu2, Add, Click here to delete this subscription from auto subscription list., DelAutoSub
Menu, GuiContextMenu, Add, Click here to delete this subscription from auto subscription list., DelAutoSub
Menu, GuiContextMenu, Add, Click here to Open Downloaded list directory., openlists
Menu, GuiContextMenu, Add, Click here to Edit Raw Auto-Subscription List., editsubs

;gui, show,, List Editor of Downloaded Stuff

Populate:
GuiControl,, MainEdit
total=
guicontrol,,plist,|
Loop, DownloadedCasts\*.txt,,
{
stringreplace,file,a_loopfilename,.ini
total=%total%%file%|
}
GuiControl,,plist,%total%
gui, show,, ManualDownloader
; need to add populate0

Populateautolisteditor2:
GuiControl,, MainEdita
total=
guicontrol,,plista,|
Loop, DownloadedCasts\*.txt,,
{
stringreplace,filea,a_loopfilename,.ini
total=%total%%filea%|
}
GuiControl,,plista,%total%

return

;;;;;;;;;;;;;;;adding unique

Add0:
operation=newcast
gui, submit, nohide
fileappend, `n%edit0%,%a_workingdir%\podcasts-subscriptions.txt
ifwinnotexist, podcast-subscriptions
run, notepad.exe %a_workingdir%\podcasts-subscriptions.txt
sleep, 6000
msgbox,0,Adding subscriptions, Adding subscriptions via this box will not show up in left panel until after a dry run.`nYou may desire to add in Manual tab`, then right click it to add to Automatic Subscription list.,12
WinMaximize, Adding subscriptions
return

plistaa:
gosub, populate
plista: ;Left menu
;msgbox, %A_GuiEvent%
if A_GuiControl = plista
;if A_GuiEvent = RightClick
{
;msgbox, %A_GuiEvent%%A_EventInfo%
castdel:=plista
LV_GetText(RowText, A_EventInfo)
; msgbox, %RowText%:%plista%:%castdel%
GuiX:=A_GuiX+250
GuiY:=A_GuiY+250
Menu,GuiContextMenu,Show, %GuiX%,%GuiY%
}
;msgbox,%A_GuiControl%
gui,listview,pcasta
lv_delete()
guicontrol,,pcastsa,|
gui,submit,nohide

guicontrol,,pcasta,|


;msgbox,%plist% : %Rowtext%
Loop, Read, %a_workingdir%\DownloadedCasts\%plista%
{
LV_Add("", A_LoopReadLine)
}
GuiControl,,pcasta,%total%
return

pcastsa:
; right menu
if a_guievent = Doubleclick
{
LV_GetText(RowText, A_EventInfo) ; Get the text from the row's first field.
Tooltip, Will download next run! Deleting "listed as downloaded": "%RowText%"
SetTimer, RemoveToolTip, 600

;LV_Delete()
fileread, chopthis,%a_workingdir%\DownloadedCasts\%plista%
stringreplace,chopthis,chopthis,%RowText%,
stringreplace,chopthis,chopthis,`r`n`r`n`r`n,`r`n,1
stringreplace,chopthis,chopthis,`r`n`r`n,`r`n,1
chopthis := RegExReplace(chopthis,"\R+", "`r`n")
;Loop
;{
; StringReplace, chopthis, chopthis, `r`n`r`n, `r`n, UseErrorLevel
; if ErrorLevel = 0 ; No more replacements needed.
; break
;}
;msgbox, %chopthis%
filemove, %a_workingdir%\DownloadedCasts\%plista%,%a_workingdir%\DownloadedCasts\%plista%.old,1
fileappend,%chopthis%,%a_workingdir%\DownloadedCasts\%plista%
}
;Loop, Read, %a_workingdir%\DownloadedCasts\%plist%
;
;{
; LV_Add("", A_LoopReadLine)
;}
;GuiControl,,pcast,%total%

return
;;;;;;;;;;;;;;;;;adding unique


plist1:
LV_GetText(RowText, A_EventInfo)
;msgbox, %plist1%: %RowText%
fileread,download,download.ini
gui,listview,pcast1
lv_delete()
guicontrol,,pcasts1,|
gui,submit,nohide
loop,read,casts\%plist1%.ini
{
if a_loopreadline contains title=
{
stringsplit,out,a_loopreadline,=
iniread,date1,casts\%plist1%.ini,%out2%,date1,error
iniread,url,casts\%plist1%.ini,%out2%,url1,error
splitpath,url,file
;;;;;changing cause need to mark as downloaded even after transcoding and deleting ifexist %plist1%\%file%
fileread, manualdownloaded,manualdownloaded.txt
ifinstring, manualdownloaded, %file%
c=Downloaded
else if download contains %url%
c=Marked to download
else
c=Not Downloaded
lv_add("",out2,c,date1,url)
}
}
lv_modifycol()
lv_modifycol(3,"SortDesc")
return

pcasts1:
if a_guievent = doubleclick
{
LV_Gettext(file,LV_GetNext(0),4)
splitpath,file,file
loop,%file%,1,1
run %a_loopfilefullpath%
}
return

go1:
gui,submit,nohide
loop,
{
RowNumber := LV_GetNext(RowNumber)
if not rownumber
break
loop,4
lv_gettext(a%a_index%,rownumber,a_index)
if a2 = downloaded
continue
lv_modify(rownumber,"",a1,"Marked for Download",a3,a4)
splitpath,a4,file
iniwrite,%plist1%\%a4%,download.ini,url,%a1%
loop,
{
iniread,out,download.ini,download,%a_index%,error
if out=error
{
iniwrite,%a1%,download.ini,download,%a_index%
break
}
}
}
lv_modifycol(2)
return
Add1:
operation=newcast1
gui, submit, nohide
filedelete,download.dnl
urldownloadtofile, %edit%, download.dnl


gosub, strip10
iniwrite,%edit%,urlz.ulz,Sites,%file%
;gosub, populate1
total=
guicontrol,,plist1,|
loop, casts\*.ini
{
stringreplace,file,a_loopfilename,.ini
total=%total%%file%|
}
;msgbox, %total%
GuiControl,,plist1,%total%

guicontrol,,edit,
filecopy,%a_workingdir%\urlz.ulz,%a_workingdir%\urlz-last.ulz,1
filecopydir, %a_workingdir%\casts, %a_workingdir%\casts-backup
;msgbox, added
;goto,ManualDownloader

return

strip1:
fileread, info, download.dnl
stringreplace, info, info, &amp;, %a_space%and%a_space%, all
stringreplace, info, info, <item>, ®, all
needle = Ui)"(http://[^[:space:]]*(m4v|mp4|mp3))"
loop, parse, info, ®
{
search=%a_loopfield%
RegExMatch(a_loopfield, "Ui)<description>(.*)</description>" ,description)
RegExMatch(a_loopfield, "Ui)<pubdate>(.*)</pubdate>" ,pubdate)
RegExMatch(a_loopfield, "U)<title(.*)</title>", title)
RegExMatch(search,needle,url)
if url1=
filecreatedir,dnw
fileappend,%a_loopfield%,dnw\%title1%.txt
gosub, fix1
if a_index = 1
{
file := regexreplace(title1,"i)[^a-z0-9[:space:])(]")
fileread, compare, casts\%file%.ini
continue
}
title := regexreplace(title1,"i)[^a-z0-9[:space:]]")
gosub, date1
description := regexreplace(description1,"U)(\t|\n|\r|<.*>|\&..;|\[.*]|\||]\>|)")
stringleft, description1, description1, 150
url=
if islabel(operation)
gosub, %operation%
}
return

f1::
reload
return


fix1:
Loop
{
regexmatch(url1, "`%(..)",ascii)
StringReplace, url1, url1, `%%ascii1%, % Chr("0x" . ascii1), All
if errorlevel <> 0
break
}
return


date1:
d = 1
loop, parse, pubdate, %a_space%
{
if a_loopfield =
continue
p%d% = %a_loopfield%
d += 1
}
loop, 12
{
month = %a_index%
if StrLen(month)=1
month = 0%month%
formattime, out, 2008%month%01, MMM
if out = %p3%
{
if a_index < 10
p3 = 0%a_index%
else
p3 = %a_index%
}
}
if StrLen(p2) =1
p2 = 0%p2%
date1 = %p4%%p3%%p2%
return

update2:
gui,submit,nohide
iniread,out,urlz.ulz,sites,%plist1%
filedelete, download.dnl
urldownloadtofile,%out%,download.dnl
operation=msg1
gosub, strip1
gosub, plist1
gosub, pcasts1

;goto, manualdownloaderref
return

DelManSub:
gui,submit,nohide
iniread,out,urlz.ulz,sites,%plist1%
filedelete, casts\%plist1%.ini
fileread, sitedel, urlz.ulz
inidelete,urlz.ulz,sites,%plist1%
;goto, populate1
goto, manualdownloaderref
return

msg1:
iniread,out,casts\%plist1%.ini,%title%,date1,error
if out = error
{
gosub, newcast1
}
return

newcast1:
if url1=
return
info=title,url1,date1,description1
loop,parse,info,`,
{
filecreatedir,casts
iniwrite,% %a_loopfield%,casts\%file%.ini,%title%,%a_loopfield%
}
return

download1:
ifnotexist,download.ini
{
msgbox select some files to download first
return
}
loop,
{
iniread,out,download.ini,download,%a_index%
if out=error
break
title=%out%
iniread,out,download.ini,url,%out%
stringsplit,out,out,\
splitpath,out2,file
filecreatedir,%out1%
dir=%out1%
settimer,flash1,30
;msgbox,%out2%`, %usbl%:\%downloadpodcast_to%\%out1%\%file%
ifnotexist, %usbl%:\%downloadpodcast_to%\%out1%
filecreatedir, %usbl%:\%downloadpodcast_to%\%out1%
urldownloadtofile,%out2%,%usbl%:\%downloadpodcast_to%\%out1%\%file%
fileappend,%out1%\%file%`n, manualdownloaded.txt
filegetsize,fs, %usbl%:\%downloadpodcast_to%\%out1%\%file%,k
if fs<90
filedelete,%usbl%:\%downloadpodcast_to%\%out1%\%file%

settimer,flash1,off
inidelete,download.ini,url,%title%
lv_modify(rownumber,"",a1,"Downloaded",a3,a4)
}
filedelete,download.ini
return

flash1:
if flash=Downloading
flash=
else
flash=Downloading
Loop % LV_GetCount()
{
LV_GetText(name, A_Index)
if name = %title%
{
rownumber=%a_index%
loop,4
lv_gettext(a%a_index%,rownumber,a_index)
lv_modifycol(2,100)
lv_modify(rownumber,"",a1,flash,a3,a4)
sleep,200
break
}
}
return

EraseAllManual:
msgbox, 4, Erasing all!, Warning, this will erase all manual subscriptions as just seen. `n Do you wish to continue?
ifmsgbox no
return
Msgbox, This will not affect the automatic subscriptions.`nIf you change your mind`, there is a backup of all subscriptions in the ahkpod directory, until you start adding subscriptions.
filedelete, download.dnl
filedelete,urlz.ulz
fileremovedir, %a_workingdir%\dnw,1
fileremovedir, %a_workingdir%\casts,1
gui, destroy
goto, IntroDialogs
return

;right click menu
GuiContextMenu:
RowText=
if A_GuiControl = plist1
{
LV_GetText(RowText2, A_EventInfo)
; msgbox, %RowText2%
Menu,MyRightMenu,Show, %A_GuiX%,%A_GuiY%
}
Return


addauto:
; msgbox,Adding %RowText% to auto subscriptions %file% :%plist1%
iniread,outurl,urlz.ulz,sites,%plist1%
msgbox, Adding to Recurring Automatic Subscritions: %plist1%=%outurl% to podcast-subscriptions.txt
fileappend, `;%plist1%`n%outurl%`n,%a_workingdir%\podcasts-subscriptions.txt
fileread, episodelist, %a_workingdir%\casts\%plist1%.ini
Loop
{
StringReplace, episodelist, episodelist, `r`n[,¿ , UseErrorLevel
if ErrorLevel = 0 ; No more replacements needed.
break
}
Loop
{
StringReplace, episodelist, episodelist, `r`n, , UseErrorLevel
if ErrorLevel = 0 ; No more replacements needed.
break
}
;Stringreplace,episodelist,episodelist,`r`n,,1
;Stringreplace,episodelist,episodelist,`n,,1
;episodelist := RegExReplace(episodelist,"\R+", "`r`n")
;episodelist := RegExReplace(episodelist,"`r`n[","¿")
;msgbox, %episodelist%
;episodelist := RegExReplace(episodelist,"\R","`r`n")
;fileappend, %episodelist%, testepisodelist.txt

loop, parse, episodelist,¿
{
; msgbox, %a_index%=%A_LoopField%
fileappend,%A_LoopField%`n, %a_workingdir%\DownloadedCasts\%plist1%.txt
}
return



guiclose:

gui, destroy
goto, IntroDialogs
return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::::::
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::::::
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::::::
schedule:
run, Control Panel
winwait, Control Panel
winactivate, Control Panel
sleep, 1000
send,ss
controlsend,,ss,Control Panel
sleep, 1000
run, ::{d6277990-4c6a-11cf-8d87-00aa0060f5bf}
winwait, Scheduled Tasks
winactivate, Scheduled Tasks
;winmaximize,Scheduled Tasks
return

strip10:
fileread, info, download.dnl
stringreplace, info, info, &amp;, %a_space%and%a_space%, all
stringreplace, info, info, <item>, ®, all
needle = Ui)"(http://[^[:space:]]*(m4v|mp4|mp3))"
loop, parse, info, ®
{
search=%a_loopfield%
RegExMatch(a_loopfield, "Ui)<description>(.*)</description>" ,description)
RegExMatch(a_loopfield, "Ui)<pubdate>(.*)</pubdate>" ,pubdate)
RegExMatch(a_loopfield, "U)<title(.*)</title>", title)
RegExMatch(search,needle,url)
if url1=
filecreatedir,dnw
fileappend,%a_loopfield%,dnw\%title1%.txt

gosub, fix1

if a_index = 1
{
file := regexreplace(title1,"i)[^a-z0-9[:space:])(]")
fileread, compare, casts\%file%.ini
continue
}
title := regexreplace(title1,"i)[^a-z0-9[:space:]]")
gosub, date1
description := regexreplace(description1,"U)(\t|\n|\r|<.*>|\&..;|\[.*]|\||]\>|)")
stringleft, description1, description1, 150
url=
if islabel(operation)

if url1=
return
info=title,url1,date1,description1
loop,parse,info,`,
{
filecreatedir,casts
iniwrite,% %a_loopfield%,casts\%file%.ini,%title%,%a_loopfield%
}


}


return

GuiContextMenu2:
RowText=

if A_GuiControl = plista
{
LV_GetText(RowText22, A_EventInfo)
msgbox, %RowText2%
Menu,MyRightMenu2,Show, %A_GuiX%,%A_GuiY%
}
Return

DelAutoSub:
LV_GetText(RowText22, A_EventInfo)
run, notepad.exe podcasts-subscriptions.txt
;msgbox, %plista%:%RowText%:%castdel%
filedelete, %a_workingdir%\DownloadedCasts\%castdel%
fileappend,filedelete`, %a_workingdir%\DownloadedCasts\%castdel%.txt`n,delrout.txt
tooltip, %castdel%: deleted all episode files. You must manually delete the subscription entry from this txt file`, podcasts-subscriptions.txt `n and save file.,,250
sleep,16000
tooltip
return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

importopml:

;FileSelectFile, OutputVar [, Options, RootDir\Filename, Prompt, Filter]
FileSelectFile, importedopml, , %a_workingdir%, Please select an opml file to import, *.opml
SplashTextOn, 300, 50, Importing! Please stand by., Importing! Please stand by.
fileread, importedopml ,%importedopml%
filedelete, temp.opml
fileappend, %importedopml%, temp.opml

loop, read, %a_workingdir%\temp.opml

{
ifnotinstring,A_LoopReadLine,http
continue

; msgbox, %A_LoopReadLine%
Stringreplace,alf,A_LoopReadLine, <outline text=",¬
Stringreplace,alf,alf," type=",¬
Stringreplace,alf,alf," xmlUrl=",¬
Stringreplace,alf,alf," htmlUrl=",¬
Stringreplace,alf,alf," />,¬
Stringreplace,alf,alf,-,,1
Stringreplace,alf,alf,#,,1


loop, parse,alf, ¬
{
if A_Index=2
{
fileappend, %A_LoopField%,%a_workingdir%\urlz.ulz
fileappend, =,%a_workingdir%\urlz.ulz
fileappend, `n,%a_workingdir%\casts\%A_LoopField%.ini
showtitle=%A_LoopField%
}
; msgbox, Title is %A_LoopField%

if A_Index=4
{
fileappend, %A_LoopField%`n,%a_workingdir%\urlz.ulz
gosub, downloadlist
} ; msgbox, xml is %A_LoopField%

; if A_Index=5
; msgbox, http url is %A_LoopField%


}
}
SplashTextOff

return

downloadlist:
filedelete, download.dnl
urldownloadtofile,%A_LoopField%,download.dnl
;msgbox, download.dnl
operation=msg1
;;;;;;;gosub, strip1
fileread, info, download.dnl
stringreplace, info, info, &amp;, %a_space%and%a_space%, all
stringreplace, info, info, <item>, ®, all
needle = Ui)"(http://[^[:space:]]*(m4v|mp4|mp3))"
loop, parse, info, ®
{
search=%a_loopfield%
RegExMatch(a_loopfield, "Ui)<description(.*)</description>" ,description)
RegExMatch(a_loopfield, "Ui)<pubdate>(.*)</pubdate>" ,pubdate)
RegExMatch(a_loopfield, "U)<title(.*)</title>", titl)
StringReplace, titl, titl, `%%ascii1%, % Chr("0x" . ascii1), All

RegExMatch(search,needle,url)

Stringreplace, titl, titl, <title>,
Stringreplace, titl, titl, <title >,
Stringreplace, titl, titl, </title>,
Stringreplace, titl, titl, </title >,
Stringreplace, titl, titl, -,

Stringreplace, url, url,",,1

Stringreplace, pubdate, pubdate, <pubdate>,
Stringreplace, pubdate, pubdate, <pubdate >,


Last edited by degarb on February 9th, 2010, 5:20 am, edited 17 times in total.

Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 20th, 2010, 7:01 pm 
Offline

Joined: February 14th, 2007, 8:01 pm
Posts: 308
A bug found: on

http://www.thenakedscientists.com/naked ... odcast.xml

(which I think one or both juice and podpuppy were having problems subscribing to this xml. Itunes will delete subscription after I transoded any mp3 before listening--device envy, I am sure.)

I see these Englishmen put a space in <title > rather than a standard <title> The above code doesn't work with spaces there. So, not grasping enough regex I simply change line 200 to RegExMatch(a_loopfield, "U)<title(.*)</title>", title) , deleting the > and it seems to work. This logic could be done to get the description variable to work as well.

(I am not sure but with editpad and pspad the pipes and parenthesis look weird on line with regex for random no apparent reason.)

Another quick change that is needed is a
ifinstring, aloopfield, ;
continue
when reading the podcast.txt to allow commenting and temporary holidays of entries in this file.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 21st, 2010, 10:50 pm 
Offline

Joined: February 14th, 2007, 8:01 pm
Posts: 308
I updated the above code today with bug fixes. The last bug fix was historyzine servers would not allow file size queries. I added code that if percent download is less than %70, the file wouldn't update the list of downloaded podcasts. So historyzine was always in state of duddownload.

I added some urls to get people kick started with finding podcasts. Podbean, podcast alley, findpod, and google search string. I am unaware how to access Itunes shop, which has a superb selection of widely distributed free podcasts, without downloading the monster itunes. Anyone can add to the list.

Also, I squish my podcasts to about 23 ish kps vbr that sound like am radio. I suppose a link to some folder syncronizer script is really needed for some people. Though a good mp3 player would make files with some attribute as listened to. Then a single click would delete files listened to and add xx number until pod xx percent loaded.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 22nd, 2010, 9:44 pm 
Offline

Joined: February 14th, 2007, 8:01 pm
Posts: 308
(Most podcasts work fine. So, editing above posted code to fix the npr bug.)

I am testing with various subscriptions. But need help.

So far, bugs: Solved: this american life file size gets corrupted at end. It downloads fine, and at end, then goes to zero then /500 of actual podcast size. Found line 393 needs to read: UrlDownloadToFile, %url1%, %saveDir%\%filenamedeg%
ifnotinstring, url1, http
UrlDownloadToFile, %urla1%, %saveDir%\%filenamedeg% ;deg


Solved: The http query on Nature of things yields a projected size of double real size. line 386ish should read totalFileSize := HttpQueryInfo(url1, 5)
totalFileSizea=0
ifnotinstring, url1, http
totalFileSizea := HttpQueryInfo(urla1, 5) ;deg



Joel's code deletes this am life, and not sure why.

Any help appreciated. Most podcasts work fine. I am working on a workaround using an ignoredud.txt list of casts with problems so they catch up and mark as downloaded, regardless of httpquery filesize or any other variable that goes whacko.

;;;;;TESTING
http://downloads.bbc.co.uk/podcasts/fiv ... rl/rss.xml
;Dr Karl has bad xml or something. need further testing
; -This American Life mp3 is corrupted on download. file size immediately doubles, then divided by 1000
http://feeds.thisamericanlife.org/talpodcast
; nature of thing httpquery yields size of twice real size
http://feeds.feedburner.com/TheNatureOfThings


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 24th, 2010, 7:58 pm 
Offline

Joined: February 14th, 2007, 8:01 pm
Posts: 308
I just edited my posted code again to fix another bug. Joel miscalculates the date. On closer inspection, I saw he assumes the date stamp to be a simple decimal number. So, I converted date to proper form, so now date of old mp3 deletion works.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 24th, 2010, 10:23 pm 
Offline

Joined: February 14th, 2007, 8:01 pm
Posts: 308
http://www.autohotkey.net/~degarb/ahkpod/

for html help and compiled windows exe.

I am just not interested in becoming an html genius, so anyone that can write better html, go for it.


Report this post
Top
 Profile  
Reply with quote  
PostPosted: January 25th, 2010, 6:06 pm 
Offline

Joined: September 17th, 2005, 6:43 pm
Posts: 242
I am glad to see people getting some use out of my old code :) I love the new ideas and I will see if I can add anything.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 26th, 2010, 6:05 am 
Offline

Joined: February 14th, 2007, 8:01 pm
Posts: 308
Yes, juice is no longer supported, and doesn't work on my machine. So new os podcast are needed, I don't see anything that works here on sourceforge.

I am seeing some files like freshair podcast (I need to test another day to see why.) came down as corrupt 26k mp3s. This is a big problem when transoding as it is hanging the transcoder. So, I need to delete files smaller than some size or verify they are truly good mp3s.

The whole mp4 thing (making sure their extension is correctly assigned with the code) needs more testing as I am only interested in mp3, until more bandwidth, or for audio all players support mp3/aac (probably 20 years from now for me).


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 26th, 2010, 6:41 pm 
Offline

Joined: February 14th, 2007, 8:01 pm
Posts: 308
Looking at the xml of NPR's Fresh Air http://www.npr.org/rss/rss.php?id=13 The subscription is garbage. They don't put links to mp3's rather other pages to read some story with embedded javascripted links to audio. Pure idiotic logic. Thus, it is not a real podcast, but email reading experience.

However to complicate things the links to the stories are in form: <link>http://www.npr.org/templates/story/story.php?storyId=122811457&amp;ft=1&amp;f=13</link> Thus an entire cluster block of code need to be writen to parse around the semicolons. I haven't run into other incompetent podcasters like this so not going to worry about this type of link yet.


Report this post
Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 19 posts ]  Go to page 1, 2  Next

All times are UTC [ DST ]


Who is online

Users browsing this forum: oldbrother and 12 guests


You can post new topics in this forum
You can reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Powered by phpBB® Forum Software © phpBB Group