Требования к доступу

Пользователи предпочитают смотреть или слушать контент, к которому у них уже есть доступ, например, контент по их подписке. Если Google знает, какой контент доступен пользователю в вашем приложении или на вашей платформе, он может сформировать более эффективный результат поиска или отклик, чтобы направить пользователя к этому контенту.

Рисунок 1. Требования к доступу помогают вашим подписчикам получать доступ к контенту вашего приложения или платформы.

Определить требования к доступу к контенту

Вам необходимо определить требования к доступу для каждого пакета контента в вашем каталоге. При этом обратите внимание на следующие вопросы:

  • Необходимо ли пользователям входить в ваше приложение или на платформу для доступа к контенту?
  • Нужна ли пользователям подписка?

    Только действия для просмотра:

    • Нужна ли пользователям подписка у внешнего поставщика услуг?
    • Предлагаете ли вы многоуровневую, многопакетную или дополнительную подписку?
  • Только действия для просмотра: Нужно ли пользователям арендовать или покупать контент?

  • Меняются ли требования к доступу со временем?

  • Зависят ли требования к доступу от местоположения устройства?

Типы ограничения доступа

Существует два вида ограничений доступа:

Тип платного доступа

Вы можете ограничить доступ к контенту, выбрав тип платного доступа. В следующей таблице подробно описаны различные типы платного доступа:

Тип платного доступа Пример Категория
Покупка или вход в систему не требуются. Треск nologinrequired
Пользователь должен быть авторизован, но ему не нужна платная подписка. Вуду (AVOD) free
У пользователя должна быть активная подписка. Доступ не зависит от уровня подписки. Нетфликс

subscription

У пользователя должна быть активная подписка. Доступ зависит от уровня подписки. Hulu (дополнения)

subscription

Контент доступен в течение ограниченного периода времени после покупки. Вуду rental
Контент доступен в течение неопределенного периода времени после покупки. Вуду purchase
Контент доступен по кабельной подписке. HBO Go externalSubscription

Тип платного доступа для Watch Actions

Чтобы указать тип платного доступа к контенту для действий просмотра, используйте свойство category в спецификации доступа к действию :

"potentialAction": {
  "@type":"WatchAction",
  "target": {  },
  "actionAccessibilityRequirement": {
    "@type": "ActionAccessSpecification",
    "category": "subscription",
    "availabilityStarts": "2018-06-01T10:35:29Z",
    "availabilityEnds": "2019-05-31T10:35:29Z",
    "eligibleRegion": {
      "@type": "Country",
      "name": "US"
    }
  },
  ...
}

Тип платного доступа для действий «Прослушать»

Чтобы указать тип платного доступа к контенту для действий прослушивания, используйте свойство category в объекте предложения :

"potentialAction": {
  "@type":"ListenAction",
  "target": {  },
  "expectsAcceptanceOf":{
    "@type":"Offer",
    "category":"subscription",
    "availabilityStarts": "2018-06-01T10:35:29Z",
    "availabilityEnds": "2019-05-31T10:35:29Z",
    "eligibleRegion": {
      "@type":"Country",
      "name":"US"
    }
  },
  ...
}

Географическая область

Необходимо указать географические регионы, где доступен контент. Используйте одно или оба из следующих свойств:

Пользователь может получить доступ к контенту, если местоположение устройства находится в пределах любого региона, указанного в eligibleRegion , и не находится ни в одном регионе, указанном в ineligibleRegion .

Свойства eligibleRegion и ineligibleRegion допускают следующие значения:

Если контент доступен глобально, используйте следующее специальное значение для eligibleRegion :

"eligibleRegion": "EARTH",

варианты использования conformRegion

Ниже приведены примеры использования свойства eligibleRegion :

  • Пример 1: eligibleRegion со списком стран.
  • Пример 2: eligibleRegion с объектом GeoShape , содержащим список почтовых индексов.
  • Пример 3: eligibleRegion с объектом GeoShape , содержащим список кодов зоны прямой сортировки (FSA).
  • Пример 4: eligibleRegion с объектом GeoShape , содержащим идентификатор DMA.
  • Пример 5: eligibleRegion со списком объектов GeoShape . Каждый из них содержит идентификатор DMA.
  • Пример 6: ineligibleRegion с заблокированными почтовыми индексами.

