Guest User

Untitled

a guest
Oct 19th, 2017
378
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 26.51 KB | None | 0 0
  1. Index: aymaster/aypy/aygst/ayonvifevent.py
  2. ===================================================================
  3. --- aymaster/aypy/aygst/ayonvifevent.py (revision 29011)
  4. +++ aymaster/aypy/aygst/ayonvifevent.py (working copy)
  5. @@ -1,11 +1,14 @@
  6. import gobject
  7. import gst
  8. # import time
  9. -# import binascii
  10. -import utils
  11. from lxml import etree
  12. +import logging
  13. +from aypy import utilsxml
  14. +from aypy import utilsrtp
  15.  
  16. +LOG = logging.getLogger('ay.aypy.aygst.ayonvifevent')
  17.  
  18. +
  19. class AylookFilterOnvifEvent(gst.Element):
  20. __gstdetails__ = ('AylookFilterOnvifEvent', 'Transform',
  21. 'Custom aylook chain element', 'Luca Ognibene')
  22. @@ -40,13 +43,17 @@
  23. self.srcpad.set_setcaps_function(gst.Pad.proxy_setcaps)
  24. self.add_pad(self.srcpad)
  25.  
  26. - self.counter = 0
  27. self.incomplete_message_saver = ""
  28. self.namespaces = {'tt': 'http://www.onvif.org/ver10/schema', 'wsnt': "http://docs.oasis-open.org/wsn/b-2"}
  29. self.__last_md_sent = None
  30. + self.last_sent_event = None
  31. + self.last_sent_event_status = None
  32. + self.last_sent_vendor_event = None
  33. + self.last_sent_vendor_event_status = None
  34.  
  35. def chainfunc(self, pad, buffer):
  36. message_list = []
  37. + # LOG.info(":".join("{:02x}".format(ord(c)) for c in buffer[:12])
  38. # Add to the buffer the rest from the previous iteration
  39. if len(self.incomplete_message_saver) > 0:
  40. buffer_str = self.incomplete_message_saver + buffer[0:]
  41. @@ -54,42 +61,116 @@
  42. buffer_str = buffer[:]
  43. # clean the buffer for incomplete message
  44. self.incomplete_message_saver = ""
  45. - # I make the buffer binary to find and delete the RTP headers
  46. - binary_buffer = utils.gst_buffer_to_binary_buffer(buffer_str)
  47. - # Those patterns help me to identify the header (the fixed begin for rtp header in my case)
  48. - patterns = ["1000000011101011", "1000000001101011"]
  49. - # the lenght of the header
  50. - header_len = 96
  51. - # I remove the header
  52. - binary_buffer = utils.remove_protocol_header_from_message(patterns, header_len, binary_buffer)
  53. - # I revert the binary message without header in ascii
  54. - message = utils.binary_buffer_to_ascii_string(binary_buffer)
  55. - # I extract a list of messages from the received data
  56. - message_list = utils.extract_tag_to_list(message, "<tt:MetadataStream ", "</tt:MetadataStream>")
  57. - if message_list == -1:
  58. - message_list = []
  59. - message = ""
  60. - print "ERROR XML"
  61. - # I need to generate an signal for each camera event
  62. - for event in message_list:
  63. - message = message[len(event):]
  64. - tree = etree.ElementTree(etree.fromstring(event))
  65. - # I get the dictionary from the event
  66. - event_dictionary = utils.event_to_dictionary(tree, self.namespaces, ['ALL'])
  67. - # I emit the signal to multisearchbin, it forward it to jobs_aaa where aylook event is generated
  68. - if len(event_dictionary) > 0:
  69. - print "EMIT"
  70. - print event_dictionary['Type_Of_Event']
  71. - self.emit('onvif-event', event_dictionary)
  72. - # I remove the event from the messages buffer it will contain only the last incomplete message
  73. - # if it is present
  74. - else:
  75. - print "NOT EMIT"
  76. - print "Incomplete MESSAGE"
  77. - self.incomplete_message_saver = message
  78. - print message
  79. + # remove the headers rtp from the message
  80. + patterns = ['80eb'.decode("hex"), 'a0eb'.decode("hex"), '806b'.decode("hex")]
  81. + header_len = 12
  82. + full_message = utilsrtp.remove_protocol_header_from_message(patterns, header_len, buffer_str)
  83. + # MetadataStream is the limit message for BOSH MetaDataStream for HIKvison so i made the search
  84. + # Not case sensitive
  85. + message_list = utilsxml.extract_tag_to_list(full_message, "<tt:MetadataStream ", "</tt:MetadataStream>", False)
  86. + # I need to generate an signal for each camera event I have a list of message, every message can have
  87. + # more then one event(NotificationMessage) under the tag Event
  88. + for message in message_list:
  89. + # video_analitic_list = []
  90. + event_list = []
  91. + # I clean the old full_message from the sub_messages I found to keep eventually the last incomplete message
  92. + full_message = full_message[full_message.find(message):]
  93. + full_message = full_message[len(message):]
  94. + # find namespaces from message
  95. + namespaces = utilsxml.find_xml_namespaces(message)
  96. + # remove namespace placemarker from message
  97. + message = utilsxml.remove_message_xml_namespaces(message, namespaces)
  98. + # divide the message in analytic and Event (I'm going to use only the notification message inside the event)
  99. + # video_analitic_list = utilsxml.extract_tag_to_list(message, "<VideoAnalytics>", "</VideoAnalytics>",False)
  100. + event_list = utilsxml.extract_tag_to_list(message, "<NotificationMessage>", "</NotificationMessage>", False)
  101. + for event in event_list:
  102. + try:
  103. + tree = etree.ElementTree(etree.fromstring(event))
  104. + except:
  105. + LOG.info("XML_error")
  106. + LOG.info(event)
  107. + break
  108. + # I get the dictionary from the event
  109. + event_dictionary = self.event_to_dictionary(tree, ['ALL'])
  110. + # I emit the signal to multisearchbin, it forward it to jobs_aaa where aylook event is generated
  111. + if len(event_dictionary) > 0:
  112. + event_type = []
  113. + # ===========================================================
  114. + # I do not think I have to reset the status of the last event when I go out form the loop
  115. + # because the events have always a start(true) and stop(false) so that even if the type
  116. + # of the event is the same the status jump from true,false[event1] true,false[event2]
  117. + # but the motion event is sent in two different way (vendor specific dictionary and old way for compatibility)
  118. + # so that the type of event change every time and I have multiple emit for the same event
  119. + # so at this point I need to divide logic for vendor events
  120. + # ===========================================================
  121. + event_type = [x.strip() for x in event_dictionary["Type_Of_Event"].split("/")]
  122. + # OLD camera support event
  123. + if event_type[0] == "VideoSource":
  124. + if self.last_sent_event != event_dictionary["Type_Of_Event"]:
  125. + if self.last_sent_event_status != event_dictionary["SimpleItem_Value"][1]:
  126. + LOG.info("emit")
  127. + LOG.info(event_dictionary)
  128. + LOG.info(event_dictionary["Type_Of_Event"])
  129. + LOG.info(event_dictionary["SimpleItem_Value"][1])
  130. + self.emit('onvif-event', event_dictionary)
  131. + self.last_sent_event_status = event_dictionary["SimpleItem_Value"][1]
  132. + self.last_sent_event != event_dictionary["Type_Of_Event"]
  133. + # BOSH Dictionary
  134. + elif event_type[0] == "IVA":
  135. + if self.last_sent_vendor_event != event_dictionary["Type_Of_Event"]:
  136. + if self.last_sent_vendor_event_status != event_dictionary["SimpleItem_Value"][1]:
  137. + LOG.info("emit")
  138. + LOG.info(event_dictionary)
  139. + LOG.info(event_dictionary["Type_Of_Event"])
  140. + LOG.info(event_dictionary["SimpleItem_Value"][1])
  141. + self.emit('onvif-event', event_dictionary)
  142. + self.last_sent_vendor_event_status = event_dictionary["SimpleItem_Value"][1]
  143. + self.last_sent_vendor_event != event_dictionary["Type_Of_Event"]
  144. + # Hikvision Dictionary
  145. + elif event_type[0] == "RuleEngine":
  146. + if self.last_sent_vendor_event != event_dictionary["Type_Of_Event"]:
  147. + if self.last_sent_vendor_event_status != event_dictionary["SimpleItem_Value"][3]['Value']:
  148. + LOG.info("emit")
  149. + LOG.info(event_dictionary)
  150. + LOG.info(event_dictionary["Type_Of_Event"])
  151. + LOG.info(event_dictionary["SimpleItem_Value"][3]['Value'])
  152. + self.emit('onvif-event', event_dictionary)
  153. + self.last_sent_vendor_event_status = event_dictionary["SimpleItem_Value"][3]['Value']
  154. + self.last_sent_vendor_event != event_dictionary["Type_Of_Event"]
  155. +
  156. + else:
  157. + # I should never be in this situation
  158. + LOG.info("NOT EMIT")
  159. + # The message to attach to the beginning of the next buffer
  160. + self.incomplete_message_saver = full_message
  161. return self.srcpad.push(buffer)
  162.  
  163. + def event_to_dictionary(self, tree, tag_list):
  164. + dictionary = {'Type_Of_Event': ''}
  165. + for elem in tree.iter():
  166. + if 'Dialect' in elem.attrib:
  167. + dictionary['Type_Of_Event'] = elem.text
  168. + # I try to reduce the deep of the dictionary, so a use the pattern TagName_TagAttribute as key
  169. + for key in elem.attrib:
  170. + value = elem.attrib[key]
  171. + key = '_' + key
  172. + key = elem.tag + key
  173. + if key in dictionary.keys():
  174. + # If the key is already present and I have already generated a list I append the attrib
  175. + if isinstance(dictionary[key], (list, tuple)):
  176. + dictionary[key].append(elem.attrib)
  177. + else:
  178. + temp_dict = dictionary[key]
  179. + dictionary[key] = [temp_dict]
  180. + dictionary[key].append(value)
  181. + else:
  182. + # I add a new key only if it is in the list, the list contains "ALL"
  183. + # in any case the key should not be already in the dictionary
  184. + # tag_list = ["ALL"]
  185. + if (key in tag_list) or ("ALL" in tag_list):
  186. + dictionary[key] = value
  187. + return dictionary
  188.  
  189. +
  190. gobject.type_register(AylookFilterOnvifEvent)
  191. gst.element_register(AylookFilterOnvifEvent, "ayonvifevent", gst.RANK_MARGINAL)
  192. Index: aymaster/aypy/aygst/multisrcbin.py
  193. ===================================================================
  194. --- aymaster/aypy/aygst/multisrcbin.py (revision 29011)
  195. +++ aymaster/aypy/aygst/multisrcbin.py (working copy)
  196. @@ -417,7 +417,7 @@
  197. # HACK: pass if i want only a frame or everything in last ts digit
  198. self.find_ts = aypy.utilstime.ts_gst_to_ay(aypy.utilstime.ts_ay_to_gst(self.find_ts))
  199. if self.cacheblocks == 'false':
  200. - self.find_ts = self.ind_ts[:-1] + '1'
  201. + self.find_ts = self.find_ts[:-1] + '1'
  202. else:
  203. self.find_ts = self.find_ts[:-1] + '0'
  204. self.find_autoseek = aypy.utils.get_string_from_caps(self._caps, 'autoseek', 'no')
  205. @@ -453,8 +453,6 @@
  206. self._lock_add.acquire()
  207. try:
  208. media = pad.get_caps()[0]['media']
  209. - print "MEDIA"
  210. - print media
  211. except:
  212. media = 'video'
  213. try:
  214. @@ -467,22 +465,22 @@
  215. LOG.info("IGNORE PAD: %s", str(pad))
  216. if media == 'application':
  217. #create element
  218. - el = gst.element_factory_make('ayonvifevent','ayonvifevent')
  219. - # set it to play status
  220. + el = gst.parse_bin_from_description("ayonvifevent name=ayonvifevent ! fakesink",True)
  221. el.set_state(gst.STATE_PLAYING)
  222. # add element to pipeline before link it
  223. self._srcel.add(el)
  224. - #pad.link(el.get_pad('ayonvifevent'))
  225. + # connect bin to preceding sink
  226. pad.link(el.get_pad('sink'))
  227. - pad = el.get_pad('src')
  228. + # get the element ayonvifevent inside the bin
  229. + el = el.get_by_name('ayonvifevent')
  230. el.connect("onvif-event",self.__onvif_event)
  231. -
  232. - el = gst.element_factory_make('fakesink')
  233. - el.set_state(gst.STATE_PLAYING)
  234. - self._srcel.add(el)
  235. - pad.link(el.get_pad('sink'))
  236. - self._lock_add.release()
  237. - self._rtsp_force_stream_number -= 1
  238. + else:
  239. + el = gst.element_factory_make('fakesink')
  240. + el.set_state(gst.STATE_PLAYING)
  241. + self._srcel.add(el)
  242. + pad.link(el.get_pad('sink'))
  243. + self._lock_add.release()
  244. + self._rtsp_force_stream_number -= 1
  245. return
  246.  
  247. self._src_pad_num += 1
  248. Index: aymaster/aypy/ayjobs/jobs_aaa.py
  249. ===================================================================
  250. --- aymaster/aypy/ayjobs/jobs_aaa.py (revision 29015)
  251. +++ aymaster/aypy/ayjobs/jobs_aaa.py (working copy)
  252. @@ -1085,41 +1085,33 @@
  253. # ONVIF
  254. ######################################################
  255. def __onvif_event(self, el, param):
  256. - self.log.info("__onvif_event RECEIVED")
  257. - self.log.info(param)
  258. - self.log.info("END__onvif_event RECEIVED")
  259. - try:
  260. - if param["Type_Of_Event"] == "tns1:VideoSource/MotionAlarm":
  261. + if param["Type_Of_Event"] == "VideoSource/MotionAlarm" and param["SimpleItem_Value"][1] == "true":
  262. + self.log.info(param)
  263. + self.log.info(param["SimpleItem_Value"][1])
  264. self.emit_event_action('AC-MOTION', {'camera': self.cid,
  265. 'id': self.oid,
  266. 'camera_id': self.cid,
  267. 'startts': ts_from_ay_to_db(ts_ay_now()),
  268. 'camera_name': self.params["name"].value})
  269. + if param["Type_Of_Event"].startswith("IVA"):
  270. + self.log.info("IVA_EVENT")
  271. + self.log.info(param)
  272. + event_data = [x.strip() for x in param["Type_Of_Event"].split("/")]
  273. + event = {'camera': self.cid,
  274. + 'id': self.oid,
  275. + 'camera_id': self.cid,
  276. + 'startts': ts_from_ay_to_db(ts_ay_now()),
  277. + 'camera_name': self.params["name"].value,
  278. + 'IVA_type': event_data[1],
  279. + 'IVA_Name': event_data[2]}
  280. +
  281. + if param['SimpleItem_Value'][1] == 'true':
  282. + self.emit_event_action("VIDEO-ANALYSIS-START", event)
  283. + self.log.info("ANALYSIS-Start")
  284. else:
  285. - self.log.info("No Motion")
  286. - except:
  287. - self.log.info("problem sending event")
  288. - self.log.info(param)
  289. - if 'Type_Of_Event' in param.keys():
  290. - if param["Type_Of_Event"].startswith("tns1:IVA"):
  291. - self.log.info("IVAVAVAVAVAVAV")
  292. - event_data = [x.strip() for x in param["Type_Of_Event"].split("/")]
  293. - self.log.info(event_data)
  294. - event = {'camera': self.cid,
  295. - 'id': self.oid,
  296. - 'camera_id': self.cid,
  297. - 'startts': ts_from_ay_to_db(ts_ay_now()),
  298. - 'camera_name': self.params["name"].value,
  299. - 'IVA_type': event_data[1],
  300. - 'IVA_Name': event_data[2]}
  301. + self.emit_event_action("VIDEO-ANALYSIS-STOP", event)
  302. + self.log.info("ANALYSIS-Stop")
  303.  
  304. - if param['SimpleItem_Name'][3]['Value'] == 'true':
  305. - self.emit_event_action("VIDEO-ANALYSIS-START", event)
  306. - self.log.info("IVAStart")
  307. - else:
  308. - self.emit_event_action("VIDEO-ANALYSIS-STOP", event)
  309. - self.log.info("IVAStop")
  310. -
  311. ######################################################
  312. # IMAVIS
  313. ######################################################
  314. Index: aymaster/aypy/lua/modules/ayobjevents.lua
  315. ===================================================================
  316. --- aymaster/aypy/lua/modules/ayobjevents.lua (revision 29015)
  317. +++ aymaster/aypy/lua/modules/ayobjevents.lua (working copy)
  318. @@ -177,6 +177,8 @@
  319. context_image={persist=false, default="", apidesc="Event thumbnail in msgpack format (list of hashes)", apiformat="image"},
  320. api_event_MOTION={name='MOTION', apidesc="Motion detected on a camera. Properties are: event_time(db format), camera_id(db camera id), aylook_id(db aylook id)", apiparams="id,camera_id", apidefaultdesc=_("Movimento su [E(camera_name)] su [E(aylook.name)]."), apiuserdesc=_("Rilevato movimento"), apigroup="camera"},
  321. api_event_ACMOTION={name='AC-MOTION', apidesc="Internal event.", apiparams="id,camera_id", apidefaultdesc=_("Movimento su [E(camera_name)] su [E(aylook.name)].")},
  322. + api_event_VIDEOANALYSISSTART={name='VIDEO-ANALYSIS-START', apidesc="Onvif event sent from the camera as metadata stream.", apiparams="id,camera_id", apidefaultdesc=_("Event from [E(camera_name)] on [E(aylook.name)]. Start [E(IVA_name)] Video Analysis."), apiuserdesc=_("Analysis Event"), apigroup="camera"},
  323. + api_event_VIDEOANALYSISSTOP={name='VIDEO-ANALYSIS-STOP', apidesc="Onvif event sent from the camera as metadata stream.", apiparams="id,camera_id", apidefaultdesc=_("Event from [E(camera_name)] on [E(aylook.name)]. End [E(IVA_name)] Video Analysis."), apiuserdesc=_("Analysis Event"), apigroup="camera"},
  324. api_event_AC={name='ACCESS_CONTROL', apidesc="Tag/Plate/User recognized by the system. Parameters are ac_user_name(person name or Unknown) ac_user_id(person id or -1) ac_user_properties (string with concatenation of all person properties separated by comma. The property __unknown__ is present if the person is not present in the database, __all__ is present otherwise) ac_type(can be rfid or plate) ac_rfid_tag(rfid tag) ac_plate(plate) ac_dev(camera or rfid device id that made the recognition), ac_dev_name (camera or rfid device name that made the recognition), image(base64 encoded jpeg with still frame), context_image(base64 encoded jpeg with the context image)", apiparams="id,ac_user_name,ac_user_id,ac_user_properties,ac_type,ac_rfid_tag,ac_plate,ac_plate_country,ac_dev,ac_dev_name,ac_direction,ac_transit,ac_min_x,ac_min_y,ac_max_x,ac_max_y,ac_ocr_score,ac_sn,context_image,image", apiuserdesc=_("Controllo accessi"), apigroup="access", apidefaultdesc=_("Rilevato utente [AC_USER_NAME] - [AC_GOT_FROM] dalla periferica [E(ac_dev_name)].")},
  325. api_event_DISCONNECT={name='DISCONNECT', apidesc="Camera disconnected. Parameters are camera_id and camera_name", apiparams="id,camera_id", apidefaultdesc=_("Telecamera [E(camera_name)] su [E(aylook.name)] non raggiungibile."), apiuserdesc=_("Sconnessione telecamera"), apigroup="camera"},
  326. api_event_RECONNECT={name='RECONNECT', apidesc="Camera reconnected. Parameters are camera_id and camera_name", apiparams="id,camera_id", apidefaultdesc=_("Telecamera [E(camera_name)] su [E(aylook.name)] nuovamente visibile."), apiuserdesc=_("Riconnessione telecamera"), apigroup="camera"},
  327. Index: aymaster/aypy/utilsrtp.py
  328. ===================================================================
  329. --- aymaster/aypy/utilsrtp.py (nonexistent)
  330. +++ aymaster/aypy/utilsrtp.py (working copy)
  331. @@ -0,0 +1,25 @@
  332. +import binascii
  333. +
  334. +
  335. +def remove_protocol_header_from_message(patterns, header_len, message):
  336. + index = 0
  337. + while index != -1:
  338. + for pattern in patterns:
  339. + index = message.find(pattern)
  340. + if index != -1:
  341. + message = message[0:index] + message[index+header_len:]
  342. +
  343. + return message
  344. +
  345. +
  346. +def binary_buffer_to_ascii_string(binary_buffer):
  347. + # I add 0b the string that stands for binary
  348. + n = int("0b" + binary_buffer, 2)
  349. + return binascii.unhexlify('%x' % n)
  350. +
  351. +
  352. +def gst_buffer_to_binary_buffer(buffer):
  353. + binary_buffer = bin(int(binascii.hexlify(buffer), 16))
  354. + # remove "0b" before data
  355. + binary_buffer = binary_buffer[2:]
  356. + return binary_buffer
  357. Index: aymaster/aypy/utilsxml.py
  358. ===================================================================
  359. --- aymaster/aypy/utilsxml.py (nonexistent)
  360. +++ aymaster/aypy/utilsxml.py (working copy)
  361. @@ -0,0 +1,59 @@
  362. +from lxml import etree
  363. +import re
  364. +
  365. +
  366. +def strip_ns_prefix(tree):
  367. + # iterate through only element nodes (skip comment node, text node, etc) :
  368. + for element in tree.xpath('descendant-or-self::*'):
  369. + # if element has prefix...
  370. + if element.prefix:
  371. + # replace element name with its local name
  372. + element.tag = etree.QName(element).localname
  373. + return tree
  374. +
  375. +
  376. +def full_strip_ns_prefix(tree):
  377. + # xpath query for selecting all element nodes in namespace
  378. + query = "descendant-or-self::*[namespace-uri()!='']"
  379. + # for each element returned by the above xpath query...
  380. + for element in tree.xpath(query):
  381. + # replace element name with its local name
  382. + element.tag = etree.QName(element).localname
  383. + return tree
  384. +
  385. +
  386. +def extract_tag_to_list(xml_string, tag, end_tag, case_sensitive=False):
  387. + # extract part of xml from tag to end_tag
  388. + tag_list = []
  389. + # in case I do the search not case sensitive I return the messages list always case sensitive
  390. + case_sensitive_xml_string = xml_string
  391. + if not case_sensitive:
  392. + tag = tag.lower()
  393. + end_tag = end_tag.lower()
  394. + xml_string = xml_string.lower()
  395. + while len(xml_string) > 0:
  396. + start = xml_string.find(tag)
  397. + end = xml_string.find(end_tag)
  398. + if end > -1 and start > -1:
  399. + tag_list.append(case_sensitive_xml_string[start:end + len(end_tag)])
  400. + xml_string = xml_string[end + len(end_tag):]
  401. + case_sensitive_xml_string = case_sensitive_xml_string[end + len(end_tag):]
  402. + else:
  403. + return tag_list
  404. + return tag_list
  405. +
  406. +
  407. +def remove_message_xml_namespaces(message, namespaces):
  408. + for namespace in namespaces:
  409. + namespace = namespace + ':'
  410. + start = 0
  411. + while start > -1:
  412. + start = message.find(namespace)
  413. + if start > -1:
  414. + message = message[:start] + message[start+len(namespace):]
  415. + return message
  416. +
  417. +
  418. +def find_xml_namespaces(message):
  419. + m = re.findall('xmlns:([a-z]*[0-1]?)=', message)
  420. + return m
  421. Index: locale/en_US.UTF-8/LC_MESSAGES/en.po
  422. ===================================================================
  423. --- locale/en_US.UTF-8/LC_MESSAGES/en.po (revision 28978)
  424. +++ locale/en_US.UTF-8/LC_MESSAGES/en.po (working copy)
  425. @@ -8,7 +8,7 @@
  426. msgstr ""
  427. "Project-Id-Version: PACKAGE VERSION\n"
  428. "Report-Msgid-Bugs-To: \n"
  429. -"POT-Creation-Date: 2017-10-05 17:19+0200\n"
  430. +"POT-Creation-Date: 2017-10-19 15:56+0200\n"
  431. "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
  432. "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
  433. "Language-Team: LANGUAGE <LL@li.org>\n"
  434. @@ -5346,3 +5346,20 @@
  435.  
  436. msgid "Ronda pronta"
  437. msgstr "Virtual patrol ready"
  438. +
  439. +msgid ""
  440. +"Event from [E(camera_name)] on [E(aylook.name)]. Start [E(IVA_name)] Video "
  441. +"Analysis."
  442. +msgstr ""
  443. +"Event from [E(camera_name)] on [E(aylook.name)]. Start [E(IVA_name)] Video "
  444. +"Analysis."
  445. +
  446. +msgid "Analysis Event"
  447. +msgstr "Analysis Event"
  448. +
  449. +msgid ""
  450. +"Event from [E(camera_name)] on [E(aylook.name)]. End [E(IVA_name)] Video "
  451. +"Analysis."
  452. +msgstr ""
  453. +"Event from [E(camera_name)] on [E(aylook.name)]. Start [E(IVA_name)] Video "
  454. +"Analysis."
  455. Index: locale/it_IT.UTF-8/LC_MESSAGES/it.po
  456. ===================================================================
  457. --- locale/it_IT.UTF-8/LC_MESSAGES/it.po (revision 28978)
  458. +++ locale/it_IT.UTF-8/LC_MESSAGES/it.po (working copy)
  459. @@ -8,7 +8,7 @@
  460. msgstr ""
  461. "Project-Id-Version: PACKAGE VERSION\n"
  462. "Report-Msgid-Bugs-To: \n"
  463. -"POT-Creation-Date: 2017-10-05 17:19+0200\n"
  464. +"POT-Creation-Date: 2017-10-19 15:56+0200\n"
  465. "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
  466. "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
  467. "Language-Team: LANGUAGE <LL@li.org>\n"
  468. @@ -5403,3 +5403,20 @@
  469.  
  470. msgid "Ronda pronta"
  471. msgstr "Ronda pronta"
  472. +
  473. +msgid ""
  474. +"Event from [E(camera_name)] on [E(aylook.name)]. Start [E(IVA_name)] Video "
  475. +"Analysis."
  476. +msgstr ""
  477. +"Evento da [E(camera_name)] su [E(aylook.name)]. Inizio [E(IVA_name)] Video "
  478. +"Analisi."
  479. +
  480. +msgid "Analysis Event"
  481. +msgstr "Evento di video analisi"
  482. +
  483. +msgid ""
  484. +"Event from [E(camera_name)] on [E(aylook.name)]. End [E(IVA_name)] Video "
  485. +"Analysis."
  486. +msgstr ""
  487. +"Evento da [E(camera_name)] su [E(aylook.name)]. Fine [E(IVA_name)] Video "
  488. +"Analisi."
  489. Index: locale/sv_SE.UTF-8/LC_MESSAGES/sv.po
  490. ===================================================================
  491. --- locale/sv_SE.UTF-8/LC_MESSAGES/sv.po (revision 28978)
  492. +++ locale/sv_SE.UTF-8/LC_MESSAGES/sv.po (working copy)
  493. @@ -8,7 +8,7 @@
  494. msgstr ""
  495. "Project-Id-Version: PACKAGE VERSION\n"
  496. "Report-Msgid-Bugs-To: \n"
  497. -"POT-Creation-Date: 2017-10-05 17:19+0200\n"
  498. +"POT-Creation-Date: 2017-10-19 15:56+0200\n"
  499. "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
  500. "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
  501. "Language-Team: LANGUAGE <LL@li.org>\n"
  502. @@ -5608,3 +5608,26 @@
  503.  
  504. msgid "Ronda printa"
  505. msgstr ""
  506. +
  507. +msgid ""
  508. +"Event from [E(camera_name)] on [E(aylook.name)]. Event type [E(IVA_type)] "
  509. +"name [E(IVA_type)]."
  510. +msgstr ""
  511. +
  512. +msgid ""
  513. +"End event from [E(camera_name)] on [E(aylook.name)]. Event type "
  514. +"[E(IVA_type)] name [E(IVA_type)]."
  515. +msgstr ""
  516. +
  517. +msgid ""
  518. +"Event from [E(camera_name)] on [E(aylook.name)]. Start [E(IVA_name)] Video "
  519. +"Analysis."
  520. +msgstr ""
  521. +
  522. +msgid "Analysis Event"
  523. +msgstr ""
  524. +
  525. +msgid ""
  526. +"Event from [E(camera_name)] on [E(aylook.name)]. End [E(IVA_name)] Video "
  527. +"Analysis."
  528. +msgstr ""
Add Comment
Please, Sign In to add comment