[Bf-extensions-cvs] [fc73dfda] master: io_online_sketchfab: move to contrib: T63750
meta-androcto
noreply at git.blender.org
Fri May 24 04:23:58 CEST 2019
Commit: fc73dfda8ba886fb30a6d8ebd3d0bca955e20fe0
Author: meta-androcto
Date: Fri May 24 12:23:37 2019 +1000
Branches: master
https://developer.blender.org/rBAfc73dfda8ba886fb30a6d8ebd3d0bca955e20fe0
io_online_sketchfab: move to contrib: T63750
===================================================================
D io_online_sketchfab/__init__.py
D io_online_sketchfab/pack_for_export.py
===================================================================
diff --git a/io_online_sketchfab/__init__.py b/io_online_sketchfab/__init__.py
deleted file mode 100644
index 5448d470..00000000
--- a/io_online_sketchfab/__init__.py
+++ /dev/null
@@ -1,512 +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 #####
-
-bl_info = {
- "name": "Sketchfab Exporter",
- "author": "Bart Crouch",
- "version": (1, 2, 3),
- "blender": (2, 70, 0),
- "location": "Tools > File I/O tab",
- "description": "Upload your model to Sketchfab",
- "warning": "",
- "wiki_url": "",
- "category": "Import-Export"
-}
-
-import bpy
-import os
-import tempfile
-import threading
-import subprocess
-
-from bpy.app.handlers import persistent
-from bpy.props import (
- StringProperty,
- EnumProperty,
- BoolProperty,
- PointerProperty,
- )
-from bpy.types import (
- Operator,
- Panel,
- AddonPreferences,
- PropertyGroup,
- )
-
-
-SKETCHFAB_API_URL = "https://api.sketchfab.com"
-SKETCHFAB_API_MODELS_URL = SKETCHFAB_API_URL + "/v1/models"
-SKETCHFAB_API_TOKEN_URL = SKETCHFAB_API_URL + "/v1/users/claim-token"
-SKETCHFAB_MODEL_URL = "https://sketchfab.com/show/"
-SKETCHFAB_EXPORT_FILENAME = "sketchfab-export.blend"
-
-_presets = os.path.join(bpy.utils.user_resource('SCRIPTS'), "presets")
-SKETCHFAB_PRESET_FILENAME = os.path.join(_presets, "sketchfab.txt")
-SKETCHFAB_EXPORT_DATA_FILE = os.path.join(_presets, "sketchfab-export-data.json")
-del _presets
-
-
-# Singleton for storing global state
-class _SketchfabState:
- __slots__ = (
- "uploading",
- "token_reload",
- "size_label",
- "model_url",
-
- # store report args
- "report_message",
- "report_type",
- )
-
- def __init__(self):
- self.uploading = False
- self.token_reload = True
- self.size_label = ""
- self.model_url = ""
-
- self.report_message = ""
- self.report_type = ''
-
-
-sf_state = _SketchfabState()
-del _SketchfabState
-
-# if True, no contact is made with the webserver
-DEBUG_MODE = False
-
-
-# change a bytes int into a properly formatted string
-def format_size(size):
- size /= 1024
- size_suffix = "kB"
- if size > 1024:
- size /= 1024
- size_suffix = "mB"
- if size >= 100:
- size = "%d" % int(size)
- else:
- size = "%.1f" % size
- size += " " + size_suffix
-
- return size
-
-
-# attempt to load token from presets
- at persistent
-def load_token(dummy=False):
- filepath = SKETCHFAB_PRESET_FILENAME
- if not os.path.exists(filepath):
- return
-
- token = ""
- try:
- with open(filepath, 'r', encoding='utf-8') as f:
- token = f.readline()
- except:
- import traceback
- traceback.print_exc()
-
- wm = bpy.context.window_manager
- wm.sketchfab.token = token
-
-
-# save token to file
-def update_token(self, context):
- token = context.window_manager.sketchfab.token
- filepath = SKETCHFAB_PRESET_FILENAME
-
- path = os.path.dirname(filepath)
- if not os.path.exists(path):
- os.makedirs(path)
-
- with open(filepath, 'w', encoding='utf-8') as f:
- f.write(token)
-
-
-def upload_report(report_message, report_type):
- sf_state.report_message = report_message
- sf_state.report_type = report_type
-
-
-# upload the blend-file to sketchfab
-def upload(filepath, filename):
- import requests
-
- wm = bpy.context.window_manager
- props = wm.sketchfab
-
- title = props.title
- if not title:
- title = os.path.splitext(os.path.basename(bpy.data.filepath))[0]
-
- data = {
- "title": title,
- "description": props.description,
- "filename": filename,
- "tags": props.tags,
- "private": props.private,
- "token": props.token,
- "source": "blender-exporter",
- }
-
- if props.private and props.password != "":
- data["password"] = props.password
-
- files = {
- "fileModel": open(filepath, 'rb'),
- }
-
- try:
- r = requests.post(SKETCHFAB_API_MODELS_URL, data=data, files=files, verify=False)
- except requests.exceptions.RequestException as e:
- return upload_report("Upload failed. Error: %s" % str(e), 'WARNING')
-
- result = r.json()
- if r.status_code != requests.codes.ok:
- return upload_report("Upload failed. Error: %s" % result["error"], 'WARNING')
-
- sf_state.model_url = SKETCHFAB_MODEL_URL + result["result"]["id"]
- return upload_report("Upload complete. Available on your sketchfab.com dashboard.", 'INFO')
-
-
-# operator to export model to sketchfab
-class ExportSketchfab(Operator):
- """Upload your model to Sketchfab"""
- bl_idname = "export.sketchfab"
- bl_label = "Upload"
-
- _timer = None
- _thread = None
-
- def modal(self, context, event):
- if event.type == 'TIMER':
- if not self._thread.is_alive():
- wm = context.window_manager
- props = wm.sketchfab
- terminate(props.filepath)
- if context.area:
- context.area.tag_redraw()
-
- # forward message from upload thread
- if not sf_state.report_type:
- sf_state.report_type = 'ERROR'
- self.report({sf_state.report_type}, sf_state.report_message)
-
- wm.event_timer_remove(self._timer)
- self._thread.join()
- sf_state.uploading = False
- return {'FINISHED'}
-
- return {'PASS_THROUGH'}
-
- def execute(self, context):
- import json
-
- if sf_state.uploading:
- self.report({'WARNING'}, "Please wait till current upload is finished")
- return {'CANCELLED'}
-
- wm = context.window_manager
- sf_state.model_url = ""
- props = wm.sketchfab
- if not props.token:
- self.report({'ERROR'}, "Token is missing")
- return {'CANCELLED'}
-
- # Prepare to save the file
- binary_path = bpy.app.binary_path
- script_path = os.path.dirname(os.path.realpath(__file__))
- basename, ext = os.path.splitext(bpy.data.filepath)
- if not basename:
- basename = os.path.join(basename, "temp")
- if not ext:
- ext = ".blend"
- tempdir = tempfile.mkdtemp()
- filepath = os.path.join(tempdir, "export-sketchfab" + ext)
-
- try:
- # save a copy of actual scene but don't interfere with the users models
- bpy.ops.wm.save_as_mainfile(filepath=filepath, compress=True, copy=True)
-
- with open(SKETCHFAB_EXPORT_DATA_FILE, 'w') as s:
- json.dump({
- "models": props.models,
- "lights": props.lights,
- }, s)
-
- subprocess.check_call([
- binary_path,
- "--background",
- "-noaudio",
- filepath,
- "--python", os.path.join(script_path, "pack_for_export.py"),
- "--", tempdir
- ])
-
- os.remove(filepath)
-
- # read subprocess call results
- with open(SKETCHFAB_EXPORT_DATA_FILE, 'r') as s:
- r = json.load(s)
- size = r["size"]
- props.filepath = r["filepath"]
- filename = r["filename"]
-
- except Exception as e:
- self.report({'WARNING'}, "Error occurred while preparing your file: %s" % str(e))
- return {'FINISHED'}
-
- sf_state.uploading = True
- sf_state.size_label = format_size(size)
- self._thread = threading.Thread(
- target=upload,
- args=(props.filepath, filename),
- )
- self._thread.start()
-
- wm.modal_handler_add(self)
- self._timer = wm.event_timer_add(1.0, context.window)
-
- return {'RUNNING_MODAL'}
-
- def cancel(self, context):
- wm = context.window_manager
- wm.event_timer_remove(self._timer)
- self._thread.join()
-
-
-# user interface
-class VIEW3D_PT_sketchfab(Panel):
- bl_space_type = 'VIEW_3D'
- bl_region_type = 'TOOLS'
- bl_category = "File I/O"
- bl_context = "objectmode"
- bl_label = "Sketchfab"
-
- def draw(self, context):
- wm = context.window_manager
- props = wm.sketchfab
- if sf_state.token_reload:
- sf_state.token_reload = False
- if not props.token:
- load_token()
- layout = self.layout
-
- layout.label(text="Export:")
- col = layout.box().column(align=True)
- col.prop(props, "models")
- col.prop(props, "lights")
-
- layout.label(text="Model info:")
- col = layout.box().column(align=True)
- col.prop(props, "title")
- col.prop(props, "description")
- col.prop(props, "tags")
- col.prop(props, "private")
- if props.private:
- col.prop(props, "password")
-
- layout.label(text="Sketchfab account:")
- col = layout.box().column(align=True)
- col.prop(props, "token")
- row = col.row()
- row.operator("wm.sketchfab_email_token", text="Claim Your Token")
- row.alignment = 'RIGHT'
- if sf_state.uploading:
- layout.operator("export.sketchfab",
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list