Пример 1

eligibleRegion со списком стран:


"actionAccessibilityRequirement": {
  "@type": "ActionAccessSpecification",
  "category": "subscription",
  "requiresSubscription": {
    "@type": "MediaSubscription",
    "@id": "http://www.example.com/north_america_network/subscription",
    "name": "Example Subscription",
    "commonTier": true
  },
  "eligibleRegion": [
    {
      "@type": "Country",
      "name": "US"
    },
    {
      "@type": "Country",
      "name": "CA"
    }
  ]
}

Пример 2

eligibleRegion с объектом GeoShape , содержащим список почтовых индексов:


"actionAccessibilityRequirement": {
  "@type": "ActionAccessSpecification",
  "category": "subscription",
  "requiresSubscription": {
    "@type": "MediaSubscription",
    "@id": "http://www.example.com/local_tv_network/subscription",
    "name": "Example Subscription",
    "commonTier": true
  },
  "eligibleRegion": {
    "@type": "GeoShape",
    "@id": "http://example.com/area1",
    "addressCountry": "US",
    "postalCode": [
      "94118",
      "94119"
    ]
  }
}

Пример 3

eligibleRegion с объектом GeoShape , содержащим список кодов зоны прямой сортировки (FSA):


"actionAccessibilityRequirement": {
  "@type": "ActionAccessSpecification",
  "category": "subscription",
  "requiresSubscription": {
    "@type": "MediaSubscription",
    "@id": "http://www.example.com/local_tv_network/subscription",
    "name": "Example Subscription",
    "commonTier": true
  },
  "additionalProperty": {
      "@type": "PropertyValue",
      "name": "DisplaySubscriptionIdentifier",
      "value": "http://www.example.com/local_tv_network/subscription"
  },
  "eligibleRegion":{
    "@type": "GeoShape",
    "@id": "http://example.com/area2",
    "addressCountry": "CA",
    "postalCode": [
      "1A1",
      "K1A"
    ]
  }
}

Пример 4

eligibleRegion с объектом GeoShape , содержащим идентификатор DMA:


"actionAccessibilityRequirement": {
  "@type": "ActionAccessSpecification",
  "category": "subscription",
  "requiresSubscription": {
    "@type": "MediaSubscription",
    "@id": "http://www.example.com/abcd/subscription",
    "name": "Example Subscription",
    "commonTier": true
  },
  "additionalProperty": {
      "@type": "PropertyValue",
      "name": "DisplaySubscriptionIdentifier",
      "value": "http://www.example.com/abcd/subscription"
  },
  "eligibleRegion":{
    "@type": "GeoShape",
    "@id": "http://example.com/area3",
    "addressCountry": "US",
    "identifier": [
      {
        "@type": "PropertyValue",
        "propertyID": "DMA_ID",
        "value": "501"
      }
    ]
  }
}

Пример 5

eligibleRegion со списком объектов GeoShape . Каждый объект содержит идентификатор DMA:


"actionAccessibilityRequirement" : {
   "@type" : "ActionAccessSpecification",
   "eligibleRegion" : [
      {
         "@id" : "http://example.com/dma/601",
         "@type" : "GeoShape",
         "addressCountry" : "US",
         "identifier" : {
            "@type" : "PropertyValue",
            "propertyID" : "DMA_ID",
            "value" : "601"
         }
      },
      {
         "@id" : "http://example.com/dma/602",
         "@type" : "GeoShape",
         "addressCountry" : "US",
         "identifier" : {
            "@type" : "PropertyValue",
            "propertyID" : "DMA_ID",
            "value" : "602"
         }
      }
   ]
}

Пример 6

ineligibleRegion с заблокированными почтовыми индексами:


"actionAccessibilityRequirement": {
  "@type": "ActionAccessSpecification",
  "category": "subscription",
  "requiresSubscription": {
    "@type": "MediaSubscription",
    "@id": "http://www.example.com/local_tv_network/subscription",
    "name": "Example Subscription",
    "commonTier": true
  },
  "additionalProperty": {
      "@type": "PropertyValue",
      "name": "DisplaySubscriptionIdentifier",
      "value": "http://www.example.com/local_tv_network/subscription"
  },
 "eligibleRegion":   {
      "@type": "Country",
      "name": "US"
    },
  "ineligibleRegion": {
    "@type": "GeoShape",
    "@id": "http://example.com/area1",
    "addressCountry": "US",
    "postalCode": [
      "94118",
      "94119"
    ]
  }
}

