Stream migration tool FAQ

This article summarizes the frequently asked questions about Stream migration tool.

I don’t see all my Stream (Classic) videos in the migration tool.

I don’t see all my Stream (Classic) video in the inventory report.

No, all videos in Stream (Classic) should be visible in the inventory report. Search the report via Stream video ID. You can find this ID at the end of video playback URL, for example, https://web.microsoftstream.com/video/videoid

Migration tool shows fewer videos in my Microsoft 365 group or company channel than videos that I see in Stream (Classic).

What is the speed or the throughput of the migration tool?

What happens to my orphaned videos today?

Orphaned are videos with no owner currently and the original uploader left the organization. Since July 2023, migration tool has the functionality to migrate them.Read the orphaned videos section for more details.

I see some ineligible videos in the inventory report, what are those?

Videos that are either not published (in draft state) or deleted (in recycle bin) are ineligible for migration. They won't be migrated by the tool. End users can either publish such videos or admins can restore the video from recycle bin, so that the migration tool can pick them.

I can’t see some of my SharePoint sites while assigning destinations on UI for a single container.

If the SP or Teams sites in your tenant aren't visible on UI, while assigning destinations, there can be a few reasons for it.

  • SP admins by default don’t have access to sites where they aren't either the owner or members, although they can add themselves to the group or team. Hence only those sites are visible where the admin is at least a member of the group or team. It is because sites are searched using user scoped delegated token. However, such sites are discovered during automapping of destination since we use application-based token
  • Admins also might not see sites for a multi-geo tenant, since the graph API used to fetch the sites, can’t do that reliably in some corner cases.
  • In a corner case, if the site is recently created, it might take time to sync and appear in UI. ETA is a couple of hours. Note: For some corner scenarios (for example: special characters in the destination path), SP site search in the UI might not work. In such cases, you can assign the destination manually via csv upload using 'Upload destination' option in the migration tool.

Destination for some user and Microsoft 365 group containers isn't auto assigned.

If the container was added to scans tab via "Add containers -> Look for new containers in Stream", then the destination for all Microsoft 365 groups and user containers gets autoassigned on a best effort basis. For the ones where the destination hasn't been autoassigned, the same can be done via csv upload using 'Upload destination' option in the migration tool. You can also use the script mentioned in the note here for identifying destinations of Microsoft 365 groups and uploading them via 'Upload Destination' option.

Can I remove the option to upload to Stream (on SharePoint) for end users of my organization?

Unfortunately, It's not possible now. We changed the classic upload page and gave exception to customers to extend it, that extension period has expired now as well. Refer to the January 17, 2023 line item in migration timeline and MC post MC496849 published on January 12, 2023.

My videos are still visible in Stream Classic after I migrated them.

There's a backend code that runs to hide or soft delete the videos from Stream (Classic) after migration. It might take up to two days to hide the content. Due to a bug, videos migrated before August 15, 2023 might still be visible in the Stream (Classic) UI. To resolve this issue, you can remigrate the impacted videos.

Should I take backup of my Stream (Classic) video before migration in case anything bad happens?

Absolutely No. We advise you to run test migrations first to understand the permissions, location, and metadata on the migrated videos. Post that you should run a pilot migration with some production videos. It gives you confidence, not put all the data at risk and minimize the chances of error.
Moreover, after migration we hide or soft delete the videos from Stream (Classic), but don't hard delete until Stream (Classic) infra deprecation. During the process, for critical cases we can unhide the data in Stream (Classic).

There are videos reported as "ineligible" to be migrated - how can we address such cases?

Ineligible videos are mentioned here in our documentation. It could be due to videos being in errored out state or draft or deleted. You can restore the deleted videos from recycle bin and publish videos in draft.

What permissions are needed to run a Stream Migration?

Stream Migration tool located in Migration manager has the error "Service isn't available. Contact support"

They might be blocked due to required URLs that would need to be allowed for the tool to connect or a network connection issue. You might need to add the following URLs to the allowlist:

  • https://api.mover.io
  • https://api.microsoftstream.com/

Additionally, if you're a GCC tenant, add the following URL to the allowlist as well:

  • https://api.prod.migrations.microsoft.com

