#!/usr/bin/env python

import json
import unicodedata
import urllib2
from urllib import urlencode

BASE_URL = 'https://prod-rel-ffc-ccm.oobesaas.adobe.com/adobe-ffc-external/core/v4/products/all'

def add_product(products, product):
    if product['id'] not in products:
        products[product['id']] = []

    products[product['id']].append(product)


def feed_url(channels, platforms):
    """Build the GET query parameters for the product feed."""
    params = [
        ('payload', 'true'),
        ('productType', 'Desktop'),
        ('_type', 'json')
    ]
    for ch in channels:
        params.append(('channel', ch))

    for pl in platforms:
        params.append(('platform', pl))

    return BASE_URL + '?' + urlencode(params)

def fetch(channels, platforms):
    """Fetch the feed contents."""
    url = feed_url(channels, platforms)
    print('Fetching from feed URL: {}'.format(url))

    req = urllib2.Request(url, headers={
        'User-Agent': 'Creative Cloud',
        'x-adobe-app-id': 'AUSST_4_0',
    })
    data = json.loads(urllib2.urlopen(req).read())

    return data

if __name__ == "__main__":
    data = fetch(['ccm'], ['osx10', 'osx10-64'])

    products = {}
    for channel in data['channel']:
        for product in channel['products']['product']:
            add_product(products, product)

    for sapcode, productVersions in products.iteritems():
        print("Code: {}".format(sapcode))

        for product in productVersions:
            name = unicodedata.normalize("NFKD", product['displayName'])
            print("\t{}\t\tBaseVersion:\t{}\tVersion:\t{}".format(
                name,
                product['platforms']['platform'][0]['languageSet'][0].get('baseVersion'),
                product['version']
            ))

@@ -1394,16 +1394,20 @@
  print(%22
+SAP 
 Code: %7B%7D
@@ -1466,16 +1466,187 @@
 rsions:%0A
+            base_version = product%5B'platforms'%5D%5B'platform'%5D%5B0%5D%5B'languageSet'%5D%5B0%5D.get('baseVersion')%0A            if not base_version:%0A                base_version = %22N/A%22%0A%0A
         
@@ -1732,19 +1732,23 @@
 int(%22%5Ct%7B
-%7D%5Ct
+0: %3C60%7D
 %5CtBaseVe
@@ -1753,19 +1753,24 @@
 Version:
-%5Ct%7B
+ %7B1: %3C14
 %7D%5CtVersi
@@ -1772,19 +1772,24 @@
 Version:
-%5Ct%7B
+ %7B2: %3C14
 %7D%22.forma
@@ -1833,80 +1833,20 @@
     
-product%5B'platforms'%5D%5B'platform'%5D%5B0%5D%5B'languageSet'%5D%5B0%5D.get('
 base
-V
+_v
 ersion
-')
 ,%0A  
@@ -1893,8 +1893,26 @@
      ))%0A
+        print(%22%22)%0A

Clean up listfeed.py output (padding, separated items, “N/A” for non-HD packages)