Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'blenderkit/paths.py')
-rw-r--r--blenderkit/paths.py407
1 files changed, 0 insertions, 407 deletions
diff --git a/blenderkit/paths.py b/blenderkit/paths.py
deleted file mode 100644
index 0170ae7b..00000000
--- a/blenderkit/paths.py
+++ /dev/null
@@ -1,407 +0,0 @@
-# ##### BEGIN GPL LICENSE BLOCK #####
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ##### END GPL LICENSE BLOCK #####
-
-import bpy, os, sys, tempfile, shutil
-from blenderkit import tasks_queue, ui, utils, reports
-
-_presets = os.path.join(bpy.utils.user_resource('SCRIPTS'), "presets")
-BLENDERKIT_LOCAL = "http://localhost:8001"
-BLENDERKIT_MAIN = "https://www.blenderkit.com"
-BLENDERKIT_DEVEL = "https://devel.blenderkit.com"
-BLENDERKIT_API = "/api/v1/"
-BLENDERKIT_REPORT_URL = "usage_report/"
-BLENDERKIT_USER_ASSETS = "/my-assets"
-BLENDERKIT_PLANS = "/plans/pricing/"
-BLENDERKIT_MANUAL = "https://youtu.be/pSay3yaBWV0"
-BLENDERKIT_MODEL_UPLOAD_INSTRUCTIONS_URL = "https://www.blenderkit.com/docs/upload/"
-BLENDERKIT_MATERIAL_UPLOAD_INSTRUCTIONS_URL = "https://www.blenderkit.com/docs/uploading-material/"
-BLENDERKIT_BRUSH_UPLOAD_INSTRUCTIONS_URL = "https://www.blenderkit.com/docs/uploading-brush/"
-BLENDERKIT_HDR_UPLOAD_INSTRUCTIONS_URL = "https://www.blenderkit.com/docs/uploading-hdr/"
-BLENDERKIT_SCENE_UPLOAD_INSTRUCTIONS_URL = "https://www.blenderkit.com/docs/uploading-scene/"
-BLENDERKIT_LOGIN_URL = "https://www.blenderkit.com/accounts/login"
-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
- d = bpy.app.debug_value
- # d = 2
- if d == 1:
- url = BLENDERKIT_LOCAL
- elif d == 2:
- url = BLENDERKIT_DEVEL
- else:
- url = BLENDERKIT_MAIN
- return url
-
-
-def find_in_local(text=''):
- fs = []
- for p, d, f in os.walk('.'):
- for file in f:
- if text in file:
- fs.append(file)
- return fs
-
-
-def get_api_url():
- return get_bkit_url() + BLENDERKIT_API
-
-
-def get_oauth_landing_url():
- return get_bkit_url() + BLENDERKIT_OAUTH_LANDING_URL
-
-
-def get_author_gallery_url(author_id):
- return f'{get_bkit_url()}/asset-gallery?query=author_id:{author_id}'
-
-def get_asset_gallery_url(asset_id):
- return f'{get_bkit_url()}/asset-gallery-detail/{asset_id}/'
-
-def default_global_dict():
- from os.path import expanduser
- home = expanduser("~")
- return home + os.sep + 'blenderkit_data'
-
-
-def get_categories_filepath():
- tempdir = get_temp_dir()
- return os.path.join(tempdir, 'categories.json')
-
-dirs_exist_dict = {}#cache these results since this is used very often
-# this causes the function to fail if user deletes the directory while blender is running,
-# but comes back when blender is restarted.
-def get_temp_dir(subdir=None):
-
- user_preferences = bpy.context.preferences.addons['blenderkit'].preferences
- #first try cached results
- if subdir is not None:
- d = dirs_exist_dict.get(subdir)
- if d is not None:
- return d
- else:
- d = dirs_exist_dict.get('top')
- if d is not None:
- return d
-
- # tempdir = user_preferences.temp_dir
- tempdir = os.path.join(tempfile.gettempdir(), 'bkit_temp')
- if tempdir.startswith('//'):
- tempdir = bpy.path.abspath(tempdir)
- try:
- if not os.path.exists(tempdir):
- os.makedirs(tempdir)
- dirs_exist_dict['top'] = tempdir
-
- if subdir is not None:
- tempdir = os.path.join(tempdir, subdir)
- if not os.path.exists(tempdir):
- os.makedirs(tempdir)
- dirs_exist_dict[subdir] = tempdir
-
- cleanup_old_folders()
- except:
- tasks_queue.add_task((reports.add_report, ('Cache directory not found. Resetting Cache folder path.',)))
-
- p = default_global_dict()
- if p == user_preferences.global_dir:
- 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((reports.add_report, (message,)))
- return None
- user_preferences.global_dir = p
- tempdir = get_temp_dir(subdir=subdir)
- return tempdir
-
-
-
-def get_download_dirs(asset_type):
- ''' get directories where assets will be downloaded'''
- subdmapping = {'brush': 'brushes', 'texture': 'textures', 'model': 'models', 'scene': 'scenes',
- 'material': 'materials', 'hdr':'hdrs'}
-
- user_preferences = bpy.context.preferences.addons['blenderkit'].preferences
- dirs = []
- if user_preferences.directory_behaviour == 'BOTH' or 'GLOBAL':
- ddir = user_preferences.global_dir
- if ddir.startswith('//'):
- ddir = bpy.path.abspath(ddir)
- if not os.path.exists(ddir):
- os.makedirs(ddir)
-
- subd = subdmapping[asset_type]
- subdir = os.path.join(ddir, subd)
- if not os.path.exists(subdir):
- os.makedirs(subdir)
- dirs.append(subdir)
- if (
- user_preferences.directory_behaviour == 'BOTH' or user_preferences.directory_behaviour == 'LOCAL') and bpy.data.is_saved: # it's important local get's solved as second, since for the linking process only last filename will be taken. For download process first name will be taken and if 2 filenames were returned, file will be copied to the 2nd path.
- ddir = user_preferences.project_subdir
- if ddir.startswith('//'):
- ddir = bpy.path.abspath(ddir)
- if not os.path.exists(ddir):
- os.makedirs(ddir)
-
- subd = subdmapping[asset_type]
-
- subdir = os.path.join(ddir, subd)
- if not os.path.exists(subdir):
- os.makedirs(subdir)
- dirs.append(subdir)
-
- return dirs
-
-
-def slugify(slug):
- """
- Normalizes string, converts to lowercase, removes non-alpha characters,
- and converts spaces to hyphens.
- """
- import unicodedata, re
- slug = slug.lower()
-
- characters = '<>:"/\\|?\*., ()#'
- for ch in characters:
- slug = slug.replace(ch, '_')
- # import re
- # slug = unicodedata.normalize('NFKD', slug)
- # slug = slug.encode('ascii', 'ignore').lower()
- slug = re.sub(r'[^a-z0-9]+.- ', '-', slug).strip('-')
- slug = re.sub(r'[-]+', '-', slug)
- slug = re.sub(r'/', '_', slug)
- slug = re.sub(r'\\\'\"', '_', slug)
- if len(slug)>50:
- slug = slug[:50]
- return slug
-
-
-def extract_filename_from_url(url):
- # print(url)
- if url is not None:
- imgname = url.split('/')[-1]
- imgname = imgname.split('?')[0]
- return imgname
- return ''
-
-
-resolution_suffix = {
- 'blend': '',
- 'resolution_0_5K': '_05k',
- 'resolution_1K': '_1k',
- 'resolution_2K': '_2k',
- 'resolution_4K': '_4k',
- 'resolution_8K': '_8k',
-}
-resolutions = {
- 'resolution_0_5K': 512,
- 'resolution_1K': 1024,
- 'resolution_2K': 2048,
- 'resolution_4K': 4096,
- 'resolution_8K': 8192,
-}
-
-
-def round_to_closest_resolution(res):
- rdist = 1000000
- # while res/2>1:
- # p2res*=2
- # res = res/2
- # print(p2res, res)
- for rkey in resolutions:
- # print(resolutions[rkey], rdist)
- d = abs(res - resolutions[rkey])
- if d < rdist:
- rdist = d
- p2res = rkey
-
- return p2res
-
-
-def get_res_file(asset_data, resolution, find_closest_with_url = False):
- '''
- Returns closest resolution that current asset can offer.
- If there are no resolutions, return orig file.
- If orig file is requested, return it.
- params
- asset_data
- resolution - ideal resolution
- find_closest_with_url:
- returns only resolutions that already containt url in the asset data, used in scenes where asset is/was already present.
- Returns:
- resolution file
- resolution, so that other processess can pass correctly which resolution is downloaded.
- '''
- orig = None
- res = None
- closest = None
- target_resolution = resolutions.get(resolution)
- mindist = 100000000
-
- for f in asset_data['files']:
- if f['fileType'] == 'blend':
- orig = f
- if resolution == 'blend':
- #orig file found, return.
- return orig , 'blend'
-
- if f['fileType'] == resolution:
- #exact match found, return.
- return f, resolution
- # find closest resolution if the exact match won't be found.
- rval = resolutions.get(f['fileType'])
- if rval and target_resolution:
- rdiff = abs(target_resolution - rval)
- if rdiff < mindist:
- closest = f
- mindist = rdiff
- # print('\n\n\n\n\n\n\n\n')
- # print(closest)
- # print('\n\n\n\n\n\n\n\n')
- if not res and not closest:
- # utils.pprint(f'will download blend instead of resolution {resolution}')
- return orig , 'blend'
- # utils.pprint(f'found closest resolution {closest["fileType"]} instead of the requested {resolution}')
- return closest, closest['fileType']
-
-def server_2_local_filename(asset_data, filename):
- '''
- Convert file name on server to file name local.
- This should get replaced
- '''
- # print(filename)
- fn = filename.replace('blend_', '')
- fn = fn.replace('resolution_', '')
- # print('after replace ', fn)
- n = slugify(asset_data['name']) + '_' + fn
- return n
-
-def get_texture_directory(asset_data, resolution = 'blend'):
- tex_dir_path = f"//textures{resolution_suffix[resolution]}{os.sep}"
- return tex_dir_path
-
-def get_download_filepaths(asset_data, resolution='blend', can_return_others = False):
- '''Get all possible paths of the asset and resolution. Usually global and local directory.'''
- dirs = get_download_dirs(asset_data['assetType'])
- res_file, resolution = get_res_file(asset_data, resolution, find_closest_with_url = can_return_others)
- name_slug = slugify(asset_data['name'])
- asset_folder_name = f"{name_slug}_{asset_data['id']}"
-
- # utils.pprint('get download filenames ', dict(res_file))
- file_names = []
-
- if not res_file:
- return file_names
- # fn = asset_data['file_name'].replace('blend_', '')
- if res_file.get('url') is not None:
- #Tweak the names a bit:
- # remove resolution and blend words in names
- #
- fn = extract_filename_from_url(res_file['url'])
- n = server_2_local_filename(asset_data,fn)
- for d in dirs:
- asset_folder_path = os.path.join(d,asset_folder_name)
- if not os.path.exists(asset_folder_path):
- os.makedirs(asset_folder_path)
-
- file_name = os.path.join(asset_folder_path, n)
- file_names.append(file_name)
-
- utils.p('file paths', file_names)
- return file_names
-
-
-def delete_asset_debug(asset_data):
- '''TODO fix this for resolutions - should get ALL files from ALL resolutions.'''
- from blenderkit import download
- user_preferences = bpy.context.preferences.addons['blenderkit'].preferences
- api_key = user_preferences.api_key
-
- download.get_download_url(asset_data, download.get_scene_id(), api_key)
-
- file_names = get_download_filepaths(asset_data)
- for f in file_names:
- asset_dir = os.path.dirname(f)
-
- if os.path.isdir(asset_dir):
-
- try:
- print(asset_dir)
- shutil.rmtree(asset_dir)
- except:
- e = sys.exc_info()[0]
- print(e)
- pass;
-
-
-def get_clean_filepath():
- script_path = os.path.dirname(os.path.realpath(__file__))
- subpath = "blendfiles" + os.sep + "cleaned.blend"
- cp = os.path.join(script_path, subpath)
- return cp
-
-
-def get_thumbnailer_filepath():
- script_path = os.path.dirname(os.path.realpath(__file__))
- # fpath = os.path.join(p, subpath)
- subpath = "blendfiles" + os.sep + "thumbnailer.blend"
- return os.path.join(script_path, subpath)
-
-
-def get_material_thumbnailer_filepath():
- script_path = os.path.dirname(os.path.realpath(__file__))
- # fpath = os.path.join(p, subpath)
- subpath = "blendfiles" + os.sep + "material_thumbnailer_cycles.blend"
- return os.path.join(script_path, subpath)
- """
- for p in bpy.utils.script_paths():
- testfname= os.path.join(p, subpath)#p + '%saddons%sobject_fracture%sdata.blend' % (s,s,s)
- if os.path.isfile( testfname):
- fname=testfname
- return(fname)
- return None
- """
-
-
-def get_addon_file(subpath=''):
- script_path = os.path.dirname(os.path.realpath(__file__))
- # fpath = os.path.join(p, subpath)
- return os.path.join(script_path, subpath)
-
-script_path = os.path.dirname(os.path.realpath(__file__))
-
-def get_addon_thumbnail_path(name):
- global script_path
- # fpath = os.path.join(p, subpath)
- ext = name.split('.')[-1]
- next = ''
- if not (ext == 'jpg' or ext == 'png'): # already has ext?
- next = '.jpg'
- subpath = "thumbnails" + os.sep + name + next
- return os.path.join(script_path, subpath)