~webapps/unity-webapps-pandora/trunk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// ==UserScript==
// @include       http://www.pandora.com/*
// @include       https://www.pandora.com/*
// @require       utils.js
// ==/UserScript==

// This placeholder gets munged with real data at build time.
var WebappsGettextDict = JSON.parse(unescape(
    "%7B%22GETTEXT%22%3A%22PLACEHOLDER%22%7D"
));

window.Unity = external.getUnityObject(1);

function isCorrectPage() {
    var i, ids = ['topnav', 'brandingBar'];

    for (i = 0; i < ids.length; i++) {
        if (!document.getElementById(ids[i])) {
            return false;
        }
    }

    return true;
}

function getTrackInfo() {
    var title = null;
    var artLocation = null;
    var album = null;
    var artist = null;
    try {
        artLocation = document.evaluate('//div[@id="playerBar"]/div[@class="highlight"]/div[@class="columns"]/div[@class="rightcolumn"]/div[@class="nowplaying"]/div[@class="cd_menu"]/div[@class="cd_icon"]/div[@class="albumArt"]/img',
                                        document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.src;
        title = document.evaluate('//div[@id="playerBar"]/div[@class="highlight"]/div[@class="columns"]/div[@class="rightcolumn"]/div[@class="nowplaying"]/div[@class="info"]/div[1]/a',
                                  document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.textContent;
        album = document.evaluate('//div[@id="playerBar"]/div[@class="highlight"]/div[@class="columns"]/div[@class="rightcolumn"]/div[@class="nowplaying"]/div[@class="info"]/div[3]/a',
                                  document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.textContent;
        artist = document.evaluate('//div[@id="playerBar"]/div[@class="highlight"]/div[@class="columns"]/div[@class="rightcolumn"]/div[@class="nowplaying"]/div[@class="info"]/div[2]/a',
                                   document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.textContent;
    } catch (x) {}

    if (!artist) {
        return null;
    }

    return {
        title: title,
        album: album,
        artist: artist,
        artLocation: artLocation
    };
}

function changeState(dryRun) {
    var playButton = document.evaluate('//div[@id="playbackControl"]/div[@class="buttons"]/div[@class="playButton"]',
                                       document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
    var pauseButton = document.evaluate('//div[@id="playbackControl"]/div[@class="buttons"]/div[@class="pauseButton"]',
                                        document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;

    var paused = playButton.style.display !== 'none';

    if (!dryRun) {
        if (paused) {
            launchClickEvent(playButton);
        } else {
            launchClickEvent(pauseButton);
        }
    }

    if (!paused) {
        Unity.MediaPlayer.setPlaybackState(Unity.MediaPlayer.PlaybackState.PLAYING);
    } else {
        Unity.MediaPlayer.setPlaybackState(Unity.MediaPlayer.PlaybackState.PAUSED);
    }
}


function musicPlayerSetup() {
    Unity.MediaPlayer.init("pandora.com");
    Unity.MediaPlayer.setCanGoPrevious(false);

    setInterval(wrapCallback(function retry() {
        var trackInfo = getTrackInfo(), i;

        if (trackInfo) {
            Unity.MediaPlayer.setTrack(trackInfo);
        }
        changeState(true);

        var stations = document.getElementsByClassName('stationNameText');
        for (i = 0; i < stations.length; i++) {
            console.log(stations[i].textContent);
            //stations[i].click()
        }
    }), 1000);

    Unity.MediaPlayer.onPlayPause(wrapCallback(function () {
        changeState(false);
    }));

    Unity.MediaPlayer.onNext(wrapCallback(function () {
        var node = document.evaluate('//div[@id="playbackControl"]/div[@class="buttons"]/div[@class="skipButton"]',
                                     document,
                                     null,
                                     XPathResult.FIRST_ORDERED_NODE_TYPE,
                                     null)
                           .singleNodeValue;
        launchClickEvent(node);
    }));
}

if (isCorrectPage()) {
    Unity.init({ name: "pandora.com",
                 domain: 'pandora.com',
                 homepage: 'http://www.pandora.com/',
                 iconUrl: 'http://pandora.com/img/pandora-logo.png',
                 crop: true,
                 onInit: wrapCallback(musicPlayerSetup) });
}