{"action":"created","comment":{"url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/pulls/comments/25551022","id":25551022,"diff_hunk":"@@ -0,0 +1,466 @@\n+# Copyright (c) 2014 Shotgun Software Inc.\n+# \n+# CONFIDENTIAL AND PROPRIETARY\n+# \n+# This work is provided \"AS IS\" and subject to the Shotgun Pipeline Toolkit \n+# Source Code License included in this distribution package. See LICENSE.\n+# By accessing, using, copying or modifying this work you indicate your \n+# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights \n+# not expressly granted therein are reserved by Shotgun Software Inc.\n+\n+import sgtk\n+import uuid\n+from sgtk import TankError\n+import os\n+import re\n+\n+from .shot_metadata import ShotMetadata\n+\n+class ShotgunSubmitter(object):\n+    \"\"\"\n+    Helper class with methods to submit publishes and versions to Shotgun\n+    \"\"\"\n+    \n+    def __init__(self):\n+        \"\"\"\n+        Constructor\n+        \"\"\"\n+        self._app = sgtk.platform.current_bundle()\n+\n+\n+    def resolve_sg_shot_structure(self, parent_name, shot_names):\n+        \"\"\"\n+        Ensures that Shots exists in Shotgun. Will automatically create\n+        Shots and Shot parents (e.g. sequences) if necessary and assign\n+        task templates. Returns a dictionary with Shot metadata\n+        \n+        :param parent_name: Name of the shot parent (usually this is the sequence)\n+        :param shot_names: List of shot names\n+        :returns: List of ShotMetadata objects  \n+        \"\"\"\n+        # get some configuration settings first\n+        shot_task_template = self._app.get_setting(\"task_template\")\n+        if shot_task_template == \"\":\n+            shot_task_template = None\n+\n+        parent_task_template = self._app.get_setting(\"shot_parent_task_template\")\n+        if parent_task_template == \"\":\n+            parent_task_template = None\n+\n+        shot_parent_entity_type = self._app.get_setting(\"shot_parent_entity_type\")\n+        shot_parent_link_field = self._app.get_setting(\"shot_parent_link_field\")\n+\n+        # handy shorthand\n+        project = self._app.context.project\n+\n+        # first, ensure that a parent exists in Shotgun with the parent name\n+        self._app.engine.show_busy(\"Preparing Shotgun...\", \n+                                   \"Locating %s %s...\" % (shot_parent_entity_type, parent_name))\n+        \n+        sg_parent = self._app.shotgun.find_one(shot_parent_entity_type, \n+                                               [[\"code\", \"is\", parent_name], [\"project\", \"is\", project]]) \n+        \n+        if not sg_parent:\n+            # Create a new parent object in Shotgun\n+            self._app.engine.show_busy(\"Preparing Shotgun...\", \n+                                       \"Creating %s %s...\" % (shot_parent_entity_type, parent_name))\n+            \n+            # First see if we should assign a task template\n+            if parent_task_template:\n+                # resolve task template\n+                sg_task_template = self._app.shotgun.find_one(\"TaskTemplate\", [[\"code\", \"is\", parent_task_template]])\n+                if not sg_task_template:\n+                    raise TankError(\"The task template '%s' does not exist in Shotgun!\" % parent_task_template)\n+            else:\n+                sg_task_template = None\n+            \n+            sg_parent = self._app.shotgun.create(shot_parent_entity_type, \n+                                                 {\"code\": parent_name, \n+                                                  \"task_template\": sg_task_template,\n+                                                  \"description\": \"Created by the Shotgun Flame exporter.\",\n+                                                  \"project\": project})\n+  \n+        # First locate a task template for shots\n+        if shot_task_template:\n+            # resolve task template\n+            self._app.engine.show_busy(\"Preparing Shotgun...\", \"Locating Shot task template...\")\n+            sg_task_template = self._app.shotgun.find_one(\"TaskTemplate\", [[\"code\", \"is\", shot_task_template]])\n+            if not sg_task_template:\n+                raise TankError(\"The task template '%s' does not exist in Shotgun!\" % shot_task_template)\n+        else:\n+            sg_task_template = None\n+  \n+        # now resolve all the shots. Shots that don't already exists are created.\n+        shots = []\n+        for shot_name in shot_names:\n+\n+            self._app.engine.show_busy(\"Preparing Shotgun...\", \"Locating Shot %s...\" % shot_name)\n+\n+            shot = self._app.shotgun.find_one(\"Shot\", \n+                                              [[\"code\", \"is\", shot_name], [shot_parent_link_field, \"is\", sg_parent]],\n+                                              [\"sg_cut_in\", \"sg_cut_out\", \"sg_cut_order\"])\n+            \n+            metadata = ShotMetadata()\n+            metadata.name = shot_name\n+            metadata.parent_name = parent_name\n+            metadata.shotgun_parent = sg_parent\n+            shots.append(metadata)\n+            \n+            if shot:\n+                # store it in our return data dict\n+                metadata.shotgun_id = shot[\"id\"]\n+                metadata.shotgun_cut_in = shot[\"sg_cut_in\"]\n+                metadata.shotgun_cut_out = shot[\"sg_cut_out\"]\n+            \n+            else:\n+                # Create a new shot in Shotgun\n+                self._app.engine.show_busy(\"Preparing Shotgun...\", \"Creating Shot %s...\" % shot_name)\n+                                    \n+                shot = self._app.shotgun.create(\"Shot\", {\"code\": shot_name, \n+                                                    \"description\": \"Created by the Shotgun Flame exporter.\",\n+                                                    shot_parent_link_field: sg_parent,\n+                                                    \"task_template\": sg_task_template,\n+                                                    \"project\": project})\n+                \n+                # store it in our return data dict\n+                metadata.created_this_session = True\n+                metadata.shotgun_id = shot[\"id\"]\n+            \n+        return shots\n+\n+\n+    def register_batch_publish(self, context, path, comments, version_number):\n+        \"\"\"\n+        Creates a publish record in shotgun for a flame batch file.\n+        \n+        :param context: Context to associate the publish with\n+        :param path: Path to the batch file on disk\n+        :param comments: Details about the publish\n+        :param version_number: The version number to use\n+        :returns: Shotgun data for the created item\n+        \"\"\"\n+        self._app.log_debug(\"Creating batch publish in Shotgun...\")                \n+        publish_type = self._app.get_setting(\"batch_publish_type\")\n+                                \n+        # put together a name for the publish. This should be on a form without a version\n+        # number, so that it can be used to group together publishes of the same kind, but\n+        # with different versions.\n+        # e.g. 'sequences/{Sequence}/{Shot}/editorial/flame/batch/{Shot}.v{version}.batch'\n+        batch_template = self._app.get_template(\"batch_template\")\n+        fields = batch_template.get_fields(path)\n+        publish_name = fields.get(\"Shot\")\n+            \n+        # now start assemble publish parameters\n+        args = {\n+            \"tk\": self._app.sgtk,\n+            \"context\": context,\n+            \"comment\": comments,\n+            \"path\": path,\n+            \"name\": publish_name,\n+            \"version_number\": version_number,\n+            \"created_by\": context.user,\n+            \"task\": context.task,\n+            \"published_file_type\": publish_type,\n+        }\n+        \n+        self._app.log_debug(\"Register publish in shotgun: %s\" % str(args))        \n+        sg_publish_data = sgtk.util.register_publish(**args)\n+        self._app.log_debug(\"Register complete: %s\" % sg_publish_data)\n+        return sg_publish_data\n+        \n+        \n+    def register_video_publish(self, context, path, comments, version_number, width, height, make_shot_thumb):        \n+        \"\"\"\n+        Creates a publish record in shotgun for a flame batch file.\n+        \n+        :param context: Context to associate the publish with\n+        :param path: Flame-style path to the frame sequence\n+        :param comments: Details about the publish\n+        :param version_number: The version number to use\n+        :param width: Image width in pixels\n+        :param height: Image height in pixels\n+        :param make_shot_thumb: If set to True, the thumbnail that gets associated with the \n+                                publish will also be pushed to the associated entity.\n+        :returns: Shotgun data for the created item\n+        \"\"\"\n+        self._app.log_debug(\"Creating video publish in Shotgun...\")\n+                                    \n+        # put together a name for the publish. This should be on a form without a version\n+        # number, so that it can be used to group together publishes of the same kind, but\n+        # with different versions. \n+        # e.g. 'sequences/{Sequence}/{Shot}/editorial/plates/{segment_name}_{Shot}.v{version}.{SEQ}.dpx'\n+        # \n+        # In order to determine this, loop over all the plate presets, find the matching profile\n+        # and use that\n+        publish_name = \"unknown\"\n+        publish_type = \"Unknown\"\n+        for preset in self._app.get_setting(\"plate_presets\"):\n+            plate_template_name = preset[\"template\"]\n+            template = self._app.get_template_by_name(plate_template_name)\n+            if template.validate(path):\n+                fields = template.get_fields(path)\n+                publish_name = \"%s, %s\" % (fields.get(\"Shot\"), fields.get(\"segment_name\"))\n+                publish_type = preset[\"publish_type\"]\n+                break\n+        \n+        # now start assemble publish parameters\n+        args = {\n+            \"tk\": self._app.sgtk,\n+            \"context\": context,\n+            \"comment\": comments,\n+            \"path\": path,\n+            \"name\": publish_name,\n+            \"version_number\": version_number,\n+            \"created_by\": context.user,\n+            \"task\": context.task,\n+            \"published_file_type\": publish_type,\n+        }\n+        \n+        # now try to extract a thumbnail from the asset data stream.\n+        # we use the same mechanism that the quicktime generation is using - see\n+        # the quicktime code below for details:\n+        #\n+        input_cmd = \"%s -n \\\"%s@CLIP\\\" -h %s -W %s -H %s -L\" % (self._app.engine.get_read_frame_path(),\n+                                                                path,\n+                                                                \"%s:Gateway\" % self._app.engine.get_server_hostname(), \n+                                                                width,\n+                                                                height)\n+        \n+        thumbnail_jpg = os.path.join(self._app.engine.get_backburner_tmp(), \"tk_thumb_%s.jpg\" % uuid.uuid4().hex)\n+        if os.system(\"%s > %s\" % (input_cmd, thumbnail_jpg)) != 0:\n+            self._app.log_warning(\"Could not extract thumbnail! See error log for details.\")\n+        else:\n+            self._app.log_debug(\"Wrote thumbnail %s\" % thumbnail_jpg)\n+            # add the thumbnail to the publish generation\n+            args[\"thumbnail_path\"] = thumbnail_jpg\n+        \n+        # check if the shot needs a thumbnail\n+        if make_shot_thumb:\n+            args[\"update_entity_thumbnail\"] = True\n+        \n+        self._app.log_debug(\"Register publish in shotgun: %s\" % str(args))        \n+        sg_publish_data = sgtk.util.register_publish(**args)\n+        self._app.log_debug(\"Register complete: %s\" % sg_publish_data)\n+        \n+        if thumbnail_jpg:\n+            # try to clean up\n+            self.__clean_up_temp_file(thumbnail_jpg)\n+            \n+        return sg_publish_data\n+            \n+    def create_version(self, context, path, user_comments, sg_publish_data, width, height, aspect_ratio):        \n+        \"\"\"\n+        Create a version record in shotgun, generate a quicktime and upload it.\n+        \n+        This method will do the following:\n+        - Create a Shotgun version entity and populate as much metadata as possible\n+        - Generate a quicktime by streaming the asset data via wiretap into ffmepg.\n+          A h264 quicktime with shotgun-friendly settings are created, however the quicktime\n+          defaults are defined in the settings hook and can be controlled by the user.\n+        - Lastly, uploads the quicktime to Shotgun and then deletes it off disk.        \n+        \n+        :param context: The context for the shot that the submission is associated with, \n+                        in serialized form.\n+        :param path: Path to frames, flame style path with [1234-1234] sequence marker.\n+        :param user_comments: Comments entered by the user at export start.\n+        :param sg_publish_data: Std shotgun dictionary (with type and id), representing the publish\n+                                in Shotgun that has been carried out for this asset.\n+        :param width: Image width in pixels\n+        :param height: Image height in pixels\n+        :param aspect_ratio: Aspect ratio of the images\n+        :returns: The created shotgun record\n+        \"\"\"\n+        \n+        # note / todo: there doesn't seem to be any way to downscale the quicktime\n+        # as it is being generated/streamed out of wiretap and encoded by ffmpeg.\n+        # ideally we would like to downrez it to height 720px prior to uploading\n+        # according to the Shotgun transcoding guidelines (and to optimize bandwidth)\n+        self._app.log_debug(\"Begin version processing for %s...\" % path)\n+\n+        data = {}\n+        \n+        # let the version name be the main file name of the plate\n+        # /path/to/filename -> filename\n+        # /path/to/filename.ext -> filename\n+        # /path/to/filename.%04d.ext -> filename\n+        file_name = os.path.basename(path)\n+        version_name = os.path.splitext(os.path.splitext(file_name)[0])[0]\n+        data[\"code\"] = version_name\n+        \n+        data[\"description\"] = user_comments\n+        data[\"project\"] = context.project\n+        data[\"entity\"] = context.entity\n+        data[\"created_by\"] = context.user\n+        data[\"user\"] = context.user\n+        data[\"sg_task\"] = context.task\n+        \n+        # now figure out the frame numbers. For an initial shotgun export this is easy because we have\n+        # access to the export profile which defines the frame offset which maps actual frames on disk with\n+        # frames in the cut space inside of flame. However, for batch rendering, which is currently stateless,\n+        # this info is not available. It may be possible to extract it from the clip xml files, but for now,\n+        # lets keep it simple and look at the sequence file path to extract this data.\n+        #\n+        # flame sequence tokens are on the form \"[1001-1100]\"\n+        re_match = re.search(\"\\[([0-9]+)-([0-9]+)\\]\\.\", path)\n+        if not re_match:\n+            self._app.log_warning(\"No frame range information found in path '%s'. \"\n+                                  \"Will proceed with undefined frame range.\" % path)\n+        else:\n+            try:\n+                (first_str, last_str) = re_match.groups()\n+                # remove leading zeroes and convert\n+                first_str = first_str.lstrip(\"0\")","path":"python/tk_flame_export_no_ui/shotgun_submit.py","position":447,"original_position":312,"commit_id":"f32de78e0214592f1f8ca6ab36ff31175cf1f8eb","original_commit_id":"f32bba739eb88f0d12813163411c69232039baba","user":{"login":"manneohrstrom","id":337710,"avatar_url":"https://avatars.githubusercontent.com/u/337710?v=3","gravatar_id":"","url":"https://api.github.com/users/manneohrstrom","html_url":"https://github.com/manneohrstrom","followers_url":"https://api.github.com/users/manneohrstrom/followers","following_url":"https://api.github.com/users/manneohrstrom/following{/other_user}","gists_url":"https://api.github.com/users/manneohrstrom/gists{/gist_id}","starred_url":"https://api.github.com/users/manneohrstrom/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/manneohrstrom/subscriptions","organizations_url":"https://api.github.com/users/manneohrstrom/orgs","repos_url":"https://api.github.com/users/manneohrstrom/repos","events_url":"https://api.github.com/users/manneohrstrom/events{/privacy}","received_events_url":"https://api.github.com/users/manneohrstrom/received_events","type":"User","site_admin":false},"body":"heheh, great question! Most likely towards the end of a very long week. I think I was thinking that `int(\"073\")` would do an octal conversion, like `073`. But that's not the case!","created_at":"2015-02-28T00:58:09Z","updated_at":"2015-02-28T00:58:09Z","html_url":"https://github.com/shotgunsoftware/tk-flame-export/pull/2#discussion_r25551022","pull_request_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/pulls/2","_links":{"self":{"href":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/pulls/comments/25551022"},"html":{"href":"https://github.com/shotgunsoftware/tk-flame-export/pull/2#discussion_r25551022"},"pull_request":{"href":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/pulls/2"}}},"pull_request":{"url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/pulls/2","id":27507280,"html_url":"https://github.com/shotgunsoftware/tk-flame-export/pull/2","diff_url":"https://github.com/shotgunsoftware/tk-flame-export/pull/2.diff","patch_url":"https://github.com/shotgunsoftware/tk-flame-export/pull/2.patch","issue_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/issues/2","number":2,"state":"open","locked":false,"title":"Initial code review","user":{"login":"sgsteph","id":7289580,"avatar_url":"https://avatars.githubusercontent.com/u/7289580?v=3","gravatar_id":"","url":"https://api.github.com/users/sgsteph","html_url":"https://github.com/sgsteph","followers_url":"https://api.github.com/users/sgsteph/followers","following_url":"https://api.github.com/users/sgsteph/following{/other_user}","gists_url":"https://api.github.com/users/sgsteph/gists{/gist_id}","starred_url":"https://api.github.com/users/sgsteph/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sgsteph/subscriptions","organizations_url":"https://api.github.com/users/sgsteph/orgs","repos_url":"https://api.github.com/users/sgsteph/repos","events_url":"https://api.github.com/users/sgsteph/events{/privacy}","received_events_url":"https://api.github.com/users/sgsteph/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-01-16T14:07:15Z","updated_at":"2015-02-28T00:58:09Z","closed_at":null,"merged_at":null,"merge_commit_sha":"146ef4ab878b9899d0f70e3beb5409d3acdc5725","assignee":{"login":"sgsteph","id":7289580,"avatar_url":"https://avatars.githubusercontent.com/u/7289580?v=3","gravatar_id":"","url":"https://api.github.com/users/sgsteph","html_url":"https://github.com/sgsteph","followers_url":"https://api.github.com/users/sgsteph/followers","following_url":"https://api.github.com/users/sgsteph/following{/other_user}","gists_url":"https://api.github.com/users/sgsteph/gists{/gist_id}","starred_url":"https://api.github.com/users/sgsteph/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sgsteph/subscriptions","organizations_url":"https://api.github.com/users/sgsteph/orgs","repos_url":"https://api.github.com/users/sgsteph/repos","events_url":"https://api.github.com/users/sgsteph/events{/privacy}","received_events_url":"https://api.github.com/users/sgsteph/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/pulls/2/commits","review_comments_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/pulls/2/comments","review_comment_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/pulls/comments{/number}","comments_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/issues/2/comments","statuses_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/statuses/f32de78e0214592f1f8ca6ab36ff31175cf1f8eb","head":{"label":"shotgunsoftware:master","ref":"master","sha":"f32de78e0214592f1f8ca6ab36ff31175cf1f8eb","user":{"login":"shotgunsoftware","id":317894,"avatar_url":"https://avatars.githubusercontent.com/u/317894?v=3","gravatar_id":"","url":"https://api.github.com/users/shotgunsoftware","html_url":"https://github.com/shotgunsoftware","followers_url":"https://api.github.com/users/shotgunsoftware/followers","following_url":"https://api.github.com/users/shotgunsoftware/following{/other_user}","gists_url":"https://api.github.com/users/shotgunsoftware/gists{/gist_id}","starred_url":"https://api.github.com/users/shotgunsoftware/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shotgunsoftware/subscriptions","organizations_url":"https://api.github.com/users/shotgunsoftware/orgs","repos_url":"https://api.github.com/users/shotgunsoftware/repos","events_url":"https://api.github.com/users/shotgunsoftware/events{/privacy}","received_events_url":"https://api.github.com/users/shotgunsoftware/received_events","type":"Organization","site_admin":false},"repo":{"id":24288250,"name":"tk-flame-export","full_name":"shotgunsoftware/tk-flame-export","owner":{"login":"shotgunsoftware","id":317894,"avatar_url":"https://avatars.githubusercontent.com/u/317894?v=3","gravatar_id":"","url":"https://api.github.com/users/shotgunsoftware","html_url":"https://github.com/shotgunsoftware","followers_url":"https://api.github.com/users/shotgunsoftware/followers","following_url":"https://api.github.com/users/shotgunsoftware/following{/other_user}","gists_url":"https://api.github.com/users/shotgunsoftware/gists{/gist_id}","starred_url":"https://api.github.com/users/shotgunsoftware/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shotgunsoftware/subscriptions","organizations_url":"https://api.github.com/users/shotgunsoftware/orgs","repos_url":"https://api.github.com/users/shotgunsoftware/repos","events_url":"https://api.github.com/users/shotgunsoftware/events{/privacy}","received_events_url":"https://api.github.com/users/shotgunsoftware/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/shotgunsoftware/tk-flame-export","description":"A Shotgun Pipeline Toolkit App to export data into Shotgun.","fork":false,"url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export","forks_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/forks","keys_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/keys{/key_id}","collaborators_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/teams","hooks_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/hooks","issue_events_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/issues/events{/number}","events_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/events","assignees_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/assignees{/user}","branches_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/branches{/branch}","tags_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/tags","blobs_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/git/refs{/sha}","trees_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/git/trees{/sha}","statuses_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/statuses/{sha}","languages_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/languages","stargazers_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/stargazers","contributors_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/contributors","subscribers_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/subscribers","subscription_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/subscription","commits_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/commits{/sha}","git_commits_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/git/commits{/sha}","comments_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/comments{/number}","issue_comment_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/issues/comments{/number}","contents_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/contents/{+path}","compare_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/compare/{base}...{head}","merges_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/merges","archive_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/downloads","issues_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/issues{/number}","pulls_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/pulls{/number}","milestones_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/milestones{/number}","notifications_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/labels{/name}","releases_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/releases{/id}","created_at":"2014-09-21T10:29:32Z","updated_at":"2015-02-17T15:42:49Z","pushed_at":"2015-02-27T19:05:20Z","git_url":"git://github.com/shotgunsoftware/tk-flame-export.git","ssh_url":"git@github.com:shotgunsoftware/tk-flame-export.git","clone_url":"https://github.com/shotgunsoftware/tk-flame-export.git","svn_url":"https://github.com/shotgunsoftware/tk-flame-export","homepage":"","size":16964,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":2,"forks":0,"open_issues":2,"watchers":0,"default_branch":"master"}},"base":{"label":"shotgunsoftware:26903_initial_code_review","ref":"26903_initial_code_review","sha":"3249e528e7fc2b424ccd3aa02f99127aee0018af","user":{"login":"shotgunsoftware","id":317894,"avatar_url":"https://avatars.githubusercontent.com/u/317894?v=3","gravatar_id":"","url":"https://api.github.com/users/shotgunsoftware","html_url":"https://github.com/shotgunsoftware","followers_url":"https://api.github.com/users/shotgunsoftware/followers","following_url":"https://api.github.com/users/shotgunsoftware/following{/other_user}","gists_url":"https://api.github.com/users/shotgunsoftware/gists{/gist_id}","starred_url":"https://api.github.com/users/shotgunsoftware/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shotgunsoftware/subscriptions","organizations_url":"https://api.github.com/users/shotgunsoftware/orgs","repos_url":"https://api.github.com/users/shotgunsoftware/repos","events_url":"https://api.github.com/users/shotgunsoftware/events{/privacy}","received_events_url":"https://api.github.com/users/shotgunsoftware/received_events","type":"Organization","site_admin":false},"repo":{"id":24288250,"name":"tk-flame-export","full_name":"shotgunsoftware/tk-flame-export","owner":{"login":"shotgunsoftware","id":317894,"avatar_url":"https://avatars.githubusercontent.com/u/317894?v=3","gravatar_id":"","url":"https://api.github.com/users/shotgunsoftware","html_url":"https://github.com/shotgunsoftware","followers_url":"https://api.github.com/users/shotgunsoftware/followers","following_url":"https://api.github.com/users/shotgunsoftware/following{/other_user}","gists_url":"https://api.github.com/users/shotgunsoftware/gists{/gist_id}","starred_url":"https://api.github.com/users/shotgunsoftware/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shotgunsoftware/subscriptions","organizations_url":"https://api.github.com/users/shotgunsoftware/orgs","repos_url":"https://api.github.com/users/shotgunsoftware/repos","events_url":"https://api.github.com/users/shotgunsoftware/events{/privacy}","received_events_url":"https://api.github.com/users/shotgunsoftware/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/shotgunsoftware/tk-flame-export","description":"A Shotgun Pipeline Toolkit App to export data into Shotgun.","fork":false,"url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export","forks_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/forks","keys_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/keys{/key_id}","collaborators_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/teams","hooks_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/hooks","issue_events_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/issues/events{/number}","events_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/events","assignees_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/assignees{/user}","branches_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/branches{/branch}","tags_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/tags","blobs_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/git/refs{/sha}","trees_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/git/trees{/sha}","statuses_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/statuses/{sha}","languages_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/languages","stargazers_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/stargazers","contributors_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/contributors","subscribers_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/subscribers","subscription_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/subscription","commits_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/commits{/sha}","git_commits_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/git/commits{/sha}","comments_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/comments{/number}","issue_comment_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/issues/comments{/number}","contents_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/contents/{+path}","compare_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/compare/{base}...{head}","merges_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/merges","archive_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/downloads","issues_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/issues{/number}","pulls_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/pulls{/number}","milestones_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/milestones{/number}","notifications_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/labels{/name}","releases_url":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/releases{/id}","created_at":"2014-09-21T10:29:32Z","updated_at":"2015-02-17T15:42:49Z","pushed_at":"2015-02-27T19:05:20Z","git_url":"git://github.com/shotgunsoftware/tk-flame-export.git","ssh_url":"git@github.com:shotgunsoftware/tk-flame-export.git","clone_url":"https://github.com/shotgunsoftware/tk-flame-export.git","svn_url":"https://github.com/shotgunsoftware/tk-flame-export","homepage":"","size":16964,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":2,"forks":0,"open_issues":2,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/pulls/2"},"html":{"href":"https://github.com/shotgunsoftware/tk-flame-export/pull/2"},"issue":{"href":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/issues/2"},"comments":{"href":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/issues/2/comments"},"review_comments":{"href":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/pulls/2/comments"},"review_comment":{"href":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/pulls/2/commits"},"statuses":{"href":"https://api.github.com/repos/shotgunsoftware/tk-flame-export/statuses/f32de78e0214592f1f8ca6ab36ff31175cf1f8eb"}}}}