The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use warnings;
use strict;

use Test::More tests => 5;
use Test::Deep;
use XML::FeedPP;
use XML::FeedPP::MediaRSS;

sub spec_ok {
    my ($xml, $expected, $note) = @_;
    my $feed  = XML::FeedPP->new($xml, -type => 'string', use_ixhash => 1);
    my $media = XML::FeedPP::MediaRSS->new($feed);
    my @got   = map { $media->for_item($_) } ($feed->get_item);
    cmp_deeply(\@got, noclass($expected), $note);
}

{
    my $xml = <<'XML';
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/"
xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule">
<channel>
<title>My Movie Review Site</title>
<link>http://www.foo.com</link>
<description>I review movies.</description>
    <item>
        <title>Movie Title: Is this a good movie?</title>
        <link>http://www.foo.com/item1.htm</link>
        <media:content url="http://www.foo.com/trailer.mov" 
        fileSize="12216320" type="video/quicktime" expression="sample"/>
        <creativeCommons:license>
        http://www.creativecommons.org/licenses/by-nc/1.0
        </creativeCommons:license>
        <media:rating>nonadult</media:rating>
    </item>
</channel>
</rss>
XML
    my $expected = [
        {
            url        => 'http://www.foo.com/trailer.mov',
            fileSize   => 12216320,
            type       => 'video/quicktime',
            expression => 'sample',
            rating     => {
                simple => 'nonadult',
            },
        }
    ];
    spec_ok(
        $xml, $expected, 
        'A movie review with a trailer, using a Creative Commons license.'
    );
}

{
    my $xml = <<'XML';
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/"
xmlns:dcterms="http://purl.org/dc/terms/">
<channel>
<title>Music Videos 101</title>
<link>http://www.foo.com</link>
<description>Discussions of great videos</description>
    <item>
        <title>The latest video from an artist</title>
        <link>http://www.foo.com/item1.htm</link>
        <media:content url="http://www.foo.com/movie.mov" fileSize="12216320" 
        type="video/quicktime" expression="full">
        <media:player url="http://www.foo.com/player?id=1111" 
        height="200" width="400"/>
        <media:hash algo="md5">dfdec888b72151965a34b4b59031290a</media:hash>
        <media:credit role="producer">producer's name</media:credit>
        <media:credit role="artist">artist's name</media:credit>
        <media:category scheme="http://blah.com/scheme">music/artist 
        name/album/song</media:category>
        <media:text type="plain">
        Oh, say, can you see, by the dawn's early light
        </media:text>
        <media:rating>nonadult</media:rating>
        <dcterms:valid>
            start=2002-10-13T09:00+01:00;
            end=2002-10-17T17:00+01:00;
            scheme=W3C-DTF
        </dcterms:valid>
        </media:content>
    </item>
</channel>
</rss>
XML
    my $expected = [
        {
            category => {
                'http://blah.com/scheme' => 
                    re(qr{music/\s*artist\s*name/\s*album/\s*song})
            },
            credit => {
                'urn:ebu' => {
                    artist   => [q"artist's name"],
                    producer => [q"producer's name"]
                }
            },
            expression => 'full',
            fileSize => 12216320,
            hash => {
                algorithm => 'md5',
                checksum  => 'dfdec888b72151965a34b4b59031290a'
            },
            player => {
                url    => 'http://www.foo.com/player?id=1111',
                width  => 400,
                height => 200,
            },
            rating => {
                simple => 'nonadult'
            },
            text => {
                text => re(
                    qr"^\s*Oh, say, can you see, by the dawn's early light\s*$",
                ),
                type => 'plain'
            },
            type => 'video/quicktime',
            url => 'http://www.foo.com/movie.mov'
        }
    ];
    spec_ok($xml, $expected, 'A music video with a link to a player window, and additional metadata about the video, including expiration date.');
}

