আপনার কাস্টম ওয়েব রিসিভারে মূল বৈশিষ্ট্য যোগ করুন

এই পৃষ্ঠায় একটি কাস্টম ওয়েব রিসিভার অ্যাপের জন্য উপলব্ধ ফিচারগুলোর কোড স্নিপেট এবং বিবরণ রয়েছে।

  1. একটি cast-media-player এলিমেন্ট যা Web Receiver-এর সাথে প্রদত্ত বিল্ট-ইন প্লেয়ার UI-কে উপস্থাপন করে।
  2. cast-media-player এলিমেন্টের জন্য কাস্টম CSS-এর মতো স্টাইলিং, যা background-image , splash-image , এবং font-family এর মতো বিভিন্ন UI এলিমেন্টকে স্টাইল করতে ব্যবহৃত হয়।
  3. ওয়েব রিসিভার ফ্রেমওয়ার্ক লোড করার জন্য একটি স্ক্রিপ্ট এলিমেন্ট।
  4. মেসেজ ইন্টারসেপ্ট করা এবং ইভেন্ট হ্যান্ডেল করার জন্য জাভাস্ক্রিপ্ট কোড।
  5. স্বয়ংক্রিয়ভাবে চালানোর জন্য সারিতে দাঁড়ান।
  6. প্লেব্যাক কনফিগার করার বিকল্পসমূহ।
  7. ওয়েব রিসিভার কনটেক্সট সেট করার অপশনসমূহ।
  8. ওয়েব রিসিভার অ্যাপ দ্বারা সমর্থিত কমান্ডগুলো সেট করার অপশন।
  9. ওয়েব রিসিভার অ্যাপ্লিকেশনটি চালু করার জন্য একটি জাভাস্ক্রিপ্ট কল।

অ্যাপ্লিকেশন কনফিগারেশন এবং বিকল্পগুলি

অ্যাপ্লিকেশনটি কনফিগার করুন

CastReceiverContext হলো ডেভেলপারের কাছে উন্মুক্ত সর্ববহিঃস্থ ক্লাস, এবং এটি অন্তর্নিহিত লাইব্রেরিগুলো লোড করা ও ওয়েব রিসিভার এসডিকে (Web Receiver SDK) চালু করার কাজ পরিচালনা করে। এসডিকে এমন এপিআই (API) সরবরাহ করে যা অ্যাপ্লিকেশন ডেভেলপারদের CastReceiverOptions এর মাধ্যমে এসডিকে কনফিগার করার সুযোগ দেয়। এই কনফিগারেশনগুলো প্রতিবার অ্যাপ্লিকেশন চালু করার সময় একবার মূল্যায়ন করা হয় এবং start কল করার সময় ঐচ্ছিক প্যারামিটারটি সেট করার মাধ্যমে এসডিকে-তে পাঠানো হয়।

নিচের উদাহরণটি দেখায় কিভাবে একটি প্রেরক সংযোগ এখনও সক্রিয়ভাবে সংযুক্ত আছে কিনা তা সনাক্ত করার ডিফল্ট আচরণকে ওভাররাইড করতে হয়। যখন ওয়েব রিসিভার maxInactivity সেকেন্ড ধরে কোনো প্রেরকের সাথে যোগাযোগ করতে পারে না, তখন একটি SENDER_DISCONNECTED ইভেন্ট ডিসপ্যাচ করা হয়। নিচের কনফিগারেশনটি এই টাইমআউটকে ওভাররাইড করে। সমস্যা ডিবাগ করার সময় এটি কার্যকর হতে পারে, কারণ যখন কোনো সংযুক্ত প্রেরক IDLE অবস্থায় থাকে না, তখন এটি ওয়েব রিসিভার অ্যাপকে ক্রোম রিমোট ডিবাগার সেশন বন্ধ করা থেকে বিরত রাখে।

const context = cast.framework.CastReceiverContext.getInstance();
const options = new cast.framework.CastReceiverOptions();
options.maxInactivity = 3600; // Development only
context.start(options);

প্লেয়ারটি কনফিগার করুন

কন্টেন্ট লোড করার সময়, ওয়েব রিসিভার SDK, cast.framework.PlaybackConfig ব্যবহার করে DRM তথ্য , রিট্রাই কনফিগারেশন এবং রিকোয়েস্ট হ্যান্ডলারের মতো প্লেব্যাক ভেরিয়েবল কনফিগার করার একটি উপায় প্রদান করে। এই তথ্য PlayerManager দ্বারা পরিচালিত হয় এবং প্লেয়ার তৈরি করার সময় এটি মূল্যায়ন করা হয়। ওয়েব রিসিভার SDK-তে যখনই একটি নতুন লোড পাঠানো হয়, তখনই প্লেয়ার তৈরি হয়। প্লেয়ার তৈরি হওয়ার পরে PlaybackConfig এ করা পরিবর্তনগুলো পরবর্তী কন্টেন্ট লোডে মূল্যায়ন করা হয়। SDK, PlaybackConfig পরিবর্তন করার জন্য নিম্নলিখিত মেথডগুলো প্রদান করে।

  • CastReceiverContext ইনিশিয়ালাইজ করার সময় ডিফল্ট কনফিগারেশন অপশনগুলো ওভাররাইড করতে CastReceiverOptions.playbackConfig ব্যবহার করা হয়।
  • বর্তমান কনফিগারেশন পেতে PlayerManager.getPlaybackConfig() ব্যবহার করুন।
  • বর্তমান কনফিগারেশন ওভাররাইড করতে PlayerManager.setPlaybackConfig() ব্যবহার করা হয়। এই সেটিংটি পরবর্তী সকল লোডের ক্ষেত্রে অথবা পুনরায় ওভাররাইড না করা পর্যন্ত প্রযোজ্য থাকে।
  • PlayerManager.setMediaPlaybackInfoHandler() বর্তমান কনফিগারেশনের উপরে শুধুমাত্র লোড হতে থাকা মিডিয়া আইটেমের জন্য অতিরিক্ত কনফিগারেশন প্রয়োগ করে। এই হ্যান্ডলারটি প্লেয়ার তৈরির ঠিক আগে কল করা হয়। এখানে করা পরিবর্তনগুলো স্থায়ী নয় এবং getPlaybackConfig() -এর কোয়েরিতে অন্তর্ভুক্ত হয় না। পরবর্তী মিডিয়া আইটেম লোড হলে, এই হ্যান্ডলারটি আবার কল করা হয়।

