XML ফিড থেকে Content ID API এ স্থানান্তর করুন৷

দ্রষ্টব্য: YouTube বিষয়বস্তু আইডি API YouTube সামগ্রী অংশীদারদের দ্বারা ব্যবহারের উদ্দেশ্যে এবং সমস্ত বিকাশকারী বা সমস্ত YouTube ব্যবহারকারীদের কাছে অ্যাক্সেসযোগ্য নয়৷ আপনি যদি YouTube Content ID API-কে Google API কনসোলে তালিকাভুক্ত পরিষেবাগুলির মধ্যে একটি হিসাবে দেখতে না পান তবে YouTube পার্টনার প্রোগ্রাম সম্পর্কে আরও জানতে YouTube সহায়তা কেন্দ্র দেখুন৷

এই নির্দেশিকাটি ব্যাখ্যা করে যে কীভাবে YouTube বিষয়বস্তু অংশীদাররা YouTube-এর অধিকার ব্যবস্থাপনা সিস্টেমে সামগ্রী গ্রহণের জন্য XML সামগ্রী ফিড থেকে YouTube Content ID API-তে স্থানান্তর করতে পারে৷

ওভারভিউ

YouTube-এর Content ID অধিকার ব্যবস্থাপনা সিস্টেমের সুবিধা নিতে, আপনাকে মেটাডেটা, মালিকানা তথ্য, নীতি সেটিংস এবং আপনার সম্পদের জন্য রেফারেন্স উপাদান YouTube-কে প্রদান করতে হবে।

YouTube আপনার সম্পদের ডেটা সরবরাহ করার জন্য বিভিন্ন বিকল্প অফার করে। যে অংশীদাররা নিয়মিত প্রচুর সামগ্রী সরবরাহ করে তারা প্রায়শই একটি ব্যাচ আপলোড পদ্ধতি ব্যবহার করে, YouTube DDEX ফিড বা YouTube-প্রদত্ত স্প্রেডশীট টেমপ্লেট ব্যবহার করে তাদের সম্পদের তথ্য নির্দিষ্ট করে৷ বিকল্পভাবে, YouTube Content ID API আপলোড প্রক্রিয়ার উপর আরও সূক্ষ্ম নিয়ন্ত্রণ প্রদান করে।

API ব্যবহার করে, আপনি XML ফিড এবং স্প্রেডশীটগুলির ব্যাচ প্রক্রিয়াকরণের বিপরীতে একের পর এক সম্পদ এবং অন্যান্য সংস্থান তৈরি করেন। API এর স্বতন্ত্র পদ্ধতির ফলে দ্রুত এবং আরো নির্ভরযোগ্য আপলোড হতে পারে। আপনি একটি লেনদেন পদ্ধতিতে আপলোড প্রক্রিয়া পরিচালনা করেন, পৃথক ক্রিয়াকলাপের সাফল্য নিরীক্ষণ করেন এবং যে কোনও সমস্যা দেখা দিলে অবিলম্বে প্রতিক্রিয়া জানান। আপনি একটি পোস্ট-প্রসেসিং ব্যাচ জব ব্যবহার করার পরিবর্তে YouTube-উত্পাদিত আইডিগুলি উপলব্ধ হওয়ার সাথে সাথে আপনার সামগ্রী ব্যবস্থাপনা সিস্টেম আপডেট করতে পারেন৷

এই দস্তাবেজটি বর্ণনা করে যে কীভাবে YouTube রাইট ম্যানেজমেন্ট সিস্টেমে আপনার সম্পদগুলিকে সংজ্ঞায়িত করতে YouTube Content ID API ব্যবহার করতে হয়৷ এটি অনুমান করে যে আপনি বর্তমানে YouTube DDEX ফিড ব্যবহার করে আপনার সম্পদ সংজ্ঞায়িত করছেন এবং API ব্যবহার করে XML সামগ্রী ফিডের কার্যকারিতা কীভাবে পুনরায় তৈরি করবেন তা ব্যাখ্যা করে৷ আরও নির্দিষ্টভাবে, এটি একটি নমুনা XML সামগ্রী ফিড ব্যবহার করে এবং পাইথন ক্লায়েন্ট লাইব্রেরি ব্যবহার করে একই প্রভাব অর্জনকারী API কমান্ডগুলি সনাক্ত করে।

YouTube-এ সম্পদের তথ্য সরবরাহ করার উপায়

XML সামগ্রী ফিড বা Content ID API ব্যবহার করার শেষ ফলাফল একই: আপনি আপনার অংশীদার অ্যাকাউন্টে YouTube অধিকার ব্যবস্থাপনা সংস্থান তৈরি (বা আপডেট) করেন৷ কিছু ক্ষেত্রে, আপনি YouTube ভিডিও তৈরি (বা আপডেট) করেন।

এক্সএমএল কন্টেন্ট ফিড এবং এপিআই কাজটি ভিন্নভাবে করে। XML কন্টেন্ট ফিড দিয়ে, আপনি একটি একক ফাইল তৈরি করেন যাতে সম্পদ এবং তাদের মধ্যে সম্পর্ক সম্পর্কে সমস্ত তথ্য থাকে। ইউটিউব ব্যাচ আপলোড প্রক্রিয়া চলাকালীন প্রকৃত সম্পদ তৈরি করতে একটি ব্লুপ্রিন্ট হিসাবে ফিড ব্যবহার করে। API ব্যবহার করে, আপনি একটি ব্যাচের পরিবর্তে একের পর এক সংস্থান তৈরি করেন। আপনি প্রতিটি পৃথক সংস্থান এবং API কলের অগ্রগতি এবং সাফল্য নিরীক্ষণ করতে পারেন।

আপনি যখন API পদ্ধতিগুলি ব্যবহার করে সরাসরি সংস্থান তৈরি করেন, তখন আপনাকে স্পষ্টভাবে কিছু ক্রিয়া সম্পাদন করতে হবে যা YouTube ব্যাচ আপলোড প্রক্রিয়া পর্দার পিছনে পরিচালনা করে। সবচেয়ে উল্লেখযোগ্যভাবে, আপনাকে আপনার মিডিয়া ফাইলগুলি আপলোড করতে হবে এবং সমস্যাগুলির প্রতিক্রিয়া জানাতে হবে (আবার চেষ্টা করে বা ত্রুটিগুলি রিপোর্ট করে)। আপনাকে সঠিক ক্রমে ক্রিয়া সম্পাদন করতে হবে; উদাহরণস্বরূপ, আপনি ভিডিওটি তৈরি না করা পর্যন্ত আপনি একটি ভিডিও দাবি করতে পারবেন না৷

YouTube XML কন্টেন্ট ফিড ফরম্যাটের প্রতিটি রুট-লেভেল উপাদান একটি রিসোর্সের (বা রিসোর্স প্রপার্টি) সাথে মিলে যায় যা আপনি YouTube API ব্যবহার করে তৈরি করেন।

