Today I want to feature a really cool little PowerShell Script to download your favorite content from Microsoft Channel 9 @CH9.

As I do most days at lunch I scour the internet for great IT News, Blog Posts, and cool tricks to help me with my day job.

Today I was browsing my friend Vlad Catrinescu’s @vladcatrinescu blog: https://absolute-sharepoint.com/ and I found this amazing post…

https://absolute-sharepoint.com/2017/05/the-ultimate-script-to-download-microsoft-build-2017-videos-and-slides.html

Basically, it can be used as a downloader for any Channel 9 content from Microsoft. Sometimes it is nice to have offline content for when you are on the plane and this one really does the trick.

Now the code you see below is slightly modified as I thought it would be cool to download all the @MVPDays 2017 content.

You can download my modified version of the script from our MVPDays Github Repository. www.github.com/mvpdays

#Script written by Vlad Catrinescu
#Visit my site www.absolute-sharepoint.com
#Twitter: @vladcatrinescu
#Originally Posted here: https://wp.me/p3utgI-865

#Slight Modifications to work with MVPDays Community Roadshow Content on Channel 9
#by Dave Kawula - MVP 
#@DaveKawula
#Nice work VLAD -- This might make Master PowerShell Tricks V3 

Param(
  [string]$keyword,[string]$session
)


######    Variables  #####

#Location - Preferably enter something not too long to not have filename problems! cut and paste them afterwards
$downloadlocation = "G:\MVPDays2017"
#Ignite 2016 Videos RSS Feed
[Environment]::CurrentDirectory=(Get-Location -PSProvider FileSystem).ProviderPath 
$rss = (new-object net.webclient)
$video1 = ($rss.downloadstring("http://s.ch9.ms/events/MVPDays/MVPDays2017RoadShow/rss/mp4high"))
$video2 = ($rss.downloadstring("http://s.ch9.ms/events/MVPDays/MVPDays2017RoadShow/rss/mp4high?page=2")) 
#other qualities for the videos only. Uncomment below and delete the two previous lines to download Mid Quality videos
#$video1 = ($rss.downloadstring("http://s.ch9.ms/events/build/2017/rss/mp4"))
#$video2 = ($rss.downloadstring("http://s.ch9.ms/events/build/2017/rss/mp4?page=2"))
$slide1 = ($rss.downloadstring("http://s.ch9.ms/events/MVPDays/MVPDays2017RoadShow/rss/slides"))
$slide2 = ($rss.downloadstring("http://s.ch9.ms/events/MVPDays/MVPDays2017RoadShow/rss/slides?page=2"))


#SCRIPT/ Functions  Do not touch below this line :)#
if (-not (Test-Path $downloadlocation)) { 
		Write-Host "Folder $fpath dosen't exist. Creating it..."  
		New-Item $downloadlocation -type directory | Out-Null
	}
set-location $downloadlocation

function CleanFilename($filename)
{
    return $filename.Replace(":", "-").Replace("?", "").Replace("/", "-").Replace("<", "").Replace("|", "").Replace('"',"").Replace("*","")
}


function DownloadSlides($filter,$videourl)
{
    try 
    {    
        $videourl.rss.channel.item | Where{($_.title -like “*$filter*”) -or ($_.link -like "*/$filter")} | 
        foreach {
	        $code = $_.comments.split("/") | select -last 1	   
	
	        # Grab the URL for the PPTX file
	        $urlpptx = New-Object System.Uri($_.enclosure.url)  
            $filepptx = $code + "-" + $_.creator + "-" + (CleanFileName($_.title))
	        $filepptx = $filepptx.substring(0, [System.Math]::Min(120, $filepptx.Length))
	        $filepptx = $filepptx.trim()
	        $filepptx = $filepptx + ".pptx" 
	        if ($code -ne "")
	        {
		         $folder = $code + " - " + (CleanFileName($_.title))
		         $folder = $folder.substring(0, [System.Math]::Min(100, $folder.Length))
		         $folder = $folder.trim()
	        }
	        else
	        {
		        $folder = "NoCodeSessions"
	        }
	
	        if (-not (Test-Path $folder)) { 
		        Write-Host "Folder $folder dosen't exist. Creating it..."  
		        New-Item $folder -type directory | Out-Null
	        }

	        # Make sure the PowerPoint file doesn't already exist
	        if (!(test-path "$downloadlocation\$folder\$filepptx"))     
	        { 	
		        # Echo out the  file that's being downloaded
		        write-host "Downloading slides: $filepptx"
		        #$wc = (New-Object System.Net.WebClient)  

		        # Download the MP4 file
		        #$wc.DownloadFile($urlpptx, "$downloadlocation\$filepptx")
                Start-BitsTransfer $urlpptx "$downloadlocation\$filepptx" -DisplayName $filepptx
		        mv $filepptx $folder 

	        }
            else
            {
   		        write-host "Slides exist: $filepptx"
            }
	    }

     }
    
    catch
    {
        $ErrorMessage = $_.Exception.Message
        Write-host "$ErrorMessage"
    }
}