নিচের উদাহরণটিতে দেখানো হয়েছে কিভাবে CastReceiverContext ইনিশিয়ালাইজ করার সময় PlaybackConfig সেট করতে হয়। এই কনফিগারেশনটি ম্যানিফেস্ট সংগ্রহের জন্য পাঠানো অনুরোধগুলোকে ওভাররাইড করে। হ্যান্ডলারটি নির্দিষ্ট করে দেয় যে CORS অ্যাক্সেস-কন্ট্রোল অনুরোধগুলো কুকি বা অথরাইজেশন হেডারের মতো ক্রেডেনশিয়াল ব্যবহার করে করা উচিত।

const playbackConfig = new cast.framework.PlaybackConfig();
playbackConfig.manifestRequestHandler = requestInfo => {
  requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});

নিচের উদাহরণটিতে দেখানো হয়েছে কিভাবে PlayerManager এ দেওয়া গেটার ও সেটার ব্যবহার করে PlaybackConfig কে ওভাররাইড করতে হয়। এই সেটিংটি প্লেয়ারকে এমনভাবে কনফিগার করে যাতে ১টি সেগমেন্ট লোড হওয়ার পর কন্টেন্ট প্লেব্যাক পুনরায় শুরু হয়।

const playerManager =
    cast.framework.CastReceiverContext.getInstance().getPlayerManager();
const playbackConfig = (Object.assign(
            new cast.framework.PlaybackConfig(), playerManager.getPlaybackConfig()));
playbackConfig.autoResumeNumberOfSegments = 1;
playerManager.setPlaybackConfig(playbackConfig);

নিচের উদাহরণটিতে দেখানো হয়েছে কিভাবে মিডিয়া প্লেব্যাক ইনফো হ্যান্ডলার ব্যবহার করে একটি নির্দিষ্ট লোড রিকোয়েস্টের জন্য PlaybackConfig ওভাররাইড করতে হয়। হ্যান্ডলারটি বর্তমান আইটেমের contentId থেকে licenseUrl পাওয়ার জন্য অ্যাপ্লিকেশনে ইমপ্লিমেন্টেড getLicenseUrlForMedia মেথডটিকে কল করে।

playerManager.setMediaPlaybackInfoHandler((loadRequestData, playbackConfig) => {
  const mediaInformation = loadRequestData.media;
  playbackConfig.licenseUrl = getLicenseUrlForMedia(mediaInformation.contentId);

  return playbackConfig;
});

ইভেন্ট শ্রোতা

ওয়েব রিসিভার এসডিকে আপনার ওয়েব রিসিভার অ্যাপকে প্লেয়ার ইভেন্টগুলো পরিচালনা করতে দেয়। ইভেন্ট লিসেনারটি একটি cast.framework.events.EventType প্যারামিটার (অথবা এই প্যারামিটারগুলোর একটি অ্যারে) গ্রহণ করে, যা সেই ইভেন্ট(গুলো) নির্দিষ্ট করে দেয় যেটি লিসেনারটিকে ট্রিগার করবে। ডিবাগিংয়ের জন্য উপযোগী cast.framework.events.EventType এর পূর্ব-কনফিগার করা অ্যারেগুলো cast.framework.events.category তে পাওয়া যায়। ইভেন্ট প্যারামিটারটি ইভেন্টটি সম্পর্কে অতিরিক্ত তথ্য প্রদান করে।

উদাহরণস্বরূপ, যদি আপনি জানতে চান কখন একটি mediaStatus পরিবর্তন সম্প্রচার করা হচ্ছে, তাহলে ইভেন্টটি পরিচালনা করার জন্য আপনি নিম্নলিখিত লজিকটি ব্যবহার করতে পারেন:

const playerManager =
    cast.framework.CastReceiverContext.getInstance().getPlayerManager();
playerManager.addEventListener(
    cast.framework.events.EventType.MEDIA_STATUS, (event) => {
      // Write your own event handling code, for example
      // using the event.mediaStatus value
});

বার্তা আটকানো

ওয়েব রিসিভার এসডিকে আপনার ওয়েব রিসিভার অ্যাপকে মেসেজ ইন্টারসেপ্ট করতে এবং সেই মেসেজগুলোর উপর কাস্টম কোড এক্সিকিউট করতে দেয়। মেসেজ ইন্টারসেপ্টরটি একটি cast.framework.messages.MessageType প্যারামিটার গ্রহণ করে, যা নির্দিষ্ট করে দেয় কোন ধরনের মেসেজ ইন্টারসেপ্ট করা হবে।

ইন্টারসেপ্টরটির উচিত পরিবর্তিত রিকোয়েস্ট অথবা এমন একটি প্রমিস রিটার্ন করা যা পরিবর্তিত রিকোয়েস্ট ভ্যালু দিয়ে রিজলভ হয়। null রিটার্ন করলে ডিফল্ট মেসেজ হ্যান্ডলার কল হওয়া থেকে বিরত থাকবে। আরও বিস্তারিত জানতে 'মিডিয়া লোড করা' দেখুন।

উদাহরণস্বরূপ, আপনি যদি লোড রিকোয়েস্ট ডেটা পরিবর্তন করতে চান, তবে এটিকে ইন্টারসেপ্ট ও মডিফাই করার জন্য নিম্নলিখিত লজিকটি ব্যবহার করতে পারেন:

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, loadRequestData => {
      const error = new cast.framework.messages.ErrorData(
                      cast.framework.messages.ErrorType.LOAD_FAILED);
      if (!loadRequestData.media) {
        error.reason = cast.framework.messages.ErrorReason.INVALID_PARAM;
        return error;
      }

      if (!loadRequestData.media.entity) {
        return loadRequestData;
      }

      return thirdparty.fetchAssetAndAuth(loadRequestData.media.entity,
                                          loadRequestData.credentials)
        .then(asset => {
          if (!asset) {
            throw cast.framework.messages.ErrorReason.INVALID_REQUEST;
          }

          loadRequestData.media.contentUrl = asset.url;
          loadRequestData.media.metadata = asset.metadata;
          loadRequestData.media.tracks = asset.tracks;
          return loadRequestData;
        }).catch(reason => {
          error.reason = reason; // cast.framework.messages.ErrorReason
          return error;
        });
    });

context.start();

ত্রুটি পরিচালনা

