CC Libraries API & Adobe Fraud.

Anyone, especially newbies, asking for help with Photoshop Scripting and Photoshop Automation - as opposed to those contributing to discussion about an aspect of Photoshop Scripting

Moderators: Tom, Kukurykus

artfabrique
Posts: 1
Joined: Tue Jan 10, 2017 10:38 am

CC Libraries API & Adobe Fraud.

Post by artfabrique »

Hi there!
Recently Adobe introduced Creative Cloud Libraries Panel and it became vital while developing any User Interface Design in Photoshop.
Libraries allow to organize hundreds of elements (sprites, icons, panels, fx) in a very handy way and allow to share it all accross big team.
I'm a UI/UX Lead in game development company and we utilize full circle of Node.js + Adobe Generator + JSX in our production pipeline.

Creative Cloud Libraries have one HUGE issue. Library owner can not be changed. That's done INTENTIONALLY to prevent users from creating new corporate accounts with a "first year discount". And this fraud mechanics is not mentioned anywhere. So at the end we have corporate account that owns all libraries and there is NO way to trnsfer ownership to another account. The only thing you can do with CC Library is to "Share it" with other account and allow to edit it. When original owner deletes library it desappears forever for everyone. There is an option to "Copy Shared CC Library" to own cloud storage BUT as a result all the links in the PSD file will be broken because they will point to an old CC Library.

I'd love to get help or even pay something for the development of a panel that will allow to Batch-relink Creative Cloud Library elements to other libraries.

How this panel should work in a first iteration (usability level: programmer :D ):

1. Panel gets all linked CCL (Creative cloud Library) layers from opened PSD.
2. Panel gets all library names which is used in that PSD.
3. User inputs copied library names near each found library name in opened PSD.
4. Script iterates througth all found CCL layers and replaces links to copied library.
5..
6. Profit. Now we relinked all CCL elements to new copied libraries and thats how you change library owner.

Here is my research of DOM model for SINGLE linked CC library smartobject.
Just open this script in the ESTK, connect to Photoshop, run it and look into the console
https://dl.dropbox.com/s/p6rjk2do8jp27c ... ucture.jsx

Legend:
property_name(type_id) = value :: property_type

> - if property is object iterate throuth its fields, read|write flag
... - tree level

Code: Select all


name(1315774496) = common_menu_arrow :: DescValueType.STRINGTYPE
color(1131180576) = 1131180576 :: DescValueType.ENUMERATEDTYPE
visible(1450402412) = true :: DescValueType.BOOLEANTYPE
mode(1298407456) = 1114402381 :: DescValueType.ENUMERATEDTYPE
opacity(1332765556) = 255 :: DescValueType.INTEGERTYPE
layerID(1283027529) = 117 :: DescValueType.INTEGERTYPE
itemIndex(1232366921) = 14 :: DescValueType.INTEGERTYPE
count(1131312160) = 24 :: DescValueType.INTEGERTYPE
preserveTransparency(1349677908) = false :: DescValueType.BOOLEANTYPE
layerFXVisible(1818654838) = false :: DescValueType.BOOLEANTYPE
globalAngle(1734503489) = 90 :: DescValueType.INTEGERTYPE
background(1113811815) = false :: DescValueType.BOOLEANTYPE
layerSection(1477) = 4018 :: DescValueType.ENUMERATEDTYPE
layerLocking(387) = layerLocking(387) :: DescValueType.OBJECTTYPE
> count : number , readonly
> typename : string , readonly
> __proto__ : Object , readwrite
...protectTransparency(1628) = false :: DescValueType.BOOLEANTYPE
...protectComposite(1629) = false :: DescValueType.BOOLEANTYPE
...protectPosition(1630) = false :: DescValueType.BOOLEANTYPE
...protectArtboardAutonest(4019) = false :: DescValueType.BOOLEANTYPE
...protectAll(1631) = false :: DescValueType.BOOLEANTYPE

