如何使用 Logic APP 自动下载视频的脚本(VTT 文件)?
How Can I automatically download a Transcript (VTT file) of a video using a Logic APP?
我使用逻辑应用程序将几个视频编入索引 videoindexer.ai。但我想知道,有没有办法使用逻辑应用程序下载 VTT 格式的成绩单文件并将它们放在 Onedrive 文件夹中?没有看到有关如何通过逻辑应用完成此操作的文档。
Azure 函数:
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System.Net.Http.Headers;
using System.Text;
using System.Net.Http;
using System.Web;
namespace TranscriptVtt
{
public static class Function1
{
[FunctionName("Function1")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
var client = new HttpClient();
var queryString = HttpUtility.ParseQueryString(string.Empty);
// Request headers
client.DefaultRequestHeaders.Add("x-ms-client-request-id", "");
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{subscription key}");
// Request parameters
queryString["indexId"] = "{string}";
queryString["format"] = "Vtt";
queryString["language"] = "{string}";
queryString["accessToken"] = "{string}";
var uri = "https://api.videoindexer.ai/{location}/Accounts/{accountId}/Videos/{videoId}/Captions?" + queryString;
var response = await client.GetAsync(uri);
return new OkObjectResult("VTT Processed");
}
}
}
直接使用 Logic App 连接器我不认为这是可能的,但你可以直接使用 REST API。执行请求,并根据响应,添加一个新任务,该任务将成为 onedrive 连接器:
https://docs.microsoft.com/en-us/azure/connectors/connectors-native-http
https://docs.microsoft.com/en-us/connectors/onedrive/
休息 API:
curl -v -X GET "https://api.videoindexer.ai/{location}/Accounts/{accountId}/Videos/{videoId}/Captions?indexId={string}&format=Vtt&language={string}&accessToken={string}"
-H "x-ms-client-request-id: "
-H "Ocp-Apim-Subscription-Key: {subscription key}"
--data-ascii "{body}"
编辑:
等效的 int c#。您需要在 Web 服务器上使用它(Azure Functions 会很棒):
using System;
using System.Net.Http.Headers;
using System.Text;
using System.Net.Http;
using System.Web;
namespace CSHttpClientSample
{
static class Program
{
static void Main()
{
MakeRequest();
Console.WriteLine("Hit ENTER to exit...");
Console.ReadLine();
}
static async void MakeRequest()
{
var client = new HttpClient();
var queryString = HttpUtility.ParseQueryString(string.Empty);
// Request headers
client.DefaultRequestHeaders.Add("x-ms-client-request-id", "");
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{subscription key}");
// Request parameters
queryString["indexId"] = "{string}";
queryString["format"] = "Vtt";
queryString["language"] = "{string}";
queryString["accessToken"] = "{string}";
var uri = "https://api.videoindexer.ai/{location}/Accounts/{accountId}/Videos/{videoId}/Captions?" + queryString;
var response = await client.GetAsync(uri);
}
}
}
您需要在工作流程中传递对 Onedrive 任务的响应。
https://api-portal.videoindexer.ai/docs/services/operations/operations/Get-video-captions
我通过执行以下操作(并且有效)做了一个快速演示:
- 用于视频上传的 LogicApp #1:触发一个 OneDrive“输入”文件夹,并将视频上传到视频索引器以进行索引
- 结果 collection 的 LogicApp #2:将通过索引调用的 http 触发器,然后获取字幕并在 OneDrive“输出”文件夹中创建一个文件。
诀窍在于,如 Upload Video
视频索引器操作(参见 here)中所述,您可以添加回调:
如您所见,此回调会将视频的 ID 添加到查询字符串中。
因此,在您的 LogicApp #2 中,在视频索引器的 Get Video Captions
操作中使用此 id
:
获取id的表达式为triggerOutputs()['queries']['id']
.
然后你只需要复制到你的输出:
我使用了基于视频 ID 的命名:concat(triggerOutputs()['queries']['id'],'-Captions.vtt')
为了获得更好的实现,您应该添加一个检查以过滤由于上述面部检测而产生的回调。这可以通过过滤 'State' 查询字符串值来完成。
这是我的 LogicApp #2 的代码(带有一些隐藏字段):
{
"definition": {
"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
"actions": {
"Create_file": {
"inputs": {
"body": "@body('Get_Video_Captions')",
"host": {
"connection": {
"name": "@parameters('$connections')['onedrive']['connectionId']"
}
},
"method": "post",
"path": "/datasets/default/files",
"queries": {
"folderPath": "/LogicAppsDemo/VideoIndexing/Output",
"name": "@{concat(triggerOutputs()['queries']['id'],'-Captions.vtt')}"
}
},
"runAfter": {
"Get_Video_Captions": [
"Succeeded"
]
},
"runtimeConfiguration": {
"contentTransfer": {
"transferMode": "Chunked"
}
},
"type": "ApiConnection"
},
"Get_Account_Access_Token": {
"inputs": {
"host": {
"connection": {
"name": "@parameters('$connections')['videoindexer-v2']['connectionId']"
}
},
"method": "get",
"path": "/auth/@{encodeURIComponent('##VI-REGION##')}/Accounts/@{encodeURIComponent('##VI-ACCOUNT##')}/AccessToken",
"queries": {
"allowEdit": false
}
},
"runAfter": {},
"type": "ApiConnection"
},
"Get_Video_Captions": {
"inputs": {
"host": {
"connection": {
"name": "@parameters('$connections')['videoindexer-v2']['connectionId']"
}
},
"method": "get",
"path": "/@{encodeURIComponent('##VI-REGION##')}/Accounts/@{encodeURIComponent('##VI-ACCOUNT##')}/Videos/@{encodeURIComponent(triggerOutputs()['queries']['id'])}/Captions",
"queries": {
"accessToken": "@body('Get_Account_Access_Token')",
"format": "vtt",
"language": "English"
}
},
"runAfter": {
"Get_Account_Access_Token": [
"Succeeded"
]
},
"type": "ApiConnection"
}
},
"contentVersion": "1.0.0.0",
"outputs": {},
"parameters": {
"$connections": {
"defaultValue": {},
"type": "Object"
}
},
"triggers": {
"manual": {
"inputs": {
"method": "POST",
"schema": {}
},
"kind": "Http",
"type": "Request"
}
}
},
"parameters": {
"$connections": {
"value": {
"onedrive": { ... },
"videoindexer-v2": { ... }
}
}
}
}
顺便说一下,您的 use-case 几乎在 Microsoft 的博客 post 中有所描述(他们在这里获取索引,而不是标题):https://azure.microsoft.com/en-us/blog/logic-apps-flow-connectors-will-make-automating-video-indexer-simpler-than-ever/
我使用逻辑应用程序将几个视频编入索引 videoindexer.ai。但我想知道,有没有办法使用逻辑应用程序下载 VTT 格式的成绩单文件并将它们放在 Onedrive 文件夹中?没有看到有关如何通过逻辑应用完成此操作的文档。
Azure 函数:
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System.Net.Http.Headers;
using System.Text;
using System.Net.Http;
using System.Web;
namespace TranscriptVtt
{
public static class Function1
{
[FunctionName("Function1")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
var client = new HttpClient();
var queryString = HttpUtility.ParseQueryString(string.Empty);
// Request headers
client.DefaultRequestHeaders.Add("x-ms-client-request-id", "");
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{subscription key}");
// Request parameters
queryString["indexId"] = "{string}";
queryString["format"] = "Vtt";
queryString["language"] = "{string}";
queryString["accessToken"] = "{string}";
var uri = "https://api.videoindexer.ai/{location}/Accounts/{accountId}/Videos/{videoId}/Captions?" + queryString;
var response = await client.GetAsync(uri);
return new OkObjectResult("VTT Processed");
}
}
}
直接使用 Logic App 连接器我不认为这是可能的,但你可以直接使用 REST API。执行请求,并根据响应,添加一个新任务,该任务将成为 onedrive 连接器:
https://docs.microsoft.com/en-us/azure/connectors/connectors-native-http
https://docs.microsoft.com/en-us/connectors/onedrive/
休息 API:
curl -v -X GET "https://api.videoindexer.ai/{location}/Accounts/{accountId}/Videos/{videoId}/Captions?indexId={string}&format=Vtt&language={string}&accessToken={string}"
-H "x-ms-client-request-id: "
-H "Ocp-Apim-Subscription-Key: {subscription key}"
--data-ascii "{body}"
编辑: 等效的 int c#。您需要在 Web 服务器上使用它(Azure Functions 会很棒):
using System;
using System.Net.Http.Headers;
using System.Text;
using System.Net.Http;
using System.Web;
namespace CSHttpClientSample
{
static class Program
{
static void Main()
{
MakeRequest();
Console.WriteLine("Hit ENTER to exit...");
Console.ReadLine();
}
static async void MakeRequest()
{
var client = new HttpClient();
var queryString = HttpUtility.ParseQueryString(string.Empty);
// Request headers
client.DefaultRequestHeaders.Add("x-ms-client-request-id", "");
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{subscription key}");
// Request parameters
queryString["indexId"] = "{string}";
queryString["format"] = "Vtt";
queryString["language"] = "{string}";
queryString["accessToken"] = "{string}";
var uri = "https://api.videoindexer.ai/{location}/Accounts/{accountId}/Videos/{videoId}/Captions?" + queryString;
var response = await client.GetAsync(uri);
}
}
}
您需要在工作流程中传递对 Onedrive 任务的响应。
https://api-portal.videoindexer.ai/docs/services/operations/operations/Get-video-captions
我通过执行以下操作(并且有效)做了一个快速演示:
- 用于视频上传的 LogicApp #1:触发一个 OneDrive“输入”文件夹,并将视频上传到视频索引器以进行索引
- 结果 collection 的 LogicApp #2:将通过索引调用的 http 触发器,然后获取字幕并在 OneDrive“输出”文件夹中创建一个文件。
诀窍在于,如 Upload Video
视频索引器操作(参见 here)中所述,您可以添加回调:
如您所见,此回调会将视频的 ID 添加到查询字符串中。
因此,在您的 LogicApp #2 中,在视频索引器的 Get Video Captions
操作中使用此 id
:
获取id的表达式为triggerOutputs()['queries']['id']
.
然后你只需要复制到你的输出:
我使用了基于视频 ID 的命名:concat(triggerOutputs()['queries']['id'],'-Captions.vtt')
为了获得更好的实现,您应该添加一个检查以过滤由于上述面部检测而产生的回调。这可以通过过滤 'State' 查询字符串值来完成。
这是我的 LogicApp #2 的代码(带有一些隐藏字段):
{
"definition": {
"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
"actions": {
"Create_file": {
"inputs": {
"body": "@body('Get_Video_Captions')",
"host": {
"connection": {
"name": "@parameters('$connections')['onedrive']['connectionId']"
}
},
"method": "post",
"path": "/datasets/default/files",
"queries": {
"folderPath": "/LogicAppsDemo/VideoIndexing/Output",
"name": "@{concat(triggerOutputs()['queries']['id'],'-Captions.vtt')}"
}
},
"runAfter": {
"Get_Video_Captions": [
"Succeeded"
]
},
"runtimeConfiguration": {
"contentTransfer": {
"transferMode": "Chunked"
}
},
"type": "ApiConnection"
},
"Get_Account_Access_Token": {
"inputs": {
"host": {
"connection": {
"name": "@parameters('$connections')['videoindexer-v2']['connectionId']"
}
},
"method": "get",
"path": "/auth/@{encodeURIComponent('##VI-REGION##')}/Accounts/@{encodeURIComponent('##VI-ACCOUNT##')}/AccessToken",
"queries": {
"allowEdit": false
}
},
"runAfter": {},
"type": "ApiConnection"
},
"Get_Video_Captions": {
"inputs": {
"host": {
"connection": {
"name": "@parameters('$connections')['videoindexer-v2']['connectionId']"
}
},
"method": "get",
"path": "/@{encodeURIComponent('##VI-REGION##')}/Accounts/@{encodeURIComponent('##VI-ACCOUNT##')}/Videos/@{encodeURIComponent(triggerOutputs()['queries']['id'])}/Captions",
"queries": {
"accessToken": "@body('Get_Account_Access_Token')",
"format": "vtt",
"language": "English"
}
},
"runAfter": {
"Get_Account_Access_Token": [
"Succeeded"
]
},
"type": "ApiConnection"
}
},
"contentVersion": "1.0.0.0",
"outputs": {},
"parameters": {
"$connections": {
"defaultValue": {},
"type": "Object"
}
},
"triggers": {
"manual": {
"inputs": {
"method": "POST",
"schema": {}
},
"kind": "Http",
"type": "Request"
}
}
},
"parameters": {
"$connections": {
"value": {
"onedrive": { ... },
"videoindexer-v2": { ... }
}
}
}
}
顺便说一下,您的 use-case 几乎在 Microsoft 的博客 post 中有所描述(他们在这里获取索引,而不是标题):https://azure.microsoft.com/en-us/blog/logic-apps-flow-connectors-will-make-automating-video-indexer-simpler-than-ever/