If you still face connection issue, please check if the Mover App is enabled and sign ins are enabled too. Follow the following steps:

Can we roll back migration of videos from Stream (Classic) to Stream (on SharePoint)?

It's a flexible migration where admins choose to migrate the videos they need. It's recommended to run the tool with a few test videos and pilot some migrations with a few Production videos. Hence, the need for rollback back may be less. But in of a valid business reason, we can unhide the content that was migrated from Classic. In this process, the changes made on migrated videos in Stream (on SharePoint) won't show in videos that reappear in classic. You need to submit the request via this form and share the same details via a support ticket as well. The ETA for rollback is three business days from submission of the information via the form.

How my end users can discover migrated content?

We mirror permissions when videos migrate from Stream (Classic) to Stream (on SharePoint). Each user who has access to a video is Stream (Classic) retains access to migrated video. End users can find the video via search in Stream (on SharePoint) if the video has migrated or in Stream (classic) for a non migrated video. By March’23 end, admins get a report that gives them the destination location of each migrated video file. It's available in the inventory report.

Can I apply retention or expiration policies in Stream (Classic) while migrating videos?

No, retention or expiration policy ever existed in Stream (Classic), hence no such policy is applied while migrating videos. However, it's theoretically possible to apply expiration to videos after they're migrated to Stream (on SharePoint). We set a variable (mediaitem.progID) to identify a migrated video.

Why do I see date time appended to the video file name after migration?

Two videos in Stream (Classic) could have same file names, however that isn't possible in One Drive & SharePoint. Two files with same name in SharePoint are considered as versions. We append the date time to prevent this from happening. However, title of the video, visible during the playback, doesn't change on migration.

Are my videos copied or moved during migration? Are they available in Stream Classic after they migrate?

We make a copy of the video and upload that into SharePoint or OneDrive. Simultaneously, we hide or soft delete the video from Stream (Classic) after it's migrated. We'll hard deleted the video when Stream (Classic) infra deprecates. Earlier videos were hard deleted 180 days after migration but we changed this starting mid June.

How can I resolve errors or failed videos?

Refer to error codes and definition provided by platform.

Does the Stream migration tool retries failed videos? Should I retry myself?

Yes, there are retries built in the migration tool. But, after a long time, if the videos are still showing failed with an error reason not due to some issue at your end, then you may retry once again. If it still fails, raise a support ticket

Are migrated videos visible on Start page at office.com?

No, migration in itself won't make the video appear on start page at office.com. But, if a video was accessed by a user after it was migrated, then it will be visible in the 'recents' tab on start page.

What happens when play back or redirect support for old Stream (Classic) migrated videos end?

Can I hire more help for moving to Stream (on SharePoint)?

If you would like to hire a third party partner to help you with your migration or help you start using Stream (on SharePoint) we've collected this list of partners who have self identified as having this expertise. See the list of third party partners for more details.

How do we define orphaned videos? Does the video qualify as orphan if the uploader has left the organization?

When we move videos, we make sure to assign it to someone in your organization. If a video doesn't have any Microsoft 365 group or User assigned as owner or it isn't associated with a company channel, we mark the video as orphan. An orphan video moves as part of the 'orphan videos' container (ETA: June). Your organization can have multiple orphan video containers depending on number of such videos in your tenant. There may be some videos where uploader has left the organization, but they're still not classified as orphan since they have either a User or Microsoft 365 group owner or they're associated with a company channel. In this case, the video migrates with the corresponding container and not orphan video container.

Why do we break inheritance on the destination folder while migrating permissions?

How to identify containers with overlapping video and video details.

Can I move a container's video to two different locations?

We don't promote migrating videos in a container to different locations, however there's a workaround. You can achieve this by using partial migration filters. Migrate a set of videos to first location using filters. Delete the container from Migrations tab after it successfully migrates. Add same container with new set of filters and migrate to a new location. But you can split the videos only based on available video filters. Also, the redirection for group URL points to the last migrated group destination location.

Why can't I manually add more containers?

The migration tool has a limit of 50,000 containers at a time. If you've inadvertently added more than 50,000 containers, you'll need to remove some containers so that the total count of containers, after your manual additions, remains below this threshold.

