Вверх ↑
Этот топик читают: Гость
Ответов: 204
Рейтинг: 2
#1: 2018-04-17 20:15:54 ЛС | профиль | цитата
Сегодня наткнулся на API youtube: https://www.youtube.com/yt/dev/ru/api-resources.html

Насколько мог ознакомился с документацией и тутже возникла мысль: А возможно ли на основе данного API сделать для HiAsm полноценный компонент (или набор компонентов) для работы с ютубом?

Допустим получать статистические данные со своего канала или оповещения о стримах и новых видео с подписанных каналов. например того как приходят оповещения на почту???

Есть ли у нас такая возможность подружить HiAsm с youtube?

Редактировалось 1 раз(а), последний 2018-04-17 20:34:29
карма: 1

0
Ответов: 4657
Рейтинг: 760
#2: 2018-04-18 10:42:48 ЛС | профиль | цитата
Не думаю, что для этого надо целые компоненты делать. Всё API - это HTTP протокол (cookie, SSL, пользовательское тело запроса - JSON). Достаточно будет HTTPClient. Возможно, что-то небольшое нужно будет доделать для генерации авторизационных данных (типа HMAC, если требуется).
карма: 26

0
Ответов: 204
Рейтинг: 2
#3: 2018-04-18 10:56:11 ЛС | профиль | цитата
Для меня это оказалось несколько сложным. с моим знанием английского разобраться в документации оказалось сложновато (переводчик не всегда спасает)
Впрочем главный посыл понял, в рамках HiAsm работать с ютубом можно! Буду потихонечку пробовать освоить. Спасибо.
карма: 1

0
Ответов: 4657
Рейтинг: 760
#4: 2018-04-18 11:02:21 ЛС | профиль | цитата
Для начала настраиваешь API у себя в профиле и пробуешь примеры на JavaScript - думаю, достаточно будет сделать простую HTML страничку, подключить в неё клиентские библиотеки JS и попробовать отобразить данные канала.
карма: 26

0
Ответов: 204
Рейтинг: 2
#5: 2018-04-18 14:26:27 ЛС | профиль | цитата
Немного начало получаться.
Например, по запросу: https://www.googleapis.com/youtube/v3/channels?key=<API_KEY>&part=snippet,contentDetails,statistics&id=UCIi2Tk2POJkRgWHD7HGBa7Q
(<API_KEY> = вставил зарегистрированный мой API youtub)

получил вот такой результат:

тык
kind "youtube#channelListResponse"
etag "\"adhdwwnzlC1WiY00i7th8QwqOGQ/kHu1n2UyHlD3lDH_OQzFTYswGhQ\""
pageInfo
totalResults 1
resultsPerPage 1
items
0
kind "youtube#channel"
etag "\"adhdwwnzlC1WiY00i7th8QwqOGQ/reV_ijPI0BYojKRaaEzCnnv8Ahc\""
id "UCIi2Tk2POJkRgWHD7HGBa7Q"
snippet
title "Наука 2.0"
description "Официальный канал \"Наука 2.0\". \nНаучно-популярный познавательный канал о достижениях российской и мировой науки: человек, техника, технологии и космос. Специальные проекты и программы. \n\n\"Наука 2.0\" – канал для тех, кто интересуется настоящим и хочет знать, каким будет наше будущее.\nБольшинство зрителей даже не представляет, что такое современная наука и над чем сегодня работают ученые всего мира. Наша основная задача – рассказывать о значимых изобретениях, технологиях и открытиях. Ведь в 21 веке развитый интеллект, эрудированность и способность к нестандартному мышлению - настоящий ключ к успеху."
customUrl "naukatv"
publishedAt "2015-08-28T09:40:10.000Z"
thumbnails
default
url "https://yt3.ggpht.com/-8B_Z21pTQNI/AAAAAAAAAAI/AAAAAAAAAAA/p6n9PtEPBCg/s88-c-k-no-mo-rj-c0xffffff/photo.jpg"
width 88
height 88
medium
url "https://yt3.ggpht.com/-8B_Z21pTQNI/AAAAAAAAAAI/AAAAAAAAAAA/p6n9PtEPBCg/s240-c-k-no-mo-rj-c0xffffff/photo.jpg"
width 240
height 240
high
url "https://yt3.ggpht.com/-8B_Z21pTQNI/AAAAAAAAAAI/AAAAAAAAAAA/p6n9PtEPBCg/s800-c-k-no-mo-rj-c0xffffff/photo.jpg"
width 800
height 800
defaultLanguage "ru"
localized
title "Science"
description "Официальный канал \"Наука 2.0\". \nНаучно-популярный познавательный канал о достижениях российской и мировой науки: человек, техника, технологии и космос. Специальные проекты и программы. \n\n\"Наука 2.0\" – канал для тех, кто интересуется настоящим и хочет знать, каким будет наше будущее.\nБольшинство зрителей даже не представляет, что такое современная наука и над чем сегодня работают ученые всего мира. Наша основная задача – рассказывать о значимых изобретениях, технологиях и открытиях. Ведь в 21 веке развитый интеллект, эрудированность и способность к нестандартному мышлению - настоящий ключ к успеху."
country "RU"
contentDetails
relatedPlaylists
uploads "UUIi2Tk2POJkRgWHD7HGBa7Q"
watchHistory "HL"
watchLater "WL"
statistics
viewCount "85302961"
commentCount "0"
subscriberCount "631599"
hiddenSubscriberCount false
videoCount "1063"

