The Ultimate Script to download Microsoft Ignite Videos AND slides!

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:

download Microsoft Ignite Videos and Content

  • 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

Download Microsoft Ignite Videos

You can now filter downloads by session code!

Download Microsoft Ignite videos PowerShell

Progress Bar

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() + &quot;<code>r</code>n&quot; + $_.creator + &quot;<code>r</code>n&quot; + $_.summary.trim() + &quot;<code>r</code>n&quot; + &quot;<code>r</code>n&quot; + $Category.Substring(0,$Category.Length -1)
   add-content $OutFile $Content

	}
}

if ($keyword)
{
    $keywords = $keyword.split(&quot;,&quot;)

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

    foreach ($s in $sessions)
    {
        $s.trim()
        Write-Host &quot;You are now downloading the session $s&quot;
        DownloadSlides $s $slide1
        DownloadSlides $s $slide2
        DownloadVideos $s $video1
        DownloadVideos $s $video2
    }

}
else
{
    DownloadSlides &quot; &quot; $slide1
    DownloadSlides &quot; &quot; $slide2
    DownloadVideos &quot; &quot; $video1
    DownloadVideos &quot; &quot; $video2
}

No ratings yet.

Please rate this

 
Comments

This is great! Thank you. Is there any way to include an an option to just download videos for particular product (sql server) only?

Working on it.. watch for V2 next week :). I created and blogged this from a borrowed laptop (long story) so couldn’t do all I wanted :P.

Anyone have an idea of total size yet? This is awesome, just want to make sure I plan accordingly.

Hey, just did it! 140gb!

FND and IMM sessions not among the files downloaded, eg: http://channel9.msdn.com/Events/Ignite/2015/FND1551

Will check with channel9 how come some of them are skipped! They seem not to be included in the RSS Feed! Will see what I can do!

Hey, I talked to channel9 and they gave me the tip on how to include those as well! Will post updated script as well as cause tonight!

they are getting downloaded now with the latest version of script :). check it out!

Thank you Vlad for sharing, that’s great! Good to meet at MSIgnite booth last week. See you at our ESPC booth, were we will have again Swiss Chocolate 🙂 Greetings from BPA Solutions Team

Thanks Belinda,

Glad you liked the script and was really happy to see you as well! Don’t forget a special box of chocolates for me 😛

It looks like the RSS feed being used to identify the downloads (video and decks) is missing some of the break outs. Do you know if that is intentional or not?

Will check! Hopefully not!

It’s all fixed now! Download the latest version of the script and you will have everything!

This is fantastic! Thank you for all your hard work on this. I have been looking for something like this for quite a long time.

Is there a way to filter on the audience type? If not, could you add it? For example, I would like to download videos targeted for Enterprise Developers and then my list of keywords for the title.

Unfortunately Microsoft didn’t really properly document it in the RSS, so couldn’t do a proper filter :(.

You’re the man Vlad! Nice going.

You may replace using the WebClient object by the Start-BitsTransfer cmdlet.

Basically :

Start-BitsTransfer http://url/of/the/video c:\ignite\videoname

The updated script is here:
https://gist.github.com/stevebeauge/0a40383b95cb130ae10d

This will especially provide a progress bar in the console, and avoid frozen screen while downloading large files.

Hth

Cool! Included your change & others in the latest script +gave you credits 🙂

Would be great if the script had the option to download just the slides, I don’t have the spare disk for all the video.

Just comment out the “DownloadVideos” function call towards the end of the script!

Problem with Start-BitsTransfer

Start-BitsTransfer : Object reference not set to an instance of an object.
At C:\Users\~~~~~~~\Downloads\DownloadIgnitevideosandslidesv4.ps1:143 char:3
+ Start-BitsTransfer $url “$downloadlocation\$file” -DisplayNam …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Start-BitsTransfer], NullRefe
renceException
+ FullyQualifiedErrorId : System.NullReferenceException,Microsoft.Backgrou
ndIntelligentTransfer.Management.NewBitsTransferCommand

mv : Cannot find path ‘D:\Ignite\FND1451-Mark Russinovich, Jeffrey Snover,
Jeremy Winter-Windows Server & System Center Futures—Bring Azure to your
Dat.mp4’ because it does not exist.
At C:\Users\~~~~~~~\Downloads\DownloadIgnitevideosandslidesv4.ps1:144 char:3
+ mv $file $folder
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (D:\Ignite\FND14…to your Dat.m
p4:String) [Move-Item], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.MoveI
temCommand

it won’t download new content. V1 worked fine

Can you try to run PowerShell as admin? If it doesn’t work, I will return back to the previous download method!

Thanks!

I had the same issue with V4 regarding the “Problem with Start-BitsTransfer”
Just run this before you execute the script

Import-Module BitsTransfer

Hey Shaun,

Thanks! Can you please tell me what OS were you on? Maybe it’s OS related!

Thanks!

Good day

I have Windows 7 professional 64 bit (6.1 Build 7601)

Hello,

I tried to download the Keynote but stopped the script at, say 3/4 of the total (stopped with CTRL-C), then started again but it started from beginnig.

Marco Mangiante

I commented out the “DownloadVideos” function calls as suggested to download only the slides. When I run the script this is all I get:

Downloading slides: BRK3473-Jonathan Tuliani, Sigfus Magnusson-Introducing Microsoft Azure DNS.pptx
The operation being requested was not performed because the user has not logged on to the network. The specified service does not exist. (Exception from HRESULT: 0x800704DD)
Downloading slides: BRK3129-Brian Day-Deploying Exchange Server 2016.pptx
The operation being requested was not performed because the user has not logged on to the network. The specified service does not exist. (Exception from HRESULT: 0x800704DD)

Any idea what’s causing the errors and why the script doesn’t continue?

Is it from inside your company firewall? Do you have a reverse proxy?

Leave a Reply