Channel9Downloader.ps1

<#PSScriptInfo
.VERSION 1.0
.AUTHOR jongalloway@gmail.com
.GUID da220b4e-e889-42dc-85cd-91e0f91a965e
#>


<#
.DESCRIPTION
Downloads videos from Channel 9 event RSS feeds.
#>
 
# --- settings ---
$feedUrl = "http://s.ch9.ms/Events/dotNetConf/2017/RSS/"
$mediaType = "mp4high"
$overwrite = $false
$destinationDirectory = join-path ([Environment]::GetFolderPath("MyDocuments")) "dotNetConf-2017-Video"

# --- locals ---
$webClient = New-Object System.Net.WebClient

# --- functions ---
function PromptForInput ($prompt, $default) {
 $selection = read-host "$prompt`r`n(default: $default)"
 if ($selection) {$selection} else {$default}
}

function DownloadEntries {
 param ([string]$feedUrl) 
 $feed = [xml]$webClient.DownloadString($feedUrl)
 
 $progress = 0
 $pagepercent = 0
 $entries = $feed.rss.channel.item.Length
 $invalidChars = [System.IO.Path]::GetInvalidFileNameChars()
 $feed.rss.channel.item | foreach {
    $url = New-Object System.Uri($_.enclosure.url)
    $name = $_.title
    $extension = [System.IO.Path]::GetExtension($url.Segments[-1])
    $fileName = $name + $extension

    $invalidchars | foreach { $filename = $filename.Replace($_, ' ') }
    $saveFileName = join-path $destinationDirectory $fileName
    $tempFilename = $saveFilename + ".tmp"
    $filename
    if ((-not $overwrite) -and (Test-Path -path $saveFileName)) 
    {
        write-progress -activity "$fileName already downloaded" -status "$pagepercent% ($progress / $entries) complete" -percentcomplete $pagepercent
    }
    else 
    {
        write-progress -activity "Downloading $fileName" -status "$pagepercent% ($progress / $entries) complete" -percentcomplete $pagepercent
       $webClient.DownloadFile($url, $tempFilename)
       rename-item $tempFilename $saveFileName
    }
    $pagepercent = [Math]::floor((++$progress)/$entries*100)
  }
}  
 
# --- do the actual work ---
[string]$feedUrl = PromptForInput "Enter feed URL" $feedUrl
[string]$mediaType = PromptForInput "Enter media type`r`n(options:Wmv,WmvHigh,mp4,mp4high,zune,mp3)" $mediaType
$feedUrl += $mediaType

[string]$destinationDirectory = PromptForInput "Enter destination directory" $destinationDirectory
 
# if dest dir doesn't exist, create it
if (!(Test-Path -path $destinationDirectory)) { New-Item $destinationDirectory -type directory }
 
DownloadEntries $feedUrl