XML উপাদান এবং সংশ্লিষ্ট API সম্পদ
<asset> asset
<file> videos.fileDetails (YouTube Data API থেকে) বা
thumbnail (ইউটিউব ডেটা এপিআই থেকে) বা
reference
<ownership> ownership
<rights_admin> assetMatchPolicy (ম্যাচ নীতির জন্য)
claims.policy (ব্যবহার নীতির জন্য)
<rights_policy> policy
<video> videos (YouTube ডেটা API থেকে)
<video_breaks> videoAdvertisingOption.adbreaks[ ]
<ad_policy> videoAdvertisingOption
<claim> claim
<playlist> playlist (YouTube ডেটা API থেকে)
<relationship> বিভিন্ন

দ্রষ্টব্য: YouTube Content ID API বর্তমানে ক্যাপশন ফাইল, ট্রেলার বা অ্যালবাম আর্টওয়ার্ক ফাইল সমর্থন করে না।

<relationship> উপাদানের চিকিৎসা XML ফিড এবং API-এর মধ্যে পার্থক্যকে সুন্দরভাবে তুলে ধরে।

  • একটি XML <relationship> উপাদান বলে যে <item> এবং <related_item> উপাদানগুলির মধ্যে একটি সম্পর্ক বিদ্যমান, কিন্তু এটি সেই সম্পর্কের প্রকৃতি সম্পর্কে স্পষ্ট নয়। YouTube আপলোড প্রক্রিয়া আইটেমগুলির ধরন থেকে সঠিক সম্পর্ক অনুমান করে৷ উদাহরণস্বরূপ, একটি সম্পদ এবং একটি ভিডিওর মধ্যে একটি সম্পর্ক নির্দেশ করে যে YouTube-এর ভিডিও ফাইলটিকে সম্পদের জন্য একটি রেফারেন্স হিসাবে ব্যবহার করা উচিত, যখন একটি বিজ্ঞাপন নীতি এবং একটি ভিডিওর মধ্যে সম্পর্ক ভিডিওর জন্য নীতি নির্ধারণ করে৷

  • YouTube Content ID API ব্যবহার করে, আপনি নির্দিষ্ট API সংস্থানগুলি ব্যবহার করেন যা স্পষ্টভাবে সঠিক সম্পর্ক সেট করে। একটি সম্পদের জন্য একটি রেফারেন্স হিসাবে একটি ভিডিও ব্যবহার করতে, আপনি একটি reference সংস্থান তৈরি করুন৷ একটি ভিডিওর জন্য বিজ্ঞাপন নীতি সেট করতে, আপনি একটি videoAdvertisingOptions সম্পদ তৈরি করুন৷ আপনি এর বৈশিষ্ট্যগুলি সেট করার আগে সম্পদটি অবশ্যই বিদ্যমান থাকতে হবে৷

একটি স্ক্রিপ্ট মাধ্যমে সম্পদ তথ্য আপলোড

API ব্যবহার করে সম্পদ ডেটা আপলোড করতে, আপনাকে একটি স্ক্রিপ্ট লিখতে হবে যা API অনুরোধ পাঠাতে, ফাইল আপলোড করতে এবং YouTube অধিকার ব্যবস্থাপনা সংস্থান তৈরি করতে পারে। এই বিভাগটি স্ক্রিপ্ট লেখার জন্য একটি টিউটোরিয়াল প্রদান করে।

প্রধান পদক্ষেপ হল:

  1. একটি মৌলিক স্ক্রিপ্ট তৈরি করুন যা YouTube API ব্যবহার করে।
  2. কোড যোগ করুন যা মিডিয়া ফাইল আপলোড করে
  3. কোড যোগ করুন যা অধিকার ব্যবস্থাপনা সংস্থান তৈরি করে
  4. আপনার বিষয়বস্তু বিতরণ সিস্টেমের সাথে কাজ করার জন্য আপনার স্ক্রিপ্টটি কার্যকর করুন

নথির শেষে একটি কোড নমুনা প্রদান করা হয় (ধাপ 4 বাদে)। যদিও কোডটি পাইথনে লেখা, অন্যান্য জনপ্রিয় প্রোগ্রামিং ভাষার জন্য ক্লায়েন্ট লাইব্রেরিও পাওয়া যায়।

ধাপ 1: API কল করুন

প্রথম অনুরোধ পাঠানোর টিউটোরিয়াল ব্যাখ্যা করে যে কীভাবে একটি মৌলিক স্ক্রিপ্ট লিখতে হয় যা YouTube সামগ্রী API অনুরোধ পাঠায়। সেই টিউটোরিয়ালের নমুনা স্ক্রিপ্ট ব্যবহারকারীকে প্রমাণীকরণ করে, API অনুরোধের ব্যবহার অনুমোদন করে এবং YouTube Content ID API-এর সাথে ইন্টারঅ্যাক্ট করার জন্য সংস্থান তৈরি করে।

এই স্ক্রিপ্টটি এই উদাহরণে ব্যবহৃত স্ক্রিপ্টের ভিত্তি হিসাবে কাজ করে। যাইহোক, উপরে উল্লিখিত হিসাবে, এই উদাহরণটি ব্যাখ্যা করে কিভাবে ইউটিউব ভিডিও তৈরি এবং দাবি করতে হয় এবং ইউটিউব ভিডিও আপলোড করতে আপনাকে YouTube ডেটা API ব্যবহার করতে হবে। ইউটিউব ডেটা এপিআই অ্যাক্সেস করতে টিউটোরিয়াল থেকে স্ক্রিপ্ট সক্রিয় করতে, এই দুটি সংযোজন করুন:

  • flow_from_clientsecrets কলে (টিউটোরিয়ালের ধাপ 2 থেকে) scope প্যারামিটারে এটির URI যোগ করে YouTube ডেটা API-তে আপলোড কার্যকারিতা অ্যাক্সেসের অনুমোদন দিন।

    FLOW = flow_from_clientsecrets( 'client_secrets.json ',
               scope='https://www.googleapis.com/auth/youtubepartner https://www.googleapis.com/auth/youtube.upload',
               message= 'error message')
  • YouTube ডেটা API এর সাথে ইন্টারঅ্যাক্ট করার জন্য একটি সংস্থান তৈরি করুন (টিউটোরিয়ালের ধাপ 3 থেকে)।

    service = build("youtubePartner", "v1", http=http, static_discovery=False)
    dataApi = build("youtube", "v3", http=http)

ধাপ 2: ভিডিও ফাইল আপলোড করুন

পরবর্তী ধাপ হল একটি ফাংশন যোগ করা যা ভিডিও ফাইল আপলোড করে। সর্বাধিক নির্ভরযোগ্যতার জন্য, আপনি একটি পুনঃসূচনাযোগ্য আপলোড প্রোটোকল ব্যবহার করবেন৷ এই প্রোটোকল আপনাকে নেটওয়ার্ক ব্যাঘাত বা অন্য ট্রান্সমিশন ব্যর্থতার পরে একটি আপলোড অপারেশন পুনরায় শুরু করতে দেয়, নেটওয়ার্ক ব্যর্থতার ক্ষেত্রে সময় এবং ব্যান্ডউইথ সাশ্রয় করে।

