# Voddler Plugin

**URL:** <https://forums.plex.tv/t/voddler-plugin/9185>\
**Category:** Dev/API Corner\
**Tags:** plugin-dev\
**Created:** [May 9, 2011, 10:16pm UTC](https://forums.plex.tv/t/voddler-plugin/9185 "2011-05-09T22:16:24Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![monsharen](https://avatars.discourse-cdn.com/v4/letter/m/3da27b/32.png) [@monsharen](https://forums.plex.tv/u/monsharen)\
**Post date:** [May 9, 2011, 10:16pm UTC](https://forums.plex.tv/t/voddler-plugin/9185/1 "2011-05-09T22:16:24Z")

</div>

:: Update Jan 2012 :.  
  
Download and How to install:   
  
[https://github.com/drohr/plex-voddler-plugin](https://github.com/drohr/plex-voddler-plugin)  
  
  
  
  
  
  
  
----------  
  
  
  
  
  
I have been wanting a Voddler plugin lately (simply because their webpage is not very remote friendly) so today I decided to do something about it:

[http://img832.imageshack.us/img832/5729/screenshot20110510at000.png](http://img832.imageshack.us/img832/5729/screenshot20110510at000.png)

  
  

[http://img94.imageshack.us/img94/5729/screenshot20110510at000.png](http://img94.imageshack.us/img94/5729/screenshot20110510at000.png)

  
  
I haven't touched Python in several years so it might take some time before I get anything interesting rolling.  
  
  
The movie genres are hardcoded urls at the moment pointing towards two YQL feeds that scrapes the voddler homepage. The feeds are really easy to setup so adding all existing categories should be easy. The current ones list the 200 most popular movies for each genre (thought 200 would be a big enough number)   
  
\*\*Covers:\*\*  
Couldn't figure out how to load the external images correctly (got the cover urls in my feed) so the Pans Labyrinth image is included in the bundle as of now to make it feel less empty.   
  
\*\*Starting movies:\*\*  
[s]As for starting movies I was thinking of trying to launch the external http url for each movie, exiting Plex temporarily. Haven't tried it yet but think it should work by using the following url structure:   

```auto

http://www.voddler.com/en/video/play/2788190073758226675/the-cider-house-rules/

```

[/s]  
  
The user need to be logged in, so will need something clever to trick it. **Edit:** I just tried this and apparently they’ve created a flash player that launches the movie from the browser since the last time I watched a movie so maybe, maybe movies could be launched inside plex now

[![](http://tinypic.com/images/goodbye.jpg) ](http://tinypic.com/images/goodbye.jpg)

  
  

[![](http://tinypic.com/images/goodbye.jpg) ](http://tinypic.com/images/goodbye.jpg)

  
  

[![](http://tinypic.com/images/goodbye.jpg) ](http://tinypic.com/images/goodbye.jpg)

  
  
These screens should be possible to map inside Plex right?  
  
\*\*Url to the flash player:\*\*  

```auto

http://player.voddler.com/VoddlerPlayer.swf

```

  
  
\*\*API\*\*  
Update: Apparently there's a publicly available API for fetching movie info in JSON format:  

```auto

http://api.voddler.com/metaapi/info/1?videoId=2788190073758226675

```

  
If there's a way to get movie listings it would be nice to get rid of the YQL feeds  
Update: Here's the search api (returns results in json as well)  

```auto

http://api.voddler.com/metaapi/search/1?offset=0&count=10&q=cider

```

  
  
\*\*Resources\*\*  
http://userscripts.org/scripts/review/80873 - Found some interesting Voddler related stuff here  
  
Feel free to post

---

<div class="post-metadata">

**Author:** ![IanDBird](https://sea1.discourse-cdn.com/plex/user_avatar/forums.plex.tv/iandbird/32/85993_2.png) [@IanDBird](https://forums.plex.tv/u/IanDBird)\
**Post date:** [May 10, 2011, 1:43pm UTC](https://forums.plex.tv/t/voddler-plugin/9185/2 "2011-05-10T13:43:56Z")

</div>

Looks promising, I’m sure with that much meta data easily available you should be able to make something really nice. If you’re looking for similar plugins, you might want to check out a BlinkBox one that i’ve been working on on the side ([https://github.com/IanDBird/blinkbox.bundle](https://github.com/IanDBird/blinkbox.bundle)). It’s a basic plugin that uses Flash. I still need to sort out the Site Config a little more to handle restart/continue button clicks, fast forward/rewind and the seek bar.   
  
  
  
Anyway, if you get stuck at all with it, just post your queries and I (and i’m sure others) will try and have a look.

---

<div class="post-metadata">

**Author:** ![monsharen](https://avatars.discourse-cdn.com/v4/letter/m/3da27b/32.png) [@monsharen](https://forums.plex.tv/u/monsharen)\
**Post date:** [May 10, 2011, 2:02pm UTC](https://forums.plex.tv/t/voddler-plugin/9185/3 "2011-05-10T14:02:36Z")

</div>

Thanks for the advice (and source)!  
  
  
  
I believe getting the site config right is key to this as well. Haven’t got any experience with that yet but will give it a shot when I get the chance!  
  
  
  
Saving for later: The player for the site config

[![](http://tinypic.com/images/404.gif) ](http://tinypic.com/images/404.gif)

  
  
Settings:  

```auto

<br />
<site site="http://*.voddler.com" plugin="http://player.voddler.com/VoddlerPlayer.swf" initialState="playing" version="1.0"><br />
<br />
<crop x="0" y="26" width="654" height="334" /><br />
<br />
<seekbar type="simple"> <br />
   <start x="66" y="346" /><br />
   <end x="551" y="346" /> <br />
   <played><br />
      <color rgb="008ACE" /><br />
      <color rgb="535353" /><br />
   </played><br />
</seekbar> <br />
<br />
<condition name="paused"><br />
   <color x="29" y="348" rgb="B9B9B9" /><br />
</condition><br />
<br />
<state name="playing"><br />
   <event><br />
      <condition><br />
         <command name="pause" /><br />
      </condition><br />
      <action><br />
         <click x="29" y="348" /><br />
         <goto state="paused" /><br />
      </action><br />
   </event><br />
</state><br />
<state name="paused"><br />
   <event><br />
      <condition><br />
         <command name="play" /><br />
      </condition><br />
      <action><br />
         <click x="29" y="348" /><br />
         <goto state="playing" /><br />
      </action><br />
   </event><br />
</state><br />

```

  
  
Ironically enough I'm not sure I understand the "The Moment of Truth" step here: http://wiki.plexapp.com/index.php/Creating\_Plugins\_Site\_Config#The\_Moment\_of\_Truth

---

<div class="post-metadata">

**Author:** ![IanDBird](https://sea1.discourse-cdn.com/plex/user_avatar/forums.plex.tv/iandbird/32/85993_2.png) [@IanDBird](https://forums.plex.tv/u/IanDBird)\
**Post date:** [May 10, 2011, 3:05pm UTC](https://forums.plex.tv/t/voddler-plugin/9185/4 "2011-05-10T15:05:59Z")

</div>

Didn’t you mention that the site requires the user to login before they can access the videos? If this is the case, the Site Configuration needs to perform the authentication by itself, as in you can’t do it straight from the python. I’ve got an (overcomplicated) example of when i’ve had to do this:  
  
  
  
[https://github.com/IanDBird/SkyPlayer.bundle/blob/master/Contents/Site%20Configurations/skyplayer.xml](https://github.com/IanDBird/SkyPlayer.bundle/blob/master/Contents/Site%20Configurations/skyplayer.xml)

---

<div class="post-metadata">

**Author:** ![monsharen](https://avatars.discourse-cdn.com/v4/letter/m/3da27b/32.png) [@monsharen](https://forums.plex.tv/u/monsharen)\
**Post date:** [May 10, 2011, 3:49pm UTC](https://forums.plex.tv/t/voddler-plugin/9185/5 "2011-05-10T15:49:04Z")

</div>

> [@](#):
>
> Didn't you mention that the site requires the user to login before they can access the videos? If this is the case, the Site Configuration needs to perform the authentication by itself, as in you can't do it straight from the python. I've got an (overcomplicated) example of when i've had to do this:  
>   
> https://github.com/IanDBird/SkyPlayer.bundle/blob/master/Contents/Site%20Configurations/skyplayer.xml

  
Wow thanks for that! Will have to give it a try and see if it I can get it to work in this case. Found this url for the login (returns the status as json):  

```auto

http://www.voddler.com/en/user/authenticate/?urlok=/en/&cc_user_username=[username]&cc_user_password=[password]

```

---

<div class="post-metadata">

**Author:** ![IanDBird](https://sea1.discourse-cdn.com/plex/user_avatar/forums.plex.tv/iandbird/32/85993_2.png) [@IanDBird](https://forums.plex.tv/u/IanDBird)\
**Post date:** [May 10, 2011, 6:12pm UTC](https://forums.plex.tv/t/voddler-plugin/9185/6 "2011-05-10T18:12:02Z")

</div>

Seem’s ideal, you wont need the “cleanup” state from my example and probably not the manual lock stuff…  
  
  
  
The login url looks ideal, it seems the website is providing a lot of good access to it so it shouldn’t be too tough. Good luck!

---

<div class="post-metadata">

**Author:** ![monsharen](https://avatars.discourse-cdn.com/v4/letter/m/3da27b/32.png) [@monsharen](https://forums.plex.tv/u/monsharen)\
**Post date:** [May 11, 2011, 8:57pm UTC](https://forums.plex.tv/t/voddler-plugin/9185/7 "2011-05-11T20:57:23Z")

</div>

Looks like it’s connecting to the page now but it hangs on this screen:

[![](http://i52.tinypic.com/1z20jkl.png) ](http://i52.tinypic.com/1z20jkl.png)

  
  
I guess something needs polishing in my Site Configuration, but seeing the movie title feels good. Making progress :rolleyes:

---

<div class="post-metadata">

**Author:** ![IanDBird](https://sea1.discourse-cdn.com/plex/user_avatar/forums.plex.tv/iandbird/32/85993_2.png) [@IanDBird](https://forums.plex.tv/u/IanDBird)\
**Post date:** [May 11, 2011, 9:03pm UTC](https://forums.plex.tv/t/voddler-plugin/9185/8 "2011-05-11T21:03:19Z")

</div>

Looking good.  
  
  
  
You should have a look at the Plex Media Server.log for information as to what is happening. You should see Plex attempt to move through the states defined within the state machine. Also, from the example I sent attached, you probably don’t need the manualLock or lockplugin statements. If you want me to have a look at what you’ve got so far, just paste the contents of the file in.

---

<div class="post-metadata">

**Author:** ![monsharen](https://avatars.discourse-cdn.com/v4/letter/m/3da27b/32.png) [@monsharen](https://forums.plex.tv/u/monsharen)\
**Post date:** [May 11, 2011, 9:19pm UTC](https://forums.plex.tv/t/voddler-plugin/9185/9 "2011-05-11T21:19:30Z")

</div>

I’ve hardcoded my username and password in the file (you’ll see I’ve excluded them here though). As you can see I’m trying to use the login box on the actual webpage at the moment since I’m unsure if the web service login is really helpful in this case. Need to store the login/session ID somewhere (it’s included in the url when the browser gets redirected after successful login). It’s used for subsequent calls such as starting the movie.

```auto

<?xml version="1.0" encoding="UTF-8"?><br />
<site site="http://.*.voddler.com"<br />
    plugin="http://player.voddler.com/VoddlerPlayer.swf"<br />
    initialState="wait-for-frame-load"<br />
    manualLock="true"<br />
    version="1.0"><br />
<br />
    <!-- Crop the control to better fill the application --><br />
    <crop x="0" y="26" width="654" height="334" /><br />
<br />
    <!-- The condition we use several times from within states to check if we're logged in or not --><br />
    <condition name="need-to-login"><br />
        <and><br />
            <!-- Check if a specific element exists in the page, for example the loginform --><br />
            <!-- Returns true if we need to login --><br />
            <!-- <javascript script="document.cookie.indexOf('; skySSO=')" matches="-1" /> --><br />
            <javascript script="document.getElementById('login_link').id" matches="login_link" /><br />
        </and><br />
    </condition><br />
<br />
    <!-- Wait for frame to load --><br />
    <state name="wait-for-frame-load"><br />
        <event><br />
            <condition><br />
                <!-- Wait for the DOM to load... --><br />
                <frameLoaded /><br />
            </condition><br />
            <action><br />
                <!-- ...then goto the 'check-for-auth' state --><br />
                <goto state="check-for-auth" /><br />
            </action><br />
        </event><br />
    </state><br />
<br />
    <!-- Check for auth --><br />
    <state name="check-for-auth"><br />
        <event><br />
            <condition><br />
                <!-- If we don't need to login, goto state 'playing' --><br />
                <not><br />
                    <condition name="need-to-login" /><br />
                </not><br />
            </condition><br />
            <action><br />
                <goto state="playing" /><br />
            </action><br />
        </event><br />
        <event><br />
            <!-- If we *do* need to login, visit the login url and attempt to submit it --><br />
            <condition><br />
                <condition name="need-to-login" /><br />
            </condition><br />
            <action><br />
                <!-- The state machine will wait until the URL has fully loaded before moving --><br />
                <!-- onto the next state. --><br />
                <visit url="http://www.voddler.com/en/login"/><br />
                <goto state="try-to-login"/><br />
            </action><br />
        </event><br />
    </state><br />
<br />
    <!-- Try to login --><br />
    <state name="try-to-login"><br />
        <event><br />
            <condition><br />
                <!-- No condition required --><br />
                <javascript script="true ? 1 : 0" matches="1" /><br />
            </condition><br />
            <action><br />
                <!-- Fill in the username, password and nexturl of the page. --><br />
                <!-- We need to submit the form so that the page's handlers can populate the other --><br />
                <!-- required post data. --><br />
                <!--<br />
                <run script="page='${url}';index=page.indexOf('/page/');document.login.userName.value='${username}';document.login.password.value='${password}';document.login.nextUrl.value=page.substring(index);document.login.submit();" /><br />
                --><br />
                <run script="document.getElementsByName('email')[0].value='<hardcoded email>';document.getElementsByName('password')[0].value='<hardcoded password>';document.getElementsByClass('button_submit')[0].click()" /><br />
                <pause time="2000" /><br />
                <goto state="check-for-auth-again" /><br />
            </action><br />
        </event><br />
    </state><br />
<br />
    <!-- Check for auth again --><br />
    <state name="check-for-auth-again"><br />
        <event><br />
            <condition><br />
                <!-- If login was successful we should now not need to login and can go to the state 'cleanup' --><br />
                <not><br />
                    <condition name="need-to-login" /><br />
                </not><br />
            </condition><br />
            <action><br />
                <visit url="${url}" /><br />
                <goto state="playing" /><br />
            </action><br />
        </event><br />
        <event><br />
            <condition><br />
                <!-- If we still need to login after we've tried to login, something is wrong... --><br />
                <condition name="need-to-login" /><br />
            </condition><br />
            <action><br />
                <goto state="end" param="Please check your username and password in the plugin's settings" /><br />
            </action><br />
        </event><br />
    </state><br />
<br />
    <!-- Playing --><br />
    <state name="playing"><br />
        <event><br />
            <condition><br />
                <javascript script="true ? 1 : 0" matches="1" /><br />
            </condition><br />
            <action><br />
                <!-- Done! We don't need to do anything else here --><br />
            </action><br />
        </event><br />
    </state><br />
<br />
</site>

```

  
  
Is there any way to log values from the DOM fetched via javascript to the log file?  
  
[s]Looks like it (my javascript) might be failing at the login step[/s]  

```auto

removed old log for easier reading

```

  
  
  
\*\*UPDATE\*\*: Got past the login screen! document.getElementsBy\*\*ClassName\*\*('button\_submit')[0].click(); is the method to use...  
  
  
The log continues:  
  

```auto

May 11, 2011 23:47:04 [0xa0a51540] DEBUG - Executing Moving to state check-for-auth-again<br />
<br />
Check if logged in:<br />
May 11, 2011 23:47:04 [0xa0a51540] DEBUG - Executed 'document.getElementById('login_link').id' and now seeing if [undefined] matches [login_link]<br />
<br />
Login_link is missing so we proceed to the actual url:<br />
May 11, 2011 23:47:04 [0xa0a51540] DEBUG - Executing Visiting ${url}<br />
May 11, 2011 23:47:04 [0xa0a51540] DEBUG - Browsing to URL: http://www.voddler.com/en/movie/info/2788190073758226675/the-cider-house-rules/<br />
May 11, 2011 23:47:04 [0xa0a51540] DEBUG - Stopping execution, waiting for 1<br />
<br />
What's this?<br />
May 11, 2011 23:47:06 [0xa0a51540] DEBUG - 0x1aa4aac0 Plugin loaded [(null)] (0 1830 300 150 )<br />
May 11, 2011 23:47:06 [0xa0a51540] DEBUG - 0x17008d30 Plugin loaded [eas.statcamp.net/media.4/149/12560/126847/250x360_cdf5c772.swf?clickTAG=http://eas.statcamp.net/eas/cu=0::camp=126847::no=176815::kw=link1-176815::encoding=utf-8::EASLink=http://clk.tradedoubler.com/click?p=206289%26loc=95214%26g=19678948%26url=http://a7f62bea-50a0-4b04-bd6f-3e2aacfddde9.statcamp.net/turl/?id=ac1cec7beea5414b9ae0fcb22aca9b5c%26cid=f983badbbf064fa8b31566519cd6ac44%26lpid=62b6aa113d0f451caa1988c7973ea106] (0 0 250 360 eas_13051504264806)<br />
May 11, 2011 23:47:06 [0xa0a51540] DEBUG - Frame was loaded.<br />
May 11, 2011 23:47:06 [0xa0a51540] DEBUG - Frame was loaded.<br />
<br />
Checking if we're still logged in:<br />
May 11, 2011 23:47:06 [0xa0a51540] DEBUG - Executed 'document.getElementById('login_link').id' and now seeing if [undefined] matches [login_link]<br />
<br />
We are, but should it really load the page again?<br />
May 11, 2011 23:47:06 [0xa0a51540] DEBUG - Executing Visiting ${url}<br />
May 11, 2011 23:47:06 [0xa0a51540] DEBUG - Browsing to URL: http://www.voddler.com/en/movie/info/2788190073758226675/the-cider-house-rules/<br />
May 11, 2011 23:47:06 [0xa0a51540] DEBUG - Stopping execution, waiting for 1<br />
May 11, 2011 23:47:06 [0xa0a51540] DEBUG - Frame was loaded.<br />
<br />
Launching play state:<br />
May 11, 2011 23:47:06 [0xa0a51540] DEBUG - Executing Moving to state playing<br />
May 11, 2011 23:47:06 [0xa0a51540] DEBUG - Executed 'true ? 1 : 0' and now seeing if [1] matches [1]<br />
May 11, 2011 23:47:06 [0xa0a51540] DEBUG - Received title [The Cider House Rules - Voddler.com Movies].<br />
May 11, 2011 23:47:06 [0xa0a51540] DEBUG - Executed 'true ? 1 : 0' and now seeing if [1] matches [1]<br />
May 11, 2011 23:47:07 [0xa0a51540] DEBUG - Received title [ ].<br />
May 11, 2011 23:47:07 [0xa0a51540] DEBUG - Executed 'true ? 1 : 0' and now seeing if [1] matches [1]<br />
May 11, 2011 23:47:08 [0xa0a51540] DEBUG - Received title [Like | Facebook].<br />
May 11, 2011 23:47:08 [0xa0a51540] DEBUG - Executed 'true ? 1 : 0' and now seeing if [1] matches [1]<br />
May 11, 2011 23:47:08 [0xa0a51540] DEBUG - 0x170a8be0 Plugin loaded [(null)] (0 1723 300 150 )<br />
May 11, 2011 23:47:08 [0xa0a51540] DEBUG - Frame was loaded.<br />
May 11, 2011 23:47:08 [0xa0a51540] DEBUG - Executed 'true ? 1 : 0' and now seeing if [1] matches [1]<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Frame was loaded.<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Executed 'true ? 1 : 0' and now seeing if [1] matches [1]<br />
<br />
This looks like commercials which makes sense, but maybe it's just a banner on the page.<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - 0x28f9760 Plugin loaded [track.adform.net/Banners/Elements/Files/2101/15622.swf?ADFassetID=15622&bv=7] (-9999 -9999 250 360 adfdiv_850961921411_swf)<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Frame was loaded.<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Executed 'true ? 1 : 0' and now seeing if [1] matches [1]<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Frame was loaded.<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Executed 'true ? 1 : 0' and now seeing if [1] matches [1]<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Executed 'true ? 1 : 0' and now seeing if [1] matches [1]<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Executed 'true ? 1 : 0' and now seeing if [1] matches [1]<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Executed 'true ? 1 : 0' and now seeing if [1] matches [1]<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Received title [XD Proxy].<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Executed 'true ? 1 : 0' and now seeing if [1] matches [1]<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Frame was loaded.<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Executed 'true ? 1 : 0' and now seeing if [1] matches [1]<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Frame was loaded.<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Executed 'true ? 1 : 0' and now seeing if [1] matches [1]<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Executed 'true ? 1 : 0' and now seeing if [1] matches [1]<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Executed 'true ? 1 : 0' and now seeing if [1] matches [1]<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Executed 'true ? 1 : 0' and now seeing if [1] matches [1]<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Executed 'true ? 1 : 0' and now seeing if [1] matches [1]<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Executed 'true ? 1 : 0' and now seeing if [1] matches [1]<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Executed 'true ? 1 : 0' and now seeing if [1] matches [1]<br />
May 11, 2011 23:47:09 [0xa0a51540] DEBUG - Executed 'true ? 1 : 0' and now seeing if [1] matches [1]

```

  
  
Any ideas?

---

<div class="post-metadata">

**Author:** ![IanDBird](https://sea1.discourse-cdn.com/plex/user_avatar/forums.plex.tv/iandbird/32/85993_2.png) [@IanDBird](https://forums.plex.tv/u/IanDBird)\
**Post date:** [May 12, 2011, 7:43am UTC](https://forums.plex.tv/t/voddler-plugin/9185/10 "2011-05-12T07:43:00Z")

</div>

So, it appears that Plex is moving through the states define in the Site Config, and even getting to the Playing state. However, you still have the manualLock defined in it and you’re not using it. You should probably change the start of the file to something like:

```auto

<br />
<?xml version="1.0" encoding="UTF-8"?><br />
<site site="http://.*.voddler.com"<br />
    plugin="http://player.voddler.com/VoddlerPlayer.swf"<br />
    initialState="wait-for-frame-load"<br />
    version="1.0"><br />
...<br />

```

  
  
Also, I would remove the ... stuff as you may not need this. If you do, it's probably also got the completely wrong parameters as was only appropriate for the SkyPlayer site config.  
  
Give that a go and let me know what happens...

---

<div class="post-metadata">

**Author:** ![monsharen](https://avatars.discourse-cdn.com/v4/letter/m/3da27b/32.png) [@monsharen](https://forums.plex.tv/u/monsharen)\
**Post date:** [May 12, 2011, 7:59am UTC](https://forums.plex.tv/t/voddler-plugin/9185/11 "2011-05-12T07:59:25Z")

</div>

> [@](#):
>
> So, it appears that Plex is moving through the states define in the Site Config, and even getting to the Playing state. However, you still have the manualLock defined in it and you're not using it. You should probably change the start of the file to something like:  
>   
> 
> ```auto
> 
> <br />
> <?xml version="1.0" encoding="UTF-8"?><br />
> <site site="http://.*.voddler.com"<br />
> plugin="http://player.voddler.com/VoddlerPlayer.swf"<br />
> initialState="wait-for-frame-load"<br />
> version="1.0"><br />
> ...<br />
> 
> ```

  
I've removed the manualLock without success yet. I tried to follow the wiki when I did the the crop parameters so they shouldn't be completely off unless I've missed something crucial but I will try to remove them as you say.  
  
Thanks for all your great input so far! Really keeps me going  
  
Also, Voddler have been kind and given me specifications for their movie listings, details and searching (sadly not for sharing) so I should be able to remove the scraping completely later on.

---

<div class="post-metadata">

**Author:** ![IanDBird](https://sea1.discourse-cdn.com/plex/user_avatar/forums.plex.tv/iandbird/32/85993_2.png) [@IanDBird](https://forums.plex.tv/u/IanDBird)\
**Post date:** [May 12, 2011, 8:06am UTC](https://forums.plex.tv/t/voddler-plugin/9185/12 "2011-05-12T08:06:08Z")

</div>

Just to check, are you restarting the Plex Server component every time you change the Site Config? It only picks up changes when the server is restarted. This caught me out a number of times 🙂  
  
  
  
I tried joining the service to see if I could take a look at what was going on but just received “service not available” when I requested an invite. Just to check, when you are logged in, and browse to [http://www.voddler.com/en/movie/info/2788190073758226675/the-cider-house-rules/](http://www.voddler.com/en/movie/info/2788190073758226675/the-cider-house-rules/) there is a flash element embedded in the page? It appears that Plex is navigating to it and not managing to find the element then. Normally, what should happen is that Plex scans the page and finds the first Flash element which it renders off screen. This would then be presented within the client…  
  
  
  
As a side note, you mention that the specifications are “not for sharing”. Just to point out that if you want to distribute this to anyone else, you will need to post the .bundle file which is simply a folder containing a load of python. It would not be very difficult for someone to look at the source to find out this API, etc.

---

<div class="post-metadata">

**Author:** ![monsharen](https://avatars.discourse-cdn.com/v4/letter/m/3da27b/32.png) [@monsharen](https://forums.plex.tv/u/monsharen)\
**Post date:** [May 12, 2011, 8:33am UTC](https://forums.plex.tv/t/voddler-plugin/9185/13 "2011-05-12T08:33:48Z")

</div>

> [@](#):
>
> Just to check, are you restarting the Plex Server component every time you change the Site Config? It only picks up changes when the server is restarted. This caught me out a number of times 🙂

  
 :o Don't think I did..  
  

> [@](#):
>
> I tried joining the service to see if I could take a look at what was going on but just received “service not available” when I requested an invite.

  
It's only available in Sweden, Norway, Denmark, Finland and soon Spain as of yet. Could that be it?  
  

> [@](#):
>
> Just to check, when you are logged in, and browse to [http://www.voddler.com/en/movie/info/2788190073758226675/the-cider-house-rules/](http://www.voddler.com/en/movie/info/2788190073758226675/the-cider-house-rules/) there is a flash element embedded in the page? It appears that Plex is navigating to it and not managing to find the element then. Normally, what should happen is that Plex scans the page and finds the first Flash element which it renders off screen. This would then be presented within the client…

  
It looks like it should be the first flash object on the page. Looks like this:  
  

```auto

<object width="654" height="370" type="application/x-shockwave-flash" data="http://player.voddler.com/VoddlerPlayer.swf" id="flashplayer" style="visibility: visible;"><param name="allowScriptAccess" value="always"><param name="wmode" value="opaque"><param name="allowFullScreen" value="true"><param name="id" value="player"><param name="flashvars" value="videoid=2788190073758226675&amp;cridid=2788190073758811224&amp;token=022e3057bb8cb41333a0f7fdae5171d6&amp;domain=http://www.voddler.com&amp;prebanner_content=http://www.voddler.com/ox/log?bannerid=342&amp;campaignid=3&amp;zoneid=34&amp;loc=http%3A%2F%2Fwww.voddler.com%2Fen%2Fmovie%2Finfo%2F2788190073758226675%2Fthe-cider-house-rules%2F&amp;referer=http%3A%2F%2Fwww.voddler.com%2Fen%2Fmovie%2Finfo%2F2788190073758226675%2Fthe-cider-house-rules%2F&amp;cb=673a4e9e41&amp;dest=http://www.voddler.com/public/ox/8b2042280d48d0ece996c5929be574f3.jpg&amp;prebanner_click=http://www.voddler.com/ox/click?oaparams=2 __bannerid=342__ zoneid=34 __cb=673a4e9e41__ oadest=http%3A%2F%2Fwww.google.com&amp;postbanner_content=http://www.voddler.com/ox/log?bannerid=325&amp;campaignid=3&amp;zoneid=32&amp;loc=http%3A%2F%2Fwww.voddler.com%2Fen%2Fmovie%2Finfo%2F2788190073758226675%2Fthe-cider-house-rules%2F&amp;referer=http%3A%2F%2Fwww.voddler.com%2Fen%2Fmovie%2Finfo%2F2788190073758226675%2Fthe-cider-house-rules%2F&amp;cb=5f76d7f0ac&amp;dest=http://www.voddler.com/public/ox/67958b4f8d9cda53cf5b8680f812e11f.png&amp;postbanner_click=http://www.voddler.com/ox/click?oaparams=2 __bannerid=325__ zoneid=32 __cb=5f76d7f0ac__ oadest=http%3A%2F%2Fwww.blt.se&amp;language=en_US"></object>

```

  
  
I have noticed however that the first thing that happens is it plays a commercial in fullscreen mode. Exiting fullscreen will pause the commercial. Don't know if this will cause issues or not.  
  

> [@](#):
>
> As a side note, you mention that the specifications are “not for sharing”. Just to point out that if you want to distribute this to anyone else, you will need to post the .bundle file which is simply a folder containing a load of python. It would not be very difficult for someone to look at the source to find out this API, etc.

  
To clarify I am under no obligations towards them, no NDA or similar. They just didn't want me to spread the actual documents around so I thought it would be nice to honor their request. They were fully aware of that people could figure out their api:s without the documentation (like sniffing it etc)

---

<div class="post-metadata">

**Author:** ![IanDBird](https://sea1.discourse-cdn.com/plex/user_avatar/forums.plex.tv/iandbird/32/85993_2.png) [@IanDBird](https://forums.plex.tv/u/IanDBird)\
**Post date:** [May 12, 2011, 11:36am UTC](https://forums.plex.tv/t/voddler-plugin/9185/14 "2011-05-12T11:36:46Z")

</div>

I would definitely try again with the “manualLock” removed. The log looks like it is actually working and just not finding the control, which is what I would expect if “manualLock=true” is set without a “lockplugin” statement.  
  
  
  
Let me know what you find

---

<div class="post-metadata">

**Author:** ![monsharen](https://avatars.discourse-cdn.com/v4/letter/m/3da27b/32.png) [@monsharen](https://forums.plex.tv/u/monsharen)\
**Post date:** [May 12, 2011, 8:12pm UTC](https://forums.plex.tv/t/voddler-plugin/9185/15 "2011-05-12T20:12:04Z")

</div>

[![](http://i56.tinypic.com/2nbu3cn.png) ](http://i56.tinypic.com/2nbu3cn.png)

  
  
Yep! That's voddler inside Plex! I realized that when the plugin visits the movie url it also have to click a "play" link to launch the swf. Fixed that now  
  
Huge step forward!  
  
  
Next issue:  

[![](http://i54.tinypic.com/1jnspj.png) ](http://i54.tinypic.com/1jnspj.png)

  
When the movie is loaded and ready to play it displays this play button. Needs mapping.  
  
If you've already started watching this movie earlier you will get these buttons instead:  

[![](http://i53.tinypic.com/25ulbuc.jpg) ](http://i53.tinypic.com/25ulbuc.jpg)

  
  
 :D

---

<div class="post-metadata">

**Author:** ![IanDBird](https://sea1.discourse-cdn.com/plex/user_avatar/forums.plex.tv/iandbird/32/85993_2.png) [@IanDBird](https://forums.plex.tv/u/IanDBird)\
**Post date:** [May 12, 2011, 8:20pm UTC](https://forums.plex.tv/t/voddler-plugin/9185/16 "2011-05-12T20:20:54Z")

</div>

Awesome, well done.  
  
  
  
This leads to the next question… Should the plugin always start from the beginning and just allow the user to skip, e.g. fast forward? You could make it configurable in the plugin so that it will always “Restart” or always “Resume”. The preference could be accessed by the Site Config to determine which X coordinate to send the click. Just some thoughts…

---

<div class="post-metadata">

**Author:** ![monsharen](https://avatars.discourse-cdn.com/v4/letter/m/3da27b/32.png) [@monsharen](https://forums.plex.tv/u/monsharen)\
**Post date:** [May 12, 2011, 8:23pm UTC](https://forums.plex.tv/t/voddler-plugin/9185/17 "2011-05-12T20:23:05Z")

</div>

Trying to solve the ‘start movie’ click after the buffering process without much success. It just stops (the log is iterating the ‘playing’ state until this button shows), and I am wondering if my color check really works.

[![](http://i54.tinypic.com/1jnspj.png) ](http://i54.tinypic.com/1jnspj.png)

  
  
The click need to occur inside the blue circle, not on it.  
  

```auto

<br />
    <condition name="need-to-click-resume-choice"><br />
        <and><br />
            <color x="20" y="20" rgb="000000" /><br />
            <color x="10" y="10" rgb="000000" /><br />
        </and><br />
    </condition><br />
    <br />
    <condition name="need-to-click-start-movie"><br />
        <and><br />
            <color x="327" y="167" rgb="ebebeb" /><br />
            <color x="327" y="117" rgb="009bd6" /><br />
        </and><br />
    </condition><br />
    <br />
    <condition name="need-to-click-play-button"><br />
        <and><br />
            <javascript script="$('#playmoviebutton')[0].id" matches="playmoviebutton" /><br />
        </and><br />
    </condition><br />
<br />
    <!-- Playing --><br />
    <state name="playing"><br />
        <event><br />
            <condition><br />
                <!-- When the movie is buffered we need to click on it to start it --><br />
                <condition name="need-to-click-start-movie" /><br />
            </condition><br />
            <action><br />
            	<click x="327" y="167" /><br />
            	<pause time="1000" /><br />
            </action><br />
        </event><br />
	    <br />
    	<event><br />
            <condition><br />
                <!-- When we reach the movie we need to click the play button --><br />
                <condition name="need-to-click-play-button" /><br />
            </condition><br />
            <action><br />
                <run script="$('#playmoviebutton').click()" /><br />
                <pause time="2000" /><br />
            </action><br />
        </event><br />
        <br />
        <event><br />
            <condition><br />
                <!-- When we reach the movie we need to click the play button --><br />
                <condition name="need-to-click-resume-choice" /><br />
            </condition><br />
            <action><br />
                <click x="307" y="167" /><br />
                <pause time="2000" /><br />
            </action><br />
        </event><br />
<br />
<br />
    </state>

```

  
  
Any suggestions?

---

<div class="post-metadata">

**Author:** ![monsharen](https://avatars.discourse-cdn.com/v4/letter/m/3da27b/32.png) [@monsharen](https://forums.plex.tv/u/monsharen)\
**Post date:** [May 13, 2011, 2:40pm UTC](https://forums.plex.tv/t/voddler-plugin/9185/18 "2011-05-13T14:40:07Z")

</div>

Free movies starts fine after a set of commercials now!   
  
  
  
I have however found that switching between fullscreen and windowed mode messes things up and leave you with a blank screen (of death. Seriously, the frustration will kill you).  
  
  
  
  
  
I have also realized that I will need to implement a state for the purchase screen if you select a paid movie (basically just automate a click on the accept button)… Which might get expensive to test :wacko:  
  
  
  
Clicking a movie in the list is not always working and might need 1 to 3 tries before it actually launches. This will need some polishing as well.

---

<div class="post-metadata">

**Author:** ![IanDBird](https://sea1.discourse-cdn.com/plex/user_avatar/forums.plex.tv/iandbird/32/85993_2.png) [@IanDBird](https://forums.plex.tv/u/IanDBird)\
**Post date:** [May 13, 2011, 3:11pm UTC](https://forums.plex.tv/t/voddler-plugin/9185/19 "2011-05-13T15:11:54Z")

</div>

Are you going to keep a single Site Config for everything, or have two (1 for free stuff, 1 for pay to view)? You could always ask nicely if the website would give you a temporary account which allowed you to develop your application using?

---

<div class="post-metadata">

**Author:** ![monsharen](https://avatars.discourse-cdn.com/v4/letter/m/3da27b/32.png) [@monsharen](https://forums.plex.tv/u/monsharen)\
**Post date:** [May 13, 2011, 8:08pm UTC](https://forums.plex.tv/t/voddler-plugin/9185/20 "2011-05-13T20:08:26Z")

</div>

I’m thinking of letting the user choose whether to show paid and/or free movies in the list. If a paid movie is clicked a state in the site config will have to be triggered and purchase the movie for the user in the background. All the needed credit card data will have to be saved on the account already though (happens the first time you buy a movie) or this will fail.  
  
  
  
Anyway, exchanged my webpage scraper feed with the voddler api and I am happy to report it’s a bliss. One question though, how do I display an external cover image? I want to do something similar to this:

```auto

<br />
imageUrl = "http://s2.voddler.com/33399/assets/imageservice/boximage/8/9/89ee29079c0e81a6d44bad80bdd69bd7b937ddad74f5a885bfb69df01bc2f20d.jpg"<br />
thumb=R(imageUrl)

```

  
  

[![](http://i53.tinypic.com/2ijm9dw.png) ](http://i53.tinypic.com/2ijm9dw.png)

  
  
ok update: I am an idiot :rolleyes: got the images working

[Next page](https://forums.plex.tv/t/voddler-plugin/9185.md?page=2)
