Compare commits

15 Commits
1.1 ... main

Author SHA1 Message Date
orbittwz
7d4da5e7e5 Update build_installer.py
solving #28 , thanks to @valenok-polny for the heads up!
2026-08-02 11:09:13 +03:00
Kamte
c861f9942c Merge pull request #27 from muink/patch-1
fix: utf-8 support for gen-suite.py
2026-05-13 19:41:56 +06:30
Anya Lin
dbd1107d24 fix: utf-8 support for gen-suite.py 2026-05-13 13:44:23 +08:00
ckamte
fffc00e37f Update driver.xml for ame 26 (for multi languages) 2026-05-12 14:47:41 +06:30
ckamte
d885396886 Add language filter for AME(v.26x) 2026-01-31 12:41:21 +06:30
ckamte
b3a4c2bb7b update Driver.xml for AME 2026-01-27 17:23:03 +06:30
ckamte
3549a967c7 Download all Speech to Text Language Pack modules for AME 2026-01-26 14:22:58 +06:30
ckamte
c597d921c6 fixed for #25 2026-01-24 17:32:47 +06:30
ckamte
9b11c2dbe1 Fix #22, exe things 2026-01-09 17:40:59 +06:30
ckamte
39aa2bd743 Fixes for issues #22,, #24 2026-01-09 17:07:08 +06:30
ckamte
01a537c7bd fix for issue #22, add icons and update build_installer, gen-suite 2026-01-08 15:39:31 +06:30
ckamte
5cf0b92a66 Update readme 2026-01-05 10:20:29 +06:30
ckamte
848d16c5e9 update script to version 1.2 2026-01-05 10:11:33 +06:30
ckamte
188b95be99 update readme 2025-12-30 11:25:57 +06:30
ckamte
77687c2af3 add suite installer builder 2025-12-30 11:23:13 +06:30
262 changed files with 1572 additions and 960 deletions

11
CHANGELOG.md Normal file
View File

@@ -0,0 +1,11 @@
## version 1.2
1. Add Suite builder.
2. Change code styles
3. Add multiple language option.
4. Some minor improvements.
## version 1.1
1. Add batch download.
## version 1.0
Convert and modified from https://github.com/Drovosek01/adobe-packager

View File

@@ -31,7 +31,7 @@ Arguments:
1. Extract the whole branch to a working folder and pick one Set-up.exe version and extract it to the same folder. (v4 setup not support win10) 1. Extract the whole branch to a working folder and pick one Set-up.exe version and extract it to the same folder. (v4 setup not support win10)
2. Download desire product using ccdl-win.py (creates "products" folder inside the working folder) 2. Download desire product using ccdl-win.py (creates "products" folder inside the working folder)
3. Download ACC packages for the installer using build_installer.py (creates "packages" folder inside the working folder) 3. Download ACC packages for the installer using build_installer.py (creates "packages" folder inside the working folder)
4. Rename \products\\*prefix*-Driver.xml to Driver.xml (For multiple products, rename ONE product prefix to Driver.xml to install it) ~~until I figure out how to merge driver.xml files, it's called suiteinfo.xml~~ 4. Rename \products\\*prefix*-Driver.xml to Driver.xml (For multiple products, rename ONE product prefix to Driver.xml to install it)
5. Along the "packages" folder, a new "acc_sources" folder will be created as well (this contains the zip files of the ACC packages which were extracted before) 5. Along the "packages" folder, a new "acc_sources" folder will be created as well (this contains the zip files of the ACC packages which were extracted before)
6. Optional - Delete downloaded zip files in "acc_sources" directory to reduce installer size (Not necessary because omitting the folder if the whole installation is packed is valid and if kept, used for other products) 6. Optional - Delete downloaded zip files in "acc_sources" directory to reduce installer size (Not necessary because omitting the folder if the whole installation is packed is valid and if kept, used for other products)
7. Run Set-up.exe to install the product. 7. Run Set-up.exe to install the product.
@@ -47,3 +47,9 @@ https://drive.google.com/file/d/1Quc2YgR85VO9_aTMo3HfvcsOXnlwSFid/view?usp=shari
``` ```
python ccdl-win.py -u 6 -l en_US -p win64 -s phsp,idsn,ilst -x python ccdl-win.py -u 6 -l en_US -p win64 -s phsp,idsn,ilst -x
``` ```
3. You can create suite like installer by using gen-suite.py (from suite_installer directory)
4. You can now add two or more languages to download.
```
python ccdl-win.py -u 6 -l en_US,fr_FR -p win64 -s phsp,idsn,ilst -x
```
5. Working on filtering Speech to Text Language Pack modules for AME (v26x). (Current script will download all available modules!!)

View File

