Videos: insert

إنّ كل الفيديوهات التي تم تحميلها باستخدام نقطة النهاية videos.insert من مشاريع واجهة برمجة التطبيقات التي لم يتم إثبات ملكيتها والتي تم إنشاؤها بعد 28 تموز (يوليو) 2020 سيتم حصرها في وضع العرض الخاص. لرفع هذا القيد، على كل مشروع في واجهة برمجة التطبيقات إجراء تدقيق للتحقّق من الامتثال لبنود الخدمة. يُرجى الاطّلاع على سجلّ النُسخ السابقة لواجهة برمجة التطبيقات للحصول على مزيد من التفاصيل.

يحمّل فيديو إلى YouTube ويعيّن اختياريًا البيانات الوصفية للفيديو.

تتيح هذه الطريقة تحميل الوسائط. يجب أن تتوافق الملفات التي تم تحميلها مع القيود التالية:

  • الحد الأقصى لحجم الملف: 256 غيغابايت
  • أنواع MIME للوسائط المقبولة: video/* وapplication/octet-stream

التأثير على الحصة: إنّ استدعاء هذه الطريقة له تكلفة حصة قدرها 1600 وحدة.

حالات الاستخدام الشائعة

طلب

طلب HTTP

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

التفويض

ويتطلب هذا الطلب تفويضًا باستخدام نطاق واحد على الأقل من النطاقات التالية (اقرأ المزيد عن المصادقة والتفويض).

النطاق
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 غرضين في هذه العملية. وتحدّد الخصائص التي سيتم ضبطها في عملية الكتابة، فضلاً عن الخصائص التي ستتضمنها استجابة واجهة برمجة التطبيقات.

يُرجى ملاحظة أنه لا تحتوي جميع الأجزاء على خصائص يمكن ضبطها عند إدراج فيديو أو تعديله. على سبيل المثال، يتضمّن الكائن statistics إحصاءات تحتسبها منصة YouTube لفيديو معيّن ولا يحتوي على قيم يمكنك ضبطها أو تعديلها. في حال تحديد قيمة المَعلمة part التي لا تحتوي على قيم متبادلة، سيستمر تضمين part في استجابة واجهة برمجة التطبيقات.

تحتوي القائمة التالية على أسماء 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 المختلفة. تتيح هذه الميزة لمالكي المحتوى المصادقة مرة واحدة والوصول إلى كل بيانات الفيديو والقناة بدون الحاجة إلى تقديم بيانات اعتماد المصادقة لكل قناة على حدة. يجب ربط حساب نظام إدارة المحتوى الذي يصادق المستخدم عليه بمالك محتوى 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

الإجابة

إذا نجحت هذه الطريقة، فإنها تعرض مورد فيديو في نص الاستجابة.

أمثلة

ملاحظة: قد لا تمثّل نماذج الرموز التالية جميع لغات البرمجة المتوافقة. راجع وثائق مكتبات العميل للحصول على قائمة باللغات المتوفرة.

البدء

يستدعي نموذج الرمز هذا طريقة واجهة برمجة التطبيقات videos.insert لتحميل فيديو إلى القناة المرتبطة بالطلب.

يستخدم هذا المثال مكتبة برامج 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 لواجهة برمجة التطبيقات لتحميل فيديو إلى القناة المرتبطة بالطلب.

يستخدم هذا المثال مكتبة عميل 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 في واجهة برمجة التطبيقات لتحميل فيديو إلى القناة المرتبطة بالطلب.

يستخدم هذا المثال مكتبة عملاء 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

الأخطاء

يحدد الجدول التالي رسائل الخطأ التي يمكن أن تعرضها واجهة برمجة التطبيقات ردًا على استدعاء لهذه الطريقة. يرجى الاطلاع على وثائق رسالة الخطأ لمزيد من التفاصيل.

نوع الخطأ تفاصيل الخطأ الوصف
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 لاستدعاء واجهة برمجة التطبيقات هذه والاطّلاع على طلب واجهة برمجة التطبيقات والاستجابة له.