group(1198683504) = false :: DescValueType.BOOLEANTYPE
targetChannels(3242) = [ActionList] :: DescValueType.LISTTYPE
visibleChannels(3243) = [ActionList] :: DescValueType.LISTTYPE
channelRestrictions(1294) = [ActionList] :: DescValueType.LISTTYPE
fillOpacity(1295) = 255 :: DescValueType.INTEGERTYPE
hasUserMask(2319) = false :: DescValueType.BOOLEANTYPE
hasVectorMask(2320) = false :: DescValueType.BOOLEANTYPE
proportionalScaling(3244) = false :: DescValueType.BOOLEANTYPE
layerKind(3240) = 5 :: DescValueType.INTEGERTYPE
hasFilterMask(3257) = false :: DescValueType.BOOLEANTYPE
userMaskDensity(1296) = 255 :: DescValueType.INTEGERTYPE
userMaskFeather(1297) = 0 :: DescValueType.DOUBLETYPE
vectorMaskDensity(1298) = 255 :: DescValueType.INTEGERTYPE
vectorMaskFeather(1299) = 0 :: DescValueType.DOUBLETYPE
bounds(1434) = rectangle(1382249582) :: DescValueType.OBJECTTYPE
> count : number , readonly
> typename : string , readonly
> __proto__ : Object , readwrite
...top(1416589344) = 564 :: DescValueType.UNITDOUBLE
...left(1281713780) = 536 :: DescValueType.UNITDOUBLE
...bottom(1114926957) = 581 :: DescValueType.UNITDOUBLE
...right(1382508660) = 564 :: DescValueType.UNITDOUBLE
...width(1466201192) = 28 :: DescValueType.UNITDOUBLE
...height(1214736500) = 17 :: DescValueType.UNITDOUBLE

boundsNoEffects(3966) = rectangle(1382249582) :: DescValueType.OBJECTTYPE
> count : number , readonly
> typename : string , readonly
> __proto__ : Object , readwrite
...top(1416589344) = 564 :: DescValueType.UNITDOUBLE
...left(1281713780) = 536 :: DescValueType.UNITDOUBLE
...bottom(1114926957) = 581 :: DescValueType.UNITDOUBLE
...right(1382508660) = 564 :: DescValueType.UNITDOUBLE
...width(1466201192) = 28 :: DescValueType.UNITDOUBLE
...height(1214736500) = 17 :: DescValueType.UNITDOUBLE

boundsNoMask(3965) = rectangle(1382249582) :: DescValueType.OBJECTTYPE
> count : number , readonly
> typename : string , readonly
> __proto__ : Object , readwrite
...top(1416589344) = 564 :: DescValueType.UNITDOUBLE
...left(1281713780) = 536 :: DescValueType.UNITDOUBLE
...bottom(1114926957) = 581 :: DescValueType.UNITDOUBLE
...right(1382508660) = 564 :: DescValueType.UNITDOUBLE
...width(1466201192) = 28 :: DescValueType.UNITDOUBLE
...height(1214736500) = 17 :: DescValueType.UNITDOUBLE

smartObject(919) = smartObject(919) :: DescValueType.OBJECTTYPE
> count : number , readonly
> typename : string , readonly
> __proto__ : Object , readwrite
...placed(2476) = 2476 :: DescValueType.ENUMERATEDTYPE
...documentID(1148150601) = xmp.did:fddb4c8a-e616-fe45-b4e4-a4843fb016c6 :: DescValueType.STRINGTYPE
...compsList(3249) = null(1853189228) :: DescValueType.OBJECTTYPE
...> count : number , readonly
...> typename : string , readonly
...> __proto__ : Object , readwrite
......compID(344) = -1 :: DescValueType.INTEGERTYPE
......originalCompID(3203) = -1 :: DescValueType.INTEGERTYPE

...linked(1282304868) = true :: DescValueType.BOOLEANTYPE
...fileReference(1181314130) = common_menu_arrow.psd :: DescValueType.STRINGTYPE
...link(1282304800) = ccLibrariesElement(3118) :: DescValueType.OBJECTTYPE
...> count : number , readonly
...> typename : string , readonly
...> __proto__ : Object , readwrite
......elementReference(591752274) = cloud-asset://cc-api-storage.adobe.io/assets/adobe-libraries/1fdc8600-4216-4504-ba91-b7b897582164;node=b7e9d629-c9bf-4a32-8423-90060a7439ce :: DescValueType.STRINGTYPE
......name(1315774496) = common_menu_arrow :: DescValueType.STRINGTYPE
......libraryName(3117) = SA icons :: DescValueType.STRINGTYPE
......dateModified(3119) = 1476962482458 :: DescValueType.DOUBLETYPE
......adobeStockId(3120) = :: DescValueType.STRINGTYPE
......adobeStockLicenseState(3121) = 3121 :: DescValueType.ENUMERATEDTYPE