{
    my $xml = <<'XML';
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
<channel>
<title>Song Site</title>
<link>http://www.foo.com</link>
<description>Discussion on different songs</description>
    <item>
        <title>These songs make me think about blah</title>
        <link>http://www.foo.com/item1.htm</link>
        <media:content url="http://www.foo.com/band1-song1.mp3" 
        fileSize="1000" type="audio/mpeg" expression="full">
        <media:credit role="musician">member of band1</media:credit>
        <media:category>music/band1/album/song</media:category>
        <media:rating>nonadult</media:rating>
        </media:content>
        <media:content url="http://www.foo.com/band2-song1.mp3" 
        fileSize="2000" type="audio/mpeg" expression="full">
        <media:credit role="musician">member of band2</media:credit>
        <media:category>music/band2/album/song</media:category>
        <media:rating>nonadult</media:rating>
        </media:content>
        <media:content url="http://www.foo.com/band3-song1.mp3" 
        fileSize="1500" type="audio/mpeg" expression="full">
        <media:credit role="musician">member of band3</media:credit>
        <media:category>music/band3/album/song</media:category>
        <media:rating>nonadult</media:rating>
        </media:content>
    </item>
</channel>
</rss>
XML
    my $expected = [
        {
            category => {
                'none' => 'music/band1/album/song'
            },
            credit => {
                'urn:ebu' => {
                    musician => [
                        'member of band1'
                    ]
                }
            },
            expression => 'full',
            fileSize => 1000,
            rating => {
                simple => 'nonadult'
            },
            type => 'audio/mpeg',
            url => 'http://www.foo.com/band1-song1.mp3'
        },
        {
            category => {
                'none' => 'music/band2/album/song'
            },
            credit => {
                'urn:ebu' => {
                    musician => [
                        'member of band2'
                    ]
                }
            },
            expression => 'full',
            fileSize => 2000,
            rating => {
                simple => 'nonadult'
            },
            type => 'audio/mpeg',
            url => 'http://www.foo.com/band2-song1.mp3'
        },
        {
            category => {
                'none' => 'music/band3/album/song'
            },
            credit => {
                'urn:ebu' => {
                    musician => [
                        'member of band3'
                    ]
                }
            },
            expression => 'full',
            fileSize => 1500,
            rating => {
                simple => 'nonadult'
            },
            type => 'audio/mpeg',
            url => 'http://www.foo.com/band3-song1.mp3'
        },
    ];
    spec_ok($xml, $expected, 
        'Several different songs that relate to the same topic.');
}

{
    my $xml = <<'XML';

<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
<channel>
<title>Song Site</title>
<link>http://www.foo.com</link>
<description>Songs galore at different bitrates</description>
    <item>
        <title>Cool song by an artist</title>
        <link>http://www.foo.com/item1.htm</link>
        <media:group>
            <media:content url="http://www.foo.com/song64kbps.mp3" 
            fileSize="1000" bitrate="64" type="audio/mpeg" 
            isDefault="true" expression="full"/>
            <media:content url="http://www.foo.com/song128kbps.mp3" 
            fileSize="2000" bitrate="128" type="audio/mpeg" 
            expression="full"/>
            <media:content url="http://www.foo.com/song256kbps.mp3" 
            fileSize="4000" bitrate="256" type="audio/mpeg" 
            expression="full"/>
            <media:content url="http://www.foo.com/song512kbps.mp3.torrent" 
            fileSize="8000" type="application/x-bittorrent;enclosed=audio/mpeg" 
            expression="full"/>
            <media:content url="http://www.foo.com/song.wav" 
            fileSize="16000" type="audio/x-wav" expression="full"/>
            <media:credit role="musician">band member 1</media:credit>
            <media:credit role="musician">band member 2</media:credit>
            <media:category>music/artist name/album/song</media:category>
            <media:rating>nonadult</media:rating>
        </media:group>
    </item>
</channel>
</rss>
XML
    my $expected = [
        {
            url        => 'http://www.foo.com/song64kbps.mp3',
            fileSize   => 1000,
            bitrate    => 64,
            type       => 'audio/mpeg',
            expression => 'full',
            isDefault  => 1,
            credit     => {
                'urn:ebu' => {
                    musician => [
                        'band member 1',
                        'band member 2',
                    ]
                }
            },
            category => {
                'none' => 'music/artist name/album/song',
            },
            rating => {
                simple => 'nonadult',
            },
        },
        {
            url        => 'http://www.foo.com/song128kbps.mp3',
            fileSize   => 2000,
            bitrate    => 128,
            type       => 'audio/mpeg',
            expression => 'full',
            credit    => {
                'urn:ebu' => {
                    musician => [
                        'band member 1',
                        'band member 2',
                    ]
                }
            },
            category => {
                'none' => 'music/artist name/album/song',
            },
            rating => {
                simple => 'nonadult',
            },
        },
        {
            url        => 'http://www.foo.com/song256kbps.mp3',
            fileSize   => 4000,
            bitrate    => 256,
            type       => 'audio/mpeg',
            expression => 'full',
            credit    => {
                'urn:ebu' => {
                    musician => [
                        'band member 1',
                        'band member 2',
                    ]
                }
            },
            category => {
                'none' => 'music/artist name/album/song',
            },
            rating => {
                simple => 'nonadult',
            },
        },
        {
            url        => 'http://www.foo.com/song512kbps.mp3.torrent',
            fileSize   => 8000,
            type       => 'application/x-bittorrent;enclosed=audio/mpeg',
            expression => 'full',
            credit    => {
                'urn:ebu' => {
                    musician => [
                        'band member 1',
                        'band member 2',
                    ]
                }
            },
            category => {
                'none' => 'music/artist name/album/song',
            },
            rating => {
                simple => 'nonadult',
            },
        },
        {
            url        => 'http://www.foo.com/song.wav',
            fileSize   => 16000,
            type       => 'audio/x-wav',
            expression => 'full',
            credit    => {
                'urn:ebu' => {
                    musician => [
                        'band member 1',
                        'band member 2',
                    ]
                }
            },
            category => {
                'none' => 'music/artist name/album/song',
            },
            rating => {
                simple => 'nonadult',
            },
        }
    ];
    spec_ok($xml, $expected, 'Same song with multiple files at different bitrates and encodings.  (Bittorrent example as well)');
}