Идентификатор права

Идентификатор права доступа, entitlementId , — это строка, которая представляет доступ к группе контента в вашем каталоге медиаконтента. Чтобы определить, имеет ли пользователь доступ к вашему контенту, Google выполняет следующие действия:

  1. Мы делаем вызов API к вашей конечной точке прав , чтобы получить идентификаторы прав пользователя.
  2. Мы ищем требуемые идентификаторы прав доступа к контенту в вашем фиде Media Actions.
  3. Мы сопоставляем entitlementId пользователя со свойством identifier объекта подписки на медиа в вашей ленте. Если хотя бы один entitlementId совпадает, мы определяем, что пользователь имеет доступ к контенту.
Рисунок 2. Один из идентификаторов прав пользователя совпадает с требуемым идентификатором прав контента.

Google рекомендует использовать следующий синтаксис для entitlementId :

<domain name> + colon (:) + <access level to content>

Примеры синтаксиса:

  • example.com:basic
  • example.com:premium
  • example.com:sports

Пример идентификатора права

В фиде MediaExampleCompany указано, что Movie XYZ требуется example.com:basic entitlementId , как показано ниже:

{
  "@context": ["http://schema.org", {"@language": "en"}],
  "@type": "Movie",
  "@id": "www.example.com/movie_xyz",
  "url": "www.example.com/movie_xyz",
  "name": "Movie XYZ",
  "potentialAction": {
    "@type": "WatchAction",
    "target": [  ],
    "actionAccessibilityRequirement": {
      "@type": "ActionAccessSpecification",
      "category": "subscription",
      "requiresSubscription": {
        "@type": "MediaSubscription",
        "@id": "http://www.example.com/basic_subscription",
        "name": "Basic subscription",
        "commonTier": true
        ...
      },
      "additionalProperty": {
        "@type": "PropertyValue",
        "name": "DisplaySubscriptionIdentifier",
        "value": "http://www.example.com/basic_subscription"
      },
      ...
    }
  },
  ...
}

Варианты использования общего доступа

Ниже приведены распространенные варианты использования доступа:

  • Бесплатно (вход в систему не требуется): контент доступен без входа в систему, подписки или покупки.
  • Бесплатно (требуется авторизация): контент требует авторизации пользователя, но не требует подписки.
  • Одноуровневая подписка: контент требует подписки. Все подписчики получают доступ к одному и тому же контенту, будь то фильмы или эпизоды, независимо от тарифного плана.
  • Многоуровневая подписка: контент требует подписки. Подписчики могут получить доступ к разному контенту, будь то фильмы или эпизоды, в зависимости от уровня подписки. Например, «Серебряный» или «Золотой» .
  • Дополнительная подписка: контент требует подписки. Подписчики могут добавлять премиум-контент в дополнение к своей обычной подписке.
  • Разовая покупка: контент можно приобрести, после чего пользователь может получить к нему неограниченный доступ.
  • Прямая трансляция: подписка включает доступ к местным, национальным и премиум-каналам.
  • Сторонняя подписка: для просмотра контента пользователю необходимо войти в систему своего кабельного провайдера.

Бесплатно (вход в систему не требуется)

Вход не требуется

Контент доступен без входа в систему или подписки.


{
  "actionAccessibilityRequirement": {
    "@type": "ActionAccessSpecification",
    "category": "nologinrequired",
    "availabilityStarts": "2015-01-01T00:00Z",
    "availabilityEnds": "2015-12-31T00:00Z",
    "eligibleRegion": {
      "@type": "Country",
      "name": "US"
    }
  }
}
  • Установить category nologinrequired .
  • Не включайте expectAcceptanceOf .

Бесплатно (требуется вход в систему)

Требуется вход в систему

Для просмотра контента требуется авторизация пользователя, но не требуется подписка.