YouTube ডেটা API ডকুমেন্টেশনে একটি ভিডিও আপলোড করার নির্দেশিকা একটি নমুনা আপলোড স্ক্রিপ্ট প্রদান করে, upload_video.pyupload_video.py থেকে resumable_upload ফাংশন যোগ করে ধাপ 1 থেকে মৌলিক স্ক্রিপ্ট আপডেট করুন। আপনাকে import বিবৃতি এবং পরিবর্তনশীল সংজ্ঞা যোগ করতে হবে যা ফাংশনটি নির্ভর করে।

ধাপ 3: YouTube অধিকার ব্যবস্থাপনা সংস্থান তৈরি করুন

মৌলিক কাঠামোর জায়গায়, আপনি কোড যোগ করতে প্রস্তুত যা YouTube সম্পদ, ভিডিও এবং সংশ্লিষ্ট সংস্থান তৈরি করে।

আপনি যে ক্রমে সম্পদ তৈরি করেন তা গুরুত্বপূর্ণ। উদাহরণস্বরূপ, সম্পদের জন্য ভিডিও দাবি করার আগে আপনাকে একটি সম্পদ তৈরি করতে হবে এবং একটি ভিডিও আপলোড করতে হবে।

মুভি, টিভি, মিউজিক ভিডিও এবং ওয়েব ভিডিও সম্পদের অপারেশনের সাধারণ ক্রম হল:

  1. সম্পদ সম্পদ তৈরি করুন ( assets.insert )
  2. সম্পদের মালিকানা আপডেট করুন ( ownership.update ) এবং মিল নীতি ( assetMatchPolicy.update )
  3. ভিডিও রিসোর্স তৈরি করুন ( videos.insert ), এর মেটাডেটা সেট করে এবং মিডিয়া ফাইল আপলোড করে
  4. ভিডিওর বিজ্ঞাপন নীতি আপডেট করুন ( videoAdvertisingOptions.update )
  5. সম্পত্তির পক্ষ থেকে ভিডিওটি দাবি করুন ( claims.insert )
  6. দাবি করা ভিডিও ব্যবহার করে সম্পদের জন্য একটি রেফারেন্স তৈরি করুন ( references.insert )

সাউন্ড রেকর্ডিং বা শুধুমাত্র রেফারেন্স সম্পদের জন্য অপারেশনের সাধারণ ক্রম একই, ধাপ 3 থেকে 5 বাদ দিয়ে:

  1. সম্পদ সম্পদ তৈরি করুন ( assets.insert )
  2. সম্পদের মালিকানা আপডেট করুন ( ownership.update ) এবং মিল নীতি ( assetMatchPolicy.update )
  3. সম্পদের জন্য একটি রেফারেন্স তৈরি করুন ( references.insert ) এবং মিডিয়া ফাইল আপলোড করুন

নমুনা স্ক্রিপ্টের সংশ্লিষ্ট কোডের সাথে নমুনা XML ফিডের তুলনা করে এই বিভাগের বাকি অংশ এই প্রতিটি ধাপের বিশদ বিবরণ প্রদান করে।

ধাপ 3.1: একটি সম্পদ তৈরি করুন

প্রথম কল হল API এর assets.insert পদ্ধতিতে। এটি XML ফিডের এই অংশের সাথে মিলে যায়:

<asset type="web">
  <title>Broadcast Yourself!: Using the YouTube Live APIs to stream to the world</title>
  <description>See a preview of the Google I/O presentation.</description>
</asset>

একটি asset সম্পদে এই মানগুলি নির্দিষ্ট করতে, আপনি নিম্নলিখিত সম্পত্তি মান সেট করবেন:

{
  "type": "web",
  "metadata": {
    "title": "Broadcast Yourself!: Using the YouTube Live APIs to stream to the world",
    "description": "See a preview of the Google I/O presentation."
  }
}

API যে রিসোর্সটি রিটার্ন করে সেখান থেকে id প্রপার্টি বের করুন। এই প্রপার্টিটি সেই সম্পত্তি আইডিকে শনাক্ত করে যা ইউটিউব অ্যাসাইন করেছে অ্যাসেটটিকে অনন্যভাবে শনাক্ত করার জন্য। এই মানটি পরবর্তী বেশ কয়েকটি API কলে প্রয়োজন এবং পরে এই ডকুমেন্টেশনে এটিকে assetId হিসাবে চিহ্নিত করা হয়েছে।

ধাপ 3.2: সম্পদের মালিকানা আপডেট করুন

একবার আপনি একটি সম্পদ তৈরি করলে, আপনি API-এর ownership.update পদ্ধতি ব্যবহার করে সম্পদের মালিকানা সেট করেন। এই ধাপটি XML ফিডের এই অংশের সাথে মিলে যায়:

<ownership/>
<relationship>
  <item path="/feed/asset[1]"/>
  <related_item path="/feed/ownership[1]"/>
</relationship>

XML একটি খালি <ownership> ট্যাগ ব্যবহার করে, যা নির্দেশ করে যে আপনার কাছে বিষয়বস্তুর বিশ্বব্যাপী মালিকানা রয়েছে।

আপনার API অনুরোধটি assetId অনুরোধের প্যারামিটারটিকে ধাপ 1-এ প্রাপ্ত অ্যাসেটআইডিতে সেট করবে। এটি নীচে দেখানো সম্পত্তির মানগুলির সাথে একটি ownership সংস্থানও নির্দিষ্ট করবে:

  • assetId (অনুরোধ প্যারামিটার): ধাপ 1 এ প্রাপ্ত সম্পদ আইডিতে সেট করুন।
  • general[0].ratio : 100
  • general[0].owner your_content_owner_name
  • general[0].type : ' exclude '
  • general[0].territories : []

{
  "general": [
    "ratio": 100,
    "owner": "your_content_owner_name",
    "type": "exclude",
    "territories": []
  ]
}

এই বৈশিষ্ট্যগুলি নির্দেশ করে যে নির্দিষ্ট বিষয়বস্তুর মালিক - আপনাকে আপনার_সামগ্রীর_ওনার_নামটি আপনার প্রকৃত সামগ্রী মালিকের নামের সাথে প্রতিস্থাপন করতে হবে - সর্বত্র সামগ্রীর 100% ( general[0].ratio ) মালিক। প্রকৃতপক্ষে, এই ownership সংস্থানটি নির্দেশ করে যে মালিক সর্বত্র সামগ্রীর মালিক ( general[0].type ) অঞ্চলগুলির প্রদত্ত তালিকা ( general[0].territories ) ব্যতীত, কিন্তু যেহেতু সেই সম্পত্তির মান একটি খালি তালিকা, তাই কোনও অঞ্চল নেই আসলে বাদ।

