diff options
author | Vilém Duha <vilda.novak@gmail.com> | 2020-07-09 10:00:56 +0300 |
---|---|---|
committer | Vilém Duha <vilda.novak@gmail.com> | 2020-07-12 19:07:58 +0300 |
commit | 6f7c4230af8e404d9fa9687b80ee8e7f3f8eac1d (patch) | |
tree | be5b3f6a2c859ed27078378d0a19bffbcf7e56f0 | |
parent | 37c2aacdb240fc6fd279d9f3b53cd37b88d90bfa (diff) |
BlenderKit: fix T70890
this is a complex fix that required to change some basic behaviours.
- the temp folder from blenderkit_data was moved to system temp folder
- There's a cleanup function for the old folder.
- search itself doesn't create files on drive(this rework will continue to try not to write also some other data, like gravatars, but cache them in mem only)
further fixes:
- assetbar woudln't draw if there wasn't a thumbnail in an asset
- categories panel poll function was fixed for brushes
- fetching tokens from rerequests wasn't writing them into prefs
TODO: create a popup that asks if categories can be downloaded and an example search can be performed.
-rw-r--r-- | blenderkit/__init__.py | 19 | ||||
-rw-r--r-- | blenderkit/bkit_oauth.py | 5 | ||||
-rw-r--r-- | blenderkit/data/categories.json | 1509 | ||||
-rw-r--r-- | blenderkit/paths.py | 21 | ||||
-rw-r--r-- | blenderkit/rerequests.py | 2 | ||||
-rw-r--r-- | blenderkit/search.py | 99 | ||||
-rw-r--r-- | blenderkit/ui.py | 16 | ||||
-rw-r--r-- | blenderkit/ui_panels.py | 29 | ||||
-rw-r--r-- | blenderkit/utils.py | 4 |
9 files changed, 331 insertions, 1373 deletions
diff --git a/blenderkit/__init__.py b/blenderkit/__init__.py index d511bbf8..15dcaffb 100644 --- a/blenderkit/__init__.py +++ b/blenderkit/__init__.py @@ -19,8 +19,8 @@ bl_info = { "name": "BlenderKit Online Asset Library", "author": "Vilem Duha, Petr Dlouhy", - "version": (1, 0, 30), - "blender": (2, 82, 0), + "version": (1, 0, 31), + "blender": (2, 83, 0), "location": "View3D > Properties > BlenderKit", "description": "Online BlenderKit library (materials, models, brushes and more). Connects to the internet.", "warning": "", @@ -249,17 +249,24 @@ def switch_search_results(self, context): s['search results orig'] = s.get('bkit brush search orig') search.load_previews() +#define these static +# asset_type_ui_items = ( +# ('MODEL', 'Models', 'Find upload models in the BlenderKit online database', 'OBJECT_DATAMODE',0), +# # ('SCENE', 'SCENE', 'Browse scenes', 'SCENE_DATA', 1), +# ('MATERIAL', 'Materials', 'Find or upload models in the BlenderKit online database', 'MATERIAL',2), +# # ('TEXTURE', 'Texture', 'Browse textures', 'TEXTURE', 3), +# ('BRUSH', 'Brushes', 'Find or upload models in the BlenderKit online database', 'BRUSH_DATA',3) +# ) +#same as above, but dynamic. def asset_type_callback(self, context): - # s = bpy.context.scene - # ui_props = s.blenderkitUI if self.down_up == 'SEARCH': items = ( ('MODEL', 'Models', 'Find models in the BlenderKit online database', 'OBJECT_DATAMODE', 0), # ('SCENE', 'SCENE', 'Browse scenes', 'SCENE_DATA', 1), - ('MATERIAL', 'Materials', 'Find models in the BlenderKit online database', 'MATERIAL', 2), + ('MATERIAL', 'Materials', 'Find materials in the BlenderKit online database', 'MATERIAL', 2), # ('TEXTURE', 'Texture', 'Browse textures', 'TEXTURE', 3), - ('BRUSH', 'Brushes', 'Find models in the BlenderKit online database', 'BRUSH_DATA', 3) + ('BRUSH', 'Brushes', 'Find brushes in the BlenderKit online database', 'BRUSH_DATA', 3) ) else: items = ( diff --git a/blenderkit/bkit_oauth.py b/blenderkit/bkit_oauth.py index 4d2f09dc..0bf20d4a 100644 --- a/blenderkit/bkit_oauth.py +++ b/blenderkit/bkit_oauth.py @@ -70,7 +70,7 @@ def refresh_token_thread(): thread = threading.Thread(target=refresh_token, args=([preferences.api_key_refresh, url]), daemon=True) thread.start() else: - ui.add_report('Already Refreshing token, will be ready soon.') + ui.add_report('Already Refreshing token, will be ready soon. If this fails, please login again in Login panel.') def refresh_token(api_key_refresh, url): @@ -139,7 +139,8 @@ class Logout(bpy.types.Operator): preferences.login_attempt = False preferences.api_key_refresh = '' preferences.api_key = '' - del (bpy.context.window_manager['bkit profile']) + if bpy.context.window_manager.get('bkit profile'): + del (bpy.context.window_manager['bkit profile']) return {'FINISHED'} diff --git a/blenderkit/data/categories.json b/blenderkit/data/categories.json index 2eb34a34..d6286050 100644 --- a/blenderkit/data/categories.json +++ b/blenderkit/data/categories.json @@ -1,22 +1,5 @@ [ { - "name": "addon", - "slug": "addon", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "addon", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 3, - "assetCountCumulative": 3 - }, - { "name": "brush", "slug": "brush", "active": true, @@ -99,23 +82,6 @@ "assetCountCumulative": 8 }, { - "name": "crack", - "slug": "crack", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "crack", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { "name": "cut", "slug": "cut", "active": true, @@ -269,23 +235,6 @@ "assetCountCumulative": 1 }, { - "name": "nature", - "slug": "nature-brush", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "nature", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 1, - "assetCountCumulative": 1 - }, - { "name": "pattern", "slug": "pattern", "active": true, @@ -316,42 +265,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 7, - "assetCountCumulative": 7 - }, - { - "name": "rust", - "slug": "rust-brush", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "rust", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "sculpture", - "slug": "sculpture-brush", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "sculpture", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 8, + "assetCountCumulative": 8 }, { "name": "stitches", @@ -371,23 +286,6 @@ "assetCountCumulative": 12 }, { - "name": "stone", - "slug": "stone-brush", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "stone", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { "name": "tree", "slug": "tree-brush", "active": true, @@ -403,23 +301,6 @@ "children": [], "assetCount": 4, "assetCountCumulative": 4 - }, - { - "name": "wood", - "slug": "wood-brush", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "wood", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 } ], "assetCount": 94, @@ -453,8 +334,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 2, - "assetCountCumulative": 2 + "assetCount": 36, + "assetCountCumulative": 36 }, { "name": "asphalt", @@ -470,8 +351,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 5, - "assetCountCumulative": 5 + "assetCount": 36, + "assetCountCumulative": 36 }, { "name": "bricks", @@ -487,8 +368,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 10, - "assetCountCumulative": 10 + "assetCount": 64, + "assetCountCumulative": 64 }, { "name": "ceramic", @@ -504,8 +385,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 2, - "assetCountCumulative": 2 + "assetCount": 16, + "assetCountCumulative": 16 }, { "name": "concrete", @@ -521,8 +402,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 21, - "assetCountCumulative": 21 + "assetCount": 64, + "assetCountCumulative": 64 }, { "name": "dirt", @@ -538,8 +419,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 6, - "assetCountCumulative": 6 + "assetCount": 25, + "assetCountCumulative": 25 }, { "name": "fabric", @@ -555,8 +436,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 41, - "assetCountCumulative": 41 + "assetCount": 169, + "assetCountCumulative": 169 }, { "name": "floor", @@ -572,8 +453,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 27, - "assetCountCumulative": 27 + "assetCount": 41, + "assetCountCumulative": 41 }, { "name": "food", @@ -589,8 +470,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 2, - "assetCountCumulative": 2 + "assetCount": 30, + "assetCountCumulative": 30 }, { "name": "fx", @@ -606,8 +487,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 1, - "assetCountCumulative": 1 + "assetCount": 19, + "assetCountCumulative": 19 }, { "name": "glass", @@ -623,25 +504,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 9, - "assetCountCumulative": 9 - }, - { - "name": "grass", - "slug": "grass", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "grass", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 28, + "assetCountCumulative": 28 }, { "name": "ground", @@ -657,25 +521,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 12, - "assetCountCumulative": 12 - }, - { - "name": "human", - "slug": "human", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "human", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 70, + "assetCountCumulative": 70 }, { "name": "ice", @@ -691,8 +538,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 2, - "assetCountCumulative": 2 + "assetCount": 20, + "assetCountCumulative": 20 }, { "name": "leather", @@ -708,8 +555,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 6, - "assetCountCumulative": 6 + "assetCount": 37, + "assetCountCumulative": 37 }, { "name": "liquid", @@ -725,25 +572,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 5, - "assetCountCumulative": 5 - }, - { - "name": "marble", - "slug": "marble", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "marble", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 7, + "assetCountCumulative": 7 }, { "name": "metal", @@ -759,8 +589,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 37, - "assetCountCumulative": 37 + "assetCount": 119, + "assetCountCumulative": 119 }, { "name": "organic", @@ -776,8 +606,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 3, - "assetCountCumulative": 3 + "assetCount": 29, + "assetCountCumulative": 29 }, { "name": "ornaments", @@ -793,8 +623,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 1, - "assetCountCumulative": 1 + "assetCount": 3, + "assetCountCumulative": 3 }, { "name": "paper", @@ -810,8 +640,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 26, - "assetCountCumulative": 26 + "assetCount": 30, + "assetCountCumulative": 30 }, { "name": "paving", @@ -827,8 +657,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 9, - "assetCountCumulative": 9 + "assetCount": 32, + "assetCountCumulative": 32 }, { "name": "plaster", @@ -844,8 +674,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 8, - "assetCountCumulative": 8 + "assetCount": 34, + "assetCountCumulative": 34 }, { "name": "plastic", @@ -861,8 +691,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 3, - "assetCountCumulative": 3 + "assetCount": 25, + "assetCountCumulative": 25 }, { "name": "rock", @@ -878,8 +708,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 7, - "assetCountCumulative": 7 + "assetCount": 21, + "assetCountCumulative": 21 }, { "name": "roofing", @@ -895,8 +725,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 2, - "assetCountCumulative": 2 + "assetCount": 12, + "assetCountCumulative": 12 }, { "name": "rubber", @@ -912,8 +742,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 1, - "assetCountCumulative": 1 + "assetCount": 8, + "assetCountCumulative": 8 }, { "name": "rust", @@ -929,8 +759,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 5, - "assetCountCumulative": 5 + "assetCount": 17, + "assetCountCumulative": 17 }, { "name": "sand", @@ -946,25 +776,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 2, - "assetCountCumulative": 2 - }, - { - "name": "soil", - "slug": "soil", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "soil", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 16, + "assetCountCumulative": 16 }, { "name": "stone", @@ -980,8 +793,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 11, - "assetCountCumulative": 11 + "assetCount": 117, + "assetCountCumulative": 117 }, { "name": "tech", @@ -997,8 +810,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 3, - "assetCountCumulative": 3 + "assetCount": 34, + "assetCountCumulative": 34 }, { "name": "tiles", @@ -1014,8 +827,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 19, - "assetCountCumulative": 19 + "assetCount": 84, + "assetCountCumulative": 84 }, { "name": "wood", @@ -1031,12 +844,12 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 42, - "assetCountCumulative": 42 + "assetCount": 121, + "assetCountCumulative": 121 } ], - "assetCount": 331, - "assetCountCumulative": 331 + "assetCount": 1365, + "assetCountCumulative": 1365 }, { "name": "model", @@ -1080,97 +893,12 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "helicopter", - "slug": "helicopter", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "helicopter", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "historic", - "slug": "historic-aircraft", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "historic", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "jet", - "slug": "jet", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "jet", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "part", - "slug": "part-aircraft", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "part", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "private", - "slug": "private", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "private", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 20, + "assetCountCumulative": 20 } ], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 20, + "assetCountCumulative": 20 }, { "name": "architecture", @@ -1200,12 +928,12 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 4, - "assetCountCumulative": 4 + "assetCount": 133, + "assetCountCumulative": 133 } ], - "assetCount": 5, - "assetCountCumulative": 5 + "assetCount": 137, + "assetCountCumulative": 137 }, { "name": "art", @@ -1222,40 +950,6 @@ "metaExtra": "", "children": [ { - "name": "design", - "slug": "design", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "design", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "drawing", - "slug": "drawing", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "drawing", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { "name": "literature", "slug": "literature", "active": true, @@ -1286,8 +980,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 8, - "assetCountCumulative": 8 + "assetCount": 15, + "assetCountCumulative": 15 }, { "name": "sculpture", @@ -1303,8 +997,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 8, - "assetCountCumulative": 8 + "assetCount": 15, + "assetCountCumulative": 15 }, { "name": "supplies", @@ -1320,12 +1014,12 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 1, - "assetCountCumulative": 1 + "assetCount": 8, + "assetCountCumulative": 8 } ], - "assetCount": 26, - "assetCountCumulative": 26 + "assetCount": 49, + "assetCountCumulative": 49 }, { "name": "character", @@ -1355,25 +1049,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 4, - "assetCountCumulative": 4 - }, - { - "name": "child", - "slug": "child", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "child", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 14, + "assetCountCumulative": 14 }, { "name": "clothing", @@ -1389,8 +1066,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 4, - "assetCountCumulative": 4 + "assetCount": 9, + "assetCountCumulative": 9 }, { "name": "fantasy", @@ -1406,8 +1083,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 2, + "assetCountCumulative": 2 }, { "name": "man", @@ -1423,42 +1100,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 7, - "assetCountCumulative": 7 - }, - { - "name": "people", - "slug": "people", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "people", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "sci-fi", - "slug": "sci-fi-character", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "sci-fi", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 13, + "assetCountCumulative": 13 }, { "name": "woman", @@ -1478,8 +1121,8 @@ "assetCountCumulative": 7 } ], - "assetCount": 22, - "assetCountCumulative": 22 + "assetCount": 46, + "assetCountCumulative": 46 }, { "name": "exterior", @@ -1509,8 +1152,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 4, - "assetCountCumulative": 4 + "assetCount": 24, + "assetCountCumulative": 24 }, { "name": "cityspace", @@ -1526,76 +1169,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 6, - "assetCountCumulative": 6 - }, - { - "name": "historic", - "slug": "historic", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "historic", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "house", - "slug": "house", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "house", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "industrial", - "slug": "industrial-exterior", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "industrial", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "landmark", - "slug": "landmark", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "landmark", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 24, + "assetCountCumulative": 24 }, { "name": "landscape", @@ -1611,8 +1186,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 12, - "assetCountCumulative": 12 + "assetCount": 35, + "assetCountCumulative": 35 }, { "name": "public", @@ -1628,42 +1203,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 4, - "assetCountCumulative": 4 - }, - { - "name": "sci-fi", - "slug": "sci-fi", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "sci-fi", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "stadium", - "slug": "stadium", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "stadium", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 12, + "assetCountCumulative": 12 }, { "name": "street", @@ -1679,12 +1220,12 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 1, - "assetCountCumulative": 1 + "assetCount": 35, + "assetCountCumulative": 35 } ], - "assetCount": 27, - "assetCountCumulative": 27 + "assetCount": 132, + "assetCountCumulative": 132 }, { "name": "food & drink", @@ -1714,8 +1255,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 10, - "assetCountCumulative": 10 + "assetCount": 33, + "assetCountCumulative": 33 }, { "name": "drink", @@ -1731,8 +1272,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 14, - "assetCountCumulative": 14 + "assetCount": 27, + "assetCountCumulative": 27 }, { "name": "drugs", @@ -1748,8 +1289,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 3, - "assetCountCumulative": 3 + "assetCount": 7, + "assetCountCumulative": 7 }, { "name": "food", @@ -1765,12 +1306,12 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 8, - "assetCountCumulative": 8 + "assetCount": 47, + "assetCountCumulative": 47 } ], - "assetCount": 35, - "assetCountCumulative": 35 + "assetCount": 117, + "assetCountCumulative": 117 }, { "name": "furniture", @@ -1800,8 +1341,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 3, - "assetCountCumulative": 3 + "assetCount": 21, + "assetCountCumulative": 21 }, { "name": "carpet", @@ -1817,8 +1358,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 7, - "assetCountCumulative": 7 + "assetCount": 10, + "assetCountCumulative": 10 }, { "name": "desk", @@ -1834,8 +1375,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 5, - "assetCountCumulative": 5 + "assetCount": 21, + "assetCountCumulative": 21 }, { "name": "fireplace", @@ -1851,8 +1392,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 1, - "assetCountCumulative": 1 + "assetCount": 8, + "assetCountCumulative": 8 }, { "name": "lighting", @@ -1868,8 +1409,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 19, - "assetCountCumulative": 19 + "assetCount": 106, + "assetCountCumulative": 106 }, { "name": "seating", @@ -1885,8 +1426,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 36, - "assetCountCumulative": 36 + "assetCount": 179, + "assetCountCumulative": 179 }, { "name": "shelving", @@ -1902,8 +1443,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 17, - "assetCountCumulative": 17 + "assetCount": 38, + "assetCountCumulative": 38 }, { "name": "sofa", @@ -1919,8 +1460,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 9, - "assetCountCumulative": 9 + "assetCount": 57, + "assetCountCumulative": 57 }, { "name": "storage", @@ -1936,8 +1477,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 24, - "assetCountCumulative": 24 + "assetCount": 65, + "assetCountCumulative": 65 }, { "name": "table", @@ -1953,12 +1494,12 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 36, - "assetCountCumulative": 36 + "assetCount": 106, + "assetCountCumulative": 106 } ], - "assetCount": 157, - "assetCountCumulative": 157 + "assetCount": 611, + "assetCountCumulative": 611 }, { "name": "industrial", @@ -1975,57 +1516,6 @@ "metaExtra": "", "children": [ { - "name": "agriculture", - "slug": "agriculture", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "agriculture", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "communication", - "slug": "communication", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "communication", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "construction", - "slug": "construction", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "construction", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { "name": "container", "slug": "container-industrial", "active": true, @@ -2039,25 +1529,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 11, - "assetCountCumulative": 11 - }, - { - "name": "machine", - "slug": "machine", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "machine", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 48, + "assetCountCumulative": 48 }, { "name": "tool", @@ -2073,29 +1546,12 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 5, - "assetCountCumulative": 5 - }, - { - "name": "utility", - "slug": "utility-industrial", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "part", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 29, + "assetCountCumulative": 29 } ], - "assetCount": 18, - "assetCountCumulative": 18 + "assetCount": 85, + "assetCountCumulative": 85 }, { "name": "interior", @@ -2125,8 +1581,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 24, - "assetCountCumulative": 24 + "assetCount": 96, + "assetCountCumulative": 96 }, { "name": "bedroom", @@ -2142,8 +1598,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 14, - "assetCountCumulative": 14 + "assetCount": 64, + "assetCountCumulative": 64 }, { "name": "decoration", @@ -2159,8 +1615,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 71, - "assetCountCumulative": 71 + "assetCount": 291, + "assetCountCumulative": 291 }, { "name": "hall", @@ -2176,8 +1632,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 2, - "assetCountCumulative": 2 + "assetCount": 8, + "assetCountCumulative": 8 }, { "name": "kids room", @@ -2193,8 +1649,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 9, - "assetCountCumulative": 9 + "assetCount": 42, + "assetCountCumulative": 42 }, { "name": "kitchen", @@ -2210,8 +1666,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 69, - "assetCountCumulative": 69 + "assetCount": 181, + "assetCountCumulative": 181 }, { "name": "living room", @@ -2227,8 +1683,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 17, - "assetCountCumulative": 17 + "assetCount": 127, + "assetCountCumulative": 127 }, { "name": "office", @@ -2244,8 +1700,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 13, - "assetCountCumulative": 13 + "assetCount": 48, + "assetCountCumulative": 48 }, { "name": "utility", @@ -2261,12 +1717,12 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 34, - "assetCountCumulative": 34 + "assetCount": 74, + "assetCountCumulative": 74 } ], - "assetCount": 253, - "assetCountCumulative": 253 + "assetCount": 932, + "assetCountCumulative": 932 }, { "name": "military", @@ -2283,23 +1739,6 @@ "metaExtra": "", "children": [ { - "name": "air", - "slug": "air", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "air", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { "name": "equipment", "slug": "equipment", "active": true, @@ -2313,25 +1752,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "ground", - "slug": "ground", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "ground", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 3, + "assetCountCumulative": 3 }, { "name": "historic", @@ -2347,25 +1769,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "naval", - "slug": "naval", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "naval", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 6, + "assetCountCumulative": 6 }, { "name": "weapon", @@ -2381,12 +1786,12 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 3, - "assetCountCumulative": 3 + "assetCount": 29, + "assetCountCumulative": 29 } ], - "assetCount": 3, - "assetCountCumulative": 3 + "assetCount": 40, + "assetCountCumulative": 40 }, { "name": "music", @@ -2416,63 +1821,12 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 1, - "assetCountCumulative": 1 - }, - { - "name": "instruments", - "slug": "instruments", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "instruments", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "stage", - "slug": "stage", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "stage", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "studio", - "slug": "studio", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "studio", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 1, - "assetCountCumulative": 1 + "assetCount": 13, + "assetCountCumulative": 13 } ], - "assetCount": 2, - "assetCountCumulative": 2 + "assetCount": 13, + "assetCountCumulative": 13 }, { "name": "nature", @@ -2502,8 +1856,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 3, - "assetCountCumulative": 3 + "assetCount": 7, + "assetCountCumulative": 7 }, { "name": "atmosphere", @@ -2519,8 +1873,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 2, + "assetCountCumulative": 2 }, { "name": "landscape", @@ -2536,8 +1890,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 9, - "assetCountCumulative": 9 + "assetCount": 35, + "assetCountCumulative": 35 }, { "name": "plant", @@ -2553,8 +1907,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 15, - "assetCountCumulative": 15 + "assetCount": 48, + "assetCountCumulative": 48 }, { "name": "tree", @@ -2570,29 +1924,12 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 14, - "assetCountCumulative": 14 - }, - { - "name": "weather", - "slug": "weather", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "weather", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 47, + "assetCountCumulative": 47 } ], - "assetCount": 41, - "assetCountCumulative": 41 + "assetCount": 141, + "assetCountCumulative": 141 }, { "name": "space", @@ -2609,57 +1946,6 @@ "metaExtra": "", "children": [ { - "name": "astronomy", - "slug": "astronomy", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "astronomy", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "planets", - "slug": "planets", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "planets", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "sci-fi", - "slug": "sci-fi-space", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "sci-fi", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { "name": "spacecraft", "slug": "spacecraft", "active": true, @@ -2673,12 +1959,12 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 1, - "assetCountCumulative": 1 + "assetCount": 9, + "assetCountCumulative": 9 } ], - "assetCount": 1, - "assetCountCumulative": 1 + "assetCount": 10, + "assetCountCumulative": 10 }, { "name": "sports", @@ -2695,23 +1981,6 @@ "metaExtra": "", "children": [ { - "name": "animal", - "slug": "animal", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "animal", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { "name": "exercise", "slug": "exercise", "active": true, @@ -2725,8 +1994,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 1, - "assetCountCumulative": 1 + "assetCount": 12, + "assetCountCumulative": 12 }, { "name": "extreme", @@ -2742,8 +2011,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 1, - "assetCountCumulative": 1 + "assetCount": 4, + "assetCountCumulative": 4 }, { "name": "individual", @@ -2759,8 +2028,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 1, - "assetCountCumulative": 1 + "assetCount": 5, + "assetCountCumulative": 5 }, { "name": "outdoor", @@ -2776,8 +2045,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 1, - "assetCountCumulative": 1 + "assetCount": 4, + "assetCountCumulative": 4 }, { "name": "team", @@ -2793,12 +2062,12 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 3, - "assetCountCumulative": 3 + "assetCount": 6, + "assetCountCumulative": 6 } ], - "assetCount": 7, - "assetCountCumulative": 7 + "assetCount": 31, + "assetCountCumulative": 31 }, { "name": "technology", @@ -2815,23 +2084,6 @@ "metaExtra": "", "children": [ { - "name": "ai", - "slug": "ai", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "ai", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { "name": "audio", "slug": "audio", "active": true, @@ -2845,8 +2097,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 1, - "assetCountCumulative": 1 + "assetCount": 16, + "assetCountCumulative": 16 }, { "name": "computer", @@ -2862,25 +2114,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 2, - "assetCountCumulative": 2 - }, - { - "name": "medical", - "slug": "medical", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "medical", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 102, + "assetCountCumulative": 102 }, { "name": "phone", @@ -2896,8 +2131,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 2, - "assetCountCumulative": 2 + "assetCount": 8, + "assetCountCumulative": 8 }, { "name": "photography", @@ -2913,46 +2148,12 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 1, - "assetCountCumulative": 1 - }, - { - "name": "science", - "slug": "science", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "science", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "video", - "slug": "video", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "video", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 6, + "assetCountCumulative": 6 } ], - "assetCount": 6, - "assetCountCumulative": 6 + "assetCount": 138, + "assetCountCumulative": 138 }, { "name": "vehicle", @@ -2969,40 +2170,6 @@ "metaExtra": "", "children": [ { - "name": "bicycle", - "slug": "bicycle", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "bicycle", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "bus", - "slug": "bus", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "bus", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { "name": "car", "slug": "car", "active": true, @@ -3016,25 +2183,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 9, - "assetCountCumulative": 9 - }, - { - "name": "historic", - "slug": "historic-vehicle", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "historic", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 43, + "assetCountCumulative": 43 }, { "name": "industrial", @@ -3050,25 +2200,8 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 1, - "assetCountCumulative": 1 - }, - { - "name": "motorcycle", - "slug": "motorcycle", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "motorcycle", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 5, + "assetCountCumulative": 5 }, { "name": "part", @@ -3084,222 +2217,32 @@ "metaKeywords": "", "metaExtra": "", "children": [], - "assetCount": 8, - "assetCountCumulative": 8 - }, - { - "name": "train", - "slug": "train", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "train", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "truck", - "slug": "truck", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "truck", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - } - ], - "assetCount": 18, - "assetCountCumulative": 18 - }, - { - "name": "watercraft", - "slug": "watercraft", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "watercraft", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [ - { - "name": "historic", - "slug": "historic-watercraft", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "historic", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "industrial", - "slug": "industrial-watercraft", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "industrial", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "part", - "slug": "part-watercraft", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "part", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "personal", - "slug": "personal", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "personal", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 20, + "assetCountCumulative": 20 }, { - "name": "recreational", - "slug": "recreational", + "name": "Animals", + "slug": "animals", "active": true, "thumbnail": null, "thumbnailWidth": null, "thumbnailHeight": null, "order": 0, - "alternateTitle": "recreational", + "alternateTitle": "Animals", "alternateUrl": "", "description": "", "metaKeywords": "", "metaExtra": "", "children": [], "assetCount": 0, - "assetCountCumulative": 0 - } - ], - "assetCount": 0, - "assetCountCumulative": 0 - } - ], - "assetCount": 621, - "assetCountCumulative": 621 - }, - { - "name": "texture", - "slug": "texture", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "texture", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [ - { - "name": "Animals", - "slug": "animals", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "Animals", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [ - { - "name": "Mammals", - "slug": "mammals", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "Mammals", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 - }, - { - "name": "Plants", - "slug": "plants", - "active": true, - "thumbnail": null, - "thumbnailWidth": null, - "thumbnailHeight": null, - "order": 0, - "alternateTitle": "Plants", - "alternateUrl": "", - "description": "", - "metaKeywords": "", - "metaExtra": "", - "children": [], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCountCumulative": 11 } ], - "assetCount": 0, - "assetCountCumulative": 1 + "assetCount": 70, + "assetCountCumulative": 70 } ], - "assetCount": 0, - "assetCountCumulative": 0 + "assetCount": 2572, + "assetCountCumulative": 2572 } ]
\ No newline at end of file diff --git a/blenderkit/paths.py b/blenderkit/paths.py index 2f144268..b4210a85 100644 --- a/blenderkit/paths.py +++ b/blenderkit/paths.py @@ -16,7 +16,8 @@ # # ##### END GPL LICENSE BLOCK ##### -import bpy, os, sys +import bpy, os, sys, tempfile, shutil +from blenderkit import tasks_queue, ui _presets = os.path.join(bpy.utils.user_resource('SCRIPTS'), "presets") BLENDERKIT_LOCAL = "http://localhost:8001" @@ -35,6 +36,15 @@ BLENDERKIT_OAUTH_LANDING_URL = "/oauth-landing/" BLENDERKIT_SIGNUP_URL = "https://www.blenderkit.com/accounts/register" BLENDERKIT_SETTINGS_FILENAME = os.path.join(_presets, "bkit.json") +def cleanup_old_folders(): + '''function to clean up any historical folders for BlenderKit. By now removes the temp folder.''' + orig_temp = os.path.join(os.path.expanduser('~'), 'blenderkit_data', 'temp') + if os.path.isdir(orig_temp): + try: + shutil.rmtree(orig_temp) + except Exception as e: + print(e) + print("couldn't delete old temp directory") def get_bkit_url(): # bpy.app.debug_value = 2 @@ -81,7 +91,7 @@ def get_temp_dir(subdir=None): user_preferences = bpy.context.preferences.addons['blenderkit'].preferences # tempdir = user_preferences.temp_dir - tempdir = os.path.join(user_preferences.global_dir, 'temp') + tempdir = os.path.join(tempfile.gettempdir(), 'bkit_temp') if tempdir.startswith('//'): tempdir = bpy.path.abspath(tempdir) try: @@ -91,11 +101,14 @@ def get_temp_dir(subdir=None): tempdir = os.path.join(tempdir, subdir) if not os.path.exists(tempdir): os.makedirs(tempdir) + cleanup_old_folders() except: - print('Cache directory not found. Resetting Cache folder path.') + tasks_queue.add_task((ui.add_report, ('Cache directory not found. Resetting Cache folder path.',))) + p = default_global_dict() if p == user_preferences.global_dir: - print('Global dir was already default, plese set a global directory in addon preferences to a dir where you have write permissions.') + message = 'Global dir was already default, plese set a global directory in addon preferences to a dir where you have write permissions.' + tasks_queue.add_task((ui.add_report, (message,))) return None user_preferences.global_dir = p tempdir = get_temp_dir(subdir = subdir) diff --git a/blenderkit/rerequests.py b/blenderkit/rerequests.py index 28c7e2ca..587093e0 100644 --- a/blenderkit/rerequests.py +++ b/blenderkit/rerequests.py @@ -68,6 +68,8 @@ def rerequest(method, url, **kwargs): # in non-threaded tasks bpy.context.preferences.addons['blenderkit'].preferences.api_key = auth_token bpy.context.preferences.addons['blenderkit'].preferences.api_key_refresh = refresh_token + else: + tasks_queue.add_task((bkit_oauth.write_tokens, (auth_token, refresh_token, oauth_response))) kwargs['headers'] = utils.get_headers(auth_token) response = requests.request(method, url, **kwargs) diff --git a/blenderkit/search.py b/blenderkit/search.py index d77784d9..bae25466 100644 --- a/blenderkit/search.py +++ b/blenderkit/search.py @@ -56,8 +56,8 @@ import requests, os, random import time import threading import platform -import json import bpy +import copy search_start_time = 0 prev_time = 0 @@ -140,7 +140,7 @@ def fetch_server_data(): api_key = user_preferences.api_key # Only refresh new type of tokens(by length), and only one hour before the token timeouts. if user_preferences.enable_oauth and \ - len(user_preferences.api_key) < 38 and \ + len(user_preferences.api_key) < 38 and len(user_preferences.api_key) > 0 and \ user_preferences.api_key_timeout < time.time() + 3600: bkit_oauth.refresh_token_thread() if api_key != '' and bpy.context.window_manager.get('bkit profile') == None: @@ -266,7 +266,7 @@ def parse_result(r): # attempt to switch to use original data gradually, since the parsing as itself should become obsolete. asset_data.update(r) - return asset_data + return asset_data # @bpy.app.handlers.persistent @@ -312,20 +312,17 @@ def timer_update(): asset_type = thread[2] if asset_type == 'model': props = scene.blenderkit_models - json_filepath = os.path.join(icons_dir, 'model_searchresult.json') - search_name = 'bkit model search' + # json_filepath = os.path.join(icons_dir, 'model_searchresult.json') if asset_type == 'scene': props = scene.blenderkit_scene - json_filepath = os.path.join(icons_dir, 'scene_searchresult.json') - search_name = 'bkit scene search' + # json_filepath = os.path.join(icons_dir, 'scene_searchresult.json') if asset_type == 'material': props = scene.blenderkit_mat - json_filepath = os.path.join(icons_dir, 'material_searchresult.json') - search_name = 'bkit material search' + # json_filepath = os.path.join(icons_dir, 'material_searchresult.json') if asset_type == 'brush': props = scene.blenderkit_brush - json_filepath = os.path.join(icons_dir, 'brush_searchresult.json') - search_name = 'bkit brush search' + # json_filepath = os.path.join(icons_dir, 'brush_searchresult.json') + search_name = f'bkit {asset_type} search' s[search_name] = [] @@ -333,8 +330,8 @@ def timer_update(): if reports != '': props.report = str(reports) return .2 - with open(json_filepath, 'r') as data_file: - rdata = json.load(data_file) + + rdata = thread[0].result result_field = [] ok, error = check_errors(rdata) @@ -348,8 +345,9 @@ def timer_update(): # results = rdata['results'] s[search_name] = result_field s['search results'] = result_field - s[search_name + ' orig'] = rdata - s['search results orig'] = rdata + s[search_name + ' orig'] = copy.deepcopy(rdata) + s['search results orig'] = s[search_name + ' orig'] + load_previews() ui_props = bpy.context.scene.blenderkitUI if len(result_field) < ui_props.scrolloffset: @@ -360,9 +358,6 @@ def timer_update(): if len(s['search results']) == 0: tasks_queue.add_task((ui.add_report, ('No matching results found.',))) - # (rdata['next']) - # if rdata['next'] != None: - # search(False, get_next = True) else: print('error', error) props.report = error @@ -374,18 +369,11 @@ def timer_update(): def load_previews(): - mappingdict = { - 'MODEL': 'model', - 'SCENE': 'scene', - 'MATERIAL': 'material', - 'TEXTURE': 'texture', - 'BRUSH': 'brush' - } + scene = bpy.context.scene # FIRST START SEARCH props = scene.blenderkitUI - - directory = paths.get_temp_dir('%s_search' % mappingdict[props.asset_type]) + directory = paths.get_temp_dir('%s_search' % props.asset_type.lower()) s = bpy.context.scene results = s.get('search results') # @@ -694,7 +682,7 @@ def write_gravatar(a_id, gravatar_path): def fetch_gravatar(adata): utils.p('fetch gravatar') if adata.get('gravatarHash') is not None: - gravatar_path = paths.get_temp_dir(subdir='g/') + adata['gravatarHash'] + '.jpg' + gravatar_path = paths.get_temp_dir(subdir='bkit_g/') + adata['gravatarHash'] + '.jpg' if os.path.exists(gravatar_path): tasks_queue.add_task((write_gravatar, (adata['id'], gravatar_path))) @@ -790,11 +778,12 @@ def get_profile(): class Searcher(threading.Thread): query = None - def __init__(self, query, params): + def __init__(self, query, params,orig_result): super(Searcher, self).__init__() self.query = query self.params = params self._stop_event = threading.Event() + self.result = orig_result def stop(self): self._stop_event.set() @@ -854,7 +843,7 @@ class Searcher(threading.Thread): t = time.time() mt('search thread started') tempdir = paths.get_temp_dir('%s_search' % query['asset_type']) - json_filepath = os.path.join(tempdir, '%s_searchresult.json' % query['asset_type']) + # json_filepath = os.path.join(tempdir, '%s_searchresult.json' % query['asset_type']) headers = utils.get_headers(params['api_key']) @@ -862,23 +851,11 @@ class Searcher(threading.Thread): rdata['results'] = [] if params['get_next']: - with open(json_filepath, 'r') as infile: - try: - origdata = json.load(infile) - urlquery = origdata['next'] - # rparameters = {} - if urlquery == None: - return; - except: - # in case no search results found on drive we don't do next page loading. - params['get_next'] = False + urlquery = self.result['next'] if not params['get_next']: - url = paths.get_api_url() + 'search/' + urlquery = self.query_to_url() - urlquery = url - # rparameters = query - urlquery = self.query_to_url() try: utils.p(urlquery) r = rerequests.get(urlquery, headers=headers) # , params = rparameters) @@ -941,10 +918,10 @@ class Searcher(threading.Thread): # we save here because a missing thumbnail check is in the previous loop # we can also prepend previous results. These have downloaded thumbnails already... if params['get_next']: - rdata['results'][0:0] = origdata['results'] - - with open(json_filepath, 'w') as outfile: - json.dump(rdata, outfile) + rdata['results'][0:0] = self.result['results'] + self.result = rdata + # with open(json_filepath, 'w') as outfile: + # json.dump(rdata, outfile) killthreads_sml = [] for k in thumb_sml_download_threads.keys(): @@ -1157,7 +1134,7 @@ def mt(text): utils.p(text, alltime, since_last) -def add_search_process(query, params): +def add_search_process(query, params, orig_result): global search_threads while (len(search_threads) > 0): @@ -1166,10 +1143,10 @@ def add_search_process(query, params): # TODO CARE HERE FOR ALSO KILLING THE THREADS...AT LEAST NOW SEARCH DONE FIRST WON'T REWRITE AN OLDER ONE tempdir = paths.get_temp_dir('%s_search' % query['asset_type']) - thread = Searcher(query, params) + thread = Searcher(query, params, orig_result) thread.start() - search_threads.append([thread, tempdir, query['asset_type']]) + search_threads.append([thread, tempdir, query['asset_type'],{}])# 4th field is for results mt('thread started') @@ -1184,6 +1161,14 @@ def search(category='', get_next=False, author_id=''): scene = bpy.context.scene ui_props = scene.blenderkitUI + ### updating of search categories was moved here, due to the reason that BlenderKit created the blenderkit_data + # folder upon registration of BlenderKit, which wasn't a favourite option for some users (devs running tests). + # user_preferences = bpy.context.preferences.addons['blenderkit'].preferences + # if not user_preferences.first_run: + # api_key = user_preferences.api_key + # if bpy.context.window_manager.get('bkit_categories') is None: + # categories.fetch_categories_thread(api_key) + if ui_props.asset_type == 'MODEL': if not hasattr(scene, 'blenderkit'): return; @@ -1195,13 +1180,14 @@ def search(category='', get_next=False, author_id=''): return; props = scene.blenderkit_scene query = build_query_scene() + if ui_props.asset_type == 'MATERIAL': if not hasattr(scene, 'blenderkit_mat'): return; props = scene.blenderkit_mat query = build_query_material() - utils.p(query) + if ui_props.asset_type == 'TEXTURE': if not hasattr(scene, 'blenderkit_tex'): @@ -1209,12 +1195,14 @@ def search(category='', get_next=False, author_id=''): # props = scene.blenderkit_tex # query = build_query_texture() + if ui_props.asset_type == 'BRUSH': if not hasattr(scene, 'blenderkit_brush'): return; props = scene.blenderkit_brush query = build_query_brush() + if props.is_searching and get_next == True: return; @@ -1242,8 +1230,11 @@ def search(category='', get_next=False, author_id=''): # if free_only: # query['keywords'] += '+is_free:true' - - add_search_process(query, params) + orig_results = scene.get(f'bkit {ui_props.asset_type.lower()} search orig', {}) + if orig_results != {}: + #ensure it's a copy in dict for what we are passing to thread: + orig_results = orig_results.to_dict() + add_search_process(query, params, orig_results) tasks_queue.add_task((ui.add_report, ('BlenderKit searching....', 2))) props.report = 'BlenderKit searching....' diff --git a/blenderkit/ui.py b/blenderkit/ui.py index f13b4778..a1cd66d9 100644 --- a/blenderkit/ui.py +++ b/blenderkit/ui.py @@ -796,14 +796,14 @@ def draw_callback_2d_search(self, context): index = a + ui_props.scrolloffset + b * ui_props.wcount iname = utils.previmg_name(index) img = bpy.data.images.get(iname) - - w = int(ui_props.thumb_size * img.size[0] / max(img.size[0], img.size[1])) - h = int(ui_props.thumb_size * img.size[1] / max(img.size[0], img.size[1])) - crop = (0, 0, 1, 1) - if img.size[0] > img.size[1]: - offset = (1 - img.size[1] / img.size[0]) / 2 - crop = (offset, 0, 1 - offset, 1) if img is not None: + w = int(ui_props.thumb_size * img.size[0] / max(img.size[0], img.size[1])) + h = int(ui_props.thumb_size * img.size[1] / max(img.size[0], img.size[1])) + crop = (0, 0, 1, 1) + if img.size[0] > img.size[1]: + offset = (1 - img.size[1] / img.size[0]) / 2 + crop = (offset, 0, 1 - offset, 1) + ui_bgl.draw_image(x, y, w, w, img, 1, crop=crop) if index == ui_props.active_index: @@ -815,7 +815,7 @@ def draw_callback_2d_search(self, context): # w + 2*highlight_margin, h + 2*highlight_margin , highlight) else: - ui_bgl.draw_rect(x, y, w, h, white) + ui_bgl.draw_rect(x, y, ui_props.thumb_size, ui_props.thumb_size, white) result = search_results[index] if result['downloaded'] > 0: diff --git a/blenderkit/ui_panels.py b/blenderkit/ui_panels.py index 7de2a240..1083b6a6 100644 --- a/blenderkit/ui_panels.py +++ b/blenderkit/ui_panels.py @@ -94,7 +94,7 @@ def draw_ratings(layout, context): # row = layout.row() # op = row.operator("object.blenderkit_rating_upload", text="Send rating", icon='URL') # return op - #re-enable layout if included in longer panel + # re-enable layout if included in longer panel def draw_not_logged_in(source): @@ -337,7 +337,6 @@ def draw_panel_model_search(self, context): # draw_panel_categories(self, context) - def draw_panel_scene_search(self, context): s = context.scene props = s.blenderkit_scene @@ -567,12 +566,9 @@ def draw_panel_material_search(self, context): # if props.search_engine == 'OTHER': # layout.prop(props, 'search_engine_other') - - # draw_panel_categories(self, context) - def draw_panel_material_ratings(self, context): draw_ratings(self.layout, context) # , props) # op.asset_type = 'MATERIAL' @@ -641,12 +637,11 @@ class VIEW3D_PT_blenderkit_advanced_model_search(Panel): bl_label = "Search filters" bl_options = {'DEFAULT_CLOSED'} - @classmethod def poll(cls, context): s = context.scene ui_props = s.blenderkitUI - return ui_props.down_up == 'SEARCH' and ui_props.asset_type =='MODEL' + return ui_props.down_up == 'SEARCH' and ui_props.asset_type == 'MODEL' def draw(self, context): s = context.scene @@ -696,6 +691,7 @@ class VIEW3D_PT_blenderkit_advanced_model_search(Panel): # ADULT # layout.prop(props, "search_adult") # , text ='condition of object new/old e.t.c.') + class VIEW3D_PT_blenderkit_advanced_material_search(Panel): bl_category = "BlenderKit" bl_idname = "VIEW3D_PT_blenderkit_advanced_material_search" @@ -709,7 +705,7 @@ class VIEW3D_PT_blenderkit_advanced_material_search(Panel): def poll(cls, context): s = context.scene ui_props = s.blenderkitUI - return ui_props.down_up == 'SEARCH' and ui_props.asset_type =='MATERIAL' + return ui_props.down_up == 'SEARCH' and ui_props.asset_type == 'MATERIAL' def draw(self, context): s = context.scene @@ -737,6 +733,7 @@ class VIEW3D_PT_blenderkit_advanced_material_search(Panel): row.prop(props, "search_file_size_min", text='min') row.prop(props, "search_file_size_max", text='max') + class VIEW3D_PT_blenderkit_categories(Panel): bl_category = "BlenderKit" bl_idname = "VIEW3D_PT_blenderkit_categories" @@ -750,10 +747,14 @@ class VIEW3D_PT_blenderkit_categories(Panel): def poll(cls, context): s = context.scene ui_props = s.blenderkitUI - return ui_props.down_up == 'SEARCH' + mode = True + if ui_props.asset_type == 'BRUSH' and not (context.sculpt_object or context.image_paint_object): + mode = False + return ui_props.down_up == 'SEARCH' and mode def draw(self, context): - draw_panel_categories(self,context) + draw_panel_categories(self, context) + class VIEW3D_PT_blenderkit_import_settings(Panel): bl_category = "BlenderKit" @@ -776,7 +777,6 @@ class VIEW3D_PT_blenderkit_import_settings(Panel): s = context.scene ui_props = s.blenderkitUI - if ui_props.asset_type == 'MODEL': # noinspection PyCallByClass props = s.blenderkit_models @@ -821,7 +821,7 @@ class VIEW3D_PT_blenderkit_unified(Panel): # row = row.split().row() # layout.alert = True # layout.alignment = 'CENTER' - row = layout.row(align = True) + row = layout.row(align=True) row.scale_x = 1.6 row.scale_y = 1.6 # split = row.split(factor=.5) @@ -966,10 +966,10 @@ def draw_asset_context_menu(self, context, asset_data): aob = bpy.context.selected_objects[0] op = layout.operator('scene.blenderkit_download', text='Replace Active Models') - #this checks if the menu got called from right-click in assetbar(then index is 0 - x) or + # this checks if the menu got called from right-click in assetbar(then index is 0 - x) or # from a panel(then replacement happens from the active model) if ui_props.active_index == -3: - #called from addon panel + # called from addon panel o = utils.get_active_model() op.asset_base_id = o['asset_data']['assetBaseId'] else: @@ -1232,6 +1232,7 @@ classess = ( UrlPopupDialog ) + def register_ui_panels(): for c in classess: bpy.utils.register_class(c) diff --git a/blenderkit/utils.py b/blenderkit/utils.py index 5544ba3e..503a93f2 100644 --- a/blenderkit/utils.py +++ b/blenderkit/utils.py @@ -209,9 +209,9 @@ def get_upload_props(): def previmg_name(index, fullsize=False): if not fullsize: - return '.bkit_preview_' + str(index).zfill(2) + return '.bkit_preview_' + str(index).zfill(3) else: - return '.bkit_preview_full_' + str(index).zfill(2) + return '.bkit_preview_full_' + str(index).zfill(3) def get_active_brush(): |