[{"server":null,"owner":null,"id":"3c2fff31-c63a-4850-8111-62f120d06efe","params":{"script":{"value":"# имя: 'Responsive media exporter 2'\r\n# описание: экспортирование видео ролика по событию\r\n# тип триггера: 'EgsObjectUpdated'\r\n# создан: 2017.11.02 11.33.11, Сельченков Н.Ю.\r\n# изменен: '2018.04.26 14.33.30', Сельченков Н.Ю.\r\n# подробности: https://redmine.integra-s.com:11000/projects/eilyacuario/wiki/Responsive_media_exporter_2\r\n\r\nuse System.Uri\r\nuse System.Threading.Tasks.Task\r\nuse System.Text.RegularExpressions.Regex\r\nuse System.Collections.Generic.Dictionary(string, object) as Dictionary\r\nuse System.Collections.Generic.List(Task) as TaskList\r\n\r\nuse acuario2.types.VideoCamera from acuario2.types\r\nuse acuario2.types.LogicLink from acuario2.types\r\nuse acuario2.types.Position from acuario2.types\r\nuse acuario2.types.Space from acuario2.types\r\n\r\nuse integravideo.client.Iv7Server from IntegraVideo7Client\r\n\r\n######################################################\r\n\r\nuse typedef\r\n`\r\n    <root>\r\n        <param name=\"source_type\" type=\"text\"/>\r\n        <param name=\"source_guids\" type=\"list\"/>\r\n        <param name=\"source_states\" type=\"list\"/>\r\n        <param name=\"logic_link\" type=\"bool\"/>\r\n        <param name=\"same_space\" type=\"bool\"/>\r\n        <param name=\"media_path\" type=\"string\"/>\r\n        <param name=\"media_duration\" type=\"span\"/>\r\n        <param name=\"url\">http://localhost:1986/axis2/services/Iv7Server</param>\r\n    </root>\r\n` as Settings\r\n\r\nconst settings = Settings(trigger.settings)\r\n\r\nuse (\"acuario2.types.\" + settings.source_type) as SourceType from acuario2.types\r\n\r\nuse (\"acuario2.client.\" + settings.source_type) as SourceTypeImpl from acuario2.types\r\nconst stateTypeName = (SourceTypeImpl as Type).GetProperty(\"state\").PropertyType.Name\r\nuse (\"acuario2.types.\"..stateTypeName) as StateType from acuario2.types\r\nconst stateNames = Enum.GetNames(StateType as Type)\r\nconst validStateMask(mask as string) = from stateNames any it like mask\r\nassert(settings.source_states isnt empty, \"no source state mask specified\")\r\nassert(from settings.source_states all it is validStateMask, \"invalid source state mask\")\r\n\r\nconst source_items = from settings.source_guids select graph[Guid(it)] of type SourceType to array\r\n\r\nconst uri = Uri(settings.url) \r\n\r\nuse new { code = 0, user_code = 0, result = null as Dictionary[] } as CallMethod2Result\r\n\r\n######################################################\r\n\r\nlet iv7 = null as Iv7Server\r\n\r\nlet сall_method2(name as string, json as string) = \r\n    #print(name, json)\r\n    json = iv7.CallMethod2(name, json, \"\")\r\n    print json\r\n    let res = CallMethod2Result(json)\r\n    if (res.code is 0) and (res.user_code is 0) then res.result\r\nend\r\n\r\nlet start_export_media { id = \"\", @from = \"\", @to = \"\", path = \"\" } = \r\n    let result = сall_method2(\"media:export_media\", string(it))\r\n    if result isnt null then (result[0] as Dictionary)[\"unic\"] as string\r\nend\r\n\r\nlet get_param_from_urls(obj as VideoCamera, pattern as string) = \r\n    let regex = Regex(pattern)\r\n    from obj.url select regex.Match(it) where Success select Groups[1].Value first\r\nend\r\n\r\nlet get_key2(obj as VideoCamera) = get_param_from_urls(obj, \"key2=(.+)[&|;]?\")\r\n\r\nlet export_media(camera as VideoCamera, duration as TimeSpan, path as string) = \r\n    let datetime_format = \"yyyy.MM.dd HH:mm:ss\"\r\n    let half_duration   = TimeSpan(duration.Ticks / 2)\r\n    let since           = (DateTime.Now - half_duration).ToString(datetime_format)\r\n    let until           = (DateTime.Now + half_duration).ToString(datetime_format)\r\n    let id              = get_key2(camera)\r\n    print(\"exporting video delayed for\", duration)\r\n    await Task.Delay(duration)\r\n    let unic            = start_export_media { id = id, @from = since, @to = until, path = path }\r\n    print(\"exporting video started\", unic, camera)\r\nend\r\n\r\n######################################################\r\n\r\nlet allowed_state(state as string) = (settings.source_states isnt empty) and (from settings.source_states any state like it)\r\n\r\nlet allowed_source_item(item as SourceType) = (source_items is empty) or (item in source_items)\r\n\r\nif (\"state\" in changes) and (@object[\"state\"].Text is allowed_state) then\r\n    let item = @object as SourceType\r\n    if (item isnt null) and (item is allowed_source_item) then\r\n        iv7         = Iv7Server() \r\n        iv7.Url     = string(uri)    \r\n        let targets = VideoCamera[](0)\r\n        if settings.logic_link then targets = from item.GetItemsLinkedBy(LogicLink) of type VideoCamera \r\n                                              union targets to array\r\n        if settings.same_space then targets = from item.GetItemsLinkedBy(Position) of type Space \r\n                                              select many GetItemsLinkedBy(Position) of type VideoCamera \r\n                                              union targets to array\r\n        from targets do async export_media(it, TimeSpan(settings.media_duration), string(settings.media_path)) now\r\n    end\r\nend\r\n\r\n","datetime":1524738855,"status":null,"version":0},"type":{"value":"EgsObjectUpdated","datetime":1524738426,"status":null,"version":0},"settings":{"value":"{\"source_guids\":[\"0bb6b01a-5e5c-4cb6-a42b-23dcb3865786\"],\"source_states\":[\"alarm_*\",\"error_*\"],\"logic_link\":true,\"same_space\":true,\"media_path\":\"f:\\\\video\",\"media_duration\":\"00:00:10\",\"url\":\"http://localhost:1986/axis2/services/Iv7Server\",\"max_zoom_distance\":1500.0,\"max_zoom_limit_factor\":1.0,\"source_type\":\"LowCurrentSensor\"}","datetime":1524738829,"status":null,"version":0},"result":{"value":"","datetime":1524738400,"status":null,"version":0},"enabled":{"value":null,"datetime":1524738400,"status":null,"version":0},"state":{"value":"ok.normal","datetime":1524738855,"status":null,"version":0},"hash":{"value":"AGbV0fpndBBwvjyTrBfmRw==","datetime":1524738787,"status":null,"version":0},"name":{"value":"Responsive media exporter 2","datetime":1524738400,"status":null,"version":0},"error_text":{"value":null,"datetime":1524738855,"status":null,"version":0}},"entity":"item","operation":"create"}]