Из всего этого можно получить: описание канала, количество просмотров, комментариев, видео.

А вот как запросить наличие стрима? То есть как понять онлайн сейчас канал или нет??? Существует ли вообще возможность такого запроса? В документах API я такого не обнаружил, либо просто не нашел!

И да, считаю что компонент "API ютуб" для HiAsm всеже нужен! Хотя бы ради облегчения работы. Возможно когда освою полноценно этот кактус попробую сварганить компонент.
карма: 1

0
Ответов: 204
Рейтинг: 2
#6: 2018-04-18 17:54:48 ЛС | профиль | цитата
Как оказалось за запрос о наличии онлайна на канале отвечает параметр: broadcastStatus

Но что-то у меня ничего не выходит с запросом о наличии онлайна на канале

запрос вывожу так: https://www.googleapis.com/youtube/v3/liveBroadcasts?key=<API_KEY>&part=id,snippet,cdn&status=UCIi2Tk2POJkRgWHD7HGBa7Q

Выходит ошибка:
error
errors
0
domain "global"
reason "required"
message "Login Required"
locationType "header"
location "Authorization"
code 401
message "Login Required"

Я так понимаю что мне говорят об ошибке авторизации, но ведь я не лезу в личные настройки канала. Всё что я пытаюсь узнать это идет стрим на канале в данную минуту или нет! Это ведь публичная информация!
Возможно я как-то не так делаю запрос???
карма: 1

0
Ответов: 4657
Рейтинг: 760
#7: 2018-04-19 11:02:11 ЛС | профиль | цитата
https://developers.google.com/youtube/v3/live/docs/liveBroadcasts/list писал(а):
Request

HTTP request

GET https://www.googleapis.com/youtube/v3/liveBroadcasts

Authorization

This request requires authorization with at least one of the following scopes (read more about authentication and authorization).


Редактировалось 1 раз(а), последний 2018-04-19 11:02:43
карма: 26

0
Ответов: 204
Рейтинг: 2
#8: 2018-04-19 13:39:05 ЛС | профиль | цитата
Netspirit писал(а):
https://developers.google.com/youtube/v3/live/docs/liveBroadcasts/list


Блин, я до последнего надеялся что что-то не так понимаю. ((((

Но согласитесь, ведь это тотальная глупость требовать авторизацию при запросе наличия онлайна! Не могу понять их логики в этом вопросе!

Редактировалось 1 раз(а), последний 2018-04-19 13:40:13
карма: 1

0
Ответов: 204
Рейтинг: 2
#9: 2018-04-19 16:53:02 ЛС | профиль | цитата
Ну что же, свершилось! Мой скудный разум освоил маленькую толику знаний по API youtube/
Я вынес мозг доброй половине программистов на "тостере" и "киберфоруме" в итоге решение мне помог найти человек который уже не раз спасал меня в плане программирования! За что ему огромное спасибо! Ты мега крут!!!! )))

И так запрос на наличие стрима/онлайна канала на ютуб выглядит следующим образом:

https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=ИД_КАНАЛА&eventType=live&maxResults=1&order=date&type=video&key=ВАШ API КЛЮЧЬ

Если стрим присутствует то ответ будет выглядеть так:


Если нет ни стрима ни оповещения о нем, то раздел: items будет пустым


Всё что я хотел получить от API youtube, я получил. Теперь дело за малым собрать все это в схему и по возможности запилить компонент. )))
карма: 1

