Powershell Script to list ALL videos in your 365 Stream environment
I hope this is useful to everyone.
My goal was to get a list of all videos in my stream so that I could contact each video creator about the changes that are coming to stream. Also so I could figure out how much work there was to do in moving, and how much video is created and not used.
Take a look a the comments I've put into the code for how to use this script.
I found that my original script gave me information about the videos but it was hard to use AND didn't tell me which videos were in which channels. This new version of Twan van Beers script gives me both.
Save the new code Oct 2022 as a PowerShell script e.g. get-stream-video-info.ps1 Then open a powershell screen, navigate to the folder get-stream-video-info.ps1 is in.
To run it enter .\get-stream-video-info.ps1 "C:\Temp\streamanalysis\stream7Oct22-getnbstreamvideoinfo.csv"
Follow the on screen prompts.
>>> New Code Oct 2022 <<<
using namespace System.Management.Automation.Host
[CmdletBinding()]
param (
[parameter(Position=0,Mandatory=$False)]
[string]$OutputCsvFileName,
[parameter(Position=1,Mandatory=$False)]
[switch]$OpenFileWhenComplete = $False
)
# ----------------------------------------
# How to use
<#--
Open a powershell window then type in the following and click enter
.\get-stream-video-info.ps1 "C:\Temp\streamanalysis\stream7Oct22-getnbstreamvideoinfo.csv"
You'll then be prompted for 3 options
[V] Videos [C] ChannelVideos [A] All [?] Help (default is "V"):
V - videos, which will get a list of all the videos in your STREAM environment.
NOTE you may need to alter the variables in the code if you have more than 1000s of videos
C - ChannelVideos, will get a list of all the videos and the channels they are in.
NOTE this returns a filtered view of all the videos associated with a channel
A - All, returns both the Videos and the ChannelVideos.
You'll then be prompted for a user to login to the STREAM portal with, this is so the script can get a security token to do it's work with.
Choose/use an account with full access to STREAM.
If you used a CSV file path after the script name, then this powershell script will export one or two CSV files based on the option chosen
<your folder path, your filename>-videos<your file ending>
and or
<your folder path, your filename>-channelVideos<your file ending>
If you don't want to export file names, this powershell creates objects you can use in other ways
V or A - will create an object $ExtractData, which is a list of every video and key properties for each video.
C or A - wil create an object $videosPerChannel, which lists key information about each video AND the channel they are part of.
----------------------------------------------------------------------------------------------
original source
my script
https://techcommunity.microsoft.com/t5/microsoft-stream-classic/powershell-script-to-list-all-videos-in-your-365-stream/m-p/1752149
which inspired Twan van Beers to write
https://neroblanco.co.uk/2022/02/get-list-of-videos-from-microsoft-stream/
I've then taken Twan's script and modified it to do what I require in my environment.
Namely - get the video information AND the channels they are part of. For my 1000 or so videos and 35 channels, it takes about 1 min to run using the All option.
This meant I was able to setup an intranet video library with a channel metadata column, folders per channel
(so i could give edit rights to channel owners, without opening up the entire library or having to use multiple libraries), and eventually
download the videos, then upload them into the library using ShareGate to reinstate some of the key metadata, i.e. created date, person who created them etc
--#>
# ----------------------------------------------------------------------------------------------
function Show-OAuthWindowStream {
param (
[string]$Url,
[string]$WindowTitle
)
$Source = `
@"
[DllImport("wininet.dll", SetLastError = true)]
public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength);
"@
$WebBrowser = Add-Type -memberDefinition $Source -passthru -name $('WebBrowser'+[guid]::newGuid().ToString('n'))
$INTERNET_OPTION_END_BROWSER_SESSION = 42
# Clear the current session
$WebBrowser::InternetSetOption([IntPtr]::Zero, $INTERNET_OPTION_END_BROWSER_SESSION, [IntPtr]::Zero, 0) | out-null
Add-Type -AssemblyName System.Windows.Forms
$Form = New-Object -TypeName System.Windows.Forms.Form -Property @{Width = 600; Height = 800 }
$Script:web = New-Object -TypeName System.Windows.Forms.WebBrowser -Property @{Width = 580; Height = 780; Url = ($URL -f ($Scope -join "%20")) }
$Web.ScriptErrorsSuppressed = $True
$Form.Controls.Add($Web)
$Featured = {
$Head = $Web.Document.GetElementsByTagName("head")[0];
$ScriptEl = $Web.Document.CreateElement("script");
$Element = $ScriptEl.DomElement;
# Javascript function to get the sessionInfo including the Token
$Element.text = `
@'
function CaptureToken() {
if( typeof sessionInfo === undefined ) {
return '';
} else {
outputString = '{';
outputString += '"AccessToken":"' + sessionInfo.AccessToken + '",';
outputString += '"TenantId":"' + sessionInfo.UserClaim.TenantId + '",';
outputString += '"ApiGatewayUri":"' + sessionInfo.ApiGatewayUri + '",';
outputString += '"ApiGatewayVersion":"' + sessionInfo.ApiGatewayVersion + '"';
outputString += '}';
return outputString;
}
}
'@;
$Head.AppendChild($ScriptEl);
$TenantInfoString = $Web.Document.InvokeScript("CaptureToken");
if( [string]::IsNullOrEmpty( $TenantInfoString ) -eq $False ) {
$TenantInfo = ConvertFrom-Json $TenantInfoString
if ($TenantInfo.AccessToken.length -ne 0 ) {
$Script:tenantInfo = $TenantInfo;
$Form.Controls[0].Dispose()
$Form.Close()
$Form.Dispose()
}
}
}
$Web.add_DocumentCompleted($Featured)
$Form.AutoScaleMode = 'Dpi'
$Form.ShowIcon = $False
$Form.Text = $WindowTitle
$Form.AutoSizeMode = 'GrowAndShrink'
$Form.StartPosition = 'CenterScreen'
$Form.Add_Shown( { $Form.Activate() })
$Form.ShowDialog() | Out-Null
write-output $Script:tenantInfo
}
# ----------------------------------------------------------------------------------------------
function Get-RequestedAssets([PSCustomObject]$Token, [string]$Url, [string]$Label) {
$Index = 0
$MainUrl = $Url
$AllItems = @()
do {
$RestUrl = $MainUrl.Replace("`$skip=0", "`$skip=$Index")
Write-Host " Fetching ... $($Index) to $($Index+100)"
$Items = @((Invoke-RestMethod -Uri $RestUrl -Headers $Token.headers -Method Get).value)
$AllItems += $Items
$Index += 100
} until ($Items.Count -lt 100)
Write-Host " Fetched $($AllItems.count) items"
$Assets = $AllItems | Select-Object `
@{Name='Type';Expression={$Label}},`
Id, Name,`
@{Name='Size(MB)';Expression={$_.AssetSize/1MB}}, `
PrivacyMode, State, VideoMigrationStatus, Published, PublishedDate, ContentType, Created, Modified, `
@{name='Media.Duration';Expression={$_.Media.Duration}},`
@{name='Media.Height';Expression={$_.Media.Height}},`
@{name='Media.Width';Expression={$_.Media.Width}},`
@{name='Media.isAudioOnly';Expression={$_.media.isAudioOnly}},`
@{name='Metrics.Comments';Expression={$_.Metrics.Comments}},`
@{name='Metrics.Likes';Expression={$_.Metrics.Likes}},`
@{name='Metrics.Views';Expression={$_.Metrics.Views}}, `
@{name='ViewVideoUrl';Expression={("https://web.microsoftstream.com/video/" + $_.Id)}}, `
@{name='VideoCreatorName';Expression={$_.creator.name}}, `
@{name='VideoCreatorEmail';Expression={$_.creator.mail}}, `
@{name='VideoDescription';Expression={$_.description}}
write-output $Assets
}
function Get-VideoChannels([PSCustomObject]$Token, [string]$Url, [string]$Label) {
#this will get the list of channels
$Index = 0
$MainUrl = $Url
$AllItems = @()
do {
$RestUrl = $MainUrl.Replace("`$skip=0", "`$skip=$Index")
Write-Host " Fetching ... $($Index) to $($Index+100)"
$Items = @((Invoke-RestMethod -Uri $RestUrl -Headers $Token.headers -Method Get).value)
$AllItems += $Items
$Index += 100
} until ($Items.Count -lt 100)
Write-Host " Fetched $($AllItems.count) items"
#to add properties to this section look at https://aase-1.api.microsoftstream.com/api/channels?$skip=0&$top=100&adminmode=true&api-version=1.4-private
$Channels = $AllItems | Select-Object `
@{Name='Type';Expression={$Label}},`
Id, Name, Description,`
@{Name='MetricsVideos';Expression={$_.metrics.videos}}
#write-host $channels.count
write-output $Channels
}
function Get-channelVideos([PSCustomObject]$Token, [PSCustomObject]$allChannels, [string]$Label) {
#this will get the list of channels
$MainUrl = "https://aase-1.api.microsoftstream.com/api/channels/ChannelIDToSwap/videos?`$top=50&`$skip=0&`$filter=published%20and%20(state%20eq%20%27completed%27%20or%20contentSource%20eq%20%27livestream%27)&`$expand=creator,events&adminmode=true&`$orderby=name%20asc&api-version=1.4-private"
#for each channel URL go through all the videos, capture the channel name against the video id and name
$allVideosPerChannel = @()
foreach($chan in $allChannels) {
$thisChannelid = $chan.id
$chanUrl = @( $MainUrl.Replace("ChannelIDToSwap", $thisChannelid) )
$chanName = $chan.name
$AllItems = ""
$items = ""
$thischanvideos = ""
$Index = 0
#write-host $chanUrl
#loop the index
do {
$RestUrl = $chanUrl.Replace("`$skip=0", "`$skip=$Index")
#write-host $restUrl
#Write-Host "$chanName | Fetching ... $($Index) to $($Index+50)"
$Items = @((Invoke-RestMethod -Uri $RestUrl -Headers $Token.headers -Method Get).value)
$allItems = $items | select id,name, @{Name='Channel';Expression={$chanName}},@{Name='Type';Expression={$Label}}
#write-host $allItems.count
#foreach($x in $items ) {
# write-host $x.name
#write-host $x.id
#write-host $label
#write-host $chanName
#}
$Index += 50
} until ($Items.Count -lt 100)
#got videos into $items, now mist with $chan info and put into $allVideosPerChannel object
$allVideosPerChannel += $AllItems
$AllItems = ""
$items = ""
}
Write-Host " Fetched $($allVideosPerChannel.count) videos in $($allChannels.count) channels"
#to add properties to this section look at https://aase-1.api.microsoftstream.com/api/channels?$skip=0&$top=100&adminmode=true&api-version=1.4-private
write-output $allVideosPerChannel
}
# ----------------------------------------------------------------------------------------------
function Get-StreamToken() {
$TenantInfo = Show-OAuthWindowStream -url "https://web.microsoftstream.com/?noSignUpCheck=1" -WindowTitle "Please login to Microsoft Stream ..."
$Token = $TenantInfo.AccessToken
$Headers = @{
"Authorization" = ("Bearer " + $Token)
"accept-encoding" = "gzip, deflate, br"
}
$UrlTenant = $TenantInfo.ApiGatewayUri
$ApiVersion = $TenantInfo.ApiGatewayVersion
$UrlBase = "$UrlTenant{0}?`$skip=0&`$top=100&adminmode=true&api-version=$ApiVersion"
$RequestToken = [PSCustomObject]::new()
$RequestToken | Add-Member -Name "token" -MemberType NoteProperty -Value $Token
$RequestToken | Add-Member -Name "headers" -MemberType NoteProperty -Value $Headers
$RequestToken | Add-Member -Name "tenantInfo" -MemberType NoteProperty -Value $TenantInfo
$Urls = [PSCustomObject]::new()
$RequestToken | Add-Member -Name "urls" -MemberType NoteProperty -Value $Urls
$RequestToken.urls | Add-Member -Name "Videos" -MemberType NoteProperty -Value ($UrlBase -f "videos")
$RequestToken.urls | Add-Member -Name "Channels" -MemberType NoteProperty -Value ($UrlBase -f "channels")
$RequestToken.urls | Add-Member -Name "Groups" -MemberType NoteProperty -Value ($UrlBase -f "groups")
$UrlBase = $UrlBase.replace("`$skip=0&", "")
$RequestToken.urls | Add-Member -Name "Principals" -MemberType NoteProperty -Value ($UrlBase -f "principals")
write-output $RequestToken
}
function New-Menu {
[CmdletBinding()]
param(
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[string]$Title,
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[string]$Question
)
$videos = [ChoiceDescription]::new('&Videos', 'Videos')
$channelvideos = [ChoiceDescription]::new('&ChannelVideos', 'All Videos by Channel')
$all = [ChoiceDescription]::new('&All', 'All videos AND all videos by channel')
$options = [ChoiceDescription[]]($videos, $channelvideos, $all)
$result = $host.ui.PromptForChoice($Title, $Question, $options, 0)
switch ($result) {
0 { 'Videos' }
1 { 'ChannelVideos' }
2 { 'All' }
}
}
$menuoutome = New-Menu -title 'Stream videos' -question 'What do you want to output?'
#write-host $menuoutome
$StreamToken = Get-StreamToken
$urlQueryToUse = $StreamToken.Urls.Videos
#default $StreamToken.Urls.Videos is something like https://aase-1.api.microsoftstream.com/api/videos?$skip=900&$top=100&adminmode=true&api-version=1.4-private
#To get creator and event details you need to add $expand=creator,events to the URL , not to do that you need to use &`$expand=creator,events with out the ` powershell thinks $expand is a variable.
# e.g. use
$urlQueryToUse = $StreamToken.Urls.Videos+"&`$expand=creator,events"
#Other option
# use the following if you want to only see files that have privacymode eq 'organization' i.e. video is visible to EVERYONE in the organisation
# Thanks to Ryechz for this
#
# $urlQueryToUse = $StreamToken.Urls.Videos + "&orderby=publishedDate%20desc&`$expand=creator,events&`$filter=published%20and%20(state%20eq%20%27Completed%27%20or%20contentSource%20eq%20%27livestream%27)%20and%20privacymode%20eq%20%27organization%27%20"
if($menuoutome -eq 'Videos' -Or $menuoutome -eq 'All'){
#modify the -URL submitted to get more data or filter data or order the output
$ExtractData = Get-RequestedAssets -token $StreamToken -Url $urlQueryToUse -Label "Videos"
write-host ""
write-host "The `$ExtractData object contains all the details about each video. Use `$ExtractData[0] to see the first item in the object, and it's properties."
if( $OutputCsvFileName ) {
$thisOutputCsvFileName = $OutputCsvFileName.replace(".csv", '-'+$menuoutome+'-videos.csv')
$ExtractData | Export-CSV $thisOutputCsvFileName -NoTypeInformation -Encoding UTF8
write-host "The following file has been created: $thisOutputCsvFileName"
if( $OpenFileWhenComplete ) {
Invoke-Item $thisOutputCsvFileName
}
}
}
if($menuoutome -eq 'ChannelVideos' -Or $menuoutome -eq 'All'){
#Get the list of channels , filter the result for the channel id and name
$channelList = Get-VideoChannels -token $StreamToken -Url $StreamToken.Urls.Channels -Label "Channels"
#for each channel get the videos that are in that channel, so that we can match them up to the ExtractData , which is the list of all videos)
$videosPerChannel = get-channelvideos -token $StreamToken -allChannels $channelList -Label "ChannelVideos"
write-host ""
write-host "The `$videosPerChannel object contains key information about each video and the channel it is in. Use `$videosPerChannel[0] to see the first video, and it's properties."
write-host "The `$channelList object contains a list of channel's and their properties."
if( $OutputCsvFileName ) {
$thisOutputCsvFileName = $OutputCsvFileName.replace(".csv", '-'+$menuoutome+'-channelVideos.csv')
$videosPerChannel | Export-CSV $thisOutputCsvFileName -NoTypeInformation -Encoding UTF8
write-host "The following file has been created: $thisOutputCsvFileName"
if( $OpenFileWhenComplete ) {
Invoke-Item $thisOutputCsvFileName
}
}
}
>>> Original Code Oct 2020 <<<
I've left this here in case it is useful to anyone. See the script above for a better solution.
That said this solution relies on you knowing a bit about PowerShell, being a Stream Admin and being happy to manually save some files (I couldn't figure out how to do pass through windows authentication for the script) so you have to manually save each paged JSON file of 100 videos.
It took me about 20minutes to export information about 591 videos (about 3 hours to make the script).
To use the script
update each variable marked with #<<<< Update this value
in a normal (not admin) powershell window run the script (i copy and paste logical parts into the powershell window)
you will be given several urls, to visit and save the JSON files from
once you have the JSON files the final part of the script reads those, and exports a CSV file with a row per video in STREAM
NOTE : as an admin you see all videos, so before you share the CSV with others be aware that there may be sensitive information in it that most users can't see due to STREAM's in built security.
I don't have much time, hence I made this script so please don't expect quick answers to any questions. This script is rough, use it if it helps, but ... be professional and check it before you use it.
##>> Update 5 Aug 2021 <<##
Thanks to everyone who has commented, I've updated the code below with your suggestions
You still have to manually save the JSON browser tabs that show up as JSON files into a folder, but other than that I hope it is now easier for you to use 🙂
#reference https://techcommunity.microsoft.com/t5/microsoft-stream-forum/powershell-script-to-audit-and-export-channel-content-details-of/m-p/354832
# goal of this script
#- get list of all videos in stream for analysis
#- it takes about 20 minutes to do this for 500 stream videos.
#First
# find out what your api source is
# go to the following URL in chrome as an admin of Stream https://web.microsoftstream.com/browse
# using Developer tools look at the "console" search for .api.microsoftstream to find out what is between https:// and .api.microsoftstream in my case https://aase-1.api.microsoftstream.com/api/
[string]$rootAPIlocation = "aase-1" #<<<< Update this value to the one you find in the console view
#[string]$rootAPIlocation = "uswe-1" # use this for Western US
#[string]$rootAPIlocation = "euno-1" # use this for the Europe North region
#enter where you on your computer you want the files to go
[string]$PowerShellScriptFolder = "C:\Temp\streamanalysis" #<<<< Update this value
#json files will be saved into "VideosJSON" folder
[string]$streamJSONfolder = Join-Path -Path $PowerShellScriptFolder -ChildPath "VideosJSON" #<<<< Update this value if you want a different folder name
#>>> REMOVES all exiisting JSON files <<<<
#remove all JSON items in this folder
Remove-Item -path $streamJSONfolder\* -include *.json -Force -Recurse
#guess approx number of videos you think you have divide by 100 e.g. 9 = 900 videos
[int]$Loopnumber = 9 #<<<< Update this value
#put in your stream portal url
[string]$StreamPortal = "https://web.microsoftstream.com/?NoSignUpCheck=1"
#put in the url where you see all videos from in stream
[string]$StreamPortalVideoRoot = "https://web.microsoftstream.com/browse/" #$StreamPortalChannelRootForFindingVideos
[string]$StreamPortalVideoViewRoot= "https://web.microsoftstream.com/video/" # for watching a video
#this builds from the info you've put in a URL which will give back the JSON info about all your videos.
[string]$StreamAPIVideos100 = "https://$rootAPIlocation.api.microsoftstream.com/api/videos?NoSignUpCheck=1&`$top=100&`$orderby=publishedDate%20desc&`$expand=creator,events&`$filter=published%20and%20(state%20eq%20%27Completed%27%20or%20contentSource%20eq%20%27livestream%27)&adminmode=true&api-version=1.4-private&`$skip=0" #$StreamAPIVideos100
# use the following if you want to only see files that have privacymode eq 'organization' i.e. video is visible to EVERYONE in the organisation
#Thanks to Ryechz for this
#
# [string]$StreamAPIVideos100 = "https://$rootAPIlocation.api.microsoftstream.com/api/videos?NoSignUpCheck=1&`$top=100&`$orderby=publishedDate%20desc&`$expand=creator,events&`$filter=published%20and%20(state%20eq%20%27Completed%27%20or%20contentSource%20eq%20%27livestream%27)%20and%20privacymode%20eq%20%27organization%27%20&adminmode=true&api-version=1.4-private&`$skip=0"
[int]$skipCounter
[int]$skipCounterNext = $skipCounter+100
[string]$fileName = "jsonfor-$skipCounter-to-$skipCounterNext.json"
#next section creates the URLS you need to manually download the json from , it was too hard to figure out how to do this programatically with authentication.
Write-Host " Starting Chrome Enter your credentials to load O365 Stream portal" -ForegroundColor Magenta
#Thanks Conrad Murray for this tip
Start-Process -FilePath 'chrome.exe' -ArgumentList $StreamPortal
Read-Host -Prompt "Press Enter to continue ...."
Write-host " -----------------------------------------" -ForegroundColor Green
Write-host " --Copy and past each url into chrome-----" -ForegroundColor Green
Write-host " --save JSON output into $streamJSONfolder" -ForegroundColor Green
for($i=0;$i -lt $Loopnumber; $i++) {
$skipCounter = $i*100
if($skipCounter -eq 0) {
write-host $StreamAPIVideos100
Start-Process -FilePath 'chrome.exe' -ArgumentList $StreamAPIVideos100
} else {
write-host $StreamAPIVideos100.replace("skip=0","skip=$skipCounter")
#following code opens browser tabs for each of the jsonfiles
#Thanks Conrad Murray for this tip
Start-Process -FilePath 'chrome.exe' -ArgumentList $StreamAPIVideos100.replace("skip=0","skip=$skipCounter")
}
}
Write-host " --save each browser window showing JSON output into $streamJSONfolder" -ForegroundColor Green
Write-host " -----------------------------------------------------------------------------------" -ForegroundColor Green
Write-host " -----------------------------------------" -ForegroundColor Green
Read-Host -Prompt "Press Enter to continue ...."
Write-host " -----------------------------------------" -ForegroundColor Green
$JSONFiles = Get-ChildItem -Path $streamJSONfolder -Recurse -Include *.json
[int]$videoscounter = 0
$VideosjsonAggregateddata=@()
$data=@()
foreach($fileItem in $JSONFiles)
{
Write-host " -----------------------------------------" -ForegroundColor Green
Write-Host " =====>>>> getting content of JSON File:", $fileItem, "- Path:", $fileItem.FullName -ForegroundColor Yellow
$Videosjsondata = Get-Content -Raw -Path $fileItem.FullName | ConvertFrom-Json
$VideosjsonAggregateddata += $Videosjsondata
Write-host " -----------------------------------------" -ForegroundColor Green
#Write-Host " =====>>>> Channel JSON Raw data:", $Videosjsondata -ForegroundColor green
#Read-Host -Prompt "Press Enter to continue ...."
}
write-host "You have " $VideosjsonAggregateddata.value.count " videos in Stream , using these selection criteria"
foreach($myVideo in $VideosjsonAggregateddata.value)
{
$videoscounter += 1
$datum = New-Object -TypeName PSObject
Write-host " -----------------------------------------" -ForegroundColor Green
Write-Host " =====>>>> Video (N°", $videoscounter ,") ID:", $myVideo.id -ForegroundColor green
Write-Host " =====>>>> Video Name:", $myVideo.name," created:", $myVideo.created,"- modified:", $myVideo.modified -ForegroundColor green
Write-Host " =====>>>> Video Metrics views:", $myVideo.metrics.views, "- comments:", $myVideo.metrics.comments -ForegroundColor Magenta
Write-Host " =====>>>> Video Creator Name: ", $myVideo.creator.name , " - Email:", $myVideo.creator.mail -ForegroundColor Magenta
Write-Host " =====>>>> Video Description: ", $myVideo.description -ForegroundColor Magenta
$datum | Add-Member -MemberType NoteProperty -Name VideoID -Value $myVideo.id
$datum | Add-Member -MemberType NoteProperty -Name VideoName -Value $myVideo.name
$datum | Add-Member -MemberType NoteProperty -Name VideoURL -Value $($StreamPortalVideoViewRoot + $myVideo.id)
$datum | Add-Member -MemberType NoteProperty -Name VideoCreatorName -Value $myVideo.creator.name
$datum | Add-Member -MemberType NoteProperty -Name VideoCreatorEmail -Value $myVideo.creator.mail
$datum | Add-Member -MemberType NoteProperty -Name VideoCreationDate -Value $myVideo.created
$datum | Add-Member -MemberType NoteProperty -Name VideoModificationDate -Value $myVideo.modified
$datum | Add-Member -MemberType NoteProperty -Name VideoLikes -Value $myVideo.metrics.likes
$datum | Add-Member -MemberType NoteProperty -Name VideoViews -Value $myVideo.metrics.views
$datum | Add-Member -MemberType NoteProperty -Name VideoComments -Value $myVideo.metrics.comments
#the userData value is for the user running the JSON query i.e. did that user view this video. It isn't for information about all users who may have seen this video. There seems to be no information about that other than, total views = metrics.views
#$datum | Add-Member -MemberType NoteProperty -Name VideoComments -Value $myVideo.userData.isViewed
$datum | Add-Member -MemberType NoteProperty -Name Videodescription -Value $myVideo.description
#thanks Johnathan Ogden for these values
$datum | Add-Member -MemberType NoteProperty -Name VideoDuration -Value $myVideo.media.duration
$datum | Add-Member -MemberType NoteProperty -Name VideoHeight -Value $myVideo.media.height
$datum | Add-Member -MemberType NoteProperty -Name VideoWidth -Value $myVideo.media.width
$datum | Add-Member -MemberType NoteProperty -Name VideoIsAudioOnly -Value $myVideo.media.isAudioOnly
$datum | Add-Member -MemberType NoteProperty -Name VideoContentType -Value $myVideo.contentType
$data += $datum
}
$datestring = (get-date).ToString("yyyyMMdd-hhmm")
$csvfileName = ($PowerShellScriptFolder + "\O365StreamVideoDetails_" + $datestring + ".csv") #<<<< Update this value if you want a different file name
Write-host " -----------------------------------------" -ForegroundColor Green
Write-Host (" >>> writing to file {0}" -f $csvfileName) -ForegroundColor Green
$data | Export-csv $csvfileName -NoTypeInformation
Write-host " ------------------ DONE -----------------------" -ForegroundColor Green
Disclaimer : You can use that solution as you want and modify it depending of your case.
Anyone looking at this script should also look at the PowerShell script that was released by Microsoft as part of the Stream (Classic) migration tools. The PowerShell script released by Microsoft can be downloaded directly from Stream (Classic) admin page and also has a PowerBI Desktop template that can be used to analyze the output CSVs.
See this part of the migration help articles for more info:
Dorje-McKinnon Hi, I've used this script a few times this year with no problem. Thank you so much for this resource. For some reason, my results only go up to September 25 of this year (2023). Is there a way I can modify the script to search further or is this a result of Microsoft automatically saving stream videos on sharepoint as of that time?
Is there a way to use your script above to (1) find which group does a channel belong to, and (2) set via PowerShell the video in the channel to be owned by the group's channel?
Dorje-McKinnon.. thank you for sharing teh script .. it works Great.. I am looking to get iFrame url as well for all the videos we have in Stream Classic.. is there a way to get the same or you can help me with the parameter that should be used to get the iFrame urls, thanks in advance.
Hi chetan1920 , I'm sorry I don't know AND I've just turned off our Classic Stream instance so I don't have any examples I could figure it out from. Have a look at the page with the iframe and figure out what the formula /pattern of the iFrame URLs is. Then you may be able to use a concatenate function to build the URL. My guess is that there is only one part of the URL that changes for every video, possibly the ID or GUID
Dorje-McKinnon Thanks for this script. My colleague Conrad has been using it a number of times. He asked me to improve this idea to avoid the copy/paste pieces. So I spent half a day and came up with Get List of Videos from Microsoft Stream - Nero Blanco It basically does the same thing as what you're doing but uses a scraping technique to get the date center and access token, so then it can loop through the videos without interaction!
Hi Twan van Beers ,thanks so much for your comment and blog post. Thanks also to ConradMurray for prompting you to work on this problem. I've just updated the code at the top of this script to a slight variation on your code, to give me the detail I needed.
Hi Twan, thanks for mentioning @Dorje and me on your blog entry . Just a quick correction: "MS must have removed the JSON object from their pages" that's not actually true or else the script would never work. The problem is that the page cycle order changed in the old stream portal, there's no validation on the session info which was why the script failed in some of the tenants. Im updating https://bit.ly/PnPScriptSamplesMSStream sample on the pnp repo, but I was wondering if you would like to do it, instead of me 😛 ? PnP Script Samples (https://pnp.github.io/script-samples/) is a community drive open source project and we are always keen to have more contributions.
The error in the console was object JSON is undefined, and when I try to execute console commands in the debugger that object JSON definitely doesn't exist at all.
I'm ok to update it, just didn't want to replace someone else's work 🙂
Worked a charm again. Thanks, updates have been good. I think some users of the script might be trying to skip a few steps like setting the API Source in the script - most important otherwise your browser pages will 403. The save locations and then knowing that when the script pauses that you have to copy paste the browser page text into your OWN text files with a .json extension. Do all that, and you should be good to know. One thing I still really need is the file sizes though, any updates on that?
Get-StreamToken : The term 'Get-StreamToken' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:3 char:33 + $streamTokenConfiguration = Get-StreamToken -Tenant $Tenant -Cred ... + ~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (Get-StreamToken:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
Get-RequestedAssets : The term 'Get-RequestedAssets' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:4 char:18 + $allVideos = Get-RequestedAssets -token $streamTokenConfiguration ... + ~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (Get-RequestedAssets:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
Export-ReportAssets : The term 'Export-ReportAssets' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:5 char:5 + Export-ReportAssets -assets $allVideos -label "Videos"-fileName " ... + ~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (Export-ReportAssets:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
Export-ReportAssets : The term 'Export-ReportAssets' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:7 char:5 + Export-ReportAssets -assets $videosNotMigrated -label "VideosNotM ... + ~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (Export-ReportAssets:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
Thanks Dorje for this amazing script. This is going to help tremendously as we are migrating tenants.
Has anyone found a way to mass download the videos? We have folks that have left the company with lots of videos but doing them 1 by one would be painful.
Resources
"}},"componentScriptGroups({\"componentId\":\"custom.widget.MicrosoftFooter\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"cachedText({\"lastModified\":\"1745505309992\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1745505309992"}],"cachedText({\"lastModified\":\"1745505309992\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/QueryHandler\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1745505309992"}],"cachedText({\"lastModified\":\"1745505309992\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/EscalatedMessageBanner\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/EscalatedMessageBanner-1745505309992"}],"cachedText({\"lastModified\":\"1745505309992\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1745505309992"}],"cachedText({\"lastModified\":\"1745505309992\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserRank\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserRank-1745505309992"}],"cachedText({\"lastModified\":\"1745505309992\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTime\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTime-1745505309992"}],"cachedText({\"lastModified\":\"1745505309992\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSolvedBadge\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSolvedBadge-1745505309992"}],"cachedText({\"lastModified\":\"1745505309992\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1745505309992"}],"cachedText({\"lastModified\":\"1745505309992\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1745505309992"}],"cachedText({\"lastModified\":\"1745505309992\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageCustomFields\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageCustomFields-1745505309992"}],"cachedText({\"lastModified\":\"1745505309992\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageReplyButton\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageReplyButton-1745505309992"}],"cachedText({\"lastModified\":\"1745505309992\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSolutionList\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSolutionList-1745505309992"}],"messages({\"constraints\":{\"solution\":{\"eq\":true},\"topicId\":{\"eq\":\"message:1752149\"}},\"first\":10,\"sorts\":{\"postTime\":{\"direction\":\"ASC\"}}})":{"__typename":"MessageConnection","edges":[{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MXxpbnQsMzY1OTIyNiwzNjU5MjI2","node":{"__ref":"AcceptedSolutionMessage:message:3659226"}}],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null},"totalCount":1},"cachedText({\"lastModified\":\"1745505309992\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1745505309992"}],"cachedText({\"lastModified\":\"1745505309992\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/ranks/UserRankLabel\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1745505309992"}],"cachedText({\"lastModified\":\"1745505309992\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/AcceptedSolutionButton\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/AcceptedSolutionButton-1745505309992"}],"cachedText({\"lastModified\":\"1745505309992\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/Pager/PagerLoadMore\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1745505309992"}],"cachedText({\"lastModified\":\"1745505309992\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/Pager/PagerLoadMorePreviousNextLinkable\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMorePreviousNextLinkable-1745505309992"}],"message({\"id\":\"message:3659226\"})":{"__ref":"AcceptedSolutionMessage:message:3659226"},"message({\"id\":\"message:4000471\"})":{"__ref":"ForumReplyMessage:message:4000471"},"message({\"id\":\"message:3943033\"})":{"__ref":"ForumReplyMessage:message:3943033"},"message({\"id\":\"message:3944547\"})":{"__ref":"ForumReplyMessage:message:3944547"},"message({\"id\":\"message:3718073\"})":{"__ref":"ForumReplyMessage:message:3718073"},"message({\"id\":\"message:3103718\"})":{"__ref":"ForumReplyMessage:message:3103718"},"message({\"id\":\"message:3103742\"})":{"__ref":"ForumReplyMessage:message:3103742"},"message({\"id\":\"message:3090959\"})":{"__ref":"ForumReplyMessage:message:3090959"},"message({\"id\":\"message:3094850\"})":{"__ref":"ForumReplyMessage:message:3094850"},"message({\"id\":\"message:3073392\"})":{"__ref":"ForumReplyMessage:message:3073392"},"message({\"id\":\"message:3061608\"})":{"__ref":"ForumReplyMessage:message:3061608"},"message({\"id\":\"message:2991445\"})":{"__ref":"ForumReplyMessage:message:2991445"},"message({\"id\":\"message:2994471\"})":{"__ref":"ForumReplyMessage:message:2994471"},"message({\"id\":\"message:2994727\"})":{"__ref":"ForumReplyMessage:message:2994727"},"message({\"id\":\"message:2978459\"})":{"__ref":"ForumReplyMessage:message:2978459"},"message({\"id\":\"message:3785646\"})":{"__ref":"ForumReplyMessage:message:3785646"},"message({\"id\":\"message:3604370\"})":{"__ref":"ForumReplyMessage:message:3604370"},"message({\"id\":\"message:3646586\"})":{"__ref":"ForumReplyMessage:message:3646586"},"message({\"id\":\"message:3103436\"})":{"__ref":"ForumReplyMessage:message:3103436"},"message({\"id\":\"message:3650566\"})":{"__ref":"ForumReplyMessage:message:3650566"},"message({\"id\":\"message:3061256\"})":{"__ref":"ForumReplyMessage:message:3061256"},"message({\"id\":\"message:3094855\"})":{"__ref":"ForumReplyMessage:message:3094855"},"message({\"id\":\"message:3073379\"})":{"__ref":"ForumReplyMessage:message:3073379"},"message({\"id\":\"message:3098755\"})":{"__ref":"ForumReplyMessage:message:3098755"},"message({\"id\":\"message:3061424\"})":{"__ref":"ForumReplyMessage:message:3061424"},"cachedText({\"lastModified\":\"1745505309992\",\"locale\":\"en-US\",\"namespaces\":[\"components/tags/TagView/TagViewChip\"]})":[{"__ref":"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1745505309992"}]},"CachedAsset:pages-1745160780925":{"__typename":"CachedAsset","id":"pages-1745160780925","value":[{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"UserBlogPermissions.Page","type":"COMMUNITY","urlPath":"/c/user-blog-permissions/page","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"TkbViewAllArticlesPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId/all-articles/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1730819800000,"localOverride":null,"page":{"id":"AllEvents","type":"CUSTOM","urlPath":"/Events","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"MaintenancePage","type":"COMMUNITY","urlPath":"/maintenance","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"IdeaPostPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1730819800000,"localOverride":null,"page":{"id":"CommunityHub.Page","type":"CUSTOM","urlPath":"/Directory","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"ResetPasswordPage","type":"USER","urlPath":"/resetpassword/:userId/:resetPasswordToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1730819800000,"localOverride":null,"page":{"id":"AllBlogs.Page","type":"CUSTOM","urlPath":"/blogs","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745160780925,"localOverride":null,"page":{"id":"GroupHubPostPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"}],"localOverride":false},"CachedAsset:text:en_US-components/context/AppContext/AppContextProvider-0":{"__typename":"CachedAsset","id":"text:en_US-components/context/AppContext/AppContextProvider-0","value":{"noCommunity":"Cannot find community","noUser":"Cannot find current user","noNode":"Cannot find node with id {nodeId}","noMessage":"Cannot find message with id {messageId}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-0":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-0","value":{"title":"Loading..."},"localOverride":false},"User:user:-1":{"__typename":"User","id":"user:-1","uid":-1,"login":"Deleted","email":"","avatar":null,"rank":null,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":"ANONYMOUS","registrationTime":null,"confirmEmailStatus":false,"registrationAccessLevel":"VIEW","ssoRegistrationFields":[]},"ssoId":null,"profileSettings":{"__typename":"ProfileSettings","dateDisplayStyle":{"__typename":"InheritableStringSettingWithPossibleValues","key":"layout.friendly_dates_enabled","value":"false","localValue":"true","possibleValues":["true","false"]},"dateDisplayFormat":{"__typename":"InheritableStringSetting","key":"layout.format_pattern_date","value":"MMM dd yyyy","localValue":"MM-dd-yyyy"},"language":{"__typename":"InheritableStringSettingWithPossibleValues","key":"profile.language","value":"en-US","localValue":"en","possibleValues":["en-US"]}},"deleted":false},"Theme:customTheme1":{"__typename":"Theme","id":"customTheme1"},"Category:category:MicrosoftStream":{"__typename":"Category","id":"category:MicrosoftStream","entityType":"CATEGORY","displayId":"MicrosoftStream","nodeType":"category","depth":3,"title":"Microsoft Stream","shortTitle":"Microsoft Stream","parent":{"__ref":"Category:category:products-services"}},"Category:category:top":{"__typename":"Category","id":"category:top","displayId":"top","nodeType":"category","depth":0,"title":"Top","entityType":"CATEGORY","shortTitle":"Top"},"Category:category:communities":{"__typename":"Category","id":"category:communities","displayId":"communities","nodeType":"category","depth":1,"parent":{"__ref":"Category:category:top"},"title":"Communities","entityType":"CATEGORY","shortTitle":"Communities"},"Category:category:products-services":{"__typename":"Category","id":"category:products-services","displayId":"products-services","nodeType":"category","depth":2,"parent":{"__ref":"Category:category:communities"},"title":"Products","entityType":"CATEGORY","shortTitle":"Products"},"Forum:board:StreamForum":{"__typename":"Forum","id":"board:StreamForum","entityType":"FORUM","displayId":"StreamForum","nodeType":"board","depth":4,"conversationStyle":"FORUM","title":"Microsoft Stream (Classic) and migration","description":"","avatar":null,"profileSettings":{"__typename":"ProfileSettings","language":null},"parent":{"__ref":"Category:category:MicrosoftStream"},"ancestors":{"__typename":"CoreNodeConnection","edges":[{"__typename":"CoreNodeEdge","node":{"__ref":"Community:community:gxcuf89792"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:communities"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:products-services"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:MicrosoftStream"}}]},"userContext":{"__typename":"NodeUserContext","canAddAttachments":false,"canUpdateNode":false,"canPostMessages":false,"isSubscribed":false},"boardPolicies":{"__typename":"BoardPolicies","canPublishArticleOnCreate":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","args":[]}}},"shortTitle":"Microsoft Stream (Classic) and migration","repliesProperties":{"__typename":"RepliesProperties","sortOrder":"REVERSE_PUBLISH_TIME","repliesFormat":"threaded"},"eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/","tagProperties":{"__typename":"TagNodeProperties","tagsEnabled":{"__typename":"PolicyResult","failureReason":null}},"requireTags":false,"tagType":"FREEFORM_AND_PRESET"},"Rank:rank:34":{"__typename":"Rank","id":"rank:34","position":15,"name":"Steel Contributor","color":"333333","icon":null,"rankStyle":"TEXT"},"User:user:228833":{"__typename":"User","id":"user:228833","uid":228833,"login":"Dorje-McKinnon","deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS0yMjg4MzMtMTE2MTcxaTFFRjc2RkJBREI1NUJCQjQ"},"rank":{"__ref":"Rank:rank:34"},"email":"","messagesCount":249,"biography":null,"topicsCount":46,"kudosReceivedCount":98,"kudosGivenCount":32,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2018-10-16T12:53:25.134-07:00","confirmEmailStatus":null},"followersCount":null,"solutionsCount":7,"entityType":"USER","eventPath":"community:gxcuf89792/user:228833"},"ForumTopicMessage:message:1752149":{"__typename":"ForumTopicMessage","uid":1752149,"subject":"Powershell Script to list ALL videos in your 365 Stream environment","id":"message:1752149","revisionNum":3,"repliesCount":73,"author":{"__ref":"User:user:228833"},"depth":0,"hasGivenKudo":false,"board":{"__ref":"Forum:board:StreamForum"},"conversation":{"__ref":"Conversation:conversation:1752149"},"readOnly":false,"editFrozen":false,"moderationData":{"__ref":"ModerationData:moderation_data:1752149"},"body":"
I hope this is useful to everyone.
My goal was to get a list of all videos in my stream so that I could contact each video creator about the changes that are coming to stream. Also so I could figure out how much work there was to do in moving, and how much video is created and not used.
Take a look a the comments I've put into the code for how to use this script.
I found that my original script gave me information about the videos but it was hard to use AND didn't tell me which videos were in which channels. This new version of Twan van Beers script gives me both.
Save the new code Oct 2022 as a PowerShell script e.g. get-stream-video-info.ps1 Then open a powershell screen, navigate to the folder get-stream-video-info.ps1 is in.
To run it enter .\\get-stream-video-info.ps1 \"C:\\Temp\\streamanalysis\\stream7Oct22-getnbstreamvideoinfo.csv\"
Follow the on screen prompts.
>>> New Code Oct 2022 <<<
using namespace System.Management.Automation.Host\n\n[CmdletBinding()]\nparam (\n [parameter(Position=0,Mandatory=$False)] \n [string]$OutputCsvFileName,\n\n [parameter(Position=1,Mandatory=$False)] \n [switch]$OpenFileWhenComplete = $False\n)\n\n\n# ----------------------------------------\n#\tHow to use\n<#--\n\tOpen a powershell window then type in the following and click enter\n\t\t.\\get-stream-video-info.ps1 \"C:\\Temp\\streamanalysis\\stream7Oct22-getnbstreamvideoinfo.csv\"\n\t\t\n\tYou'll then be prompted for 3 options\n\t[V] Videos [C] ChannelVideos [A] All [?] Help (default is \"V\"): \n\t\tV - videos, which will get a list of all the videos in your STREAM environment.\n\t\t\tNOTE you may need to alter the variables in the code if you have more than 1000s of videos\n\t\tC - ChannelVideos, will get a list of all the videos and the channels they are in.\n\t\t\tNOTE this returns a filtered view of all the videos associated with a channel\n\t\tA - All, returns both the Videos and the ChannelVideos.\n\t\t\n\tYou'll then be prompted for a user to login to the STREAM portal with, this is so the script can get a security token to do it's work with.\n\tChoose/use an account with full access to STREAM.\n\t\t\n\tIf you used a CSV file path after the script name, then this powershell script will export one or two CSV files based on the option chosen\n\t\t<your folder path, your filename>-videos<your file ending>\n\t\tand or\n\t\t<your folder path, your filename>-channelVideos<your file ending>\n\t\t\t\n\tIf you don't want to export file names, this powershell creates objects you can use in other ways\n\t\tV or A - will create an object $ExtractData, which is a list of every video and key properties for each video.\n\t\tC or A - wil create an object $videosPerChannel, which lists key information about each video AND the channel they are part of.\n\n\n ----------------------------------------------------------------------------------------------\n\toriginal source\n\tmy script \n\thttps://techcommunity.microsoft.com/t5/microsoft-stream-classic/powershell-script-to-list-all-videos-in-your-365-stream/m-p/1752149\n\n\twhich inspired Twan van Beers to write\n\thttps://neroblanco.co.uk/2022/02/get-list-of-videos-from-microsoft-stream/\n\t\n\tI've then taken Twan's script and modified it to do what I require in my environment.\n\tNamely - get the video information AND the channels they are part of. For my 1000 or so videos and 35 channels, it takes about 1 min to run using the All option.\n\t\n\tThis meant I was able to setup an intranet video library with a channel metadata column, folders per channel \n\t(so i could give edit rights to channel owners, without opening up the entire library or having to use multiple libraries), and eventually\n\tdownload the videos, then upload them into the library using ShareGate to reinstate some of the key metadata, i.e. created date, person who created them etc\n\t\n\t\n--#>\n\n# ----------------------------------------------------------------------------------------------\nfunction Show-OAuthWindowStream {\n param (\n [string]$Url,\n [string]$WindowTitle\n )\n \n $Source = `\n@\"\n [DllImport(\"wininet.dll\", SetLastError = true)]\n public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength);\n\"@\n\n $WebBrowser = Add-Type -memberDefinition $Source -passthru -name $('WebBrowser'+[guid]::newGuid().ToString('n'))\n $INTERNET_OPTION_END_BROWSER_SESSION = 42\n # Clear the current session\n $WebBrowser::InternetSetOption([IntPtr]::Zero, $INTERNET_OPTION_END_BROWSER_SESSION, [IntPtr]::Zero, 0) | out-null\n\n Add-Type -AssemblyName System.Windows.Forms\n $Form = New-Object -TypeName System.Windows.Forms.Form -Property @{Width = 600; Height = 800 }\n\n $Script:web = New-Object -TypeName System.Windows.Forms.WebBrowser -Property @{Width = 580; Height = 780; Url = ($URL -f ($Scope -join \"%20\")) }\n $Web.ScriptErrorsSuppressed = $True\n $Form.Controls.Add($Web)\n $Featured = {\n $Head = $Web.Document.GetElementsByTagName(\"head\")[0];\n $ScriptEl = $Web.Document.CreateElement(\"script\");\n $Element = $ScriptEl.DomElement;\n\n # Javascript function to get the sessionInfo including the Token\n $Element.text = `\n@'\n function CaptureToken() { \n if( typeof sessionInfo === undefined ) {\n return '';\n } else {\n outputString = '{';\n outputString += '\"AccessToken\":\"' + sessionInfo.AccessToken + '\",';\n outputString += '\"TenantId\":\"' + sessionInfo.UserClaim.TenantId + '\",';\n outputString += '\"ApiGatewayUri\":\"' + sessionInfo.ApiGatewayUri + '\",';\n outputString += '\"ApiGatewayVersion\":\"' + sessionInfo.ApiGatewayVersion + '\"';\n outputString += '}';\n\n return outputString;\n }\n }\n'@;\n\n $Head.AppendChild($ScriptEl);\n $TenantInfoString = $Web.Document.InvokeScript(\"CaptureToken\");\n \n if( [string]::IsNullOrEmpty( $TenantInfoString ) -eq $False ) {\n $TenantInfo = ConvertFrom-Json $TenantInfoString\n if ($TenantInfo.AccessToken.length -ne 0 ) {\n $Script:tenantInfo = $TenantInfo;\n $Form.Controls[0].Dispose()\n $Form.Close()\n $Form.Dispose()\n }\n }\n\n }\n $Web.add_DocumentCompleted($Featured)\n $Form.AutoScaleMode = 'Dpi'\n $Form.ShowIcon = $False\n $Form.Text = $WindowTitle\n $Form.AutoSizeMode = 'GrowAndShrink'\n $Form.StartPosition = 'CenterScreen'\n $Form.Add_Shown( { $Form.Activate() })\n $Form.ShowDialog() | Out-Null\n\n write-output $Script:tenantInfo\n}\n\n# ----------------------------------------------------------------------------------------------\nfunction Get-RequestedAssets([PSCustomObject]$Token, [string]$Url, [string]$Label) {\n $Index = 0\n $MainUrl = $Url\n $AllItems = @()\n do {\n $RestUrl = $MainUrl.Replace(\"`$skip=0\", \"`$skip=$Index\") \n\t\t\n\t\t\n \n Write-Host \" Fetching ... $($Index) to $($Index+100)\"\n $Items = @((Invoke-RestMethod -Uri $RestUrl -Headers $Token.headers -Method Get).value)\n\n $AllItems += $Items\n $Index += 100\n \n } until ($Items.Count -lt 100)\n\n Write-Host \" Fetched $($AllItems.count) items\"\n\n $Assets = $AllItems | Select-Object `\n @{Name='Type';Expression={$Label}},`\n Id, Name,`\n @{Name='Size(MB)';Expression={$_.AssetSize/1MB}}, `\n PrivacyMode, State, VideoMigrationStatus, Published, PublishedDate, ContentType, Created, Modified, `\n @{name='Media.Duration';Expression={$_.Media.Duration}},`\n @{name='Media.Height';Expression={$_.Media.Height}},`\n @{name='Media.Width';Expression={$_.Media.Width}},`\n @{name='Media.isAudioOnly';Expression={$_.media.isAudioOnly}},`\n @{name='Metrics.Comments';Expression={$_.Metrics.Comments}},`\n @{name='Metrics.Likes';Expression={$_.Metrics.Likes}},`\n @{name='Metrics.Views';Expression={$_.Metrics.Views}}, `\n @{name='ViewVideoUrl';Expression={(\"https://web.microsoftstream.com/video/\" + $_.Id)}}, `\n @{name='VideoCreatorName';Expression={$_.creator.name}}, `\n @{name='VideoCreatorEmail';Expression={$_.creator.mail}}, `\n @{name='VideoDescription';Expression={$_.description}}\n\t\t\t\t\t\t\t\n \n write-output $Assets\n\t\n}\n\n\n\n\nfunction Get-VideoChannels([PSCustomObject]$Token, [string]$Url, [string]$Label) {\n\t\t#this will get the list of channels\n $Index = 0\n $MainUrl = $Url\n $AllItems = @()\n do {\n $RestUrl = $MainUrl.Replace(\"`$skip=0\", \"`$skip=$Index\") \n\t\t\n\t\t\n \n Write-Host \" Fetching ... $($Index) to $($Index+100)\"\n $Items = @((Invoke-RestMethod -Uri $RestUrl -Headers $Token.headers -Method Get).value)\n\n $AllItems += $Items\n $Index += 100\n \n } until ($Items.Count -lt 100)\n\n Write-Host \" Fetched $($AllItems.count) items\"\n\t#to add properties to this section look at https://aase-1.api.microsoftstream.com/api/channels?$skip=0&$top=100&adminmode=true&api-version=1.4-private\n\t\n $Channels = $AllItems | Select-Object `\n @{Name='Type';Expression={$Label}},`\n Id, Name, Description,`\n @{Name='MetricsVideos';Expression={$_.metrics.videos}}\n\t#write-host $channels.count\t\t\t\t\t\t\t\n \n write-output $Channels\n}\n\nfunction Get-channelVideos([PSCustomObject]$Token, [PSCustomObject]$allChannels, [string]$Label) {\n\t\t#this will get the list of channels\n \n $MainUrl = \"https://aase-1.api.microsoftstream.com/api/channels/ChannelIDToSwap/videos?`$top=50&`$skip=0&`$filter=published%20and%20(state%20eq%20%27completed%27%20or%20contentSource%20eq%20%27livestream%27)&`$expand=creator,events&adminmode=true&`$orderby=name%20asc&api-version=1.4-private\"\n\t\n\t#for each channel URL go through all the videos, capture the channel name against the video id and name\n\t$allVideosPerChannel = @()\n\t\n\tforeach($chan in $allChannels) {\n\t\t$thisChannelid = $chan.id \n\t\t$chanUrl = @( $MainUrl.Replace(\"ChannelIDToSwap\", $thisChannelid) )\n\t\t$chanName = $chan.name\n\t\t$AllItems = \"\"\n\t\t$items = \"\"\n\t\t$thischanvideos = \"\"\n\t\t$Index = 0\n\t\t\n\t\t#write-host $chanUrl\n\t\t\n\t\t#loop the index\n\t\tdo {\n\t\t\t\n\t\t\t$RestUrl = $chanUrl.Replace(\"`$skip=0\", \"`$skip=$Index\") \n\t\t\t\n\t\t\t#write-host $restUrl\n\t\t\t\t\n\t\t\t#Write-Host \"$chanName | Fetching ... $($Index) to $($Index+50)\"\n\t\t\t$Items = @((Invoke-RestMethod -Uri $RestUrl -Headers $Token.headers -Method Get).value)\n\t\t\t\n\t\t\t$allItems = $items | select id,name, @{Name='Channel';Expression={$chanName}},@{Name='Type';Expression={$Label}}\n\t\t\t#write-host $allItems.count\n\t\t\t#foreach($x in $items ) {\n\t\t\t#\twrite-host $x.name\n\t\t\t\t#write-host $x.id\n\t\t\t\t#write-host $label\n\t\t\t\t#write-host $chanName\n\t\t\t#}\n\n\t\t\t\n\t\t\t$Index += 50\n\t\t\t\n\t\t\t\t\n\t\t} until ($Items.Count -lt 100)\n\t\t\n\t\t#got videos into $items, now mist with $chan info and put into $allVideosPerChannel object \n\t\t$allVideosPerChannel += $AllItems\n\t\t\n\t\t\n\t\t$AllItems = \"\"\n\t\t$items = \"\"\n\t}\n\n\t\n\n Write-Host \" Fetched $($allVideosPerChannel.count) videos in $($allChannels.count) channels\"\n\t#to add properties to this section look at https://aase-1.api.microsoftstream.com/api/channels?$skip=0&$top=100&adminmode=true&api-version=1.4-private\n\t\n \n \n write-output $allVideosPerChannel\n}\n\n\n\n# ----------------------------------------------------------------------------------------------\nfunction Get-StreamToken() {\n \n $TenantInfo = Show-OAuthWindowStream -url \"https://web.microsoftstream.com/?noSignUpCheck=1\" -WindowTitle \"Please login to Microsoft Stream ...\"\n $Token = $TenantInfo.AccessToken\n $Headers = @{\n \"Authorization\" = (\"Bearer \" + $Token)\n \"accept-encoding\" = \"gzip, deflate, br\"\n }\n $UrlTenant = $TenantInfo.ApiGatewayUri\n $ApiVersion = $TenantInfo.ApiGatewayVersion\n \n $UrlBase = \"$UrlTenant{0}?`$skip=0&`$top=100&adminmode=true&api-version=$ApiVersion\" \n \n $RequestToken = [PSCustomObject]::new()\n $RequestToken | Add-Member -Name \"token\" -MemberType NoteProperty -Value $Token\n $RequestToken | Add-Member -Name \"headers\" -MemberType NoteProperty -Value $Headers\n $RequestToken | Add-Member -Name \"tenantInfo\" -MemberType NoteProperty -Value $TenantInfo\n \n $Urls = [PSCustomObject]::new()\n $RequestToken | Add-Member -Name \"urls\" -MemberType NoteProperty -Value $Urls\n\n $RequestToken.urls | Add-Member -Name \"Videos\" -MemberType NoteProperty -Value ($UrlBase -f \"videos\")\n $RequestToken.urls | Add-Member -Name \"Channels\" -MemberType NoteProperty -Value ($UrlBase -f \"channels\")\n $RequestToken.urls | Add-Member -Name \"Groups\" -MemberType NoteProperty -Value ($UrlBase -f \"groups\")\n \n $UrlBase = $UrlBase.replace(\"`$skip=0&\", \"\")\n $RequestToken.urls | Add-Member -Name \"Principals\" -MemberType NoteProperty -Value ($UrlBase -f \"principals\")\n\n write-output $RequestToken\n}\n\n\n\n\n\nfunction New-Menu {\n [CmdletBinding()]\n param(\n [Parameter(Mandatory)]\n [ValidateNotNullOrEmpty()]\n [string]$Title,\n\n [Parameter(Mandatory)]\n [ValidateNotNullOrEmpty()]\n [string]$Question\n )\n \n $videos = [ChoiceDescription]::new('&Videos', 'Videos')\n $channelvideos = [ChoiceDescription]::new('&ChannelVideos', 'All Videos by Channel')\n\t$all = [ChoiceDescription]::new('&All', 'All videos AND all videos by channel')\n \n\n $options = [ChoiceDescription[]]($videos, $channelvideos, $all)\n\n $result = $host.ui.PromptForChoice($Title, $Question, $options, 0)\n\n\n switch ($result) {\n 0 { 'Videos' }\n 1 { 'ChannelVideos' }\n 2 { 'All' }\n }\n\n}\n\n\n\n$menuoutome = New-Menu -title 'Stream videos' -question 'What do you want to output?'\n\n#write-host $menuoutome\n\n\n$StreamToken = Get-StreamToken\n\n$urlQueryToUse = $StreamToken.Urls.Videos\n\n#default $StreamToken.Urls.Videos is something like https://aase-1.api.microsoftstream.com/api/videos?$skip=900&$top=100&adminmode=true&api-version=1.4-private\n\n#To get creator and event details you need to add $expand=creator,events to the URL , not to do that you need to use &`$expand=creator,events with out the ` powershell thinks $expand is a variable.\n\t# e.g. use \n\t$urlQueryToUse = $StreamToken.Urls.Videos+\"&`$expand=creator,events\"\n\t\n#Other option\n#\tuse the following if you want to only see files that have privacymode eq 'organization' i.e. video is visible to EVERYONE in the organisation\n#\tThanks to Ryechz for this \n#\n# $urlQueryToUse = $StreamToken.Urls.Videos + \"&orderby=publishedDate%20desc&`$expand=creator,events&`$filter=published%20and%20(state%20eq%20%27Completed%27%20or%20contentSource%20eq%20%27livestream%27)%20and%20privacymode%20eq%20%27organization%27%20\"\n\nif($menuoutome -eq 'Videos' -Or $menuoutome -eq 'All'){\n\t#modify the -URL submitted to get more data or filter data or order the output \n\t$ExtractData = Get-RequestedAssets -token $StreamToken -Url $urlQueryToUse -Label \"Videos\"\n\twrite-host \"\"\n\twrite-host \"The `$ExtractData object contains all the details about each video. Use `$ExtractData[0] to see the first item in the object, and it's properties.\"\n\t\n\tif( $OutputCsvFileName ) {\n\t\t$thisOutputCsvFileName = $OutputCsvFileName.replace(\".csv\", '-'+$menuoutome+'-videos.csv')\n\t\t$ExtractData | Export-CSV $thisOutputCsvFileName -NoTypeInformation -Encoding UTF8\n\t\twrite-host \"The following file has been created: $thisOutputCsvFileName\"\n\t\tif( $OpenFileWhenComplete ) {\n\t\t\tInvoke-Item $thisOutputCsvFileName\n\t\t}\n\t}\n\t\n}\n\nif($menuoutome -eq 'ChannelVideos' -Or $menuoutome -eq 'All'){\n\t#Get the list of channels , filter the result for the channel id and name\n\t$channelList = Get-VideoChannels -token $StreamToken -Url $StreamToken.Urls.Channels -Label \"Channels\"\n\n\t#for each channel get the videos that are in that channel, so that we can match them up to the ExtractData , which is the list of all videos)\n\t$videosPerChannel = get-channelvideos -token $StreamToken -allChannels $channelList -Label \"ChannelVideos\"\n\twrite-host \"\"\n\twrite-host \"The `$videosPerChannel object contains key information about each video and the channel it is in. Use `$videosPerChannel[0] to see the first video, and it's properties.\"\n\twrite-host \"The `$channelList object contains a list of channel's and their properties.\"\n\t\n\n\tif( $OutputCsvFileName ) {\n\t\t$thisOutputCsvFileName = $OutputCsvFileName.replace(\".csv\", '-'+$menuoutome+'-channelVideos.csv')\n\t\t$videosPerChannel | Export-CSV $thisOutputCsvFileName -NoTypeInformation -Encoding UTF8\n\t\twrite-host \"The following file has been created: $thisOutputCsvFileName\"\n\t\tif( $OpenFileWhenComplete ) {\n\t\t\tInvoke-Item $thisOutputCsvFileName\n\t\t}\n\t}\n\t\n}\n\n
>>> Original Code Oct 2020 <<<
I've left this here in case it is useful to anyone. See the script above for a better solution.
That said this solution relies on you knowing a bit about PowerShell, being a Stream Admin and being happy to manually save some files (I couldn't figure out how to do pass through windows authentication for the script) so you have to manually save each paged JSON file of 100 videos.
It took me about 20minutes to export information about 591 videos (about 3 hours to make the script).
To use the script
update each variable marked with #<<<< Update this value
in a normal (not admin) powershell window run the script (i copy and paste logical parts into the powershell window)
you will be given several urls, to visit and save the JSON files from
once you have the JSON files the final part of the script reads those, and exports a CSV file with a row per video in STREAM
NOTE : as an admin you see all videos, so before you share the CSV with others be aware that there may be sensitive information in it that most users can't see due to STREAM's in built security.
I don't have much time, hence I made this script so please don't expect quick answers to any questions. This script is rough, use it if it helps, but ... be professional and check it before you use it.
##>> Update 5 Aug 2021 <<##
Thanks to everyone who has commented, I've updated the code below with your suggestions
You still have to manually save the JSON browser tabs that show up as JSON files into a folder, but other than that I hope it is now easier for you to use 🙂
#reference https://techcommunity.microsoft.com/t5/microsoft-stream-forum/powershell-script-to-audit-and-export-channel-content-details-of/m-p/354832\n# goal of this script \n#- get list of all videos in stream for analysis\n#- it takes about 20 minutes to do this for 500 stream videos.\n\n#First \n# find out what your api source is\n# go to the following URL in chrome as an admin of Stream https://web.microsoftstream.com/browse\n# using Developer tools look at the \"console\" search for .api.microsoftstream to find out what is between https:// and .api.microsoftstream in my case https://aase-1.api.microsoftstream.com/api/\n\n[string]$rootAPIlocation = \"aase-1\" #<<<< Update this value to the one you find in the console view \n#[string]$rootAPIlocation = \"uswe-1\" \t# use this for Western US\n#[string]$rootAPIlocation = \"euno-1\" \t# use this for the Europe North region\n\n#enter where you on your computer you want the files to go\n[string]$PowerShellScriptFolder = \"C:\\Temp\\streamanalysis\" #<<<< Update this value\n#json files will be saved into \"VideosJSON\" folder \n[string]$streamJSONfolder = Join-Path -Path $PowerShellScriptFolder -ChildPath \"VideosJSON\" #<<<< Update this value if you want a different folder name\n\n#>>> REMOVES all exiisting JSON files <<<<\n#remove all JSON items in this folder\nRemove-Item -path $streamJSONfolder\\* -include *.json -Force -Recurse\n#guess approx number of videos you think you have divide by 100 e.g. 9 = 900 videos\n[int]$Loopnumber = 9 #<<<< Update this value\n\n#put in your stream portal url\n[string]$StreamPortal = \"https://web.microsoftstream.com/?NoSignUpCheck=1\"\n#put in the url where you see all videos from in stream\n[string]$StreamPortalVideoRoot = \"https://web.microsoftstream.com/browse/\" #$StreamPortalChannelRootForFindingVideos\n[string]$StreamPortalVideoViewRoot= \"https://web.microsoftstream.com/video/\" # for watching a video\n\n#this builds from the info you've put in a URL which will give back the JSON info about all your videos.\n[string]$StreamAPIVideos100 = \"https://$rootAPIlocation.api.microsoftstream.com/api/videos?NoSignUpCheck=1&`$top=100&`$orderby=publishedDate%20desc&`$expand=creator,events&`$filter=published%20and%20(state%20eq%20%27Completed%27%20or%20contentSource%20eq%20%27livestream%27)&adminmode=true&api-version=1.4-private&`$skip=0\" #$StreamAPIVideos100\n\n# use the following if you want to only see files that have privacymode eq 'organization' i.e. video is visible to EVERYONE in the organisation\n#Thanks to Ryechz for this \n#\n# [string]$StreamAPIVideos100 = \"https://$rootAPIlocation.api.microsoftstream.com/api/videos?NoSignUpCheck=1&`$top=100&`$orderby=publishedDate%20desc&`$expand=creator,events&`$filter=published%20and%20(state%20eq%20%27Completed%27%20or%20contentSource%20eq%20%27livestream%27)%20and%20privacymode%20eq%20%27organization%27%20&adminmode=true&api-version=1.4-private&`$skip=0\"\n\n\n\n\n[int]$skipCounter\n[int]$skipCounterNext = $skipCounter+100\n[string]$fileName = \"jsonfor-$skipCounter-to-$skipCounterNext.json\"\n\n#next section creates the URLS you need to manually download the json from , it was too hard to figure out how to do this programatically with authentication.\n\n\nWrite-Host \" Starting Chrome Enter your credentials to load O365 Stream portal\" -ForegroundColor Magenta\n#Thanks Conrad Murray for this tip \nStart-Process -FilePath 'chrome.exe' -ArgumentList $StreamPortal\nRead-Host -Prompt \"Press Enter to continue ....\"\n\nWrite-host \" -----------------------------------------\" -ForegroundColor Green\nWrite-host \" --Copy and past each url into chrome-----\" -ForegroundColor Green\nWrite-host \" --save JSON output into $streamJSONfolder\" -ForegroundColor Green\n\n\nfor($i=0;$i -lt $Loopnumber; $i++) {\n\t$skipCounter = $i*100\n\tif($skipCounter -eq 0) {\n\t\twrite-host $StreamAPIVideos100\n\t\tStart-Process -FilePath 'chrome.exe' -ArgumentList $StreamAPIVideos100\n\t} else {\n\t\twrite-host $StreamAPIVideos100.replace(\"skip=0\",\"skip=$skipCounter\")\n\t\t#following code opens browser tabs for each of the jsonfiles \n\t\t#Thanks Conrad Murray for this tip \n\t\tStart-Process -FilePath 'chrome.exe' -ArgumentList $StreamAPIVideos100.replace(\"skip=0\",\"skip=$skipCounter\")\n\t\t\t\t\n\t}\n\t\n}\n\nWrite-host \" --save each browser window showing JSON output into $streamJSONfolder\" -ForegroundColor Green\nWrite-host \" -----------------------------------------------------------------------------------\" -ForegroundColor Green\n\n\nWrite-host \" -----------------------------------------\" -ForegroundColor Green\nRead-Host -Prompt \"Press Enter to continue ....\"\n\n\n\nWrite-host \" -----------------------------------------\" -ForegroundColor Green\n$JSONFiles = Get-ChildItem -Path $streamJSONfolder -Recurse -Include *.json\n[int]$videoscounter = 0\n$VideosjsonAggregateddata=@()\n$data=@()\n\nforeach($fileItem in $JSONFiles)\n{\n\tWrite-host \" -----------------------------------------\" -ForegroundColor Green\n\tWrite-Host \" =====>>>> getting content of JSON File:\", $fileItem, \"- Path:\", $fileItem.FullName -ForegroundColor Yellow\n\t$Videosjsondata = Get-Content -Raw -Path $fileItem.FullName | ConvertFrom-Json\n\t$VideosjsonAggregateddata += $Videosjsondata\n\tWrite-host \" -----------------------------------------\" -ForegroundColor Green\n\t#Write-Host \" =====>>>> Channel JSON Raw data:\", $Videosjsondata -ForegroundColor green\n\t#Read-Host -Prompt \"Press Enter to continue ....\"\n}\n\n\twrite-host \"You have \" $VideosjsonAggregateddata.value.count \" videos in Stream , using these selection criteria\"\n\nforeach($myVideo in $VideosjsonAggregateddata.value)\n{\n\n\t\t$videoscounter += 1\n\t\t$datum = New-Object -TypeName PSObject\n\t\tWrite-host \" -----------------------------------------\" -ForegroundColor Green\n\t\tWrite-Host \" =====>>>> Video (N°\", $videoscounter ,\") ID:\", $myVideo.id -ForegroundColor green\n\t\tWrite-Host \" =====>>>> Video Name:\", $myVideo.name,\" created:\", $myVideo.created,\"- modified:\", $myVideo.modified -ForegroundColor green\n\t\tWrite-Host \" =====>>>> Video Metrics views:\", $myVideo.metrics.views, \"- comments:\", $myVideo.metrics.comments -ForegroundColor Magenta\n\t\tWrite-Host \" =====>>>> Video Creator Name: \", $myVideo.creator.name , \" - Email:\", $myVideo.creator.mail -ForegroundColor Magenta\t\t\n\t\tWrite-Host \" =====>>>> Video Description: \", $myVideo.description -ForegroundColor Magenta\t\n\n\n\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoID -Value $myVideo.id\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoName -Value $myVideo.name\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoURL -Value $($StreamPortalVideoViewRoot + $myVideo.id)\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoCreatorName -Value $myVideo.creator.name\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoCreatorEmail -Value $myVideo.creator.mail\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoCreationDate -Value $myVideo.created\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoModificationDate -Value $myVideo.modified\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoLikes -Value $myVideo.metrics.likes\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoViews -Value $myVideo.metrics.views\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoComments -Value $myVideo.metrics.comments\n\t\t#the userData value is for the user running the JSON query i.e. did that user view this video. It isn't for information about all users who may have seen this video. There seems to be no information about that other than, total views = metrics.views \n\t\t#$datum | Add-Member -MemberType NoteProperty -Name VideoComments -Value $myVideo.userData.isViewed\n\t\t$datum | Add-Member -MemberType NoteProperty -Name Videodescription -Value $myVideo.description\n\t\t\n\t\t#thanks Johnathan Ogden for these values \n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoDuration -Value $myVideo.media.duration\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoHeight -Value $myVideo.media.height\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoWidth -Value $myVideo.media.width\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoIsAudioOnly -Value $myVideo.media.isAudioOnly\n\n \n\n$datum | Add-Member -MemberType NoteProperty -Name VideoContentType -Value $myVideo.contentType\n\n\n\t\t$data += $datum\n\t\n}\n\n$datestring = (get-date).ToString(\"yyyyMMdd-hhmm\")\n$csvfileName = ($PowerShellScriptFolder + \"\\O365StreamVideoDetails_\" + $datestring + \".csv\") #<<<< Update this value if you want a different file name \n\t\nWrite-host \" -----------------------------------------\" -ForegroundColor Green\nWrite-Host (\" >>> writing to file {0}\" -f $csvfileName) -ForegroundColor Green\n$data | Export-csv $csvfileName -NoTypeInformation\nWrite-host \" ------------------ DONE -----------------------\" -ForegroundColor Green
Disclaimer : You can use that solution as you want and modify it depending of your case.
My goal was to get a list of all videos in my stream so that I could contact each video creator about the changes that are coming to stream. Also so I could figure out how much work there was to do in moving, and how much video is created and not used.
Take a look a the comments I've put into the code for how to use this script.
I found that my original script gave me information about the videos but it was hard to use AND didn't tell me which videos were in which channels. This new version of script gives me both.
Save the new code Oct 2022 as a PowerShell script e.g. get-stream-video-info.ps1 Then open a powershell screen, navigate to the folder get-stream-video-info.ps1 is in.
To run it enter .\\get-stream-video-info.ps1 \"C:\\Temp\\streamanalysis\\stream7Oct22-getnbstreamvideoinfo.csv\"
Follow the on screen prompts.
>>> New Code Oct 2022 <<<
using namespace System.Management.Automation.Host\n\n[CmdletBinding()]\nparam (\n [parameter(Position=0,Mandatory=$False)] \n [string]$OutputCsvFileName,\n\n [parameter(Position=1,Mandatory=$False)] \n [switch]$OpenFileWhenComplete = $False\n)\n\n\n# ----------------------------------------\n#\tHow to use\n<#--\n\tOpen a powershell window then type in the following and click enter\n\t\t.\\get-stream-video-info.ps1 \"C:\\Temp\\streamanalysis\\stream7Oct22-getnbstreamvideoinfo.csv\"\n\t\t\n\tYou'll then be prompted for 3 options\n\t[V] Videos [C] ChannelVideos [A] All [?] Help (default is \"V\"): \n\t\tV - videos, which will get a list of all the videos in your STREAM environment.\n\t\t\tNOTE you may need to alter the variables in the code if you have more than 1000s of videos\n\t\tC - ChannelVideos, will get a list of all the videos and the channels they are in.\n\t\t\tNOTE this returns a filtered view of all the videos associated with a channel\n\t\tA - All, returns both the Videos and the ChannelVideos.\n\t\t\n\tYou'll then be prompted for a user to login to the STREAM portal with, this is so the script can get a security token to do it's work with.\n\tChoose/use an account with full access to STREAM.\n\t\t\n\tIf you used a CSV file path after the script name, then this powershell script will export one or two CSV files based on the option chosen\n\t\t<your folder path, your filename>-videos<your file ending>\n\t\tand or\n\t\t<your folder path, your filename>-channelVideos<your file ending>\n\t\t\t\n\tIf you don't want to export file names, this powershell creates objects you can use in other ways\n\t\tV or A - will create an object $ExtractData, which is a list of every video and key properties for each video.\n\t\tC or A - wil create an object $videosPerChannel, which lists key information about each video AND the channel they are part of.\n\n\n ----------------------------------------------------------------------------------------------\n\toriginal source\n\tmy script \n\thttps://techcommunity.microsoft.com/t5/microsoft-stream-classic/powershell-script-to-list-all-videos-in-your-365-stream/m-p/1752149\n\n\twhich inspired Twan van Beers to write\n\thttps://neroblanco.co.uk/2022/02/get-list-of-videos-from-microsoft-stream/\n\t\n\tI've then taken Twan's script and modified it to do what I require in my environment.\n\tNamely - get the video information AND the channels they are part of. For my 1000 or so videos and 35 channels, it takes about 1 min to run using the All option.\n\t\n\tThis meant I was able to setup an intranet video library with a channel metadata column, folders per channel \n\t(so i could give edit rights to channel owners, without opening up the entire library or having to use multiple libraries), and eventually\n\tdownload the videos, then upload them into the library using ShareGate to reinstate some of the key metadata, i.e. created date, person who created them etc\n\t\n\t\n--#>\n\n# ----------------------------------------------------------------------------------------------\nfunction Show-OAuthWindowStream {\n param (\n [string]$Url,\n [string]$WindowTitle\n )\n \n $Source = `\n@\"\n [DllImport(\"wininet.dll\", SetLastError = true)]\n public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength);\n\"@\n\n $WebBrowser = Add-Type -memberDefinition $Source -passthru -name $('WebBrowser'+[guid]::newGuid().ToString('n'))\n $INTERNET_OPTION_END_BROWSER_SESSION = 42\n # Clear the current session\n $WebBrowser::InternetSetOption([IntPtr]::Zero, $INTERNET_OPTION_END_BROWSER_SESSION, [IntPtr]::Zero, 0) | out-null\n\n Add-Type -AssemblyName System.Windows.Forms\n $Form = New-Object -TypeName System.Windows.Forms.Form -Property @{Width = 600; Height = 800 }\n\n $Script:web = New-Object -TypeName System.Windows.Forms.WebBrowser -Property @{Width = 580; Height = 780; Url = ($URL -f ($Scope -join \"%20\")) }\n $Web.ScriptErrorsSuppressed = $True\n $Form.Controls.Add($Web)\n $Featured = {\n $Head = $Web.Document.GetElementsByTagName(\"head\")[0];\n $ScriptEl = $Web.Document.CreateElement(\"script\");\n $Element = $ScriptEl.DomElement;\n\n # Javascript function to get the sessionInfo including the Token\n $Element.text = `\n@'\n function CaptureToken() { \n if( typeof sessionInfo === undefined ) {\n return '';\n } else {\n outputString = '{';\n outputString += '\"AccessToken\":\"' + sessionInfo.AccessToken + '\",';\n outputString += '\"TenantId\":\"' + sessionInfo.UserClaim.TenantId + '\",';\n outputString += '\"ApiGatewayUri\":\"' + sessionInfo.ApiGatewayUri + '\",';\n outputString += '\"ApiGatewayVersion\":\"' + sessionInfo.ApiGatewayVersion + '\"';\n outputString += '}';\n\n return outputString;\n }\n }\n'@;\n\n $Head.AppendChild($ScriptEl);\n $TenantInfoString = $Web.Document.InvokeScript(\"CaptureToken\");\n \n if( [string]::IsNullOrEmpty( $TenantInfoString ) -eq $False ) {\n $TenantInfo = ConvertFrom-Json $TenantInfoString\n if ($TenantInfo.AccessToken.length -ne 0 ) {\n $Script:tenantInfo = $TenantInfo;\n $Form.Controls[0].Dispose()\n $Form.Close()\n $Form.Dispose()\n }\n }\n\n }\n $Web.add_DocumentCompleted($Featured)\n $Form.AutoScaleMode = 'Dpi'\n $Form.ShowIcon = $False\n $Form.Text = $WindowTitle\n $Form.AutoSizeMode = 'GrowAndShrink'\n $Form.StartPosition = 'CenterScreen'\n $Form.Add_Shown( { $Form.Activate() })\n $Form.ShowDialog() | Out-Null\n\n write-output $Script:tenantInfo\n}\n\n# ----------------------------------------------------------------------------------------------\nfunction Get-RequestedAssets([PSCustomObject]$Token, [string]$Url, [string]$Label) {\n $Index = 0\n $MainUrl = $Url\n $AllItems = @()\n do {\n $RestUrl = $MainUrl.Replace(\"`$skip=0\", \"`$skip=$Index\") \n\t\t\n\t\t\n \n Write-Host \" Fetching ... $($Index) to $($Index+100)\"\n $Items = @((Invoke-RestMethod -Uri $RestUrl -Headers $Token.headers -Method Get).value)\n\n $AllItems += $Items\n $Index += 100\n \n } until ($Items.Count -lt 100)\n\n Write-Host \" Fetched $($AllItems.count) items\"\n\n $Assets = $AllItems | Select-Object `\n @{Name='Type';Expression={$Label}},`\n Id, Name,`\n @{Name='Size(MB)';Expression={$_.AssetSize/1MB}}, `\n PrivacyMode, State, VideoMigrationStatus, Published, PublishedDate, ContentType, Created, Modified, `\n @{name='Media.Duration';Expression={$_.Media.Duration}},`\n @{name='Media.Height';Expression={$_.Media.Height}},`\n @{name='Media.Width';Expression={$_.Media.Width}},`\n @{name='Media.isAudioOnly';Expression={$_.media.isAudioOnly}},`\n @{name='Metrics.Comments';Expression={$_.Metrics.Comments}},`\n @{name='Metrics.Likes';Expression={$_.Metrics.Likes}},`\n @{name='Metrics.Views';Expression={$_.Metrics.Views}}, `\n @{name='ViewVideoUrl';Expression={(\"https://web.microsoftstream.com/video/\" + $_.Id)}}, `\n @{name='VideoCreatorName';Expression={$_.creator.name}}, `\n @{name='VideoCreatorEmail';Expression={$_.creator.mail}}, `\n @{name='VideoDescription';Expression={$_.description}}\n\t\t\t\t\t\t\t\n \n write-output $Assets\n\t\n}\n\n\n\n\nfunction Get-VideoChannels([PSCustomObject]$Token, [string]$Url, [string]$Label) {\n\t\t#this will get the list of channels\n $Index = 0\n $MainUrl = $Url\n $AllItems = @()\n do {\n $RestUrl = $MainUrl.Replace(\"`$skip=0\", \"`$skip=$Index\") \n\t\t\n\t\t\n \n Write-Host \" Fetching ... $($Index) to $($Index+100)\"\n $Items = @((Invoke-RestMethod -Uri $RestUrl -Headers $Token.headers -Method Get).value)\n\n $AllItems += $Items\n $Index += 100\n \n } until ($Items.Count -lt 100)\n\n Write-Host \" Fetched $($AllItems.count) items\"\n\t#to add properties to this section look at https://aase-1.api.microsoftstream.com/api/channels?$skip=0&$top=100&adminmode=true&api-version=1.4-private\n\t\n $Channels = $AllItems | Select-Object `\n @{Name='Type';Expression={$Label}},`\n Id, Name, Description,`\n @{Name='MetricsVideos';Expression={$_.metrics.videos}}\n\t#write-host $channels.count\t\t\t\t\t\t\t\n \n write-output $Channels\n}\n\nfunction Get-channelVideos([PSCustomObject]$Token, [PSCustomObject]$allChannels, [string]$Label) {\n\t\t#this will get the list of channels\n \n $MainUrl = \"https://aase-1.api.microsoftstream.com/api/channels/ChannelIDToSwap/videos?`$top=50&`$skip=0&`$filter=published%20and%20(state%20eq%20%27completed%27%20or%20contentSource%20eq%20%27livestream%27)&`$expand=creator,events&adminmode=true&`$orderby=name%20asc&api-version=1.4-private\"\n\t\n\t#for each channel URL go through all the videos, capture the channel name against the video id and name\n\t$allVideosPerChannel = @()\n\t\n\tforeach($chan in $allChannels) {\n\t\t$thisChannelid = $chan.id \n\t\t$chanUrl = @( $MainUrl.Replace(\"ChannelIDToSwap\", $thisChannelid) )\n\t\t$chanName = $chan.name\n\t\t$AllItems = \"\"\n\t\t$items = \"\"\n\t\t$thischanvideos = \"\"\n\t\t$Index = 0\n\t\t\n\t\t#write-host $chanUrl\n\t\t\n\t\t#loop the index\n\t\tdo {\n\t\t\t\n\t\t\t$RestUrl = $chanUrl.Replace(\"`$skip=0\", \"`$skip=$Index\") \n\t\t\t\n\t\t\t#write-host $restUrl\n\t\t\t\t\n\t\t\t#Write-Host \"$chanName | Fetching ... $($Index) to $($Index+50)\"\n\t\t\t$Items = @((Invoke-RestMethod -Uri $RestUrl -Headers $Token.headers -Method Get).value)\n\t\t\t\n\t\t\t$allItems = $items | select id,name, @{Name='Channel';Expression={$chanName}},@{Name='Type';Expression={$Label}}\n\t\t\t#write-host $allItems.count\n\t\t\t#foreach($x in $items ) {\n\t\t\t#\twrite-host $x.name\n\t\t\t\t#write-host $x.id\n\t\t\t\t#write-host $label\n\t\t\t\t#write-host $chanName\n\t\t\t#}\n\n\t\t\t\n\t\t\t$Index += 50\n\t\t\t\n\t\t\t\t\n\t\t} until ($Items.Count -lt 100)\n\t\t\n\t\t#got videos into $items, now mist with $chan info and put into $allVideosPerChannel object \n\t\t$allVideosPerChannel += $AllItems\n\t\t\n\t\t\n\t\t$AllItems = \"\"\n\t\t$items = \"\"\n\t}\n\n\t\n\n Write-Host \" Fetched $($allVideosPerChannel.count) videos in $($allChannels.count) channels\"\n\t#to add properties to this section look at https://aase-1.api.microsoftstream.com/api/channels?$skip=0&$top=100&adminmode=true&api-version=1.4-private\n\t\n \n \n write-output $allVideosPerChannel\n}\n\n\n\n# ----------------------------------------------------------------------------------------------\nfunction Get-StreamToken() {\n \n $TenantInfo = Show-OAuthWindowStream -url \"https://web.microsoftstream.com/?noSignUpCheck=1\" -WindowTitle \"Please login to Microsoft Stream ...\"\n $Token = $TenantInfo.AccessToken\n $Headers = @{\n \"Authorization\" = (\"Bearer \" + $Token)\n \"accept-encoding\" = \"gzip, deflate, br\"\n }\n $UrlTenant = $TenantInfo.ApiGatewayUri\n $ApiVersion = $TenantInfo.ApiGatewayVersion\n \n $UrlBase = \"$UrlTenant{0}?`$skip=0&`$top=100&adminmode=true&api-version=$ApiVersion\" \n \n $RequestToken = [PSCustomObject]::new()\n $RequestToken | Add-Member -Name \"token\" -MemberType NoteProperty -Value $Token\n $RequestToken | Add-Member -Name \"headers\" -MemberType NoteProperty -Value $Headers\n $RequestToken | Add-Member -Name \"tenantInfo\" -MemberType NoteProperty -Value $TenantInfo\n \n $Urls = [PSCustomObject]::new()\n $RequestToken | Add-Member -Name \"urls\" -MemberType NoteProperty -Value $Urls\n\n $RequestToken.urls | Add-Member -Name \"Videos\" -MemberType NoteProperty -Value ($UrlBase -f \"videos\")\n $RequestToken.urls | Add-Member -Name \"Channels\" -MemberType NoteProperty -Value ($UrlBase -f \"channels\")\n $RequestToken.urls | Add-Member -Name \"Groups\" -MemberType NoteProperty -Value ($UrlBase -f \"groups\")\n \n $UrlBase = $UrlBase.replace(\"`$skip=0&\", \"\")\n $RequestToken.urls | Add-Member -Name \"Principals\" -MemberType NoteProperty -Value ($UrlBase -f \"principals\")\n\n write-output $RequestToken\n}\n\n\n\n\n\nfunction New-Menu {\n [CmdletBinding()]\n param(\n [Parameter(Mandatory)]\n [ValidateNotNullOrEmpty()]\n [string]$Title,\n\n [Parameter(Mandatory)]\n [ValidateNotNullOrEmpty()]\n [string]$Question\n )\n \n $videos = [ChoiceDescription]::new('&Videos', 'Videos')\n $channelvideos = [ChoiceDescription]::new('&ChannelVideos', 'All Videos by Channel')\n\t$all = [ChoiceDescription]::new('&All', 'All videos AND all videos by channel')\n \n\n $options = [ChoiceDescription[]]($videos, $channelvideos, $all)\n\n $result = $host.ui.PromptForChoice($Title, $Question, $options, 0)\n\n\n switch ($result) {\n 0 { 'Videos' }\n 1 { 'ChannelVideos' }\n 2 { 'All' }\n }\n\n}\n\n\n\n$menuoutome = New-Menu -title 'Stream videos' -question 'What do you want to output?'\n\n#write-host $menuoutome\n\n\n$StreamToken = Get-StreamToken\n\n$urlQueryToUse = $StreamToken.Urls.Videos\n\n#default $StreamToken.Urls.Videos is something like https://aase-1.api.microsoftstream.com/api/videos?$skip=900&$top=100&adminmode=true&api-version=1.4-private\n\n#To get creator and event details you need to add $expand=creator,events to the URL , not to do that you need to use &`$expand=creator,events with out the ` powershell thinks $expand is a variable.\n\t# e.g. use \n\t$urlQueryToUse = $StreamToken.Urls.Videos+\"&`$expand=creator,events\"\n\t\n#Other option\n#\tuse the following if you want to only see files that have privacymode eq 'organization' i.e. video is visible to EVERYONE in the organisation\n#\tThanks to Ryechz for this \n#\n# $urlQueryToUse = $StreamToken.Urls.Videos + \"&orderby=publishedDate%20desc&`$expand=creator,events&`$filter=published%20and%20(state%20eq%20%27Completed%27%20or%20contentSource%20eq%20%27livestream%27)%20and%20privacymode%20eq%20%27organization%27%20\"\n\nif($menuoutome -eq 'Videos' -Or $menuoutome -eq 'All'){\n\t#modify the -URL submitted to get more data or filter data or order the output \n\t$ExtractData = Get-RequestedAssets -token $StreamToken -Url $urlQueryToUse -Label \"Videos\"\n\twrite-host \"\"\n\twrite-host \"The `$ExtractData object contains all the details about each video. Use `$ExtractData[0] to see the first item in the object, and it's properties.\"\n\t\n\tif( $OutputCsvFileName ) {\n\t\t$thisOutputCsvFileName = $OutputCsvFileName.replace(\".csv\", '-'+$menuoutome+'-videos.csv')\n\t\t$ExtractData | Export-CSV $thisOutputCsvFileName -NoTypeInformation -Encoding UTF8\n\t\twrite-host \"The following file has been created: $thisOutputCsvFileName\"\n\t\tif( $OpenFileWhenComplete ) {\n\t\t\tInvoke-Item $thisOutputCsvFileName\n\t\t}\n\t}\n\t\n}\n\nif($menuoutome -eq 'ChannelVideos' -Or $menuoutome -eq 'All'){\n\t#Get the list of channels , filter the result for the channel id and name\n\t$channelList = Get-VideoChannels -token $StreamToken -Url $StreamToken.Urls.Channels -Label \"Channels\"\n\n\t#for each channel get the videos that are in that channel, so that we can match them up to the ExtractData , which is the list of all videos)\n\t$videosPerChannel = get-channelvideos -token $StreamToken -allChannels $channelList -Label \"ChannelVideos\"\n\twrite-host \"\"\n\twrite-host \"The `$videosPerChannel object contains key information about each video and the channel it is in. Use `$videosPerChannel[0] to see the first video, and it's properties.\"\n\twrite-host \"The `$channelList object contains a list of channel's and their properties.\"\n\t\n\n\tif( $OutputCsvFileName ) {\n\t\t$thisOutputCsvFileName = $OutputCsvFileName.replace(\".csv\", '-'+$menuoutome+'-channelVideos.csv')\n\t\t$videosPerChannel | Export-CSV $thisOutputCsvFileName -NoTypeInformation -Encoding UTF8\n\t\twrite-host \"The following file has been created: $thisOutputCsvFileName\"\n\t\tif( $OpenFileWhenComplete ) {\n\t\t\tInvoke-Item $thisOutputCsvFileName\n\t\t}\n\t}\n\t\n}\n\n
>>> Original Code Oct 2020 <<<
I've left this here in case it is useful to anyone. See the script above for a better solution.
That said this solution relies on you knowing a bit about PowerShell, being a Stream Admin and being happy to manually save some files (I couldn't figure out how to do pass through windows authentication for the script) so you have to manually save each paged JSON file of 100 videos.
It took me about 20minutes to export information about 591 videos (about 3 hours to make the script).
To use the script
update each variable marked with #<<<< Update this value
in a normal (not admin) powershell window run the script (i copy and paste logical parts into the powershell window)
you will be given several urls, to visit and save the JSON files from
once you have the JSON files the final part of the script reads those, and exports a CSV file with a row per video in STREAM
NOTE : as an admin you see all videos, so before you share the CSV with others be aware that there may be sensitive information in it that most users can't see due to STREAM's in built security.
I don't have much time, hence I made this script so please don't expect quick answers to any questions. This script is rough, use it if it helps, but ... be professional and check it before you use it.
##>> Update 5 Aug 2021 <<##
Thanks to everyone who has commented, I've updated the code below with your suggestions
You still have to manually save the JSON browser tabs that show up as JSON files into a folder, but other than that I hope it is now easier for you to use 🙂
#reference https://techcommunity.microsoft.com/t5/microsoft-stream-forum/powershell-script-to-audit-and-export-channel-content-details-of/m-p/354832\n# goal of this script \n#- get list of all videos in stream for analysis\n#- it takes about 20 minutes to do this for 500 stream videos.\n\n#First \n# find out what your api source is\n# go to the following URL in chrome as an admin of Stream https://web.microsoftstream.com/browse\n# using Developer tools look at the \"console\" search for .api.microsoftstream to find out what is between https:// and .api.microsoftstream in my case https://aase-1.api.microsoftstream.com/api/\n\n[string]$rootAPIlocation = \"aase-1\" #<<<< Update this value to the one you find in the console view \n#[string]$rootAPIlocation = \"uswe-1\" \t# use this for Western US\n#[string]$rootAPIlocation = \"euno-1\" \t# use this for the Europe North region\n\n#enter where you on your computer you want the files to go\n[string]$PowerShellScriptFolder = \"C:\\Temp\\streamanalysis\" #<<<< Update this value\n#json files will be saved into \"VideosJSON\" folder \n[string]$streamJSONfolder = Join-Path -Path $PowerShellScriptFolder -ChildPath \"VideosJSON\" #<<<< Update this value if you want a different folder name\n\n#>>> REMOVES all exiisting JSON files <<<<\n#remove all JSON items in this folder\nRemove-Item -path $streamJSONfolder\\* -include *.json -Force -Recurse\n#guess approx number of videos you think you have divide by 100 e.g. 9 = 900 videos\n[int]$Loopnumber = 9 #<<<< Update this value\n\n#put in your stream portal url\n[string]$StreamPortal = \"https://web.microsoftstream.com/?NoSignUpCheck=1\"\n#put in the url where you see all videos from in stream\n[string]$StreamPortalVideoRoot = \"https://web.microsoftstream.com/browse/\" #$StreamPortalChannelRootForFindingVideos\n[string]$StreamPortalVideoViewRoot= \"https://web.microsoftstream.com/video/\" # for watching a video\n\n#this builds from the info you've put in a URL which will give back the JSON info about all your videos.\n[string]$StreamAPIVideos100 = \"https://$rootAPIlocation.api.microsoftstream.com/api/videos?NoSignUpCheck=1&`$top=100&`$orderby=publishedDate%20desc&`$expand=creator,events&`$filter=published%20and%20(state%20eq%20%27Completed%27%20or%20contentSource%20eq%20%27livestream%27)&adminmode=true&api-version=1.4-private&`$skip=0\" #$StreamAPIVideos100\n\n# use the following if you want to only see files that have privacymode eq 'organization' i.e. video is visible to EVERYONE in the organisation\n#Thanks to Ryechz for this \n#\n# [string]$StreamAPIVideos100 = \"https://$rootAPIlocation.api.microsoftstream.com/api/videos?NoSignUpCheck=1&`$top=100&`$orderby=publishedDate%20desc&`$expand=creator,events&`$filter=published%20and%20(state%20eq%20%27Completed%27%20or%20contentSource%20eq%20%27livestream%27)%20and%20privacymode%20eq%20%27organization%27%20&adminmode=true&api-version=1.4-private&`$skip=0\"\n\n\n\n\n[int]$skipCounter\n[int]$skipCounterNext = $skipCounter+100\n[string]$fileName = \"jsonfor-$skipCounter-to-$skipCounterNext.json\"\n\n#next section creates the URLS you need to manually download the json from , it was too hard to figure out how to do this programatically with authentication.\n\n\nWrite-Host \" Starting Chrome Enter your credentials to load O365 Stream portal\" -ForegroundColor Magenta\n#Thanks Conrad Murray for this tip \nStart-Process -FilePath 'chrome.exe' -ArgumentList $StreamPortal\nRead-Host -Prompt \"Press Enter to continue ....\"\n\nWrite-host \" -----------------------------------------\" -ForegroundColor Green\nWrite-host \" --Copy and past each url into chrome-----\" -ForegroundColor Green\nWrite-host \" --save JSON output into $streamJSONfolder\" -ForegroundColor Green\n\n\nfor($i=0;$i -lt $Loopnumber; $i++) {\n\t$skipCounter = $i*100\n\tif($skipCounter -eq 0) {\n\t\twrite-host $StreamAPIVideos100\n\t\tStart-Process -FilePath 'chrome.exe' -ArgumentList $StreamAPIVideos100\n\t} else {\n\t\twrite-host $StreamAPIVideos100.replace(\"skip=0\",\"skip=$skipCounter\")\n\t\t#following code opens browser tabs for each of the jsonfiles \n\t\t#Thanks Conrad Murray for this tip \n\t\tStart-Process -FilePath 'chrome.exe' -ArgumentList $StreamAPIVideos100.replace(\"skip=0\",\"skip=$skipCounter\")\n\t\t\t\t\n\t}\n\t\n}\n\nWrite-host \" --save each browser window showing JSON output into $streamJSONfolder\" -ForegroundColor Green\nWrite-host \" -----------------------------------------------------------------------------------\" -ForegroundColor Green\n\n\nWrite-host \" -----------------------------------------\" -ForegroundColor Green\nRead-Host -Prompt \"Press Enter to continue ....\"\n\n\n\nWrite-host \" -----------------------------------------\" -ForegroundColor Green\n$JSONFiles = Get-ChildItem -Path $streamJSONfolder -Recurse -Include *.json\n[int]$videoscounter = 0\n$VideosjsonAggregateddata=@()\n$data=@()\n\nforeach($fileItem in $JSONFiles)\n{\n\tWrite-host \" -----------------------------------------\" -ForegroundColor Green\n\tWrite-Host \" =====>>>> getting content of JSON File:\", $fileItem, \"- Path:\", $fileItem.FullName -ForegroundColor Yellow\n\t$Videosjsondata = Get-Content -Raw -Path $fileItem.FullName | ConvertFrom-Json\n\t$VideosjsonAggregateddata += $Videosjsondata\n\tWrite-host \" -----------------------------------------\" -ForegroundColor Green\n\t#Write-Host \" =====>>>> Channel JSON Raw data:\", $Videosjsondata -ForegroundColor green\n\t#Read-Host -Prompt \"Press Enter to continue ....\"\n}\n\n\twrite-host \"You have \" $VideosjsonAggregateddata.value.count \" videos in Stream , using these selection criteria\"\n\nforeach($myVideo in $VideosjsonAggregateddata.value)\n{\n\n\t\t$videoscounter += 1\n\t\t$datum = New-Object -TypeName PSObject\n\t\tWrite-host \" -----------------------------------------\" -ForegroundColor Green\n\t\tWrite-Host \" =====>>>> Video (N°\", $videoscounter ,\") ID:\", $myVideo.id -ForegroundColor green\n\t\tWrite-Host \" =====>>>> Video Name:\", $myVideo.name,\" created:\", $myVideo.created,\"- modified:\", $myVideo.modified -ForegroundColor green\n\t\tWrite-Host \" =====>>>> Video Metrics views:\", $myVideo.metrics.views, \"- comments:\", $myVideo.metrics.comments -ForegroundColor Magenta\n\t\tWrite-Host \" =====>>>> Video Creator Name: \", $myVideo.creator.name , \" - Email:\", $myVideo.creator.mail -ForegroundColor Magenta\t\t\n\t\tWrite-Host \" =====>>>> Video Description: \", $myVideo.description -ForegroundColor Magenta\t\n\n\n\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoID -Value $myVideo.id\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoName -Value $myVideo.name\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoURL -Value $($StreamPortalVideoViewRoot + $myVideo.id)\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoCreatorName -Value $myVideo.creator.name\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoCreatorEmail -Value $myVideo.creator.mail\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoCreationDate -Value $myVideo.created\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoModificationDate -Value $myVideo.modified\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoLikes -Value $myVideo.metrics.likes\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoViews -Value $myVideo.metrics.views\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoComments -Value $myVideo.metrics.comments\n\t\t#the userData value is for the user running the JSON query i.e. did that user view this video. It isn't for information about all users who may have seen this video. There seems to be no information about that other than, total views = metrics.views \n\t\t#$datum | Add-Member -MemberType NoteProperty -Name VideoComments -Value $myVideo.userData.isViewed\n\t\t$datum | Add-Member -MemberType NoteProperty -Name Videodescription -Value $myVideo.description\n\t\t\n\t\t#thanks Johnathan Ogden for these values \n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoDuration -Value $myVideo.media.duration\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoHeight -Value $myVideo.media.height\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoWidth -Value $myVideo.media.width\n\t\t$datum | Add-Member -MemberType NoteProperty -Name VideoIsAudioOnly -Value $myVideo.media.isAudioOnly\n\n \n\n$datum | Add-Member -MemberType NoteProperty -Name VideoContentType -Value $myVideo.contentType\n\n\n\t\t$data += $datum\n\t\n}\n\n$datestring = (get-date).ToString(\"yyyyMMdd-hhmm\")\n$csvfileName = ($PowerShellScriptFolder + \"\\O365StreamVideoDetails_\" + $datestring + \".csv\") #<<<< Update this value if you want a different file name \n\t\nWrite-host \" -----------------------------------------\" -ForegroundColor Green\nWrite-Host (\" >>> writing to file {0}\" -f $csvfileName) -ForegroundColor Green\n$data | Export-csv $csvfileName -NoTypeInformation\nWrite-host \" ------------------ DONE -----------------------\" -ForegroundColor Green
Disclaimer : You can use that solution as you want and modify it depending of your case.
","kudosSumWeight":18,"postTime":"2020-10-06T20:28:14.507-07:00","images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"attachments":{"__typename":"AttachmentConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"tags":{"__typename":"TagConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[{"__typename":"TagEdge","cursor":"MjUuMXwyLjF8b3wxMHxfTlZffDE","node":{"__typename":"Tag","id":"tag:audit","text":"audit","time":"2018-07-12T16:49:07.422-07:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjUuMXwyLjF8b3wxMHxfTlZffDI","node":{"__typename":"Tag","id":"tag:csv","text":"csv","time":"2017-12-06T06:23:08.352-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjUuMXwyLjF8b3wxMHxfTlZffDM","node":{"__typename":"Tag","id":"tag:Office 365 APIs","text":"Office 365 APIs","time":"2017-11-16T12:53:34.758-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjUuMXwyLjF8b3wxMHxfTlZffDQ","node":{"__typename":"Tag","id":"tag:powershell","text":"powershell","time":"2016-07-21T12:39:39.959-07:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjUuMXwyLjF8b3wxMHxfTlZffDU","node":{"__typename":"Tag","id":"tag:Stream","text":"Stream","time":"2017-06-19T23:40:16.204-07:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjUuMXwyLjF8b3wxMHxfTlZffDY","node":{"__typename":"Tag","id":"tag:Videos","text":"Videos","time":"2017-06-20T01:53:01.073-07:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}}]},"timeToRead":15,"currentRevision":{"__ref":"Revision:revision:1752149_3"},"latestVersion":null,"metrics":{"__typename":"MessageMetrics","views":65551},"visibilityScope":"PUBLIC","canonicalUrl":null,"seoTitle":null,"seoDescription":null,"isEscalated":null,"placeholder":false,"originalMessageForPlaceholder":null,"messagePolicies":{"__typename":"MessagePolicies","canModerateSpamMessage":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","key":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","args":[]}}},"archivalData":null,"searchSnippet":"...65-stream/m-p/1752149\n\n\twhich inspired Twan van Beers to write\n\thttps://neroblanco.co.uk/2022/02/get-list-of-videos-from-microsoft-stream/\n\t\n\tI've then taken Twan's script and modified it to do what I r...","replies":{"__typename":"MessageConnection","edges":[{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDAwMDQ3MSw0MDAwNDcx","node":{"__ref":"ForumReplyMessage:message:4000471"}},{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDAwMDQ3MSwzOTQzMDMz","node":{"__ref":"ForumReplyMessage:message:3943033"}},{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDAwMDQ3MSwzNzE4MDcz","node":{"__ref":"ForumReplyMessage:message:3718073"}},{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDAwMDQ3MSwzNjA0Mzcw","node":{"__ref":"ForumReplyMessage:message:3604370"}},{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDAwMDQ3MSwzMTAzNDM2","node":{"__ref":"ForumReplyMessage:message:3103436"}},{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDAwMDQ3MSwzMDkwOTU5","node":{"__ref":"ForumReplyMessage:message:3090959"}},{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDAwMDQ3MSwzMDczMzky","node":{"__ref":"ForumReplyMessage:message:3073392"}},{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDAwMDQ3MSwzMDYxMjU2","node":{"__ref":"ForumReplyMessage:message:3061256"}},{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDAwMDQ3MSwyOTkxNDQ1","node":{"__ref":"ForumReplyMessage:message:2991445"}},{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDAwMDQ3MSwyOTc4NDU5","node":{"__ref":"ForumReplyMessage:message:2978459"}}],"pageInfo":{"__typename":"PageInfo","hasNextPage":true,"endCursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDAwMDQ3MSwyOTc4NDU5","hasPreviousPage":false,"startCursor":null}},"customFields":[]},"Conversation:conversation:1752149":{"__typename":"Conversation","id":"conversation:1752149","solved":true,"topic":{"__ref":"ForumTopicMessage:message:1752149"},"lastPostingActivityTime":"2023-12-04T14:11:44.008-08:00","lastPostTime":"2023-12-04T14:11:44.008-08:00","unreadReplyCount":73,"isSubscribed":false},"ModerationData:moderation_data:1752149":{"__typename":"ModerationData","id":"moderation_data:1752149","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"Revision:revision:1752149_3":{"__typename":"Revision","id":"revision:1752149_3","lastEditTime":"2022-10-11T17:15:10.396-07:00"},"CachedAsset:theme:customTheme1-1745160780424":{"__typename":"CachedAsset","id":"theme:customTheme1-1745160780424","value":{"id":"customTheme1","animation":{"fast":"150ms","normal":"250ms","slow":"500ms","slowest":"750ms","function":"cubic-bezier(0.07, 0.91, 0.51, 1)","__typename":"AnimationThemeSettings"},"avatar":{"borderRadius":"50%","collections":["default"],"__typename":"AvatarThemeSettings"},"basics":{"browserIcon":{"imageAssetName":"favicon-1730836283320.png","imageLastModified":"1730836286415","__typename":"ThemeAsset"},"customerLogo":{"imageAssetName":"favicon-1730836271365.png","imageLastModified":"1730836274203","__typename":"ThemeAsset"},"maximumWidthOfPageContent":"1300px","oneColumnNarrowWidth":"800px","gridGutterWidthMd":"30px","gridGutterWidthXs":"10px","pageWidthStyle":"WIDTH_OF_BROWSER","__typename":"BasicsThemeSettings"},"buttons":{"borderRadiusSm":"3px","borderRadius":"3px","borderRadiusLg":"5px","paddingY":"5px","paddingYLg":"7px","paddingYHero":"var(--lia-bs-btn-padding-y-lg)","paddingX":"12px","paddingXLg":"16px","paddingXHero":"60px","fontStyle":"NORMAL","fontWeight":"700","textTransform":"NONE","disabledOpacity":0.5,"primaryTextColor":"var(--lia-bs-white)","primaryTextHoverColor":"var(--lia-bs-white)","primaryTextActiveColor":"var(--lia-bs-white)","primaryBgColor":"var(--lia-bs-primary)","primaryBgHoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.85))","primaryBgActiveColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.7))","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","primaryBorderActive":"1px solid transparent","primaryBorderFocus":"1px solid var(--lia-bs-white)","primaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","secondaryTextColor":"var(--lia-bs-gray-900)","secondaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","secondaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","secondaryBgColor":"var(--lia-bs-gray-200)","secondaryBgHoverColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.96))","secondaryBgActiveColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.92))","secondaryBorder":"1px solid transparent","secondaryBorderHover":"1px solid transparent","secondaryBorderActive":"1px solid transparent","secondaryBorderFocus":"1px solid transparent","secondaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","tertiaryTextColor":"var(--lia-bs-gray-900)","tertiaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","tertiaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","tertiaryBgColor":"transparent","tertiaryBgHoverColor":"transparent","tertiaryBgActiveColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.04)","tertiaryBorder":"1px solid transparent","tertiaryBorderHover":"1px solid hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","tertiaryBorderActive":"1px solid transparent","tertiaryBorderFocus":"1px solid transparent","tertiaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","destructiveTextColor":"var(--lia-bs-danger)","destructiveTextHoverColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.95))","destructiveTextActiveColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.9))","destructiveBgColor":"var(--lia-bs-gray-200)","destructiveBgHoverColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.96))","destructiveBgActiveColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.92))","destructiveBorder":"1px solid transparent","destructiveBorderHover":"1px solid transparent","destructiveBorderActive":"1px solid transparent","destructiveBorderFocus":"1px solid transparent","destructiveBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","__typename":"ButtonsThemeSettings"},"border":{"color":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","mainContent":"NONE","sideContent":"LIGHT","radiusSm":"3px","radius":"5px","radiusLg":"9px","radius50":"100vw","__typename":"BorderThemeSettings"},"boxShadow":{"xs":"0 0 0 1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08), 0 3px 0 -1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.16)","sm":"0 2px 4px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.12)","md":"0 5px 15px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.3)","lg":"0 10px 30px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.3)","__typename":"BoxShadowThemeSettings"},"cards":{"bgColor":"var(--lia-panel-bg-color)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":"var(--lia-box-shadow-xs)","__typename":"CardsThemeSettings"},"chip":{"maxWidth":"300px","height":"30px","__typename":"ChipThemeSettings"},"coreTypes":{"defaultMessageLinkColor":"var(--lia-bs-link-color)","defaultMessageLinkDecoration":"none","defaultMessageLinkFontStyle":"NORMAL","defaultMessageLinkFontWeight":"400","defaultMessageFontStyle":"NORMAL","defaultMessageFontWeight":"400","forumColor":"#4099E2","forumFontFamily":"var(--lia-bs-font-family-base)","forumFontWeight":"var(--lia-default-message-font-weight)","forumLineHeight":"var(--lia-bs-line-height-base)","forumFontStyle":"var(--lia-default-message-font-style)","forumMessageLinkColor":"var(--lia-default-message-link-color)","forumMessageLinkDecoration":"var(--lia-default-message-link-decoration)","forumMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","forumMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","forumSolvedColor":"#148563","blogColor":"#1CBAA0","blogFontFamily":"var(--lia-bs-font-family-base)","blogFontWeight":"var(--lia-default-message-font-weight)","blogLineHeight":"1.75","blogFontStyle":"var(--lia-default-message-font-style)","blogMessageLinkColor":"var(--lia-default-message-link-color)","blogMessageLinkDecoration":"var(--lia-default-message-link-decoration)","blogMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","blogMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","tkbColor":"#4C6B90","tkbFontFamily":"var(--lia-bs-font-family-base)","tkbFontWeight":"var(--lia-default-message-font-weight)","tkbLineHeight":"1.75","tkbFontStyle":"var(--lia-default-message-font-style)","tkbMessageLinkColor":"var(--lia-default-message-link-color)","tkbMessageLinkDecoration":"var(--lia-default-message-link-decoration)","tkbMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","tkbMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaColor":"#4099E2","qandaFontFamily":"var(--lia-bs-font-family-base)","qandaFontWeight":"var(--lia-default-message-font-weight)","qandaLineHeight":"var(--lia-bs-line-height-base)","qandaFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkColor":"var(--lia-default-message-link-color)","qandaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","qandaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaSolvedColor":"#3FA023","ideaColor":"#FF8000","ideaFontFamily":"var(--lia-bs-font-family-base)","ideaFontWeight":"var(--lia-default-message-font-weight)","ideaLineHeight":"var(--lia-bs-line-height-base)","ideaFontStyle":"var(--lia-default-message-font-style)","ideaMessageLinkColor":"var(--lia-default-message-link-color)","ideaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","ideaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","ideaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","contestColor":"#FCC845","contestFontFamily":"var(--lia-bs-font-family-base)","contestFontWeight":"var(--lia-default-message-font-weight)","contestLineHeight":"var(--lia-bs-line-height-base)","contestFontStyle":"var(--lia-default-message-link-font-style)","contestMessageLinkColor":"var(--lia-default-message-link-color)","contestMessageLinkDecoration":"var(--lia-default-message-link-decoration)","contestMessageLinkFontStyle":"ITALIC","contestMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","occasionColor":"#D13A1F","occasionFontFamily":"var(--lia-bs-font-family-base)","occasionFontWeight":"var(--lia-default-message-font-weight)","occasionLineHeight":"var(--lia-bs-line-height-base)","occasionFontStyle":"var(--lia-default-message-font-style)","occasionMessageLinkColor":"var(--lia-default-message-link-color)","occasionMessageLinkDecoration":"var(--lia-default-message-link-decoration)","occasionMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","occasionMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","grouphubColor":"#333333","categoryColor":"#949494","communityColor":"#FFFFFF","productColor":"#949494","__typename":"CoreTypesThemeSettings"},"colors":{"black":"#000000","white":"#FFFFFF","gray100":"#F7F7F7","gray200":"#F7F7F7","gray300":"#E8E8E8","gray400":"#D9D9D9","gray500":"#CCCCCC","gray600":"#717171","gray700":"#707070","gray800":"#545454","gray900":"#333333","dark":"#545454","light":"#F7F7F7","primary":"#0069D4","secondary":"#333333","bodyText":"#1E1E1E","bodyBg":"#FFFFFF","info":"#409AE2","success":"#41C5AE","warning":"#FCC844","danger":"#BC341B","alertSystem":"#FF6600","textMuted":"#707070","highlight":"#FFFCAD","outline":"var(--lia-bs-primary)","custom":["#D3F5A4","#243A5E"],"__typename":"ColorsThemeSettings"},"divider":{"size":"3px","marginLeft":"4px","marginRight":"4px","borderRadius":"50%","bgColor":"var(--lia-bs-gray-600)","bgColorActive":"var(--lia-bs-gray-600)","__typename":"DividerThemeSettings"},"dropdown":{"fontSize":"var(--lia-bs-font-size-sm)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius-sm)","dividerBg":"var(--lia-bs-gray-300)","itemPaddingY":"5px","itemPaddingX":"20px","headerColor":"var(--lia-bs-gray-700)","__typename":"DropdownThemeSettings"},"email":{"link":{"color":"#0069D4","hoverColor":"#0061c2","decoration":"none","hoverDecoration":"underline","__typename":"EmailLinkSettings"},"border":{"color":"#e4e4e4","__typename":"EmailBorderSettings"},"buttons":{"borderRadiusLg":"5px","paddingXLg":"16px","paddingYLg":"7px","fontWeight":"700","primaryTextColor":"#ffffff","primaryTextHoverColor":"#ffffff","primaryBgColor":"#0069D4","primaryBgHoverColor":"#005cb8","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","__typename":"EmailButtonsSettings"},"panel":{"borderRadius":"5px","borderColor":"#e4e4e4","__typename":"EmailPanelSettings"},"__typename":"EmailThemeSettings"},"emoji":{"skinToneDefault":"#ffcd43","skinToneLight":"#fae3c5","skinToneMediumLight":"#e2cfa5","skinToneMedium":"#daa478","skinToneMediumDark":"#a78058","skinToneDark":"#5e4d43","__typename":"EmojiThemeSettings"},"heading":{"color":"var(--lia-bs-body-color)","fontFamily":"Segoe UI","fontStyle":"NORMAL","fontWeight":"400","h1FontSize":"34px","h2FontSize":"32px","h3FontSize":"28px","h4FontSize":"24px","h5FontSize":"20px","h6FontSize":"16px","lineHeight":"1.3","subHeaderFontSize":"11px","subHeaderFontWeight":"500","h1LetterSpacing":"normal","h2LetterSpacing":"normal","h3LetterSpacing":"normal","h4LetterSpacing":"normal","h5LetterSpacing":"normal","h6LetterSpacing":"normal","subHeaderLetterSpacing":"2px","h1FontWeight":"var(--lia-bs-headings-font-weight)","h2FontWeight":"var(--lia-bs-headings-font-weight)","h3FontWeight":"var(--lia-bs-headings-font-weight)","h4FontWeight":"var(--lia-bs-headings-font-weight)","h5FontWeight":"var(--lia-bs-headings-font-weight)","h6FontWeight":"var(--lia-bs-headings-font-weight)","__typename":"HeadingThemeSettings"},"icons":{"size10":"10px","size12":"12px","size14":"14px","size16":"16px","size20":"20px","size24":"24px","size30":"30px","size40":"40px","size50":"50px","size60":"60px","size80":"80px","size120":"120px","size160":"160px","__typename":"IconsThemeSettings"},"imagePreview":{"bgColor":"var(--lia-bs-gray-900)","titleColor":"var(--lia-bs-white)","controlColor":"var(--lia-bs-white)","controlBgColor":"var(--lia-bs-gray-800)","__typename":"ImagePreviewThemeSettings"},"input":{"borderColor":"var(--lia-bs-gray-600)","disabledColor":"var(--lia-bs-gray-600)","focusBorderColor":"var(--lia-bs-primary)","labelMarginBottom":"10px","btnFontSize":"var(--lia-bs-font-size-sm)","focusBoxShadow":"0 0 0 3px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","checkLabelMarginBottom":"2px","checkboxBorderRadius":"3px","borderRadiusSm":"var(--lia-bs-border-radius-sm)","borderRadius":"var(--lia-bs-border-radius)","borderRadiusLg":"var(--lia-bs-border-radius-lg)","formTextMarginTop":"4px","textAreaBorderRadius":"var(--lia-bs-border-radius)","activeFillColor":"var(--lia-bs-primary)","__typename":"InputThemeSettings"},"loading":{"dotDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.2)","dotLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.5)","barDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.06)","barLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.4)","__typename":"LoadingThemeSettings"},"link":{"color":"var(--lia-bs-primary)","hoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) - 10%))","decoration":"none","hoverDecoration":"underline","__typename":"LinkThemeSettings"},"listGroup":{"itemPaddingY":"15px","itemPaddingX":"15px","borderColor":"var(--lia-bs-gray-300)","__typename":"ListGroupThemeSettings"},"modal":{"contentTextColor":"var(--lia-bs-body-color)","contentBg":"var(--lia-bs-white)","backgroundBg":"var(--lia-bs-black)","smSize":"440px","mdSize":"760px","lgSize":"1080px","backdropOpacity":0.3,"contentBoxShadowXs":"var(--lia-bs-box-shadow-sm)","contentBoxShadow":"var(--lia-bs-box-shadow)","headerFontWeight":"700","__typename":"ModalThemeSettings"},"navbar":{"position":"FIXED","background":{"attachment":null,"clip":null,"color":"var(--lia-bs-white)","imageAssetName":"","imageLastModified":"0","origin":null,"position":"CENTER_CENTER","repeat":"NO_REPEAT","size":"COVER","__typename":"BackgroundProps"},"backgroundOpacity":0.8,"paddingTop":"15px","paddingBottom":"15px","borderBottom":"1px solid var(--lia-bs-border-color)","boxShadow":"var(--lia-bs-box-shadow-sm)","brandMarginRight":"30px","brandMarginRightSm":"10px","brandLogoHeight":"30px","linkGap":"10px","linkJustifyContent":"flex-start","linkPaddingY":"5px","linkPaddingX":"10px","linkDropdownPaddingY":"9px","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkColor":"var(--lia-bs-body-color)","linkHoverColor":"var(--lia-bs-primary)","linkFontSize":"var(--lia-bs-font-size-sm)","linkFontStyle":"NORMAL","linkFontWeight":"400","linkTextTransform":"NONE","linkLetterSpacing":"normal","linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkBgColor":"transparent","linkBgHoverColor":"transparent","linkBorder":"none","linkBorderHover":"none","linkBoxShadow":"none","linkBoxShadowHover":"none","linkTextBorderBottom":"none","linkTextBorderBottomHover":"none","dropdownPaddingTop":"10px","dropdownPaddingBottom":"15px","dropdownPaddingX":"10px","dropdownMenuOffset":"2px","dropdownDividerMarginTop":"10px","dropdownDividerMarginBottom":"10px","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","controllerIconColor":"var(--lia-bs-body-color)","controllerIconHoverColor":"var(--lia-bs-body-color)","controllerTextColor":"var(--lia-nav-controller-icon-color)","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","controllerHighlightColor":"hsla(30, 100%, 50%)","controllerHighlightTextColor":"var(--lia-yiq-light)","controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerColor":"var(--lia-nav-controller-icon-color)","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","hamburgerBgColor":"transparent","hamburgerBgHoverColor":"transparent","hamburgerBorder":"none","hamburgerBorderHover":"none","collapseMenuMarginLeft":"20px","collapseMenuDividerBg":"var(--lia-nav-link-color)","collapseMenuDividerOpacity":0.16,"__typename":"NavbarThemeSettings"},"pager":{"textColor":"var(--lia-bs-link-color)","textFontWeight":"var(--lia-font-weight-md)","textFontSize":"var(--lia-bs-font-size-sm)","__typename":"PagerThemeSettings"},"panel":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-bs-border-radius)","borderColor":"var(--lia-bs-border-color)","boxShadow":"none","__typename":"PanelThemeSettings"},"popover":{"arrowHeight":"8px","arrowWidth":"16px","maxWidth":"300px","minWidth":"100px","headerBg":"var(--lia-bs-white)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius)","boxShadow":"0 0.5rem 1rem hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.15)","__typename":"PopoverThemeSettings"},"prism":{"color":"#000000","bgColor":"#f5f2f0","fontFamily":"var(--font-family-monospace)","fontSize":"var(--lia-bs-font-size-base)","fontWeightBold":"var(--lia-bs-font-weight-bold)","fontStyleItalic":"italic","tabSize":2,"highlightColor":"#b3d4fc","commentColor":"#62707e","punctuationColor":"#6f6f6f","namespaceOpacity":"0.7","propColor":"#990055","selectorColor":"#517a00","operatorColor":"#906736","operatorBgColor":"hsla(0, 0%, 100%, 0.5)","keywordColor":"#0076a9","functionColor":"#d3284b","variableColor":"#c14700","__typename":"PrismThemeSettings"},"rte":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":" var(--lia-panel-box-shadow)","customColor1":"#bfedd2","customColor2":"#fbeeb8","customColor3":"#f8cac6","customColor4":"#eccafa","customColor5":"#c2e0f4","customColor6":"#2dc26b","customColor7":"#f1c40f","customColor8":"#e03e2d","customColor9":"#b96ad9","customColor10":"#3598db","customColor11":"#169179","customColor12":"#e67e23","customColor13":"#ba372a","customColor14":"#843fa1","customColor15":"#236fa1","customColor16":"#ecf0f1","customColor17":"#ced4d9","customColor18":"#95a5a6","customColor19":"#7e8c8d","customColor20":"#34495e","customColor21":"#000000","customColor22":"#ffffff","defaultMessageHeaderMarginTop":"40px","defaultMessageHeaderMarginBottom":"20px","defaultMessageItemMarginTop":"0","defaultMessageItemMarginBottom":"10px","diffAddedColor":"hsla(170, 53%, 51%, 0.4)","diffChangedColor":"hsla(43, 97%, 63%, 0.4)","diffNoneColor":"hsla(0, 0%, 80%, 0.4)","diffRemovedColor":"hsla(9, 74%, 47%, 0.4)","specialMessageHeaderMarginTop":"40px","specialMessageHeaderMarginBottom":"20px","specialMessageItemMarginTop":"0","specialMessageItemMarginBottom":"10px","__typename":"RteThemeSettings"},"tags":{"bgColor":"var(--lia-bs-gray-200)","bgHoverColor":"var(--lia-bs-gray-400)","borderRadius":"var(--lia-bs-border-radius-sm)","color":"var(--lia-bs-body-color)","hoverColor":"var(--lia-bs-body-color)","fontWeight":"var(--lia-font-weight-md)","fontSize":"var(--lia-font-size-xxs)","textTransform":"UPPERCASE","letterSpacing":"0.5px","__typename":"TagsThemeSettings"},"toasts":{"borderRadius":"var(--lia-bs-border-radius)","paddingX":"12px","__typename":"ToastsThemeSettings"},"typography":{"fontFamilyBase":"Segoe UI","fontStyleBase":"NORMAL","fontWeightBase":"400","fontWeightLight":"300","fontWeightNormal":"400","fontWeightMd":"500","fontWeightBold":"700","letterSpacingSm":"normal","letterSpacingXs":"normal","lineHeightBase":"1.5","fontSizeBase":"16px","fontSizeXxs":"11px","fontSizeXs":"12px","fontSizeSm":"14px","fontSizeLg":"20px","fontSizeXl":"24px","smallFontSize":"14px","customFonts":[{"source":"SERVER","name":"Segoe UI","styles":[{"style":"NORMAL","weight":"400","__typename":"FontStyleData"},{"style":"NORMAL","weight":"300","__typename":"FontStyleData"},{"style":"NORMAL","weight":"600","__typename":"FontStyleData"},{"style":"NORMAL","weight":"700","__typename":"FontStyleData"},{"style":"ITALIC","weight":"400","__typename":"FontStyleData"}],"assetNames":["SegoeUI-normal-400.woff2","SegoeUI-normal-300.woff2","SegoeUI-normal-600.woff2","SegoeUI-normal-700.woff2","SegoeUI-italic-400.woff2"],"__typename":"CustomFont"},{"source":"SERVER","name":"MWF Fluent Icons","styles":[{"style":"NORMAL","weight":"400","__typename":"FontStyleData"}],"assetNames":["MWFFluentIcons-normal-400.woff2"],"__typename":"CustomFont"}],"__typename":"TypographyThemeSettings"},"unstyledListItem":{"marginBottomSm":"5px","marginBottomMd":"10px","marginBottomLg":"15px","marginBottomXl":"20px","marginBottomXxl":"25px","__typename":"UnstyledListItemThemeSettings"},"yiq":{"light":"#ffffff","dark":"#000000","__typename":"YiqThemeSettings"},"colorLightness":{"primaryDark":0.36,"primaryLight":0.74,"primaryLighter":0.89,"primaryLightest":0.95,"infoDark":0.39,"infoLight":0.72,"infoLighter":0.85,"infoLightest":0.93,"successDark":0.24,"successLight":0.62,"successLighter":0.8,"successLightest":0.91,"warningDark":0.39,"warningLight":0.68,"warningLighter":0.84,"warningLightest":0.93,"dangerDark":0.41,"dangerLight":0.72,"dangerLighter":0.89,"dangerLightest":0.95,"__typename":"ColorLightnessThemeSettings"},"localOverride":false,"__typename":"Theme"},"localOverride":false},"CachedAsset:text:en_US-components/common/EmailVerification-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1745505309992","value":{"email.verification.title":"Email Verification Required","email.verification.message.update.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. To change your email, visit My Settings.","email.verification.message.resend.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. Resend email."},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1745505309992","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:quilt:o365.prod:pages/forums/ForumMessagePage:board:StreamForum-1745502712767":{"__typename":"CachedAsset","id":"quilt:o365.prod:pages/forums/ForumMessagePage:board:StreamForum-1745502712767","value":{"id":"ForumMessagePage","container":{"id":"Common","headerProps":{"backgroundImageProps":null,"backgroundColor":null,"addComponents":null,"removeComponents":["community.widget.bannerWidget"],"componentOrder":null,"__typename":"QuiltContainerSectionProps"},"headerComponentProps":{"community.widget.breadcrumbWidget":{"disableLastCrumbForDesktop":false}},"footerProps":null,"footerComponentProps":null,"items":[{"id":"section-1733174818610","layout":"ONE_COLUMN","bgColor":null,"showTitle":null,"showDescription":null,"textPosition":null,"textColor":null,"sectionEditLevel":null,"bgImage":null,"disableSpacing":null,"edgeToEdgeDisplay":null,"fullHeight":null,"showBorder":null,"__typename":"OneColumnQuiltSection","columnMap":{"main":[],"__typename":"OneSectionColumns"}},{"id":"message-list","layout":"MAIN_SIDE","bgColor":null,"showTitle":null,"showDescription":null,"textPosition":null,"textColor":null,"sectionEditLevel":null,"bgImage":null,"disableSpacing":null,"edgeToEdgeDisplay":null,"fullHeight":null,"showBorder":null,"__typename":"MainSideQuiltSection","columnMap":{"main":[{"id":"messages.widget.topicWithThreadedReplyListWidget","className":"lia-topic-with-replies","props":{"editLevel":"CONFIGURE"},"__typename":"QuiltComponent"}],"side":[{"id":"custom.widget.Featured_Resources","className":null,"props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":true,"title":"Resources","lazyLoad":false},"__typename":"QuiltComponent"}],"__typename":"MainSideSectionColumns"}}],"__typename":"QuiltContainer"},"__typename":"Quilt","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-pages/forums/ForumMessagePage-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-pages/forums/ForumMessagePage-1745505309992","value":{"title":"{contextMessageSubject} | {communityTitle}","errorMissing":"This message cannot be found","name":"Forum Message Page","section.message-list.title":"Forum Discussion","archivedMessageTitle":"This Content Has Been Archived","section.TqVYTs.title":"Forum Discussion"},"localOverride":false},"CachedAsset:quiltWrapper:o365.prod:Common:1745505311086":{"__typename":"CachedAsset","id":"quiltWrapper:o365.prod:Common:1745505311086","value":{"id":"Common","header":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"id":"community.widget.navbarWidget","props":{"showUserName":true,"showRegisterLink":true,"useIconLanguagePicker":true,"useLabelLanguagePicker":true,"className":"QuiltComponent_lia-component-edit-mode__0nCcm","links":{"sideLinks":[],"mainLinks":[{"children":[],"linkType":"INTERNAL","id":"gxcuf89792","params":{},"routeName":"CommunityPage"},{"children":[],"linkType":"EXTERNAL","id":"external-link","url":"/Directory","target":"SELF"},{"children":[{"linkType":"INTERNAL","id":"microsoft365","params":{"categoryId":"microsoft365"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"windows","params":{"categoryId":"Windows"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"Common-microsoft365-copilot-link","params":{"categoryId":"Microsoft365Copilot"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-teams","params":{"categoryId":"MicrosoftTeams"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-securityand-compliance","params":{"categoryId":"microsoft-security"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"azure","params":{"categoryId":"Azure"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"Common-content_management-link","params":{"categoryId":"Content_Management"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"exchange","params":{"categoryId":"Exchange"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"windows-server","params":{"categoryId":"Windows-Server"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"outlook","params":{"categoryId":"Outlook"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-endpoint-manager","params":{"categoryId":"microsoftintune"},"routeName":"CategoryPage"},{"linkType":"EXTERNAL","id":"external-link-2","url":"/Directory","target":"SELF"}],"linkType":"EXTERNAL","id":"communities","url":"/","target":"BLANK"},{"children":[{"linkType":"INTERNAL","id":"a-i","params":{"categoryId":"AI"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"education-sector","params":{"categoryId":"EducationSector"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"partner-community","params":{"categoryId":"PartnerCommunity"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"i-t-ops-talk","params":{"categoryId":"ITOpsTalk"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"healthcare-and-life-sciences","params":{"categoryId":"HealthcareAndLifeSciences"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-mechanics","params":{"categoryId":"MicrosoftMechanics"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"public-sector","params":{"categoryId":"PublicSector"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"s-m-b","params":{"categoryId":"MicrosoftforNonprofits"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"io-t","params":{"categoryId":"IoT"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"startupsat-microsoft","params":{"categoryId":"StartupsatMicrosoft"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"driving-adoption","params":{"categoryId":"DrivingAdoption"},"routeName":"CategoryPage"},{"linkType":"EXTERNAL","id":"external-link-1","url":"/Directory","target":"SELF"}],"linkType":"EXTERNAL","id":"communities-1","url":"/","target":"SELF"},{"children":[],"linkType":"EXTERNAL","id":"external","url":"/Blogs","target":"SELF"},{"children":[],"linkType":"EXTERNAL","id":"external-1","url":"/Events","target":"SELF"},{"children":[{"linkType":"INTERNAL","id":"microsoft-learn-1","params":{"categoryId":"MicrosoftLearn"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-learn-blog","params":{"boardId":"MicrosoftLearnBlog","categoryId":"MicrosoftLearn"},"routeName":"BlogBoardPage"},{"linkType":"EXTERNAL","id":"external-10","url":"https://learningroomdirectory.microsoft.com/","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-3","url":"https://docs.microsoft.com/learn/dynamics365/?WT.mc_id=techcom_header-webpage-m365","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-4","url":"https://docs.microsoft.com/learn/m365/?wt.mc_id=techcom_header-webpage-m365","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-5","url":"https://docs.microsoft.com/learn/topics/sci/?wt.mc_id=techcom_header-webpage-m365","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-6","url":"https://docs.microsoft.com/learn/powerplatform/?wt.mc_id=techcom_header-webpage-powerplatform","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-7","url":"https://docs.microsoft.com/learn/github/?wt.mc_id=techcom_header-webpage-github","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-8","url":"https://docs.microsoft.com/learn/teams/?wt.mc_id=techcom_header-webpage-teams","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-9","url":"https://docs.microsoft.com/learn/dotnet/?wt.mc_id=techcom_header-webpage-dotnet","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-2","url":"https://docs.microsoft.com/learn/azure/?WT.mc_id=techcom_header-webpage-m365","target":"BLANK"}],"linkType":"INTERNAL","id":"microsoft-learn","params":{"categoryId":"MicrosoftLearn"},"routeName":"CategoryPage"},{"children":[],"linkType":"INTERNAL","id":"community-info-center","params":{"categoryId":"Community-Info-Center"},"routeName":"CategoryPage"}]},"style":{"boxShadow":"var(--lia-bs-box-shadow-sm)","controllerHighlightColor":"hsla(30, 100%, 50%)","linkFontWeight":"400","dropdownDividerMarginBottom":"10px","hamburgerBorderHover":"none","linkBoxShadowHover":"none","linkFontSize":"14px","backgroundOpacity":0.8,"controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerBgColor":"transparent","hamburgerColor":"var(--lia-nav-controller-icon-color)","linkTextBorderBottom":"none","brandLogoHeight":"30px","linkBgHoverColor":"transparent","linkLetterSpacing":"normal","collapseMenuDividerOpacity":0.16,"dropdownPaddingBottom":"15px","paddingBottom":"15px","dropdownMenuOffset":"2px","hamburgerBgHoverColor":"transparent","borderBottom":"1px solid var(--lia-bs-border-color)","hamburgerBorder":"none","dropdownPaddingX":"10px","brandMarginRightSm":"10px","linkBoxShadow":"none","collapseMenuDividerBg":"var(--lia-nav-link-color)","linkColor":"var(--lia-bs-body-color)","linkJustifyContent":"flex-start","dropdownPaddingTop":"10px","controllerHighlightTextColor":"var(--lia-yiq-dark)","controllerTextColor":"var(--lia-nav-controller-icon-color)","background":{"imageAssetName":"","color":"var(--lia-bs-white)","size":"COVER","repeat":"NO_REPEAT","position":"CENTER_CENTER","imageLastModified":""},"linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkHoverColor":"var(--lia-bs-body-color)","position":"FIXED","linkBorder":"none","linkTextBorderBottomHover":"2px solid var(--lia-bs-body-color)","brandMarginRight":"30px","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","linkBorderHover":"none","collapseMenuMarginLeft":"20px","linkFontStyle":"NORMAL","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","linkPaddingX":"10px","linkPaddingY":"5px","paddingTop":"15px","linkTextTransform":"NONE","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","linkBgColor":"transparent","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkDropdownPaddingY":"9px","controllerIconColor":"var(--lia-bs-body-color)","dropdownDividerMarginTop":"10px","linkGap":"10px","controllerIconHoverColor":"var(--lia-bs-body-color)"},"showSearchIcon":false,"languagePickerStyle":"iconAndLabel"},"__typename":"QuiltComponent"},{"id":"community.widget.breadcrumbWidget","props":{"backgroundColor":"transparent","linkHighlightColor":"var(--lia-bs-primary)","visualEffects":{"showBottomBorder":true},"linkTextColor":"var(--lia-bs-gray-700)"},"__typename":"QuiltComponent"},{"id":"custom.widget.community_banner","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"usePageWidth":false,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.HeroBanner","props":{"widgetVisibility":"signedInOrAnonymous","usePageWidth":false,"useTitle":true,"cMax_items":3,"useBackground":false,"title":"","lazyLoad":false,"widgetChooser":"custom.widget.HeroBanner"},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"footer":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"id":"custom.widget.MicrosoftFooter","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"__typename":"QuiltWrapper","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-components/common/ActionFeedback-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1745505309992","value":{"joinedGroupHub.title":"Welcome","joinedGroupHub.message":"You are now a member of this group and are subscribed to updates.","groupHubInviteNotFound.title":"Invitation Not Found","groupHubInviteNotFound.message":"Sorry, we could not find your invitation to the group. The owner may have canceled the invite.","groupHubNotFound.title":"Group Not Found","groupHubNotFound.message":"The grouphub you tried to join does not exist. It may have been deleted.","existingGroupHubMember.title":"Already Joined","existingGroupHubMember.message":"You are already a member of this group.","accountLocked.title":"Account Locked","accountLocked.message":"Your account has been locked due to multiple failed attempts. Try again in {lockoutTime} minutes.","editedGroupHub.title":"Changes Saved","editedGroupHub.message":"Your group has been updated.","leftGroupHub.title":"Goodbye","leftGroupHub.message":"You are no longer a member of this group and will not receive future updates.","deletedGroupHub.title":"Deleted","deletedGroupHub.message":"The group has been deleted.","groupHubCreated.title":"Group Created","groupHubCreated.message":"{groupHubName} is ready to use","accountClosed.title":"Account Closed","accountClosed.message":"The account has been closed and you will now be redirected to the homepage","resetTokenExpired.title":"Reset Password Link has Expired","resetTokenExpired.message":"Try resetting your password again","invalidUrl.title":"Invalid URL","invalidUrl.message":"The URL you're using is not recognized. Verify your URL and try again.","accountClosedForUser.title":"Account Closed","accountClosedForUser.message":"{userName}'s account is closed","inviteTokenInvalid.title":"Invitation Invalid","inviteTokenInvalid.message":"Your invitation to the community has been canceled or expired.","inviteTokenError.title":"Invitation Verification Failed","inviteTokenError.message":"The url you are utilizing is not recognized. Verify your URL and try again","pageNotFound.title":"Access Denied","pageNotFound.message":"You do not have access to this area of the community or it doesn't exist","eventAttending.title":"Responded as Attending","eventAttending.message":"You'll be notified when there's new activity and reminded as the event approaches","eventInterested.title":"Responded as Interested","eventInterested.message":"You'll be notified when there's new activity and reminded as the event approaches","eventNotFound.title":"Event Not Found","eventNotFound.message":"The event you tried to respond to does not exist.","redirectToRelatedPage.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.message":"The content you are trying to access is archived","redirectToRelatedPage.message":"The content you are trying to access is archived","relatedUrl.archivalLink.flyoutMessage":"The content you are trying to access is archived View Archived Content"},"localOverride":false},"CachedAsset:component:custom.widget.community_banner-en-1745160816752":{"__typename":"CachedAsset","id":"component:custom.widget.community_banner-en-1745160816752","value":{"component":{"id":"custom.widget.community_banner","template":{"id":"community_banner","markupLanguage":"HANDLEBARS","style":".community-banner {\n a.top-bar.btn {\n top: 0px;\n width: 100%;\n z-index: 999;\n text-align: center;\n left: 0px;\n background: #0068b8;\n color: white;\n padding: 10px 0px;\n display: block;\n box-shadow: none !important;\n border: none !important;\n border-radius: none !important;\n margin: 0px !important;\n font-size: 14px;\n }\n}\n","texts":null,"defaults":{"config":{"applicablePages":[],"description":"community announcement text","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.community_banner","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"community announcement text","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":{"css":".custom_widget_community_banner_community-banner_1x9u2_1 {\n a.custom_widget_community_banner_top-bar_1x9u2_2.custom_widget_community_banner_btn_1x9u2_2 {\n top: 0;\n width: 100%;\n z-index: 999;\n text-align: center;\n left: 0;\n background: #0068b8;\n color: white;\n padding: 0.625rem 0;\n display: block;\n box-shadow: none !important;\n border: none !important;\n border-radius: none !important;\n margin: 0 !important;\n font-size: 0.875rem;\n }\n}\n","tokens":{"community-banner":"custom_widget_community_banner_community-banner_1x9u2_1","top-bar":"custom_widget_community_banner_top-bar_1x9u2_2","btn":"custom_widget_community_banner_btn_1x9u2_2"}},"form":null},"localOverride":false},"CachedAsset:component:custom.widget.HeroBanner-en-1745160816752":{"__typename":"CachedAsset","id":"component:custom.widget.HeroBanner-en-1745160816752","value":{"component":{"id":"custom.widget.HeroBanner","template":{"id":"HeroBanner","markupLanguage":"REACT","style":null,"texts":{"searchPlaceholderText":"Search this community","followActionText":"Follow","unfollowActionText":"Following","searchOnHoverText":"Please enter your search term(s) and then press return key to complete a search.","blogs.sidebar.pagetitle":"Latest Blogs | Microsoft Tech Community","followThisNode":"Follow this node","unfollowThisNode":"Unfollow this node"},"defaults":{"config":{"applicablePages":[],"description":null,"fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[{"id":"max_items","dataType":"NUMBER","list":false,"defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"control":"INPUT","__typename":"PropDefinition"}],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.HeroBanner","form":{"fields":[{"id":"widgetChooser","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"title","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useTitle","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useBackground","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"widgetVisibility","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"moreOptions","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"cMax_items","validation":null,"noValidation":null,"dataType":"NUMBER","list":false,"control":"INPUT","defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"__typename":"FormField"}],"layout":{"rows":[{"id":"widgetChooserGroup","type":"fieldset","as":null,"items":[{"id":"widgetChooser","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"titleGroup","type":"fieldset","as":null,"items":[{"id":"title","className":null,"__typename":"FormFieldRef"},{"id":"useTitle","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"useBackground","type":"fieldset","as":null,"items":[{"id":"useBackground","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"widgetVisibility","type":"fieldset","as":null,"items":[{"id":"widgetVisibility","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"moreOptionsGroup","type":"fieldset","as":null,"items":[{"id":"moreOptions","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"componentPropsGroup","type":"fieldset","as":null,"items":[{"id":"cMax_items","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"}],"actionButtons":null,"className":"custom_widget_HeroBanner_form","formGroupFieldSeparator":"divider","__typename":"FormLayout"},"__typename":"Form"},"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":null,"fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[{"id":"max_items","dataType":"NUMBER","list":false,"defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"control":"INPUT","__typename":"PropDefinition"}],"__typename":"ComponentProperties"},"form":{"fields":[{"id":"widgetChooser","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"title","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useTitle","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useBackground","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"widgetVisibility","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"moreOptions","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"cMax_items","validation":null,"noValidation":null,"dataType":"NUMBER","list":false,"control":"INPUT","defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"__typename":"FormField"}],"layout":{"rows":[{"id":"widgetChooserGroup","type":"fieldset","as":null,"items":[{"id":"widgetChooser","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"titleGroup","type":"fieldset","as":null,"items":[{"id":"title","className":null,"__typename":"FormFieldRef"},{"id":"useTitle","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"useBackground","type":"fieldset","as":null,"items":[{"id":"useBackground","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"widgetVisibility","type":"fieldset","as":null,"items":[{"id":"widgetVisibility","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"moreOptionsGroup","type":"fieldset","as":null,"items":[{"id":"moreOptions","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"componentPropsGroup","type":"fieldset","as":null,"items":[{"id":"cMax_items","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"}],"actionButtons":null,"className":"custom_widget_HeroBanner_form","formGroupFieldSeparator":"divider","__typename":"FormLayout"},"__typename":"Form"},"__typename":"Component","localOverride":false},"globalCss":null,"form":{"fields":[{"id":"widgetChooser","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"title","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useTitle","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useBackground","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"widgetVisibility","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"moreOptions","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"cMax_items","validation":null,"noValidation":null,"dataType":"NUMBER","list":false,"control":"INPUT","defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"__typename":"FormField"}],"layout":{"rows":[{"id":"widgetChooserGroup","type":"fieldset","as":null,"items":[{"id":"widgetChooser","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"titleGroup","type":"fieldset","as":null,"items":[{"id":"title","className":null,"__typename":"FormFieldRef"},{"id":"useTitle","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"useBackground","type":"fieldset","as":null,"items":[{"id":"useBackground","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"widgetVisibility","type":"fieldset","as":null,"items":[{"id":"widgetVisibility","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"moreOptionsGroup","type":"fieldset","as":null,"items":[{"id":"moreOptions","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"componentPropsGroup","type":"fieldset","as":null,"items":[{"id":"cMax_items","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"}],"actionButtons":null,"className":"custom_widget_HeroBanner_form","formGroupFieldSeparator":"divider","__typename":"FormLayout"},"__typename":"Form"}},"localOverride":false},"CachedAsset:component:custom.widget.Featured_Resources-en-1745160816752":{"__typename":"CachedAsset","id":"component:custom.widget.Featured_Resources-en-1745160816752","value":{"component":{"id":"custom.widget.Featured_Resources","template":{"id":"Featured_Resources","markupLanguage":"REACT","style":null,"texts":{"resourceTitle":"Title","titlePlaceholder":"Resource title","urlPlaceholder":"Resource URL","resourceUrl":"URL","addResource":"Add Resource","cancel":"Cancel","removeResource":"Remove Resource","error":"Error","itemNotSaved":"Item not saved. {message}","errorMessage":"An error occurred. Please try again."},"defaults":{"config":{"applicablePages":[],"description":null,"fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Featured_Resources","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":null,"fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.MicrosoftFooter-en-1745160816752":{"__typename":"CachedAsset","id":"component:custom.widget.MicrosoftFooter-en-1745160816752","value":{"component":{"id":"custom.widget.MicrosoftFooter","template":{"id":"MicrosoftFooter","markupLanguage":"HANDLEBARS","style":".context-uhf {\n min-width: 280px;\n font-size: 15px;\n box-sizing: border-box;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n & *,\n & *:before,\n & *:after {\n box-sizing: inherit;\n }\n a.c-uhff-link {\n color: #616161;\n word-break: break-word;\n text-decoration: none;\n }\n &a:link,\n &a:focus,\n &a:hover,\n &a:active,\n &a:visited {\n text-decoration: none;\n color: inherit;\n }\n & div {\n font-family: 'Segoe UI', SegoeUI, 'Helvetica Neue', Helvetica, Arial, sans-serif;\n }\n}\n.c-uhff {\n background: #f2f2f2;\n margin: -1.5625;\n width: auto;\n height: auto;\n}\n.c-uhff-nav {\n margin: 0 auto;\n max-width: calc(1600px + 10%);\n padding: 0 5%;\n box-sizing: inherit;\n &:before,\n &:after {\n content: ' ';\n display: table;\n clear: left;\n }\n @media only screen and (max-width: 1083px) {\n padding-left: 12px;\n }\n .c-heading-4 {\n color: #616161;\n word-break: break-word;\n font-size: 15px;\n line-height: 20px;\n padding: 36px 0 4px;\n font-weight: 600;\n }\n .c-uhff-nav-row {\n .c-uhff-nav-group {\n display: block;\n float: left;\n min-height: 1px;\n vertical-align: text-top;\n padding: 0 12px;\n width: 100%;\n zoom: 1;\n &:first-child {\n padding-left: 0;\n @media only screen and (max-width: 1083px) {\n padding-left: 12px;\n }\n }\n @media only screen and (min-width: 540px) and (max-width: 1082px) {\n width: 33.33333%;\n }\n @media only screen and (min-width: 1083px) {\n width: 16.6666666667%;\n }\n ul.c-list.f-bare {\n font-size: 11px;\n line-height: 16px;\n margin-top: 0;\n margin-bottom: 0;\n padding-left: 0;\n list-style-type: none;\n li {\n word-break: break-word;\n padding: 8px 0;\n margin: 0;\n }\n }\n }\n }\n}\n.c-uhff-base {\n background: #f2f2f2;\n margin: 0 auto;\n max-width: calc(1600px + 10%);\n padding: 30px 5% 16px;\n &:before,\n &:after {\n content: ' ';\n display: table;\n }\n &:after {\n clear: both;\n }\n a.c-uhff-ccpa {\n font-size: 11px;\n line-height: 16px;\n float: left;\n margin: 3px 0;\n }\n a.c-uhff-ccpa:hover {\n text-decoration: underline;\n }\n ul.c-list {\n font-size: 11px;\n line-height: 16px;\n float: right;\n margin: 3px 0;\n color: #616161;\n li {\n padding: 0 24px 4px 0;\n display: inline-block;\n }\n }\n .c-list.f-bare {\n padding-left: 0;\n list-style-type: none;\n }\n @media only screen and (max-width: 1083px) {\n display: flex;\n flex-wrap: wrap;\n padding: 30px 24px 16px;\n }\n}\n\n.social-share {\n position: fixed;\n top: 60%;\n transform: translateY(-50%);\n left: 0;\n z-index: 1000;\n}\n\n.sharing-options {\n list-style: none;\n padding: 0;\n margin: 0;\n display: block;\n flex-direction: column;\n background-color: white;\n width: 43px;\n border-radius: 0px 7px 7px 0px;\n}\n.linkedin-icon {\n border-top-right-radius: 7px;\n}\n.linkedin-icon:hover {\n border-radius: 0;\n}\n.social-share-rss-image {\n border-bottom-right-radius: 7px;\n}\n.social-share-rss-image:hover {\n border-radius: 0;\n}\n\n.social-link-footer {\n position: relative;\n display: block;\n margin: -2px 0;\n transition: all 0.2s ease;\n}\n.social-link-footer:hover .linkedin-icon {\n border-radius: 0;\n}\n.social-link-footer:hover .social-share-rss-image {\n border-radius: 0;\n}\n\n.social-link-footer img {\n width: 40px;\n height: auto;\n transition: filter 0.3s ease;\n}\n\n.social-share-list {\n width: 40px;\n}\n.social-share-rss-image {\n width: 40px;\n}\n\n.share-icon {\n border: 2px solid transparent;\n display: inline-block;\n position: relative;\n}\n\n.share-icon:hover {\n opacity: 1;\n border: 2px solid white;\n box-sizing: border-box;\n}\n\n.share-icon:hover .label {\n opacity: 1;\n visibility: visible;\n border: 2px solid white;\n box-sizing: border-box;\n border-left: none;\n}\n\n.label {\n position: absolute;\n left: 100%;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n transition: all 0.2s ease;\n color: white;\n border-radius: 0 10 0 10px;\n top: 50%;\n transform: translateY(-50%);\n height: 40px;\n border-radius: 0 6px 6px 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px 5px 20px 8px;\n margin-left: -1px;\n}\n.linkedin {\n background-color: #0474b4;\n}\n.facebook {\n background-color: #3c5c9c;\n}\n.twitter {\n background-color: white;\n color: black;\n}\n.reddit {\n background-color: #fc4404;\n}\n.mail {\n background-color: #848484;\n}\n.bluesky {\n background-color: white;\n color: black;\n}\n.rss {\n background-color: #ec7b1c;\n}\n#RSS {\n width: 40px;\n height: 40px;\n}\n\n@media (max-width: 991px) {\n .social-share {\n display: none;\n }\n}\n","texts":{"New tab":"What's New","New 1":"Surface Laptop Studio 2","New 2":"Surface Laptop Go 3","New 3":"Surface Pro 9","New 4":"Surface Laptop 5","New 5":"Surface Studio 2+","New 6":"Copilot in Windows","New 7":"Microsoft 365","New 8":"Windows 11 apps","Store tab":"Microsoft Store","Store 1":"Account Profile","Store 2":"Download Center","Store 3":"Microsoft Store Support","Store 4":"Returns","Store 5":"Order tracking","Store 6":"Certified Refurbished","Store 7":"Microsoft Store Promise","Store 8":"Flexible Payments","Education tab":"Education","Edu 1":"Microsoft in education","Edu 2":"Devices for education","Edu 3":"Microsoft Teams for Education","Edu 4":"Microsoft 365 Education","Edu 5":"How to buy for your school","Edu 6":"Educator Training and development","Edu 7":"Deals for students and parents","Edu 8":"Azure for students","Business tab":"Business","Bus 1":"Microsoft Cloud","Bus 2":"Microsoft Security","Bus 3":"Dynamics 365","Bus 4":"Microsoft 365","Bus 5":"Microsoft Power Platform","Bus 6":"Microsoft Teams","Bus 7":"Microsoft Industry","Bus 8":"Small Business","Developer tab":"Developer & IT","Dev 1":"Azure","Dev 2":"Developer Center","Dev 3":"Documentation","Dev 4":"Microsoft Learn","Dev 5":"Microsoft Tech Community","Dev 6":"Azure Marketplace","Dev 7":"AppSource","Dev 8":"Visual Studio","Company tab":"Company","Com 1":"Careers","Com 2":"About Microsoft","Com 3":"Company News","Com 4":"Privacy at Microsoft","Com 5":"Investors","Com 6":"Diversity and inclusion","Com 7":"Accessiblity","Com 8":"Sustainibility"},"defaults":{"config":{"applicablePages":[],"description":"The Microsoft Footer","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.MicrosoftFooter","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"The Microsoft Footer","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":{"css":".custom_widget_MicrosoftFooter_context-uhf_105bp_1 {\n min-width: 17.5rem;\n font-size: 0.9375rem;\n box-sizing: border-box;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n & *,\n & *:before,\n & *:after {\n box-sizing: inherit;\n }\n a.custom_widget_MicrosoftFooter_c-uhff-link_105bp_12 {\n color: #616161;\n word-break: break-word;\n text-decoration: none;\n }\n &a:link,\n &a:focus,\n &a:hover,\n &a:active,\n &a:visited {\n text-decoration: none;\n color: inherit;\n }\n & div {\n font-family: 'Segoe UI', SegoeUI, 'Helvetica Neue', Helvetica, Arial, sans-serif;\n }\n}\n.custom_widget_MicrosoftFooter_c-uhff_105bp_12 {\n background: #f2f2f2;\n margin: -1.5625;\n width: auto;\n height: auto;\n}\n.custom_widget_MicrosoftFooter_c-uhff-nav_105bp_35 {\n margin: 0 auto;\n max-width: calc(100rem + 10%);\n padding: 0 5%;\n box-sizing: inherit;\n &:before,\n &:after {\n content: ' ';\n display: table;\n clear: left;\n }\n @media only screen and (max-width: 1083px) {\n padding-left: 0.75rem;\n }\n .custom_widget_MicrosoftFooter_c-heading-4_105bp_49 {\n color: #616161;\n word-break: break-word;\n font-size: 0.9375rem;\n line-height: 1.25rem;\n padding: 2.25rem 0 0.25rem;\n font-weight: 600;\n }\n .custom_widget_MicrosoftFooter_c-uhff-nav-row_105bp_57 {\n .custom_widget_MicrosoftFooter_c-uhff-nav-group_105bp_58 {\n display: block;\n float: left;\n min-height: 0.0625rem;\n vertical-align: text-top;\n padding: 0 0.75rem;\n width: 100%;\n zoom: 1;\n &:first-child {\n padding-left: 0;\n @media only screen and (max-width: 1083px) {\n padding-left: 0.75rem;\n }\n }\n @media only screen and (min-width: 540px) and (max-width: 1082px) {\n width: 33.33333%;\n }\n @media only screen and (min-width: 1083px) {\n width: 16.6666666667%;\n }\n ul.custom_widget_MicrosoftFooter_c-list_105bp_78.custom_widget_MicrosoftFooter_f-bare_105bp_78 {\n font-size: 0.6875rem;\n line-height: 1rem;\n margin-top: 0;\n margin-bottom: 0;\n padding-left: 0;\n list-style-type: none;\n li {\n word-break: break-word;\n padding: 0.5rem 0;\n margin: 0;\n }\n }\n }\n }\n}\n.custom_widget_MicrosoftFooter_c-uhff-base_105bp_94 {\n background: #f2f2f2;\n margin: 0 auto;\n max-width: calc(100rem + 10%);\n padding: 1.875rem 5% 1rem;\n &:before,\n &:after {\n content: ' ';\n display: table;\n }\n &:after {\n clear: both;\n }\n a.custom_widget_MicrosoftFooter_c-uhff-ccpa_105bp_107 {\n font-size: 0.6875rem;\n line-height: 1rem;\n float: left;\n margin: 0.1875rem 0;\n }\n a.custom_widget_MicrosoftFooter_c-uhff-ccpa_105bp_107:hover {\n text-decoration: underline;\n }\n ul.custom_widget_MicrosoftFooter_c-list_105bp_78 {\n font-size: 0.6875rem;\n line-height: 1rem;\n float: right;\n margin: 0.1875rem 0;\n color: #616161;\n li {\n padding: 0 1.5rem 0.25rem 0;\n display: inline-block;\n }\n }\n .custom_widget_MicrosoftFooter_c-list_105bp_78.custom_widget_MicrosoftFooter_f-bare_105bp_78 {\n padding-left: 0;\n list-style-type: none;\n }\n @media only screen and (max-width: 1083px) {\n display: flex;\n flex-wrap: wrap;\n padding: 1.875rem 1.5rem 1rem;\n }\n}\n.custom_widget_MicrosoftFooter_social-share_105bp_138 {\n position: fixed;\n top: 60%;\n transform: translateY(-50%);\n left: 0;\n z-index: 1000;\n}\n.custom_widget_MicrosoftFooter_sharing-options_105bp_146 {\n list-style: none;\n padding: 0;\n margin: 0;\n display: block;\n flex-direction: column;\n background-color: white;\n width: 2.6875rem;\n border-radius: 0 0.4375rem 0.4375rem 0;\n}\n.custom_widget_MicrosoftFooter_linkedin-icon_105bp_156 {\n border-top-right-radius: 7px;\n}\n.custom_widget_MicrosoftFooter_linkedin-icon_105bp_156:hover {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162 {\n border-bottom-right-radius: 7px;\n}\n.custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162:hover {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169 {\n position: relative;\n display: block;\n margin: -0.125rem 0;\n transition: all 0.2s ease;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169:hover .custom_widget_MicrosoftFooter_linkedin-icon_105bp_156 {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169:hover .custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162 {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169 img {\n width: 2.5rem;\n height: auto;\n transition: filter 0.3s ease;\n}\n.custom_widget_MicrosoftFooter_social-share-list_105bp_188 {\n width: 2.5rem;\n}\n.custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162 {\n width: 2.5rem;\n}\n.custom_widget_MicrosoftFooter_share-icon_105bp_195 {\n border: 2px solid transparent;\n display: inline-block;\n position: relative;\n}\n.custom_widget_MicrosoftFooter_share-icon_105bp_195:hover {\n opacity: 1;\n border: 2px solid white;\n box-sizing: border-box;\n}\n.custom_widget_MicrosoftFooter_share-icon_105bp_195:hover .custom_widget_MicrosoftFooter_label_105bp_207 {\n opacity: 1;\n visibility: visible;\n border: 2px solid white;\n box-sizing: border-box;\n border-left: none;\n}\n.custom_widget_MicrosoftFooter_label_105bp_207 {\n position: absolute;\n left: 100%;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n transition: all 0.2s ease;\n color: white;\n border-radius: 0 10 0 0.625rem;\n top: 50%;\n transform: translateY(-50%);\n height: 2.5rem;\n border-radius: 0 0.375rem 0.375rem 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1.25rem 0.3125rem 1.25rem 0.5rem;\n margin-left: -0.0625rem;\n}\n.custom_widget_MicrosoftFooter_linkedin_105bp_156 {\n background-color: #0474b4;\n}\n.custom_widget_MicrosoftFooter_facebook_105bp_237 {\n background-color: #3c5c9c;\n}\n.custom_widget_MicrosoftFooter_twitter_105bp_240 {\n background-color: white;\n color: black;\n}\n.custom_widget_MicrosoftFooter_reddit_105bp_244 {\n background-color: #fc4404;\n}\n.custom_widget_MicrosoftFooter_mail_105bp_247 {\n background-color: #848484;\n}\n.custom_widget_MicrosoftFooter_bluesky_105bp_250 {\n background-color: white;\n color: black;\n}\n.custom_widget_MicrosoftFooter_rss_105bp_254 {\n background-color: #ec7b1c;\n}\n#custom_widget_MicrosoftFooter_RSS_105bp_1 {\n width: 2.5rem;\n height: 2.5rem;\n}\n@media (max-width: 991px) {\n .custom_widget_MicrosoftFooter_social-share_105bp_138 {\n display: none;\n }\n}\n","tokens":{"context-uhf":"custom_widget_MicrosoftFooter_context-uhf_105bp_1","c-uhff-link":"custom_widget_MicrosoftFooter_c-uhff-link_105bp_12","c-uhff":"custom_widget_MicrosoftFooter_c-uhff_105bp_12","c-uhff-nav":"custom_widget_MicrosoftFooter_c-uhff-nav_105bp_35","c-heading-4":"custom_widget_MicrosoftFooter_c-heading-4_105bp_49","c-uhff-nav-row":"custom_widget_MicrosoftFooter_c-uhff-nav-row_105bp_57","c-uhff-nav-group":"custom_widget_MicrosoftFooter_c-uhff-nav-group_105bp_58","c-list":"custom_widget_MicrosoftFooter_c-list_105bp_78","f-bare":"custom_widget_MicrosoftFooter_f-bare_105bp_78","c-uhff-base":"custom_widget_MicrosoftFooter_c-uhff-base_105bp_94","c-uhff-ccpa":"custom_widget_MicrosoftFooter_c-uhff-ccpa_105bp_107","social-share":"custom_widget_MicrosoftFooter_social-share_105bp_138","sharing-options":"custom_widget_MicrosoftFooter_sharing-options_105bp_146","linkedin-icon":"custom_widget_MicrosoftFooter_linkedin-icon_105bp_156","social-share-rss-image":"custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162","social-link-footer":"custom_widget_MicrosoftFooter_social-link-footer_105bp_169","social-share-list":"custom_widget_MicrosoftFooter_social-share-list_105bp_188","share-icon":"custom_widget_MicrosoftFooter_share-icon_105bp_195","label":"custom_widget_MicrosoftFooter_label_105bp_207","linkedin":"custom_widget_MicrosoftFooter_linkedin_105bp_156","facebook":"custom_widget_MicrosoftFooter_facebook_105bp_237","twitter":"custom_widget_MicrosoftFooter_twitter_105bp_240","reddit":"custom_widget_MicrosoftFooter_reddit_105bp_244","mail":"custom_widget_MicrosoftFooter_mail_105bp_247","bluesky":"custom_widget_MicrosoftFooter_bluesky_105bp_250","rss":"custom_widget_MicrosoftFooter_rss_105bp_254","RSS":"custom_widget_MicrosoftFooter_RSS_105bp_1"}},"form":null},"localOverride":false},"CachedAsset:text:en_US-components/community/Breadcrumb-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1745505309992","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBanner-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBanner-1745505309992","value":{"messageMarkedAsSpam":"This post has been marked as spam","messageMarkedAsSpam@board:TKB":"This article has been marked as spam","messageMarkedAsSpam@board:BLOG":"This post has been marked as spam","messageMarkedAsSpam@board:FORUM":"This discussion has been marked as spam","messageMarkedAsSpam@board:OCCASION":"This event has been marked as spam","messageMarkedAsSpam@board:IDEA":"This idea has been marked as spam","manageSpam":"Manage Spam","messageMarkedAsAbuse":"This post has been marked as abuse","messageMarkedAsAbuse@board:TKB":"This article has been marked as abuse","messageMarkedAsAbuse@board:BLOG":"This post has been marked as abuse","messageMarkedAsAbuse@board:FORUM":"This discussion has been marked as abuse","messageMarkedAsAbuse@board:OCCASION":"This event has been marked as abuse","messageMarkedAsAbuse@board:IDEA":"This idea has been marked as abuse","preModCommentAuthorText":"This comment will be published as soon as it is approved","preModCommentModeratorText":"This comment is awaiting moderation","messageMarkedAsOther":"This post has been rejected due to other reasons","messageMarkedAsOther@board:TKB":"This article has been rejected due to other reasons","messageMarkedAsOther@board:BLOG":"This post has been rejected due to other reasons","messageMarkedAsOther@board:FORUM":"This discussion has been rejected due to other reasons","messageMarkedAsOther@board:OCCASION":"This event has been rejected due to other reasons","messageMarkedAsOther@board:IDEA":"This idea has been rejected due to other reasons","messageArchived":"This post was archived on {date}","relatedUrl":"View Related Content","relatedContentText":"Showing related content","archivedContentLink":"View Archived Content"},"localOverride":false},"Category:category:Exchange":{"__typename":"Category","id":"category:Exchange","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Outlook":{"__typename":"Category","id":"category:Outlook","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Community-Info-Center":{"__typename":"Category","id":"category:Community-Info-Center","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:EducationSector":{"__typename":"Category","id":"category:EducationSector","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:DrivingAdoption":{"__typename":"Category","id":"category:DrivingAdoption","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Azure":{"__typename":"Category","id":"category:Azure","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Windows-Server":{"__typename":"Category","id":"category:Windows-Server","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftTeams":{"__typename":"Category","id":"category:MicrosoftTeams","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:PublicSector":{"__typename":"Category","id":"category:PublicSector","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:microsoft365":{"__typename":"Category","id":"category:microsoft365","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:IoT":{"__typename":"Category","id":"category:IoT","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:HealthcareAndLifeSciences":{"__typename":"Category","id":"category:HealthcareAndLifeSciences","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:ITOpsTalk":{"__typename":"Category","id":"category:ITOpsTalk","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftLearn":{"__typename":"Category","id":"category:MicrosoftLearn","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Blog:board:MicrosoftLearnBlog":{"__typename":"Blog","id":"board:MicrosoftLearnBlog","blogPolicies":{"__typename":"BlogPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:AI":{"__typename":"Category","id":"category:AI","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftMechanics":{"__typename":"Category","id":"category:MicrosoftMechanics","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftforNonprofits":{"__typename":"Category","id":"category:MicrosoftforNonprofits","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:StartupsatMicrosoft":{"__typename":"Category","id":"category:StartupsatMicrosoft","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:PartnerCommunity":{"__typename":"Category","id":"category:PartnerCommunity","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Microsoft365Copilot":{"__typename":"Category","id":"category:Microsoft365Copilot","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Windows":{"__typename":"Category","id":"category:Windows","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Content_Management":{"__typename":"Category","id":"category:Content_Management","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:microsoft-security":{"__typename":"Category","id":"category:microsoft-security","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:microsoftintune":{"__typename":"Category","id":"category:microsoftintune","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"QueryVariables:TopicReplyList:message:1752149:3":{"__typename":"QueryVariables","id":"TopicReplyList:message:1752149:3","value":{"id":"message:1752149","first":10,"sorts":{"postTime":{"direction":"DESC"}},"repliesFirst":3,"repliesFirstDepthThree":1,"repliesSorts":{"postTime":{"direction":"DESC"}},"useAvatar":true,"useAuthorLogin":true,"useAuthorRank":true,"useBody":true,"useKudosCount":true,"useTimeToRead":false,"useMedia":false,"useReadOnlyIcon":false,"useRepliesCount":true,"useSearchSnippet":false,"useAcceptedSolutionButton":true,"useSolvedBadge":false,"useAttachments":false,"attachmentsFirst":5,"useTags":true,"useNodeAncestors":false,"useUserHoverCard":false,"useNodeHoverCard":false,"useModerationStatus":true,"usePreviewSubjectModal":false,"useMessageStatus":true}},"ROOT_MUTATION":{"__typename":"Mutation"},"CachedAsset:text:en_US-components/community/Navbar-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1745505309992","value":{"community":"Community Home","inbox":"Inbox","manageContent":"Manage Content","tos":"Terms of Service","forgotPassword":"Forgot Password","themeEditor":"Theme Editor","edit":"Edit Navigation Bar","skipContent":"Skip to content","gxcuf89792":"Tech Community","external-1":"Events","s-m-b":"Nonprofit Community","windows-server":"Windows Server","education-sector":"Education Sector","driving-adoption":"Driving Adoption","Common-content_management-link":"Content Management","microsoft-learn":"Microsoft Learn","s-q-l-server":"Content Management","partner-community":"Microsoft Partner Community","microsoft365":"Microsoft 365","external-9":".NET","external-8":"Teams","external-7":"Github","products-services":"Products","external-6":"Power Platform","communities-1":"Topics","external-5":"Microsoft Security","planner":"Outlook","external-4":"Microsoft 365","external-3":"Dynamics 365","azure":"Azure","healthcare-and-life-sciences":"Healthcare and Life Sciences","external-2":"Azure","microsoft-mechanics":"Microsoft Mechanics","microsoft-learn-1":"Community","external-10":"Learning Room Directory","microsoft-learn-blog":"Blog","windows":"Windows","i-t-ops-talk":"ITOps Talk","external-link-1":"View All","microsoft-securityand-compliance":"Microsoft Security","public-sector":"Public Sector","community-info-center":"Lounge","external-link-2":"View All","microsoft-teams":"Microsoft Teams","external":"Blogs","microsoft-endpoint-manager":"Microsoft Intune","startupsat-microsoft":"Startups at Microsoft","exchange":"Exchange","a-i":"AI and Machine Learning","io-t":"Internet of Things (IoT)","Common-microsoft365-copilot-link":"Microsoft 365 Copilot","outlook":"Microsoft 365 Copilot","external-link":"Community Hubs","communities":"Products"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarHamburgerDropdown-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1745505309992","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1745505309992","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1745505309992","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1745505309992","value":{"title.login":"Sign In","title.registration":"Register","title.forgotPassword":"Forgot Password","title.multiAuthLogin":"Sign In"},"localOverride":false},"CachedAsset:text:en_US-components/nodes/NodeLink-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1745505309992","value":{"place":"Place {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageView/MessageViewStandard-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewStandard-1745505309992","value":{"anonymous":"Anonymous","author":"{messageAuthorLogin}","authorBy":"{messageAuthorLogin}","board":"{messageBoardTitle}","replyToUser":" to {parentAuthor}","showMoreReplies":"Show More","replyText":"Reply","repliesText":"Replies","markedAsSolved":"Marked as Solved","movedMessagePlaceholder.BLOG":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.TKB":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.FORUM":"{count, plural, =0 {This reply has been} other {These replies have been} }","movedMessagePlaceholder.IDEA":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.OCCASION":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholderUrlText":"moved.","messageStatus":"Status: ","statusChanged":"Status changed: {previousStatus} to {currentStatus}","statusAdded":"Status added: {status}","statusRemoved":"Status removed: {status}","labelExpand":"expand replies","labelCollapse":"collapse replies","unhelpfulReason.reason1":"Content is outdated","unhelpfulReason.reason2":"Article is missing information","unhelpfulReason.reason3":"Content is for a different Product","unhelpfulReason.reason4":"Doesn't match what I was searching for"},"localOverride":false},"CachedAsset:text:en_US-components/messages/ThreadedReplyList-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/messages/ThreadedReplyList-1745505309992","value":{"title":"{count, plural, one{# Reply} other{# Replies}}","title@board:BLOG":"{count, plural, one{# Comment} other{# Comments}}","title@board:TKB":"{count, plural, one{# Comment} other{# Comments}}","title@board:IDEA":"{count, plural, one{# Comment} other{# Comments}}","title@board:OCCASION":"{count, plural, one{# Comment} other{# Comments}}","noRepliesTitle":"No Replies","noRepliesTitle@board:BLOG":"No Comments","noRepliesTitle@board:TKB":"No Comments","noRepliesTitle@board:IDEA":"No Comments","noRepliesTitle@board:OCCASION":"No Comments","noRepliesDescription":"Be the first to reply","noRepliesDescription@board:BLOG":"Be the first to comment","noRepliesDescription@board:TKB":"Be the first to comment","noRepliesDescription@board:IDEA":"Be the first to comment","noRepliesDescription@board:OCCASION":"Be the first to comment","messageReadOnlyAlert:BLOG":"Comments have been turned off for this post","messageReadOnlyAlert:TKB":"Comments have been turned off for this article","messageReadOnlyAlert:IDEA":"Comments have been turned off for this idea","messageReadOnlyAlert:FORUM":"Replies have been turned off for this discussion","messageReadOnlyAlert:OCCASION":"Comments have been turned off for this event"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageReplyCallToAction-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyCallToAction-1745505309992","value":{"leaveReply":"Leave a reply...","leaveReply@board:BLOG@message:root":"Leave a comment...","leaveReply@board:TKB@message:root":"Leave a comment...","leaveReply@board:IDEA@message:root":"Leave a comment...","leaveReply@board:OCCASION@message:root":"Leave a comment...","repliesTurnedOff.FORUM":"Replies are turned off for this topic","repliesTurnedOff.BLOG":"Comments are turned off for this topic","repliesTurnedOff.TKB":"Comments are turned off for this topic","repliesTurnedOff.IDEA":"Comments are turned off for this topic","repliesTurnedOff.OCCASION":"Comments are turned off for this topic","infoText":"Stop poking me!"},"localOverride":false},"Rank:rank:37":{"__typename":"Rank","id":"rank:37","position":18,"name":"Copper Contributor","color":"333333","icon":null,"rankStyle":"TEXT"},"User:user:1587600":{"__typename":"User","id":"user:1587600","uid":1587600,"login":"cmejia","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2022-10-27T10:41:16.095-07:00"},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/m_assets/avatars/default/avatar-4.svg?time=0"},"rank":{"__ref":"Rank:rank:37"},"entityType":"USER","eventPath":"community:gxcuf89792/user:1587600"},"ModerationData:moderation_data:4000471":{"__typename":"ModerationData","id":"moderation_data:4000471","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:4000471":{"__typename":"ForumReplyMessage","author":{"__ref":"User:user:1587600"},"id":"message:4000471","revisionNum":1,"uid":4000471,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumTopicMessage:message:1752149"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:4000471"},"body":"
Dorje-McKinnon Hi, I've used this script a few times this year with no problem. Thank you so much for this resource. For some reason, my results only go up to September 25 of this year (2023). Is there a way I can modify the script to search further or is this a result of Microsoft automatically saving stream videos on sharepoint as of that time?
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"208","kudosSumWeight":0,"repliesCount":0,"postTime":"2023-12-04T14:11:44.008-08:00","lastPublishTime":"2023-12-04T14:11:44.008-08:00","metrics":{"__typename":"MessageMetrics","views":1692},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:4000471","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"customFields":[]},"Rank:rank:36":{"__typename":"Rank","id":"rank:36","position":17,"name":"Brass Contributor","color":"333333","icon":null,"rankStyle":"TEXT"},"User:user:1605925":{"__typename":"User","id":"user:1605925","uid":1605925,"login":"unodei","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2022-11-09T15:10:28.742-08:00"},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/m_assets/avatars/default/avatar-10.svg?time=0"},"rank":{"__ref":"Rank:rank:36"},"entityType":"USER","eventPath":"community:gxcuf89792/user:1605925"},"ModerationData:moderation_data:3943033":{"__typename":"ModerationData","id":"moderation_data:3943033","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/cmstNC05WEo0blc\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/cmstNC05WEo0blc","height":512,"width":512,"mimeType":"image/png"},"Rank:rank:4":{"__typename":"Rank","id":"rank:4","position":6,"name":"Microsoft","color":"333333","icon":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/cmstNC05WEo0blc\"}"},"rankStyle":"OUTLINE"},"User:user:43124":{"__typename":"User","id":"user:43124","uid":43124,"login":"IgnacioDavila","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2017-03-10T10:15:44.084-08:00"},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS00MzEyNC0xMTczN2k5RjhDMkI2NzI5MEYyQjc0"},"rank":{"__ref":"Rank:rank:4"},"entityType":"USER","eventPath":"community:gxcuf89792/user:43124"},"ForumReplyMessage:message:3943033":{"__typename":"ForumReplyMessage","uid":3943033,"id":"message:3943033","revisionNum":2,"author":{"__ref":"User:user:1605925"},"readOnly":false,"repliesCount":1,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumTopicMessage:message:1752149"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:3943033"},"body":"
Is there a way to use your script above to (1) find which group does a channel belong to, and (2) set via PowerShell the video in the channel to be owned by the group's channel?
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"180","kudosSumWeight":0,"postTime":"2023-10-01T19:39:51.291-07:00","lastPublishTime":"2023-10-01T20:56:16.001-07:00","metrics":{"__typename":"MessageMetrics","views":2032},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:3943033","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwzfDEzMjowfGludCwzOTQ0NTQ3LDM5NDQ1NDc","node":{"__ref":"ForumReplyMessage:message:3944547"}}]},"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"customFields":[]},"ModerationData:moderation_data:3944547":{"__typename":"ModerationData","id":"moderation_data:3944547","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:3944547":{"__typename":"ForumReplyMessage","author":{"__ref":"User:user:43124"},"id":"message:3944547","revisionNum":1,"uid":3944547,"depth":2,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumReplyMessage:message:3943033"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:3944547"},"body":"
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"208","kudosSumWeight":0,"repliesCount":0,"postTime":"2023-10-03T07:42:10.906-07:00","lastPublishTime":"2023-10-03T07:42:10.906-07:00","metrics":{"__typename":"MessageMetrics","views":2005},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:3944547","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"customFields":[]},"User:user:263399":{"__typename":"User","id":"user:263399","uid":263399,"login":"chetan1920","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2019-01-10T08:55:17.556-08:00"},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/m_assets/avatars/default/avatar-1.svg?time=0"},"rank":{"__ref":"Rank:rank:37"},"entityType":"USER","eventPath":"community:gxcuf89792/user:263399"},"ModerationData:moderation_data:3718073":{"__typename":"ModerationData","id":"moderation_data:3718073","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:3718073":{"__typename":"ForumReplyMessage","uid":3718073,"id":"message:3718073","revisionNum":1,"author":{"__ref":"User:user:263399"},"readOnly":false,"repliesCount":1,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumTopicMessage:message:1752149"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:3718073"},"body":"Dorje-McKinnon.. thank you for sharing teh script .. it works Great.. I am looking to get iFrame url as well for all the videos we have in Stream Classic.. is there a way to get the same or you can help me with the parameter that should be used to get the iFrame urls, thanks in advance.","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"203","kudosSumWeight":0,"postTime":"2023-01-17T07:16:02.837-08:00","lastPublishTime":"2023-01-17T07:16:02.837-08:00","metrics":{"__typename":"MessageMetrics","views":3311},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:3718073","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwzfDEzMjowfGludCwzNzg1NjQ2LDM3ODU2NDY","node":{"__ref":"ForumReplyMessage:message:3785646"}}]},"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"customFields":[]},"ModerationData:moderation_data:3785646":{"__typename":"ModerationData","id":"moderation_data:3785646","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:3785646":{"__typename":"ForumReplyMessage","author":{"__ref":"User:user:228833"},"id":"message:3785646","revisionNum":1,"uid":3785646,"depth":2,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumReplyMessage:message:3718073"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:3785646"},"body":"
Hi chetan1920 , I'm sorry I don't know AND I've just turned off our Classic Stream instance so I don't have any examples I could figure it out from. Have a look at the page with the iframe and figure out what the formula /pattern of the iFrame URLs is. Then you may be able to use a concatenate function to build the URL. My guess is that there is only one part of the URL that changes for every video, possibly the ID or GUID
I hope this helps.
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"213","kudosSumWeight":0,"repliesCount":0,"postTime":"2023-04-02T13:20:47.831-07:00","lastPublishTime":"2023-04-02T13:20:47.831-07:00","metrics":{"__typename":"MessageMetrics","views":3076},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:3785646","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"customFields":[]},"User:user:566743":{"__typename":"User","id":"user:566743","uid":566743,"login":"casberts","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2020-02-24T07:15:06.890-08:00"},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/m_assets/avatars/default/avatar-5.svg?time=0"},"rank":{"__ref":"Rank:rank:37"},"entityType":"USER","eventPath":"community:gxcuf89792/user:566743"},"ModerationData:moderation_data:3604370":{"__typename":"ModerationData","id":"moderation_data:3604370","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:3604370":{"__typename":"ForumReplyMessage","uid":3604370,"id":"message:3604370","revisionNum":1,"author":{"__ref":"User:user:566743"},"readOnly":false,"repliesCount":1,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumTopicMessage:message:1752149"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:3604370"},"body":"
Dorje-McKinnon any way this could be used to update the privacy settings on the Videos from Organization to group only?
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"126","kudosSumWeight":0,"postTime":"2022-08-19T06:45:52.416-07:00","lastPublishTime":"2022-08-19T06:45:52.416-07:00","metrics":{"__typename":"MessageMetrics","views":3666},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:3604370","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwzfDEzMjowfGludCwzNjQ2NTg2LDM2NDY1ODY","node":{"__ref":"ForumReplyMessage:message:3646586"}}]},"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"customFields":[]},"ModerationData:moderation_data:3646586":{"__typename":"ModerationData","id":"moderation_data:3646586","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:3646586":{"__typename":"ForumReplyMessage","author":{"__ref":"User:user:228833"},"id":"message:3646586","revisionNum":1,"uid":3646586,"depth":2,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumReplyMessage:message:3604370"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:3646586"},"body":"casberts Sorry but I don't know a way of doing that.","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"52","kudosSumWeight":0,"repliesCount":0,"postTime":"2022-10-06T18:59:32.373-07:00","lastPublishTime":"2022-10-06T18:59:32.373-07:00","metrics":{"__typename":"MessageMetrics","views":3550},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:3646586","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"customFields":[]},"User:user:87496":{"__typename":"User","id":"user:87496","uid":87496,"login":"Twan van Beers","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2017-10-15T03:08:22.678-07:00"},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/m_assets/avatars/default/avatar-6.svg?time=0"},"rank":{"__ref":"Rank:rank:37"},"entityType":"USER","eventPath":"community:gxcuf89792/user:87496"},"ModerationData:moderation_data:3103436":{"__typename":"ModerationData","id":"moderation_data:3103436","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:3103436":{"__typename":"ForumReplyMessage","uid":3103436,"id":"message:3103436","revisionNum":1,"author":{"__ref":"User:user:87496"},"readOnly":false,"repliesCount":8,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumTopicMessage:message:1752149"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:3103436"},"body":"
Dorje-McKinnon Thanks for this script. My colleague Conrad has been using it a number of times. He asked me to improve this idea to avoid the copy/paste pieces. So I spent half a day and came up with Get List of Videos from Microsoft Stream - Nero Blanco It basically does the same thing as what you're doing but uses a scraping technique to get the date center and access token, so then it can loop through the videos without interaction!
Thanks again!
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"223","kudosSumWeight":0,"postTime":"2022-02-02T00:05:09.933-08:00","lastPublishTime":"2022-02-02T00:05:09.933-08:00","metrics":{"__typename":"MessageMetrics","views":7538},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:3103436","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwzfDEzMjowfGludCwzNjUwNTY2LDM2NTA1NjY","node":{"__ref":"ForumReplyMessage:message:3650566"}},{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwzfDEzMjowfGludCwzNjUwNTY2LDMxMDM3MTg","node":{"__ref":"ForumReplyMessage:message:3103718"}}]},"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"customFields":[]},"ModerationData:moderation_data:3650566":{"__typename":"ModerationData","id":"moderation_data:3650566","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:3650566":{"__typename":"ForumReplyMessage","author":{"__ref":"User:user:228833"},"id":"message:3650566","revisionNum":1,"uid":3650566,"depth":2,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumReplyMessage:message:3103436"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:3650566"},"body":"
Hi Twan van Beers ,thanks so much for your comment and blog post. Thanks also to ConradMurray for prompting you to work on this problem. I've just updated the code at the top of this script to a slight variation on your code, to give me the detail I needed.
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"223","kudosSumWeight":0,"repliesCount":0,"postTime":"2022-10-11T17:18:07.905-07:00","lastPublishTime":"2022-10-11T17:18:07.905-07:00","metrics":{"__typename":"MessageMetrics","views":3528},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:3650566","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"customFields":[]},"User:user:14185":{"__typename":"User","id":"user:14185","uid":14185,"login":"ScoutmanPt","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2016-09-15T14:53:02.282-07:00"},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS0xNDE4NS0zMzk1MzhpQTQ3MjlFNTVDRjA3OEIwNg"},"rank":{"__ref":"Rank:rank:37"},"entityType":"USER","eventPath":"community:gxcuf89792/user:14185"},"ModerationData:moderation_data:3103718":{"__typename":"ModerationData","id":"moderation_data:3103718","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:3103718":{"__typename":"ForumReplyMessage","uid":3103718,"id":"message:3103718","revisionNum":1,"author":{"__ref":"User:user:14185"},"readOnly":false,"repliesCount":6,"depth":2,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumReplyMessage:message:3103436"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:3103718"},"body":"Hi Twan, thanks for mentioning @Dorje and me on your blog entry . Just a quick correction: \"MS must have removed the JSON object from their pages\" that's not actually true or else the script would never work. The problem is that the page cycle order changed in the old stream portal, there's no validation on the session info which was why the script failed in some of the tenants. Im updating https://bit.ly/PnPScriptSamplesMSStream sample on the pnp repo, but I was wondering if you would like to do it, instead of me 😛 ? PnP Script Samples (https://pnp.github.io/script-samples/) is a community drive open source project and we are always keen to have more contributions.","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"203","kudosSumWeight":0,"postTime":"2022-02-02T01:19:39.265-08:00","lastPublishTime":"2022-02-02T01:19:39.265-08:00","metrics":{"__typename":"MessageMetrics","views":7523},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:3103718","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxfDEzMjowfGludCwzMTAzNzQyLDMxMDM3NDI","node":{"__ref":"ForumReplyMessage:message:3103742"}}]},"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"customFields":[]},"ModerationData:moderation_data:3103742":{"__typename":"ModerationData","id":"moderation_data:3103742","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:3103742":{"__typename":"ForumReplyMessage","author":{"__ref":"User:user:87496"},"id":"message:3103742","revisionNum":1,"uid":3103742,"depth":3,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumReplyMessage:message:3103718"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:3103742"},"body":"Hi ScoutmanPt
The error in the console was object JSON is undefined, and when I try to execute console commands in the debugger that object JSON definitely doesn't exist at all.
I'm ok to update it, just didn't want to replace someone else's work 🙂","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"203","kudosSumWeight":0,"repliesCount":5,"postTime":"2022-02-02T01:24:49.039-08:00","lastPublishTime":"2022-02-02T01:24:49.039-08:00","metrics":{"__typename":"MessageMetrics","views":7526},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:3103742","attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"customFields":[]},"User:user:53516":{"__typename":"User","id":"user:53516","uid":53516,"login":"ConradMurray","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2017-05-01T16:45:47.931-07:00"},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/m_assets/avatars/default/avatar-10.svg?time=0"},"rank":{"__ref":"Rank:rank:36"},"entityType":"USER","eventPath":"community:gxcuf89792/user:53516"},"ModerationData:moderation_data:3090959":{"__typename":"ModerationData","id":"moderation_data:3090959","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:3090959":{"__typename":"ForumReplyMessage","uid":3090959,"id":"message:3090959","revisionNum":1,"author":{"__ref":"User:user:53516"},"readOnly":false,"repliesCount":1,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumTopicMessage:message:1752149"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:3090959"},"body":"Usage details Get Tenant Total Storage used at this URL: https://web.microsoftstream.com/admin?view=UsageDetails","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"113","kudosSumWeight":0,"postTime":"2022-01-30T23:47:12.700-08:00","lastPublishTime":"2022-01-30T23:47:12.700-08:00","metrics":{"__typename":"MessageMetrics","views":7585},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:3090959","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwzfDEzMjowfGludCwzMDk0ODUwLDMwOTQ4NTA","node":{"__ref":"ForumReplyMessage:message:3094850"}}]},"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"customFields":[]},"ModerationData:moderation_data:3094850":{"__typename":"ModerationData","id":"moderation_data:3094850","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:3094850":{"__typename":"ForumReplyMessage","author":{"__ref":"User:user:228833"},"id":"message:3094850","revisionNum":1,"uid":3094850,"depth":2,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumReplyMessage:message:3090959"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:3094850"},"body":"
thanks for that, I'd forgotten I could get that info there.
I was wanting it to cross reference the total I downloaded so I have a rough check that I've got everything.
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"199","kudosSumWeight":0,"repliesCount":0,"postTime":"2022-01-31T11:18:59.344-08:00","lastPublishTime":"2022-01-31T11:18:59.344-08:00","metrics":{"__typename":"MessageMetrics","views":7562},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:3094850","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"customFields":[]},"ModerationData:moderation_data:3073392":{"__typename":"ModerationData","id":"moderation_data:3073392","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:3073392":{"__typename":"ForumReplyMessage","author":{"__ref":"User:user:53516"},"id":"message:3073392","revisionNum":1,"uid":3073392,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumTopicMessage:message:1752149"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:3073392"},"body":"Worked a charm again. Thanks, updates have been good. I think some users of the script might be trying to skip a few steps like setting the API Source in the script - most important otherwise your browser pages will 403. The save locations and then knowing that when the script pauses that you have to copy paste the browser page text into your OWN text files with a .json extension. Do all that, and you should be good to know. One thing I still really need is the file sizes though, any updates on that?","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"203","kudosSumWeight":0,"repliesCount":0,"postTime":"2022-01-26T17:34:30.437-08:00","lastPublishTime":"2022-01-26T17:34:30.437-08:00","metrics":{"__typename":"MessageMetrics","views":7610},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:3073392","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"customFields":[]},"ModerationData:moderation_data:3061256":{"__typename":"ModerationData","id":"moderation_data:3061256","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:3061256":{"__typename":"ForumReplyMessage","uid":3061256,"id":"message:3061256","revisionNum":1,"author":{"__ref":"User:user:14185"},"readOnly":false,"repliesCount":9,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumTopicMessage:message:1752149"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:3061256"},"body":"
It's wrapped up in a nice way, asking for creds and getting the tokens needed to export a csv with a report. Ill be adding more stuff soon
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"218","kudosSumWeight":0,"postTime":"2022-01-13T13:16:32.757-08:00","lastPublishTime":"2022-01-13T13:16:32.757-08:00","metrics":{"__typename":"MessageMetrics","views":7746},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:3061256","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwzfDEzMjowfGludCwzMDk0ODU1LDMwOTQ4NTU","node":{"__ref":"ForumReplyMessage:message:3094855"}},{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwzfDEzMjowfGludCwzMDk0ODU1LDMwNzMzNzk","node":{"__ref":"ForumReplyMessage:message:3073379"}},{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwzfDEzMjowfGludCwzMDk0ODU1LDMwNjE0MjQ","node":{"__ref":"ForumReplyMessage:message:3061424"}}]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"ModerationData:moderation_data:3094855":{"__typename":"ModerationData","id":"moderation_data:3094855","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:3094855":{"__typename":"ForumReplyMessage","author":{"__ref":"User:user:228833"},"id":"message:3094855","revisionNum":1,"uid":3094855,"depth":2,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumReplyMessage:message:3061256"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:3094855"},"body":"
Thanks ScoutmanPt for your code and helping out the others on this list. Appreciate it 🙂
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"101","kudosSumWeight":0,"repliesCount":0,"postTime":"2022-01-31T11:20:35.976-08:00","lastPublishTime":"2022-01-31T11:20:35.976-08:00","metrics":{"__typename":"MessageMetrics","views":7560},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:3094855","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"ModerationData:moderation_data:3073379":{"__typename":"ModerationData","id":"moderation_data:3073379","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:3073379":{"__typename":"ForumReplyMessage","uid":3073379,"id":"message:3073379","revisionNum":1,"author":{"__ref":"User:user:53516"},"readOnly":false,"repliesCount":1,"depth":2,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumReplyMessage:message:3061256"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:3073379"},"body":"
ScoutmanPt Thought this might be another option, but no...
Get-StreamToken : The term 'Get-StreamToken' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:3 char:33 + $streamTokenConfiguration = Get-StreamToken -Tenant $Tenant -Cred ... + ~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (Get-StreamToken:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
Get-RequestedAssets : The term 'Get-RequestedAssets' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:4 char:18 + $allVideos = Get-RequestedAssets -token $streamTokenConfiguration ... + ~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (Get-RequestedAssets:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
Export-ReportAssets : The term 'Export-ReportAssets' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:5 char:5 + Export-ReportAssets -assets $allVideos -label \"Videos\"-fileName \" ... + ~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (Export-ReportAssets:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
Export-ReportAssets : The term 'Export-ReportAssets' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:7 char:5 + Export-ReportAssets -assets $videosNotMigrated -label \"VideosNotM ... + ~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (Export-ReportAssets:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"208","kudosSumWeight":0,"postTime":"2022-01-26T17:09:50.364-08:00","lastPublishTime":"2022-01-26T17:09:50.364-08:00","metrics":{"__typename":"MessageMetrics","views":7613},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:3073379","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxfDEzMjowfGludCwzMDk4NzU1LDMwOTg3NTU","node":{"__ref":"ForumReplyMessage:message:3098755"}}]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"ModerationData:moderation_data:3098755":{"__typename":"ModerationData","id":"moderation_data:3098755","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:3098755":{"__typename":"ForumReplyMessage","author":{"__ref":"User:user:14185"},"id":"message:3098755","revisionNum":1,"uid":3098755,"depth":3,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumReplyMessage:message:3073379"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:3098755"},"body":"Howdy, this is definitely weird: just rechecked a couple of time and cant seam to get that error. Do you mind to open issue here?
Thanks","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"140","kudosSumWeight":0,"repliesCount":0,"postTime":"2022-02-01T06:08:38.408-08:00","lastPublishTime":"2022-02-01T06:08:38.408-08:00","metrics":{"__typename":"MessageMetrics","views":7544},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:3098755","customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"User:user:1162971":{"__typename":"User","id":"user:1162971","uid":1162971,"login":"Rolzzzz","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2021-09-21T22:50:53.048-07:00"},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/m_assets/avatars/default/avatar-12.svg?time=0"},"rank":{"__ref":"Rank:rank:37"},"entityType":"USER","eventPath":"community:gxcuf89792/user:1162971"},"ModerationData:moderation_data:3061424":{"__typename":"ModerationData","id":"moderation_data:3061424","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:3061424":{"__typename":"ForumReplyMessage","uid":3061424,"id":"message:3061424","revisionNum":1,"author":{"__ref":"User:user:1162971"},"readOnly":false,"repliesCount":5,"depth":2,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumReplyMessage:message:3061256"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:3061424"},"body":"
ScoutmanPt Was pretty excited about this, but all things I tried, I get stuck with this screen and can't get any further...
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"150","kudosSumWeight":0,"postTime":"2022-01-13T17:08:55.396-08:00","lastPublishTime":"2022-01-13T17:08:55.396-08:00","metrics":{"__typename":"MessageMetrics","views":7718},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:3061424","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxfDEzMjowfGludCwzMDYxNjA4LDMwNjE2MDg","node":{"__ref":"ForumReplyMessage:message:3061608"}}]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"ModerationData:moderation_data:3061608":{"__typename":"ModerationData","id":"moderation_data:3061608","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:3061608":{"__typename":"ForumReplyMessage","author":{"__ref":"User:user:14185"},"id":"message:3061608","revisionNum":1,"uid":3061608,"depth":3,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumReplyMessage:message:3061424"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:3061608"},"body":"
Do the following :connect to your O365 Ms stream and logout, make sure you close all the browser windows.
Buzz if have any problem.
Best regards
@Scoutmanpt
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"218","kudosSumWeight":0,"repliesCount":4,"postTime":"2022-01-14T01:07:47.004-08:00","lastPublishTime":"2022-01-14T01:07:47.004-08:00","metrics":{"__typename":"MessageMetrics","views":7725},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:3061608","customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"ModerationData:moderation_data:2991445":{"__typename":"ModerationData","id":"moderation_data:2991445","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:2991445":{"__typename":"ForumReplyMessage","uid":2991445,"id":"message:2991445","revisionNum":1,"author":{"__ref":"User:user:1162971"},"readOnly":false,"repliesCount":7,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumTopicMessage:message:1752149"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:2991445"},"body":"super script... shame the save tab to csv can't be automated as I seem to have well over 2000 videos... saving 20+ tabs is a manual pain...","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"139","kudosSumWeight":0,"postTime":"2021-11-21T21:45:25.007-08:00","lastPublishTime":"2021-11-21T21:45:25.007-08:00","metrics":{"__typename":"MessageMetrics","views":8412},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:2991445","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwzfDEzMjowfGludCwyOTk0NDcxLDI5OTQ0NzE","node":{"__ref":"ForumReplyMessage:message:2994471"}}]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"ModerationData:moderation_data:2994471":{"__typename":"ModerationData","id":"moderation_data:2994471","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:2994471":{"__typename":"ForumReplyMessage","uid":2994471,"id":"message:2994471","revisionNum":1,"author":{"__ref":"User:user:228833"},"readOnly":false,"repliesCount":6,"depth":2,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumReplyMessage:message:2991445"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:2994471"},"body":"
Rolzzzz agreed it is a pain. If you've got some coding friends see if they've got a solution. It is well above what I was able to figure out 🙂
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"150","kudosSumWeight":0,"postTime":"2021-11-22T11:22:36.303-08:00","lastPublishTime":"2021-11-22T11:22:36.303-08:00","metrics":{"__typename":"MessageMetrics","views":8400},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:2994471","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxfDEzMjowfGludCwyOTk0NzI3LDI5OTQ3Mjc","node":{"__ref":"ForumReplyMessage:message:2994727"}}]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"ModerationData:moderation_data:2994727":{"__typename":"ModerationData","id":"moderation_data:2994727","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:2994727":{"__typename":"ForumReplyMessage","author":{"__ref":"User:user:1162971"},"id":"message:2994727","revisionNum":1,"uid":2994727,"depth":3,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumReplyMessage:message:2994471"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:2994727"},"body":"
Dorje-McKinnon I'm going to see if \"Invoke-WebRequest\" is something we can use to automate it
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"145","kudosSumWeight":0,"repliesCount":5,"postTime":"2021-11-22T12:24:21.792-08:00","lastPublishTime":"2021-11-22T12:24:21.792-08:00","metrics":{"__typename":"MessageMetrics","views":8391},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:2994727","customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"User:user:1222170":{"__typename":"User","id":"user:1222170","uid":1222170,"login":"rgupta255","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2021-11-17T17:26:40.829-08:00"},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/m_assets/avatars/default/avatar-3.svg?time=0"},"rank":{"__ref":"Rank:rank:37"},"entityType":"USER","eventPath":"community:gxcuf89792/user:1222170"},"ModerationData:moderation_data:2978459":{"__typename":"ModerationData","id":"moderation_data:2978459","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ForumReplyMessage:message:2978459":{"__typename":"ForumReplyMessage","author":{"__ref":"User:user:1222170"},"id":"message:2978459","revisionNum":1,"uid":2978459,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumTopicMessage:message:1752149"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:2978459"},"body":"Thanks Dorje for this amazing script. This is going to help tremendously as we are migrating tenants.
Has anyone found a way to mass download the videos? We have folks that have left the company with lots of videos but doing them 1 by one would be painful.","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"203","kudosSumWeight":0,"repliesCount":0,"postTime":"2021-11-17T17:31:00.371-08:00","lastPublishTime":"2021-11-17T17:31:00.371-08:00","metrics":{"__typename":"MessageMetrics","views":8425},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"isEscalated":null,"solution":false,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:2978459","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"QueryVariables:MessageSolutions":{"__typename":"QueryVariables","id":"MessageSolutions","value":{"first":10,"constraints":{"topicId":{"eq":"message:1752149"},"solution":{"eq":true}},"sorts":{"postTime":{"direction":"ASC"}},"useAvatar":true,"useAuthorLogin":true,"useAuthorRank":false,"useBody":true,"useKudosCount":false,"useTimeToRead":false,"useMedia":true,"useRepliesCount":false,"useSearchSnippet":false,"useAcceptedSolutionButton":true,"useSolvedBadge":false,"useAttachments":true,"useTags":false,"useUserHoverCard":false,"useNodeHoverCard":false,"usePreviewSubjectModal":false,"useMessageStatus":false}},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1745505309992","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1745505309992","value":{"title":"Query Handler"},"localOverride":false},"CachedAsset:text:en_US-components/messages/EscalatedMessageBanner-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/messages/EscalatedMessageBanner-1745505309992","value":{"escalationMessage":"Escalated to Salesforce by {username} on {date}","viewDetails":"View Details","modalTitle":"Case Details","escalatedBy":"Escalated by: ","escalatedOn":"Escalated on: ","caseNumber":"Case Number: ","status":"Status: ","lastUpdateDate":"Last Update: ","automaticEscalation":"automatic escalation","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1745505309992","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserRank-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserRank-1745505309992","value":{"rankName":"{rankName}","userRank":"Author rank {rankName}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageTime-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTime-1745505309992","value":{"postTime":"Published: {time}","lastPublishTime":"Last Update: {time}","conversation.lastPostingActivityTime":"Last posting activity time: {time}","conversation.lastPostTime":"Last post time: {time}","moderationData.rejectTime":"Rejected time: {time}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSolvedBadge-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSolvedBadge-1745505309992","value":{"solved":"Solved"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSubject-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1745505309992","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1745505309992","value":{"showMessageBody":"Show More","mentionsErrorTitle":"{mentionsType, select, board {Board} user {User} message {Message} other {}} No Longer Available","mentionsErrorMessage":"The {mentionsType} you are trying to view has been removed from the community.","videoProcessing":"Video is being processed. Please try again in a few minutes.","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageCustomFields-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageCustomFields-1745505309992","value":{"CustomField.default.label":"Value of {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageReplyButton-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyButton-1745505309992","value":{"repliesCount":"{count}","title":"Reply","title@board:BLOG@message:root":"Comment","title@board:TKB@message:root":"Comment","title@board:IDEA@message:root":"Comment","title@board:OCCASION@message:root":"Comment"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSolutionList-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSolutionList-1745505309992","value":{"emptyDescription":"No has been message solutions yet"},"localOverride":false},"User:user:114":{"__typename":"User","id":"user:114","uid":114,"login":"Marc Mroz","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2016-06-28T14:11:24.210-07:00"},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS0xMTQtNDI5NzY2aUE0RDUzQzlGMzRFNURDQUE"},"entityType":"USER","eventPath":"community:gxcuf89792/user:114"},"User:user:1579394":{"__typename":"User","id":"user:1579394","deleted":false,"uid":1579394,"login":"JavierBach","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2022-10-21T21:52:12.569-07:00"}},"ForumReplyMessage:message:3659105":{"__typename":"ForumReplyMessage","uid":3659105,"id":"message:3659105","revisionNum":1,"author":{"__ref":"User:user:1579394"},"readOnly":false},"ModerationData:moderation_data:3659226":{"__typename":"ModerationData","id":"moderation_data:3659226","status":"APPROVED","rejectReason":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zNjU5MjI2LTQxNDkyMWlFQ0UyMjk2RTVGODk4OTA3?revision=1\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zNjU5MjI2LTQxNDkyMWlFQ0UyMjk2RTVGODk4OTA3?revision=1","title":"MarcMroz_2-1666449425576.png","associationType":"BODY","width":698,"height":438,"altText":null},"AcceptedSolutionMessage:message:3659226":{"__typename":"AcceptedSolutionMessage","author":{"__ref":"User:user:114"},"id":"message:3659226","revisionNum":1,"uid":3659226,"depth":3,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Forum:board:StreamForum"},"parent":{"__ref":"ForumReplyMessage:message:3659105"},"conversation":{"__ref":"Conversation:conversation:1752149"},"subject":"Re: Powershell Script to list ALL videos in your 365 Stream environment","moderationData":{"__ref":"ModerationData:moderation_data:3659226"},"body":"
Anyone looking at this script should also look at the PowerShell script that was released by Microsoft as part of the Stream (Classic) migration tools. The PowerShell script released by Microsoft can be downloaded directly from Stream (Classic) admin page and also has a PowerBI Desktop template that can be used to analyze the output CSVs.
\n
\n
See this part of the migration help articles for more info:
","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":200})@stringLength":"203","postTime":"2022-10-22T07:37:21.323-07:00","lastPublishTime":"2022-10-22T07:37:21.323-07:00","images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zNjU5MjI2LTQxNDkyMWlFQ0UyMjk2RTVGODk4OTA3?revision=1\"}"}}],"totalCount":1,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"attachments":{"__typename":"AttachmentConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"solution":true,"metrics":{"__typename":"MessageMetrics","views":10210},"placeholder":false,"originalMessageForPlaceholder":null,"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"isEscalated":null,"entityType":"FORUM_REPLY","eventPath":"category:MicrosoftStream/category:products-services/category:communities/community:gxcuf89792board:StreamForum/message:1752149/message:3659226","customFields":[]},"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1745505309992","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/ranks/UserRankLabel-1745505309992","value":{"altTitle":"Icon for {rankName} rank"},"localOverride":false},"CachedAsset:text:en_US-components/messages/AcceptedSolutionButton-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/messages/AcceptedSolutionButton-1745505309992","value":{"accept":"Mark as Solution","accepted":"Marked as Solution","errorHeader":"Error!","errorAdd":"There was an error marking as solution.","errorRemove":"There was an error unmarking as solution.","solved":"Solved"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Pager/PagerLoadMore-1745505309992","value":{"loadMore":"Show More"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMorePreviousNextLinkable-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Pager/PagerLoadMorePreviousNextLinkable-1745505309992","value":{"loadMore":"Show More"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1745505309992":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagView/TagViewChip-1745505309992","value":{"tagLabelName":"Tag name {tagName}"},"localOverride":false}}}},"page":"/forums/ForumMessagePage/ForumMessagePage","query":{"boardId":"streamforum","messageSubject":"powershell-script-to-list-all-videos-in-your-365-stream-environment","messageId":"1752149"},"buildId":"HEhyUrv5OXNBIbfCLaOrw","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"o365","openTelemetryServiceVersion":"25.1.0","openTelemetryUniverse":"prod","openTelemetryCollector":"http://localhost:4318","openTelemetryRouteChangeAllowedTime":"5000","apolloDevToolsEnabled":false,"inboxMuteWipFeatureEnabled":false},"isFallback":false,"isExperimentalCompile":false,"dynamicIds":["./components/seo/QAPageSchema/QAPageSchema.tsx","./components/community/Navbar/NavbarWidget.tsx","./components/community/Breadcrumb/BreadcrumbWidget.tsx","./components/customComponent/CustomComponent/CustomComponent.tsx","./components/messages/TopicWithThreadedReplyListWidget/TopicWithThreadedReplyListWidget.tsx","./components/external/components/ExternalComponent.tsx","./components/messages/MessageView/MessageViewStandard/MessageViewStandard.tsx","./components/messages/ThreadedReplyList/ThreadedReplyList.tsx","../shared/client/components/common/List/UnstyledList/UnstyledList.tsx","./components/messages/MessageView/MessageView.tsx","../shared/client/components/common/Pager/PagerLoadMore/PagerLoadMore.tsx","../shared/client/components/common/Pager/PagerLoadMorePreviousNextLinkable/PagerLoadMorePreviousNextLinkable.tsx","../shared/client/components/common/List/UnwrappedList/UnwrappedList.tsx","./components/tags/TagView/TagView.tsx","./components/tags/TagView/TagViewChip/TagViewChip.tsx"],"appGip":true,"scriptLoader":[{"id":"analytics","src":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/pagescripts/1730819800000/analytics.js?page.id=ForumMessagePage&entity.id=board%3Astreamforum&entity.id=message%3A1752149","strategy":"afterInteractive"}]}