{
"kind": "open-flow-workflow",
"version": 1,
"name": "New YouTube Channel Videos to Telegram",
"content": {
"modelVersion": 14,
"document": {
"bindings": {},
"graph": {
"nodes": {
"n_33b1ad4a707f36e5": {
"name": "Check every 30 minutes",
"kind": "cron",
"cronTimes": [
{
"type": "cron",
"expression": "*/30 * * * *",
"timezone": "UTC"
}
]
},
"n_1c78f4a56b44dcb7": {
"inputs": {
"endpoint": {
"kind": "value",
"value": "/search"
},
"query.part": {
"kind": "value",
"value": "snippet"
},
"query.type": {
"kind": "value",
"value": "video"
},
"query.channelId": {
"kind": "value",
"value": "YOUR_YOUTUBE_CHANNEL_ID"
},
"query.order": {
"kind": "value",
"value": "date"
},
"query.maxResults": {
"kind": "value",
"value": 4
}
},
"name": "Search the YouTube channel",
"kind": "task",
"task": {
"inputs": [
{
"jsonSchema": {
"type": "string"
},
"nullable": false,
"handle": "endpoint"
},
{
"jsonSchema": {
"type": [
"string",
"number",
"boolean",
"null"
]
},
"nullable": true,
"handle": "query.part"
},
{
"jsonSchema": {
"type": [
"string",
"number",
"boolean",
"null"
]
},
"nullable": true,
"handle": "query.type"
},
{
"jsonSchema": {
"type": [
"string",
"number",
"boolean",
"null"
]
},
"nullable": true,
"handle": "query.channelId"
},
{
"jsonSchema": {
"type": [
"string",
"number",
"boolean",
"null"
]
},
"nullable": true,
"handle": "query.order"
},
{
"jsonSchema": {
"type": [
"string",
"number",
"boolean",
"null"
]
},
"nullable": true,
"handle": "query.maxResults"
}
],
"outputs": [
{
"jsonSchema": {},
"nullable": true,
"handle": "body"
},
{
"jsonSchema": {
"type": "integer"
},
"nullable": false,
"handle": "statusCode"
},
{
"jsonSchema": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"nullable": false,
"handle": "headers"
},
{
"jsonSchema": {
"const": "base64"
},
"nullable": true,
"handle": "bodyEncoding"
}
],
"name": "Search the YouTube channel",
"executor": {
"providerId": "youtube",
"method": "GET",
"query": {
"mode": "fields",
"names": [
"part",
"type",
"channelId",
"order",
"maxResults"
]
},
"headers": {
"mode": "fields",
"names": []
},
"bodyFormat": "none",
"kind": "connector-proxy"
}
}
},
"n_71f5f884469b6bc0": {
"inputs": {
"body": {
"kind": "sources",
"sources": [
{
"kind": "node",
"nodeId": "n_1c78f4a56b44dcb7",
"output": "body"
}
]
},
"statusCode": {
"kind": "sources",
"sources": [
{
"kind": "node",
"nodeId": "n_1c78f4a56b44dcb7",
"output": "statusCode"
}
]
},
"chatId": {
"kind": "value",
"value": "YOUR_TELEGRAM_CHAT_ID"
}
},
"name": "Find new videos",
"kind": "task",
"task": {
"inputs": [
{
"jsonSchema": {},
"nullable": true,
"handle": "body"
},
{
"jsonSchema": {
"type": "integer"
},
"nullable": false,
"handle": "statusCode"
},
{
"jsonSchema": {
"type": "string"
},
"nullable": false,
"handle": "chatId"
}
],
"outputs": [
{
"jsonSchema": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
"nullable": false,
"handle": "rows"
},
{
"jsonSchema": {
"anyOf": [
{
"type": "integer",
"description": "A numeric Telegram chat identifier."
},
{
"type": "string",
"pattern": "^-?[0-9]+$",
"description": "A numeric Telegram chat identifier encoded as a string."
},
{
"type": "string",
"pattern": "^@[A-Za-z0-9_]+$",
"description": "A Telegram @username that identifies a public chat or channel."
}
],
"description": "The target Telegram chat ID or channel username."
},
"nullable": false,
"handle": "chatId"
}
],
"name": "Find new videos",
"moduleId": "n_efdb37b9fb6a91ef",
"capabilities": [
{
"kind": "connector",
"mode": "independent",
"actions": []
}
]
}
},
"n_675973748bf57c63": {
"inputs": {
"rows": {
"kind": "sources",
"sources": [
{
"kind": "node",
"nodeId": "n_71f5f884469b6bc0",
"output": "rows"
}
]
},
"previousState": {
"kind": "sources",
"sources": [
{
"kind": "node",
"nodeId": "n_675973748bf57c63",
"output": "state"
}
]
}
},
"name": "Prepare the next notice",
"kind": "task",
"task": {
"inputs": [
{
"jsonSchema": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
"nullable": false,
"handle": "rows"
},
{
"jsonSchema": {
"type": "object",
"additionalProperties": true
},
"nullable": true,
"handle": "previousState"
}
],
"outputs": [
{
"jsonSchema": {
"type": "object",
"additionalProperties": true
},
"nullable": false,
"handle": "state"
},
{
"jsonSchema": {
"type": "boolean"
},
"nullable": false,
"handle": "more"
},
{
"jsonSchema": {
"type": "string",
"maxLength": 4096,
"minLength": 1,
"description": "The text of the message to send."
},
"nullable": false,
"handle": "text"
},
{
"jsonSchema": {
"type": "integer",
"minimum": 0
},
"nullable": false,
"handle": "count"
}
],
"name": "Prepare the next notice",
"moduleId": "n_62ee0469f6d3cd30",
"capabilities": [
{
"kind": "connector",
"mode": "independent",
"actions": []
}
]
}
},
"n_85302da065cd7f98": {
"inputs": {},
"name": "More videos?",
"kind": "condition",
"matchMode": "first",
"cases": [
{
"output": "send",
"groups": [
{
"expressions": [
{
"left": {
"kind": "source",
"source": {
"kind": "node",
"nodeId": "n_675973748bf57c63",
"output": "more"
}
},
"operator": "isTrue"
}
]
}
]
}
]
},
"n_ac19f931477f5c60": {
"inputs": {
"chatId": {
"kind": "sources",
"sources": [
{
"kind": "node",
"nodeId": "n_71f5f884469b6bc0",
"output": "chatId"
}
]
},
"text": {
"kind": "sources",
"sources": [
{
"kind": "node",
"nodeId": "n_675973748bf57c63",
"output": "text"
}
]
},
"parseMode": {
"kind": "value",
"value": "HTML"
}
},
"name": "Send a Telegram notice",
"kind": "task",
"task": {
"inputs": [
{
"description": "The target Telegram chat ID or channel username.",
"jsonSchema": {
"anyOf": [
{
"type": "integer",
"description": "A numeric Telegram chat identifier."
},
{
"type": "string",
"pattern": "^-?[0-9]+$",
"description": "A numeric Telegram chat identifier encoded as a string."
},
{
"type": "string",
"pattern": "^@[A-Za-z0-9_]+$",
"description": "A Telegram @username that identifies a public chat or channel."
}
],
"description": "The target Telegram chat ID or channel username."
},
"nullable": false,
"handle": "chatId"
},
{
"description": "The text of the message to send.",
"jsonSchema": {
"type": "string",
"maxLength": 4096,
"minLength": 1,
"description": "The text of the message to send."
},
"nullable": false,
"handle": "text"
},
{
"description": "The unique identifier of the Telegram business connection.",
"jsonSchema": {
"type": "string",
"minLength": 1,
"description": "The unique identifier of the Telegram business connection."
},
"nullable": true,
"handle": "businessConnectionId",
"value": null
},
{
"description": "The parse mode used for message entities.",
"jsonSchema": {
"type": "string",
"enum": [
"Markdown",
"MarkdownV2",
"HTML"
],
"description": "The parse mode used for message entities."
},
"nullable": true,
"handle": "parseMode",
"value": null
},
{
"description": "Whether to send the message silently.",
"jsonSchema": {
"type": "boolean",
"description": "Whether to send the message silently."
},
"nullable": true,
"handle": "disableNotification",
"value": null
},
{
"description": "Whether to protect the sent message from forwarding and saving.",
"jsonSchema": {
"type": "boolean",
"description": "Whether to protect the sent message from forwarding and saving."
},
"nullable": true,
"handle": "protectContent",
"value": null
},
{
"description": "Whether to disable link previews in the message.",
"jsonSchema": {
"type": "boolean",
"description": "Whether to disable link previews in the message."
},
"nullable": true,
"handle": "disableWebPagePreview",
"value": null
},
{
"description": "The forum topic ID for the target message thread.",
"jsonSchema": {
"type": "integer",
"exclusiveMinimum": 0,
"description": "The forum topic ID for the target message thread."
},
"nullable": true,
"handle": "messageThreadId",
"value": null
},
{
"description": "The message ID to reply to.",
"jsonSchema": {
"type": "integer",
"exclusiveMinimum": 0,
"description": "The message ID to reply to."
},
"nullable": true,
"handle": "replyToMessageId",
"value": null
}
],
"outputs": [
{
"description": "A normalized Telegram message record.",
"jsonSchema": {
"type": "object",
"properties": {
"messageId": {
"type": "integer",
"description": "The unique message identifier inside the chat."
},
"date": {
"type": "integer",
"description": "The Unix timestamp when the message was sent."
},
"chat": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "The unique identifier of the chat."
},
"type": {
"type": "string",
"description": "The chat type."
},
"title": {
"type": "string",
"description": "The chat title."
},
"username": {
"type": "string",
"description": "The public username of the chat."
},
"firstName": {
"type": "string",
"description": "The first name for a private chat counterpart."
},
"lastName": {
"type": "string",
"description": "The last name for a private chat counterpart."
}
},
"required": [
"id",
"type"
],
"additionalProperties": true,
"description": "A Telegram chat record."
},
"businessConnectionId": {
"type": "string",
"minLength": 1,
"description": "The unique identifier of the Telegram business connection."
},
"from": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "The unique identifier of the user or bot."
},
"isBot": {
"type": "boolean",
"description": "Whether the account is a bot."
},
"firstName": {
"type": "string",
"description": "The first name of the user or bot."
},
"username": {
"type": "string",
"description": "The username of the user or bot."
}
},
"required": [
"id",
"isBot",
"firstName"
],
"additionalProperties": true,
"description": "A Telegram user record."
},
"senderChat": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "The unique identifier of the chat."
},
"type": {
"type": "string",
"description": "The chat type."
},
"title": {
"type": "string",
"description": "The chat title."
},
"username": {
"type": "string",
"description": "The public username of the chat."
},
"firstName": {
"type": "string",
"description": "The first name for a private chat counterpart."
},
"lastName": {
"type": "string",
"description": "The last name for a private chat counterpart."
}
},
"required": [
"id",
"type"
],
"additionalProperties": true,
"description": "A Telegram chat record."
},
"text": {
"type": "string",
"description": "The message text, when present."
},
"caption": {
"type": "string",
"description": "The media caption, when present."
},
"photo": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fileId": {
"type": "string",
"description": "The file identifier used to download or reuse the photo."
},
"fileUniqueId": {
"type": "string",
"description": "The stable unique identifier of the photo."
},
"width": {
"type": "integer",
"description": "The photo width in pixels."
},
"height": {
"type": "integer",
"description": "The photo height in pixels."
},
"fileSize": {
"type": "integer",
"description": "The photo file size in bytes."
}
},
"required": [
"fileId",
"fileUniqueId",
"width",
"height"
],
"additionalProperties": true,
"description": "A Telegram photo or thumbnail size."
},
"description": "The available sizes of the attached photo."
},
"document": {
"type": "object",
"properties": {
"fileId": {
"type": "string",
"description": "The file identifier used to download or reuse the document."
},
"fileUniqueId": {
"type": "string",
"description": "The stable unique identifier of the document."
},
"fileName": {
"type": "string",
"description": "The original document filename."
},
"mimeType": {
"type": "string",
"description": "The MIME type of the document."
},
"fileSize": {
"type": "integer",
"description": "The document file size in bytes."
}
},
"required": [
"fileId",
"fileUniqueId"
],
"additionalProperties": true,
"description": "A Telegram document file."
},
"location": {
"type": "object",
"properties": {
"latitude": {
"type": "number",
"description": "The latitude of the location."
},
"longitude": {
"type": "number",
"description": "The longitude of the location."
},
"horizontalAccuracy": {
"type": "number",
"description": "The radius of uncertainty in meters."
},
"livePeriod": {
"type": "integer",
"description": "The live location update period in seconds."
},
"heading": {
"type": "integer",
"description": "The direction of travel in degrees."
},
"proximityAlertRadius": {
"type": "integer",
"description": "The proximity alert radius in meters."
}
},
"required": [
"latitude",
"longitude"
],
"additionalProperties": true,
"description": "A Telegram geographic location."
},
"poll": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique poll identifier."
},
"question": {
"type": "string",
"description": "The poll question."
},
"options": {
"type": "array",
"items": {
"type": "object",
"properties": {
"text": {
"type": "string",
"description": "The poll option text."
},
"voterCount": {
"type": "integer",
"description": "The number of votes for the option."
}
},
"required": [
"text",
"voterCount"
],
"additionalProperties": true,
"description": "A Telegram poll option."
},
"description": "The available poll options."
},
"totalVoterCount": {
"type": "integer",
"description": "The total number of poll voters."
},
"isClosed": {
"type": "boolean",
"description": "Whether the poll is closed."
},
"isAnonymous": {
"type": "boolean",
"description": "Whether the poll is anonymous."
},
"type": {
"type": "string",
"enum": [
"regular",
"quiz"
],
"description": "The poll type."
},
"allowsMultipleAnswers": {
"type": "boolean",
"description": "Whether the poll allows multiple answers."
},
"closeDate": {
"type": "integer",
"description": "The Unix timestamp when the poll closes."
},
"openPeriod": {
"type": "integer",
"description": "The number of seconds the poll remains open."
},
"explanation": {
"type": "string",
"description": "The explanation shown for a quiz poll."
},
"correctOptionId": {
"type": "integer",
"description": "The zero-based identifier of the correct quiz option."
}
},
"required": [
"id",
"question",
"options",
"totalVoterCount",
"isClosed",
"isAnonymous",
"type",
"allowsMultipleAnswers"
],
"additionalProperties": true,
"description": "A Telegram poll."
},
"entities": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true,
"description": "A Telegram MessageEntity object."
},
"description": "The entities parsed from the message text."
},
"captionEntities": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true,
"description": "A Telegram MessageEntity object."
},
"description": "The entities parsed from the media caption."
},
"forwardDate": {
"type": "integer",
"description": "The Unix timestamp of the original forwarded message."
},
"forwardFrom": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "The unique identifier of the user or bot."
},
"isBot": {
"type": "boolean",
"description": "Whether the account is a bot."
},
"firstName": {
"type": "string",
"description": "The first name of the user or bot."
},
"username": {
"type": "string",
"description": "The username of the user or bot."
}
},
"required": [
"id",
"isBot",
"firstName"
],
"additionalProperties": true,
"description": "A Telegram user record."
},
"forwardFromChat": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "The unique identifier of the chat."
},
"type": {
"type": "string",
"description": "The chat type."
},
"title": {
"type": "string",
"description": "The chat title."
},
"username": {
"type": "string",
"description": "The public username of the chat."
},
"firstName": {
"type": "string",
"description": "The first name for a private chat counterpart."
},
"lastName": {
"type": "string",
"description": "The last name for a private chat counterpart."
}
},
"required": [
"id",
"type"
],
"additionalProperties": true,
"description": "A Telegram chat record."
},
"forwardFromMessageId": {
"type": "integer",
"description": "The original message identifier inside the source chat."
},
"forwardSignature": {
"type": "string",
"description": "The original author signature for a forwarded channel post."
},
"forwardSenderName": {
"type": "string",
"description": "The display name of a forwarded sender who disallows linking."
},
"linkPreviewOptions": {
"type": "object",
"properties": {},
"additionalProperties": true,
"description": "The link preview options attached to the message."
},
"video": {
"type": "object",
"properties": {
"fileId": {
"type": "string",
"description": "The file identifier used to download or reuse the video."
},
"fileUniqueId": {
"type": "string",
"description": "The stable unique identifier of the video."
},
"width": {
"type": "integer",
"description": "The video width in pixels."
},
"height": {
"type": "integer",
"description": "The video height in pixels."
},
"duration": {
"type": "integer",
"description": "The video duration in seconds."
},
"thumbnail": {
"type": "object",
"properties": {
"fileId": {
"type": "string",
"description": "The file identifier used to download or reuse the photo."
},
"fileUniqueId": {
"type": "string",
"description": "The stable unique identifier of the photo."
},
"width": {
"type": "integer",
"description": "The photo width in pixels."
},
"height": {
"type": "integer",
"description": "The photo height in pixels."
},
"fileSize": {
"type": "integer",
"description": "The photo file size in bytes."
}
},
"required": [
"fileId",
"fileUniqueId",
"width",
"height"
],
"additionalProperties": true,
"description": "A Telegram photo or thumbnail size."
},
"cover": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fileId": {
"type": "string",
"description": "The file identifier used to download or reuse the photo."
},
"fileUniqueId": {
"type": "string",
"description": "The stable unique identifier of the photo."
},
"width": {
"type": "integer",
"description": "The photo width in pixels."
},
"height": {
"type": "integer",
"description": "The photo height in pixels."
},
"fileSize": {
"type": "integer",
"description": "The photo file size in bytes."
}
},
"required": [
"fileId",
"fileUniqueId",
"width",
"height"
],
"additionalProperties": true,
"description": "A Telegram photo or thumbnail size."
},
"description": "The available sizes of the video cover."
},
"startTimestamp": {
"type": "integer",
"description": "The start timestamp for the video in the message."
},
"qualities": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fileId": {
"type": "string",
"description": "The file identifier used to download or reuse this video quality."
},
"fileUniqueId": {
"type": "string",
"description": "The stable unique identifier of this video quality."
},
"width": {
"type": "integer",
"description": "The video width in pixels."
},
"height": {
"type": "integer",
"description": "The video height in pixels."
},
"codec": {
"type": "string",
"description": "The codec used to encode the video."
},
"fileSize": {
"type": "integer",
"description": "The video quality file size in bytes."
}
},
"required": [
"fileId",
"fileUniqueId",
"width",
"height",
"codec"
],
"additionalProperties": true,
"description": "A Telegram video file at one available quality."
},
"description": "The available encoded video qualities."
},
"fileName": {
"type": "string",
"description": "The original video filename."
},
"mimeType": {
"type": "string",
"description": "The MIME type of the video."
},
"fileSize": {
"type": "integer",
"description": "The video file size in bytes."
}
},
"required": [
"fileId",
"fileUniqueId",
"width",
"height",
"duration"
],
"additionalProperties": true,
"description": "A Telegram video file."
},
"audio": {
"type": "object",
"properties": {
"fileId": {
"type": "string",
"description": "The file identifier used to download or reuse the audio."
},
"fileUniqueId": {
"type": "string",
"description": "The stable unique identifier of the audio."
},
"duration": {
"type": "integer",
"description": "The audio duration in seconds."
},
"performer": {
"type": "string",
"description": "The performer of the audio."
},
"title": {
"type": "string",
"description": "The audio track title."
},
"fileName": {
"type": "string",
"description": "The original audio filename."
},
"mimeType": {
"type": "string",
"description": "The MIME type of the audio."
},
"fileSize": {
"type": "integer",
"description": "The audio file size in bytes."
},
"thumbnail": {
"type": "object",
"properties": {
"fileId": {
"type": "string",
"description": "The file identifier used to download or reuse the photo."
},
"fileUniqueId": {
"type": "string",
"description": "The stable unique identifier of the photo."
},
"width": {
"type": "integer",
"description": "The photo width in pixels."
},
"height": {
"type": "integer",
"description": "The photo height in pixels."
},
"fileSize": {
"type": "integer",
"description": "The photo file size in bytes."
}
},
"required": [
"fileId",
"fileUniqueId",
"width",
"height"
],
"additionalProperties": true,
"description": "A Telegram photo or thumbnail size."
}
},
"required": [
"fileId",
"fileUniqueId",
"duration"
],
"additionalProperties": true,
"description": "A Telegram audio file."
},
"voice": {
"type": "object",
"properties": {
"fileId": {
"type": "string",
"description": "The file identifier used to download or reuse the voice message."
},
"fileUniqueId": {
"type": "string",
"description": "The stable unique identifier of the voice message."
},
"duration": {
"type": "integer",
"description": "The voice message duration in seconds."
},
"mimeType": {
"type": "string",
"description": "The MIME type of the voice message."
},
"fileSize": {
"type": "integer",
"description": "The voice message file size in bytes."
}
},
"required": [
"fileId",
"fileUniqueId",
"duration"
],
"additionalProperties": true,
"description": "A Telegram voice message file."
},
"animation": {
"type": "object",
"properties": {
"fileId": {
"type": "string",
"description": "The file identifier used to download or reuse the animation."
},
"fileUniqueId": {
"type": "string",
"description": "The stable unique identifier of the animation."
},
"width": {
"type": "integer",
"description": "The animation width in pixels."
},
"height": {
"type": "integer",
"description": "The animation height in pixels."
},
"duration": {
"type": "integer",
"description": "The animation duration in seconds."
},
"thumbnail": {
"type": "object",
"properties": {
"fileId": {
"type": "string",
"description": "The file identifier used to download or reuse the photo."
},
"fileUniqueId": {
"type": "string",
"description": "The stable unique identifier of the photo."
},
"width": {
"type": "integer",
"description": "The photo width in pixels."
},
"height": {
"type": "integer",
"description": "The photo height in pixels."
},
"fileSize": {
"type": "integer",
"description": "The photo file size in bytes."
}
},
"required": [
"fileId",
"fileUniqueId",
"width",
"height"
],
"additionalProperties": true,
"description": "A Telegram photo or thumbnail size."
},
"fileName": {
"type": "string",
"description": "The original animation filename."
},
"mimeType": {
"type": "string",
"description": "The MIME type of the animation."
},
"fileSize": {
"type": "integer",
"description": "The animation file size in bytes."
}
},
"required": [
"fileId",
"fileUniqueId",
"width",
"height",
"duration"
],
"additionalProperties": true,
"description": "A Telegram animation file."
},
"contact": {
"type": "object",
"properties": {
"phoneNumber": {
"type": "string",
"description": "The contact phone number."
},
"firstName": {
"type": "string",
"description": "The contact first name."
},
"lastName": {
"type": "string",
"description": "The contact last name."
},
"userId": {
"type": "integer",
"description": "The Telegram user identifier associated with the contact."
},
"vcard": {
"type": "string",
"description": "Additional contact data in vCard format."
}
},
"required": [
"phoneNumber",
"firstName"
],
"additionalProperties": true,
"description": "A Telegram contact."
},
"venue": {
"type": "object",
"properties": {
"location": {
"type": "object",
"properties": {
"latitude": {
"type": "number",
"description": "The latitude of the location."
},
"longitude": {
"type": "number",
"description": "The longitude of the location."
},
"horizontalAccuracy": {
"type": "number",
"description": "The radius of uncertainty in meters."
},
"livePeriod": {
"type": "integer",
"description": "The live location update period in seconds."
},
"heading": {
"type": "integer",
"description": "The direction of travel in degrees."
},
"proximityAlertRadius": {
"type": "integer",
"description": "The proximity alert radius in meters."
}
},
"required": [
"latitude",
"longitude"
],
"additionalProperties": true,
"description": "A Telegram geographic location."
},
"title": {
"type": "string",
"description": "The venue name."
},
"address": {
"type": "string",
"description": "The venue address."
},
"foursquareId": {
"type": "string",
"description": "The Foursquare place identifier."
},
"foursquareType": {
"type": "string",
"description": "The Foursquare place type."
},
"googlePlaceId": {
"type": "string",
"description": "The Google Places identifier."
},
"googlePlaceType": {
"type": "string",
"description": "The Google Places type."
}
},
"required": [
"location",
"title",
"address"
],
"additionalProperties": true,
"description": "A Telegram venue."
},
"dice": {
"type": "object",
"properties": {
"emoji": {
"type": "string",
"description": "The emoji used for the animation."
},
"value": {
"type": "integer",
"description": "The generated dice value."
}
},
"required": [
"emoji",
"value"
],
"additionalProperties": true,
"description": "A Telegram animated dice result."
}
},
"required": [
"messageId",
"date",
"chat"
],
"additionalProperties": true,
"description": "A normalized Telegram message record."
},
"nullable": false,
"handle": "output"
}
],
"name": "Send a Telegram notice",
"executor": {
"kind": "connector",
"action": "telegram.send_message",
"outputMode": "value"
}
}
},
"n_586ff0f907df6859": {
"name": "Notice count",
"kind": "outputs",
"outputDefs": [
{
"jsonSchema": {
"type": "integer",
"minimum": 0
},
"nullable": false,
"handle": "count"
}
],
"outputMappings": {
"count": {
"kind": "sources",
"sources": [
{
"kind": "node",
"nodeId": "n_675973748bf57c63",
"output": "count"
}
]
}
}
}
},
"edges": [
{
"source": "n_33b1ad4a707f36e5",
"target": "n_1c78f4a56b44dcb7"
},
{
"source": "n_1c78f4a56b44dcb7",
"target": "n_71f5f884469b6bc0"
},
{
"source": "n_71f5f884469b6bc0",
"target": "n_675973748bf57c63"
},
{
"source": "n_675973748bf57c63",
"target": "n_85302da065cd7f98"
},
{
"source": "n_85302da065cd7f98",
"target": "n_ac19f931477f5c60",
"sourceHandle": "send"
},
{
"source": "n_ac19f931477f5c60",
"target": "n_675973748bf57c63"
},
{
"source": "n_85302da065cd7f98",
"target": "n_586ff0f907df6859",
"sourceHandle": "otherwise"
}
]
}
},
"modules": {
"n_efdb37b9fb6a91ef": {
"name": "Find new videos",
"imports": [],
"source": "export default async function plan({body,statusCode,chatId},context){\n if(!Number.isInteger(statusCode)||statusCode<200||statusCode>=300)throw Error('YouTube search failed');\n if(!body||typeof body!=='object'||Array.isArray(body)||body.error)throw Error('Invalid YouTube response');\n const items=body.items??[];if(!Array.isArray(items)||items.length>4)throw Error('Invalid YouTube result list');\n if(!items.length)return{rows:[],chatId};\n if(typeof chatId!=='string'||!chatId.trim()||chatId==='YOUR_TELEGRAM_CHAT_ID')throw Error('Set a Telegram chat ID');\n const rows=items.map(x=>{const id=x?.id?.videoId,title=x?.snippet?.title;if(typeof id!=='string'||!/^[A-Za-z0-9_-]{1,128}$/.test(id)||typeof title!=='string')throw Error('Invalid video');const escaped=title.replace(/&/g,'&').replace(//g,'>');const text=`New video on YouTube!\\n${escaped}\\n\\nhttps://youtu.be/${id}`;if(text.length>4096)throw Error('Telegram message exceeds limit');return{id,text}});\n const old=await context.state.get('youtube-video-ids');if(old!==null&&(!Array.isArray(old)||old.some(x=>typeof x!=='string')))throw Error('Invalid saved IDs');const previous=old??[],selected=[];for(const row of rows){if(previous.includes(row.id))break;selected.push(row)}await context.state.set('youtube-video-ids',rows.map(x=>x.id));return{rows:selected,chatId};\n}\n"
},
"n_62ee0469f6d3cd30": {
"name": "Prepare the next notice",
"imports": [],
"source": "export default function next({rows,previousState}){if(!Array.isArray(rows)||rows.length>4)throw Error('Invalid notices');const index=previousState===null?0:previousState.index+1;if(!Number.isInteger(index)||index<0||index>rows.length)throw Error('Invalid progress');return{state:{index},more:index