0
Ответов: 204
Рейтинг: 2
#10: 2018-04-19 20:27:28 ЛС | профиль | цитата
Схема готова. Вроде все что замыслил получилось. Наверняка из API youtube можно получить значительно больше, но я в эти дебри не лез. Если кто нибудь захочет. то дополнит моё творение. ))

Правда сам компонент сделать не получилось так как в схеме использовал нестандартный компонент HTTPClient. Тот что посоветовал Netspirit. Кстати спасибо ему отдельное. В нужный момент пнул меня в нужном направлении! ))

Собственно сама схема.

Add(MainForm,11567121,63,253)
{
 Width=783
 Height=526
}
Add(Button,10550242,385,386)
{
 Left=90
 Top=120
 Caption="statistics"
 link(onClick,5252399:doStatistics,[])
}
Add(Edit,16664417,532,259)
{
 Left=10
 Top=30
 Width=310
 Text=""
}
Add(Memo,7194871,777,379)
{
 Left=330
 Top=15
 Width=425
 Height=155
 ScrollBars=3
}
Add(MultiElementEx,5252399,532,386)
{
 link(APIKey,16664417:Text,[])
 link(IDchannel,5506683:Text,[])
 link(onStatistics,8203864:doEvent1,[])
 link(onIine,7419020:doEvent1,[])
}
BEGIN_SDK
  Add(EditMultiEx,2374688,21,21)
  {
   WorkCount=#56:doStatistics=получить общую статистику канала на youtube|50:doLive=проверить статус канала online-1, offline-0|
   EventCount=#103:onStatistics=событие происходит после получения статитики канала и выводит полученный результат в поток|61:onIine=Наличие видеотрансляции на канале. 1-online, 0-offline|
   VarCount=#22:NameChannel=Имя канала|27:description=описание канала|31:viewCount=Количество просмотров|39:subscriber Count=Количество подписчиков|44:videoCount=Количество видеороликов на канале|27:Name stream=Название стрима|33:DescriptionStream=Описание стрима|
   DataCount=#58:APIKey=Ваш  API key. Без него компонент работать не будет!|29:IDChannel=ID канла на youtube|
   Width=1602
   Height=900
   VOffset=150
   HOffset=250
   link(doStatistics,10492591:doString,[(140,177)(140,301)])
   link(doLive,11296329:doString,[(129,184)(129,441)])
   link(NameChannel,10740601:Value,[(277,698)(580,698)])
   link(description,616303:Value,[(284,707)(720,707)])
   link(viewCount,16302207:Value,[(291,718)(860,718)])
   link(subscriber Count,14210032:Value,[(298,727)(1000,727)])
   link(videoCount,11997303:Value,[(305,739)(1140,739)])
   link(Name stream,16052978:Value,[(312,879)(524,879)])
   link(DescriptionStream,13852999:Value,[(319,890)(664,890)])
  }
  Add(HTTPClient,5090119,623,302)
  {
   @Hint=#27:Скачиваю, получаю ответы...|
   Headers="Connection: Close"
   Point(Proxy)
   Point(Stream)
   Point(doLoadStream)
   link(onFinish,2355244:doCharset,[])
  }
  Add(Charset,2355244,700,309)
  {
   Type=7
   link(onCharset,6023524:doEvent1,[])
  }
  Add(FormatStr,10492591,238,295)
  {
   @Hint=#30:запрос общей статистики канала|
   Mask="https://www.googleapis.com/youtube/v3/channels?key=%1&part=snippet,contentDetails,statistics&id=%2\r\n "
   link(onFString,13196461:doEvent1,[])
   link(Str1,15607216:getVar,[])
   link(Str2,6092438:getVar,[])
   AddHint(63,-24,186,13,@Hint)
  }
  Add(LineBreakEx,9017796,271,63)
  {
   Caption="APIkey"
   Type=3
   link(_Data,2374688:APIKey,[])
  }
  Add(FormatStr,11296329,231,435)
  {
   @Hint=#32:запрос наличия онлайна на канале|
   Mask="https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=%2&eventType=live&maxResults=1&order=date&type=video&key=%1\r\n"
   link(onFString,6151234:doEvent1,[(282,441)(282,441)])
   link(Str1,9608230:getVar,[])
   link(Str2,4652379:getVar,[])
   AddHint(67,29,194,13,@Hint)
  }
  Add(HubEx,5526199,574,302)
  {
   link(onEvent,5090119:doLoadString,[])
  }
  Add(LineBreakEx,6241923,278,42)
  {
   Caption="ID_channel"
   Type=3
   link(_Data,2374688:IDchannel,[])
  }
  Add(LineBreakEx,15607216,238,203)
  {
   Caption="APIkey"
   Type=2
  }
  Add(LineBreakEx,6092438,245,231)
  {
   Caption="ID_channel"
   Type=2
  }
  Add(LineBreakEx,9608230,231,350)
  {
   Caption="APIkey"
   Type=2
  }
  Add(LineBreakEx,4652379,238,378)
  {
   Caption="ID_channel"
   Type=2
  }
  Add(Hub,6023524,777,309)
  {
   link(onEvent1,2374688:onStatistics,[(1207,315)(1207,177)])
   link(onEvent2,12577696:doEvent1,[(803,322)(803,395)(646,395)(646,475)])
  }
  Add(IndexToChanel,13203765,966,462)
  {
   Point(Index)
   Point(Data)
   link(onEvent1,1347603:doSearch,[(1038,468)(1038,578)(499,578)(499,629)])
   link(onEvent2,8969744:doSearch,[])
   link(Index,8064973:Value,[])
   link(Data,2107277:Var3,[(979,450)(942,450)(942,525)])
  }
  Add(ChanelToIndex,98241,413,329)
  {
   link(onIndex,12330542:In,[])
  }
  Add(Memory,8064973,966,399)
  {
   Default=Integer(0)
  }
  Add(Hub,13196461,308,295)
  {
   link(onEvent1,98241:doWork1,[(368,301)(368,335)])
   link(onEvent2,5526199:doWork2,[])
  }
  Add(Hub,6151234,301,435)
  {
   link(onEvent1,98241:doWork2,[(364,441)(364,342)])
   link(onEvent2,5526199:doWork3,[(578,448)])
  }
  Add(LineBreak,3974112,917,399)
  {
   link(Out,8064973:doValue,[])
   Primary=[12330542,-455,-70]
  }
  Add(StrList,352530,784,462)
  {
  }
  Add(Hub,12577696,672,469)
  {
   OutCount=3
   link(onEvent1,352530:doClear,[])
   link(onEvent2,352530:doAdd,[(770,482)(770,468)])
   link(onEvent3,12341515:doTrim,[(763,489)(763,545)])
  }
  Add(BlockFind,1347603,511,623)
  {
   IncludeBlock=1
   StartBlock=""snippet": {
 "title":"
   EndBlock=","
   link(onSearch,10740601:doValue,[])
   link(Text,2445723:Var2,[])
  }
  Add(GetDataEx,2107277,784,520)
  {
   link(Data,352530:Text,[])
  }
  Add(Trim,12341515,784,539)
  {
   Mode=7
   link(onTrim,4087216:doEvent1,[])
   link(Text,2107277:Var2,[])
  }
  Add(Hub,4087216,833,539)
  {
   link(onEvent1,352530:doText,[(859,545)(859,517)(772,517)(772,489)])
   link(onEvent2,13203765:doEvent,[(907,552)(907,468)])
  }
  Add(Memory,10740601,574,623)
  {
   link(onData,9612997:doSearch,[])
  }
  Add(BlockFind,9612997,644,623)
  {
   IncludeBlock=1
   StartBlock=""description":"
   EndBlock=""customUrl""
   link(onSearch,616303:doValue,[])
   link(Text,12817863:Var2,[])
  }
  Add(GetDataEx,12277095,644,520)
  {
   Angle=1
   link(Data,2107277:Var1,[])
  }
  Add(Memory,616303,714,623)
  {
   link(onData,12687951:doSearch,[])
  }
  Add(BlockFind,12687951,791,623)
  {
   IncludeBlock=1
   StartBlock=""viewCount": ""
   EndBlock="","
   link(onSearch,16302207:doValue,[])
   link(Text,3657358:Var2,[])
  }
  Add(GetDataEx,12817863,644,588)
  {
   link(Data,12277095:Var2,[])
  }
  Add(Memory,16302207,854,623)
  {
   link(onData,11693323:doSearch,[])
  }
  Add(BlockFind,11693323,924,623)
  {
   IncludeBlock=1
   StartBlock=""subscriberCount": ""
   EndBlock="","
   link(onSearch,14210032:doValue,[])
   link(Text,6086141:Var2,[])
  }
  Add(GetDataEx,3657358,791,588)
  {
   Angle=3
   link(Data,12817863:Var3,[])
  }
  Add(Memory,14210032,994,623)
  {
   link(onData,1954815:doSearch,[])
  }
  Add(BlockFind,1954815,1064,623)
  {
   IncludeBlock=1
   StartBlock=""videoCount": ""
   EndBlock="""
   link(onSearch,11997303:doValue,[])
   link(Text,6086141:Var3,[(1070,593)])
  }
  Add(GetDataEx,6086141,924,588)
  {
   Angle=3
   link(Data,3657358:Var3,[])
  }
  Add(Memory,11997303,1134,623)
  {
  }
  Add(LineBreak,7542560,371,805)
  {
   link(Out,12286289:doSearch,[])
   Primary=[7937901,910,-336]
  }
  Add(BlockFind,8969744,1064,469)
  {
   IncludeBlock=1
   StartBlock=""items": [
"
   EndBlock="]"
   link(onSearch,9782022:doValue,[])
  }
  Add(Memory,9782022,1113,469)
  {
   Default=String()
   link(onData,3921705:doLength,[])
  }
  Add(Length,3921705,1169,469)
  {
   link(onLength,4134012:doCompare,[])
   link(Str,9782022:Value,[(1175,457)(1151,457)(1151,513)(1119,513)])
  }
  Add(If_else,4134012,1225,469)
  {
   Type=4
   Op2=Integer(6)
   link(onTrue,7937901:In,[])
   link(onFalse,2684509:doWork2,[])
   link(Op1,3921705:Result,[(1231,457)(1203,457)(1203,513)(1175,513)])
  }
  Add(ChanelToIndex,15700560,1456,476)
  {
   link(onIndex,2374688:onIine,[(1556,482)(1556,184)])
  }
  Add(BlockFind,12286289,455,805)
  {
   IncludeBlock=1
   StartBlock=""title":"
   EndBlock=","
   link(onSearch,16052978:doValue,[])
   link(Text,5792305:Var2,[])
  }
  Add(Memory,16052978,518,805)
  {
   link(onData,12201226:doSearch,[])
  }
  Add(BlockFind,12201226,588,805)
  {
   IncludeBlock=1
   StartBlock=""description":"
   EndBlock=","
   link(onSearch,13852999:doValue,[])
   link(Text,7321138:Var2,[])
  }
  Add(Memory,13852999,658,805)
  {
   link(onData,6498649:doSearch,[])
  }
  Add(LineBreakEx,14012239,434,539)
  {
   Caption="datach"
   Type=3
   link(_Data,2445723:Var1,[(440,525)])
  }
  Add(GetDataEx,2445723,511,520)
  {
   Angle=1
   link(Data,12277095:Var1,[])
  }
  Add(LineBreakEx,10893769,455,749)
  {
   Caption="datach"
   Type=2
  }
  Add(GetDataEx,5792305,455,770)
  {
   link(Data,10893769:getVar,[])
  }
  Add(BlockFind,6498649,735,805)
  {
   IncludeBlock=1
   StartBlock=""liveBroadcastContent": ""
   EndBlock="""
   link(onSearch,12451010:doCompare,[])
   link(Text,7321138:Var3,[(741,775)])
  }
  Add(GetDataEx,7321138,588,770)
  {
   Angle=3
   link(Data,5792305:Var3,[])
  }
  Add(If_else,12451010,805,805)
  {
   Op2=String(live)
   link(onTrue,7753018:In,[])
   link(onFalse,8306089:In,[])
  }
  Add(LineBreak,11869638,1400,483)
  {
   link(Out,15700560:doWork2,[])
   Primary=[7753018,-539,322]
  }
  Add(LineBreak,16706383,1351,462)
  {
   link(Out,2684509:doWork1,[(1439,468)])
   Primary=[8306089,-448,350]
  }
  Add(HubEx,2684509,1435,476)
  {
   link(onEvent,15700560:doWork1,[])
  }
