Videos: insert

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

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

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

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

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

Use Case ทั่วไป

ส่งคำขอ

คำขอ 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 ระบุว่าข้อมูลเข้าสู่ระบบการให้สิทธิ์ของคำขอระบุผู้ใช้ YouTube CMS ที่ดำเนินการในนามของเจ้าของเนื้อหาที่ระบุไว้ในค่าพารามิเตอร์ พารามิเตอร์นี้มีไว้สำหรับพาร์ทเนอร์เนื้อหาของ YouTube ที่เป็นเจ้าของและจัดการช่อง YouTube หลายช่อง ซึ่งช่วยให้เจ้าของเนื้อหาตรวจสอบสิทธิ์เพียงครั้งเดียวและมีสิทธิ์เข้าถึงข้อมูลวิดีโอและช่องทั้งหมดของตนโดยไม่ต้องระบุข้อมูลเข้าสู่ระบบการตรวจสอบสิทธิ์สำหรับแต่ละช่อง บัญชี CMS ที่ผู้ใช้ตรวจสอบสิทธิ์จะต้องลิงก์กับเจ้าของเนื้อหา YouTube ที่ระบุ
onBehalfOfContentOwnerChannel string
พารามิเตอร์นี้ใช้ได้เฉพาะในคำขอที่ได้รับอนุญาตที่เหมาะสมเท่านั้น พารามิเตอร์นี้ใช้ได้เฉพาะในคำขอที่ได้รับอนุญาตอย่างถูกต้องเท่านั้น หมายเหตุ: พารามิเตอร์นี้มีไว้สำหรับพาร์ทเนอร์เนื้อหาของ YouTube เท่านั้น

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

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

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

ระบุแหล่งข้อมูลวิดีโอในเนื้อหาคำขอ สำหรับแหล่งข้อมูลดังกล่าว ให้ทำดังนี้

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

    • 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