...linkMissing(3970) = false :: DescValueType.BOOLEANTYPE
...linkChanged(3971) = false :: DescValueType.BOOLEANTYPE

useAlignedRendering(1309) = false :: DescValueType.BOOLEANTYPE
generatorSettings(3991) = generatorSettings(3991) :: DescValueType.OBJECTTYPE
> count : number , readonly
> typename : string , readonly
> __proto__ : Object , readwrite

keyOriginType(352) = [ActionList] :: DescValueType.LISTTYPE
fillEnabled(1198) = false :: DescValueType.BOOLEANTYPE
animationProtection(4021) = animationProtection(4021) :: DescValueType.OBJECTTYPE
> count : number , readonly
> typename : string , readonly
> __proto__ : Object , readwrite
...animationUnifyPosition(1314) = false :: DescValueType.BOOLEANTYPE
...animationUnifyEffects(1315) = false :: DescValueType.BOOLEANTYPE
...animationUnifyVisibility(1316) = false :: DescValueType.BOOLEANTYPE
...animationPropagate(1317) = true :: DescValueType.BOOLEANTYPE

artboard(377) = artboard(377) :: DescValueType.OBJECTTYPE
> count : number , readonly
> typename : string , readonly
> __proto__ : Object , readwrite
...artboardRect(973) = classFloatRect(974) :: DescValueType.OBJECTTYPE
...> count : number , readonly
...> typename : string , readonly
...> __proto__ : Object , readwrite
......top(1416589344) = 0 :: DescValueType.DOUBLETYPE
......left(1281713780) = 0 :: DescValueType.DOUBLETYPE
......bottom(1114926957) = 0 :: DescValueType.DOUBLETYPE
......right(1382508660) = 0 :: DescValueType.DOUBLETYPE

...guideIDs(4023) = [ActionList] :: DescValueType.LISTTYPE
...artboardPresetName(4024) = :: DescValueType.STRINGTYPE
...color(1131180576) = RGBColor(1380401731) :: DescValueType.OBJECTTYPE
...> count : number , readonly
...> typename : string , readonly
...> __proto__ : Object , readwrite
......red(1382293536) = 255 :: DescValueType.DOUBLETYPE
......grain(1198681632) = 255 :: DescValueType.DOUBLETYPE
......blue(1114382368) = 255 :: DescValueType.DOUBLETYPE

...artboardBackgroundType(4025) = 1 :: DescValueType.INTEGERTYPE

artboardEnabled(1322) = false :: DescValueType.BOOLEANTYPE
vectorMaskEnabled(1311) = false :: DescValueType.BOOLEANTYPE
vectorMaskEmpty(3258) = true :: DescValueType.BOOLEANTYPE
textWarningLevel(3259) = 0 :: DescValueType.INTEGERTYPE
smartObjectMore(4022) = null(1853189228) :: DescValueType.OBJECTTYPE
> count : number , readonly
> typename : string , readonly
> __proto__ : Object , readwrite
...ID(1231318644) = 30a07a6e-d666-11e6-96ef-93fdf85a80f9 :: DescValueType.STRINGTYPE
...placed(2476) = 30a07a41-d666-11e6-96ef-93fdf85a80f9 :: DescValueType.STRINGTYPE
...pageNumber(1348947565) = 1 :: DescValueType.INTEGERTYPE
...totalPages(3199) = 1 :: DescValueType.INTEGERTYPE
...crop(1131573104) = 1 :: DescValueType.INTEGERTYPE
...frameStep(3200) = null(1853189228) :: DescValueType.OBJECTTYPE
...> count : number , readonly
...> typename : string , readonly
...> __proto__ : Object , readwrite
......numerator(2383) = 0 :: DescValueType.INTEGERTYPE
......denominator(2384) = 600 :: DescValueType.INTEGERTYPE

...duration(1074) = null(1853189228) :: DescValueType.OBJECTTYPE
...> count : number , readonly
...> typename : string , readonly
...> __proto__ : Object , readwrite
......numerator(2383) = 0 :: DescValueType.INTEGERTYPE
......denominator(2384) = 600 :: DescValueType.INTEGERTYPE