ধাপ 3.3: সম্পদের মিল নীতি সেট করুন

YouTube রাইট ম্যানেজমেন্ট সিস্টেম একটি সম্পত্তির সাথে একটি ম্যাচ নীতি বা দাবি করা ভিডিওর সাথে একটি ব্যবহার নীতি সংযুক্ত করার দুটি উপায় প্রদান করে:

  • একটি পূর্বে সংরক্ষিত নীতি ব্যবহার করুন. এই পদ্ধতিতে, আপনি আপনার সংরক্ষিত নীতিগুলি পুনরুদ্ধার করতে API ব্যবহার করেন, আপনি যে নীতিটি ব্যবহার করতে চান তা খুঁজে পান এবং তারপরে একটি সম্পদের মিল নীতি সেট করার সময় বা একটি দাবি তৈরি করার সময় সেই নীতির অনন্য আইডি নির্দিষ্ট করুন৷

  • সম্পদ বা দাবি তৈরি করার সময় একটি policy সম্পদ সংজ্ঞায়িত করুন। এই ক্ষেত্রে, নীতি সম্পদ সংরক্ষণ করা হয় না এবং, তাই, অন্যান্য সম্পদ বা দাবি প্রয়োগ করা যাবে না।

আমরা আপনাকে প্রথম পদ্ধতি ব্যবহার করার পরামর্শ দিই, যা সংরক্ষিত নীতির উপর নির্ভর করে। এই পদ্ধতির একটি গুরুত্বপূর্ণ সুবিধা হল যে আপনি যদি একটি সংরক্ষিত নীতি আপডেট করেন, আপনার পরিবর্তন স্বয়ংক্রিয়ভাবে সেই নীতি ব্যবহার করে এমন সমস্ত সম্পদ এবং দাবিগুলিকে প্রভাবিত করে৷

যাইহোক, এই নথির কোড নমুনাগুলি API-এর assetMatchPolicy.update পদ্ধতি ব্যবহার করে নতুন সম্পদের জন্য ম্যাচ নীতি সেট করতে দ্বিতীয় পদ্ধতি ব্যবহার করে। (এই নথিটি ব্যবহার নীতি সেট করতে দ্বিতীয় পদ্ধতিও ব্যবহার করে, যা ভিডিওটি দাবি করার সময় সংজ্ঞায়িত করা হয়।) নথিটি দ্বিতীয় পদ্ধতি ব্যবহার করে কারণ সংরক্ষিত নীতিগুলির নাম অংশীদারদের মধ্যে পরিবর্তিত হতে পারে; এই পদ্ধতি নিশ্চিত করে যে একই কোড সবার জন্য কাজ করবে।

এই ধাপটি XML ফিডের এই অংশের সাথে মিলে যায়:

<rights_policy>
  <name>Monetize developer videos</name>
</rights_policy>
<rights_admin owner="True" type="match"/>
<relationship>
  <item path="/feed/rights_admin[1]"/>
  <item path="/feed/rights_policy[1]"/>
  <related_item path="/feed/asset[1]"/>
</relationship>

আপনার API অনুরোধ assetId প্যারামিটারকে ধাপ 1 এ প্রাপ্ত assetId সেট করে। এটি একটি assetMatchPolicy রিসোর্সও পাঠায় যা নীচে তালিকাভুক্ত সম্পত্তির মান সেট করে:

{
  "rules": [
    {
      "action": "monetize",
      "conditions": {
        "requiredTerritories": {
          "type": "exclude",
          "territories": []
        }
      }
    }
  ]
}

নীচের উদাহরণটি দেখায় যে কীভাবে সম্পদের মিল নীতি হিসাবে আপনি একটি সংরক্ষিত নীতি সেট করে থাকেন তাহলে assetMatchPolicy সংস্থানটি কীভাবে তৈরি হবে৷ আপনার কোডের জন্য PolicyID স্ট্রিংটিকে আইডি দিয়ে প্রতিস্থাপন করতে হবে যা আপনার সংরক্ষিত নীতিকে অনন্যভাবে সনাক্ত করে।

{
  "policyId": "PolicyID"
}

দ্রষ্টব্য: XML ফিড, YouTube বিষয়বস্তু পরিচালকের নীতি পৃষ্ঠার মতো, নাম অনুসারে নীতিগুলি নির্দিষ্ট করে৷ একটি সংরক্ষিত নীতির জন্য আইডি পুনরুদ্ধার করতে, policies.list পদ্ধতি ব্যবহার করুন৷ পলিসি আইডিগুলি অংশীদার থেকে অংশীদারে পরিবর্তিত হয়, এমনকি ডিফল্ট নীতিগুলির জন্যও৷

ধাপ 3.4: একটি ভিডিও রিসোর্স তৈরি করুন এবং মিডিয়া ফাইল আপলোড করুন

আপনি ডেটা API-এর videos.insert পদ্ধতি ব্যবহার করে আপনার ভিডিও আপলোড করেন। পুনঃসূচনাযোগ্য আপলোড নির্দেশিকা সেই HTTP কলগুলিকে চিহ্নিত করে যা আপনি একটি পুনঃসূচনাযোগ্য আপলোডিং প্রক্রিয়া ব্যবহার করে ভিডিও আপলোড করতে করবেন এবং আমাদের বেশ কয়েকটি API ক্লায়েন্ট লাইব্রেরি পুনরায় শুরুযোগ্য আপলোডগুলিকে সমর্থন করে৷ (নীচের নমুনা কোডটি Google APIs Python ক্লায়েন্ট লাইব্রেরির সাথে একটি পুনরায় শুরুযোগ্য আপলোডিং প্রক্রিয়া ব্যবহার করে।)

এই ধাপটি XML ফিডের এই অংশের সাথে মিলে যায়:

<video>
  <title>Broadcast Yourself!: Using the YouTube Live APIs to stream to the world</title>
  <description>See a preview of the Google I/O presentation.</description>
  <genre>Entertainment</genre>
  <keyword>”Google I/O” “YouTube Live APIs”</keyword>
  <public>True</public>
</video>
<file type="video">
  <filename>GOOG_IO_Broadcast_Yourself.mov</filename>
</file>
<relationship>
  <item path="/feed/file[1]"/>
  <related_item path="/feed/video[1]"/>
</relationship>

আপনি যদি API কল করার জন্য কাস্টম কোড লিখছেন, আপনি একটি প্রাথমিক অনুরোধ পাঠান যা video সংস্থান তৈরি করে এবং একটি আপলোড URL প্রদান করে, তারপর সেই URL-এ ভিডিও বাইনারি ফাইল ডেটা আপলোড করার জন্য একটি দ্বিতীয় অনুরোধ পাঠান। আপনি যদি পাইথন ক্লায়েন্ট লাইব্রেরি ব্যবহার করেন (নমুনা হিসাবে), আপনি একই অনুরোধে video সংস্থান এবং ভিডিও বাইনারি ফাইল ডেটা পাঠান।