{
  "actionAccessibilityRequirement": {
    "@type": "ActionAccessSpecification",
    "category": "free",
    "availabilityStarts": "2015-01-01T00:00Z",
    "availabilityEnds": "2015-12-31T00:00Z",
    "eligibleRegion": {
      "@type": "Country",
      "name": "US"
    }
  }
}
  • Установить category « free .
  • Не включайте expectAcceptanceOf .

Одноуровневая подписка

В одноуровневой модели подписки у поставщика услуг есть один уровень подписки. Все подписчики получают доступ к одному и тому же контенту, будь то фильмы или сериалы, независимо от тарифного плана.


{
  "actionAccessibilityRequirement": {
    "@type": "ActionAccessSpecification",
    "category": "subscription",
    "availabilityStarts": "2015-01-01T00:00Z",
    "availabilityEnds": "2015-12-31T00:00Z",
    "requiresSubscription": {
        "@type": "MediaSubscription",
        "name": "Example Package",
        "commonTier": true,
        "@id": "http://www.example.com/example_package"
    },
    "additionalProperty": {
      "@type": "PropertyValue",
      "name": "DisplaySubscriptionIdentifier",
      "value": "http://www.example.com/example_package"
    },
    "eligibleRegion": {
      "@type": "Country",
      "name": "US"
    }
  }
}

Многоуровневая подписка

В многоуровневой модели подписки поставщик услуг предлагает несколько уровней подписки, например, «Золотой» , «Серебряный» и «Бронзовый» . Пользователи с подпиской верхнего уровня получают доступ ко всему контенту нижнего уровня. Однако пользователи с подпиской нижнего уровня не могут получить доступ к контенту верхнего уровня.

Рисунок 3. Многоуровневая модель подписки и ее представление прав.

Рассмотрим следующий сценарий:

  • Джейн подписана на уровень Gold . Ваша конечная точка прав доступа возвращает следующие идентификаторы entitlementId :
    • example.com:bronze
    • example.com:silver
    • example.com:gold
  • Джон подписан на уровень Bronze . Ваша конечная точка прав возвращает следующий entitlementId :
    • example.com:bronze
  • В вашем канале Media Actions описаны следующие требования:
    • Для фильма А требуется example.com:bronze .
    • Для фильма B требуется example.com:silver .

В этом сценарии Google определяет следующие уровни доступа для Джейн и Джона:

  • У Джейн и Джона есть доступ к фильму А.
  • У Джейн есть доступ к фильму Б , а у Джона — нет.
{
  "actionAccessibilityRequirement": {
    "@type": "ActionAccessSpecification",
    "category": "subscription",
    "requiresSubscription": {
      "@type": "MediaSubscription",
      "@id": "http://www.example.com/basic_subscription",
      "name": "Bronze",
      "commonTier": true
      ...
    },
    "additionalProperty": {
      "@type": "PropertyValue",
      "name": "DisplaySubscriptionIdentifier",
      "value": "http://www.example.com/basic_subscription"
    },
    ...
  }
}

Дополнительная подписка

В модели подписки с дополнительными услугами поставщик услуг позволяет пользователям расширять свои права и добавлять каналы к базовой подписке. Пользователи могут добавлять любое количество каналов.

Рисунок 4. Модель подписки на дополнения и ее представление прав.

Рассмотрим следующий сценарий:

  • У Джейн есть подписки PRO и Sportz в дополнение к базовой . Ваша конечная точка прав доступа возвращает следующие идентификаторы entitlementId :
    • example.com:basic
    • example.com:pro
    • example.com:sportz
  • У Джона только базовая подписка. Ваша конечная точка прав возвращает следующий entitlementId :
    • example.com:basic
  • В вашем канале Media Actions описаны следующие требования:
    • Для фильма A требуется example.com:basic .
    • Для фильма B требуется example.com:pro .

