[banshee] AmazonMp3: Handle plain text AMZ files now sent by Amazon (bgo#661467)



commit d30ff8d1ab2e1aab61862ed0074eb55ffb98adb2
Author: Bertrand Lorentz <bertrand lorentz gmail com>
Date:   Tue Oct 25 20:26:30 2011 +0200

    AmazonMp3: Handle plain text AMZ files now sent by Amazon (bgo#661467)
    
    The Amazon store now gives us unencrypted AMZ files in some situations.
    They have a slightly different format than usual : there's no XML
    declaration, and the <playlist> tag doesn't have a version attribute.
    
    That means that the detection of unencrypted files we had for debugging
    purposes doesn't work, and using XspfPlaylistFormat.MagicFormat wouldn't
    work either. So we just look at the first 10 bytes.
    
    Also add another unit test with an example of a clear text AMZ file.

 .../Banshee.AmazonMp3/AmzXspfPlaylist.cs           |   24 +++---
 .../Banshee.AmazonMp3/Tests/AmzXspfPlaylistTest.cs |    6 ++
 tests/data/amz/clear.amz                           |   83 ++++++++++++++++++++
 3 files changed, 101 insertions(+), 12 deletions(-)
---
diff --git a/src/Extensions/Banshee.AmazonMp3/Banshee.AmazonMp3/AmzXspfPlaylist.cs b/src/Extensions/Banshee.AmazonMp3/Banshee.AmazonMp3/AmzXspfPlaylist.cs
index f229bdb..224f220 100644
--- a/src/Extensions/Banshee.AmazonMp3/Banshee.AmazonMp3/AmzXspfPlaylist.cs
+++ b/src/Extensions/Banshee.AmazonMp3/Banshee.AmazonMp3/AmzXspfPlaylist.cs
@@ -70,18 +70,18 @@ namespace Banshee.AmazonMp3
 
         private void Decrypt (Stream stream)
         {
-            // Useful for debugging, support loading an unencrypted XSPF file
-            var xml_magic = new byte [5];
-            if (stream.Read (xml_magic, 0, 5) == 5 &&
-                xml_magic[0] == 0x3c &&
-                xml_magic[1] == 0x3f &&
-                xml_magic[2] == 0x78 &&
-                xml_magic[3] == 0x6d &&
-                xml_magic[4] == 0x6c) {
-                stream.Seek (0, SeekOrigin.Begin);
-                Load (stream);
-                AmzLoad ();
-                return;
+            // Amazon sometimes sends an unencrypted XSPF file, which doesn't start
+            // with <?xml... but with a <playlist> tag
+            var magic = new byte [10];
+            if (stream.Read (magic, 0, 10) == 10) {
+                string start = System.Text.Encoding.UTF8.GetString (magic);
+
+                if (start.Contains ("<?xml") || start.Contains ("<playlist")) {
+                    stream.Seek (0, SeekOrigin.Begin);
+                    Load (stream);
+                    AmzLoad ();
+                    return;
+                }
             }
 
             stream.Seek (0, SeekOrigin.Begin);
diff --git a/src/Extensions/Banshee.AmazonMp3/Banshee.AmazonMp3/Tests/AmzXspfPlaylistTest.cs b/src/Extensions/Banshee.AmazonMp3/Banshee.AmazonMp3/Tests/AmzXspfPlaylistTest.cs
index 8ecff6b..5c2d7c5 100644
--- a/src/Extensions/Banshee.AmazonMp3/Banshee.AmazonMp3/Tests/AmzXspfPlaylistTest.cs
+++ b/src/Extensions/Banshee.AmazonMp3/Banshee.AmazonMp3/Tests/AmzXspfPlaylistTest.cs
@@ -63,6 +63,12 @@ namespace Banshee.AmazonMp3.Tests
             TestPlaylist ("decrypted.amz", 12);
         }
 
+        [Test]
+        public void LoadCleartextAmz ()
+        {
+            TestPlaylist ("clear.amz", 4);
+        }
+
         public void TestPlaylist (string filename, int track_number)
         {
             var playlist = new AmzXspfPlaylist (Path.Combine (data_dir, filename));
diff --git a/tests/data/amz/clear.amz b/tests/data/amz/clear.amz
new file mode 100644
index 0000000..1fbba87
--- /dev/null
+++ b/tests/data/amz/clear.amz
@@ -0,0 +1,83 @@
+
+<playlist>
+  <title>Cloud Player Download</title>
+  <extension application="http://www.amazon.com"/>
+  <trackList>
+    <track>
+      <location>http://test/track</location>
+      <creator>Artist</creator>
+      <album>Album Title</album>
+      <title>Track Title</title>
+      <image>http://test/image</image>
+      <duration>395000</duration>
+      <trackNum>1</trackNum>
+      <meta rel="http://www.amazon.com/dmusic/ASIN";>B002OSEN0O</meta>
+      <meta rel="http://www.amazon.com/dmusic/productTypeName";>DOWNLOADABLE_MUSIC_TRACK</meta>
+      <meta rel="http://www.amazon.com/dmusic/customerId";>TEST</meta>
+      <meta rel="http://www.amazon.com/dmusic/cdObjectId";>TEST</meta>
+      <meta rel="http://www.amazon.com/dmusic/primaryGenre";>Dance &amp; DJ</meta>
+      <meta rel="http://www.amazon.com/dmusic/fileSize";>1234567</meta>
+      <meta rel="http://www.amazon.com/dmusic/discNum";>1</meta>
+      <meta rel="http://www.amazon.com/dmusic/albumASIN";>B002OSAT7U</meta>
+      <meta rel="http://www.amazon.com/dmusic/albumPrimaryArtist";>Artist</meta>
+      <meta rel="http://www.amazon.com/dmusic/trackType";>mp3</meta>
+    </track>
+    <track>
+      <location>http://test/track</location>
+      <creator>Artist</creator>
+      <album>Album Title</album>
+      <title>Track Title</title>
+      <image>http://test/image</image>
+      <duration>270000</duration>
+      <trackNum>2</trackNum>
+      <meta rel="http://www.amazon.com/dmusic/ASIN";>TEST</meta>
+      <meta rel="http://www.amazon.com/dmusic/productTypeName";>DOWNLOADABLE_MUSIC_TRACK</meta>
+      <meta rel="http://www.amazon.com/dmusic/customerId";>TEST</meta>
+      <meta rel="http://www.amazon.com/dmusic/cdObjectId";>TEST</meta>
+      <meta rel="http://www.amazon.com/dmusic/primaryGenre";>TEST</meta>
+      <meta rel="http://www.amazon.com/dmusic/fileSize";>1234567</meta>
+      <meta rel="http://www.amazon.com/dmusic/discNum";>1</meta>
+      <meta rel="http://www.amazon.com/dmusic/albumASIN";>TEST</meta>
+      <meta rel="http://www.amazon.com/dmusic/albumPrimaryArtist";>Artist</meta>
+      <meta rel="http://www.amazon.com/dmusic/trackType";>mp3</meta>
+    </track>
+    <track>
+      <location>http://test/track</location>
+      <creator>Artist</creator>
+      <album>Album Title</album>
+      <title>Track Title</title>
+      <image>http://test/image</image>
+      <duration>195000</duration>
+      <trackNum>3</trackNum>
+      <meta rel="http://www.amazon.com/dmusic/ASIN";>TEST</meta>
+      <meta rel="http://www.amazon.com/dmusic/productTypeName";>DOWNLOADABLE_MUSIC_TRACK</meta>
+      <meta rel="http://www.amazon.com/dmusic/customerId";>TEST</meta>
+      <meta rel="http://www.amazon.com/dmusic/cdObjectId";>TEST</meta>
+      <meta rel="http://www.amazon.com/dmusic/primaryGenre";>TEST</meta>
+      <meta rel="http://www.amazon.com/dmusic/fileSize";>1234567</meta>
+      <meta rel="http://www.amazon.com/dmusic/discNum";>1</meta>
+      <meta rel="http://www.amazon.com/dmusic/albumASIN";>TEST</meta>
+      <meta rel="http://www.amazon.com/dmusic/albumPrimaryArtist";>Artist</meta>
+      <meta rel="http://www.amazon.com/dmusic/trackType";>mp3</meta>
+    </track>
+    <track>
+      <location>http://test/track</location>
+      <creator>Artist</creator>
+      <album>Album Title</album>
+      <title>Track Title</title>
+      <image>http://test/image</image>
+      <duration>315000</duration>
+      <trackNum>4</trackNum>
+      <meta rel="http://www.amazon.com/dmusic/ASIN";>TEST</meta>
+      <meta rel="http://www.amazon.com/dmusic/productTypeName";>DOWNLOADABLE_MUSIC_TRACK</meta>
+      <meta rel="http://www.amazon.com/dmusic/customerId";>TEST</meta>
+      <meta rel="http://www.amazon.com/dmusic/cdObjectId";>TEST</meta>
+      <meta rel="http://www.amazon.com/dmusic/primaryGenre";>TEST</meta>
+      <meta rel="http://www.amazon.com/dmusic/fileSize";>12345678</meta>
+      <meta rel="http://www.amazon.com/dmusic/discNum";>1</meta>
+      <meta rel="http://www.amazon.com/dmusic/albumASIN";>TEST</meta>
+      <meta rel="http://www.amazon.com/dmusic/albumPrimaryArtist";>Artist</meta>
+      <meta rel="http://www.amazon.com/dmusic/trackType";>mp3</meta>
+    </track>
+  </trackList>
+</playlist>



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]