মেসেজ ইন্টারসেপ্টরে ত্রুটি ঘটলে, আপনার ওয়েব রিসিভার অ্যাপের উচিত একটি উপযুক্ত cast.framework.messages.ErrorType এবং cast.framework.messages.ErrorReason রিটার্ন করা।

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, loadRequestData => {
      const error = new cast.framework.messages.ErrorData(
                      cast.framework.messages.ErrorType.LOAD_CANCELLED);
      if (!loadRequestData.media) {
        error.reason = cast.framework.messages.ErrorReason.INVALID_PARAM;
        return error;
      }

      ...

      return fetchAssetAndAuth(loadRequestData.media.entity,
                               loadRequestData.credentials)
        .then(asset => {
          ...
          return loadRequestData;
        }).catch(reason => {
          error.reason = reason; // cast.framework.messages.ErrorReason
          return error;
        });
    });

মেসেজ ইন্টারসেপশন বনাম ইভেন্ট লিসেনার

মেসেজ ইন্টারসেপশন এবং ইভেন্ট লিসেনারের মধ্যে কিছু প্রধান পার্থক্য নিচে দেওয়া হলো:

  • ইভেন্ট লিসেনার আপনাকে অনুরোধের ডেটা পরিবর্তন করার অনুমতি দেয় না
  • অ্যানালিটিক্স বা কোনো কাস্টম ফাংশন চালু করার জন্য ইভেন্ট লিসেনার সবচেয়ে ভালোভাবে ব্যবহার করা হয়।
playerManager.addEventListener(cast.framework.events.category.CORE,
    event => {
        console.log(event);
    });
  • মেসেজ ইন্টারসেপশন আপনাকে কোনো মেসেজ শোনা, তা আটক করা এবং অনুরোধের ডেটা নিজেই পরিবর্তন করার সুযোগ দেয়।
  • অনুরোধের ডেটা সংক্রান্ত নিজস্ব লজিক পরিচালনার জন্য মেসেজ ইন্টারসেপশন সবচেয়ে ভালোভাবে ব্যবহার করা হয়।

Loading media