END_SDK
Add(Hub,8203864,686,386)
{
 OutCount=3
 link(onEvent1,7194871:doClear,[])
 link(onEvent2,7194871:doAdd,[(728,399)(728,385)])
 link(onEvent3,15749535:doWork2,[])
}
Add(Label,4418064,385,70)
{
 Left=15
 Top=10
 Width=41
 Height=17
 Caption="API key"
}
Add(Edit,5506683,539,312)
{
 Left=10
 Top=85
 Width=310
 Text=""
}
Add(Label,15703479,425,68)
{
 Left=15
 Top=65
 Width=56
 Height=17
 Caption="ID channel"
}
Add(Button,3854230,443,393)
{
 Left=165
 Top=120
 Caption="online"
 link(onClick,5252399:doLive,[])
}
Add(Label,14208315,469,70)
{
 Left=20
 Top=175
 Width=220
 Caption="название канала"
}
Add(Label,6658984,511,70)
{
 Left=20
 Top=220
 Width=170
 Caption="описание канала"
}
Add(Edit,664144,532,791)
{
 Left=20
 Top=190
 Width=260
 link(Str,5252399:NameChannel,[])
}
Add(Memo,1264681,539,735)
{
 Left=15
 Top=235
 Width=270
 ScrollBars=3
 link(Str,5252399:description,[])
}
Add(LineBreak,6720373,441,742)
{
 link(Out,8186753:doEvent1,[])
 Primary=[6953037,-196,-189]
}
Add(Hub,8186753,490,742)
{
 link(onEvent1,1264681:doClear,[])
 link(onEvent2,1264681:doAdd,[(522,755)(522,741)])
}
Add(LineBreak,2890620,56,546)
{
 link(Out,15844709:doDeferredEvent,[])
 Primary=[7896336,672,-146]
}
Add(Hub,2860240,168,546)
{
 OutCount=7
 link(onEvent1,10180981:In,[])
 link(onEvent2,6953037:In,[])
 link(onEvent3,15145382:In,[])
 link(onEvent4,6911954:In,[])
 link(onEvent5,4981642:In,[])
 link(onEvent6,5112429:In,[])
 link(onEvent7,4981925:In,[])
}
Add(LineBreak,4067009,483,791)
{
 link(Out,664144:doText,[])
 Primary=[10180981,-280,-245]
}
Add(Label,1232803,553,70)
{
 Left=25
 Top=330
 Width=215
 Caption="количество просмотров на канале"
}
Add(Edit,11154435,546,686)
{
 Left=25
 Top=345
 Width=175
 link(Str,5252399:viewCount,[])
}
Add(LineBreak,4215978,490,686)
{
 link(Out,11154435:doText,[])
 Primary=[15145382,-287,-126]
}
Add(Label,13600223,595,70)
{
 Left=25
 Top=375
 Width=215
 Caption="количество подписчиков"
}
Add(Edit,736924,553,637)
{
 Left=25
 Top=390
 Width=170
 link(Str,5252399:subscriber Count,[])
}
Add(LineBreak,10140022,497,637)
{
 link(Out,736924:doText,[])
 Primary=[6911954,-252,-70]
}
Add(LineBreak,8589158,497,588)
{
 link(Out,1645045:doText,[])
 Primary=[4981642,-294,-14]
}
Add(Label,9726737,639,70)
{
 Left=25
 Top=420
 Width=180
 Height=17
 Caption="количество видеороликов"
}
Add(Edit,16375362,567,539)
{
 Left=320
 Top=285
 Width=430
 link(Str,5252399:Name stream,[])
}
Add(LineBreak,16383049,497,539)
{
 link(Out,16375362:doText,[])
 Primary=[5112429,-252,42]
}
Add(Label,3163815,678,70)
{
 Left=325
 Top=265
 Width=92
 Height=17
 Caption="название стрима"
}
Add(Memo,5380066,574,469)
{
 Left=320
 Top=340
 Width=420
 Height=120
 ScrollBars=3
 link(Str,5252399:DescriptionStream,[])
}
Add(LineBreak,15969612,462,476)
{
 link(Out,2161287:doEvent1,[])
 Primary=[4981925,-259,112]
}
Add(Hub,2161287,511,476)
{
 link(onEvent1,5380066:doClear,[])
 link(onEvent2,5380066:doAdd,[(557,489)(557,475)])
}
Add(Label,8953252,718,68)
{
 Left=325
 Top=320
 Width=92
 Height=17
 Caption="описание стрима"
}
Add(Label,10078649,1117,397)
{
 Left=495
 Top=195
 Width=92
 Height=17
 Caption="online"
 Point(doBringToFront)
}
Add(LED,8037558,1120,350)
{
 Left=520
 Top=225
}
Add(LineBreak,6469772,924,364)
{
 link(Out,399814:doEvent,[])
 Primary=[3538987,-280,29]
}
Add(Label,8008843,1117,313)
{
 Left=495
 Top=195
 Width=92
 Height=17
 Caption="offline"
 Point(doBringToFront)
}
Add(IndexToChanel,399814,980,364)
{
 link(onEvent1,567041:doEvent1,[(1047,370)(1047,326)])
 link(onEvent2,12858881:doEvent1,[(1048,377)(1048,403)])
}
Add(Hub,7419020,602,393)
{
 link(onEvent1,3538987:In,[])
 link(onEvent2,15749535:doWork1,[(632,406)(632,440)(711,440)])
}
Add(HubEx,15749535,707,400)
{
 link(onEvent,7896336:In,[])
}
Add(Hub,567041,1078,320)
{
 link(onEvent1,8008843:doBringToFront,[])
 link(onEvent2,8037558:doOff,[(1106,333)(1106,363)])
}
Add(Hub,12858881,1078,397)
{
 link(onEvent1,8037558:doOn,[(1106,403)(1106,370)])
 link(onEvent2,10078649:doBringToFront,[])
}
Add(DeferredEvent,15844709,105,546)
{
 Delay=31
 link(onDeferredEvent,2860240:doEvent1,[])
}
Add(Edit,1645045,560,588)
{
 Left=25
 Top=435
 Width=170
 link(Str,5252399:videoCount,[])
}


Редактировалось 1 раз(а), последний 2018-04-19 20:28:06
карма: 1

0
Ответов: 4657
Рейтинг: 760
#11: 2018-04-20 10:52:52 ЛС | профиль | цитата
Я почему и говорил, что нет необходимости делать отдельные компоненты - весь функционал можно реализовать набором таких мультиэлементов. Интуитивно ощущаю необходимость компонента JSON-парсера, чтобы не городить BlockFind.
карма: 26

0
Ответов: 233
Рейтинг: 12
#12: 2018-04-21 11:54:58 ЛС | профиль | цитата
Netspirit писал(а):
Интуитивно ощущаю необходимость компонента JSON-парсера, чтобы не городить BlockFind.


Вот это было бы очень полезно!!!!
карма: 2

0
Ответов: 72
Рейтинг: 1
#13: 2018-04-21 12:04:19 ЛС | профиль | цитата
Netspirit писал(а):
......авторизационных данных (типа HMAC, если требуется)

И это не менее полезно в частности HMAC-SHA512
карма: 1

0
13
Сообщение
...
Прикрепленные файлы
(файлы не залиты)