Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Index: aymaster/aypy/aygst/ayonvifevent.py
- ===================================================================
- --- aymaster/aypy/aygst/ayonvifevent.py (revision 29011)
- +++ aymaster/aypy/aygst/ayonvifevent.py (working copy)
- @@ -1,11 +1,14 @@
- import gobject
- import gst
- # import time
- -# import binascii
- -import utils
- from lxml import etree
- +import logging
- +from aypy import utilsxml
- +from aypy import utilsrtp
- +LOG = logging.getLogger('ay.aypy.aygst.ayonvifevent')
- +
- class AylookFilterOnvifEvent(gst.Element):
- __gstdetails__ = ('AylookFilterOnvifEvent', 'Transform',
- 'Custom aylook chain element', 'Luca Ognibene')
- @@ -40,13 +43,17 @@
- self.srcpad.set_setcaps_function(gst.Pad.proxy_setcaps)
- self.add_pad(self.srcpad)
- - self.counter = 0
- self.incomplete_message_saver = ""
- self.namespaces = {'tt': 'http://www.onvif.org/ver10/schema', 'wsnt': "http://docs.oasis-open.org/wsn/b-2"}
- self.__last_md_sent = None
- + self.last_sent_event = None
- + self.last_sent_event_status = None
- + self.last_sent_vendor_event = None
- + self.last_sent_vendor_event_status = None
- def chainfunc(self, pad, buffer):
- message_list = []
- + # LOG.info(":".join("{:02x}".format(ord(c)) for c in buffer[:12])
- # Add to the buffer the rest from the previous iteration
- if len(self.incomplete_message_saver) > 0:
- buffer_str = self.incomplete_message_saver + buffer[0:]
- @@ -54,42 +61,116 @@
- buffer_str = buffer[:]
- # clean the buffer for incomplete message
- self.incomplete_message_saver = ""
- - # I make the buffer binary to find and delete the RTP headers
- - binary_buffer = utils.gst_buffer_to_binary_buffer(buffer_str)
- - # Those patterns help me to identify the header (the fixed begin for rtp header in my case)
- - patterns = ["1000000011101011", "1000000001101011"]
- - # the lenght of the header
- - header_len = 96
- - # I remove the header
- - binary_buffer = utils.remove_protocol_header_from_message(patterns, header_len, binary_buffer)
- - # I revert the binary message without header in ascii
- - message = utils.binary_buffer_to_ascii_string(binary_buffer)
- - # I extract a list of messages from the received data
- - message_list = utils.extract_tag_to_list(message, "<tt:MetadataStream ", "</tt:MetadataStream>")
- - if message_list == -1:
- - message_list = []
- - message = ""
- - print "ERROR XML"
- - # I need to generate an signal for each camera event
- - for event in message_list:
- - message = message[len(event):]
- - tree = etree.ElementTree(etree.fromstring(event))
- - # I get the dictionary from the event
- - event_dictionary = utils.event_to_dictionary(tree, self.namespaces, ['ALL'])
- - # I emit the signal to multisearchbin, it forward it to jobs_aaa where aylook event is generated
- - if len(event_dictionary) > 0:
- - print "EMIT"
- - print event_dictionary['Type_Of_Event']
- - self.emit('onvif-event', event_dictionary)
- - # I remove the event from the messages buffer it will contain only the last incomplete message
- - # if it is present
- - else:
- - print "NOT EMIT"
- - print "Incomplete MESSAGE"
- - self.incomplete_message_saver = message
- - print message
- + # remove the headers rtp from the message
- + patterns = ['80eb'.decode("hex"), 'a0eb'.decode("hex"), '806b'.decode("hex")]
- + header_len = 12
- + full_message = utilsrtp.remove_protocol_header_from_message(patterns, header_len, buffer_str)
- + # MetadataStream is the limit message for BOSH MetaDataStream for HIKvison so i made the search
- + # Not case sensitive
- + message_list = utilsxml.extract_tag_to_list(full_message, "<tt:MetadataStream ", "</tt:MetadataStream>", False)
- + # I need to generate an signal for each camera event I have a list of message, every message can have
- + # more then one event(NotificationMessage) under the tag Event
- + for message in message_list:
- + # video_analitic_list = []
- + event_list = []
- + # I clean the old full_message from the sub_messages I found to keep eventually the last incomplete message
- + full_message = full_message[full_message.find(message):]
- + full_message = full_message[len(message):]
- + # find namespaces from message
- + namespaces = utilsxml.find_xml_namespaces(message)
- + # remove namespace placemarker from message
- + message = utilsxml.remove_message_xml_namespaces(message, namespaces)
- + # divide the message in analytic and Event (I'm going to use only the notification message inside the event)
- + # video_analitic_list = utilsxml.extract_tag_to_list(message, "<VideoAnalytics>", "</VideoAnalytics>",False)
- + event_list = utilsxml.extract_tag_to_list(message, "<NotificationMessage>", "</NotificationMessage>", False)
- + for event in event_list:
- + try:
- + tree = etree.ElementTree(etree.fromstring(event))
- + except:
- + LOG.info("XML_error")
- + LOG.info(event)
- + break
- + # I get the dictionary from the event
- + event_dictionary = self.event_to_dictionary(tree, ['ALL'])
- + # I emit the signal to multisearchbin, it forward it to jobs_aaa where aylook event is generated
- + if len(event_dictionary) > 0:
- + event_type = []
- + # ===========================================================
- + # I do not think I have to reset the status of the last event when I go out form the loop
- + # because the events have always a start(true) and stop(false) so that even if the type
- + # of the event is the same the status jump from true,false[event1] true,false[event2]
- + # but the motion event is sent in two different way (vendor specific dictionary and old way for compatibility)
- + # so that the type of event change every time and I have multiple emit for the same event
- + # so at this point I need to divide logic for vendor events
- + # ===========================================================
- + event_type = [x.strip() for x in event_dictionary["Type_Of_Event"].split("/")]
- + # OLD camera support event
- + if event_type[0] == "VideoSource":
- + if self.last_sent_event != event_dictionary["Type_Of_Event"]:
- + if self.last_sent_event_status != event_dictionary["SimpleItem_Value"][1]:
- + LOG.info("emit")
- + LOG.info(event_dictionary)
- + LOG.info(event_dictionary["Type_Of_Event"])
- + LOG.info(event_dictionary["SimpleItem_Value"][1])
- + self.emit('onvif-event', event_dictionary)
- + self.last_sent_event_status = event_dictionary["SimpleItem_Value"][1]
- + self.last_sent_event != event_dictionary["Type_Of_Event"]
- + # BOSH Dictionary
- + elif event_type[0] == "IVA":
- + if self.last_sent_vendor_event != event_dictionary["Type_Of_Event"]:
- + if self.last_sent_vendor_event_status != event_dictionary["SimpleItem_Value"][1]:
- + LOG.info("emit")
- + LOG.info(event_dictionary)
- + LOG.info(event_dictionary["Type_Of_Event"])
- + LOG.info(event_dictionary["SimpleItem_Value"][1])
- + self.emit('onvif-event', event_dictionary)
- + self.last_sent_vendor_event_status = event_dictionary["SimpleItem_Value"][1]
- + self.last_sent_vendor_event != event_dictionary["Type_Of_Event"]
- + # Hikvision Dictionary
- + elif event_type[0] == "RuleEngine":
- + if self.last_sent_vendor_event != event_dictionary["Type_Of_Event"]:
- + if self.last_sent_vendor_event_status != event_dictionary["SimpleItem_Value"][3]['Value']:
- + LOG.info("emit")
- + LOG.info(event_dictionary)
- + LOG.info(event_dictionary["Type_Of_Event"])
- + LOG.info(event_dictionary["SimpleItem_Value"][3]['Value'])
- + self.emit('onvif-event', event_dictionary)
- + self.last_sent_vendor_event_status = event_dictionary["SimpleItem_Value"][3]['Value']
- + self.last_sent_vendor_event != event_dictionary["Type_Of_Event"]
- +
- + else:
- + # I should never be in this situation
- + LOG.info("NOT EMIT")
- + # The message to attach to the beginning of the next buffer
- + self.incomplete_message_saver = full_message
- return self.srcpad.push(buffer)
- + def event_to_dictionary(self, tree, tag_list):
- + dictionary = {'Type_Of_Event': ''}
- + for elem in tree.iter():
- + if 'Dialect' in elem.attrib:
- + dictionary['Type_Of_Event'] = elem.text
- + # I try to reduce the deep of the dictionary, so a use the pattern TagName_TagAttribute as key
- + for key in elem.attrib:
- + value = elem.attrib[key]
- + key = '_' + key
- + key = elem.tag + key
- + if key in dictionary.keys():
- + # If the key is already present and I have already generated a list I append the attrib
- + if isinstance(dictionary[key], (list, tuple)):
- + dictionary[key].append(elem.attrib)
- + else:
- + temp_dict = dictionary[key]
- + dictionary[key] = [temp_dict]
- + dictionary[key].append(value)
- + else:
- + # I add a new key only if it is in the list, the list contains "ALL"
- + # in any case the key should not be already in the dictionary
- + # tag_list = ["ALL"]
- + if (key in tag_list) or ("ALL" in tag_list):
- + dictionary[key] = value
- + return dictionary
- +
- gobject.type_register(AylookFilterOnvifEvent)
- gst.element_register(AylookFilterOnvifEvent, "ayonvifevent", gst.RANK_MARGINAL)
- Index: aymaster/aypy/aygst/multisrcbin.py
- ===================================================================
- --- aymaster/aypy/aygst/multisrcbin.py (revision 29011)
- +++ aymaster/aypy/aygst/multisrcbin.py (working copy)
- @@ -417,7 +417,7 @@
- # HACK: pass if i want only a frame or everything in last ts digit
- self.find_ts = aypy.utilstime.ts_gst_to_ay(aypy.utilstime.ts_ay_to_gst(self.find_ts))
- if self.cacheblocks == 'false':
- - self.find_ts = self.ind_ts[:-1] + '1'
- + self.find_ts = self.find_ts[:-1] + '1'
- else:
- self.find_ts = self.find_ts[:-1] + '0'
- self.find_autoseek = aypy.utils.get_string_from_caps(self._caps, 'autoseek', 'no')
- @@ -453,8 +453,6 @@
- self._lock_add.acquire()
- try:
- media = pad.get_caps()[0]['media']
- - print "MEDIA"
- - print media
- except:
- media = 'video'
- try:
- @@ -467,22 +465,22 @@
- LOG.info("IGNORE PAD: %s", str(pad))
- if media == 'application':
- #create element
- - el = gst.element_factory_make('ayonvifevent','ayonvifevent')
- - # set it to play status
- + el = gst.parse_bin_from_description("ayonvifevent name=ayonvifevent ! fakesink",True)
- el.set_state(gst.STATE_PLAYING)
- # add element to pipeline before link it
- self._srcel.add(el)
- - #pad.link(el.get_pad('ayonvifevent'))
- + # connect bin to preceding sink
- pad.link(el.get_pad('sink'))
- - pad = el.get_pad('src')
- + # get the element ayonvifevent inside the bin
- + el = el.get_by_name('ayonvifevent')
- el.connect("onvif-event",self.__onvif_event)
- -
- - el = gst.element_factory_make('fakesink')
- - el.set_state(gst.STATE_PLAYING)
- - self._srcel.add(el)
- - pad.link(el.get_pad('sink'))
- - self._lock_add.release()
- - self._rtsp_force_stream_number -= 1
- + else:
- + el = gst.element_factory_make('fakesink')
- + el.set_state(gst.STATE_PLAYING)
- + self._srcel.add(el)
- + pad.link(el.get_pad('sink'))
- + self._lock_add.release()
- + self._rtsp_force_stream_number -= 1
- return
- self._src_pad_num += 1
- Index: aymaster/aypy/ayjobs/jobs_aaa.py
- ===================================================================
- --- aymaster/aypy/ayjobs/jobs_aaa.py (revision 29015)
- +++ aymaster/aypy/ayjobs/jobs_aaa.py (working copy)
- @@ -1085,41 +1085,33 @@
- # ONVIF
- ######################################################
- def __onvif_event(self, el, param):
- - self.log.info("__onvif_event RECEIVED")
- - self.log.info(param)
- - self.log.info("END__onvif_event RECEIVED")
- - try:
- - if param["Type_Of_Event"] == "tns1:VideoSource/MotionAlarm":
- + if param["Type_Of_Event"] == "VideoSource/MotionAlarm" and param["SimpleItem_Value"][1] == "true":
- + self.log.info(param)
- + self.log.info(param["SimpleItem_Value"][1])
- self.emit_event_action('AC-MOTION', {'camera': self.cid,
- 'id': self.oid,
- 'camera_id': self.cid,
- 'startts': ts_from_ay_to_db(ts_ay_now()),
- 'camera_name': self.params["name"].value})
- + if param["Type_Of_Event"].startswith("IVA"):
- + self.log.info("IVA_EVENT")
- + self.log.info(param)
- + event_data = [x.strip() for x in param["Type_Of_Event"].split("/")]
- + event = {'camera': self.cid,
- + 'id': self.oid,
- + 'camera_id': self.cid,
- + 'startts': ts_from_ay_to_db(ts_ay_now()),
- + 'camera_name': self.params["name"].value,
- + 'IVA_type': event_data[1],
- + 'IVA_Name': event_data[2]}
- +
- + if param['SimpleItem_Value'][1] == 'true':
- + self.emit_event_action("VIDEO-ANALYSIS-START", event)
- + self.log.info("ANALYSIS-Start")
- else:
- - self.log.info("No Motion")
- - except:
- - self.log.info("problem sending event")
- - self.log.info(param)
- - if 'Type_Of_Event' in param.keys():
- - if param["Type_Of_Event"].startswith("tns1:IVA"):
- - self.log.info("IVAVAVAVAVAVAV")
- - event_data = [x.strip() for x in param["Type_Of_Event"].split("/")]
- - self.log.info(event_data)
- - event = {'camera': self.cid,
- - 'id': self.oid,
- - 'camera_id': self.cid,
- - 'startts': ts_from_ay_to_db(ts_ay_now()),
- - 'camera_name': self.params["name"].value,
- - 'IVA_type': event_data[1],
- - 'IVA_Name': event_data[2]}
- + self.emit_event_action("VIDEO-ANALYSIS-STOP", event)
- + self.log.info("ANALYSIS-Stop")
- - if param['SimpleItem_Name'][3]['Value'] == 'true':
- - self.emit_event_action("VIDEO-ANALYSIS-START", event)
- - self.log.info("IVAStart")
- - else:
- - self.emit_event_action("VIDEO-ANALYSIS-STOP", event)
- - self.log.info("IVAStop")
- -
- ######################################################
- # IMAVIS
- ######################################################
- Index: aymaster/aypy/lua/modules/ayobjevents.lua
- ===================================================================
- --- aymaster/aypy/lua/modules/ayobjevents.lua (revision 29015)
- +++ aymaster/aypy/lua/modules/ayobjevents.lua (working copy)
- @@ -177,6 +177,8 @@
- context_image={persist=false, default="", apidesc="Event thumbnail in msgpack format (list of hashes)", apiformat="image"},
- 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"},
- api_event_ACMOTION={name='AC-MOTION', apidesc="Internal event.", apiparams="id,camera_id", apidefaultdesc=_("Movimento su [E(camera_name)] su [E(aylook.name)].")},
- + 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"},
- + 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"},
- 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)].")},
- 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"},
- 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"},
- Index: aymaster/aypy/utilsrtp.py
- ===================================================================
- --- aymaster/aypy/utilsrtp.py (nonexistent)
- +++ aymaster/aypy/utilsrtp.py (working copy)
- @@ -0,0 +1,25 @@
- +import binascii
- +
- +
- +def remove_protocol_header_from_message(patterns, header_len, message):
- + index = 0
- + while index != -1:
- + for pattern in patterns:
- + index = message.find(pattern)
- + if index != -1:
- + message = message[0:index] + message[index+header_len:]
- +
- + return message
- +
- +
- +def binary_buffer_to_ascii_string(binary_buffer):
- + # I add 0b the string that stands for binary
- + n = int("0b" + binary_buffer, 2)
- + return binascii.unhexlify('%x' % n)
- +
- +
- +def gst_buffer_to_binary_buffer(buffer):
- + binary_buffer = bin(int(binascii.hexlify(buffer), 16))
- + # remove "0b" before data
- + binary_buffer = binary_buffer[2:]
- + return binary_buffer
- Index: aymaster/aypy/utilsxml.py
- ===================================================================
- --- aymaster/aypy/utilsxml.py (nonexistent)
- +++ aymaster/aypy/utilsxml.py (working copy)
- @@ -0,0 +1,59 @@
- +from lxml import etree
- +import re
- +
- +
- +def strip_ns_prefix(tree):
- + # iterate through only element nodes (skip comment node, text node, etc) :
- + for element in tree.xpath('descendant-or-self::*'):
- + # if element has prefix...
- + if element.prefix:
- + # replace element name with its local name
- + element.tag = etree.QName(element).localname
- + return tree
- +
- +
- +def full_strip_ns_prefix(tree):
- + # xpath query for selecting all element nodes in namespace
- + query = "descendant-or-self::*[namespace-uri()!='']"
- + # for each element returned by the above xpath query...
- + for element in tree.xpath(query):
- + # replace element name with its local name
- + element.tag = etree.QName(element).localname
- + return tree
- +
- +
- +def extract_tag_to_list(xml_string, tag, end_tag, case_sensitive=False):
- + # extract part of xml from tag to end_tag
- + tag_list = []
- + # in case I do the search not case sensitive I return the messages list always case sensitive
- + case_sensitive_xml_string = xml_string
- + if not case_sensitive:
- + tag = tag.lower()
- + end_tag = end_tag.lower()
- + xml_string = xml_string.lower()
- + while len(xml_string) > 0:
- + start = xml_string.find(tag)
- + end = xml_string.find(end_tag)
- + if end > -1 and start > -1:
- + tag_list.append(case_sensitive_xml_string[start:end + len(end_tag)])
- + xml_string = xml_string[end + len(end_tag):]
- + case_sensitive_xml_string = case_sensitive_xml_string[end + len(end_tag):]
- + else:
- + return tag_list
- + return tag_list
- +
- +
- +def remove_message_xml_namespaces(message, namespaces):
- + for namespace in namespaces:
- + namespace = namespace + ':'
- + start = 0
- + while start > -1:
- + start = message.find(namespace)
- + if start > -1:
- + message = message[:start] + message[start+len(namespace):]
- + return message
- +
- +
- +def find_xml_namespaces(message):
- + m = re.findall('xmlns:([a-z]*[0-1]?)=', message)
- + return m
- Index: locale/en_US.UTF-8/LC_MESSAGES/en.po
- ===================================================================
- --- locale/en_US.UTF-8/LC_MESSAGES/en.po (revision 28978)
- +++ locale/en_US.UTF-8/LC_MESSAGES/en.po (working copy)
- @@ -8,7 +8,7 @@
- msgstr ""
- "Project-Id-Version: PACKAGE VERSION\n"
- "Report-Msgid-Bugs-To: \n"
- -"POT-Creation-Date: 2017-10-05 17:19+0200\n"
- +"POT-Creation-Date: 2017-10-19 15:56+0200\n"
- "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
- "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
- "Language-Team: LANGUAGE <LL@li.org>\n"
- @@ -5346,3 +5346,20 @@
- msgid "Ronda pronta"
- msgstr "Virtual patrol ready"
- +
- +msgid ""
- +"Event from [E(camera_name)] on [E(aylook.name)]. Start [E(IVA_name)] Video "
- +"Analysis."
- +msgstr ""
- +"Event from [E(camera_name)] on [E(aylook.name)]. Start [E(IVA_name)] Video "
- +"Analysis."
- +
- +msgid "Analysis Event"
- +msgstr "Analysis Event"
- +
- +msgid ""
- +"Event from [E(camera_name)] on [E(aylook.name)]. End [E(IVA_name)] Video "
- +"Analysis."
- +msgstr ""
- +"Event from [E(camera_name)] on [E(aylook.name)]. Start [E(IVA_name)] Video "
- +"Analysis."
- Index: locale/it_IT.UTF-8/LC_MESSAGES/it.po
- ===================================================================
- --- locale/it_IT.UTF-8/LC_MESSAGES/it.po (revision 28978)
- +++ locale/it_IT.UTF-8/LC_MESSAGES/it.po (working copy)
- @@ -8,7 +8,7 @@
- msgstr ""
- "Project-Id-Version: PACKAGE VERSION\n"
- "Report-Msgid-Bugs-To: \n"
- -"POT-Creation-Date: 2017-10-05 17:19+0200\n"
- +"POT-Creation-Date: 2017-10-19 15:56+0200\n"
- "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
- "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
- "Language-Team: LANGUAGE <LL@li.org>\n"
- @@ -5403,3 +5403,20 @@
- msgid "Ronda pronta"
- msgstr "Ronda pronta"
- +
- +msgid ""
- +"Event from [E(camera_name)] on [E(aylook.name)]. Start [E(IVA_name)] Video "
- +"Analysis."
- +msgstr ""
- +"Evento da [E(camera_name)] su [E(aylook.name)]. Inizio [E(IVA_name)] Video "
- +"Analisi."
- +
- +msgid "Analysis Event"
- +msgstr "Evento di video analisi"
- +
- +msgid ""
- +"Event from [E(camera_name)] on [E(aylook.name)]. End [E(IVA_name)] Video "
- +"Analysis."
- +msgstr ""
- +"Evento da [E(camera_name)] su [E(aylook.name)]. Fine [E(IVA_name)] Video "
- +"Analisi."
- Index: locale/sv_SE.UTF-8/LC_MESSAGES/sv.po
- ===================================================================
- --- locale/sv_SE.UTF-8/LC_MESSAGES/sv.po (revision 28978)
- +++ locale/sv_SE.UTF-8/LC_MESSAGES/sv.po (working copy)
- @@ -8,7 +8,7 @@
- msgstr ""
- "Project-Id-Version: PACKAGE VERSION\n"
- "Report-Msgid-Bugs-To: \n"
- -"POT-Creation-Date: 2017-10-05 17:19+0200\n"
- +"POT-Creation-Date: 2017-10-19 15:56+0200\n"
- "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
- "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
- "Language-Team: LANGUAGE <LL@li.org>\n"
- @@ -5608,3 +5608,26 @@
- msgid "Ronda printa"
- msgstr ""
- +
- +msgid ""
- +"Event from [E(camera_name)] on [E(aylook.name)]. Event type [E(IVA_type)] "
- +"name [E(IVA_type)]."
- +msgstr ""
- +
- +msgid ""
- +"End event from [E(camera_name)] on [E(aylook.name)]. Event type "
- +"[E(IVA_type)] name [E(IVA_type)]."
- +msgstr ""
- +
- +msgid ""
- +"Event from [E(camera_name)] on [E(aylook.name)]. Start [E(IVA_name)] Video "
- +"Analysis."
- +msgstr ""
- +
- +msgid "Analysis Event"
- +msgstr ""
- +
- +msgid ""
- +"Event from [E(camera_name)] on [E(aylook.name)]. End [E(IVA_name)] Video "
- +"Analysis."
- +msgstr ""
Add Comment
Please, Sign In to add comment