function DownloadVideos($filter,$slideurl)
{
#download all the mp4
# Walk through each item in the feed 
$slideurl.rss.channel.item | Where{($_.title -like “*$filter*”) -or ($_.link -like "*/$filter*")} | foreach{   
	$code = $_.comments.split("/") | select -last 1	   
	
	# Grab the URL for the MP4 file
	$url = New-Object System.Uri($_.enclosure.url)  
	
	# Create the local file name for the MP4 download
	$file = $code + "-" + $_.creator + "-" + (CleanFileName($_.title))
	$file = $file.substring(0, [System.Math]::Min(120, $file.Length))
	$file = $file.trim()
	$file = $file + ".mp4"  
	
	if ($code -ne "")
	{
		 $folder = $code + " - " + (CleanFileName($_.title))
		 $folder = $folder.substring(0, [System.Math]::Min(100, $folder.Length))
		 $folder = $folder.trim()
	}
	else
	{
		$folder = "NoCodeSessions"
	}
	
	if (-not (Test-Path $folder)) { 
		Write-Host "Folder $folder) dosen't exist. Creating it..."  
		New-Item $folder -type directory | Out-Null
	}
	
	
	
	# Make sure the MP4 file doesn't already exist

	if (!(test-path "$folder\$file"))     
	{ 	
		# Echo out the  file that's being downloaded
		write-host "Downloading video: $file"
		#$wc = (New-Object System.Net.WebClient)  

		# Download the MP4 file
		Start-BitsTransfer $url "$downloadlocation\$file" -DisplayName $file
		mv $file $folder
	}
    else
    {
   		write-host "Video exists: $file"
    }

#text description from session
	$OutFile = New-Item -type file "$($downloadlocation)\$($Folder)\$($Code.trim()).txt" -Force  
    $Category = "" ; $Content = ""
    $_.category | foreach {$Category += $_ + ","}
    $Content = $_.title.trim() + "`r`n" + $_.creator + "`r`n" + $_.summary.trim() + "`r`n" + "`r`n" + $Category.Substring(0,$Category.Length -1)
   add-content $OutFile $Content
		
	}
}



if ($keyword)
{
    $keywords = $keyword.split(",")
    
    foreach ($k in $keywords)
    {
        $k.trim()
        Write-Host "You are now downloading the sessions with the keyword $k"
        DownloadSlides $k $slide1
        DownloadSlides $k $slide2
        DownloadVideos $k $video1
        DownloadVideos $k $video2
    }
}
elseif ($session)
{
    $sessions = $session.Split(",")
    
    foreach ($s in $sessions)
    {
        $s.trim()
        Write-Host "You are now downloading the session $s"
        DownloadSlides $s $slide1
        DownloadSlides $s $slide2
        DownloadVideos $s $video1
        DownloadVideos $s $video2
    }

}
else
{
    DownloadSlides " " $slide1
    DownloadSlides " " $slide2
    DownloadVideos " " $video1
    DownloadVideos " " $video2
}

Here is the script in action downloading all the Videos from the MVPDays 2017 Roadshow

Here is the finished product.

Hope you enjoy and happy learning,

Dave