Ejemplo n.º 1
0
    def get(self, playlist_id):
        playlist = playlists_service.get_playlist(playlist_id)
        project = projects_service.get_project(playlist["project_id"])
        user_service.block_access_to_vendor()
        user_service.check_playlist_access(playlist)
        zip_file_path = playlists_service.build_playlist_zip_file(playlist)

        context_name = slugify.slugify(project["name"], separator="_")
        if project["production_type"] == "tvshow":
            episode_id = playlist["episode_id"]
            if episode_id is not None:
                episode = shots_service.get_episode(playlist["episode_id"])
                episode_name = episode["name"]
            elif playlist["is_for_all"]:
                episode_name = "all assets"
            else:
                episode_name = "main pack"
            context_name += "_%s" % slugify.slugify(
                episode_name, separator="_"
            )
        attachment_filename = "%s_%s.zip" % (
            context_name,
            slugify.slugify(playlist["name"], separator="_"),
        )

        return flask_send_file(
            zip_file_path,
            conditional=True,
            mimetype="application/zip",
            as_attachment=True,
            attachment_filename=attachment_filename,
        )
Ejemplo n.º 2
0
 def delete(self, playlist_id, build_job_id):
     """
     Remove given build job related to given playlist. 
     ---
     tags:
     - Playlists
     parameters:
       - in: path
         name: playlist_id
         required: True
         schema:
             type: UUID
             example: a24a6ea4-ce75-4665-a070-57453082c25
       - in: path
         name: build_job_id
         required: True
         schema:
             type: UUID
             example: a24a6ea4-ce75-4665-a070-57453082c25
     responses:
         204:
             description: Given build job removed
     """
     user_service.block_access_to_vendor()
     playlist = playlists_service.get_playlist(playlist_id)
     user_service.check_playlist_access(playlist)
     playlists_service.remove_build_job(playlist, build_job_id)
     return "", 204
Ejemplo n.º 3
0
    def get(self, playlist_id):
        playlist = playlists_service.get_playlist(playlist_id)
        user_service.check_manager_project_access(playlist["project_id"])

        project = projects_service.get_project(playlist["project_id"])
        (width, height) = preview_files_service.get_preview_file_dimensions(project)
        fps = preview_files_service.get_preview_file_fps(project)

        params = EncodingParameters(width=width, height=height, fps=fps)

        shots = [{"preview_file_id": x.get("preview_file_id")} for x in playlist["shots"]]

        if config.ENABLE_JOB_QUEUE:
            remote = config.ENABLE_JOB_QUEUE_REMOTE
            # remote worker can not access files local to the web app
            assert not remote or config.FS_BACKEND in ["s3", "swift"]

            current_user = persons_service.get_current_user()
            queue_store.job_queue.enqueue(
                playlists_service.build_playlist_job,
                args = (playlist, shots, params, current_user["email"], remote),
                job_timeout=3600,
            )
            return {"job": "running"}
        else:
            job = playlists_service.build_playlist_movie_file(
                playlist, shots, params, remote=False
            )
            return {"job": job["status"]}
Ejemplo n.º 4
0
    def get(self, playlist_id, build_job_id):
        playlist = playlists_service.get_playlist(playlist_id)
        project = projects_service.get_project(playlist["project_id"])
        build_job = playlists_service.get_build_job(build_job_id)
        user_service.check_manager_project_access(playlist["project_id"])

        if build_job["status"] != "succeeded":
            return {"error": True, "message": "Build is not finished"}, 400
        else:
            movie_file_path = fs.get_file_path(
                config,
                file_store.get_local_movie_path,
                file_store.open_movie,
                "playlists",
                build_job_id,
                "mp4",
            )
            context_name = slugify.slugify(project["name"], separator="_")
            if project["production_type"] == "tvshow":
                episode = shots_service.get_episode(playlist["episode_id"])
                context_name += "_%s" % slugify.slugify(episode["name"],
                                                        separator="_")
            attachment_filename = "%s_%s_%s.mp4" % (
                slugify.slugify(build_job["created_at"], separator="").replace(
                    "t", "_"),
                context_name,
                slugify.slugify(playlist["name"], separator="_"),
            )
            return flask_send_file(
                movie_file_path,
                conditional=True,
                mimetype="video/mp4",
                as_attachment=True,
                attachment_filename=attachment_filename,
            )
