From b1b4129b75ded142ac53fbfbbe8027efcf9df8de Mon Sep 17 00:00:00 2001
From: Kamte <43906188+ckamte@users.noreply.github.com>
Date: Wed, 28 Feb 2024 20:55:24 +0630
Subject: [PATCH] Update ccdl-win.py
filter remake
---
ccdl-win.py | 227 +++++++++++++++++++++++++++++++---------------------
1 file changed, 136 insertions(+), 91 deletions(-)
diff --git a/ccdl-win.py b/ccdl-win.py
index b141601..a3dbbb5 100644
--- a/ccdl-win.py
+++ b/ccdl-win.py
@@ -1,15 +1,15 @@
-#!/usr/bin/env python3
"""
This is the Adobe Offline Package downloader for Windows.
-original file
-https://github.com/Drovosek01/adobe-packager
+Download package only! Installer not included
+Based on https://github.com/Drovosek01/adobe-packager
"""
import argparse
import json
import locale
+import ctypes
import os
import random
import string
@@ -40,31 +40,6 @@ CODE_QUALITY = 'Mildly_AWFUL'
ADOBE_PRODUCTS_XML_URL = 'https://prod-rel-ffc-ccm.oobesaas.adobe.com/adobe-ffc-external/core/v{urlVersion}/products/all?_type=xml&channel=ccm&channel=sti&platform={installPlatform}&productType=Desktop'
ADOBE_APPLICATION_JSON_URL = 'https://cdn-ffc.oobesaas.adobe.com/core/v3/applications'
-DRIVER_XML = '''
-
- Adobe {name}
- {sapCode}
- {version}
- {baseVersion}
- {installPlatform}
- ./{sapCode}
-
-{dependencies}
-
-
-
- {installDir}\Adobe
- {language}
-
-
-'''
-
-DRIVER_XML_DEPENDENCY = '''
- {sapCode}
- {version}
- ./{sapCode}
- '''
-
ADOBE_REQ_HEADERS = {
'X-Adobe-App-Id': 'accc-apps-panel-desktop',
'User-Agent': 'Adobe Application Manager 2.0',
@@ -116,6 +91,7 @@ def parse_products_xml(products_xml, urlVersion):
'versions': OrderedDict()
}
+ #icon for main application
icons = []
if p.find('productIcons'):
for icon in p.findall('productIcons/icon'):
@@ -138,11 +114,17 @@ def parse_products_xml(products_xml, urlVersion):
break
buildGuid = pf.find('languageSet/urls/manifestURL').text
# This is actually manifest URL
+
+ language_set = pf.findall('languageSet/locales/locale')
+ supported_langs = []
+ for locale in language_set:
+ supported_langs.append(locale.get('name'))
products[sap]['versions'][productVersion] = {
'sapCode': sap,
'baseVersion': baseVersion,
'productVersion': productVersion,
+ 'supportedLanguages': supported_langs,
'productIcons': icons,
'apPlatform': appplatform,
'dependencies': [{
@@ -187,10 +169,13 @@ def get_download_path():
return dest
-def download_icons(icons, icon_dir):
+def download_icons(product, icon_dir):
print('Downloading application icons')
if not os.path.exists(icon_dir):
os.makedirs(icon_dir)
+
+ icons = product['productIcons']
+ prefix = product['sapCode'].lower()
for url in icons:
response = session.get(
url, stream=True, headers=ADOBE_REQ_HEADERS)
@@ -200,7 +185,7 @@ def download_icons(icons, icon_dir):
block_size = 1024 # 1 Kibibyte
progress_bar = tqdm(total=total_size_in_bytes,
unit='iB', unit_scale=True)
- name = url.split('/')[-1].split('?')[0]
+ name = prefix + url.split('/')[-1].split('?')[0]
file_path = os.path.join(icon_dir, name)
with open(file_path, 'wb') as file:
for data in response.iter_content(block_size):
@@ -249,7 +234,7 @@ def download_APRO(appInfo, cdn):
print('')
print('sapCode: ' + sapCode)
print('version: ' + version)
- print('installLanguage: ' + 'ALL')
+ print('installLanguage: ' + 'All')
print('dest: ' + os.path.join(dest, name))
print('\nDownloading...\n')
@@ -327,10 +312,10 @@ def get_products():
return products, cdn, sapCodes, allowedPlatforms
-'''
+
def condition_check(condition, language):
if 'installLanguage' in condition:
- if language == 'ALL':
+ if language == 'All':
return True
else:
if language in condition:
@@ -344,11 +329,14 @@ def condition_check(condition, language):
return False
+
def language_for_premiere(language):
if '_' in language:
main, locale = language.split('_')
return '-esl_lp_' + main
+ return language
+
def package_filter(package, language):
newPackage = []
@@ -375,7 +363,77 @@ def package_filter(package, language):
else:
newPackage.append(pkg)
return newPackage
-'''
+
+def language_clean(dict, language):
+ for item in dict:
+ if item['locale'] == language:
+ return item
+
+def json_filter(jsonData, language):
+ jsonData['Packages']['Package'] = package_filter(jsonData['Packages']['Package'], language)
+
+ jsonData['SupportedLanguages']['Language'] = language_clean(jsonData['SupportedLanguages']['Language'], language)
+
+ jsonData['TutorialUrl']['Stage']['Language'] = language_clean(jsonData['TutorialUrl']['Stage']['Language'], language)
+ jsonData['TutorialUrl']['Prod']['Language'] = language_clean(jsonData['TutorialUrl']['Prod']['Language'], language)
+
+ jsonData['AddRemoveInfo']['DisplayName']['Language'] = language_clean(jsonData['AddRemoveInfo']['DisplayName']['Language'], language)
+ jsonData['AddRemoveInfo']['DisplayVersion']['Language'] = language_clean(jsonData['AddRemoveInfo']['DisplayVersion']['Language'], language)
+
+ if 'URLInfoAbout' in jsonData['AddRemoveInfo']:
+ jsonData['AddRemoveInfo']['URLInfoAbout']['Language'] = language_clean(jsonData['AddRemoveInfo']['URLInfoAbout']['Language'], language)
+
+ if 'URLUpdateInfo' in jsonData['AddRemoveInfo']:
+ jsonData['AddRemoveInfo']['URLUpdateInfo']['Language'] = language_clean(jsonData['AddRemoveInfo']['URLUpdateInfo']['Language'], language)
+
+ if 'HelpLink' in jsonData['AddRemoveInfo']:
+ jsonData['AddRemoveInfo']['HelpLink']['Language'] = language_clean(jsonData['AddRemoveInfo']['HelpLink']['Language'], language)
+
+ jsonData['ProductDescription']['Tagline']['Language'] = language_clean(jsonData['ProductDescription']['Tagline']['Language'], language)
+
+ if 'DetailedDescription' in jsonData['ProductDescription']:
+ jsonData['ProductDescription']['DetailedDescription']['Language'] = language_clean(jsonData['ProductDescription']['DetailedDescription']['Language'], language)
+
+ return jsonData
+
+def write_driver(jsonData, directory, prefix=""):
+ driver = ET.Element('DriverInfo')
+ product = ET.SubElement(driver, 'ProductInfo')
+
+ prd_name = ET.SubElement(product, 'Name')
+ prd_name.text = 'Adobe ' + jsonData['Name']
+
+ sap_code = ET.SubElement(product, 'SAPCode')
+ sap_code.text = jsonData['SAPCode']
+
+ cod_ver = ET.SubElement(product, 'CodexVersion')
+ cod_ver.text = jsonData['CodexVersion']
+
+ base_ver = ET.SubElement(product, 'BaseVersion')
+ base_ver.text = jsonData['BaseVersion']
+
+ platform = ET.SubElement(product, 'Platform')
+ platform.text = jsonData['Platform']
+
+ esd_dir = ET.SubElement(product, 'EsdDirectory')
+ esd_dir.text = './' + jsonData['SAPCode']
+
+ if 'Dependencies' in jsonData:
+ dep_top = ET.SubElement(product, 'Dependencies')
+ for dependency in jsonData['Dependencies']['Dependency']:
+ dep_sub = ET.SubElement(dep_top, 'Dependency')
+ dep_code = ET.SubElement(dep_sub, 'SAPCode')
+ dep_code.text = dependency['SAPCode']
+ dep_base = ET.SubElement(dep_sub, 'BaseVersion')
+ dep_base.text = dependency['BaseVersion']
+ dep_dir = ET.SubElement(dep_sub, 'EsdDirectory')
+ dep_dir.text = './' + dependency['SAPCode']
+
+ tree = ET.ElementTree(driver)
+ ET.indent(tree, space=" ", level=0)
+ xml_file = os.path.join(directory, prefix + 'driver.xml')
+ tree.write(xml_file, encoding='utf-8', xml_declaration=True)
+
def run_ccdl(products, cdn, sapCodes, allowedPlatforms):
"""Run Main execution."""
@@ -424,25 +482,26 @@ def run_ccdl(products, cdn, sapCodes, allowedPlatforms):
if sapCode == 'APRO':
download_APRO(versions[version], cdn)
return
-
- # TODO: Parase languages in the xml
- langs = ['en_US', 'en_GB', 'en_IL', 'en_AE', 'es_ES', 'es_MX', 'pt_BR', 'fr_FR', 'fr_CA', 'fr_MA', 'it_IT', 'de_DE', 'nl_NL',
- 'ru_RU', 'uk_UA', 'zh_TW', 'zh_CN', 'ja_JP', 'ko_KR', 'pl_PL', 'hu_HU', 'cs_CZ', 'tr_TR', 'sv_SE', 'nb_NO', 'fi_FI', 'da_DK', 'ALL']
- # Detecting Current set default Os language. Fixed.
- defLang = locale.getlocale()[0]
- if not defLang:
- defLang = 'en_US'
-
- oslang = None
- if args.osLanguage:
- oslang = args.osLanguage
- elif defLang:
- oslang = defLang
-
- if oslang in langs:
- deflang = oslang
+
+ langs = versions[version]['supportedLanguages']
+ if 'mul' in langs:
+ langs[langs.index('mul')] = 'All'
else:
- deflang = 'en_US'
+ if 'All' not in langs:
+ langs.append('All')
+
+ langs.sort()
+
+ # Detecting Current set default Os language. Fixed.
+ windll = ctypes.windll.kernel32
+ osLang = locale.windows_locale[ windll.GetUserDefaultUILanguage() ]
+
+ if args.osLanguage:
+ osLang = args.osLanguage
+
+ defLang = 'All'
+ if osLang in langs:
+ defLang = osLang
installLanguage = None
if args.installLanguage:
@@ -456,25 +515,25 @@ def run_ccdl(products, cdn, sapCodes, allowedPlatforms):
print('Available languages: {}'.format(', '.join(langs)))
while installLanguage is None:
val = input(
- f'\nPlease enter the desired install language, or nothing for [{deflang}]: ') or deflang
+ f'\nPlease enter the desired install language, or nothing for [{defLang}]: ') or defLang
if len(val) == 5:
val = val[0:2].lower() + val[2] + val[3:5].upper()
elif len(val) == 3:
- val = val.upper()
+ val = val[0].upper() + val[1:].lower()
if val in langs:
installLanguage = val
else:
print(
'{} is not available. Please use a value from the list above.'.format(val))
- if oslang != installLanguage:
- if installLanguage != 'ALL':
- while oslang not in langs:
+ if osLang != installLanguage:
+ if installLanguage != 'All':
+ while osLang not in langs:
print('Could not detect your default Language.')
- oslang = input(
+ osLang = input(
f'\nPlease enter the your OS Language, or nothing for [{installLanguage}]: ') or installLanguage
- if oslang not in langs:
+ if osLang not in langs:
print(
- '{} is not available. Please use a value from the list above.'.format(oslang))
+ '{} is not available. Please use a value from the list above.'.format(osLang))
dest = get_download_path()
@@ -511,6 +570,8 @@ def run_ccdl(products, cdn, sapCodes, allowedPlatforms):
print('\nCreating {}'.format(install_app_name))
products_dir = os.path.join(dest, 'products')
+ driver_dir = products_dir
+ icon_dir = os.path.join(dest, 'icons')
print('\nPreparing...\n')
@@ -522,11 +583,17 @@ def run_ccdl(products, cdn, sapCodes, allowedPlatforms):
print('[{}_{}] Downloading application.json'.format(s, v))
app_json = get_application_json(p['buildGuid'])
- '''
- #replace filtered result for testing
- to_filter = app_json['Packages']['Package']
- app_json['Packages']['Package'] = package_filter(to_filter, installLanguage)
- '''
+ # for main product
+ if 'productIcons' in p:
+ #for driver xml
+ driver_data = app_json
+
+ #download program icons
+ download_icons(p, icon_dir)
+
+ #filter json data by language
+ if (installLanguage != 'All'):
+ app_json = json_filter(app_json, installLanguage)
p['application_json'] = app_json
@@ -544,8 +611,6 @@ def run_ccdl(products, cdn, sapCodes, allowedPlatforms):
for p in prods_to_download:
s, v = p['sapCode'], p['version']
app_json = p['application_json']
- #icons directory
- icon_dir = os.path.join(products_dir, 'icons')
product_dir = os.path.join(products_dir, s)
print('[{}_{}] Parsing available packages'.format(s, v))
@@ -559,43 +624,23 @@ def run_ccdl(products, cdn, sapCodes, allowedPlatforms):
download_urls.append(cdn + pkg['Path'])
else:
# TODO: actually parse `Condition` and check it properly (and maybe look for & add support for conditions other than installLanguage)
- if installLanguage == "ALL":
+ if installLanguage == "All":
noncore_pkg_count += 1
download_urls.append(cdn + pkg['Path'])
else:
- if (not pkg.get('Condition')) or installLanguage in pkg['Condition'] or oslang in pkg['Condition']:
+ if (not pkg.get('Condition')) or installLanguage in pkg['Condition'] or osLang in pkg['Condition']:
noncore_pkg_count += 1
download_urls.append(cdn + pkg['Path'])
print('[{}_{}] Selected {} core packages and {} non-core packages'.format(s,
v, core_pkg_count, noncore_pkg_count))
- # get app icons if exist
- if 'productIcons' in p:
- productIcons = p['productIcons']
- download_icons(productIcons, icon_dir)
-
for url in download_urls:
download_file(url, product_dir, s, v)
print('\nGenerating driver.xml')
-
- driver = DRIVER_XML.format(
- name=product['displayName'],
- sapCode=prodInfo['sapCode'],
- version=prodInfo['productVersion'],
- baseVersion=prodInfo['baseVersion'],
- installPlatform=apPlatform,
- dependencies='\n'.join([DRIVER_XML_DEPENDENCY.format(
- sapCode=d['sapCode'],
- version=d['version']
- ) for d in prodInfo['dependencies']]),
- installDir=get_install_dir(),
- language=installLanguage
- )
- with open(os.path.join(products_dir, f'{sapCode}-driver.xml'), 'w') as f:
- f.write(driver)
- f.close()
+ prefix = driver_data['SAPCode'] + '-'
+ write_driver(driver_data, driver_dir, prefix)
print('\nPackage successfully downloaded.')
return