cast.framework.messages.MessageType.LOAD মেসেজে মিডিয়া লোড করার জন্য MediaInformation বিভিন্ন প্রপার্টি প্রদান করে, যার মধ্যে entity , contentUrl , এবং contentId অন্তর্ভুক্ত।

  • আপনার প্রেরক এবং প্রাপক উভয় অ্যাপের বাস্তবায়নে ব্যবহারের জন্য entity হলো প্রস্তাবিত প্রপার্টি। এই প্রপার্টিটি একটি ডিপ লিঙ্ক ইউআরএল (deep link URL), যা একটি প্লেলিস্ট বা মিডিয়া কন্টেন্ট হতে পারে। আপনার অ্যাপ্লিকেশনটির উচিত এই ইউআরএলটি পার্স করা এবং অন্য দুটি ফিল্ডের মধ্যে অন্তত একটি পূরণ করা।
  • contentUrl হলো সেই প্লেয়েবল ইউআরএল যা প্লেয়ার কন্টেন্ট লোড করার জন্য ব্যবহার করবে। উদাহরণস্বরূপ, এই ইউআরএলটি একটি DASH ম্যানিফেস্টকে নির্দেশ করতে পারে।
  • ` contentId হয় একটি প্লে করার যোগ্য কন্টেন্ট ইউআরএল (যা contentUrl প্রপার্টির অনুরূপ) অথবা লোড করা কন্টেন্ট বা প্লেলিস্টের জন্য একটি অনন্য শনাক্তকারী হতে পারে। যদি এই প্রপার্টিটি একটি শনাক্তকারী হিসাবে ব্যবহার করা হয়, তবে আপনার অ্যাপ্লিকেশনটিকে contentUrl এ একটি প্লে করার যোগ্য ইউআরএল যুক্ত করতে হবে।

পরামর্শটি হলো, আসল আইডি বা কী প্যারামিটারগুলো সংরক্ষণের জন্য entity এবং মিডিয়ার ইউআরএল-এর জন্য contentUrl ব্যবহার করা। এর একটি উদাহরণ নিচের কোড স্নিপেটে দেখানো হয়েছে, যেখানে LOAD রিকোয়েস্টে entity উপস্থিত রয়েছে এবং প্লে করার যোগ্য contentUrl নেওয়া হয়েছে:

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, loadRequestData => {
      ...

      if (!loadRequestData.media.entity) {
        // Copy the value from contentId for legacy reasons if needed
        loadRequestData.media.entity = loadRequestData.media.contentId;
      }

      return thirdparty.fetchAssetAndAuth(loadRequestData.media.entity,
                                          loadRequestData.credentials)
        .then(asset => {
          loadRequestData.media.contentUrl = asset.url;
          ...
          return loadRequestData;
        });
    });

ডিভাইসের ক্ষমতা

getDeviceCapabilities মেথডটি সংযুক্ত কাস্ট ডিভাইস এবং এর সাথে যুক্ত ভিডিও বা অডিও ডিভাইসের তথ্য প্রদান করে। getDeviceCapabilities মেথডটি গুগল অ্যাসিস্ট্যান্ট, ব্লুটুথ এবং সংযুক্ত ডিসপ্লে ও অডিও ডিভাইসগুলোর জন্য সাপোর্টের তথ্য প্রদান করে।

এই মেথডটি একটি অবজেক্ট রিটার্ন করে, যেটিকে কোয়েরি করে আপনি নির্দিষ্ট এনামগুলোর মধ্যে যেকোনো একটি পাস করার মাধ্যমে সেই এনামটির ডিভাইস ক্যাপাবিলিটি পেতে পারেন। এনামগুলো cast.framework.system.DeviceCapabilities এ সংজ্ঞায়িত করা আছে।

এই উদাহরণটি যথাক্রমে IS_HDR_SUPPORTED এবং IS_DV_SUPPORTED কী-গুলোর মাধ্যমে যাচাই করে যে ওয়েব রিসিভার ডিভাইসটি HDR এবং ডলবিভিশন (DV) প্লে করতে সক্ষম কিনা।

const context = cast.framework.CastReceiverContext.getInstance();
context.addEventListener(cast.framework.system.EventType.READY, () => {
  const deviceCapabilities = context.getDeviceCapabilities();
  if (deviceCapabilities &&
      deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_HDR_SUPPORTED]) {
    // Write your own event handling code, for example
    // using the deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_HDR_SUPPORTED] value
  }
  if (deviceCapabilities &&
      deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_DV_SUPPORTED]) {
    // Write your own event handling code, for example
    // using the deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_DV_SUPPORTED] value
  }
});
context.start();

ব্যবহারকারীর মিথস্ক্রিয়া পরিচালনা করা

একজন ব্যবহারকারী প্রেরক অ্যাপ্লিকেশন (ওয়েব, অ্যান্ড্রয়েড এবং আইওএস), অ্যাসিস্ট্যান্ট-সক্ষম ডিভাইসে ভয়েস কমান্ড, স্মার্ট ডিসপ্লেতে টাচ কন্ট্রোল এবং অ্যান্ড্রয়েড টিভি ডিভাইসে রিমোট কন্ট্রোলের মাধ্যমে আপনার ওয়েব রিসিভার অ্যাপ্লিকেশনের সাথে ইন্টারঅ্যাক্ট করতে পারেন। কাস্ট এসডিকে বিভিন্ন এপিআই সরবরাহ করে, যা ওয়েব রিসিভার অ্যাপকে এই ইন্টারঅ্যাকশনগুলো পরিচালনা করতে, ব্যবহারকারীর অ্যাকশন স্টেটের মাধ্যমে অ্যাপ্লিকেশন ইউআই আপডেট করতে এবং ঐচ্ছিকভাবে যেকোনো ব্যাকএন্ড পরিষেবা আপডেট করার জন্য পরিবর্তনগুলো পাঠাতে সাহায্য করে।

সমর্থিত মিডিয়া কমান্ড

আইওএস এবং অ্যান্ড্রয়েড প্রেরক এক্সপান্ডেড কন্ট্রোলার, টাচ ডিভাইসে চলমান রিসিভার ও রিমোট কন্ট্রোল অ্যাপ এবং অ্যান্ড্রয়েড টিভি ডিভাইসের রিসিভার অ্যাপের জন্য UI কন্ট্রোলের অবস্থা MediaStatus.supportedMediaCommands দ্বারা চালিত হয়। যখন প্রপার্টিতে কোনো নির্দিষ্ট বিটওয়াইজ Command সক্রিয় করা হয়, তখন সেই অ্যাকশনের সাথে সম্পর্কিত বাটনগুলো সক্রিয় হয়। যদি মানটি সেট করা না থাকে, তাহলে বাটনটি নিষ্ক্রিয় থাকে। ওয়েব রিসিভারে এই মানগুলো পরিবর্তন করা যেতে পারে:

  1. PlayerManager.setSupportedMediaCommands ব্যবহার করে নির্দিষ্ট Commands সেট করা হয়
  2. addSupportedMediaCommands ব্যবহার করে একটি নতুন কমান্ড যোগ করা
  3. removeSupportedMediaCommands ব্যবহার করে বিদ্যমান কমান্ড অপসারণ করা।
playerManager.setSupportedMediaCommands(cast.framework.messages.Command.SEEK |
  cast.framework.messages.Command.PAUSE);

যখন রিসিভার আপডেট করা MediaStatus প্রস্তুত করে, তখন এটি supportedMediaCommands প্রপার্টিতে পরিবর্তনগুলো অন্তর্ভুক্ত করবে। যখন স্ট্যাটাসটি ব্রডকাস্ট করা হয়, তখন সংযুক্ত প্রেরক অ্যাপগুলো সেই অনুযায়ী তাদের UI-এর বাটনগুলো আপডেট করে নেবে।

সমর্থিত মিডিয়া কমান্ড এবং টাচ ডিভাইস সম্পর্কে আরও তথ্যের জন্য Accessing UI controls নির্দেশিকাটি দেখুন।

ব্যবহারকারীর কার্যকলাপের অবস্থা পরিচালনা করা

যখন ব্যবহারকারীরা UI-এর সাথে ইন্টারঅ্যাক্ট করেন বা ভয়েস কমান্ড পাঠান, তখন তারা কন্টেন্টের প্লেব্যাক এবং প্লে হওয়া আইটেমটির সাথে সম্পর্কিত প্রোপার্টিগুলো নিয়ন্ত্রণ করতে পারেন। যে অনুরোধগুলো প্লেব্যাক নিয়ন্ত্রণ করে, সেগুলো SDK দ্বারা স্বয়ংক্রিয়ভাবে পরিচালিত হয়। যে অনুরোধগুলো বর্তমানে প্লে হওয়া আইটেমটির প্রোপার্টি পরিবর্তন করে, যেমন একটি LIKE কমান্ড, সেগুলো রিসিভার অ্যাপ্লিকেশনকে পরিচালনা করতে হয়। এই ধরনের অনুরোধগুলো পরিচালনা করার জন্য SDK বেশ কিছু API প্রদান করে। এই অনুরোধগুলো সমর্থন করার জন্য, নিম্নলিখিত কাজগুলো অবশ্যই করতে হবে:

  • কোনো মিডিয়া আইটেম লোড করার সময় ব্যবহারকারীর পছন্দ অনুযায়ী MediaInformation userActionStates সেট করুন।
  • USER_ACTION বার্তাগুলো গ্রহণ করুন এবং অনুরোধকৃত কাজটি নির্ধারণ করুন।
  • UI আপডেট করতে MediaInformation এর UserActionState আপডেট করুন।

নিম্নলিখিত কোড স্নিপেটটি LOAD রিকোয়েস্টটি গ্রহণ করে এবং LoadRequestData এর MediaInformation পূরণ করে। এক্ষেত্রে, ব্যবহারকারী যে কন্টেন্টটি লোড করা হচ্ছে তা পছন্দ করেন।

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, (loadRequestData) => {
      const userActionLike = new cast.framework.messages.UserActionState(
          cast.framework.messages.UserAction.LIKE);
      loadRequestData.media.userActionStates = [userActionLike];

      return loadRequestData;
    });

নিম্নলিখিত কোড স্নিপেটটি USER_ACTION মেসেজটি গ্রহণ করে এবং অনুরোধকৃত পরিবর্তনসহ ব্যাকএন্ডে কল করার কাজটি পরিচালনা করে। এরপর এটি রিসিভারে UserActionState আপডেট করার জন্য একটি কল করে।

playerManager.setMessageInterceptor(cast.framework.messages.MessageType.USER_ACTION,
  (userActionRequestData) => {
    // Obtain the media information of the current content to associate the action to.
    let mediaInfo = playerManager.getMediaInformation();

    // If there is no media info return an error and ignore the request.
    if (!mediaInfo) {
        console.error('Not playing media, user action is not supported');
        return new cast.framework.messages.ErrorData(messages.ErrorType.BAD_REQUEST);
    }

    // Reach out to backend services to store user action modifications. See sample below.
    return sendUserAction(userActionRequestData, mediaInfo)

    // Upon response from the backend, update the client's UserActionState.
    .then(backendResponse => updateUserActionStates(backendResponse))

    // If any errors occurred in the backend return them to the cast receiver.
    .catch((error) => {
      console.error(error);
      return error;
    });
});

নিম্নলিখিত কোড স্নিপেটটি একটি ব্যাকএন্ড সার্ভিসে কল করার প্রক্রিয়া অনুকরণ করে। ফাংশনটি ব্যবহারকারীর অনুরোধ করা পরিবর্তনের ধরন দেখার জন্য UserActionRequestData পরীক্ষা করে এবং শুধুমাত্র যদি অ্যাকশনটি ব্যাকএন্ড দ্বারা সমর্থিত হয়, তবেই একটি নেটওয়ার্ক কল করে।

function sendUserAction(userActionRequestData, mediaInfo) {
  return new Promise((resolve, reject) => {
    switch (userActionRequestData.userAction) {
      // Handle user action changes supported by the backend.
      case cast.framework.messages.UserAction.LIKE:
      case cast.framework.messages.UserAction.DISLIKE:
      case cast.framework.messages.UserAction.FOLLOW:
      case cast.framework.messages.UserAction.UNFOLLOW:
      case cast.framework.messages.UserAction.FLAG:
      case cast.framework.messages.UserAction.SKIP_AD:
        let backendResponse = {userActionRequestData: userActionRequestData, mediaInfo: mediaInfo};
        setTimeout(() => {resolve(backendResponse)}, 1000);
        break;
      // Reject all other user action changes.
      default:
        reject(
          new cast.framework.messages.ErrorData(cast.framework.messages.ErrorType.INVALID_REQUEST));
    }
  });
}

নিম্নলিখিত কোড স্নিপেটটি UserActionRequestData গ্রহণ করে এবং MediaInformation থেকে UserActionState যোগ বা অপসারণ করে। MediaInformation এর UserActionState আপডেট করলে অনুরোধ করা অ্যাকশনের সাথে যুক্ত বাটনটির অবস্থা পরিবর্তিত হয়। এই পরিবর্তনটি স্মার্ট ডিসপ্লে কন্ট্রোল UI, রিমোট কন্ট্রোল অ্যাপ এবং অ্যান্ড্রয়েড টিভি UI-তে প্রতিফলিত হয়। এছাড়াও, iOS এবং অ্যান্ড্রয়েড প্রেরকদের জন্য এক্সপান্ডেড কন্ট্রোলারের UI আপডেট করতে এটি বহির্গামী MediaStatus মেসেজের মাধ্যমেও সম্প্রচার করা হয়।

function updateUserActionStates(backendResponse) {
  // Unwrap the backend response.
  let mediaInfo = backendResponse.mediaInfo;
  let userActionRequestData = backendResponse.userActionRequestData;

  // If the current item playing has changed, don't update the UserActionState for the current item.
  if (playerManager.getMediaInformation().entity !== mediaInfo.entity) {
    return;
  }

  // Check for existing userActionStates in the MediaInformation.
  // If none, initialize a new array to populate states with.
  let userActionStates = mediaInfo.userActionStates || [];

  // Locate the index of the UserActionState that will be updated in the userActionStates array.
  let index = userActionStates.findIndex((currUserActionState) => {
    return currUserActionState.userAction == userActionRequestData.userAction;
  });

  if (userActionRequestData.clear) {
    // Remove the user action state from the array if cleared.
    if (index >= 0) {
      userActionStates.splice(index, 1);
    }
    else {
      console.warn("Could not find UserActionState to remove in MediaInformation");
    }
  } else {
    // Add the UserActionState to the array if enabled.
    userActionStates.push(
      new cast.framework.messages.UserActionState(userActionRequestData.userAction));
  }

  // Update the UserActionState array and set the new MediaInformation
  mediaInfo.userActionStates = userActionStates;
  playerManager.setMediaInformation(mediaInfo, true);
  return;
}

ভয়েস কমান্ড

অ্যাসিস্ট্যান্ট-সক্ষম ডিভাইসগুলির জন্য ওয়েব রিসিভার এসডিকে-তে বর্তমানে নিম্নলিখিত মিডিয়া কমান্ডগুলি সমর্থিত। এই কমান্ডগুলির ডিফল্ট ইমপ্লিমেন্টেশন cast.framework.PlayerManager এ পাওয়া যায়।

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

ভয়েসের মাধ্যমে মিডিয়া কমান্ড সমর্থন করা হয়

অ্যাসিস্ট্যান্ট-সক্ষম ডিভাইসে ভয়েস কমান্ডের মাধ্যমে মিডিয়া কমান্ড চালু হওয়া আটকাতে, আপনাকে প্রথমে সেই সমর্থিত মিডিয়া কমান্ডগুলো সেট করতে হবে যা আপনি সমর্থন করতে চান। তারপর আপনাকে CastReceiverOptions.enforceSupportedCommands প্রপার্টিটি সক্রিয় করার মাধ্যমে সেই কমান্ডগুলো কার্যকর করতে হবে। Cast SDK প্রেরক এবং টাচ-সক্ষম ডিভাইসগুলোর ইউজার ইন্টারফেস (UI) এই কনফিগারেশনগুলো প্রতিফলিত করার জন্য পরিবর্তিত হবে। যদি ফ্ল্যাগটি সক্রিয় না থাকে, তবে আগত ভয়েস কমান্ডগুলো কার্যকর হবে।

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

নিচের উদাহরণে আমরা CastReceiverContext শুরু করার সময় CastReceiverOptions সরবরাহ করছি। আমরা PAUSE কমান্ডের জন্য সমর্থন যোগ করেছি এবং প্লেয়ারকে শুধুমাত্র সেই কমান্ডটি সমর্থন করতে বাধ্য করেছি। এখন যদি কোনো ভয়েস কমান্ড SEEK মতো অন্য কোনো অপারেশনের অনুরোধ করে, তবে তা প্রত্যাখ্যান করা হবে। ব্যবহারকারীকে জানানো হবে যে কমান্ডটি এখনও সমর্থিত নয়।

const context = cast.framework.CastReceiverContext.getInstance();

context.start({
  enforceSupportedCommands: true,
  supportedCommands: cast.framework.messages.Command.PAUSE
});

আপনি যে প্রতিটি কমান্ড সীমাবদ্ধ করতে চান, তার জন্য আলাদা লজিক প্রয়োগ করতে পারেন। enforceSupportedCommands ফ্ল্যাগটি সরিয়ে দিন এবং আপনি যে প্রতিটি কমান্ড সীমাবদ্ধ করতে চান, তার জন্য আগত বার্তাটি ইন্টারসেপ্ট করতে পারেন। এখানে আমরা SDK দ্বারা প্রদত্ত অনুরোধটি ইন্টারসেপ্ট করি, যাতে অ্যাসিস্ট্যান্ট-সক্ষম ডিভাইসগুলিতে জারি করা SEEK কমান্ডগুলি আপনার ওয়েব রিসিভার অ্যাপ্লিকেশনে কোনো সিক ট্রিগার না করে।

যেসব মিডিয়া কমান্ড আপনার অ্যাপ্লিকেশন সমর্থন করে না, সেগুলোর জন্য একটি উপযুক্ত ত্রুটির কারণ ফেরত দিন, যেমন NOT_SUPPORTED

playerManager.setMessageInterceptor(cast.framework.messages.MessageType.SEEK,
  seekData => {
    // Block seeking if the SEEK supported media command is disabled
    if (!(playerManager.getSupportedMediaCommands() & cast.framework.messages.Command.SEEK)) {
      let e = new cast.framework.messages.ErrorData(cast.framework.messages.ErrorType
      .INVALID_REQUEST);
      e.reason = cast.framework.messages.ErrorReason.NOT_SUPPORTED;
      return e;
    }

    return seekData;
  });

ভয়েস অ্যাক্টিভিটি থেকে ব্যাকগ্রাউন্ডিং

যদি ব্যবহারকারীর কথা শোনা বা উত্তর দেওয়ার মতো অ্যাসিস্ট্যান্টের কার্যকলাপের কারণে কাস্ট প্ল্যাটফর্ম আপনার অ্যাপ্লিকেশনের সাউন্ড ব্যাকগ্রাউন্ডে রাখে, তাহলে কার্যকলাপটি শুরু হওয়ার সাথে সাথে ওয়েব রিসিভার অ্যাপ্লিকেশনে NOT_IN_FOCUS এর একটি FocusState মেসেজ পাঠানো হয়। কার্যকলাপটি শেষ হলে IN_FOCUS সহ আরেকটি মেসেজ পাঠানো হয়। আপনার অ্যাপ্লিকেশন এবং যে মিডিয়াটি প্লে করা হচ্ছে তার উপর নির্ভর করে, আপনি FOCUS_STATE মেসেজ টাইপটি ইন্টারসেপ্ট করে FocusState যখন NOT_IN_FOCUS থাকে তখন মিডিয়াটি পজ করতে চাইতে পারেন।

উদাহরণস্বরূপ, অ্যাসিস্ট্যান্ট যখন ব্যবহারকারীর কোনো প্রশ্নের উত্তর দেয়, তখন অডিওবুক প্লেব্যাক থামিয়ে দেওয়াটা একটি ভালো ব্যবহারকারী অভিজ্ঞতা।

playerManager.setMessageInterceptor(cast.framework.messages.MessageType.FOCUS_STATE,
  focusStateRequestData => {
    // Pause content when the app is out of focus. Resume when focus is restored.
    if (focusStateRequestData.state == cast.framework.messages.FocusState.NOT_IN_FOCUS) {
      playerManager.pause();
    } else {
      playerManager.play();
    }

    return focusStateRequestData;
  });

ভয়েস-নির্দিষ্ট ক্যাপশন ভাষা

যখন কোনো ব্যবহারকারী ক্যাপশনের জন্য ভাষা স্পষ্টভাবে উল্লেখ করেন না, তখন ক্যাপশনের জন্য সেই ভাষাই ব্যবহৃত হয় যে ভাষায় কমান্ডটি বলা হয়েছিল। এই পরিস্থিতিতে, আগত বার্তার isSuggestedLanguage প্যারামিটারটি নির্দেশ করে যে সংশ্লিষ্ট ভাষাটি প্রস্তাবিত ছিল নাকি ব্যবহারকারী কর্তৃক স্পষ্টভাবে অনুরোধ করা হয়েছিল।

উদাহরণস্বরূপ, "OK Google, turn captions on" কমান্ডটির জন্য isSuggestedLanguage মান true সেট করা হয়, কারণ কমান্ডটি যে ভাষায় বলা হয়েছিল, তার উপর ভিত্তি করে ভাষাটি অনুমান করা হয়েছে। যদি ভাষাটি স্পষ্টভাবে অনুরোধ করা হয়, যেমন "OK Google, turn on English captions"-এর ক্ষেত্রে, isSuggestedLanguage মান false সেট করা হয়।

মেটাডেটা এবং ভয়েস কাস্টিং

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

প্রবাহ স্থানান্তর

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

স্ট্রিম ট্রান্সফারের জন্য ইভেন্ট ফ্লো হলো:

  1. উৎস ডিভাইসে:
    1. মিডিয়া প্লে হওয়া বন্ধ করে দেয়।
    2. ওয়েব রিসিভার অ্যাপ্লিকেশনটি বর্তমান মিডিয়ার অবস্থা সংরক্ষণ করার জন্য একটি কমান্ড গ্রহণ করে।
    3. ওয়েব রিসিভার অ্যাপ্লিকেশনটি বন্ধ করা হয়েছে।
  2. গন্তব্য ডিভাইসে:
    1. ওয়েব রিসিভার অ্যাপ্লিকেশনটি লোড হয়েছে।
    2. ওয়েব রিসিভার অ্যাপ্লিকেশনটি সংরক্ষিত মিডিয়ার অবস্থা পুনরুদ্ধার করার জন্য একটি কমান্ড গ্রহণ করে।
    3. মিডিয়া আবার চলতে শুরু করে।

গণমাধ্যম রাষ্ট্রের উপাদানগুলোর মধ্যে রয়েছে:

  • গান, ভিডিও বা মিডিয়া আইটেমটির নির্দিষ্ট অবস্থান বা টাইমস্ট্যাম্প।
  • একটি বৃহত্তর সারিতে (যেমন প্লেলিস্ট বা আর্টিস্ট রেডিও) এর অবস্থান।
  • প্রমাণীকৃত ব্যবহারকারী।
  • প্লেব্যাকের অবস্থা (যেমন, চলছে বা থামানো আছে)।

স্ট্রিম স্থানান্তর সক্ষম করা

আপনার ওয়েব রিসিভারে স্ট্রিম ট্রান্সফার বাস্তবায়ন করতে:

  1. STREAM_TRANSFER কমান্ড ব্যবহার করে supportedMediaCommands আপডেট করুন:
    playerManager.addSupportedMediaCommands(
    cast.framework.messages.Command.STREAM_TRANSFER, true);
  2. সেশন স্টেট সংরক্ষণ অংশে বর্ণিত পদ্ধতি অনুযায়ী, আপনি ঐচ্ছিকভাবে SESSION_STATE এবং RESUME_SESSION মেসেজ ইন্টারসেপ্টরগুলোকে ওভাররাইড করতে পারেন। শুধুমাত্র তখনই এগুলো ওভাররাইড করুন, যখন সেশন স্ন্যাপশটের অংশ হিসেবে কাস্টম ডেটা সংরক্ষণ করার প্রয়োজন হয়। অন্যথায়, সেশন স্টেট সংরক্ষণের জন্য ডিফল্ট ইমপ্লিমেন্টেশন স্ট্রিম ট্রান্সফার সমর্থন করবে।

সেশন অবস্থা সংরক্ষণ

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

ওয়েব রিসিভার দ্বারা তৈরি লোড রিকোয়েস্টটি প্রয়োজনে SESSION_STATE মেসেজ ইন্টারসেপ্টরে ওভাররাইড করা যেতে পারে। আপনি যদি লোড রিকোয়েস্টে কাস্টম ডেটা যোগ করতে চান, তাহলে আমরা সেগুলোকে loadRequestData.customData তে রাখার পরামর্শ দিই।

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.SESSION_STATE,
    function (sessionState) {
        // Override sessionState.loadRequestData if needed.
        const newCredentials = updateCredentials_(sessionState.loadRequestData.credentials);
        sessionState.loadRequestData.credentials = newCredentials;

        // Add custom data if needed.
        sessionState.loadRequestData.customData = {
            'membership': 'PREMIUM'
        };

        return sessionState;
    });

RESUME_SESSION মেসেজ ইন্টারসেপ্টরের loadRequestData.customData থেকে কাস্টম ডেটা পুনরুদ্ধার করা যেতে পারে।

let cred_ = null;
let membership_ = null;

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.RESUME_SESSION,
    function (resumeSessionRequest) {
        let sessionState = resumeSessionRequest.sessionState;

        // Modify sessionState.loadRequestData if needed.
        cred_ = sessionState.loadRequestData.credentials;

        // Retrieve custom data.
        membership_ = sessionState.loadRequestData.customData.membership;

        return resumeSessionRequest;
    });

কন্টেন্ট প্রিলোড

ওয়েব রিসিভার কিউ-তে থাকা বর্তমান প্লেব্যাক আইটেমের পরের মিডিয়া আইটেমগুলো প্রি-লোড করা সমর্থন করে।

প্রিলোড অপারেশন আসন্ন আইটেমগুলোর কয়েকটি অংশ আগে থেকেই ডাউনলোড করে নেয়। এর স্পেসিফিকেশন QueueItem অবজেক্টের preloadTime ভ্যালুতে করা হয় (যদি নির্দিষ্ট করে না দেওয়া হয়, তবে ডিফল্ট মান ২০ সেকেন্ড থাকে)। সময়টি সেকেন্ডে প্রকাশ করা হয়, যা বর্তমানে প্লে হওয়া আইটেমটির শেষ হওয়ার সাপেক্ষে গণনা করা হয়। শুধুমাত্র ধনাত্মক মানই গ্রহণযোগ্য। উদাহরণস্বরূপ, যদি মানটি ১০ সেকেন্ড হয়, তবে পূর্ববর্তী আইটেমটি শেষ হওয়ার ১০ সেকেন্ড আগেই এই আইটেমটি প্রিলোড হয়ে যাবে। যদি প্রিলোড করার সময় currentItem-এ অবশিষ্ট সময়ের চেয়ে বেশি হয়, তবে প্রিলোডটি যত তাড়াতাড়ি সম্ভব সম্পন্ন হবে। সুতরাং, যদি queueItem-এ প্রিলোডের একটি খুব বড় মান নির্দিষ্ট করা হয়, তবে এমন একটি প্রভাব তৈরি করা সম্ভব যে, যখনই আমরা বর্তমান আইটেমটি প্লে করছি, তখনই পরবর্তী আইটেমটি প্রিলোড হয়ে যাচ্ছে। তবে, আমরা এই সেটিং এবং পছন্দের বিষয়টি ডেভেলপারদের উপর ছেড়ে দিই, কারণ এই মানটি বর্তমানে প্লে হওয়া আইটেমটির ব্যান্ডউইথ এবং স্ট্রিমিং পারফরম্যান্সকে প্রভাবিত করতে পারে।

ডিফল্টরূপে HLS, DASH, এবং Smooth স্ট্রিমিং কন্টেন্টের জন্য প্রি-লোডিং কাজ করবে।

সাধারণ MP4 ভিডিও এবং MP3-এর মতো অডিও ফাইল আগে থেকে লোড করা হবে না, কারণ কাস্ট ডিভাইসগুলো শুধুমাত্র একটি মিডিয়া উপাদান সমর্থন করে এবং বিদ্যমান কোনো কন্টেন্ট প্লে হওয়া অবস্থায় তা প্রি-লোড করার জন্য ব্যবহার করা যায় না।

কাস্টম বার্তা

ওয়েব রিসিভার অ্যাপ্লিকেশনগুলোর জন্য বার্তা বিনিময়ই হলো প্রধান মিথস্ক্রিয়া পদ্ধতি।

একজন প্রেরক যে প্ল্যাটফর্মে (অ্যান্ড্রয়েড, আইওএস, ওয়েব) বার্তাটি চালাচ্ছেন, সেই প্ল্যাটফর্মের এপিআই ব্যবহার করে একটি ওয়েব রিসিভারের কাছে বার্তা প্রেরণ করেন। ইভেন্ট লিসেনারগুলিতে পাঠানো ইভেন্ট অবজেক্টে (যা একটি বার্তার প্রকাশ) একটি ডেটা এলিমেন্ট ( event.data ) থাকে, যেখানে ডেটাটি নির্দিষ্ট ইভেন্ট টাইপের বৈশিষ্ট্যগুলো ধারণ করে।

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

সমস্ত নেমস্পেস একটি স্ট্রিং দ্বারা সংজ্ঞায়িত করা হয় এবং এটি অবশ্যই " urn:x-cast: " দিয়ে শুরু হতে হবে, যার পরে যেকোনো একটি স্ট্রিং থাকতে পারে। উদাহরণস্বরূপ, " urn:x-cast: com.example.cast.mynamespace "।

সংযুক্ত প্রেরকদের কাছ থেকে কাস্টম বার্তা শোনার জন্য ওয়েব রিসিভারের একটি কোড স্নিপেট নিচে দেওয়া হলো:

const context = cast.framework.CastReceiverContext.getInstance();

const CUSTOM_CHANNEL = 'urn:x-cast:com.example.cast.mynamespace';
context.addCustomMessageListener(CUSTOM_CHANNEL, function(customEvent) {
  // handle customEvent.
});

context.start();

একইভাবে, ওয়েব রিসিভার অ্যাপ্লিকেশনগুলো সংযুক্ত প্রেরকদের কাছে বার্তা পাঠিয়ে ওয়েব রিসিভারের অবস্থা সম্পর্কে তাদের অবহিত রাখতে পারে। একটি ওয়েব রিসিভার অ্যাপ্লিকেশন CastReceiverContextsendCustomMessage(namespace, senderId, message) ব্যবহার করে বার্তা পাঠাতে পারে। একটি ওয়েব রিসিভার কোনো প্রাপ্ত বার্তার প্রতিক্রিয়ায় অথবা অ্যাপ্লিকেশনের অবস্থার পরিবর্তনের কারণে কোনো নির্দিষ্ট প্রেরকের কাছে বার্তা পাঠাতে পারে। পয়েন্ট-টু-পয়েন্ট মেসেজিং (৬৪কেবি-র সীমা সহ) ছাড়াও, একটি ওয়েব রিসিভার সমস্ত সংযুক্ত প্রেরকদের কাছে বার্তা ব্রডকাস্টও করতে পারে।

অডিও ডিভাইসের জন্য কাস্ট করুন

শুধুমাত্র অডিও প্লেব্যাকের সমর্থনের জন্য অডিও ডিভাইসের জন্য গুগল কাস্ট গাইডটি দেখুন।

অ্যান্ড্রয়েড টিভি

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

আপনার অ্যাপ্লিকেশনটিকে রিমোট কন্ট্রোলের সাথে সংযুক্ত করা

অ্যান্ড্রয়েড টিভি ডিভাইসে চলমান গুগল ওয়েব রিসিভার, ডিভাইসটির কন্ট্রোল ইনপুট (যেমন হ্যান্ড-হেল্ড রিমোট কন্ট্রোল) থেকে প্রাপ্ত ইনপুটকে, 'মিডিয়া প্লেব্যাক মেসেজ' অংশে বর্ণিত urn:x-cast:com.google.cast.media নেমস্পেসের জন্য সংজ্ঞায়িত মিডিয়া প্লেব্যাক মেসেজ হিসেবে অনুবাদ করে। অ্যান্ড্রয়েড টিভির কন্ট্রোল ইনপুট থেকে বেসিক প্লেব্যাক নিয়ন্ত্রণের সুযোগ দেওয়ার জন্য, আপনার অ্যাপ্লিকেশনটিকে অবশ্যই এই মেসেজগুলো সাপোর্ট করতে হবে।

অ্যান্ড্রয়েড টিভির সামঞ্জস্যতার জন্য নির্দেশিকা

আপনার অ্যাপ্লিকেশনটি অ্যান্ড্রয়েড টিভির সাথে সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করার জন্য এখানে কিছু পরামর্শ এবং এড়িয়ে চলার মতো সাধারণ ভুলগুলো উল্লেখ করা হলো:

  • মনে রাখবেন যে ইউজার-এজেন্ট স্ট্রিং-এ 'Android' এবং 'CrKey' উভয়ই থাকে; কিছু সাইট 'Android' লেবেলটি শনাক্ত করার কারণে আপনাকে শুধুমাত্র মোবাইলের জন্য তৈরি সাইটে রিডাইরেক্ট করতে পারে। ইউজার-এজেন্ট স্ট্রিং-এ 'Android' থাকলেই যে সবসময় একজন মোবাইল ব্যবহারকারী হবেন, এমনটা ধরে নেবেন না।
  • অ্যান্ড্রয়েডের মিডিয়া স্ট্যাক ডেটা আনার জন্য স্বচ্ছ GZIP ব্যবহার করতে পারে। নিশ্চিত করুন যে আপনার মিডিয়া ডেটা Accept-Encoding: gzip এ সাড়া দিতে পারে।
  • অ্যান্ড্রয়েড টিভির HTML5 মিডিয়া ইভেন্টগুলো ক্রোমকাস্টের চেয়ে ভিন্ন সময়ে ট্রিগার হতে পারে, যার ফলে এমন কিছু সমস্যা প্রকাশ পেতে পারে যা ক্রোমকাস্টে লুকানো ছিল।
  • মিডিয়া আপডেট করার সময়, <audio>/<video> এলিমেন্ট দ্বারা চালিত মিডিয়া সম্পর্কিত ইভেন্ট, যেমন timeupdate , pause এবং waiting ব্যবহার করুন। progress , suspend এবং stalled মতো নেটওয়ার্কিং সম্পর্কিত ইভেন্ট ব্যবহার করা থেকে বিরত থাকুন, কারণ এগুলো সাধারণত প্ল্যাটফর্ম-নির্ভর হয়ে থাকে। আপনার রিসিভারে মিডিয়া ইভেন্ট পরিচালনা সম্পর্কে আরও তথ্যের জন্য 'মিডিয়া ইভেন্টস' দেখুন।
  • আপনার রিসিভার সাইটের HTTPS সার্টিফিকেট কনফিগার করার সময়, ইন্টারমিডিয়েট CA সার্টিফিকেট অন্তর্ভুক্ত করতে ভুলবেন না। যাচাই করার জন্য Qualsys SSL টেস্ট পেজটি দেখুন: যদি আপনার সাইটের বিশ্বস্ত সার্টিফিকেশন পাথে “অতিরিক্ত ডাউনলোড” লেবেলযুক্ত কোনো CA সার্টিফিকেট অন্তর্ভুক্ত থাকে, তাহলে সেটি অ্যান্ড্রয়েড-ভিত্তিক প্ল্যাটফর্মে লোড নাও হতে পারে।
  • ক্রোমকাস্ট রিসিভার পেজটি ৭২০পি গ্রাফিক্স প্লেনে প্রদর্শন করলেও, অ্যান্ড্রয়েড টিভি সহ অন্যান্য কাস্ট প্ল্যাটফর্মগুলো পেজটি ১০৮০পি পর্যন্ত প্রদর্শন করতে পারে। নিশ্চিত করুন যে আপনার রিসিভার পেজটি বিভিন্ন রেজোলিউশনে সুন্দরভাবে স্কেল হয়।