diff --git a/setup.py b/setup.py
index e756949cf704be6a4cc4c6a87d7b48c6e7ea9e04..09bdd300ce4ea94eb14b4905216ff2acf74b853e 100644
--- a/setup.py
+++ b/setup.py
@@ -18,6 +18,7 @@ setup(
     install_requires=[
         'awesome-slugify==1.6.5',
         'lxml==3.7.0',
+        'phpserialize==1.3',
     ],
     entry_points='''
         [console_scripts]
diff --git a/wooify/__main__.py b/wooify/__main__.py
index 0df55be5d9712fdf13d33c53a504f47be37c7020..c19ecead3ed5b290d7328595c52b1b9dbda644b4 100644
--- a/wooify/__main__.py
+++ b/wooify/__main__.py
@@ -8,7 +8,7 @@ Usage: {0} adapter input_file
     adapter: an import adapter
     input_file: the source file you want to convert
 
-Available import adapters: ecwid
+Available import adapters: ecwid, dpsounds
 
 Output will be written to:
 
diff --git a/wooify/adapters/dpsounds.py b/wooify/adapters/dpsounds.py
index 62cab61a91873f598f7fe71371dbe50ddb9a2cb0..463a69815620539fcef94b930ac1eae2fc829562 100644
--- a/wooify/adapters/dpsounds.py
+++ b/wooify/adapters/dpsounds.py
@@ -1,13 +1,21 @@
 import csv
 import json
 import hashlib
+import phpserialize
 from .adapter import Adapter as BaseAdapter
 from ..constants import (ALLOWED_HTML_TAGS, HTML_FIELDS,
                          WOO_IMP_EXP_PRODUCT_FIELDS)
 
-DP_TRACK_URL_BASE = 'https://ant.sr/dpsounds-audio'
+DP_TRACK_URL_BASE = 'https://dpsounds.com/wp-content/uploads/tracks'
+DP_SAMPLE_URL_BASE = 'https://dpsounds.com/wp-content/uploads/samples'
 DP_TRACK_CATEGORIES = json.dumps([{'name': 'Music', 'slug': 'music'}])
-DP_TRACK_ATTRIBUTES = ['Time', 'Origin']
+DP_TRACK_ATTRIBUTES = ['Duration', 'Time', 'Origin', 'Tags']
+WP_ATTRS = {
+    'Duration': 'pa_duration',
+    'Time': 'pa_time',
+    'Origin': 'pa_origin',
+    'Tags': 'pa_tags',
+    }
 DP_TRACK_PRICE = 1
 
 
@@ -17,7 +25,7 @@ class DpsoundsAdapter(BaseAdapter):
     Headers:
      "Source Part","Source Track","Track",
      "Title","Time","Origin","Tags",
-     "Alternative Takes","Compilation".
+     "Alternative Takes","Compilation","Duration".
     """
 
     def parse(self, filename):
@@ -28,38 +36,64 @@ class DpsoundsAdapter(BaseAdapter):
             name = "Track {}".format(r['Track'])
             if r['Title']:
                 name += " - {}".format(r['Title'])
-            tags = ','.join([t.strip() for t in r['Tags'].split(',')])
+            r['Tags'] = ','.join([t.strip() for t in r['Tags'].split(',')])
             file_url = "{url_base}/{part}-{track:02d}.mp3".format(
                 url_base=DP_TRACK_URL_BASE,
                 part=r['Source Part'],
                 track=int(r['Source Track']))
             filehash = hashlib.md5(file_url.encode('utf-8')).hexdigest()
-            files = json.dumps({
-                filehash: {'name': name, 'file': file_url}})
+            files = {filehash: {'name': name, 'file': file_url}}
             # TODO: alternative takes
             # TODO: compilation (album)
-            # TODO: Description text to include attributes.
             attributes = [{
-                    'name': attr,
+                    'name': WP_ATTRS[attr],
                     'value': r[attr],
-                    'position': idx,
-                    'is_visible': '1',
-                    'is_variation': '0',
-                    'is_taxonomy': '0'
+                    'position': str(idx),
+                    'is_visible': 1,
+                    'is_variation': 0,
+                    'is_taxonomy': 1,
                 } for idx, attr in enumerate(DP_TRACK_ATTRIBUTES)]
+            sample = [{
+                'name': name,
+                'path': "{url_base}/sample-{part}-{track:02d}.mp3".format(
+                    url_base=DP_SAMPLE_URL_BASE,
+                    part=r['Source Part'],
+                    track=int(r['Source Track']))
+            }]
+            custom_fields = {
+                '_jplayer_sample_file': [
+                    phpserialize.dumps(sample)],
+                '_downloadable': ['yes'],
+                '_downloadable_files': [
+                    phpserialize.dumps(files)],
+                '_product_attributes': [
+                    phpserialize.dumps({
+                        a['name']: a for a in attributes})],
+            }
             product = dict(WOO_IMP_EXP_PRODUCT_FIELDS)
+            wtf_attributes = [
+                    {k: str(a[k]).replace('"', '``').replace(',', '~||~')
+                        for k in a}
+                    for a in attributes]
+            wtf_attributes = (
+                json.dumps(wtf_attributes)
+                .replace(',', '||')
+                .replace('~||~', ','))
             product.update({
                 "Product Name": name,
-                "Tags": tags,
+                "Tags": r['Tags'],
                 "Categories": DP_TRACK_CATEGORIES,
                 "Downloadable": 'yes',
                 "Virtual": 'yes',
                 "Sold Individually": 'yes',
-                "Downloadable Files": files,
+                "Downloadable Files": (phpserialize.dumps(files)
+                                       .decode('utf-8')),
                 "Download Type": "music",
                 "Price": DP_TRACK_PRICE,
                 "Regular Price": DP_TRACK_PRICE,
-                "Attributes": json.dumps(attributes)
+                "Attributes": wtf_attributes,
+                "Custom Fields": (phpserialize.dumps(custom_fields)
+                                  .decode('utf-8')),
             })
             return product