В этом сценарии Google определяет следующие уровни доступа для Джейн и Джона:

  • У Джейн и Джона есть доступ к фильму А.
  • У Джейн есть доступ к фильму Б , а у Джона — нет.
{
  "actionAccessibilityRequirement": {
    "@type": "ActionAccessSpecification",
    "category": "subscription",
    "availabilityStarts": "2015-01-01T00:00Z",
    "availabilityEnds": "2015-12-31T00:00Z",
    "eligibleRegion": {
      "@type": "Country",
      "name": "US"
    }
    "requiresSubscription": [
      {
          "@type": "MediaSubscription",
          "@id": "https://www.example.com/package/basic",
          "name": "Basic",
          "sameAs": "https://www.example.com/package/basic",
          "commonTier": true
        },
        {
          "@type": "MediaSubscription",
          "@id": "https://www.example.com/packages/basic/pro",
          "name": "PRO",
          "sameAs": "https://www.example.com/package/pro",
          "identifier": "example.com:pro",
          "commonTier": false
        },
        {
          "@type": "MediaSubscription",
          "@id": "https://www.example.com/package/sportz",
          "name": "Sportz",
          "sameAs": "https://www.example.com/package/sports",
          "identifier": "example.com:sportz",
          "commonTier": false
        }
    ],
      "additionalProperty": {
        "@type": "PropertyValue",
        "name": "DisplaySubscriptionIdentifier",
        "value": "http://www.example.com/package/basic"
      },
    }
  }
}

Разовая покупка

Покупка

Контент доступен в течение неопределенного периода времени после покупки.


{
  "actionAccessibilityRequirement": {
    "@type": "ActionAccessSpecification",
    "category": "purchase",
    "availabilityStarts": "2015-01-01T00:00Z",
    "availabilityEnds": "2015-12-31T00:00Z",
    "eligibleRegion": {
      "@type": "Country",
      "name": "US"
    },
    "expectsAcceptanceOf": {
      "@type": "Offer",
      "price": 7.99,
      "priceCurrency": "USD",
      "seller": {
        "@type": "Organization",
        "name": "Example",
        "sameAs": "http://www.example.com/"
      }
    }
  }
}
  • Установить category для purchase .
  • Включите expectAcceptanceOf в actionAccessibilityRequirement , чтобы указать цену покупки.

Аренда

Контент доступен в течение ограниченного периода времени после покупки.


{
  "actionAccessibilityRequirement": {
    "@type": "ActionAccessSpecification",
    "category": "rental",
    "availabilityStarts": "2015-01-01T00:00Z",
    "availabilityEnds": "2015-12-31T00:00Z",
    "eligibleRegion": {
      "@type": "Country",
      "name": "US"
    },
    "expectsAcceptanceOf": {
      "@type": "Offer",
      "price": 7.99,
      "priceCurrency": "USD",
      "seller": {
        "@type": "Organization",
        "name": "Example",
        "sameAs": "http://www.example.com/"
      }
    }
  }
}
  • Установить category rental .
  • Включите expectAcceptanceOf в actionAccessibilityRequirement , чтобы указать стоимость аренды.

Прямой эфир

В ленте действий с медиа вы можете ограничить доступ к каналу или событию Live TV на основе следующих двух пользовательских условий:

  • Местоположение устройства пользователя

    Чтобы ограничить доступ к телеканалу, укажите зону, в которой пользователи имеют к нему доступ. Это условие обычно применяется к телеканалам местного вещания.

  • Статус учетной записи пользователя

    Если доступ к телеканалу зависит от настроек уровня учетной записи пользователя, используйте идентификаторы прав для обозначения ограничения.

    Это условие обычно применяется к следующим вариантам использования:

    • Пакет: Национальные каналы часто включены в пакеты, и пользователи сами выбирают, на какой пакет они хотят подписаться.
    • Дополнение: для некоторых премиум-каналов пользователям необходимо выборочно добавлять дополнительные каналы в свою подписку.
    • Региональная спортивная сеть (RSN): RSN обычно привязаны к «домашнему» местоположению пользователя. Пользователи могут смотреть контент RSN, даже находясь за пределами своего «домашнего» местоположения.

Сторонняя подписка

Сторонняя подписка

Контент доступен подписчикам другого сервиса.


{
  "actionAccessibilityRequirement": {
    "@type": "ActionAccessSpecification",
    "category": "externalsubscription"
    "availabilityStarts": "2015-01-01T00:00Z",
    "availabilityEnds": "2015-12-31T00:00Z",
    "requiresSubscription":{
      "@type": "MediaSubscription",
      "@id": "https://www.example.com/faq",
      "name": "Example",
      "sameAs": "https://www.example.com/faq",
      "authenticator": {
        "@type": "Organization",
        "name": "TVE"
      }
    },
    "additionalProperty": {
      "@type": "PropertyValue",
      "name": "DisplaySubscriptionIdentifier",
      "value": "http://www.example.com/faq"
     },
    "eligibleRegion": {
      "@type": "Country",
      "name": "US"
    }
  }
}
  • Добавьте authenticator , чтобы указать, что аутентификацию подписчиков осуществляет другой сервис. Например, для HBO GO требуется подписка от кабельного провайдера.

