<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -7,5 +7,6 @@
 *.iml
 *.iws
 *.egg-info
+*.egg
 dist
 build</diff>
      <filename>.gitignore</filename>
    </modified>
    <modified>
      <diff>@@ -11,7 +11,7 @@ class Activity(object):
 
     &quot;&quot;&quot;
 
-    def __init__(self, at=None, action=None, activity_id=None, url=None, sources=None, places=None, actors=None,
+    def __init__(self, at=None, action=None, activity_id=None, url=None, sources=None, keywords=None, places=None, actors=None,
                  destination_urls=None, tags=None, tos=None, regarding_urls=None, payload=None):
         &quot;&quot;&quot;Initialize the class.
 
@@ -25,6 +25,8 @@ class Activity(object):
         @param url URL of activity
         @type sources List of strings
         @param sources Sources of the activity
+        @type keywords List of Strings
+        @param keywords Keywords about an activity
         @type places List of Places
         @param places Place of the activity
         @type actors List of Actors
@@ -49,6 +51,7 @@ class Activity(object):
         self.activity_id = activity_id
         self.url = url
         self.sources = sources
+        self.keywords = keywords
         self.places = places
         self.actors = actors
         self.destination_urls = destination_urls
@@ -66,7 +69,6 @@ class Activity(object):
         '2008-07-01T05:02:03+00:00'.
 
         &quot;&quot;&quot;
-
         return self.at.strftime(&quot;%Y-%m-%dT%H:%M:%S.000Z&quot;)
 
     def set_at_from_string(self, string):
@@ -78,7 +80,6 @@ class Activity(object):
         Sets 'at' attribute from an ISO8601 formatted string.
 
         &quot;&quot;&quot;
-
         self.at = iso8601.parse_date(string)
 
     def from_xml(self, xml):
@@ -90,7 +91,6 @@ class Activity(object):
         Sets all of the member variables to new values, based on the
         passed in XML. 
         &quot;&quot;&quot;
-
         root_node = fromstring(xml)
         self.from_xml_node(root_node)
 
@@ -103,7 +103,6 @@ class Activity(object):
         Returns a XML representation of this object.
 
         &quot;&quot;&quot;
-
         activity_node = Element(&quot;activity&quot;)
 
         if self.at is not None:
@@ -131,6 +130,12 @@ class Activity(object):
                 source_node = Element(&quot;source&quot;)
                 source_node.text = source
                 activity_node.append(source_node)
+
+        if self.keywords is not None and len(self.keywords) &gt; 0:
+            for keyword in self.keywords:
+                keyword_node = Element(&quot;keyword&quot;)
+                keyword_node.text = keyword
+                activity_node.append(keyword_node)
             
         if self.places is not None and len(self.places) &gt; 0:
             for a_place in self.places:
@@ -214,6 +219,15 @@ class Activity(object):
         else:
             self.sources = None
 
+        keyword_nodes = xml_node.findall(&quot;keyword&quot;)
+        if keyword_nodes is not None:
+            self.keywords = []
+            for keyword_node in keyword_nodes:
+                keyword = keyword_node.text
+                self.keywords.append(keyword)
+        else:
+            self.keywords = None
+
         place_nodes = xml_node.findall(&quot;place&quot;)
         if place_nodes is not None:
             self.places = []
@@ -280,6 +294,7 @@ class Activity(object):
             &quot;, &quot; + str(self.activity_id) + \
             &quot;, &quot; + str(self.url) + \
             &quot;, &quot; + str(self.sources) + \
+            &quot;, &quot; + str(self.keywords) + \
             &quot;, &quot; + str(self.places) + \
             &quot;, &quot; + str(self.actors) + \
             &quot;, &quot; + str(self.destination_urls) + \</diff>
      <filename>gnip/activity.py</filename>
    </modified>
    <modified>
      <diff>@@ -60,25 +60,28 @@ class Payload(object):
         if payload_xml_node is not None:
 
             title_node = payload_xml_node.find(&quot;title&quot;)
-
             if title_node is not None:
                 self.title = title_node.text
             else:
                 self.title = None
 
             body_node = payload_xml_node.find(&quot;body&quot;)
-
             if body_node is not None:
                 self.body = body_node.text
             else:
                 self.body = None
 
             media_url_nodes = payload_xml_node.findall(&quot;mediaURL&quot;)
-
             if media_url_nodes is not None:
                 self.media_urls = []
                 for media_url_node in media_url_nodes:
-                    media_url = xml_objects.URL(value=media_url_node.text, meta_url=media_url_node.get(&quot;metaURL&quot;))
+                    media_url = xml_objects.MediaURL(value=media_url_node.text, 
+                                                     height=media_url_node.get(&quot;height&quot;),
+                                                     width=media_url_node.get(&quot;width&quot;),
+                                                     duration=media_url_node.get(&quot;duration&quot;),
+                                                     type=media_url_node.get(&quot;type&quot;),
+                                                     mimetype=media_url_node.get(&quot;mimeType&quot;)
+                                                     )
                     self.media_urls.append(media_url)
             else:
                 self.media_urls = None
@@ -111,8 +114,16 @@ class Payload(object):
             for media_url in self.media_urls:
                 media_url_node = Element(&quot;mediaURL&quot;)
                 media_url_node.text = media_url.value
-                if media_url.meta_url is not None:
-                    media_url_node.set(&quot;metaURL&quot;, media_url.meta_url)
+                if media_url.height is not None:
+                    media_url_node.set(&quot;height&quot;, media_url.height)
+                if media_url.width is not None:
+                    media_url_node.set(&quot;width&quot;, media_url.width)
+                if media_url.duration is not None:
+                    media_url_node.set(&quot;duration&quot;, media_url.duration)
+                if media_url.type is not None:
+                    media_url_node.set(&quot;type&quot;, media_url.type)
+                if media_url.mimetype is not None:
+                    media_url_node.set(&quot;mimeType&quot;, media_url.mimetype)
                 payload_node.append(media_url_node)
 
         if self.__raw is not None:</diff>
      <filename>gnip/payload.py</filename>
    </modified>
    <modified>
      <diff>@@ -26,6 +26,51 @@ class URL(object):
             ret = 1
         return ret
 
+class MediaURL(object):
+    &quot;&quot;&quot;Gnip Media URL container class.
+
+    value:    string representation of the media URL
+	height:   string the height
+	width:   string the width 
+	duration:   string the duration of the linked media
+	type:   string the Gnip normalized type of the linked media
+	mimeType: string the mimeType of the linked media
+    &quot;&quot;&quot;
+
+    def __init__(self, value=None, height=None, width=None, duration=None, type=None, mimetype=None):
+		self.value = value
+		self.height = height
+		self.width = width
+		self.duration = duration
+		self.type = type
+		self.mimetype = mimetype
+
+    def __str__(self):
+        return &quot;[&quot; + str(self.value) + &quot;, &quot; \
+				   + str(self.height) + &quot;, &quot;\
+				   + str(self.width) + &quot;, &quot;\
+				   + str(self.duration) + &quot;, &quot;\
+				   + str(self.type) + &quot;, &quot;\
+				   + str(self.mimetype) \
+				+ &quot;]&quot;
+
+    def __cmp__(self, other):
+        if isinstance(other, MediaURL):
+            ret = cmp(self.value, other.value)
+            if ret == 0:
+                ret = cmp(self.height, other.height)
+                if ret == 0:
+	                ret = cmp(self.width, other.width)
+	                if ret == 0:
+		                ret = cmp(self.duration, other.duration)
+		                if ret == 0:
+			                ret = cmp(self.type, other.type)
+			                if ret == 0:
+				                ret = cmp(self.mimetype, other.mimetype)
+        else:
+            ret = 1
+        return ret
+
 class Actor(object):
     &quot;&quot;&quot;Gnip Actor container class
     </diff>
      <filename>gnip/xml_objects.py</filename>
    </modified>
    <modified>
      <diff>@@ -75,10 +75,9 @@ class ActivityTestCase(unittest.TestCase):
 
         self.testTitleValue = &quot;the_title&quot;            
         self.testBodyValue = &quot;the_body&quot;
-        self.testMediaURLMetaURL1 = &quot;mediaURL_metaURL_1&quot;
-        self.testMediaUrlValue1 = &quot;the_mediaURL_1&quot;
-        self.testMediaURLMetaURL2 = &quot;mediaURL_metaURL_2&quot;
-        self.testMediaUrlValue2 = &quot;the_mediaURL_2&quot; 
+        self.testMediaURL0 = MediaURL(&quot;http://www.example.com/somemedia.mp3&quot;, &quot;70px&quot;, &quot;80px&quot;, &quot;2:30&quot;, &quot;audio&quot;, &quot;audio/mpeg&quot;)
+        self.testMediaURL1 = MediaURL(&quot;http://www.example.com/somevideo.qt&quot;)
+        
         self.testRaw = &quot;the_raw&quot;   
         
     def testTimeStringConversionFromDatetime(self):
@@ -228,10 +227,8 @@ class ActivityTestCase(unittest.TestCase):
         
         self.assertEqual(an_activity.payload.title, self.testTitleValue)
         self.assertEqual(an_activity.payload.body, self.testBodyValue)
-        self.assertEqual(an_activity.payload.media_urls[0].value, self.testMediaUrlValue1)
-        self.assertEqual(an_activity.payload.media_urls[0].meta_url, self.testMediaURLMetaURL1)
-        self.assertEqual(an_activity.payload.media_urls[1].meta_url, self.testMediaURLMetaURL2)
-        self.assertEqual(an_activity.payload.media_urls[1].value, self.testMediaUrlValue2)
+        self.assertEqual(an_activity.payload.media_urls[0], self.testMediaURL0)
+        self.assertEqual(an_activity.payload.media_urls[1], self.testMediaURL1)
 
         self.assertEqual(an_activity.payload.read_raw(), self.testRaw)            
 
@@ -244,8 +241,7 @@ class ActivityTestCase(unittest.TestCase):
 
         a_payload = payload.Payload(title=self.testTitleValue,
                                         body=self.testBodyValue,
-                                        media_urls=[URL(value=self.testMediaUrlValue1, meta_url=self.testMediaURLMetaURL1),
-                                                    URL(value=self.testMediaUrlValue2, meta_url=self.testMediaURLMetaURL2)],
+                                        media_urls=[self.testMediaURL0, self.testMediaURL1],
                                         raw=self.testRaw)
 
         an_activity = activity.Activity(action=self.testActionValue, </diff>
      <filename>test/activity_test.py</filename>
    </modified>
    <modified>
      <diff>@@ -1 +1 @@
-&lt;activity&gt;&lt;at&gt;2001-01-01T01:01:00.000Z&lt;/at&gt;&lt;action&gt;the_action&lt;/action&gt;&lt;activityID&gt;the_activityID&lt;/activityID&gt;&lt;URL&gt;the_URL&lt;/URL&gt;&lt;source&gt;the_source_1&lt;/source&gt;&lt;source&gt;the_source_2&lt;/source&gt;&lt;place&gt;&lt;point&gt;1.0 -2.0&lt;/point&gt;&lt;elev&gt;3.0&lt;/elev&gt;&lt;floor&gt;4&lt;/floor&gt;&lt;featuretypetag&gt;the_featuretypetag_1&lt;/featuretypetag&gt;&lt;featurename&gt;the_featurename_1&lt;/featurename&gt;&lt;relationshiptag&gt;the_relationshiptag_1&lt;/relationshiptag&gt;&lt;/place&gt;&lt;place&gt;&lt;point&gt;11.0 -12.0&lt;/point&gt;&lt;elev&gt;13.0&lt;/elev&gt;&lt;floor&gt;14&lt;/floor&gt;&lt;featuretypetag&gt;the_featuretypetag_2&lt;/featuretypetag&gt;&lt;featurename&gt;the_featurename_2&lt;/featurename&gt;&lt;relationshiptag&gt;the_relationshiptag_2&lt;/relationshiptag&gt;&lt;/place&gt;&lt;actor metaURL=&quot;actor_metaURL_1&quot; uid=&quot;actor_uid_1&quot;&gt;the_actor_1&lt;/actor&gt;&lt;actor metaURL=&quot;actor_metaURL_2&quot; uid=&quot;actor_uid_2&quot;&gt;the_actor_2&lt;/actor&gt;&lt;destinationURL metaURL=&quot;destinationURL_metaURL_1&quot;&gt;the_destinationURL_1&lt;/destinationURL&gt;&lt;destinationURL metaURL=&quot;destinationURL_metaURL_2&quot;&gt;the_destinationURL_2&lt;/destinationURL&gt;&lt;tag metaURL=&quot;tag_metaURL_1&quot;&gt;tag_metaURL_1&lt;/tag&gt;&lt;tag metaURL=&quot;tag_metaURL_2&quot;&gt;tag_metaURL_2&lt;/tag&gt;&lt;to metaURL=&quot;to_metaURL_1&quot;&gt;the_to_1&lt;/to&gt;&lt;to metaURL=&quot;to_metaURL_2&quot;&gt;the_to_2&lt;/to&gt;&lt;regardingURL metaURL=&quot;regardingURL_metaURL_1&quot;&gt;the_regardingURL_1&lt;/regardingURL&gt;&lt;regardingURL metaURL=&quot;regardingURL_metaURL_2&quot;&gt;the_regardingURL_2&lt;/regardingURL&gt;&lt;payload&gt;&lt;title&gt;the_title&lt;/title&gt;&lt;body&gt;the_body&lt;/body&gt;&lt;mediaURL metaURL=&quot;mediaURL_metaURL_1&quot;&gt;the_mediaURL_1&lt;/mediaURL&gt;&lt;mediaURL metaURL=&quot;mediaURL_metaURL_2&quot;&gt;the_mediaURL_2&lt;/mediaURL&gt;&lt;raw&gt;H4sIAMG3eEkC/yvJSI0vSiwHAP9DokYHAAAA&lt;/raw&gt;&lt;/payload&gt;&lt;/activity&gt;
\ No newline at end of file
+&lt;activity&gt;&lt;at&gt;2001-01-01T01:01:00.000Z&lt;/at&gt;&lt;action&gt;the_action&lt;/action&gt;&lt;activityID&gt;the_activityID&lt;/activityID&gt;&lt;URL&gt;the_URL&lt;/URL&gt;&lt;source&gt;the_source_1&lt;/source&gt;&lt;source&gt;the_source_2&lt;/source&gt;&lt;place&gt;&lt;point&gt;1.0 -2.0&lt;/point&gt;&lt;elev&gt;3.0&lt;/elev&gt;&lt;floor&gt;4&lt;/floor&gt;&lt;featuretypetag&gt;the_featuretypetag_1&lt;/featuretypetag&gt;&lt;featurename&gt;the_featurename_1&lt;/featurename&gt;&lt;relationshiptag&gt;the_relationshiptag_1&lt;/relationshiptag&gt;&lt;/place&gt;&lt;place&gt;&lt;point&gt;11.0 -12.0&lt;/point&gt;&lt;elev&gt;13.0&lt;/elev&gt;&lt;floor&gt;14&lt;/floor&gt;&lt;featuretypetag&gt;the_featuretypetag_2&lt;/featuretypetag&gt;&lt;featurename&gt;the_featurename_2&lt;/featurename&gt;&lt;relationshiptag&gt;the_relationshiptag_2&lt;/relationshiptag&gt;&lt;/place&gt;&lt;actor metaURL=&quot;actor_metaURL_1&quot; uid=&quot;actor_uid_1&quot;&gt;the_actor_1&lt;/actor&gt;&lt;actor metaURL=&quot;actor_metaURL_2&quot; uid=&quot;actor_uid_2&quot;&gt;the_actor_2&lt;/actor&gt;&lt;destinationURL metaURL=&quot;destinationURL_metaURL_1&quot;&gt;the_destinationURL_1&lt;/destinationURL&gt;&lt;destinationURL metaURL=&quot;destinationURL_metaURL_2&quot;&gt;the_destinationURL_2&lt;/destinationURL&gt;&lt;tag metaURL=&quot;tag_metaURL_1&quot;&gt;tag_metaURL_1&lt;/tag&gt;&lt;tag metaURL=&quot;tag_metaURL_2&quot;&gt;tag_metaURL_2&lt;/tag&gt;&lt;to metaURL=&quot;to_metaURL_1&quot;&gt;the_to_1&lt;/to&gt;&lt;to metaURL=&quot;to_metaURL_2&quot;&gt;the_to_2&lt;/to&gt;&lt;regardingURL metaURL=&quot;regardingURL_metaURL_1&quot;&gt;the_regardingURL_1&lt;/regardingURL&gt;&lt;regardingURL metaURL=&quot;regardingURL_metaURL_2&quot;&gt;the_regardingURL_2&lt;/regardingURL&gt;&lt;payload&gt;&lt;title&gt;the_title&lt;/title&gt;&lt;body&gt;the_body&lt;/body&gt;&lt;mediaURL duration=&quot;2:30&quot; height=&quot;70px&quot; mimeType=&quot;audio/mpeg&quot; type=&quot;audio&quot; width=&quot;80px&quot;&gt;http://www.example.com/somemedia.mp3&lt;/mediaURL&gt;&lt;mediaURL&gt;http://www.example.com/somevideo.qt&lt;/mediaURL&gt;&lt;raw&gt;H4sIAMG3eEkC/yvJSI0vSiwHAP9DokYHAAAA&lt;/raw&gt;&lt;/payload&gt;&lt;/activity&gt;
\ No newline at end of file</diff>
      <filename>test/activity_with_payload.xml</filename>
    </modified>
    <modified>
      <diff>@@ -57,12 +57,12 @@ class GnipTestCase(unittest.TestCase):
     def testPublishActivities(self):
         randVal = str(random.randint(1, 99999999))
         a_place1 = place.Place(xml_objects.Point(1.0, -2.0), 3, 4, &quot;city&quot;, &quot;Boulder&quot;, &quot;center&quot;)
-
         a_place2 = place.Place(xml_objects.Point(11.0, -12.0), 13, 14, &quot;city&quot;, &quot;Boulder&quot;, &quot;center&quot;)
 
         a_payload = payload.Payload(title=&quot;Title&quot;,
                                     body=&quot;Body&quot;,
-                                    media_urls=[xml_objects.URL(value=&quot;http://media1.com&quot;, meta_url=&quot;http://media1.com/meta&quot;), xml_objects.URL(value=&quot;http://media2.com&quot;, meta_url=&quot;http://media2.com/meta&quot;)],
+                                    media_urls=[xml_objects.MediaURL(value=&quot;http://media1.com&quot;), 
+                                                xml_objects.MediaURL(value=&quot;http://media2.com&quot;)],
                                     raw=&quot;raw&quot;)
 
         an_activity = activity.Activity(action=&quot;update&quot;,</diff>
      <filename>test/gnip_test.py</filename>
    </modified>
    <modified>
      <diff>@@ -83,5 +83,39 @@ class XmlObjectsTest(unittest.TestCase):
         error2 = Error(&quot;Hello Cruel World!&quot;)
         self.assertEquals(&quot;Hello Cruel World!&quot;, error2.message)
 
+	def testMediaURLsAreEqual(self):
+		m1 = MediaURL(&quot;http://www.example.com/somemedia.mp3&quot;)
+		m2 = MediaURL(&quot;http://www.example.com/somemedia.mp3&quot;)
+		self.assertEqual(m1, m2)
+		
+		m1 = MediaURL(&quot;http://www.example.com/somemedia.mp3&quot;, &quot;70px&quot;, &quot;80px&quot;, &quot;2:30&quot;, &quot;audio&quot;, &quot;audio/mpeg&quot;)
+		m2 = MediaURL(&quot;http://www.example.com/somemedia.mp3&quot;, &quot;70px&quot;, &quot;80px&quot;, &quot;2:30&quot;, &quot;audio&quot;, &quot;audio/mpeg&quot;)
+		self.assertEqual(m1, m2)
+        
+    def testMediaURLsArentEqual(self):
+        m1 = MediaURL(&quot;http://www.example.com/somemedia.mp3&quot;)
+        m2 = MediaURL(&quot;http://www.example.com/someothermedia.mp3&quot;)
+        self.assertNotEqual(m1, m2)
+        
+        m1 = MediaURL(&quot;http://www.example.com/somemedia.mp3&quot;, &quot;70px&quot;, &quot;80px&quot;, &quot;2:30&quot;, &quot;audio&quot;, &quot;audio/mpeg&quot;)
+        m2 = MediaURL(&quot;http://www.example.com/somemedia.mp3&quot;, &quot;71px&quot;, &quot;80px&quot;, &quot;2:30&quot;, &quot;audio&quot;, &quot;audio/mpeg&quot;)
+        self.assertNotEqual(m1, m2)
+
+        m1 = MediaURL(&quot;http://www.example.com/somemedia.mp3&quot;, &quot;70px&quot;, &quot;80px&quot;, &quot;2:30&quot;, &quot;audio&quot;, &quot;audio/mpeg&quot;)
+        m2 = MediaURL(&quot;http://www.example.com/somemedia.mp3&quot;, &quot;70px&quot;, &quot;81px&quot;, &quot;2:30&quot;, &quot;audio&quot;, &quot;audio/mpeg&quot;)
+        self.assertNotEqual(m1, m2)
+
+        m1 = MediaURL(&quot;http://www.example.com/somemedia.mp3&quot;, &quot;70px&quot;, &quot;80px&quot;, &quot;2:30&quot;, &quot;audio&quot;, &quot;audio/mpeg&quot;)
+        m2 = MediaURL(&quot;http://www.example.com/somemedia.mp3&quot;, &quot;70px&quot;, &quot;80px&quot;, &quot;2:31&quot;, &quot;audio&quot;, &quot;audio/mpeg&quot;)
+        self.assertNotEqual(m1, m2)
+
+        m1 = MediaURL(&quot;http://www.example.com/somemedia.mp3&quot;, &quot;70px&quot;, &quot;80px&quot;, &quot;2:30&quot;, &quot;audio&quot;, &quot;audio/mpeg&quot;)
+        m2 = MediaURL(&quot;http://www.example.com/somemedia.mp3&quot;, &quot;70px&quot;, &quot;80px&quot;, &quot;2:30&quot;, &quot;video&quot;, &quot;audio/mpeg&quot;)
+        self.assertNotEqual(m1, m2)
+
+        m1 = MediaURL(&quot;http://www.example.com/somemedia.mp3&quot;, &quot;70px&quot;, &quot;80px&quot;, &quot;2:30&quot;, &quot;audio&quot;, &quot;audio/mpeg&quot;)
+        m2 = MediaURL(&quot;http://www.example.com/somemedia.mp3&quot;, &quot;70px&quot;, &quot;80px&quot;, &quot;2:30&quot;, &quot;audio&quot;, &quot;audio/mpeg4&quot;)
+        self.assertNotEqual(m1, m2)
+        
 if __name__ == '__main__':
     unittest.main()</diff>
      <filename>test/xml_objects_test.py</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>12646f22e4526eac1edb7f39e6fa260d3984e3e7</id>
    </parent>
  </parents>
  <author>
    <name>Alex Jackson</name>
    <email>alex@gnipcentral.com</email>
  </author>
  <url>http://github.com/gnip/gnip-python/commit/e907f5c3b9a18c7898c1f53fbea9f5e79303ad89</url>
  <id>e907f5c3b9a18c7898c1f53fbea9f5e79303ad89</id>
  <committed-date>2009-01-26T14:56:37-08:00</committed-date>
  <authored-date>2009-01-26T13:39:23-08:00</authored-date>
  <message>Add new attributes to mediaURL
Ensure point is optional in place
Add keywords to activity

Signed-off-by: Ingrid Alongi &lt;ingrid@gnipcentral.com&gt;</message>
  <tree>ca17030018191bee84b49145db77208a94f1780f</tree>
  <committer>
    <name>Ingrid Alongi</name>
    <email>ingrid@gnipcentral.com</email>
  </committer>
</commit>
