• Updated version: Download MMS 2013 Videos from Channel 9

    Sitting at the McCarran International Airport waiting for my flight to Amsterdam (the Netherlands) I had some time to kill so I wrote a simpel PowerShell script which helps to easily download the MMS 2013 sessions from the Channel 9 RSS feed.

    Using the Out-GridView Cmdlet you can easily select the sessions you are interested in. Click on Ok when finished selecting the sessions you are interested in downloading.

     

    image

    After creating my initial version I got some feedback that sometimes the script did not work and with the help of Jamie Moyer (also a Senior PFE like me) we made the script more robust and added extra features like a HTML Report overview.

    You can even use the –verbose switch and other parameters to tweak the download folder. We hope you like the improvements.

    #######################################################################################################################                        
    # Description:   Download MMS 2013 Channel 9 videos
    # PowerShell version: 3                   
    # Author(s):     Stefan Stranger (Microsoft)
    #                Jamie Moyer (Microsoft          
    # Example usage: Run Get-MMS2013Channel9Videos.ps1 -path c:\temp -verbose
    #                Select using the Out-Gridview the videos you want to download and they are stored in your myvideos folder.
    #                You can multiple select videos, holding the ctrl key.
    # Disclamer:     This program source code is provided "AS IS" without warranty representation or condition of any kind
    #                either express or implied, including but not limited to conditions or other terms of merchantability and/or
    #                fitness for a particular purpose. The user assumes the entire risk as to the accuracy and the use of this
    #                program code.
    # Date:          04-13-2012                        
    # Name:          Get-MMS2013Channel9Videos.ps1            
    # Version:       v1.001 - 04-14-2012 - Stefan Stranger - initial release
    # Version:       v1.005 - 04-29-2013 - Jamie Moyer, Stefan Stranger - added more robustness and HTML Report
    ########################################################################################################################
    #requires -version 3.0
    
    [CmdletBinding()]
    Param
    (
            # Path where to store video's locally
            [Parameter(Mandatory=$false,
                       Position=0)]
            $Path = [environment]::getfolderpath("myvideos") + "\MMS2013",
            [Parameter(Mandatory=$false,
                       Position=1)]
            $rssfeed = "http://channel9.msdn.com/Events/MMS/2013/RSS"
        )
    
    function Get-NewFileName($name)
    {
        Write-Verbose "Calling Get-NewFileName Function"
        $r=$Path+"\"+(($name -replace "[^\w\s\-]*") -replace "\s+") + ".wmv";$r
    }
    
    Write-Verbose "Remove last slash if added using the downloaddirectory Parameter"
    if ($path.EndsWith("\")){$path = $path.Substring(0,$path.Length-1)}
    write-verbose "Path is: $path"
    
    Write-Verbose "Checking if Download directory $Path exists"
    if(!(test-path $Path -PathType Container))
    {
        Write-Verbose "Creating $Path"
        New-Item -ItemType Directory $Path | Out-Null
    }
    
    Write-Verbose "Downloading RSS Feed Items from $rssfeed"
    $feeditems = Invoke-RestMethod $rssfeed
    [array]$feeditemsWithDetails = $feeditems | 
        select Title, Summary, Duration, Enclosure,creator | 
            Add-Member -MemberType ScriptProperty -Name AlreadyDownloaded -Value {(test-path("$Path\$($this.enclosure.url.split('/')[6])"))} -PassThru -Force |
            Add-Member -MemberType ScriptProperty -Name Destination -Value {("$Path\$($this.enclosure.url.split('/')[6])")} -PassThru -Force |
            Add-Member -MemberType ScriptProperty -Name Source -Value {$this.enclosure.url} -PassThru -Force |
                select AlreadyDownloaded,Title, Summary, Duration, Enclosure,Source,Destination,creator | sort Title
    
    Write-Verbose "Add all already downloaded items back to the list"
    $duplicateVideoNames = $feeditemsWithDetails |sort name| group destination | where-object {$_.Name -ne "" -and $_.Count -gt 1} | 
        ForEach-Object {$_.Group}
    
    Write-Verbose "Remove the posts with duplicate file names from the feeditemsSelected array"
    $feeditemsSelected = @($feeditemsSelected | Where-Object {$duplicateVideoNames -notcontains $_})
    
    Write-Verbose "Change video names to filenames, check to see if they are downloaded already and added them back to the array with updated details"
    $duplicateVideoNames | foreach-object {
                                            $newDestination = Get-NewFileName $_.Title
                                            $_.Destination = $newDestination
                                            $_.AlreadyDownloaded = (Test-Path $newDestination)
                                            $feeditemsWithDetails += $_
                                          }
    
    Write-Verbose "Open Out-GridView to select vidoes to download"
    [array]$feeditemsSelected = $feeditemsWithDetails| Out-GridView -PassThru | 
        select AlreadyDownloaded,Title, Summary, Duration, Enclosure,Source,Destination
    
    Write-Verbose "Downloading videos"
    $feeditemsSelected |Where-Object{!(Test-Path $_.Destination)} | 
        select Source,Destination | 
            Start-BitsTransfer -Priority Normal | Out-Null
    
    Write-Verbose "Add all already downloaded items back to the list"
    $feeditemsWithDetails | where-object {$_.AlreadyDownloaded} | 
                                foreach-object {
                                                    if(-not [bool]($feeditemsSelected | Select-String $_.Title -Quiet))
                                                    {
                                                        $feeditemsSelected += $_
                                                    }
                                               }
    
    Write-Verbose "Create HTML Report"
    $feeditemsSelected | sort Name | Out-Null
    $html = $feeditemsSelected |?{Test-Path "$($_.Destination)"} | % {@"
         <H4><a href="$($_.Destination)">$($_.Title)</a></H4> 
         <H5>Speaker(s): $($_.creator)</H5>
         <H5>$($_.Summary)</H5>
    "@}
    
    Write-Verbose "Open HTML Report"
    ConvertTo-Html -Head "<h1>My Downloaded MMS Videos - $($feeditemsSelected.Count) Downloaded</h1>" -Body $html | 
        Out-File $Path\MyMMSContent.html;start "$Path\MyMMSContent.html"

    image

    Have fun!

  • Retrieving MMS 2013 Content Sessions using PowerShell

    In between my PowerShell activities, I’ll visiting the Microsoft Management Summit in Las Vegas next week. This week I’m delivering a PowerShell workshop in the Netherlands, and when returning from MMS I’ll again be teaching a PowerShell workshop before going to the PowerShell Summit in Redmond. So it’s going to be a busy month traveling to the US and back.

    While preparing my PowerShell workshop this week I wanted to have a look at the sessions for MMS 2013 and went to the Sessions catalog on the www.2013mms.com website.

    image

    Because I could not find an option to export all sessions to a Excel sheet, I created a PowerShell script which retrieves all sessions and makes it possible to export the result to a csv file using the Export-CSV cmdlet.

    If you want you can do many more fun things with the results, let me know what you created.

    Remarks:

    • Retrieving the website and getting the HTML Tag name elements can take some time to finish, be patient!
    • You need PowerShell v3 to run this script.
    
    #######################################################################################################################                        
    # Description:   Get-MMS2013 Sessions. This script retrieves the sessions from the http://www.2013mms.com website
    #                You need to have access to the website to retrieve the sessions. 
    #                Example usage: Export all sessions to cvs file using the export-csv cmdlet.
    #                Get-MMS2013Session.ps1 | export-csv -path c:\temp\mms2013sessions.csv -NoTypeInformation                
    # Author:        Stefan Stranger (Microsoft)            
    # Example usage: Run Get-MMS2013Session.ps1
    # Disclamer:     This program source code is provided "AS IS" without warranty representation or condition of any kind
    #                either express or implied, including but not limited to conditions or other terms of merchantability and/or
    #                fitness for a particular purpose. The user assumes the entire risk as to the accuracy and the use of this
    #                program code.
    # Date:          04-02-2013                        
    # Name:          Get-MMS2013Session.ps1            
    # Version:       v1.000 - 04-02-2013 - Stefan Stranger - initial release
    ########################################################################################################################
    
    
    $mms = Invoke-WebRequest -Uri "http://www.2013mms.com/Topic/List?format=html&Keyword=&Categories=&Timeslot=&Speaker=&Day=&Start=&Finish=&oc=&take=-1&skip=0&_=1364899913083"
    $sessions = $mms.ParsedHtml.getElementsByTagName("div") | Where "classname" -match "^topic" | Select -ExpandProperty InnerText
    
    foreach ($session in $sessions) {
        #$count++; $count; $session;
        $session = $session.split("`n",6);
        #Check Sessiontype.
        Switch -Wildcard ($session[0]) {
            '*-B*' {#Check for missing products
                if ($session[4] -like "Product(s)*"){
                $session | &{
                [pscustomobject]@{
                    Session = $session[0]
                    Speaker = $session[1]
                    Track = $session[2]
                    SessionType = $session[3]
                    Product= $session[4]
                    Description = $session[5]
                } #End pscustomobject
                } #end call
                } #end if
                else
                {
                    $session | &{
                    [pscustomobject]@{
                    Session = $session[0]
                    Speaker = $session[1]
                    Track = $session[2]
                    SessionType = $session[3]
                    Product= ""
                    Description = $session[4]
                    } #End pscustomobject
                    } #end call
                } #end else
            }
            '*-L*' {$session | &{
                [pscustomobject]@{
                    Session = $session[0]
                    Speaker = ""
                    Track = $session[1]
                    SessionType = $session[2]
                    Product = ""
                    Description = $session[3]
                } #End pscustomobject
                } #end call
            }
            '*-IL*' {$session | &{
                [pscustomobject]@{
                    Session = $session[0]
                    Speaker = ""
                    Track = $session[1]
                    SessionType = $session[2]
                    Product = ""
                    Description = $session[3]
                } #End pscustomobject
                } #end call
            }
            'BO*' {$session | &{
                [pscustomobject]@{
                    Session = $session[0]
                    Speaker = ""
                    Track = ""
                    SessionType = $session[1]
                    Product = ""
                    Description = $session[2]
                } #End pscustomobject
                } #end call
            }
            'EXM*' {$session | &{
                [pscustomobject]@{
                    Session = $session[0]
                    Speaker = $session[1]
                    Track = ""
                    SessionType = $session[2]
                    Product = $session[3]
                    Description = $session[4]
                } #End pscustomobject
                } #end call
            }
            'MMS*' {$session | &{
                [pscustomobject]@{
                    Session = $session[0]
                    Speaker = $session[1]
                    Track = ""
                    SessionType = $session[2]
                    Product = ""
                    Description = $session[3]
                } #End pscustomobject
                } #end call
            }
            'KEY*' {$session | &{
                [pscustomobject]@{
                    Session = $session[0]
                    Speaker = $session[1]
                    Track = ""
                    SessionType = $session[2]
                    Product = ""
                    Description = $session[3]
                } #End pscustomobject
                } #end call
            }
            'MSP*' {$session | &{
                [pscustomobject]@{
                    Session = $session[0]
                    Speaker = ""
                    Track = ""
                    SessionType = $session[1]
                    Product = ""
                    Description = $session[2]
                } #End pscustomobject
                } #end call
            }
            Default {#Write-Host "$($session[0]) session id not specified in script" -ForegroundColor Red;
                    $session | &{
                        [pscustomobject]@{
                        Session = $session[0]
                        Speaker = $session[1]
                        Track = ""
                        SessionType = $session[2]
                        Product = ""
                        Description = "$($session[0]) session id not specified in script"
                } #End pscustomobject
                } #end cal
                        }
    
        }
    }
    
    
    

    image

     

    image

    Do you want to contact me during MMS or the PowerShell summit just send me a message on Twitter and who knows we can talk about Operations Manager or PowerShell or some other great topic!