Ejemplo n.º 5
0
    def get(self, playlist_id):
        """
        Build given playlist as mp4 movie.
        ---
        tags:
        - Playlists
        parameters:
          - in: path
            name: playlist_id
            required: True
            schema:
                type: UUID
                example: a24a6ea4-ce75-4665-a070-57453082c25
        responses:
            200:
                description: Given playlist built as mp4 movie
        """
        playlist = playlists_service.get_playlist(playlist_id)
        user_service.check_manager_project_access(playlist["project_id"])

        project = projects_service.get_project(playlist["project_id"])
        (width, height) = preview_files_service.get_preview_file_dimensions(
            project
        )
        fps = preview_files_service.get_preview_file_fps(project)
        full = self.get_bool_parameter("full")
        params = EncodingParameters(width=width, height=height, fps=fps)

        shots = [
            {"preview_file_id": x.get("preview_file_id")}
            for x in playlist["shots"]
        ]

        if config.ENABLE_JOB_QUEUE:
            remote = config.ENABLE_JOB_QUEUE_REMOTE
            # remote worker can not access files local to the web app
            assert not remote or config.FS_BACKEND in ["s3", "swift"]

            current_user = persons_service.get_current_user()
            queue_store.job_queue.enqueue(
                playlists_service.build_playlist_job,
                args=(
                    playlist,
                    shots,
                    params,
                    current_user["email"],
                    full,
                    remote,
                ),
                job_timeout=int(config.JOB_QUEUE_TIMEOUT),
            )
            return {"job": "running"}
        else:
            job = playlists_service.build_playlist_movie_file(
                playlist, shots, params, full, remote=False
            )
            return {"job": job["status"]}
Ejemplo n.º 6
0
 def get(self, playlist_id):
     playlist = playlists_service.get_playlist(playlist_id)
     user_service.check_project_access(playlist["project_id"])
     zip_file_path = playlists_service.build_playlist_zip_file(playlist)
     attachment_filename = zip_file_path.split(os.sep)[-1]
     return flask_send_file(zip_file_path,
                            conditional=True,
                            mimetype="application/zip",
                            as_attachment=True,
                            attachment_filename=attachment_filename)
Ejemplo n.º 7
0
 def get(self, playlist_id):
     playlist = playlists_service.get_playlist(playlist_id)
     user_service.check_project_access(playlist["project_id"])
     movie_file_path = playlists_service.get_playlist_movie_file_path(
         playlist)
     attachment_filename = movie_file_path.split(os.sep)[-1]
     return flask_send_file(movie_file_path,
                            conditional=True,
                            mimetype="video/mp4",
                            as_attachment=True,
                            attachment_filename=attachment_filename)
Ejemplo n.º 8
0
    def get(self, playlist_id):
        playlist = playlists_service.get_playlist(playlist_id)
        user_service.check_manager_project_access(playlist["project_id"])

        if config.ENABLE_JOB_QUEUE:
            current_user = persons_service.get_current_user()
            build_playlist_task.delay(playlist, current_user["email"])
            return {"job": "running"}
        else:
            playlists_service.build_playlist_movie_file(playlist)
            return {"job": "succeeded"}
Ejemplo n.º 9
0
 def get(self, playlist_id):
     playlist = playlists_service.get_playlist(playlist_id)
     user_service.check_manager_project_access(playlist["project_id"])
     if config.ENABLE_JOB_QUEUE:
         current_user = persons_service.get_current_user()
         queue_store.job_queue.enqueue(
             playlists_service.build_playlist_job,
             args=(playlist, current_user["email"]),
             job_timeout=3600,
         )
         return {"job": "running"}
     else:
         playlists_service.build_playlist_movie_file(playlist)
         return {"job": "succeeded"}
Ejemplo n.º 10
0
    def get(self, playlist_id):
        """
        Download given playlist as zip.
        ---
        tags:
        - Playlists
        parameters:
          - in: path
            name: playlist_id
            required: True
            schema:
                type: UUID
                example: a24a6ea4-ce75-4665-a070-57453082c25
        responses:
            200:
                description: Given playlist downloaded as zip
        """
        playlist = playlists_service.get_playlist(playlist_id)
        project = projects_service.get_project(playlist["project_id"])
        user_service.block_access_to_vendor()
        user_service.check_playlist_access(playlist)
        zip_file_path = playlists_service.build_playlist_zip_file(playlist)

        context_name = slugify.slugify(project["name"], separator="_")
        if project["production_type"] == "tvshow":
            episode_id = playlist["episode_id"]
            if episode_id is not None:
                episode = shots_service.get_episode(playlist["episode_id"])
                episode_name = episode["name"]
            elif playlist["is_for_all"]:
                episode_name = "all assets"
            else:
                episode_name = "main pack"
            context_name += "_%s" % slugify.slugify(
                episode_name, separator="_"
            )
        attachment_filename = "%s_%s.zip" % (
            context_name,
            slugify.slugify(playlist["name"], separator="_"),
        )

        return flask_send_file(
            zip_file_path,
            conditional=True,
            mimetype="application/zip",
            as_attachment=True,
            attachment_filename=attachment_filename,
        )
Ejemplo n.º 11
0
    def get(self, playlist_id):
        playlist = playlists_service.get_playlist(playlist_id)
        user_service.check_project_access(playlist["project_id"])

        if config.ENABLE_JOB_QUEUE:
            current_user = persons_service.get_current_user()
            queue_store.job_queue.enqueue(playlists_service.build_playlist_job,
                                          playlist, current_user["email"])
            return {"job": "running"}
        else:
            movie_file_path = playlists_service.build_playlist_movie_file(
                playlist)
            attachment_filename = movie_file_path.split(os.sep)[-1]
            return flask_send_file(movie_file_path,
                                   conditional=True,
                                   mimetype="video/mp4",
                                   as_attachment=True,
                                   attachment_filename=attachment_filename)
