Videos: insert

YouTube-এ ভিডিও আপলোড করে এবং বিকল্প হিসেবে ভিডিওর মেটাডেটা সেট করে।

এই পদ্ধতিতে মিডিয়া আপলোড করা যায়। আপলোড করা ফাইলকে অবশ্যই এইসব সীমাবদ্ধতা মেনে চলতে হবে:

  • ফাইলের সর্বাধিক সাইজ: ২৫৬ জিবি
  • গ্রহণযোগ্য মিডিয়া MIME-এর ধরন: video/*, application/octet-stream

কোটার উপর প্রভাব: প্রতিদিন ১০০টি কল। এই পদ্ধতিতে কল করার জন্য ভিডিও আপলোড কোটা বাকেটে ১ ইউনিটের কোটা খরচ হয়।

সাধারণ ব্যবহারিক ক্ষেত্র

অনুরোধ করুন

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 প্যারামিটার দুটি উদ্দেশ্যে কাজ করে। এটি সেইসব প্রপার্টি শনাক্ত করে যেগুলি রাইট অপারেশন সেট করবে এবং সেইসব প্রপার্টিও শনাক্ত করে যেগুলি API রেসপন্সে অন্তর্ভুক্ত থাকবে।

মনে রাখবেন, কোনও ভিডিও যোগ বা আপডেট করার সময় সেট করা যেতে পারে এমন প্রপার্টি সব অংশে থাকে না। যেমন, statistics অবজেক্টে এমন পরিসংখ্যান থাকে যা YouTube কোনও ভিডিওর জন্য গণনা করে এবং এতে এমন কোনও ভ্যালু থাকে না যা আপনি সেট বা পরিবর্তন করতে পারেন। প্যারামিটার ভ্যালু এমন part নির্দিষ্ট করলে যাতে পরিবর্তনযোগ্য ভ্যালু নেই, সেই part এখনও API রেসপন্সে অন্তর্ভুক্ত করা হবে।

নিচের তালিকায় সেইসব part-এর নাম রয়েছে যা আপনি প্যারামিটার ভ্যালুতে অন্তর্ভুক্ত করতে পারবেন:
  • brandPartner
  • contentDetails
  • fileDetails
  • id
  • liveStreamingDetails
  • localizations
  • paidProductPlacementDetails
  • 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 প্যারামিটারের জন্য কোনও ভ্যালু নির্দিষ্ট করা থাকলে এই প্যারামিটারটি প্রয়োজন এবং এটি শুধুমাত্র সেই প্যারামিটারের সাথে ব্যবহার করা যেতে পারে। এছাড়াও, onBehalfOfContentOwner প্যারামিটার দ্বারা নির্দিষ্ট করা কন্টেন্টের মালিকের সাথে লিঙ্ক করা CMS অ্যাকাউন্ট ব্যবহার করে অনুরোধটি অনুমোদিত হতে হবে। সবশেষে, 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: আপনি এই প্রপার্টির জন্য কোনও ভ্যালু নির্দিষ্ট না করলে, আপলোড করা ভিডিওর গোপনীয়তা স্ট্যাটাস ডিফল্ট হিসেবে public হয়ে যায়। YouTube সহায়তা কেন্দ্রে যেমন ব্যাখ্যা করা হয়েছে, ক্রিয়েটর অ্যাকাউন্ট সেটিংসের উপর ভিত্তি করে নির্দিষ্ট কিছু আপলোড ডিফল্ট হিসেবে private-এ সেট করা হতে পারে। যাচাই না করা API প্রোজেক্ট থেকে আপলোড করা ভিডিও ব্যক্তিগত দেখার মোডে সীমাবদ্ধ থাকে না।
    • status.publicStatsViewable
    • status.publishAt
    • status.selfDeclaredMadeForKids
    • status.containsSyntheticMedia
    • recordingDetails.recordingDate

রেসপন্স

সফল হলে, এই পদ্ধতি রেসপন্স বডিতে ভিডিও রিসোর্স ফিরিয়ে দেয়।

উদাহরণ

মনে রাখবেন: নিম্নলিখিত কোডের স্যাম্পেল সব কার্যকরী প্রোগ্রামিং ল্যাঙ্গুয়েজের বর্ণনা নাও করতে পারে। কোন কোন ভাষা কাজ করে তার তালিকা দেখার জন্য ক্লায়েন্ট লাইব্রেরি ডকুমেন্টেশন দেখুন।

খুলুন

এই কোড স্যাম্পেল, অনুরোধের সাথে যুক্ত চ্যানেলে ভিডিও আপলোড করার জন্য API-এর 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

নিম্নলিখিত কোড স্যাম্পেল, অনুরোধের সাথে যুক্ত চ্যানেলে ভিডিও আপলোড করার জন্য API-এর 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

এই স্যাম্পেলটি অনুরোধের সাথে যুক্ত চ্যানেলে ভিডিও আপলোড করার জন্য API-এর 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

সমস্যা

এই পদ্ধতিতে কল করার উত্তরে 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 অনুরোধটি ভিডিওর জন্য ভুল গোপনীয়তা সেটিং সেট করার চেষ্টা করে।

এটি ব্যবহার করে দেখুন!

এই API কল করতে এবং API অনুরোধ ও উত্তর দেখতে APIs Explorer ব্যবহার করুন।