XML নমুনায় বর্ণিত ভিডিও তৈরি করতে, আপনার API অনুরোধ part প্যারামিটারের মানকে snippet,status সেট করবে এবং অনুরোধের অংশে video সংস্থান নিম্নলিখিত বৈশিষ্ট্যগুলি সেট করবে৷ snippet.categoryId মান ( 24 ) Entertainment বিভাগের সাথে মিলে যায়, যা XML ফিডে ভিডিওর সাথে সম্পর্কিত বিভাগ। ভিডিও বিভাগগুলি পরিশিষ্টগুলিতে আরও বিশদে আলোচনা করা হয়েছে।

{
  "snippet": {
    "title": "Broadcast Yourself!: Using the YouTube Live APIs to stream to the world",
    "description": "See a preview of the Google I/O presentation.",
    "tags": ["Google I/O", "YouTube Live APIs"],
    "categoryId": 24
  },
  "status": {
    "privacyStatus": "private"
  }
}

দ্রষ্টব্য: আমরা সুপারিশ করি যে আপনি ভিডিও আপলোড করার সময় একটি ভিডিওর গোপনীয়তার স্থিতি private হিসাবে সেট করুন, তারপর প্রক্রিয়ার পরে এটি public হিসাবে আপডেট করুন৷ আপনি যদি ভিডিওটিকে একটি সর্বজনীন ভিডিও হিসাবে আপলোড করতে চান, তাহলে status.privacyStatus বৈশিষ্ট্যটি public হিসাবে সেট করুন৷

API যে রিসোর্সটি রিটার্ন করে সেখান থেকে id প্রপার্টি বের করুন। এই বৈশিষ্ট্যটি ভিডিও আইডি সনাক্ত করে যা ইউটিউব ভিডিওটিকে অনন্যভাবে সনাক্ত করার জন্য বরাদ্দ করেছে৷ এই মানটি বেশ কয়েকটি পরবর্তী API কলে প্রয়োজন এবং এই ডকুমেন্টেশনে পরবর্তীতে videoId হিসাবে চিহ্নিত করা হয়েছে।

ধাপ 3.5: ভিডিওটি কখন প্রক্রিয়া করা হয়েছে তা নির্ধারণ করতে ডেটা API পোল করুন৷

রেফারেন্স তৈরি করার মতো নির্দিষ্ট কিছু ক্রিয়াকলাপের জন্য প্রয়োজন যে YouTube আপনার ভিডিও প্রক্রিয়াকরণ শেষ করেছে৷ সেই কারণে, স্ক্রিপ্টের পরবর্তী ধাপ হল ভিডিও আপলোড সম্পূর্ণ হয়েছে তা নিশ্চিত করা।

আপলোড স্থিতি পরীক্ষা করতে, ডেটা API-এর videos.list পদ্ধতিতে কল করুন এবং নিম্নলিখিত অনুরোধের পরামিতিগুলি সেট করুন:

  • id : videoId (আগের ধাপ থেকে)
  • part : 'processingDetails'

API video সংস্থানগুলির একটি তালিকা প্রদান করে (ঠিক একটি সংস্থান রয়েছে), এবং YouTube এখনও ভিডিওটি প্রক্রিয়া করছে কিনা তা নির্ধারণ করতে আপনাকে সেই সংস্থানটির processingDetails.processingStatus সম্পত্তির মান পরীক্ষা করতে হবে৷ প্রপার্টির মান processing ব্যতীত অন্য কিছুতে পরিবর্তিত হবে, যেমন succeeded বা failed , যখন YouTube ভিডিওটি প্রক্রিয়াকরণ শেষ করে।

ভিডিওটির প্রক্রিয়াকরণ শেষ হয়েছে কিনা তা নির্ধারণ করতে নমুনা কোডটি প্রতি 12 সেকেন্ডে videos.list পদ্ধতিতে কল করে। এই স্ট্যাটাস চেক সরাসরি এক্সএমএল থেকে কোনো উপাদানের সাথে সঙ্গতিপূর্ণ নয়; এটি এমন একটি ক্রিয়াকে প্রতিনিধিত্ব করে যা একটি ব্যাচ আপলোড অন্তর্নিহিতভাবে পরিচালনা করে যখন এটি XML প্রক্রিয়া করে।

ধাপ 3.6: বিজ্ঞাপন নীতি সেট করুন

YouTube একবার ভিডিওটি প্রক্রিয়া করার পরে, আপনি video সংস্থানের বিজ্ঞাপন সেটিংস আপডেট করতে পারেন৷ ভিডিওর জন্য বিজ্ঞাপন নীতি সেট করতে Content ID API-এর videoAdvertisingOptions.update পদ্ধতিতে কল করুন। এই ক্রিয়াটি XML ফিডের এই অংশের সাথে মিলে যায়:

<ad_policy>
  <instream standard="long" trueview="true">
    <prerolls>Allow</prerolls>
    <postrolls>Allow</postrolls>
    <midrolls>Deny</midrolls>
  </instream>
  <overlay>
    <adsense_for_video>Allow</adsense_for_video>
    <invideo>Allow</invideo>
  </overlay>
</ad_policy>
<relationship>
  <item path="/feed/ad_policy[1]"/>
  <related_item path="/feed/video[1]"/>
</relationship>

এই নমুনায় দেখানো নীতি YouTube-কে ভিডিওর শুরুতে (প্রিরোল) বা শেষে (পোস্টোল) "লম্বা" 30-সেকেন্ডের বিজ্ঞাপন সহ TrueView ইন-স্ট্রীম বিজ্ঞাপন বা ওভারলে বিজ্ঞাপনগুলি দেখাতে সক্ষম করে৷

বিজ্ঞাপন নীতি সেট করতে, একটি অনুরোধ পাঠান যা videoId প্যারামিটার আগে প্রাপ্ত videoId সেট করে। অনুরোধের মূল অংশ হল একটি videoAdvertisingOptions সংস্থান যা নীচে দেখানো বৈশিষ্ট্যগুলি সেট করে:

{
  "breakPosition": ["preroll", "postroll"],
  "adFormats": ["long", "trueview_instream", "overlay"]
}

ধাপ 3.7: ভিডিও দাবি করুন

এই ধাপে, আপনি যে ভিডিওটি আপলোড করেছেন সেটি দাবি করেন – এবং ভিডিওর জন্য ব্যবহারের নীতি সেট করেন – Content ID API-এর claims.insert পদ্ধতিতে কল করে। এই ধাপটি XML ফিডের এই অংশের সাথে মিলে যায়:

<rights_policy>
  <rule action="monetize"/>