@@ -1,6 +1,9 @@
""" """
This is the downloader for required packages for Adobe Setup. This is the downloader for required packages for Adobe Setup.
v 1.2.0
Change download type
v 1.1.0 v 1.1.0
Add support for Adobe CC 6.2.0.x Add support for Adobe CC 6.2.0.x
@@ -9,14 +12,8 @@ Download packages only!
import os import os
import sys import sys
import platform import argparse
import subprocess
import string
import json
import random
import zipfile import zipfile
import time
from xml.etree import ElementTree as ET
try: try:
import requests import requests
@@ -36,297 +33,138 @@ except ImportError:
or run: pip3 install tqdm.""" or run: pip3 install tqdm."""
) )
VERSION_STR = "1.1.0" try:
import pefile
except ImportError:
sys.exit(
"""You need pefile module!
install it from https://pypi.org/project/pefile/
or run: pip3 install pefile."""
)
ACC_URL = "https://cdn-ffc.oobesaas.adobe.com/core/v1/applications?name=CreativeCloud&name=CCLBS&osVersion={osVersion}&platform={osPlatform}&version={appVersion}" SCRIPT_NAME = "Adobe Creative Cloud package downloader"
VERSION_STR = "1.2.0"
ADOBE_REQ_HEADERS = {
"X-Adobe-App-Id": "accc-apps-panel-desktop",
"User-Agent": "Adobe Application Manager 2.0",
"X-Api-Key": "CC_HD_ESD_1_0",
"Cookie": "fg="
+ "".join(random.choice(string.ascii_uppercase + string.digits) for _ in range(26))
+ "======",
}
ADOBE_DL_HEADERS = {"User-Agent": "Creative Cloud"} ADOBE_DL_HEADERS = {"User-Agent": "Creative Cloud"}
CURR_PATH = os.path.dirname(os.path.abspath(__file__)) ACC_URL = "https://ccmdls.adobe.com/AdobeProducts/StandaloneBuilds/ACCC/ESD/{mainVer}/{buildVer}/{platform}/{fileName}"
CURR_PATH = os.path.dirname(os.path.realpath(__name__))
ADOBE_SETUP_BIN = os.path.join(CURR_PATH, "Set-up.exe") ADOBE_SETUP_BIN = os.path.join(CURR_PATH, "Set-up.exe")
session = requests.sessions.Session() session = requests.sessions.Session()
def setup_version(): def show_info(name: str, version: str, pad: int, bdr: str) -> None:
try: """Show script information"""
jsonFromPowerShell = json.loads(subprocess.run( tl = len(name) + (pad * 2)
[ print(bdr * tl)
"powershell.exe", print(bdr + name.center(tl - 2) + bdr)
"(Get-Item '" print(version.center(tl, bdr))
+ ADOBE_SETUP_BIN
+ "').VersionInfo.FileVersion | ConvertTo-Json",
],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
shell=True,
).stdout)
return jsonFromPowerShell
except Exception as e:
sys.stderr.write("Set-up.exe not found! Please extract Set-up.exe from one of the archives, and place it in this directory.")
sys.exit(1)
def extract_zip(zip):
def os_data():
osVersionData = sys.getwindowsversion()
osFullVer = "{}.{}.0.{}".format(
osVersionData.major, osVersionData.minor, osVersionData.build
)
osVer = "{}.{}.0".format(osVersionData.major, osVersionData.minor)
osPlatform = "win32"
if platform.machine().endswith("64") == True:
osPlatform = "win64"
return osFullVer, osVer, osPlatform
def get_xml_data(url):
response = session.get(url, stream=True, headers=ADOBE_REQ_HEADERS)
response.encoding = "utf-8"
return ET.fromstring(response.content)
def extract_zip(zip, dest):
zipName = os.path.basename(zip) zipName = os.path.basename(zip)
print(f"Extracting {zipName} contents") print(f"Extracting {zipName} contents")
dir_name = os.path.basename(dest)
with zipfile.ZipFile(zip, "r") as cp:
for f in cp.infolist():
filename = f.filename
# exclude for folder
if filename.endswith('/'):
continue
basename = os.path.basename(filename)
if dir_name in filename and not filename.endswith('/'):
# for < v6.2
dest_file = os.path.join(dest, basename)
with open(dest_file, "wb") as w:
w.write(cp.read(filename))
filename = basename
else:
cp.extract(f, dest)
# retain file creation date
name = os.path.join(dest, filename)
date_time = time.mktime(f.date_time + (0, 0, -1))
os.utime(name, (date_time, date_time))
def file_download(url, source_dir, dest_dir): def get_version():
response = session.get(url, stream=True, headers=ADOBE_REQ_HEADERS) version = args.setupVersion
total_size_in_bytes = int(response.headers.get("content-length", 0))
if total_size_in_bytes > 0: if version is None:
name = os.path.basename(url) if not os.path.exists(ADOBE_SETUP_BIN):
source_zip = os.path.join(source_dir, name) sys.exit("File not found")
try:
pe = pefile.PE(ADOBE_SETUP_BIN)
if hasattr(pe, 'VS_FIXEDFILEINFO'):
info = pe.VS_FIXEDFILEINFO[0]
# Extracting version info
major = info.FileVersionMS >> 16
minor = info.FileVersionMS & 0xFFFF
patch = info.FileVersionLS >> 16
build = info.FileVersionLS & 0xFFFF
version = f"{major}.{minor}.{patch}.{build}"
except pefile.PEFormatError:
sys.exit("Not a valid PE file (likely not a Windows executable)")
except Exception as e:
sys.exit(f"An error occurred: {e}")
return version
def do_download(dFile, url):
try:
# get file size
response = session.head(url, stream=False, headers=ADOBE_DL_HEADERS)
lengthInBytes = int(response.headers.get("content-length", 0))
if lengthInBytes < 2048:
sys.exit(
f"\nFound nothing for this version. Please try another version.")
if ( if (
os.path.isfile(source_zip) os.path.isfile(dFile)
and os.path.getsize(source_zip) == total_size_in_bytes and os.path.getsize(dFile) == lengthInBytes
): ):
print("Downloaded file is OK. Skipping ...") print(f"\nDownloaded file seems OK, skipping...")
extract_zip(source_zip, dest_dir)
return return
block_size = 1024 # 1 Kibibyte # download file
progress_bar = tqdm(total=total_size_in_bytes, unit="iB", unit_scale=True) response = session.get(url, stream=True, headers=ADOBE_DL_HEADERS)
with open(source_zip, "wb") as file:
for data in response.iter_content(block_size):
progress_bar.update(len(data))
file.write(data)
progress_bar.close()
if total_size_in_bytes != 0 and progress_bar.n != total_size_in_bytes:
print("ERROR, something went wrong")
extract_zip(source_zip, dest_dir) blockSize = 1024 # 1 Kilobyte
with tqdm(total=lengthInBytes, unit="iB", unit_scale=True) as pBar:
with open(dFile, "wb") as file:
for data in response.iter_content(blockSize):
pBar.update(len(data))
file.write(data)
except Exception as e:
print(e)
sys.exit("\nCannot download file!")
def get_packages(): def accc_download():
setupVersion = setup_version() '''Download Adobe Creative Cloud package'''
version = get_version()
print(f"\nDownloading ACCC version: {version}")
v = version.split(".")
mainVer = ".".join([v[0], v[1], v[2]])
buildVer = str(v[3])
print("\nGet Required packages for Adobe Installer v-{}".format(setupVersion)) platform = args.platform or "win64"
fileName = f"ACCCx{'_'.join(v)}.zip"
winFullVer, winVer, winPlatform = os_data() url = ACC_URL.format(
acc_xml_url = ACC_URL.format( mainVer=mainVer, buildVer=buildVer, platform=platform, fileName=fileName
osVersion=winFullVer, osPlatform=winPlatform, appVersion=setupVersion
) )
xml_data = get_xml_data(acc_xml_url) tmpDir = os.path.join(CURR_PATH, "acc_tmp")
os.makedirs(tmpDir, exist_ok=True)
accVersion = xml_data.find(".//application/version").text zipFile = os.path.join(tmpDir, fileName)
if accVersion != setupVersion: do_download(zipFile, url)
print(
"\nYour installer will not work! Please try Adobe Installer version 5x or 6x\n"
)
exit(1)
package_cdn = xml_data.find(".//cdn/secure").text with zipfile.ZipFile(zipFile, 'r') as zr:
packageSets = xml_data.findall(".//packageSets/packageSet") for f in zr.infolist():
if f.filename.startswith("packages") or f.filename.startswith("resources/AdobePIM.dll"):
zr.extract(f, CURR_PATH)
# sort by packageSet name print("\nSuccessfully downloaded and extracted accc package data")
packageSets[:] = sorted(
packageSets, key=lambda packageSets: packageSets.findtext("sequenceNumber")
)
# appinfo data
xml_root = ET.Element("application")
for key, val in dict(
{
"name": xml_data.find(".//application/name").text,
"platform": xml_data.find(".//application/platform").text,
"lbsurl": "http://ccmdl.adobe.com/AdobeProducts/KCCC/1/win32/CreativeCloudSet-Up.exe",
}
).items():
child = ET.Element(key)
child.text = str(val)
xml_root.append(child)
xml_packagesets = ET.SubElement(xml_root, "packageSets")
# create dir for sources files
zip_dir = os.path.join(CURR_PATH, "acc_sources")
os.makedirs(zip_dir, exist_ok=True)
# create packages dir
packages_dir = os.path.join(CURR_PATH, "packages")
os.makedirs(packages_dir, exist_ok=True)
for set in packageSets:
setName = set.find("name").text
installPath = set.find("installPath").text
if installPath == "[NOT-USED]":
continue
xml_packageSet = ET.SubElement(xml_packagesets, "packageSet")
for key, val in dict(
{
"name": setName,
"installPath": installPath,
"sequenceNumber": set.find("sequenceNumber").text,
}
).items():
child = ET.Element(key)
child.text = str(val)
xml_packageSet.append(child)
# create package
pkg_dir = os.path.join(packages_dir, setName)
os.makedirs(pkg_dir, exist_ok=True)
packages = set.findall(".//packages/package")
# sort by packageSet name
packages[:] = sorted(
packages, key=lambda packages: int(packages.findtext("sequenceNumber"))
)
xml_packages = ET.SubElement(xml_packageSet, "packages")
for pk in packages:
packageName = pk.find("name").text
manifestUrl = pk.find("manifestUrl").text
manifestXml = get_xml_data(package_cdn + manifestUrl)
# download sub package
sub_pkg_dir = os.path.join(pkg_dir, packageName)
os.makedirs(sub_pkg_dir, exist_ok=True)
assets = manifestXml.find(".//asset_list/asset/asset_path").text
print("\nDownloading package: " + packageName)
file_download(assets, zip_dir, sub_pkg_dir)
xml_package = ET.SubElement(xml_packages, "package")
for key, val in dict(
{
"name": packageName,
"sequenceNumber": pk.find("sequenceNumber").text,
"optional": pk.find("optional").text,
"pimxPath": "\\"
+ "\\".join([setName, packageName, packageName + ".pimx"]),
}
).items():
child = ET.Element(key)
child.text = str(val)
xml_package.append(child)
if pk.find("additionalInfo") is not None:
adInfo = pk.find("additionalInfo")
xml_pkg_adn = ET.SubElement(xml_package, "additionalInfo")
for elem in adInfo:
xml_pkg_adn.append(elem)
xml_filters = ET.SubElement(xml_packageSet, "filters")
xml_filter = ET.SubElement(xml_filters, "filter")
xml_filter.set("type", "operatingSystem")
xml_filter_config = ET.SubElement(xml_filter, "config")
xml_filter_config.text = winVer
if set.find("additionalInfo") is not None:
adInfo = set.find("additionalInfo")
xml_pkgSet_adn = ET.SubElement(xml_packageSet, "additionalInfo")
for elem in adInfo:
xml_pkgSet_adn.append(elem)
pkg_version = ET.SubElement(xml_root, "version")
pkg_version.text = xml_data.find(".//application/version").text
print("\nCreating ApplicationInfo.xml")
tree = ET.ElementTree(xml_root)
ET.indent(tree, space=" ", level=0)
xml_file = os.path.join(packages_dir, "ApplicationInfo.xml")
tree.write(xml_file, encoding="utf-8", xml_declaration=True)
if get_pim_dll(packages_dir):
print("\nSuccessfully downloaded installer files\n")
def get_pim_dll(packages_dir):
print("\nGetting AdobePIM.dll")
# create resources dir
res_dir = os.path.join(CURR_PATH, "resources")
os.makedirs(res_dir, exist_ok=True)
core_dir = os.path.join(packages_dir, "ADC", "Core")
dll_file = os.path.join(core_dir, "AdobePIM.dll")
pima_file = os.path.join(core_dir, "Core.pima")
if os.path.isfile(dll_file):
os.popen("copy " + dll_file + " " + res_dir)
elif os.path.isfile(pima_file):
with zipfile.ZipFile(pima_file) as pima:
for pim in pima.namelist():
if pim.endswith("AdobePIM.dll"):
pima.extract(pim, res_dir)
else:
print("Cannot found AdobePIM.dll! Please search manually or installer won't work")
return False
return True
if __name__ == "__main__": if __name__ == "__main__":
ye = int((32 - len(VERSION_STR)) / 2) parser = argparse.ArgumentParser()
print("=================================") parser.add_argument(
print("= Build Adobe Installer =") "-v", "--setupVersion", help="Version for Set-up.exe", action="store"
print(
"{} {} {}\n".format("=" * ye, VERSION_STR, "=" * (31 - len(VERSION_STR) - ye))
) )
parser.add_argument(
"-p", "--platform", help="ACCC platform", action="store"
)
args = parser.parse_args()
get_packages() show_info(SCRIPT_NAME, VERSION_STR, 6, '=')
accc_download()

