Videos: insert

วิดีโอทั้งหมดที่อัปโหลดผ่านปลายทาง videos.insert จากโปรเจ็กต์ API ที่ไม่ได้รับการยืนยันซึ่งสร้างหลังจากวันที่ 28 กรกฎาคม 2020 จะจํากัดเฉพาะโหมดการดูส่วนตัว หากต้องการยกเลิกข้อจํากัดนี้ โปรเจ็กต์ API แต่ละรายการต้องดําเนินการตรวจสอบเพื่อยืนยันการปฏิบัติตามข้อกําหนดในการให้บริการ โปรดดูรายละเอียดเพิ่มเติมที่ประวัติการแก้ไข API

อัปโหลดวิดีโอไปยัง YouTube และเลือกตั้งค่าข้อมูลเมตาของวิดีโอ

วิธีนี้รองรับการอัปโหลดสื่อ ไฟล์ที่อัปโหลดต้องสอดคล้องกับข้อจํากัดต่อไปนี้

  • ขนาดไฟล์สูงสุด:256 GB
  • ประเภท MIME ของสื่อที่ยอมรับ: video/*, application/octet-stream

ผลกระทบจากโควต้า: การเรียกใช้วิธีการนี้มีต้นทุนโควต้า 1,600 หน่วย

กรณีการใช้งานทั่วไป

ส่งคำขอ

คำขอ HTTP

POST https://www.googleapis.com/upload/youtube/v3/videos

การให้สิทธิ์

คําขอนี้ต้องมีการให้สิทธิ์กับขอบเขตต่อไปนี้อย่างน้อย 1 ขอบเขต (อ่านเพิ่มเติมเกี่ยวกับการตรวจสอบสิทธิ์และการให้สิทธิ์)

ขอบเขต
https://www.googleapis.com/auth/youtube.upload
https://www.googleapis.com/auth/youtube
https://www.googleapis.com/auth/youtubepartner
https://www.googleapis.com/auth/youtube.force-ssl

พารามิเตอร์

ตารางต่อไปนี้จะแสดงพารามิเตอร์ที่คําค้นหานี้รองรับ พารามิเตอร์ทั้งหมดที่แสดงคือพารามิเตอร์การค้นหา

พารามิเตอร์
พารามิเตอร์ที่จําเป็น
part string
พารามิเตอร์ part มีจุดประสงค์ 2 ประการในการดําเนินการนี้ รายงานนี้ระบุพร็อพเพอร์ตี้ที่การดําเนินการเขียนจะตั้งค่า รวมถึงพร็อพเพอร์ตี้ที่การตอบกลับ API จะรวมอยู่ด้วย

โปรดทราบว่าบางพร็อพเพอร์ตี้ไม่มีพร็อพเพอร์ตี้ที่ตั้งค่าได้เมื่อแทรกหรืออัปเดตวิดีโอ ตัวอย่างเช่น ออบเจ็กต์ statistics จะสรุปสถิติที่ YouTube คํานวณสําหรับวิดีโอและไม่ระบุค่าที่คุณตั้งค่าหรือแก้ไขได้ หากค่าพารามิเตอร์ระบุ part ที่ไม่มีค่าที่เปลี่ยนแปลง part จะยังคงรวมอยู่ในการตอบกลับ API

รายการต่อไปนี้มีชื่อ part ที่คุณใส่ไว้ในค่าพารามิเตอร์ได้
  • contentDetails
  • fileDetails
  • id
  • liveStreamingDetails
  • localizations
  • player
  • processingDetails
  • recordingDetails
  • snippet
  • statistics
  • status
  • suggestions
  • topicDetails
พารามิเตอร์ที่ไม่บังคับ
notifySubscribers boolean
พารามิเตอร์ notifySubscribers ระบุว่า YouTube ควรส่งการแจ้งเตือนเกี่ยวกับวิดีโอใหม่ให้ผู้ใช้ที่ติดตามช่องของวิดีโอไหม ค่าพารามิเตอร์ True บ่งบอกว่าผู้ติดตามจะได้รับการแจ้งเตือนเกี่ยวกับวิดีโอที่อัปโหลดใหม่ อย่างไรก็ตาม เจ้าของช่องที่กําลังอัปโหลดวิดีโอหลายรายการอาจต้องการตั้งค่าเป็น False เพื่อหลีกเลี่ยงการส่งการแจ้งเตือนเกี่ยวกับวิดีโอใหม่แต่ละรายการไปยังผู้ติดตามของช่อง ค่าเริ่มต้นคือ True
onBehalfOfContentOwner string
พารามิเตอร์นี้ใช้ได้เฉพาะในคําขอที่ได้รับอนุญาตอย่างถูกต้อง หมายเหตุ: พารามิเตอร์นี้มีไว้สําหรับพาร์ทเนอร์เนื้อหาของ YouTube เท่านั้น

พารามิเตอร์ onBehalfOfContentOwner ระบุว่าข้อมูลเข้าสู่ระบบการให้สิทธิ์ของคําขอระบุผู้ใช้ CMS ของ YouTube ที่ทําหน้าที่ในนามของเจ้าของเนื้อหาที่ระบุในค่าพารามิเตอร์ พารามิเตอร์นี้มีไว้สําหรับพาร์ทเนอร์เนื้อหา YouTube ที่เป็นเจ้าของและจัดการช่อง YouTube ต่างๆ จํานวนมาก ช่วยให้เจ้าของเนื้อหาตรวจสอบสิทธิ์ได้เพียงครั้งเดียวและเข้าถึงข้อมูลวิดีโอและช่องทั้งหมดได้โดยไม่ต้องระบุข้อมูลเข้าสู่ระบบของแต่ละช่อง บัญชี CMS ที่ผู้ใช้ตรวจสอบสิทธิ์ด้วยจะต้องลิงก์กับเจ้าของเนื้อหาของ YouTube ที่ระบุ
onBehalfOfContentOwnerChannel string
พารามิเตอร์นี้ใช้ได้เฉพาะในคําขอที่ได้รับอนุญาตอย่างถูกต้อง พารามิเตอร์นี้ใช้ได้เฉพาะในคําขอที่ได้รับอนุญาตอย่างถูกต้อง หมายเหตุ: พารามิเตอร์นี้มีไว้สําหรับพาร์ทเนอร์เนื้อหา YouTube เท่านั้น

พารามิเตอร์ onBehalfOfContentOwnerChannel ระบุรหัสช่อง YouTube ของช่องที่กําลังเพิ่มวิดีโอ ต้องใช้พารามิเตอร์นี้เมื่อคําขอระบุค่าของพารามิเตอร์ onBehalfOfContentOwner และจะใช้ร่วมกับพารามิเตอร์นั้นได้เท่านั้น นอกจากนี้ คําขอต้องได้รับอนุญาตโดยใช้บัญชี CMS ที่ลิงก์กับเจ้าของเนื้อหาซึ่งพารามิเตอร์ onBehalfOfContentOwner ระบุ สุดท้าย แชแนลที่ค่าพารามิเตอร์ onBehalfOfContentOwnerChannel ระบุไว้จะต้องลิงก์กับเจ้าของเนื้อหาที่พารามิเตอร์ onBehalfOfContentOwner ระบุไว้

พารามิเตอร์นี้มีไว้สําหรับพาร์ทเนอร์เนื้อหา YouTube ที่เป็นเจ้าของและจัดการช่อง YouTube ต่างๆ จํานวนมาก ช่วยให้เจ้าของเนื้อหาตรวจสอบสิทธิ์ได้ 1 ครั้งและดําเนินการในนามของช่องที่ระบุไว้ในค่าพารามิเตอร์ โดยไม่ต้องระบุข้อมูลเข้าสู่ระบบของแต่ละช่อง

เนื้อหาของคำขอ

ระบุทรัพยากรวิดีโอในส่วนเนื้อหาของคําขอ สําหรับทรัพยากรดังกล่าว ให้ทําดังนี้

  • คุณตั้งค่าพร็อพเพอร์ตี้เหล่านี้ได้

    • snippet.title
    • snippet.description
    • snippet.tags[]
    • snippet.categoryId
    • snippet.defaultLanguage
    • localizations.(key)
    • localizations.(key).title
    • localizations.(key).description
    • status.embeddable
    • status.license
    • status.privacyStatus
    • status.publicStatsViewable
    • status.publishAt
    • status.selfDeclaredMadeForKids
    • recordingDetails.locationDescription (เลิกใช้งานแล้ว)
    • recordingDetails.location.latitude (เลิกใช้งานแล้ว)
    • recordingDetails.location.longitude (เลิกใช้งานแล้ว)
    • recordingDetails.recordingDate

คำตอบ

หากใช้วิธีนี้ วิธีนี้จะแสดงทรัพยากรวิดีโอในส่วนเนื้อหาของการตอบกลับ

ตัวอย่าง

หมายเหตุ: ตัวอย่างโค้ดต่อไปนี้อาจไม่แสดงภาษาโปรแกรมที่รองรับทั้งหมด โปรดดูรายชื่อภาษาที่รองรับในเอกสารประกอบเกี่ยวกับไลบรารีของไคลเอ็นต์

Go

ตัวอย่างโค้ดนี้เรียกใช้เมธอด videos.insert ของ API เพื่ออัปโหลดวิดีโอไปยังช่องที่เชื่อมโยงกับคําขอ

ตัวอย่างนี้ใช้ไลบรารีของไคลเอ็นต์ Go

package main

import (
	"flag"
	"fmt"
	"log"
	"os"
	"strings"

	"google.golang.org/api/youtube/v3"
)

var (
	filename    = flag.String("filename", "", "Name of video file to upload")
	title       = flag.String("title", "Test Title", "Video title")
	description = flag.String("description", "Test Description", "Video description")
	category    = flag.String("category", "22", "Video category")
	keywords    = flag.String("keywords", "", "Comma separated list of video keywords")
	privacy     = flag.String("privacy", "unlisted", "Video privacy status")
)

func main() {
	flag.Parse()

	if *filename == "" {
		log.Fatalf("You must provide a filename of a video file to upload")
	}

	client := getClient(youtube.YoutubeUploadScope)

	service, err := youtube.New(client)
	if err != nil {
		log.Fatalf("Error creating YouTube client: %v", err)
	}

	upload := &youtube.Video{
		Snippet: &youtube.VideoSnippet{
			Title:       *title,
			Description: *description,
			CategoryId:  *category,
		},
		Status: &youtube.VideoStatus{PrivacyStatus: *privacy},
	}

	// The API returns a 400 Bad Request response if tags is an empty string.
	if strings.Trim(*keywords, "") != "" {
		upload.Snippet.Tags = strings.Split(*keywords, ",")
	}

	call := service.Videos.Insert("snippet,status", upload)

	file, err := os.Open(*filename)
	defer file.Close()
	if err != nil {
		log.Fatalf("Error opening %v: %v", *filename, err)
	}

	response, err := call.Media(file).Do()
	handleError(err, "")
	fmt.Printf("Upload successful! Video ID: %v\n", response.Id)
}

.NET

ตัวอย่างโค้ดต่อไปนี้เรียกเมธอด videos.insert ของ API เพื่ออัปโหลดวิดีโอไปยังช่องที่เชื่อมโยงกับคําขอ

ตัวอย่างนี้ใช้ไลบรารีของไคลเอ็นต์ .NET

using System;
using System.IO;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;

using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using Google.Apis.Upload;
using Google.Apis.Util.Store;
using Google.Apis.YouTube.v3;
using Google.Apis.YouTube.v3.Data;

namespace Google.Apis.YouTube.Samples
{
  /// <summary>
  /// YouTube Data API v3 sample: upload a video.
  /// Relies on the Google APIs Client Library for .NET, v1.7.0 or higher.
  /// See https://developers.google.com/api-client-library/dotnet/get_started
  /// </summary>
  internal class UploadVideo
  {
    [STAThread]
    static void Main(string[] args)
    {
      Console.WriteLine("YouTube Data API: Upload Video");
      Console.WriteLine("==============================");

      try
      {
        new UploadVideo().Run().Wait();
      }
      catch (AggregateException ex)
      {
        foreach (var e in ex.InnerExceptions)
        {
          Console.WriteLine("Error: " + e.Message);
        }
      }

      Console.WriteLine("Press any key to continue...");
      Console.ReadKey();
    }

    private async Task Run()
    {
      UserCredential credential;
      using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read))
      {
        credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
            GoogleClientSecrets.Load(stream).Secrets,
            // This OAuth 2.0 access scope allows an application to upload files to the
            // authenticated user's YouTube channel, but doesn't allow other types of access.
            new[] { YouTubeService.Scope.YoutubeUpload },
            "user",
            CancellationToken.None
        );
      }

      var youtubeService = new YouTubeService(new BaseClientService.Initializer()
      {
        HttpClientInitializer = credential,
        ApplicationName = Assembly.GetExecutingAssembly().GetName().Name
      });

      var video = new Video();
      video.Snippet = new VideoSnippet();
      video.Snippet.Title = "Default Video Title";
      video.Snippet.Description = "Default Video Description";
      video.Snippet.Tags = new string[] { "tag1", "tag2" };
      video.Snippet.CategoryId = "22"; // See https://developers.google.com/youtube/v3/docs/videoCategories/list
      video.Status = new VideoStatus();
      video.Status.PrivacyStatus = "unlisted"; // or "private" or "public"
      var filePath = @"REPLACE_ME.mp4"; // Replace with path to actual movie file.

      using (var fileStream = new FileStream(filePath, FileMode.Open))
      {
        var videosInsertRequest = youtubeService.Videos.Insert(video, "snippet,status", fileStream, "video/*");
        videosInsertRequest.ProgressChanged += videosInsertRequest_ProgressChanged;
        videosInsertRequest.ResponseReceived += videosInsertRequest_ResponseReceived;

        await videosInsertRequest.UploadAsync();
      }
    }

    void videosInsertRequest_ProgressChanged(Google.Apis.Upload.IUploadProgress progress)
    {
      switch (progress.Status)
      {
        case UploadStatus.Uploading:
          Console.WriteLine("{0} bytes sent.", progress.BytesSent);
          break;

        case UploadStatus.Failed:
          Console.WriteLine("An error prevented the upload from completing.\n{0}", progress.Exception);
          break;
      }
    }

    void videosInsertRequest_ResponseReceived(Video video)
    {
      Console.WriteLine("Video id '{0}' was successfully uploaded.", video.Id);
    }
  }
}

Ruby

ตัวอย่างนี้เรียกเมธอด videos.insert ของ API เพื่ออัปโหลดวิดีโอไปยังช่องที่เชื่อมโยงกับคําขอ

ตัวอย่างนี้ใช้ไลบรารีของไคลเอ็นต์ Ruby

#!/usr/bin/ruby

require 'rubygems'
gem 'google-api-client', '>0.7'
require 'google/api_client'
require 'google/api_client/client_secrets'
require 'google/api_client/auth/file_storage'
require 'google/api_client/auth/installed_app'
require 'trollop'

# A limited OAuth 2 access scope that allows for uploading files, but not other
# types of account access.
YOUTUBE_UPLOAD_SCOPE = 'https://www.googleapis.com/auth/youtube.upload'
YOUTUBE_API_SERVICE_NAME = 'youtube'
YOUTUBE_API_VERSION = 'v3'

def get_authenticated_service
  client = Google::APIClient.new(
    :application_name => $PROGRAM_NAME,
    :application_version => '1.0.0'
  )
  youtube = client.discovered_api(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION)

  file_storage = Google::APIClient::FileStorage.new("#{$PROGRAM_NAME}-oauth2.json")
  if file_storage.authorization.nil?
    client_secrets = Google::APIClient::ClientSecrets.load
    flow = Google::APIClient::InstalledAppFlow.new(
      :client_id => client_secrets.client_id,
      :client_secret => client_secrets.client_secret,
      :scope => [YOUTUBE_UPLOAD_SCOPE]
    )
    client.authorization = flow.authorize(file_storage)
  else
    client.authorization = file_storage.authorization
  end

  return client, youtube
end

def main
  opts = Trollop::options do
    opt :file, 'Video file to upload', :type => String
    opt :title, 'Video title', :default => 'Test Title', :type => String
    opt :description, 'Video description',
          :default => 'Test Description', :type => String
    opt :category_id, 'Numeric video category. See https://developers.google.com/youtube/v3/docs/videoCategories/list',
          :default => 22, :type => :int
    opt :keywords, 'Video keywords, comma-separated',
          :default => '', :type => String
    opt :privacy_status, 'Video privacy status: public, private, or unlisted',
          :default => 'public', :type => String
  end

  if opts[:file].nil? or not File.file?(opts[:file])
    Trollop::die :file, 'does not exist'
  end

  client, youtube = get_authenticated_service

  begin
    body = {
      :snippet => {
        :title => opts[:title],
        :description => opts[:description],
        :tags => opts[:keywords].split(','),
        :categoryId => opts[:category_id],
      },
      :status => {
        :privacyStatus => opts[:privacy_status]
      }
    }

    videos_insert_response = client.execute!(
      :api_method => youtube.videos.insert,
      :body_object => body,
      :media => Google::APIClient::UploadIO.new(opts[:file], 'video/*'),
      :parameters => {
        :uploadType => 'resumable',
        :part => body.keys.join(',')
      }
    )

    videos_insert_response.resumable_upload.send_all(client)

    puts "Video id '#{videos_insert_response.data.id}' was successfully uploaded."
  rescue Google::APIClient::TransmissionError => e
    puts e.result.body
  end
end

main

ข้อผิดพลาด

ตารางต่อไปนี้ระบุข้อความแสดงข้อผิดพลาดที่ API อาจแสดงเพื่อตอบสนองต่อการเรียกเมธอดนี้ โปรดดูรายละเอียดเพิ่มเติมในเอกสารประกอบข้อความแสดงข้อผิดพลาด

ประเภทข้อผิดพลาด รายละเอียดข้อผิดพลาด คำอธิบาย
badRequest (400) defaultLanguageNotSet คําขอพยายามเพิ่มรายละเอียดวิดีโอที่แปลเป็นภาษาท้องถิ่นโดยไม่ระบุภาษาเริ่มต้นของรายละเอียดวิดีโอ
badRequest (400) invalidCategoryId พร็อพเพอร์ตี้ snippet.categoryId ระบุรหัสหมวดหมู่ที่ไม่ถูกต้อง ใช้วิธีการ videoCategories.list เพื่อดึงข้อมูลหมวดหมู่ที่รองรับ
badRequest (400) invalidDescription ข้อมูลเมตาของคําขอระบุคําอธิบายวิดีโอที่ไม่ถูกต้อง
badRequest (400) invalidFilename ชื่อไฟล์ที่ระบุในส่วนหัว Slug ไม่ถูกต้อง
badRequest (400) invalidPublishAt ข้อมูลเมตาของคําขอระบุเวลาการเผยแพร่ที่กําหนดไว้ไม่ถูกต้อง
badRequest (400) invalidRecordingDetails ออบเจ็กต์ recordingDetails ในข้อมูลเมตาของคําขอระบุรายละเอียดการบันทึกที่ไม่ถูกต้อง
badRequest (400) invalidTags ข้อมูลเมตาของคําขอระบุคีย์เวิร์ดวิดีโอที่ไม่ถูกต้อง
badRequest (400) invalidTitle ข้อมูลเมตาของคําขอระบุชื่อวิดีโอที่ไม่ถูกต้องหรือว่างเปล่า
badRequest (400) invalidVideoGameRating ข้อมูลเมตาของคําขอระบุการจัดประเภทวิดีโอเกมที่ไม่ถูกต้อง
badRequest (400) invalidVideoMetadata ข้อมูลเมตาของคําขอไม่ถูกต้อง
badRequest (400) mediaBodyRequired โดยคําขอจะไม่มีเนื้อหาวิดีโอ
badRequest (400) uploadLimitExceeded ผู้ใช้รายนี้ได้อัปโหลดวิดีโอมากเกินไป
forbidden (403) forbidden
forbidden (403) forbiddenLicenseSetting คําขอพยายามตั้งค่าใบอนุญาตที่ไม่ถูกต้องสําหรับวิดีโอ
forbidden (403) forbiddenPrivacySetting คําขอพยายามตั้งค่าความเป็นส่วนตัวที่ไม่ถูกต้องสําหรับวิดีโอ

ลองใช้เลย

ใช้ APIs Explorer เพื่อเรียกใช้ API นี้และดูคําขอและการตอบกลับ API