</rights_policy>
<rights_admin owner="True" type="match"/>
<claim type="audiovisual"
       asset="/feed/asset[1]"
       rights_admin="/feed/rights_admin[1]"
       rights_policy="/feed/rights_policy[1]"
       video="/feed/video[1]"/>

সম্পদের মিল নীতির মতো, নমুনা স্ক্রিপ্ট ভিডিওর সাথে একটি সংরক্ষিত নীতি সংযুক্ত করার পরিবর্তে একটি এককালীন নীতি সংজ্ঞায়িত করে৷ যাইহোক, আগে আলোচনা করা হয়েছে, ব্যবহার এবং মিল নীতি নির্ধারণ করার সময় আপনি সংরক্ষিত নীতিগুলি ব্যবহার করতে পারেন এবং উত্সাহিত করা হয়৷

আপনি আপনার অনুরোধের সাথে যে claim সংস্থানটি পাঠান তাতে, নীচের সংস্থানে দেখানো বৈশিষ্ট্যগুলি সেট করুন৷ মনে রাখবেন যে assetId এবং videoId স্ট্রিংগুলিকে আগের ধাপে স্ক্রিপ্টের প্রাপ্ত মানগুলির সাথে প্রতিস্থাপন করতে হবে।

{
  "assetId": assetId,
  "videoId": videoId,
  "contentType": "audiovisual",
  "policy": {
    "rules": [
      {
        "action": "monetize"
      }
    ]
  }
}

API যে রিসোর্সটি রিটার্ন করে সেখান থেকে id প্রপার্টি বের করুন। এই সম্পত্তি দাবি আইডি সনাক্ত করে যা ইউটিউব দাবিটি অনন্যভাবে সনাক্ত করার জন্য বরাদ্দ করেছে। পরবর্তী API কলগুলিতে এই মানটি প্রয়োজন এবং এই ডকুমেন্টেশনে পরে claimId হিসাবে চিহ্নিত করা হয়েছে৷

ধাপ 3.8: একটি রেফারেন্স তৈরি করুন

Content ID সিস্টেমের জন্য একটি রেফারেন্স তৈরি করতে Content ID API এর references.insert পদ্ধতি ব্যবহার করুন। আপনি রেফারেন্স সামগ্রী হিসাবে দাবি করা ভিডিও ব্যবহার করে একটি রেফারেন্স তৈরি করতে পারেন, অথবা আপনি API কলের অংশ হিসাবে একটি রেফারেন্স ফাইল আপলোড করতে পারেন৷ আপনি যদি দাবি করা ভিডিও থেকে একটি রেফারেন্স তৈরি করেন, যেমন নমুনা স্ক্রিপ্ট করে, দাবিটি অবশ্যই বিদ্যমান থাকতে হবে।

আপনার API অনুরোধে, আগের ধাপে প্রাপ্ত claimid সাথে claimId অনুরোধের প্যারামিটার সেট করুন। এছাড়াও একটি reference সংস্থান পাঠান যা নীচে দেখানো বৈশিষ্ট্যগুলি সেট করে:

{
  "contentType": "audiovisual"
}

একটি শুধুমাত্র-রেফারেন্স সম্পদ তৈরি করতে (কোনও দাবি করা ভিডিও ছাড়া), উপরের অনুরোধে নিম্নলিখিত পরিবর্তনগুলি করুন:

  1. claimId অনুরোধের প্যারামিটারটি বাদ দিন
  2. আপলোড করা reference রিসোর্সে assetId প্রপার্টি যোগ করুন।
  3. API অনুরোধের media_body হিসাবে রেফারেন্স ফাইল আপলোড করুন।

ধাপ 3.9: ভিডিওটি সর্বজনীন করুন

আপনি যদি সর্বোত্তম অনুশীলনগুলি অনুসরণ করেন এবং আপনার ভিডিও তৈরি করার সময় গোপনীয়তার স্থিতি private হিসাবে সেট করেন, আপলোড প্রক্রিয়া সফল হওয়ার পরে আপনি গোপনীয়তার স্থিতি public পরিবর্তন করতে পারেন। আপনার নতুন আপলোড করা ভিডিওর জন্য video রিসোর্স পুনরুদ্ধার এবং তারপর আপডেট করতে YouTube ডেটা API-এর videos.list এবং videos.update পদ্ধতিগুলি ব্যবহার করুন৷

প্রথমে, নিম্নলিখিত অনুরোধের পরামিতিগুলির সাথে ডেটা API-এর videos.list পদ্ধতিতে কল করুন:

  • part=status
  • id= videoId

এই পদ্ধতিটি একটি সংস্থান সম্বলিত একটি তালিকা প্রদান করে, যা নির্দিষ্ট videoId সহ ভিডিও বর্ণনা করে। সেই সম্পদের status.privacyStatus সম্পত্তির মান public পরিবর্তন করুন, তারপর Data API-এর videos.update পদ্ধতিতে কল করুন৷ নিম্নলিখিত অনুরোধ পরামিতি সেট করুন:

  • part=status

অনুরোধের মূল অংশটি হল পরিবর্তিত ভিডিও সংস্থান৷

ধাপ 4: আপনার সামগ্রী বিতরণ সিস্টেমের সাথে একীভূত করুন

পরিশিষ্টের নমুনা কোডটি স্ক্রিপ্টে সরাসরি সম্পদের জন্য নির্দিষ্ট মেটাডেটা অন্তর্ভুক্ত করে। অনুশীলনে, আপনি সম্ভবত আপনার বিষয়বস্তু ব্যবস্থাপনা সিস্টেমের সাথে স্ক্রিপ্টটি সংহত করতে চান। আরও সম্পূর্ণ বিষয়বস্তু বিতরণ ব্যবস্থার জন্য, আপনি পদক্ষেপগুলি যোগ করতে পারেন যেমন:

  • যোগ করা বা আপডেট করা প্রয়োজন এমন সম্পদ শনাক্ত করতে আপনার বিষয়বস্তু ব্যবস্থাপনা সিস্টেম পোল করুন।
  • বিষয়বস্তু ব্যবস্থাপনা সিস্টেম থেকে সম্পদ মেটাডেটা পুনরুদ্ধার করুন।
  • তৈরি করা সম্পদ, ভিডিও, রেফারেন্স, এবং দাবির জন্য YouTube-প্রদত্ত আইডি সহ কন্টেন্ট ম্যানেজমেন্ট সিস্টেম আপডেট করুন এবং টাইমস্ট্যাম্প সহ রেকর্ড করুন যখন সম্পদগুলি সবচেয়ে সম্প্রতি আপডেট করা হয়েছিল।

পরিশিষ্ট