Пакеты общего уровня

Контент общего уровня доступен всем подписчикам независимо от их тарифного плана. Общий уровень применяется ко всему контенту, относящемуся к category subscription . Подробнее о свойствах category см. в разделе «Тип платного доступа» .

Зачем нужен пакет общего уровня?

Несколько продуктов Google предлагают пользователям рекомендации телепередач и фильмов, включая Google Поиск, Android TV и Google Ассистент. Чтобы сформировать ожидания пользователей относительно стоимости, Google должен понимать, какой контент доступен всем подписчикам в рамках общего тарифного плана. Google также должен понимать, какой контент доступен подписчикам с определенными пакетами подписки.

Если вы не поддерживаете API для управления правами доступа, Google рекомендует использовать книги, доступные на общем уровне. API позволяет Google определить, к каким книгам, не относящимся к общему уровню, может получить доступ каждый конкретный пользователь.

Когда следует создавать пакет общего уровня?

Пакет общего уровня необходим, если ваш сервис предлагает контент, доступный всем подписчикам. Это касается как сервисов с одним пакетом, так и сервисов с несколькими пакетами или дополнениями.

Провайдерам, у которых нет контента, доступного всем подписчикам, не нужно создавать общий пакет. Примером могут служить поставщики услуг, предоставляющие взаимоисключающий контент во всех своих пакетах.

Примеры общего уровня

Ниже приведены примеры общего уровня.

Многоуровневая подписка

В многоуровневой модели подписки поставщик услуг предлагает несколько уровней подписки, например, «Золотой» , «Серебряный» и «Бронзовый ». Пользователи с подпиской более высокого уровня имеют доступ ко всему контенту нижних уровней. Пользователи с подпиской более низкого уровня не имеют доступа к контенту верхнего уровня. На следующем изображении представлен пример структуры пакета.

Золотой уровень содержит весь контент Серебряного уровня, который, в свою очередь, содержит весь контент Бронзового уровня.
Рисунок 5. Многоуровневая структура пакета подписки.

В следующем примере кода пакет bronze представляет собой общий уровень, поскольку все пользователи имеют доступ ко всему контенту на этом уровне.

"requiresSubscription": [
    {
      "@type": "MediaSubscription",
      "@id": "https://www.example.com/package/bronze",
      "name": "Bronze",
      "sameAs": "https://www.example.com/package/bronze",
      "commonTier": true
    },
    {
      "@type": "MediaSubscription",
      "@id": "https://www.example.com/package/silver",
      "name": "Silver",
      "sameAs": "https://www.example.com/package/silver",
      "identifier": "example.com:silver",
      "commonTier": false
    },
    {
      "@type": "MediaSubscription",
      "@id": "https://www.example.com/package/gold",
      "name": "Gold",
      "sameAs": "https://www.example.com/package/gold",
      "identifier": "example.com:gold",
      "commonTier": false
    }
  ],

Дополнения

В модели подписки с дополнительными услугами поставщик услуг позволяет пользователям расширять свои права и добавлять каналы к базовой подписке. Пользователи могут добавлять любое количество каналов. На следующем изображении показан пример структуры пакета.

Каждый пользователь начинает с базового канала и может добавить любую комбинацию каналов PRO, Sportz и Moviemax.
Рисунок 6. Структура пакета подписки на дополнения.

Если у вас есть канал, доступный всем пользователям, и за него нет платы, вы можете объединить пакет с пакетом общего уровня.

В следующем примере кода базовый пакет представляет собой общий уровень, поскольку все пользователи имеют доступ ко всему содержимому этого пакета.