How do I match data between Stream (Classic) portal, inventory report and migration tool?

There are three sources of data; Stream (Classic) portal- Let’s call it A, Inventory Report (or Power BI dashboard)- Let’s call it B and Migration tool- Let’s call it C

  1. A & B should match perfectly. You're able to locate all your video in inventory report. Search for a video via video ID in report. You can find this ID at the end of video playback URL, for example, https://web.microsoftstream.com/video/videoid
  2. B & C will now also match. Earlier, due to lack of support for orphaned videos in the migration tool (C), B, and C wouldn't match.
  3. A & C won't match because videos may not appear in the same place in tool as they appear in Stream (Classic) because the tool moves videos in logical groups or containers. Stream (Classic) videos associated with Microsoft 365 groups, Company channel or Stream group always move together and not move with User's container who uploaded the videos. We follow the priority order: Stream group > Microsoft 365 group > Company wide channel > User. Refer to the permissions cases for more information. So, you may see an uploader’s video moving in Microsoft 365 group and hence may not be visible in the Uploader’s user container of the migration tool.

I see MUSERNOTFOUND error in some user container migration.

If your Stream Classic is disabled and the user is deleted or in inactive state then the migration of user container may fail with MUSERNOTFOUND error in Migration log report. There's a workaround. Consider changing the default destination path to a valid location for successful migration of user content. If Stream Classic is enabled and user is in inactive state then "Look for New Containers" to get the videos of this user. The already added user container for this user won't migrate the user content.

Failed to run the automapping script, inventory report script and permission script if the folder name has space key.

To escape spaces in a Windows file path, put double quotation marks around the section of the path with a space in it. For example: C:"Test Folder"\text.txt. You can also put quotation marks around the entire path to ensure you don't miss any spaces.

How to get a list of all Microsoft 365 group and CWC containers in the tenant environment?

The inventory report gives a list of all container IDs to which at least one video is assigned. It's possible that your tenant has some Microsoft 365 and CWC groups in which videos showed up in the Stream (Classic) UI but none were assigned to them as per the assignment hierarchy, therefore those containers having zero videos don't show in the inventory report. Latest addition to inventory script brings an extra parameter called "GenerateMasterContainerList" which when explicitly set to true (its value is false by def) generates a list of all M365Groups and CompanyWideChannels available in your tenant in a separate file.

  1. In order to run the script, the user needs to follow the old steps to run inventory script with the only added step being that the parameter 'GenerateMasterContainerList' needs to be added with its value set to true.
  2. Sample command to run the script: .\StreamClassicVideoReportGenerator.ps1 -AadTenantId "00000000-0000-0000-0000-000000000000" -InputFile "C:\Users\Username\Desktop\token.txt" -OutDir "C:\Users\Username\Desktop" -GenerateMasterContainerList true
  3. The value of this parameter is false by default.
  4. It supports Resume exactly in the same manner as old script. Since some tenants may have a large number of such entities, the script may terminate during execution due to expiry of auth token. In such an event, user must replace the old token with new token in token file and restart the script. The script by default runs with Resume flag set as true, so the script will again pick up from the last execution. If there's large number of entities, result is present in multiple csv as each output csv has been designed to haven't more than 10K rows.
  5. The final list containing all merged files can be found in \Out\report folder.

How do I extract the videos available under each channel in Stream (Classic)?

Customers need to create their own script to fetch this mapping information. We're providing script that was shared with us, you can use them basis your discretion. Note: This script isn't supported by Microsoft.

Script 1:

#Token file Path
$tokenInputFile="C:\temp\StreamReportGenerator\token.txt" 
#Please Note the Base Url - https://uswc-1.api.microsoftstream.com/api/ needs to be replaced by Base Url of your tenant using script 2 
$baseURI = "https://uswc-1.api.microsoftstream.com/api/" 
#ChannelVideoReport Path – Please replace it with path to csv file where we want to export the channel video report data 
$channelVideoReportPath =  "C:\temp\StreamReportGenerator\channelVideosReport.csv" 
$getAllChannelsUri= $baseURI + "channels?`$top=100&`$skip=0&`$orderby=created desc&`$expand=creator,group&adminmode=true&api-version=1.4-private"
$token = Get-Content -Path $tokenInputFile 
$headers = @{ 
    "Accept" = "application/json, text/plain, */*" 
    "Authorization" = "Bearer $($token)" 
} 
$ChannelVideoInfoCollection=@() 
$response = Invoke-RestMethod -Method Get -Uri $getAllChannelsUri -Headers $headers 
if($response -ne $null) 
{
  foreach($channelData in $response.value) 
    { 
        $channelVideoInfoUri= $baseURI + "/channels/$($channelData.id)/videos?`$top=100&`$skip=0&`$filter=published%20and%20(state%20eq%20%27completed%27%20or%20contentSource%20eq%20%27livestream%27)&`$expand=creator,events,channels&adminmode=true&`$orderby=metrics%2FtrendingScore%20desc&api-version=1.4-private"
        $channelVideoRes = Invoke-RestMethod -Method Get -Uri $channelVideoInfoUri -Headers $headers 
        foreach($channelVideo in $channelVideoRes.value) 
        { 
            $ChannelVideoAssociationInfo = [PSCustomObject] @{ 
                GroupID=$channelData.group.id 
                GroupName=$channelData.group.name
                ChannelID =$channelData.id 
                ChannelName=$channelData.name 
                VideoID=$channelVideo.id 
                VideoName=$channelVideo.name 
            } 
            $ChannelVideoInfoCollection += $ChannelVideoAssociationInfo 
        } 
}}  
$ChannelVideoInfoCollection | Export-Csv -Path $channelVideoReportPath -NoTypeInformation  

Script 2:

# Path to Token file    
$tokenInputFile="C:\temp\StreamReportGenerator\token.txt"      
$token = Get-Content -Path $tokenInputFile 
# To be replaced by Aad Tenant ID of your tenant
    $aadTenantID = "c008191f-7c3e-4728-a223-0cba39479b7b" 
    $tenantPatchUri = "https://api.microsoftstream.com/api/tenants/" +  $aadTenantID + "?api-version=1.4-private" 
    $headers = @{ 
        Authorization = "Bearer $token" 
    } 
    $body = "{}" 
    try { 
        $response = Invoke-RestMethod -Uri $tenantPatchUri -Method Patch -Body $body -Headers $headers -ContentType "application/json" 
  } 
    catch {
        #Stop execution if Unauthorized(401). 
        if ($_.Exception.Response.StatusCode.value__ -eq 401) { 
            Write-Host "========Enter new token and start the script again=======" 
        } 

          Write-Host "An error occurred: $($_.Exception.GetType().FullName) - $($_.Exception.Message)"

        exit 
    }
    Write-Host "Base URI: $($response.apiEndpoint)"

Steps to use the scripts:

  1. We can use Script 1 to fetch channel and video mapping.
  2. Please use same way to fetch token as we do in Inventory Report and update the $tokenInputFile
  3. Update the channelVideoReport path where you want to export the video report csv file
  4. We need to replace $baseURI = “https://uswc-1.api.microsoftstream.com/api/” with BaseURI for your tenant . To fetch the Base URI, please follow the steps: a. User Script 2 and add the path to token file fetched in Step 2 and assign it to $tokenInputFile b. Replace $aadTenantID = "c008191f-7c3e-4728-a223-0cba39479b7b" with tenant ID of your tenant c. Run the script. d. You get the Base URI printed on console.
  5. Run the Script 1 and the ChannelVideoReport gets exported to given path
  6. By default the script returns top 100 channels and top 100 videos within those channels.

In destination site, I can find more files than what were migrated in the report.

Due to limitations in the migration upload mechanism, if 'MJOBNOTCOMPLETED' or 'MJOBFATALERROR' errors occur in the report, the actual number of successfully migrated files may exceed the count displayed in the report. Rerunning the migration is often effective in resolving such issues. Also, wait for 15 minutes after migration completion before you download migration logs and summary report to avoid MJOBNOTCOMPLETED error in the report.

I am unable to download migration logs from the tool.

Migration logs for any container are only available for 3 months after that container was migrated. After three months, the logs won't be accessible.