নমুনা XML ফিড ফাইল

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.youtube.com/schemas/cms/2.0"
      notification_email="[email protected]"
      channel="your_channel" content_owner="your_name">
 <asset type="web">
   <title>Broadcast Yourself!: Using the YouTube Live APIs to stream to the world</title>
   <description>See a preview of the Google I/O presentation.</description>
 </asset>
 <video>
   <title>Broadcast Yourself!: Using the YouTube Live APIs to stream to the world</title>
   <description>See a preview of the Google I/O presentation.</description>
   <genre>Entertainment</genre>
   <keyword>”Google I/O” “YouTube Live APIs”</keyword>
   <public>True</public>
 </video>
 <file type="video">
   <filename>GOOG_IO_Broadcast_Yourself.mov</filename>
 </file>
  <relationship>
   <item path="/feed/file[1]"/>
   <related_item path="/feed/video[1]"/>
 </relationship>
 <content_rating system="youtube">L0 N0 S0 V0 D0 F0</content_rating>
 <relationship>
   <item path="/feed/content_rating[1]"/>
   <related_item path="/feed/video[1]"/>
 </relationship>
 <ownership/>
 <relationship>
   <item path="/feed/asset[1]"/>
   <related_item path="/feed/ownership[1]"/>
 </relationship>
 <rights_policy>
   <name>Monetize developer videos</name>
 </rights_policy>
 <rights_admin owner="True" type="match"/>
 <relationship>
   <item path="/feed/rights_admin[1]"/>
   <item path="/feed/rights_policy[1]"/>
   <related_item path="/feed/asset[1]"/>
 </relationship>
 <ad_policy>
   <instream standard="long" trueview="true">
     <prerolls>Allow</prerolls>
     <postrolls>Allow</postrolls>
     <midrolls>Deny</midrolls>
   </instream>
   <overlay>
     <adsense_for_video>Allow</adsense_for_video>
     <invideo>Allow</invideo>
   </overlay>
 </ad_policy>
 <relationship>
   <item path="/feed/ad_policy[1]"/>
   <related_item path="/feed/video[1]"/>
 </relationship>
 <claim type="audiovisual" asset="/feed/asset[1]" rights_admin="/feed/rights_admin[1]" rights_policy="/feed/rights_policy[1]" video="/feed/video[1]"/>
</feed>

নমুনা স্ক্রিপ্ট

নমুনা কোডটি Google APIs Python ক্লায়েন্ট লাইব্রেরি ব্যবহার করে।

#!/usr/bin/python2.6
# -*- coding: utf-8 -*-
#
# Copyright (C) 2012 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Simple command-line sample for YouTube Content ID API.

Command-line application that retrieves the information
about given content owner.

Usage:
  $ python yt_partner_api.py --file="/path/to/reference/file"

You can also get help on all the command-line flags the program understands
by running:

  $ python yt_partner_api.py --help

To get detailed log output run:

  $ python yt_partner_api.py --logging_level=DEBUG \
    --file="/path/to/reference/file"
"""

import gflags
import httplib
import httplib2
import json
import logging
import sys
import time
import os

from apiclient.discovery import build
from apiclient.errors import HttpError
from apiclient.http import MediaFileUpload
from oauth2client.file import Storage
from oauth2client.client import AccessTokenRefreshError
from oauth2client.client import flow_from_clientsecrets
from oauth2client.tools import run

# Explicitly tell the underlying HTTP transport library not to retry, since
# we are handling retry logic ourselves.
httplib2.RETRIES = 1

# Maximum number of times to retry before giving up.
MAX_RETRIES = 10

# Always retry when these exceptions are raised.
RETRIABLE_EXCEPTIONS = (httplib2.HttpLib2Error, IOError, httplib.NotConnected,
  httplib.IncompleteRead, httplib.ImproperConnectionState,
  httplib.CannotSendRequest, httplib.CannotSendHeader,
  httplib.ResponseNotReady, httplib.BadStatusLine)

# Always retry when an apiclient.errors.HttpError with one of these status
# codes is raised.
RETRIABLE_STATUS_CODES = [500, 502, 503, 504]

#httplib2.debuglevel = 4
FLAGS = gflags.FLAGS

# The CLIENT_SECRETS_FILE variable specifies the name of a file that contains
# the OAuth 2.0 information for this application, including its client_id and
# client_secret. You can acquire an OAuth 2.0 client ID and client secret from
# the Google API Console at
# https://console.cloud.google.com/.
# See the "Registering your application" instructions for an explanation
# of how to find these values:
# https://developers.google.com/youtube/partner/guides/registering_an_application
# For more information about using OAuth2 to access Google APIs, please visit:
#   https://developers.google.com/accounts/docs/OAuth2
# For more information about the client_secrets.json file format, please visit:
#   https://developers.google.com/api-client-library/python/guide/aaa_client_secrets
CLIENT_SECRETS = 'client_secrets.json'

# Helpful message to display if the CLIENT_SECRETS file is missing.
MISSING_CLIENT_SECRETS_MESSAGE = """
WARNING: Please configure OAuth 2.0

To make this sample run you will need to populate the client_secrets.json file
found at:

%s

with information from the API Console
<https://console.cloud.google.com/ >

