<?xml version="1.0" encoding="UTF-8"?>
<xs:schema version="0.2" xmlns="http://www.metalinker.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.metalinker.org/" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="metalink" type="metalinkType"/>
    <xs:complexType name="filesType">
        <xs:sequence>
            <xs:element name="file" type="fileType" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="metalinkType">
        <xs:all>
            <xs:element minOccurs="0" name="description" type="xs:string"/>
            <xs:element minOccurs="0" name="identity" type="xs:string"/>
            <xs:element minOccurs="0" name="license" type="licenseType"/>
            <xs:element minOccurs="0" name="publisher" type="publisherType"/>
            <xs:element minOccurs="0" name="releasedate" type="RFC822DateTime"/>
            <xs:element minOccurs="0" name="tags" type="xs:string"/>
            <xs:element minOccurs="0" name="version" type="xs:string"/>
            <xs:element name="files" type="filesType"/>
        </xs:all>
        <xs:attribute name="version" type="xs:string" default="3.0"/>
        <xs:attribute name="origin" type="xs:anyURI"/>
        <xs:attribute name="type" default="static">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="dynamic"/>
                    <xs:enumeration value="static"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="pubdate" type="RFC822DateTime"/>
        <xs:attribute name="refreshdate" type="RFC822DateTime"/>
        <xs:attribute name="generator" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="fileType">
        <xs:all>
            <xs:element minOccurs="0" name="changelog" type="xs:string"/>
            <xs:element minOccurs="0" name="copyright" type="xs:string"/>
            <xs:element minOccurs="0" name="description" type="xs:string"/>
            <xs:element minOccurs="0" name="identity" type="xs:string"/>
            <xs:element minOccurs="0" name="language" type="xs:language"/>
            <xs:element minOccurs="0" name="license" type="licenseType"/>
            <xs:element minOccurs="0" name="logo" type="xs:string"/>
            <xs:element minOccurs="0" name="mimetype" type="xs:string"/>
            <xs:element minOccurs="0" name="multimedia" type="multimediaType"/>
            <xs:element minOccurs="0" name="os" type="xs:string"/>
            <xs:element minOccurs="0" name="publisher" type="publisherType"/>
            <xs:element minOccurs="0" name="relations" type="xs:string"/>
            <xs:element minOccurs="0" name="releasedate" type="RFC822DateTime"/>
            <xs:element name="resources" type="resourcesType"/>
            <xs:element minOccurs="0" name="size" type="xs:nonNegativeInteger"/>
            <xs:element minOccurs="0" name="screenshot" type="xs:string"/>
            <xs:element minOccurs="0" name="tags" type="xs:string"/>
            <xs:element minOccurs="0" name="upgrade" type="xs:string"/>
            <xs:element minOccurs="0" name="verification">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="hash" minOccurs="0" maxOccurs="unbounded">
                            <xs:complexType>
                                <xs:simpleContent>
                                    <xs:extension base="xs:string">
                                        <xs:attribute name="type" type="hashType" default="sha1"/>
                                    </xs:extension>
                                </xs:simpleContent>
                            </xs:complexType>
                        </xs:element>
                        <xs:element name="signature" minOccurs="0" maxOccurs="unbounded">
                            <xs:complexType>
                                <xs:simpleContent>
                                    <xs:extension base="xs:string">
                                        <xs:attribute name="type" default="PGP" type="xs:string"/>
                                        <xs:attribute name="file" type="xs:string"/>
                                    </xs:extension>
                                </xs:simpleContent>
                            </xs:complexType>
                        </xs:element>
                        <xs:element name="pieces" minOccurs="0">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="hash" maxOccurs="unbounded">
                                        <xs:complexType>
                                            <xs:simpleContent>
                                                <xs:extension base="xs:string">
                                                    <xs:attribute name="piece">
                                                        <xs:simpleType>
                                                            <xs:restriction base="xs:integer">
                                                                <xs:minInclusive value="0"/>
                                                            </xs:restriction>
                                                        </xs:simpleType>
                                                    </xs:attribute>
                                                </xs:extension>
                                            </xs:simpleContent>
                                        </xs:complexType>
                                    </xs:element>
                                </xs:sequence>
                                <xs:attribute name="length" type="xs:nonNegativeInteger"/>
                                <xs:attribute name="type" type="hashType"/>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element minOccurs="0" name="version" type="xs:string"/>
        </xs:all>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="resourcesType">
        <xs:sequence>
            <xs:element name="url" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="xs:string">
                            <xs:attribute name="type" default="http">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:enumeration value="ftp"/>

                                        <xs:enumeration value="ftps"/>
                                        <xs:enumeration value="http"/>

                                        <xs:enumeration value="https"/>
                                        <xs:enumeration value="rsync"/>
                                        <xs:enumeration value="bittorrent"/>
                                        <xs:enumeration value="magnet"/>
                                        <xs:enumeration value="ed2k"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:attribute>
                            <xs:attribute name="location">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:maxLength value="2"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:attribute>
                            <xs:attribute name="preference" type="xs:nonNegativeInteger"/>
                            <xs:attribute name="maxconnections" type="xs:positiveInteger"/>
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="maxconnections" type="xs:positiveInteger"/>
    </xs:complexType>
    <xs:complexType name="licenseType">
        <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="url" type="xs:string" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="publisherType">
        <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="url" type="xs:string" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="audioType">
        <xs:sequence>
            <xs:element minOccurs="0" name="bitrate" type="xs:string"/>
            <xs:element minOccurs="0" name="codec" type="xs:string"/>
            <xs:element minOccurs="0" name="duration" type="xs:string"/>
            <xs:element minOccurs="0" name="resolution" type="xs:string"/>
            <xs:element minOccurs="0" name="artist" type="xs:string"/>
            <xs:element minOccurs="0" name="album" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="videoType">
        <xs:sequence>
            <xs:element minOccurs="0" name="bitrate" type="xs:string"/>
            <xs:element minOccurs="0" name="codec" type="xs:string"/>
            <xs:element minOccurs="0" name="duration" type="xs:string"/>
            <xs:element minOccurs="0" name="resolution" type="xs:string"/>
            <xs:element minOccurs="0" name="artist" type="xs:string"/>
            <xs:element minOccurs="0" name="album" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="multimediaType">
        <xs:sequence>
            <xs:element name="audio" type="audioType" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="video" type="videoType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:simpleType name="RFC822DateTime">
        <xs:annotation>
            <xs:documentation>Date and time formatted according to the RFC822, Section 5.
        Using the regex definition of RFC822 date by Sam Ruby at
        http://www.intertwingly.net/blog/1360.html.</xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="(((Mon)|(Tue)|(Wed)|(Thu)|(Fri)|(Sat)|(Sun)), *)?\d\d? +((Jan)|(Feb)|(Mar)|(Apr)|(May)|(Jun)|(Jul)|(Aug)|(Sep)|(Oct)|(Nov)|(Dec)) +\d\d(\d\d)? +\d\d:\d\d(:\d\d)? +(([+\-]?\d\d\d\d)|(UT)|(GMT)|(EST)|(EDT)|(CST)|(CDT)|(MST)|(MDT)|(PST)|(PDT)|\w)"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="hashType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="ed2k"/>
            <xs:enumeration value="md4"/>
            <xs:enumeration value="md5"/>
            <xs:enumeration value="sha1"/>
            <xs:enumeration value="sha256"/>
            <xs:enumeration value="sha384"/>
            <xs:enumeration value="sha512"/>
            <xs:enumeration value="rmd160"/>
            <xs:enumeration value="tiger"/>
            <xs:enumeration value="crc32"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>
