theme-sticky-logo-alt

The Ultimate Script to download Microsoft Ignite Videos AND slides!

32 Comments

 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() + "`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
}
Previous Post
6 Ways Formotus is Building a Better InfoPath Alternative
Next Post
The Ultimate Script to download Build Session Videos AND slides!

32 Comments

  • May 7, 2015 at 7:59 pm
    Tiddu

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

    Reply
    • May 8, 2015 at 11:48 am

      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.

      Reply
  • May 8, 2015 at 4:27 pm
    jeff

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

    Reply
  • May 10, 2015 at 3:58 pm
    Big O

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

    Reply
    • May 11, 2015 at 7:53 pm

      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!

      Reply
      • May 12, 2015 at 3:39 pm

        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!

    • May 13, 2015 at 7:03 am

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

      Reply
  • May 11, 2015 at 6:40 am

    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

    Reply
    • May 11, 2015 at 7:53 pm

      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 😛

      Reply
  • May 11, 2015 at 7:37 pm
    Jason

    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?

    Reply
    • May 11, 2015 at 7:52 pm

      Will check! Hopefully not!

      Reply
    • May 13, 2015 at 7:24 am

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

      Reply
      • May 13, 2015 at 10:27 am
        Anedra

        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.

  • May 13, 2015 at 9:45 am
    Spenser

    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.

    Reply
    • July 14, 2015 at 3:02 pm

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

      Reply
  • May 13, 2015 at 2:56 pm

    You’re the man Vlad! Nice going.

    Reply
  • May 14, 2015 at 4:58 am

    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

    Reply
    • May 15, 2015 at 1:26 am

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

      Reply
  • May 14, 2015 at 6:52 am

    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.

    Reply
    • May 15, 2015 at 12:18 am

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

      Reply
  • May 15, 2015 at 7:35 am
    DougW

    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

    Reply
    • May 16, 2015 at 12:48 pm

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

      Thanks!

      Reply
      • May 19, 2015 at 3:36 am
        Shaun

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

        Import-Module BitsTransfer

      • May 19, 2015 at 10:35 am

        Hey Shaun,

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

        Thanks!

      • May 20, 2015 at 1:48 am
        Shaun

        Good day

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

  • May 16, 2015 at 5:15 pm

    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

    Reply
  • June 5, 2015 at 11:15 am
    Todd Hamlin

    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?

    Reply
    • July 14, 2015 at 3:11 pm

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

      Reply
  • September 28, 2016 at 9:11 am
    Sassan

    Great work Vlad, any chance you’re going to update this to include the Ignite 2016 sessions?

    Reply

Leave a Reply

15 49.0138 8.38624 1 0 4000 1 https://vladtalkstech.com 300 1