Ejemplo n.º 12
0
    def get(self, playlist_id):
        playlist = playlists_service.get_playlist(playlist_id)
        project = projects_service.get_project(playlist["project_id"])
        self.check_permissions(project["id"])
        self.task_type_map = tasks_service.get_task_type_map()
        self.task_status_map = tasks_service.get_task_status_map()
        task_ids = [
            shot["preview_file_task_id"]
            for shot in playlist["shots"]
        ]
        self.task_comment_map = tasks_service.get_last_comment_map(task_ids)
        episode = self.get_episode(playlist)

        csv_content = []
        headers = self.build_headers(playlist, project, episode)
        csv_content += headers
        for shot in playlist["shots"]:
            csv_content.append(self.build_row(shot))

        file_name = "%s playlist %s" % (project["name"], playlist["name"])
        return csv_utils.build_csv_response(csv_content, slugify(file_name))
Ejemplo n.º 13
0
    def get(self, playlist_id):
        playlist = playlists_service.get_playlist(playlist_id)
        project = projects_service.get_project(playlist["project_id"])
        user_service.check_playlist_access(playlist)
        zip_file_path = playlists_service.build_playlist_zip_file(playlist)

        context_name = slugify.slugify(project["name"], separator="_")
        if project["production_type"] == "tvshow":
            episode = shots_service.get_episode(playlist["episode_id"])
            context_name += "_%s" % slugify.slugify(episode["name"],
                                                    separator="_")
        attachment_filename = "%s_%s.zip" % (
            context_name,
            slugify.slugify(playlist["name"], separator="_"),
        )

        return flask_send_file(
            zip_file_path,
            conditional=True,
            mimetype="application/zip",
            as_attachment=True,
            attachment_filename=attachment_filename,
        )
Ejemplo n.º 14
0
 def delete(self, playlist_id, build_job_id):
     playlist = playlists_service.get_playlist(playlist_id)
     user_service.check_project_access(playlist["project_id"])
     playlists_service.remove_build_job(playlist, build_job_id)
     return "", 204
Ejemplo n.º 15
0
    def get(self, playlist_id, build_job_id):
        """
        Download given playlist as mp4 after given build job is finished.
        ---
        tags:
        - Playlists
        parameters:
          - in: path
            name: playlist_id
            required: True
            schema:
                type: UUID
                example: a24a6ea4-ce75-4665-a070-57453082c25
          - in: path
            name: build_job_id
            required: True
            schema:
                type: UUID
                example: a24a6ea4-ce75-4665-a070-57453082c25
        responses:
            200:
                description: Given playlist downloaded as mp4
            400: 
                description: Build not finished
        """
        playlist = playlists_service.get_playlist(playlist_id)
        project = projects_service.get_project(playlist["project_id"])
        build_job = playlists_service.get_build_job(build_job_id)
        user_service.check_project_access(playlist["project_id"])

        if build_job["status"] != "succeeded":
            return {"error": True, "message": "Build is not finished"}, 400
        else:
            movie_file_path = fs.get_file_path_and_file(
                config,
                file_store.get_local_movie_path,
                file_store.open_movie,
                "playlists",
                build_job_id,
                "mp4",
            )
            context_name = slugify.slugify(project["name"], separator="_")
            if project["production_type"] == "tvshow":
                episode_id = playlist["episode_id"]
                if episode_id is not None:
                    episode = shots_service.get_episode(playlist["episode_id"])
                    episode_name = episode["name"]
                elif playlist["is_for_all"]:
                    episode_name = "all assets"
                else:
                    episode_name = "main pack"
                context_name += "_%s" % slugify.slugify(
                    episode_name, separator="_"
                )
            attachment_filename = "%s_%s_%s.mp4" % (
                slugify.slugify(build_job["created_at"], separator="").replace(
                    "t", "_"
                ),
                context_name,
                slugify.slugify(playlist["name"], separator="_"),
            )
            return flask_send_file(
                movie_file_path,
                conditional=True,
                mimetype="video/mp4",
                as_attachment=True,
                attachment_filename=attachment_filename,
            )
Ejemplo n.º 16
0
 def get(self, playlist_id, build_job_id):
     user_service.block_access_to_vendor()
     playlist = playlists_service.get_playlist(playlist_id)
     user_service.check_playlist_access(playlist)
     return playlists_service.get_build_job(build_job_id)
Ejemplo n.º 17
0
 def delete(self, playlist_id, build_job_id):
     user_service.block_access_to_vendor()
     playlist = playlists_service.get_playlist(playlist_id)
     user_service.check_playlist_access(playlist)
     playlists_service.remove_build_job(playlist, build_job_id)
     return "", 204
Ejemplo n.º 18
0
 def get(self, playlist_id, build_job_id):
     playlist = playlists_service.get_playlist(playlist_id)
     user_service.check_project_access(playlist["project_id"])
     return playlists_service.get_build_job(build_job_id)