The Ultimate Script to download Microsoft Ignite Videos AND slides!
With the amount of great sessions at Ignite this year, there is no way you could have attended all, and even if they are posted on Channel9, you might want to download them to be able to view them offline! That is why I created this PowerShell Script so everyone can easily download Microsoft Ignite Videos AND slides whether they were present at Ignite or not! Here are the features:
- Downloads all the Microsoft Ignite 2015 Sessions and Slides (Note: Slides are not posted yet, but the script will download them as soon as they are)
- Groups them by folders
- Makes sure no errors come up due to Illegal File names.
- If you stop the script and restart in the middle, it will start where it left off and not from beginning
- *NEW* (11/05/2015) You can now filter by keywords in the session title!
- *NEW* (12/05/2015) Channel9 session blocks are limited to 400 sessions, and I changed the script to download the rest! Now all 680 sessions are downloaded!
- *NEW* (15/05/2015) Changed the WebClient download protocol to Start-Bits in order to show download progress. Added ability to filter by session code. Cleaned up script so the code & output looks better! (Thank you Dan Holme and Steve Beauge) . As a blogger, you can send your readers to download the sessions you recommend. Just tell them to use the script, and the parameter -session “Code1, Code2, Code3”

Sessions and Slides are put into folders
Total size of sessions is about 292GB! But sessions are still being uploaded, so might increase in the future!
In this blog you will see the source code of he script, however my WordPress plugin sometimes breaks some PowerShell, so DO NOT copy it from my blog,
Thanks to Jeff Collins for helping me out with the script during Ignite! Make sure you send it out to all your twitter friends by clicking the image below!
Download the script from here! Do not copy paste from below!
How to use:
- To download all sessions just run the script! EX:
.\DownloadIgnitevideosandslidesv4.ps1
- To download sessions based on a keyword use the keyword parameters, and divide keywords by a comma. Make sure to use quotes around the keywords! EX:
.\DownloadIgnitevideosandslidesv4..ps1 -keyword “SharePoint,Azure,System Center
- To download sessions based on the session code, use the session parameter and divide sessions by a comma. Make sure to use quotes around the session codes!
.\downloadignitevideosandslidesv4.ps1 -session “BRK1106,BRK1107,BRK4552”
Here is the source code:
#Script written by Vlad Catrinescu #Visit my site www.absolute-sharepoint.com #Twitter: @vladcatrinescu #Originally Posted here: http://absolute-sharepoint.com/2015/05/the-ultimate-script-to-download-microsoft-ignite-videos-and-slides.html #Contributors: Dan Holme, Jeff Collins, Steve Beaugé Param( [string]$keyword,[string]$session ) ###### Variables ##### #Location - Preferably enter something not too long to not have filename problems! cut and paste them afterwards $downloadlocation = "C:\Ignite" #Ignite 2015 Videos RSS Feed [Environment]::CurrentDirectory=(Get-Location -PSProvider FileSystem).ProviderPath $rss = (new-object net.webclient) $video1 = ($rss.downloadstring("http://s.ch9.ms/events/ignite/2015/rss/mp4high")) $video2 = ($rss.downloadstring("http://s.ch9.ms/events/ignite/2015/rss/mp4high?page=2")) $slide1 = ($rss.downloadstring("http://s.ch9.ms/events/ignite/2015/rss/slides")) $slide2 = ($rss.downloadstring("http://s.ch9.ms/events/ignite/2015/rss/slides?page=2")) #other qualities for the videos only. Choose the one you want! # $a = ($rss.downloadstring("http://channel9.msdn.com/events/ignite/2015/rss/mp4")) # $a = ($rss.downloadstring("http://channel9.msdn.com/events/ignite/2015/rss/mp3")) #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 }