"requiresSubscription": [
    {
      "@type": "MediaSubscription",
      "@id": "https://www.example.com/package/basic",
      "name": "Basic",
      "sameAs": "https://www.example.com/package/basic",
      "commonTier": true
    },
    {
      "@type": "MediaSubscription",
      "@id": "https://www.example.com/packages/basic/pro",
      "name": "PRO",
      "sameAs": "https://www.example.com/package/pro",
      "identifier": "example.com:pro",
      "commonTier": false
    },
    {
      "@type": "MediaSubscription",
      "@id": "https://www.example.com/package/sportz",
      "name": "Sportz",
      "sameAs": "https://www.example.com/package/sports",
      "identifier": "example.com:sportz",
      "commonTier": false
    },
    {
      "@type": "MediaSubscription",
      "@id": "https://www.example.com/package/moviemax",
      "name": "Moviemax",
      "sameAs": "https://www.example.com/package/moviemax",
      "identifier": "example.com:moviemax",
      "commonTier": false
    }
  ],

Пакеты с контентом, который пересекается

В модели контента, где пакеты содержат пересекающийся контент, поставщик услуг продаёт пакеты, включающие в себя контент из других пакетов. На следующем изображении показан пример структуры пакета.

Диаграмма Венна, где перекрытие между пакетами 1, 2 и 3 обозначено как «Общий уровень».
Рисунок 7. Структура пакета с пересекающимся содержимым.

В следующем примере кода поставщик предлагает три пакета, часть контента которых пересекается во всех пакетах. В этом случае требуется четвёртый пакет, представляющий общий уровень. Он должен включать весь контент, доступный во всех трёх пакетах.

"requiresSubscription": [
    {
      "@type": "MediaSubscription",
      "@id": "https://www.example.com/package/1",
      "name": "Package 1",
      "sameAs": "https://www.example.com/package/1",
      "identifier": "example.com:package1",
      "commonTier": false
    },
    {
      "@type": "MediaSubscription",
      "@id": "https://www.example.com/package/2",
      "name": "Package 2",
      "sameAs": "https://www.example.com/package/2",
      "identifier": "example.com:package2",
      "commonTier": false
    },
    {
      "@type": "MediaSubscription",
      "@id": "https://www.example.com/package/3",
      "name": "Package 3",
      "sameAs": "https://www.example.com/package/3",
      "identifier": "example.com:package3",
      "commonTier": false
    },
    {
      "@type": "MediaSubscription",
      "@id": "https://www.example.com/package/common",
      "name": "Common Tier Package",
      "sameAs": "https://www.example.com/package/common",
      "commonTier": true
    }
  ],

Пакеты без пересекающегося содержимого

В модели контента, где все пакеты контента не пересекаются, поставщик услуг продаёт пакеты, не включающие контент из других пакетов. На следующем изображении показан пример структуры пакета.

Пакеты 1, 2 и 3 полностью отдельные.
Рисунок 8. Структура пакета без пересекающегося содержимого.

В следующем примере провайдер предлагает три пакета, контент которых не пересекается. Пакет общего уровня не требуется.

"requiresSubscription": [
    {
      "@type": "MediaSubscription",
      "@id": "https://www.example.com/package/1",
      "name": "Package 1",
      "sameAs": "https://www.example.com/package/1",
      "identifier": "example.com:package1",
      "commonTier": false
    },
    {
      "@type": "MediaSubscription",
      "@id": "https://www.example.com/package/2",
      "name": "Package 2",
      "sameAs": "https://www.example.com/package/2",
      "identifier": "example.com:package2",
      "commonTier": false
    },
    {
      "@type": "MediaSubscription",
      "@id": "https://www.example.com/package/3",
      "name": "Package 3",
      "sameAs": "https://www.example.com/package/3",
      "identifier": "example.com:package3",
      "commonTier": false
    }
  ],

Конечная точка прав

Используйте информацию из этого раздела для размещения конечной точки HTTPS, которая возвращает права, связанные с пользователем.

Предпосылки

Прежде чем начать, убедитесь, что ваш сервис поддерживает протокол OAuth 2.0 с Google.

Запрос

Чтобы получить права пользователя, Google отправляет запрос, содержащий его токен OAuth. Ваша конечная точка должна идентифицировать пользователя на основе этого токена OAuth. См. следующий пример:

GET /resource HTTP/1.1
Host: server.example.com
Authorization: Bearer <OAuthToken>

Ответ