""" % os.path.join(os.path.dirname(__file__), CLIENT_SECRETS)

# Flags definition
#
# The gflags module makes defining command-line options easy for
# applications. Run this program with the '--help' argument to see
# all the flags that it understands.
gflags.DEFINE_enum('logging_level', 'ERROR',
    ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
    'Set the level of logging detail.')

gflags.DEFINE_string('file', None, 'The video file to upload.')

def resumable_upload(insert_request):
  response = None
  error = None
  retry = 0
  while response is None:
    try:
      print "Uploading file..."
      status, response = insert_request.next_chunk()
      if 'id' in response:
        print "'video id: %s was successfully uploaded." % (response['id'])
        return response['id']
      else:
        exit("The upload failed with an unexpected response: %s" % response)
    except HttpError, e:
      if e.resp.status in RETRIABLE_STATUS_CODES:
        error = "A retriable HTTP error %d occurred:\n%s" % (e.resp.status,
                                                             e.content)
      else:
        raise
    except RETRIABLE_EXCEPTIONS, e:
      error = "A retriable error occurred: %s" % e

    if error is not None:
      print error
      retry += 1
      if retry > MAX_RETRIES:
        exit("No longer attempting to retry.")

      max_sleep = 2 ** retry
      sleep_seconds = random.random() * max_sleep
      print "Sleeping %f seconds and then retrying..." % sleep_seconds
      time.sleep(sleep_seconds)
  return None

def createRequest(service, resource, operation, **kwargs):
  request = getattr(service, resource)()
  request = getattr(request, operation)(**kwargs)
  return request

def executeOperation(service, resource, operation, **kwargs):
  request = getattr(service, resource)()
  request = getattr(request, operation)(**kwargs)
  return_value = request.execute()
  print json.dumps(return_value)
  return return_value

def main(argv):
  # Let the gflags module process the command-line arguments
  try:
    argv = FLAGS(argv)
  except gflags.FlagsError, e:
    print '%s\nUsage: %s ARGS\n%s' % (e, argv[0], FLAGS)
    sys.exit(1)

  # Set up a Flow object to be used if we need to authenticate.
  FLOW = flow_from_clientsecrets(CLIENT_SECRETS,
             scope='https://www.googleapis.com/auth/youtubepartner https://www.googleapis.com/auth/youtube.upload',
             message=MISSING_CLIENT_SECRETS_MESSAGE)

  # Set the logging according to the command-line flag
  logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level))

  # If the Credentials don't exist or are invalid run through the native client
  # flow. The Storage object will ensure that if successful the good
  # Credentials will get written back to a file.
  storage = Storage('yt_partner_api.dat')
  credentials = storage.get()
  if credentials is None or credentials.invalid:
    credentials = run(FLOW, storage)

  # Create an httplib2.Http object to handle our HTTP requests and authorize it
  # with our good Credentials.
  http = httplib2.Http()
  http = credentials.authorize(http)

  # Create service and retrieve content owner service.
  partnerApi = build("youtubePartner", "v1", http=http)
  dataApi = build("youtube", "v3", http=http)

  try:
    title = 'Top Ten Ridiculous test #u',
    monetize_policy = {'rules': [{'action': 'monetize'}]}

    # Create the asset
    kwargs = {}
    metadata = {'title': title,
                'description': 'Wow this is a really long description'}
    kwargs['body'] = {'metadata': metadata, 'type': 'web'}
    insert_asset = executeOperation(partnerApi, 'assets', 'insert', **kwargs)
    asset_id = insert_asset['id']
    print 'Asset ID is ' + asset_id

    # Set asset ownership
    kwargs = {'assetId': asset_id}
    ownership = {'ratio': 100,
                 'owner': 'psomusictest',
                 'type': 'exclude',
                 'territories': []}
    body = {'general': [ownership], 'id': asset_id}
    kwargs['body'] = body
    set_ownership = executeOperation(partnerApi, 'ownership', 'update',
                                     **kwargs)

    # Set match policy
    kwargs = {'assetId': asset_id, 'body': monetize_policy}
    set_match_policy = executeOperation(partnerApi, 'assetMatchPolicy',
                                        'update', **kwargs)

    # Insert video using resumable upload
    snippet = {'title': title,
               'description': 'Wow this is a really long description',
               'tags': ['fizzle', 'sizzle', 'razzle dazzle'],
               'categoryId': '24'}
    status = {'privacyStatus': 'private'}
    body = { 'snippet': snippet, 'status': status }
    kwargs = {'part': 'snippet,status',
              'body': body,
              'media_body': MediaFileUpload(FLAGS.file,
                                            chunksize=-1,
                                            resumable=True)}

    insert_video = createRequest(dataApi, 'videos', 'insert', **kwargs)
    video_id = resumable_upload(insert_video)

    if not video_id:
      print 'video upload failed, so the rest of this exercise is pointless'
      return
   # Poll to see when video is processed
    kwargs = {'id': video_id, 'part': 'processingDetails'}
    check_video_status = createRequest(dataApi, 'videos', 'list', **kwargs)
    video_processed = False
    sleep_seconds = 12
    while not video_processed:
      status = check_video_status.execute()
      processingDetails = status['items'][0]['processingDetails']
      if processingDetails['processingStatus'] != 'processing':
        print 'hooray, it ' + processingDetails['processingStatus']
        video_processed = True
      elif not 'processingProgress' in processingDetails:
        time.sleep(sleep_seconds)
      else:
        print ('so far, we processed %d/%d parts' % (
            processingDetails['processingProgress']['partsProcessed'],
            processingDetails['processingProgress']['partsTotal']))
        time.sleep(sleep_seconds)

    # Claim the video
    body = {'assetId': asset_id,
            'videoId': video_id,
            'policy': monetize_policy,
            'contentType': 'audiovisual'}
    kwargs = {'body': body}
    claim_video = executeOperation(partnerApi, 'claims', 'insert', **kwargs)
    claim_id = claim_video['id']
    print 'claim ID is ' + claim_id

    # Create the reference
    body = {'assetId': asset_id,
            'videoId': video_id,
            'contentType': 'audiovisual'}
    kwargs = {'claimId': claim_id, 'body': body}
    create_reference = executeOperation(partnerApi, 'references', 'insert',
                                        **kwargs)

    # Set ad policy (update video advertising options)
    ads = {'breakPosition': ['preroll','postroll'],
           'adFormats': ['standard_instream','trueview_instream','overlay']}
    kwargs = {'videoId': video_id, 'body': ads}
    ads = executeOperation(partnerApi, 'videoAdvertisingOptions',
                           'update', **kwargs)

    #9 Update video's privacy status to public
    kwargs = {'part': 'status', 'id': video_id}
    video = executeOperation(dataApi, 'videos', 'list', **kwargs)
    video['items'][0]['status']['privacyStatus'] = 'public'
    kwargs = {'part': 'status', 'body': video['items'][0]}
    video = executeOperation(dataApi, 'videos', 'update', **kwargs)

  except AccessTokenRefreshError:
    print ("The credentials have been revoked or expired, please re-run"
      " the application to re-authorize")

if __name__ == '__main__':
  main(sys.argv)

অন্যান্য API অ্যাকশন

ডেটা API ব্যবহার করে ভিডিও বিভাগের একটি তালিকা পুনরুদ্ধার করুন

নমুনা কোডটি snippet.categoryID প্রপার্টির মান 24 এ সেট করে, যা "বিনোদন" ঘরানার সাথে মিলে যায়। আপনি যদি চান যে আপনার স্ক্রিপ্টটি একটি প্রদত্ত জেনারের জন্য আইডি সন্ধান করতে (বিভাগের আইডিগুলি হার্ডকোড করার পরিবর্তে), আপনি ডেটা API-এর videoCategories.list পদ্ধতিতে কল করবেন এবং নিম্নলিখিত অনুরোধের পরামিতিগুলি সেট করবেন:

  • part=snippet
  • regionCode=US (অন্য দেশের জন্য ভিডিও বিভাগ পুনরুদ্ধার করতে আপনি regionCode একটি ভিন্ন মান সেট করতে পারেন)

API প্রতিক্রিয়ায় প্রতিটি videoCategory সম্পদের জন্য, আপনি একটি বিভাগের নাম সনাক্ত করতে snippet.title সম্পত্তির মান পরীক্ষা করবেন এবং আপনি যে বিভাগটি চান তা থেকে id বৈশিষ্ট্য বের করবেন। "বিনোদন" বিভাগের জন্য videoCategory রিসোর্সটি কেমন দেখাচ্ছে তা এখানে:

{
  "id": "24",
  "kind": "youtube#videoCategory",
  "etag": "\"idnvT0N6oxG_2o6LCWUdZsqtqtk/I5rstjIK5PCItZFyWV-uw\"",
  "snippet": {
    "channelId": "UCBR8-60-B28hp2BmDPdntcQ",
    "title": "Entertainment"
  }
}