{
    my $xml = <<'XML';
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
<channel>
<title>Song Site</title>
<description>mRSS example with new fields added in v1.5.0</description>

	<item>
                <link>http://www.foo.com</link>
                <pubDate>Mon, 27 Aug 2001 16:08:56 PST</pubDate>
                <media:content url="http://www.foo.com/video.mov" fileSize="2000" bitrate="128" type="video/quicktime" expression="full"/>
                <media:community>
                    <media:starRating average="3.5" count="20" min="1" max="10"/>
                    <media:statistics views="5" favorites="5"/>
                    <media:tags>news: 5, abc:3</media:tags>
                </media:community>
                <media:comments>
                    <media:comment>comment1</media:comment>
                    <media:comment>comment2</media:comment>
                </media:comments>
                <media:embed url="http://www.foo.com/player.swf" width="512" height="323" >
                    <media:param name="type">application/x-shockwave-flash</media:param>
                    <media:param name="width">512</media:param>
                    <media:param name="height">323</media:param>
                    <media:param name="allowFullScreen">true</media:param>
                    <media:param name="flashVars">id=12345&vid=678912i&lang=en-us&intl=us&thumbUrl=http://www.foo.com/thumbnail.jpg</media:param>
                </media:embed>
                <media:responses>
                  <media:response>www.response1.com</media:response>
                  <media:response>www.response2.com</media:response>
                </media:responses>
                <media:backLinks>
                  <media:backLink>www.backLink1.com</media:backLink>
                  <media:backLink>www.backLink2.com</media:backLink>
                </media:backLinks>
                <media:status state="active"/>
                <media:price type="rent" price="19.99" currency="EUR" />
                <media:license type="text/html" href="http://www.licensehost.com/license"> Sample license for a video </media:license>
                <media:subTitle type="application/smil" lang="en-us"  href="http://www.foo.org/subtitle.smil"  />
                <media:peerLink type="application/x-bittorrent " href="http://www.foo.org/sampleFile.torrent"  />
                <media:location description="My house" start="00:01" end="01:00">
                   <georss:where>
                       <gml:Point>
                         <gml:pos>35.669998 139.770004</gml:pos>
                       </gml:Point>
                   </georss:where>
                </media:location>
                <media:restriction type="sharing" relationship="deny" />
                <media:scenes>
                    <media:scene>
                        <sceneTitle>sceneTitle1</sceneTitle>
                        <sceneDescription>sceneDesc1</sceneDescription>
                        <sceneStartTime>00:15</sceneStartTime>
                        <sceneEndTime>00:45</sceneEndTime>
                    </media:scene>
                </media:scenes>
    </item>
</channel>
</rss>
XML
    my $expected = [
        {
            url        => 'http://www.foo.com/video.mov',
            fileSize   => 2000,
            bitrate    => 128,
            type       => 'video/quicktime',
            expression => 'full',
            community  => {
                starRating => {
                    average => 3.5,
                    count   => 20,
                    min     => 1,
                    max     => 10,
                },
                statistics => {
                    views     => 5,
                    favorites => 5,
                },
                tags => {
                    news => 5,
                    abc  => 3,
                }
            },
            comments => [
                'comment1',
                'comment2',
            ],
            embed => {
                type            => 'application/x-shockwave-flash',
                width           => 512,
                height          => 323,
                allowFullScreen => 'true',
                flashVars       => 'id=12345&vid=678912i&lang=en-us&intl=us&thumbUrl=http://www.foo.com/thumbnail.jpg',
            },
            responses => [
                'www.response1.com',
                'www.response2.com',
            ],
            backLinks => [
                'www.backLink1.com',
                'www.backLink2.com',
            ],
            status => { state => 'active' },
            price => [
                { price => 19.99, type => 'rent', currency => 'EUR' }
            ],
            license => {
                type => 'text/html',
                href => 'http://www.licensehost.com/license',
                name => ' Sample license for a video ',
            },
            subTitle => {
                'en-us' => {
                    type => 'application/smil',
                    href => 'http://www.foo.org/subtitle.smil',
                }
            },
            peerLink => {
                type => 'application/x-bittorrent ',
                href => 'http://www.foo.org/sampleFile.torrent',
            },
            restriction => {
                allow => bool(0),
                type  => 'sharing',
                list  => 'none',
            },
            scenes => [
                {
                    title       => 'sceneTitle1',
                    description => 'sceneDesc1',
                    start_time  => '00:15',
                    end_time    => '00:45',
                }
            ],
        }
    ];
    spec_ok($xml, $expected, 'Example using all the new elements added mRSS version 1.5.0.');
}