...frameCount(3201) = 1 :: DescValueType.INTEGERTYPE
...antiAliasType(1097756276) = 16 :: DescValueType.INTEGERTYPE
...type(1417244773) = 2 :: DescValueType.INTEGERTYPE
...transform(1416785510) = [ActionList] :: DescValueType.LISTTYPE
...nonAffineTransform(3202) = [ActionList] :: DescValueType.LISTTYPE
...warp(879) = warp(879) :: DescValueType.OBJECTTYPE
...> count : number , readonly
...> typename : string , readonly
...> __proto__ : Object , readwrite
......warpStyle(1436) = 1436 :: DescValueType.ENUMERATEDTYPE
......warpValue(1437) = 0 :: DescValueType.DOUBLETYPE
......warpPerspective(1438) = 0 :: DescValueType.DOUBLETYPE
......warpPerspectiveOther(1439) = 0 :: DescValueType.DOUBLETYPE
......warpRotate(1440) = 1332899444 :: DescValueType.ENUMERATEDTYPE
......bounds(1434) = rectangle(1382249582) :: DescValueType.OBJECTTYPE
......> count : number , readonly
......> typename : string , readonly
......> __proto__ : Object , readwrite
.........top(1416589344) = 0 :: DescValueType.UNITDOUBLE
.........left(1281713780) = 0 :: DescValueType.UNITDOUBLE
.........bottom(1114926957) = 21 :: DescValueType.UNITDOUBLE
.........right(1382508660) = 32 :: DescValueType.UNITDOUBLE

......uOrder(1441) = 4 :: DescValueType.INTEGERTYPE
......vOrder(1442) = 4 :: DescValueType.INTEGERTYPE

...size(1400512544) = paint(1349415968) :: DescValueType.OBJECTTYPE
...> count : number , readonly
...> typename : string , readonly
...> __proto__ : Object , readwrite
......width(1466201192) = 32 :: DescValueType.DOUBLETYPE
......height(1214736500) = 21 :: DescValueType.DOUBLETYPE

...resolution(1383296116) = 72 :: DescValueType.UNITDOUBLE
...comp(1668246896) = -1 :: DescValueType.INTEGERTYPE
...compInfo(3185) = null(1853189228) :: DescValueType.OBJECTTYPE
...> count : number , readonly
...> typename : string , readonly
...> __proto__ : Object , readwrite
......compID(344) = -1 :: DescValueType.INTEGERTYPE
......originalCompID(3203) = -1 :: DescValueType.INTEGERTYPE
Test psd:
https://dl.dropbox.com/s/uwdbmulv63jkbt ... onTest.psd

Test Library
https://adobe.ly/2iZNGkB

CC Library JSON (also has other my libraries) can be found at c:\Users\__USERNAME__\AppData\Roaming\Adobe\Creative Cloud Libraries\LIBS\
https://dl.dropbox.com/s/r0umljdp5221p5 ... lookupfile

Source code for Creative cloud library panel with prettified main.js (its stil compiled with AMD/requirejs but readable)
https://dl.dropbox.com/s/6g8x3dbvon6yhs ... l.html.rar
Look for word "Chosen" in main.js - this is the event when relinking to another CC Library element happens.

Finaly the dev project for CC Library Migration panel Jetbrains Webstorm project (uses Grunt + Nodejs for extension deployment)
https://github.com/artfabrique/CC-Libra ... ree/master

Here comes the problems:
ScriptListener DOES NOT recording anything when you "Relink To CC Library Item" but thy still have API and after hacking into CC Libraries panel into main.js i've catched that they dispatch an event with data:

Code: Select all


{"requestRef":{"docAndLayerIDs":"197/117"},"elementRef":"cloud-asset://cc-api-storage.adobe.io/assets/
adobe-libraries/1fdc8600-4216-4504-b391-b7b897582164;node=d438cab2-c103-4644-b5d8-313db4cf8aaZ","name":"common_icon_power_XS","libraryName":"SA icons","modifiedTime":1480685831931,"creationTime":1480685831911,"data":["C:/Users/a.vinogradov/AppData/Roaming/Adobe/Creative Cloud Libraries/LIBS/17BS6582520302C5oA49OD4D_AdobeID/creative_cloud/dox/1fdc8600-4216-4504-b391-b7b897582164/components/639c717e-d305-4348-8ba7-cc5cd6d21f74.psd"]}
Image

Video:
http://take.ms/MsStz

I've found couple ActionDescriptors but i completely dont know how to use them..
Image

sTID('placedLayerRelinkToLibraries');
sTID('ccLibrariesElement');
etc..

If there where a way just to replace couple strings and numbers in PSD dom for smartobject desctiptor..