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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
#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)
#other qualities for the videos only. Uncomment below and delete the two previous lines to download Mid Quality videos
#$video1 = ([xml]$rss.downloadstring("http://s.ch9.ms/events/build/2017/rss/mp4"))
#$video2 = ([xml]$rss.downloadstring("http://s.ch9.ms/events/build/2017/rss/mp4?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