The Ultimate Script to download Project Conference 2014 Videos, slides and descriptions!

After posting the highly popular SharePoint Conference 2014 script to download the videos and slides,  I decided to do the same thing for Project Server for people interested!

  • This is what the script does:
  • Downloads all the Project Conference 2014 Sessions and Slides
  • 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.
  • Downloads the description of the session.

Project Conference 2014 banner, Feb 2-5 2014 in Anaheim CA, with the Think Big What's Your Next Project tagline

At the end, it will look something like this:

Windows Explorer listing downloaded Project Conference 2014 session folders, Focus1 to Focus16, each with its session title

And inside every folder (provided slides have been added by Channel9) you will have both the .mp4 and the .pptx!

PC200 session folder containing the .pptx slides, a .txt description and the 278 MB .mp4 recording

And the total size:

Project2014 folder Properties dialog showing a size of 29.2 GB with 341 files in 123 folders

Here is a preview of the script (if you wanna look trough it real fast) , but DO NOT COPY PASTE IT FROM UNDER HERE (Added a couple of colors so I am sure you read it J), the WordPress plugin messed up some syntax. Instead OPEN IT HERE:  http://gallery.technet.microsoft.com/PowerShell-Script-to-all-a0b94874 

Don’t keep all this for yourself, tweet it so your followers can get all the free knowledge as well! 

# Originally published at https://gist.github.com/nzthiago/5736907
# I Customized it for SPC14 with slides

# If you don't like it, complain to Github. :)

[Environment]::CurrentDirectory=(Get-Location -PSProvider FileSystem).ProviderPath
$rss = (new-object net.webclient)

# Grab the RSS feed for the MP4 downloads

# SharePoint Conference 2014 Videos
$a = ([xml]$rss.downloadstring("http://channel9.msdn.com/Events/Project/2014/RSS/mp4high"))
$b = ([xml]$rss.downloadstring("http://channel9.msdn.com/Events/Project/2014/RSS/slides"))

#Preferably enter something not too long to not have filename problems! cut and paste them afterwards
$downloadlocation = "C:\Project2014"

if (-not (Test-Path $downloadlocation)) {
Write-Host "Folder $fpath dosen't exist. Creating it..."
New-Item $downloadlocation -type directory
}
set-location $downloadlocation

 

#Download all the slides
$b.rss.channel.item | foreach{
$code = $_.comments.split("/") | select -last 1

# Grab the URL for the PPTX file
$urlpptx = New-Object System.Uri($_.enclosure.url)
$filepptx = $code + "-" + $_.creator + " - " + $_.title.Replace(":", "-").Replace("?", "").Replace("/", "-").Replace("<", "").Replace("|", "").Replace('"',"").Replace("*","")
$filepptx = $filepptx.substring(0, [System.Math]::Min(120, $filepptx.Length))
$filepptx = $filepptx.trim()
$filepptx = $filepptx + ".pptx"
if ($code -ne "")
{
$folder = $code + " - " + $_.title.Replace(":", "-").Replace("?", "").Replace("/", "-").Replace("<", "").Replace("|", "").Replace('"',"").Replace("*","")
$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
}

&nbsp;

#text description from session . Thank you VaperWare
$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

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

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

}
}

#download all the mp4

# Walk through each item in the feed
$a.rss.channel.item | 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 + "-" + $_.title.Replace(":", "-").Replace("?", "").Replace("/", "-").Replace("<", "").Replace("|", "").Replace('"',"").Replace("*","")
$file = $file.substring(0, [System.Math]::Min(120, $file.Length))
$file = $file.trim()
$file = $file + ".mp4"

if ($code -ne "")
{
$folder = $code + " - " + $_.title.Replace(":", "-").Replace("?", "").Replace("/", "-").Replace("<", "").Replace("|", "").Replace('"',"").Replace("*","")
$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
}

&nbsp;

# Make sure the MP4 file doesn't already exist

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

# Download the MP4 file
$wc.DownloadFile($url, "$downloadlocation\$file")
mv $file $folder
}

}