Ваша конечная точка должна возвращать ответ со следующими свойствами:

Свойство
subscription

Необходимый

Это поле внутри корневого ответа.

subscription.type

Необходимый

Это свойство может иметь следующие значения:

  • ActiveSubscription : у пользователя есть активная подписка на провайдера.
  • ActiveTrial : у пользователя имеется активная пробная версия провайдера.
  • InactiveSubscription : у пользователя нет активной подписки или активного пробного периода.
subscription.expiration_date

Необязательный

Дата истечения срока действия данного разрешения в формате ISO 8601 , включая часовой пояс. Подробнее см. в разделе Сроки действия .

entitlements

Необязательный

Это корневое свойство содержит значения entitlementId , имеющиеся у пользователя.

entitlements.entitlement

Требуется , если доступ к вашему каталогу потокового вещания зависит от типа подписки.

Это свойство содержит entitlementId . Подробнее см. в разделе Идентификатор права .

entitlements.expiration_date

Необязательный

Дата истечения срока действия подписки в формате ISO 8601 , включая часовой пояс. Подробнее см. в разделе Сроки действия .

Сроки годности

В ответе конечной точки есть два свойства, которые относятся к датам истечения срока действия: subscription.expiration_date и entitlements.expiration_date . Вы можете включить одно из них или ни одного, но не оба одновременно. Выбор зависит от вашей модели подписки.

Модель подписки
Доступ к вашему каталогу потокового вещания одинаков для всех подписчиков. Поскольку вам не нужно указывать свойство entitlements , укажите subscription.expiration_date .

Доступ к каталогу потокового вещания зависит от деталей подписки пользователя.

Если ваша модель подписки имеет несколько уровней или дополнений, срок действия которых истекает, выполните одно из следующих действий:

  • Если все значения entitlements.entitlement истекают одновременно, укажите subscription.expiration_date .
  • Если некоторые значения entitlements.entitlement истекают в разное время, укажите entitlements.expiration_date .

Примеры ответов

Ниже приведены примеры ответов для различных состояний подписки:

  • Активная подписка
  • Активная подписка с датой истечения срока действия
  • Нет подписки
  • Активные подписки на несколько уровней или дополнений

Активная подписка

Активная подписка

У пользователя есть активная подписка на example.com . В этом случае все подписчики имеют доступ ко всему каталогу вашего потокового контента независимо от типа подписки.


{
  "subscription" : {
    "type": "ActiveSubscription",
  }
}

Активная подписка с датой истечения срока действия

Активная подписка с датой истечения срока действия

У пользователя есть активная подписка на example.com , и у подписки есть срок действия. В этом случае все подписчики получают доступ ко всему каталогу вашего стриминга, независимо от типа подписки.


{
  "subscription" : {
    "type": "ActiveSubscription",
    "expiration_date": "2019-11-10T10:00:00Z"
  }
}

Нет подписки

Нет подписки

У пользователя нет подписки на example.com .


{
  "subscription" : {
    "type": "InactiveSubscription"
  }
}

Активные подписки на несколько уровней или дополнений

Активные подписки на несколько уровней или дополнений

У пользователя имеется подписка на example.com:premium до определенной даты.


{
  "subscription" : {
    "type": "ActiveSubscription",
  }
  "entitlements": [
    {
      "entitlement": "example.com:premium",
      "expiration": "2019-11-10T10:00:00Z"
    }
  ]
}

Ограничение скорости

Google обновляет информацию о правах пользователя каждые шесть часов. Чтобы сгладить максимальное количество запросов в секунду (QPS), Google равномерно распределяет запросы к вашей конечной точке. Таким образом, вы можете оценить ожидаемое среднее значение QPS для вашей конечной точки по следующей формуле:

Ожидаемое среднее значение QPS = <общее количество пользователей> / 21 600 секунд (6 часов x 60 минут x 60 секунд)

Если вы обслуживаете большое количество пользователей, Google может скорректировать 6-часовой интервал. При необходимости свяжитесь с Google, чтобы обсудить настройку.

Связаться с Google

Когда ваша конечная точка будет готова, свяжитесь с Google, чтобы сообщить URL-адрес конечной точки.

Свойства спецификации доступа к действию

Справочную информацию см. в разделе свойств спецификации доступа к действию .