File diff suppressed because it is too large Load Diff

78
suite_installer/APRO.xml Normal file
View File

@@ -0,0 +1,78 @@
<ProductInfo>
<Name>Adobe Acrobat Pro DC</Name>
<InstallerType>ThirdParty</InstallerType>
<HideProductLaunch>true</HideProductLaunch>
<Icons>
<Size20x19>
<path>./resources/icons/apro20x19.png</path>
</Size20x19>
<Size32x32>
<path>./resources/icons/apro32x32.png</path>
</Size32x32>
<Size44x42>
<path>./resources/icons/apro44x42.png</path>
</Size44x42>
<Size64x64>
<path>./resources/icons/apro64x64.png</path>
</Size64x64>
<Size88x84>
<path>./resources/icons/apro88x84.png</path>
</Size88x84>
<Size176x168>
<path>./resources/icons/apro176x168.png</path>
</Size176x168>
</Icons>
<ConflictingProcesses>
<ConflictingProcess>
<RegularExpression>^[Aa][Cc][Rr][Oo][Bb][Aa][Tt].[Ee][Xx][Ee]$</RegularExpression>
<ProcessDisplayName>Adobe Acrobat</ProcessDisplayName>
</ConflictingProcess>
<ConflictingProcess>
<RegularExpression>^[Aa][Cc][Aa][Dd].[Ee][Xx][Ee]$</RegularExpression>
<ProcessDisplayName>AutoCAD Application</ProcessDisplayName>
</ConflictingProcess>
<ConflictingProcess>
<RegularExpression>^[Ee][Xx][Cc][Ee][Ll]\.[Ee][Xx][Ee]$</RegularExpression>
<ProcessDisplayName>Microsoft Excel</ProcessDisplayName>
</ConflictingProcess>
<ConflictingProcess>
<RegularExpression>^[Oo][Uu][Tt][Ll][Oo][Oo][Kk]\.[Ee][Xx][Ee]$</RegularExpression>
<ProcessDisplayName>Microsoft Outlook</ProcessDisplayName>
</ConflictingProcess>
<ConflictingProcess>
<RegularExpression>^[Pp][Oo][Ww][Ee][Rr][Pp][Nn][Tt]\.[Ee][Xx][Ee]$</RegularExpression>
<ProcessDisplayName>Microsoft PowerPoint</ProcessDisplayName>
</ConflictingProcess>
<ConflictingProcess>
<RegularExpression>^[Vv][Ii][Ss][Ii][Oo]\.[Ee][Xx][Ee]$</RegularExpression>
<ProcessDisplayName>Microsoft Visio</ProcessDisplayName>
</ConflictingProcess>
<ConflictingProcess>
<RegularExpression>^[Vv][Ii][Ss][Ii][Oo]32\.[Ee][Xx][Ee]$</RegularExpression>
<ProcessDisplayName>Microsoft Visio</ProcessDisplayName>
</ConflictingProcess>
<ConflictingProcess>
<RegularExpression>^[Ww][Ii][Nn][Ww][Oo][Rr][Dd]\.[Ee][Xx][Ee]$</RegularExpression>
<ProcessDisplayName>Microsoft Word</ProcessDisplayName>
</ConflictingProcess>
</ConflictingProcesses>
<InstallData>
<ThirdPartyData>
<CodexVersion>22.3</CodexVersion>
<Platform>win64</Platform>
<EsdDirectory>./products/APRO</EsdDirectory>
<InstallSize>1636827136</InstallSize>
<DefaultInstallDir>[AdobeProgramFiles]</DefaultInstallDir>
<InstallCommand>
<Path>Setup.exe</Path>
<Arguments>
<Argument>/sAll</Argument>
<Argument>/msi INSTALLDIR="[InstallDir]\Acrobat DC" LANG_LIST=[InstallLanguage] EULA_ACCEPT=YES SUITEMODE=1 OWNERSHIP_STATE=1 IGNOREAAM=1</Argument>
</Arguments>
<SuccessExitCodes>
<ExitCode>0</ExitCode>
</SuccessExitCodes>
</InstallCommand>
</ThirdPartyData>
</InstallData>
</ProductInfo>

