<?xml version="1.0" encoding="UTF-8"?>
<!--
  MEGOGO catalog feed (all_mgg.xml and related files). XML Schema 1.1.

  This schema describes the part of the feed that the MEGOGO Partner
  Integration Guide documents. The schema accepts other elements and
  attributes and does not validate them (open content). Ignore elements and
  attributes that this schema does not declare.

  Validate with an XSD 1.1 processor, for example Python "xmlschema":
    xmlschema.XMLSchema11("megogo-catalog-feed.xsd").validate("all_mgg.xml")
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
           vc:minVersion="1.1"
           elementFormDefault="unqualified">

  <!-- ===== Simple types ===== -->

  <xs:simpleType name="Flag">
    <xs:annotation><xs:documentation>1 = yes, 0 = no.</xs:documentation></xs:annotation>
    <xs:restriction base="xs:string">
      <xs:enumeration value="0"/>
      <xs:enumeration value="1"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="BooleanText">
    <xs:restriction base="xs:string">
      <xs:enumeration value="true"/>
      <xs:enumeration value="false"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="ObjectId">
    <xs:restriction base="xs:string"><xs:pattern value="[0-9]+"/></xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="OptionalInteger">
    <xs:annotation><xs:documentation>Integer or empty.</xs:documentation></xs:annotation>
    <xs:restriction base="xs:string"><xs:pattern value="([0-9]+)?"/></xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="OptionalRating">
    <xs:annotation><xs:documentation>Decimal number or empty. 0 means "no rating".</xs:documentation></xs:annotation>
    <xs:restriction base="xs:string"><xs:pattern value="([0-9]+(\.[0-9]+)?)?"/></xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="VodType">
    <xs:annotation><xs:documentation>
      Delivery rule. svod = subscription. tvod = rent for a limited time.
      dto = purchase without time limit. fvod, advod = free in MEGOGO
      applications. In a partner application, svod, fvod and advod objects
      are part of the partner subscription. The partner controls access.
    </xs:documentation></xs:annotation>
    <xs:restriction base="xs:string">
      <xs:enumeration value="svod"/>
      <xs:enumeration value="tvod"/>
      <xs:enumeration value="dto"/>
      <xs:enumeration value="fvod"/>
      <xs:enumeration value="advod"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="Quality">
    <xs:annotation><xs:documentation>Known values: SD, HD, Full HD, UHD. New values can occur.</xs:documentation></xs:annotation>
    <xs:restriction base="xs:string"><xs:minLength value="1"/></xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="PriceQuality">
    <xs:annotation><xs:documentation>Maximum quality for this price. TVOD and DTO only.</xs:documentation></xs:annotation>
    <xs:restriction base="xs:string">
      <xs:enumeration value="SD"/>
      <xs:enumeration value="HD"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="Protection">
    <xs:annotation><xs:documentation>
      0 = no DRM. Any other value = the object has DRM.
      PMF = PlayReady, Modular (Widevine), FairPlay.
      A, W, AW = legacy values from version 3 of the FAQ (not seen in 2026 feeds).
    </xs:documentation></xs:annotation>
    <xs:restriction base="xs:string">
      <xs:enumeration value="0"/>
      <xs:enumeration value="PMF"/>
      <xs:enumeration value="A"/>
      <xs:enumeration value="W"/>
      <xs:enumeration value="AW"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="Currency">
    <xs:annotation><xs:documentation>ISO 4217 code in lower case, for example azn.</xs:documentation></xs:annotation>
    <xs:restriction base="xs:string"><xs:pattern value="[A-Za-z]{3}"/></xs:restriction>
  </xs:simpleType>

  <!-- ===== Complex types ===== -->

  <xs:complexType name="Qualities">
    <xs:sequence>
      <xs:element name="quality" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:attribute name="value" type="Quality" use="required"/>
          <xs:attribute name="hdr" type="BooleanText"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="IdName">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="id" type="ObjectId" use="required"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="Poster">
    <xs:annotation><xs:documentation>Image URLs. Only url and thumbnail are always present.</xs:documentation></xs:annotation>
    <xs:attribute name="url" type="xs:anyURI" use="required"/>
    <xs:attribute name="thumbnail" type="xs:anyURI" use="required"/>
    <xs:attribute name="small" type="xs:anyURI"/>
    <xs:attribute name="big" type="xs:anyURI"/>
    <xs:attribute name="fullscreen" type="xs:anyURI"/>
    <xs:attribute name="original" type="xs:anyURI"/>
    <xs:attribute name="original_wide" type="xs:anyURI"/>
    <xs:attribute name="type215x120" type="xs:anyURI"/>
    <xs:attribute name="type470x270" type="xs:anyURI"/>
    <xs:anyAttribute processContents="skip"/>
  </xs:complexType>

  <xs:complexType name="Trailer">
    <xs:annotation><xs:documentation>
      A trailer. Play it with the Content API: GET /stream?video_id={trailer id}.
      The child element iframe (embed player) is not documented.
    </xs:documentation></xs:annotation>
    <xs:sequence>
      <xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="id" type="ObjectId" use="required"/>
    <xs:attribute name="title" type="xs:string"/>
    <xs:attribute name="duration_sec" type="OptionalInteger"/>
    <xs:attribute name="age_limit" type="OptionalInteger"/>
    <xs:attribute name="priority" type="OptionalInteger"/>
  </xs:complexType>

  <xs:complexType name="Price">
    <xs:attribute name="price" type="xs:decimal" use="required"/>
    <xs:attribute name="currency" type="Currency" use="required"/>
    <xs:attribute name="tariff_id" type="ObjectId" use="required"/>
    <xs:attribute name="service_id" type="ObjectId" use="required"/>
    <xs:attribute name="watch_period" type="xs:nonNegativeInteger" use="required"/>
    <xs:attribute name="service_name" type="xs:string"/>
    <xs:attribute name="quality" type="PriceQuality"/>
  </xs:complexType>

  <xs:complexType name="Distributions">
    <xs:sequence>
      <xs:element name="distribution" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="price" type="Price" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
          <xs:attribute name="vod_type" type="VodType" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="AudioList">
    <xs:sequence>
      <xs:element name="audio_lang" minOccurs="0" maxOccurs="unbounded">
        <xs:annotation><xs:documentation>
          Text = track name (feed language). index = the same value as
          audio_tracks[].index in the Content API /stream response.
        </xs:documentation></xs:annotation>
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute name="index" type="xs:nonNegativeInteger" use="required"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Subtitles">
    <xs:sequence>
      <xs:element name="subtitle_lang" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Seria">
    <xs:all>
      <xs:element name="qualities" type="Qualities" minOccurs="0"/>
      <xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
    </xs:all>
    <xs:attribute name="id" type="ObjectId" use="required"/>
    <xs:attribute name="index" type="xs:nonNegativeInteger" use="required"/>
    <xs:attribute name="title" type="xs:string" use="required"/>
    <xs:attribute name="poster" type="xs:anyURI"/>
    <xs:attribute name="duration_sec" type="OptionalInteger"/>
  </xs:complexType>

  <xs:complexType name="Season">
    <xs:sequence>
      <xs:element name="seria" type="Seria" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="id" type="ObjectId" use="required"/>
    <xs:attribute name="title" type="xs:string" use="required"/>
  </xs:complexType>

  <xs:complexType name="Object">
    <xs:all>
      <xs:element name="qualities" type="Qualities"/>
      <xs:element name="info">
        <xs:complexType>
          <xs:attribute name="year" type="OptionalInteger"/>
          <xs:attribute name="country" type="xs:string"/>
          <xs:attribute name="duration" type="xs:string"/>
          <xs:anyAttribute processContents="skip"/>
        </xs:complexType>
      </xs:element>
      <xs:element name="like" type="xs:nonNegativeInteger" minOccurs="0"/>
      <xs:element name="dislike" type="xs:nonNegativeInteger" minOccurs="0"/>
      <xs:element name="comments_num" type="xs:nonNegativeInteger" minOccurs="0"/>
      <xs:element name="categories" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="category" type="IdName" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="actors" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="actor" type="IdName" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="directors" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="director" type="IdName" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="finger_language" type="Flag" minOccurs="0"/>
      <xs:element name="audio_description" type="Flag" minOccurs="0"/>
      <xs:element name="ratings" minOccurs="0">
        <xs:complexType>
          <xs:attribute name="imdb" type="OptionalRating"/>
          <xs:attribute name="imdb_id" type="xs:string"/>
          <xs:attribute name="megogo" type="OptionalRating"/>
          <xs:anyAttribute processContents="skip"/>
        </xs:complexType>
      </xs:element>
      <xs:element name="story" type="xs:string"/>
      <xs:element name="poster" type="Poster"/>
      <xs:element name="trailer" type="Trailer" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="ios_allowed" type="Flag"/>
      <xs:element name="smart_tv_allowed" type="Flag"/>
      <xs:element name="web_allowed" type="Flag" minOccurs="0"/>
      <xs:element name="closing_date" type="xs:dateTime"/>
      <xs:element name="contract_id" type="ObjectId" minOccurs="0"/>
      <xs:element name="age_limit" type="OptionalInteger" minOccurs="0"/>
      <xs:element name="protection" type="Protection"/>
      <xs:element name="duration_sec" type="OptionalInteger"/>
      <xs:element name="distributions" type="Distributions"/>
      <xs:element name="audio_list" type="AudioList" minOccurs="0"/>
      <xs:element name="subtitles" type="Subtitles" minOccurs="0"/>
      <xs:element name="gallery-image" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:attribute name="url" type="xs:anyURI" use="required"/>
          <xs:anyAttribute processContents="skip"/>
        </xs:complexType>
      </xs:element>
      <xs:element name="season" type="Season" minOccurs="0" maxOccurs="unbounded"/>
      <!-- Not documented: embed_allowed, iframe and other elements. -->
      <xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
    </xs:all>
    <xs:attribute name="id" type="ObjectId" use="required"/>
    <xs:attribute name="title" type="xs:string" use="required"/>
    <xs:attribute name="title_en" type="xs:string"/>
    <xs:attribute name="categories" type="xs:string" use="required"/>
    <xs:attribute name="genres" type="xs:string" use="required"/>
    <xs:attribute name="serial" type="BooleanText" use="required"/>
    <xs:attribute name="type" type="xs:string" use="required"/>
    <xs:attribute name="vod" type="VodType" use="required"/>
    <xs:attribute name="page" type="xs:anyURI"/>
    <!-- Not documented: kinopoisk_id and other attributes. -->
    <xs:anyAttribute processContents="skip"/>
  </xs:complexType>

  <!-- ===== Root ===== -->

  <xs:element name="objects">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="object" type="Object" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
    <xs:unique name="uniqueObjectId">
      <xs:selector xpath="object"/>
      <xs:field xpath="@id"/>
    </xs:unique>
  </xs:element>

</xs:schema>
