使用 Powershell 将视频上传到 Google Photos 时出现错误 3(适用于图片)

Error 3 uploading video to Google Photos with Powershell (Works for pictures)

我正在使用以下代码使用 Powershell 将照片和视频上传到 Google 照片。该代码非常适用于图片,但在上传视频时会失败(当通过浏览器上传时,Google 照片接受)。

尝试上传视频时,原始字节上传会成功,但 mediaItems.batchCreate 会失败 status.code 3 和 status.message "Failed: There was an error while trying to create this media item." 这可能是由于 header 中错误的 MIME 类型造成的吗?

Function GP-UploadMedia (){
    <# 
    .SYNOPSIS
      Uploads a Google Photos media (picture/video)
    
    .Description  
      Parameters: 
        - album id
        - media path
      Returns:
        - picture id

    #>
    [CmdletBinding()]
        param (
            [Parameter(Mandatory=$true)]
            [string]$album_id,
            [Parameter(Mandatory=$true)]
            [string]$media_path

        )

    # refresh tokens if required
    G-RefreshTokens
    
    # 1st step: upload raw bytes
    $requestUri = "https://photoslibrary.googleapis.com/v1/uploads"
    $mime_type = [System.Web.MimeMapping]::GetMimeMapping($media_path);
    $Headers = @{
        Authorization = "Bearer $($Global:Tokens.access_token)";
        ContentType = "application/octet-stream";
        "X-Goog-Upload-Content-Type" = $mime_type;
        "X-Goog-Upload-Protocol" = "raw";
        }

    $body = $media_path;

    try {
        $upload_token = Invoke-RestMethod -Headers $Headers -InFile $body -Uri $requestUri -Method POST
    }
    catch {
        # Something went wrong. Investigate!
        dieOnError ([System.IO.StreamReader]::new($_.Exception.Response.GetResponseStream()));
    }
 
    # refresh tokens if required
    G-RefreshTokens

    # 2nd step: pair raw bytes to Google Photo media (picture/video)
    $requestUri = "https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate"
    $Headers = @{
        Authorization = "Bearer $($Global:Tokens.access_token)";
        }
  
    $body = [PSCustomObject]@{ 
        albumId = $album_id;
        newMediaItems = @( 
            [PSCustomObject]@{
                description = "";
                simpleMediaItem = [PSCustomObject]@{ 
                    fileName = (Split-Path $media_path -leaf);
                    uploadToken = $upload_token;
                    }
            }
        )
    } 
    $myJson = $body|ConvertTo-Json -Depth 4

    try {
        $Response = Invoke-RestMethod -Headers $Headers -Body ($myJson)  -Uri $requestUri -Method POST -ContentType "application/json; charset=utf-8";
    }
    catch {
         # Something went wrong. Investigate!
         dieOnError ([System.IO.StreamReader]::new($_.Exception.Response.GetResponseStream()));
    } 

    return  $Response.newMediaItemResults.MediaItem.id;
}

虽然我不确定这是否是您问题的直接解决方案,但是当您的脚本如下修改时,是否是您问题的直接解决方案?这种情况请修改“第一步:上传原始字节”的请求头如下。

发件人:

ContentType = "application/octet-stream";

收件人:

"Content-Type" = "application/octet-stream";

注:

  • 当我测试你的脚本时,我可以复制与你相同的情况。而且,当我用上述修改修改你的脚本时,我可以确认问题可以解决。所以,请测试以上修改。