22
suite_installer/Readme.md Normal file
View File

@@ -0,0 +1,22 @@
## Folder structure:
```
.\packages
.\products
.\resources
.\Set-up.exe
```
## How to
1. Download desired products.
2. Move all packages folders to products (No need to move __prefix__Driver.xml files)
3. Copy Set-up.exe and packages files to current folder
4. Copy AdobePIM.dll to resources folder
5. Run gen-suite.py
```
python gen-suite.py
python gen-suite.py -d "./../products"
````
6. SuiteInfo.xml can be found in products directory. (You can manually edit too)
### Note
1. Acrobat Pro DC is not HD installer type. You can manually edit SuiteInfo.xml (use APRO.xml file) and add acrobat installer files to products folder.

View File

@@ -0,0 +1,188 @@
import os
import io
import sys
import json
import argparse
from pathlib import Path
import xml.etree.ElementTree as ET
prodsDir = "./products"
SCRIPT_NAME = "Suite Info xml generator"
VERSION_STR = "1.0.00"
def show_info(name: str, version: str, pad: int, bdr: str) -> None:
"""Show script information"""
tl = len(name) + (pad * 2)
print(bdr * tl)
print(bdr + name.center(tl - 2) + bdr)
print(version.center(tl, bdr))
def icon_list(elem, sap):
sap = sap.lower()
icons = ET.SubElement(elem, "Icons")
list = ["20x19", "32x32", "44x42", "64x64", "88x84", "176x168"]
for ic in list:
ico = ET.SubElement(icons, f"Size{ic}")
path = ET.SubElement(ico, "path")
path.text = f"./resources/icons/{sap}{ic}.png"
def calc_sizes(data):
pkgs = data["Packages"]["Package"]
size = 0
for tmp in pkgs:
size += int(tmp.get("ExtractSize"))
return str(size)
def add_product(elem):
pDir = Path(prodsDir)
paths = [str(item) for item in pDir.rglob('*/') if item.is_dir()]
if len(paths) < 1:
print("\nNo products found in products directory")
sys.exit("\nBye")
print("\nGenerating ...")
langs = []
for p in paths:
file = os.path.join(".", p, "Application.json")
if Path(file).is_file() == False:
continue
with open(file, "r", encoding='utf-8') as f:
data = json.load(f)
if data.get("AddRemoveInfo") and data.get("IsSTI") is False:
sapCode = data.get("SAPCode")
prod = ET.SubElement(elem, "ProductInfo")
name = ET.SubElement(prod, "Name")
name.text = data["AddRemoveInfo"]["DisplayName"]["Language"][0]["value"]
type = ET.SubElement(prod, "InstallerType")
type.text = "HD"
hide = ET.SubElement(prod, "HideProductLaunch")
hide.text = "true"
icon_list(prod, sapCode)
insData = ET.SubElement(prod, "InstallData")
hdData = ET.SubElement(insData, "HDData")
for k, v in dict({
"SAPCode": sapCode,
"CodexVersion" : data.get("CodexVersion"),
"BaseVersion": data.get("BaseVersion"),
"Platform": data.get("Platform"),
"EsdDirectory": f"{prodsDir}/{sapCode}",
"InstallSize": calc_sizes(data),
}).items():
x = ET.SubElement(hdData, k)
x.text = v
supLangs = data["SupportedLanguages"]["Language"]
for k in supLangs:
if k["locale"] not in langs:
langs.append(k["locale"])
if data.get("Dependencies"):
deps = ET.SubElement(hdData, "Dependencies")
depList = data["Dependencies"]["Dependency"]
for d in depList:
esdDir = f"{prodsDir}/{d.get("SAPCode")}"
depJson = os.path.join(Path(esdDir), "Application.json")
with open(depJson, "r", encoding='utf-8') as f:
depData = json.load(f)
size = calc_sizes(depData)
dPkg = ET.SubElement(deps, "Dependency")
for k, v in dict({
"SAPCode": d.get("SAPCode"),
"BaseVersion": d.get("BaseVersion"),
"EsdDirectory": esdDir,
"InstallSize": size or "0",
}).items():
x = ET.SubElement(dPkg, k)
x.text = v
if sapCode == "LTRM":
requestInfo = ET.SubElement(insData, "RequestInfo")
reqSub = ET.SubElement(requestInfo, "IsEnterpriseDeployment")
reqSub.text = "true"
return langs
def gen_suiteinfo():
'''
Generate SuiteInfo.xml for suite like installer
'''
suiteInfo = ET.Element("SuiteInfo")
tmp = ET.SubElement(suiteInfo, "SuiteName")
tmp.text = suiteName
tmp = ET.SubElement(suiteInfo, "CodexVersion")
tmp.text = suiteVer
supLangs = ET.SubElement(suiteInfo, "SupportedLanguages")
infoList = ["IsNonCCSuite", "IsAAMRequired", "IsCCDRequired"]
for inf in infoList:
tmp = ET.SubElement(suiteInfo, inf)
tmp.text = "false"
icon_list(suiteInfo, "cloud")
products = ET.SubElement(suiteInfo, "ProductInfos")
langs = add_product(products)
for sl in langs:
# remove mul from locale list
if sl == "mul":
continue
tmp = ET.SubElement(supLangs, "Locale")
tmp.text = sl
tree = ET.ElementTree(suiteInfo)
ET.indent(tree, space=" ", level=0)
xml_file = os.path.join(prodsDir, "SuiteInfo.xml")
xml_declaration = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n'
with io.open(xml_file, "wb") as f:
f.write(xml_declaration.encode("utf-8"))
tree.write(f, encoding="utf-8", xml_declaration=False)
print(f"\nSuccessfully generated: {os.path.realpath(xml_file)}\n")
if __name__ == "__main__":
"""Get command-line parameters"""
parser = argparse.ArgumentParser()
parser.add_argument(
"-d", "--prodsDir", help="Products directory", action="store"
)
parser.add_argument(
"-n", "--suiteName", help="Name for suite", action="store"
)
parser.add_argument(
"-v", "--suiteVer", help="Suite version number", action="store"
)
args = parser.parse_args()
show_info(SCRIPT_NAME, VERSION_STR, 10, "=")
suiteName = args.suiteName
while suiteName is None:
suiteName = (input("\nPlease enter a name for suite: ").strip() or "Adobe Creative Cloud")
suiteVer = args.suiteVer
while suiteVer is None:
suiteVer = (input("\nPlease enter suite version: ").strip() or "1.0")
prodsDir = args.prodsDir or prodsDir
print(f"\nSuiteInfo.xml file will be save in {os.path.realpath(prodsDir)}")
gen_suiteinfo()

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Config><UIConfig><HideVersion>false</HideVersion><SkipLaunch>true</SkipLaunch><HidePIIScreen>false</HidePIIScreen><showMainScreen>true</showMainScreen><showDownloadOptionScreen>true</showDownloadOptionScreen><ShowInstallOptions>true</ShowInstallOptions><SkipAccLaunch>true</SkipAccLaunch></UIConfig></Config>

View File

@@ -0,0 +1,8 @@
{
"Name": "Výukové lekce k aplikaci Photoshop 2021",
"SubTitle": "Začněte, naučte se základy a nechte se inspirovat.",
"Operating1xWin": "Windows 10 version 1809 (64bitová verze) (minimální požadavek)",
"OperatingSystemMac": "Mac OS 10.14 (minimální požadavek)",
"Memory": "Instalace aplikace vyžaduje alespoň 8 GB paměti RAM",
"TextSlide1": "Plná náruč kreativity"
}

View File

@@ -0,0 +1,8 @@
{
"Name": "Photoshop 2021 – Tutorials",
"SubTitle": "Erste Schritte, Grundlagen, Inspirationen.",
"Operating1xWin": "Windows 10 version 1809 (64-Bit) (mindestens erforderlich)",
"OperatingSystemMac": "Mac OS 10.14 (mindestens erforderlich)",
"Memory": "Sie benötigen mindestens 8 GB RAM, um die Anwendung zu installieren",
"TextSlide1": "Kreativität für alle."
}

View File

@@ -0,0 +1,8 @@
{
"Name": "Photoshop 2021 tutorials",
"SubTitle": "Get started, get the essentials, get inspired.",
"Operating1xWin": "Windows 10 version 1809 (64-bit) (Minimum required)",
"OperatingSystemMac": "Mac OS 10.14 (Minimum required)",
"Memory": "You need minimum 8Gb RAM to install the application",
"TextSlide1": "Creativity for all."
}

View File

@@ -0,0 +1,8 @@
{
"Name": "Tutoriales de Photoshop 2021",
"SubTitle": "Empiece, descubra los fundamentos y encuentre inspiración.",
"Operating1xWin": "Windows 10 version 1809 (64 bits) (mínimo requerido)",
"OperatingSystemMac": "Mac OS 10.14 (mínimo requerido)",
"Memory": "Se necesita un mínimo de 8 GB de RAM para instalar la aplicación",
"TextSlide1": "Creatividad para todos"
}

View File

@@ -0,0 +1,8 @@
{
"Name": "Tutoriels Photoshop 2021",
"SubTitle": "Lancez-vous, saisissez l'essentiel, soyez inspiré.",
"Operating1xWin": "Windows 10 version 1809 (minimum requis)",
"OperatingSystemMac": "Mac OS 10.14 (minimum requis)",
"Memory": "Vous avez besoin de 8 Go de mémoire vive minimum pour installer l'application.",
"TextSlide1": "La créativité pour tous.",
}

View File

@@ -0,0 +1,9 @@
{
"Name": "Esercitazioni di Photoshop 2021",
"SubTitle": "Iniziate, raccogliete tutto ciò che vi serve e lasciatevi ispirare.",
"Operating1xWin": "Windows 10 version 1809 (64 bit) (versione minima richiesta)",
"OperatingSystemMac": "Mac OS 10.14 (versione minima richiesta)",
"Memory": "Sono necessari almeno 8 Gb di RAM per installare l'applicazione",
"TextSlide1": "Colora consente di ricolorare le fotografie in bianco e nero.",
"TextSlide2": "Creatività per tutti."
}

View File

@@ -0,0 +1,8 @@
{
"Name": "Photoshop 2021 チュートリアル",
"SubTitle": "はじめに、基本事項を学び、ヒントを得てください。",
"Operating1xWin": "Windows 10 version 1809 (64-bit) (以上)",
"OperatingSystemMac": "Mac OS 10.14 (以上)",
"Memory": "アプリケーションをインストールするには、最低 8GB の RAM が必要です。",
"TextSlide1": "すべての人に「つくる力」を"
}

View File

@@ -0,0 +1,8 @@
{
"Name": "Photoshop 2021 자습서",
"SubTitle": "시작하여 필수 기능을 이용해 보십시오.",
"Operating1xWin": "Windows 10 version 1809 (64비트)(최소 요구 사양)",
"OperatingSystemMac": "Mac OS 10.14(최소 요구 사양)",
"Memory": "애플리케이션을 설치하려면 최소 8GB의 RAM이 필요합니다.",
"TextSlide1": "모두를 위한 크리에이티브"
}

View File

@@ -0,0 +1,8 @@
{
"Name": "Zelfstudies voor Photoshop 2021",
"SubTitle": "Ga aan de slag met handige tools en laat u inspireren.",
"Operating1xWin": "Windows 10 version 1809 (64-bits) (minimaal vereist)",
"OperatingSystemMac": "Mac OS 10.14 (minimaal vereist)",
"Memory": "U hebt minimaal 8 GB RAM nodig om de toepassing te installeren",
"TextSlide1": "Creativiteit voor iedereen."
}

View File

@@ -0,0 +1,8 @@
{
"Name": "Samouczki programu Photoshop 2021",
"SubTitle": "Rozpocznij, poznaj wszystkie podstawy, zainspiruj się.",
"Operating1xWin": "Windows 10 version 1809 (64-bitowy) (minimalna wymagana wersja)",
"OperatingSystemMac": "Mac OS 10.14 (minimalna wymagana wersja)",
"Memory": "Do instalacji aplikacji wymagane są co najmniej 8 GB pamięci RAM.",
"TextSlide1": "Kreatywność dla wszystkich"
}

View File

@@ -0,0 +1,8 @@
{
"Name": "Руководства по Photoshop 2021",
"SubTitle": "Создавайте работы, узнавайте новое, получайте вдохновение.",
"Operating1xWin": "Windows 10 версия 1809 (64-разрядная) (минимально допустимая версия)",
"OperatingSystemMac": "Mac OS 10.14 (минимально допустимая версия)",
"Memory": "Для установки приложения требуется минимум 8 ГБ ОЗУ",
"TextSlide1": "Проявить себя в творчестве может каждый!"
}

View File

@@ -0,0 +1,8 @@
{
"Name": "Självstudiekurser för Photoshop 2021",
"SubTitle": "Kom igång, lär dig det grundläggande och bli inspirerad.",
"Operating1xWin": "Windows 10 version 1809 (64-bitars) krävs",
"OperatingSystemMac": "macOS 10.14 krävs",
"Memory": "Om du vill installera programmet måste du ha minst 8 GB med RAM-minne",
"TextSlide1": "Kreativitet för alla."
}

View File

@@ -0,0 +1,8 @@
{
"Name": "Photoshop 2021 教程",
"SubTitle": "快速入门,获得必备工具,获得灵感。",
"Operating1xWin": "Windows 10 version 1809 (64 位)(最低要求)",
"OperatingSystemMac": "Mac OS 10.14(最低要求)",
"Memory": "您至少需要 8GB RAM 才能安装此应用程序",
"TextSlide1": "人人都能發揮創意"
}

View File

@@ -0,0 +1,8 @@
{
"Name": "Photoshop 2021 教學課程",
"SubTitle": "開始使用、瞭解基本知識、取得靈感。",
"Operating1xWin": "Windows 10 version 1809 (64 位元) (最低需求)",
"OperatingSystemMac": "Mac OS 10.14 (最低需求)",
"Memory": "您需要至少 8 GB 的 RAM 才能安裝應用程式",
"TextSlide1": "人人都能發揮創意"
}

View File

@@ -0,0 +1,72 @@
$(document).ready(function () {
cecInit();
})
function cecInit() {
var jsonData;
var locale = getParameterByName('locale');
var isHighDpi = getParameterByName('isHighDpi');
cecGetLocaleJson(locale);
}
function resizeWin() {
myWindow.resizeTo(455, 239);
}
var slideIndex = 0;
showSlides();
function showSlides() {
var i;
var slides = document.getElementsByClassName("mySlides");
for (i = 0; i < slides.length; i++) {
console.log(slides[i]);
slides[i].style.opacity = "0";
slides[i].style.visibility = "hidden";
}
slideIndex++;
if (slideIndex > slides.length) {slideIndex = 1}
slides[slideIndex-1].style.opacity = "1";
slides[slideIndex-1].style.visibility = "visible";
var x = document.getElementsByTagName('video');
if (slideIndex == 1) {
x[0].currentTime = 0;
}
setTimeout(showSlides, 17500); // Change image every 17.50 seconds
}
function getParameterByName(name) {
name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
results = regex.exec(location.search);
return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}
function cecGetLocaleJson(locale)
{
console.log("cecGetLocaleJson");
var jsonLocation = "Dictionary/" + locale + "/locale.json";
$.getJSON(jsonLocation, function (data) {
cecDisplayContent(data, locale);
})
.fail(function () {
if(locale == "en_US") {
return;
}
cecGetLocaleJson("en_US");
})
}
function cecDisplayContent(data, locale)
{
var lcl = locale.slice(3,5);
var url = "http://www.adobe.com/"+lcl.toLowerCase()+"/creativecloud.html";
if(locale == "en_us" || locale == "en_US") {
url = "http://www.adobe.com/creativecloud.html";
}
document.getElementById("slideContainer").onclick =function() { parent.cecExternalLink(url) };
document.getElementById("slideText1").innerHTML = data["TextSlide1"];
}

View File

@@ -0,0 +1,7 @@
@charset "utf-8";
@font-face {
font-family: 'AdobeClean';
src: url('fonts/adobeclean/adobeclean-regular-webfont.woff') format('woff');
font-weight: normal;
font-style: normal;
}

View File

@@ -0,0 +1,91 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>PHSP installer slideshow</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="css/styles.css">
<style>
html {
background-color: #fff;
}
* {box-sizing: border-box;}
body {
margin:0px;}
.mySlides {opacity: 0; position: absolute; transition: all 1s;}
img {vertical-align: middle;}
/* Slideshow container */
.slideshow-container {
max-width: 445px;
position: relative;
margin: auto;
cursor: pointer;
}
/* Caption text */
.text {
font-family: 'AdobeClean', Helvetica, Arial, sans-serif;
color: #000;
font-weight: 450;
font-size: 15px;
letter-spacing: .3;
padding-left: 30px;
position: absolute;
bottom: 95px;
width: 35%;
text-align: center;
}
/* Number text (1/3 etc) */
.numbertext {
font-family: 'AdobeClean', Helvetica, Arial, sans-serif;
color: #f2f2f2;
font-size: 12px;
padding: 8px 12px;
position: absolute;
top: 0;
}
.active {
background-color: #717171;
}
/* Fading animation */
.fade {
-webkit-animation-name: fade;
-webkit-animation-duration: 1s;
animation-name: fade;
animation-duration: 1s;
}
@-webkit-keyframes fade {
from {opacity: .7}
to {opacity: 1}
}
@keyframes fade {
from {opacity: .1}
to {opacity: 1}
}
/* On smaller screens, decrease text size */
@media only screen and (max-width: 300px) {
.text {font-size: 11px}
}
</style>
</head>
<body>
<div class="slideshow-container" id="slideContainer" href="#">
<div class="mySlides fade" style="opacity: 0; visibility: hidden;">
<video class="videos" autoplay loop muted style="width: 445px; height: 239px;"><source src="images/01_creativity_for_all_445x239.mp4" style="width: 445px; height: 239px;"></video>
<div class="text" id="slideText1">Creativity for all.</div>
</div>
</div>
<script type="text/javascript" src="lib/jquery.min.js"></script>
<script type="text/javascript" src="carousel.js"></script>
</body>
</html>

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 933 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 915 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 769 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 640 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 448 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 893 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 910 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 579 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 876 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 900 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 847 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 789 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 514 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 933 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 411 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 842 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 737 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 474 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 986 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 862 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 467 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 957 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 880 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Some files were not shown because too many files have changed in this diff Show More