Ticket #9301: scripts-volume+tree.patch

File scripts-volume+tree.patch, 19.7 KB (added by Jonatan <mythtv@…>, 13 years ago)
  • mythtv/bindings/python/MythTV/methodheap.py

    diff --git a/mythtv/bindings/python/MythTV/methodheap.py b/mythtv/bindings/python/MythTV/methodheap.py
    index 43a673a..3ad22d4 100644
    a b class MythXML( XMLConnection ): 
    995995                        find('InternetContent').findall('grabber'):
    996996            yield InternetSource.fromEtree(grabber, self)
    997997
     998    def getInternetContentUrl(self, grabber, videocode):
     999        return "mythflash://%s:%s/Myth/GetInternetContent?Grabber=%s&videocode=%s" \
     1000            % (self.host, self.port, grabber, videocode)
     1001
    9981002    def getPreviewImage(self, chanid, starttime, width=None, \
    9991003                                                 height=None, secsin=None):
    10001004        starttime = datetime.duck(starttime)
  • new file mythtv/programs/scripts/internetcontent/nv_python_libs/configs/HTML/vimeo.html

    diff --git a/mythtv/programs/scripts/internetcontent/nv_python_libs/configs/HTML/vimeo.html b/mythtv/programs/scripts/internetcontent/nv_python_libs/configs/HTML/vimeo.html
    new file mode 100644
    index 0000000..755379e
    - +  
     1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
     2<html>
     3    <head>
     4        <style type="text/css">
     5            body {
     6                padding: 0;
     7                margin: 0;
     8            }
     9        </style>
     10        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>
     11        <script type="text/javascript">
     12            /* gup function by R.D. Vaughan */
     13            function gup( name )
     14            {
     15                name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
     16                var regexS = "[\\?&]"+name+"=([^&#]*)";
     17                var regex = new RegExp( regexS );
     18                var results = regex.exec( window.location.href );
     19                if( results == null )
     20                    return "";
     21                else
     22                    return results[1];
     23            }
     24
     25            var video_id = gup( 'videocode' );
     26            var myth_player = null;
     27            var paused = false;
     28            var volume = 50;
     29
     30            function vimeo_player_loaded(swf_id) {
     31                myth_player = document.getElementById(swf_id);
     32                myth_player.api_setVolume(volume);
     33                document.getElementById('controls').style.display = '';
     34            }
     35
     36            function play() {
     37                if (myth_player) {
     38                    if (paused) {
     39                        myth_player.api_play();
     40                        paused = false;
     41                    }
     42                    else if (!paused) {
     43                        myth_player.api_pause();
     44                        paused = true;
     45                    }
     46                }
     47            }
     48
     49            function seek(amount) {
     50                if (myth_player) {
     51                    myth_player.api_seekTo(myth_player.api_getCurrentTime() + amount);
     52                }
     53            }
     54
     55            function adjustVolume(amount) {
     56                if (myth_player) {
     57                    volume += amount;
     58                    if (volume > 100)
     59                        volume = 100;
     60                    if (volume < 0)
     61                        volume = 0;
     62                    myth_player.api_setVolume(volume);
     63                }
     64            }
     65
     66            var flashvars = {
     67                clip_id: video_id,
     68                show_portrait: 1,
     69                show_byline: 1,
     70                show_title: 1,
     71                fp_version: 10,
     72                js_api: 1, // required in order to use the Javascript API
     73                js_onLoad: 'vimeo_player_loaded', // moogaloop will call this JS function when it's done loading (optional)
     74                js_swf_id: 'myth_player' // this will be passed into all event methods so you can keep track of multiple moogaloops (optional)
     75            };
     76            var params = {
     77                allowscriptaccess: 'always',
     78                allowfullscreen: 'true',
     79                wmode: 'opaque',
     80               
     81            };
     82            var attributes = {};
     83
     84            // For more SWFObject documentation visit: http://code.google.com/p/swfobject/wiki/documentation
     85            swfobject.embedSWF("http://vimeo.com/moogaloop.swf?autoplay=1", "myth_player", window.innerWidth, window.innerHeight, "9.0.0","expressInstall.swf", flashvars, params, attributes);
     86        </script>
     87    </head>
     88    <body>
     89        <div id="myth_player"/>
     90    </body>
     91</html>
  • mythtv/programs/scripts/internetcontent/nv_python_libs/configs/HTML/youtube.html

    diff --git a/mythtv/programs/scripts/internetcontent/nv_python_libs/configs/HTML/youtube.html b/mythtv/programs/scripts/internetcontent/nv_python_libs/configs/HTML/youtube.html
    index 49ffd8a..f6b9161 100644
    a b  
    11<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
    22<html>
    3   <head>
    4   <!-- Author: R.D. Vaughan
    5        Apr 28th, 2010
    6        Purpose: Implement full screen browser video display for the BBC iPlayer
    7   Example:
    8   file:///usr/local/share/mythtv/mythnetvision/scripts/nv_python_libs/configs/HTML/bbciplayer.html?videocode=b00s5nfv
    9   -->
    10     <script type="text/javascript">
    11       function gup( name )
    12         {
    13           name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    14           var regexS = "[\\?&]"+name+"=([^&#]*)";
    15           var regex = new RegExp( regexS );
    16           var results = regex.exec( window.location.href );
    17           if( results == null )
    18             return "";
    19           else
    20             return results[1];
    21         }
    22 
    23       var videocode = gup( 'videocode' );
    24       var embedded = '<embed height="98%" width="100%" type="application/x-shockwave-flash" src="http://s.ytimg.com/yt/swf/watch-vfl170492.swf" id="movie_player" flashvars="rv.7.length_seconds=136&amp;rv.2.thumbnailUrl=http%3A%2F%2Fi2.ytimg.com%2Fvi%2FIFhhaXDziZ4%2Fdefault.jpg&amp;rv.0.url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DBf04aUZMIVQ&amp;rv.0.view_count=28868&amp;vq=auto&amp;rv.6.author=krlitosito&amp;rv.3.view_count=34084&amp;rv.0.length_seconds=251&amp;rv.4.thumbnailUrl=http%3A%2F%2Fi3.ytimg.com%2Fvi%2FzI9C9j0QgU4%2Fdefault.jpg&amp;fmt_url_map=34%7Chttp%3A%2F%2Fv11.lscache8.c.youtube.com%2Fvideoplayback%3Fip%3D99.0.0.0%26sparams%3Did%252Cexpire%252Cip%252Cipbits%252Citag%252Calgorithm%252Cburst%252Cfactor%26fexp%3D902303%252C906712%26algorithm%3Dthrottle-factor%26itag%3D34%26ipbits%3D8%26burst%3D40%26sver%3D3%26expire%3D1276203600%26key%3Dyt1%26signature%3D977BE213A3E74A1B3597CC270D8990872B299745.B36097223339C126F6C108E54090CDAEFE383D73%26factor%3D1.25%26id%3Db9493e8e24226592%2C5%7Chttp%3A%2F%2Fv14.lscache2.c.youtube.com%2Fvideoplayback%3Fip%3D99.0.0.0%26sparams%3Did%252Cexpire%252Cip%252Cipbits%252Citag%252Calgorithm%252Cburst%252Cfactor%26fexp%3D902303%252C906712%26algorithm%3Dthrottle-factor%26itag%3D5%26ipbits%3D8%26burst%3D40%26sver%3D3%26expire%3D1276203600%26key%3Dyt1%26signature%3D42F8774F51ED24983133B8D8F797908F97D8C371.3B0C17A6728074833130840B82BE167F4CA1035D%26factor%3D1.25%26id%3Db9493e8e24226592&amp;csi_page_type=wwad&amp;cr=CA&amp;rv.1.url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DPzeRpPSZOjI&amp;rv.6.thumbnailUrl=http%3A%2F%2Fi3.ytimg.com%2Fvi%2FBwBz4h_4POA%2Fdefault.jpg&amp;host_language=en&amp;rv.3.rating=4.92660550459&amp;fmt_list=34%2F0%2F9%2F0%2F115%2C5%2F0%2F7%2F0%2F0&amp;rv.7.id=P5y-yjheRKE&amp;targeting_video_doc_id=&amp;rv.0.rating=4.97297297297&amp;invideo=True&amp;rv.5.id=6oHEgkK9wj0&amp;tk=Rqbx09U3FZ_vusI7vVWVX-zIbWbZAIm1Q2GN6gt7W3SQKWb-qm-Lvw%3D%3D&amp;sffb=True&amp;rv.0.id=Bf04aUZMIVQ&amp;rv.5.url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D6oHEgkK9wj0&amp;timestamp=1276178843&amp;rv.0.author=WaspEnterprise&amp;rv.3.thumbnailUrl=http%3A%2F%2Fi3.ytimg.com%2Fvi%2F663CI_o4sTY%2Fdefault.jpg&amp;rv.2.author=8Etech8&amp;rv.6.url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DBwBz4h_4POA&amp;ad_host=ca-host-pub-4790912793353039&amp;ad_eurl=http%3A%2F%2Fwww.youtube.com%2Fvideo%2FVIDEOCODE&amp;mpu=True&amp;hl=en_US&amp;ad_flags=1&amp;rv.0.thumbnailUrl=http%3A%2F%2Fi3.ytimg.com%2Fvi%2FBf04aUZMIVQ%2Fdefault.jpg&amp;rv.5.length_seconds=282&amp;rv.7.author=krlitosito&amp;rv.5.view_count=7517&amp;rv.1.length_seconds=251&amp;rv.3.id=663CI_o4sTY&amp;rv.2.id=IFhhaXDziZ4&amp;rv.2.length_seconds=316&amp;t=vjVQa1PpcFMjs5n51hkGar4Hp9uA3GYTt6LvegEYo00%3D&amp;rv.6.id=BwBz4h_4POA&amp;cafe_experiment_id=&amp;rv.6.view_count=2565&amp;rv.3.author=krlitosito&amp;rv.4.id=zI9C9j0QgU4&amp;fexp=902303%2C906712&amp;allow_embed=1&amp;ad_host_tier=54235&amp;fmt_stream_map=34%7Chttp%3A%2F%2Fv11.lscache8.c.youtube.com%2Fvideoplayback%3Fip%3D99.0.0.0%26sparams%3Did%252Cexpire%252Cip%252Cipbits%252Citag%252Calgorithm%252Cburst%252Cfactor%26fexp%3D902303%252C906712%26algorithm%3Dthrottle-factor%26itag%3D34%26ipbits%3D8%26burst%3D40%26sver%3D3%26expire%3D1276203600%26key%3Dyt1%26signature%3D977BE213A3E74A1B3597CC270D8990872B299745.B36097223339C126F6C108E54090CDAEFE383D73%26factor%3D1.25%26id%3Db9493e8e24226592%2C5%7Chttp%3A%2F%2Fv14.lscache2.c.youtube.com%2Fvideoplayback%3Fip%3D99.0.0.0%26sparams%3Did%252Cexpire%252Cip%252Cipbits%252Citag%252Calgorithm%252Cburst%252Cfactor%26fexp%3D902303%252C906712%26algorithm%3Dthrottle-factor%26itag%3D5%26ipbits%3D8%26burst%3D40%26sver%3D3%26expire%3D1276203600%26key%3Dyt1%26signature%3D42F8774F51ED24983133B8D8F797908F97D8C371.3B0C17A6728074833130840B82BE167F4CA1035D%26factor%3D1.25%26id%3Db9493e8e24226592&amp;rv.2.rating=4.88311688312&amp;shownextbutton=1&amp;rv.1.id=PzeRpPSZOjI&amp;rv.4.length_seconds=228&amp;ad_logging_flag=1&amp;rv.7.view_count=3940&amp;rv.6.length_seconds=253&amp;length_seconds=295&amp;fmt_map=34%2F0%2F9%2F0%2F115%2C5%2F0%2F7%2F0%2F0&amp;enablejsapi=1&amp;video_id=VIDEOCODE&amp;plid=AASIrYqnNA1liVSJ&amp;afv=True&amp;rv.5.rating=4.98&amp;ad_tag=http%3A%2F%2Fad-g.doubleclick.net%2Fpfadx%2Fcom.ytpwatch.music%2Fmain_6%3Bsz%3DWIDTHxHEIGHT%3Bmpvid%3DAASIrYqpBw0C8F4n%3B%21c%3D6%3Bytexp%3D902303.906712%3Bytps%3Ddefault%3Bklg%3Den%3Bkvid%3DVIDEOCODE%3Bctb%3D1%3Bkt%3DK%3Bko%3Dc%3Bkpid%3D6%3Bkga%3D-1%3Bkr%3DN%3Bshortform%3D1%3Bu%3DVIDEOCODE%7C6%3Bkgg%3D-1%3Bkcr%3Dca%3Bafv%3D1%3Bkhd%3D0%3Bdc_dedup%3D1%3Bkpu%3Desther1208%3B&amp;ad_video_pub_id=ca-pub-6219811747049371&amp;rv.4.url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DzI9C9j0QgU4&amp;rv.1.author=0rganix&amp;rv.1.rating=4.97674418605&amp;rv.5.thumbnailUrl=http%3A%2F%2Fi3.ytimg.com%2Fvi%2F6oHEgkK9wj0%2Fdefault.jpg&amp;watermark=http%3A%2F%2Fs.ytimg.com%2Fyt%2Fswf%2Flogo-vfl106645.swf%2Chttp%3A%2F%2Fs.ytimg.com%2Fyt%2Fswf%2Fhdlogo-vfl100714.swf&amp;rv.7.rating=4.73333333333&amp;rv.3.url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D663CI_o4sTY&amp;rv.2.url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DIFhhaXDziZ4&amp;cid=6&amp;rv.7.url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DP5y-yjheRKE&amp;rv.2.view_count=31320&amp;ad_channel_code_overlay=invideo_overlay_480x70_cat10%2Cafv_overlay%2Cafv_ugc%2Cytps_default%2Cyt_mpvid_AASIrYqpBw0C8F4n%2Cyt_cid_6%2Cytexp_902303.906712&amp;rv.4.view_count=1325763&amp;ad_module=http%3A%2F%2Fs.ytimg.com%2Fyt%2Fswf%2Fad-vfl170492.swf&amp;rv.1.view_count=22657&amp;dclk=True&amp;rv.6.rating=5.0&amp;sk=lsWSaZl1UFLCUxUw44Lon-hoi_2GTCy-C&amp;ctb=True&amp;rv.1.thumbnailUrl=http%3A%2F%2Fi1.ytimg.com%2Fvi%2FPzeRpPSZOjI%2Fdefault.jpg&amp;mpvid=AASIrYqpBw0C8F4n&amp;rv.3.length_seconds=330&amp;rv.5.author=Ulrick31&amp;rv.4.rating=4.90052939537" allowscriptaccess="always" allowfullscreen="true" bgcolor="#000000" />';
    25       document.write('<title>YouTube Full Screen</title>');
    26       document.write(embedded.replace(/VIDEOCODE/g, videocode));
    27 
    28     </script>
    29   </head>
     3    <head>
     4        <style type="text/css">
     5            body {
     6                padding: 0;
     7                margin: 0;
     8            }
     9        </style>
     10
     11        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>
     12        <script type="text/javascript">
     13            /* gup function by R.D. Vaughan */
     14            function gup( name )
     15            {
     16                name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
     17                var regexS = "[\\?&]"+name+"=([^&#]*)";
     18                var regex = new RegExp( regexS );
     19                var results = regex.exec( window.location.href );
     20                if( results == null )
     21                    return "";
     22                else
     23                    return results[1];
     24            }
     25
     26            var myth_player = null;
     27
     28            var params = {
     29                allowScriptAccess: "always",
     30                allowfullscreen: 'true',
     31                wmode: 'opaque'
     32            };
     33            var atts = { id: "myytplayer" };
     34            swfobject.embedSWF("http://www.youtube.com/apiplayer?enablejsapi=1&playerapiid=ytplayer",
     35                               "myth_player", window.innerWidth, window.innerHeight, "8", null, null, params, atts);
     36
     37            function onYouTubePlayerReady(playerId) {
     38                myth_player = document.getElementById("myytplayer");
     39                myth_player.setVolume(50);
     40                var videocode = gup('videocode');
     41                if (videocode != "") {
     42                    myth_player.cueVideoById(videocode);
     43                    myth_player.playVideo();
     44                }
     45            }
     46
     47            function play() {
     48                if (myth_player) {
     49                    var state = myth_player.getPlayerState();
     50                    if (state == 1) // Playing
     51                        myth_player.pauseVideo();
     52                    else if (state != 3) // Video is either unstarted, ended, paused or cued
     53                        myth_player.playVideo();
     54                }
     55            }
     56
     57            function seek(amount) {
     58                if (myth_player) {
     59                    myth_player.seekTo(myth_player.getCurrentTime() + amount, true);
     60                }
     61            }
     62
     63            function adjustVolume(amount) {
     64                if (myth_player) {
     65                    myth_player.setVolume(myth_player.getVolume() + amount);
     66                }
     67            }
     68
     69            window.onresize = function() {
     70                document.body.style.width = window.innerWidth;
     71                document.body.style.height = window.innerHeight;
     72                if (myth_player) {
     73                    //             myth_player.setSize(window.innerWidth, window.innerHeight);
     74                    document.getElementById("myytplayer").width = window.innerWidth;
     75                    document.getElementById("myytplayer").height = window.innerHeight;
     76                }
     77            };
     78        </script>
     79    </head>
     80    <body>
     81        <div id="myth_player"/>
     82    </body>
    3083</html>
  • mythtv/programs/scripts/internetcontent/nv_python_libs/vimeo/vimeo_api.py

    diff --git a/mythtv/programs/scripts/internetcontent/nv_python_libs/vimeo/vimeo_api.py b/mythtv/programs/scripts/internetcontent/nv_python_libs/vimeo/vimeo_api.py
    index 572e180..5fa3bad 100644
    a b import pycurl 
    6161import xml.etree.ElementTree as ET
    6262import inspect
    6363import oauth.oauth_api as oauth
     64from MythTV import MythXML
    6465
    6566from vimeo_exceptions import (VimeoUrlError, VimeoHttpError, VimeoResponseError, VimeoVideoNotFound, VimeoRequestTokenError, VimeoAuthorizeTokenError, VimeoVideosSearchError, VimeoAllChannelError, __errmsgs__)
    6667
    class Videos(object): 
    669670
    670671        """
    671672        self.config = {}
     673        self.mythxml = MythXML()
    672674
    673675        self.config['debug_enabled'] = debug # show debugging messages
    674676
    class Videos(object): 
    886888
    887889    # end initializeVimeo()
    888890
     891    def processVideoUrl(self, url):
     892        playerUrl = self.mythxml.getInternetContentUrl("nv_python_libs/configs/HTML/vimeo.html", \
     893                                                       url.replace(u'http://vimeo.com/', ''))
     894        return self.ampReplace(playerUrl)
    889895
    890896    def searchTitle(self, title, pagenumber, pagelen):
    891897        '''Key word video search of the vimeo.com web site
    class Videos(object): 
    980986                        if url.get('type') == 'video':
    981987                            if url.text: # Make the link fullscreen and auto play
    982988                                if embed_flag:
    983                                     v_details[url.tag] = self.ampReplace(url.text.strip().replace(u'http://vimeo.com/', u'http://vimeo.com/moogaloop.swf?clip_id=')+u'&autoplay=1')
     989                                    v_details[url.tag] = self.processVideoUrl(url.text.strip())
    984990                                else:
    985991                                    v_details[url.tag] = self.ampReplace(url.text.strip())
    986992                            else:
    class Videos(object): 
    13781384                        if url.get('type') == 'video':
    13791385                            if url.text: # Make the link fullscreen and auto play
    13801386                                if embed_flag:
    1381                                     v_details[url.tag] = self.ampReplace(url.text.strip().replace(u'http://vimeo.com/', u'http://vimeo.com/moogaloop.swf?clip_id=')+u'&autoplay=1')
     1387                                    v_details[url.tag] = self.processVideoUrl(url.text.strip())
    13821388                                else:
    13831389                                    v_details[url.tag] = self.ampReplace(url.text.strip())
    13841390                            else:
  • mythtv/programs/scripts/internetcontent/nv_python_libs/youtube/youtube_api.py

    diff --git a/mythtv/programs/scripts/internetcontent/nv_python_libs/youtube/youtube_api.py b/mythtv/programs/scripts/internetcontent/nv_python_libs/youtube/youtube_api.py
    index 70d8a82..fe70938 100644
    a b __version__="v0.2.5" 
    3838import os, struct, sys, re, time
    3939import urllib, urllib2
    4040import logging
     41from MythTV import MythXML
    4142
    4243try:
    4344    import xml.etree.cElementTree as ElementTree
    class Videos(object): 
    148149
    149150        """
    150151        self.config = {}
     152        self.mythxml = MythXML()
    151153
    152154        if apikey is not None:
    153155            self.config['apikey'] = apikey
    class Videos(object): 
    522524                                continue
    523525                            if not elem.get(key) == '5':
    524526                                continue
    525                             item['video'] = self.ampReplace((elem.get('url')+'&autoplay=1'))
     527                            self.processVideoUrl(item, elem)
    526528                            flash = True
    527529                        continue
    528530            if not item.has_key('video'):
    class Videos(object): 
    715717        return [[self.channel, dictionaries]]
    716718    # end displayTreeView()
    717719
     720    def processVideoUrl(self, item, elem):
     721        '''Processes elem.get('url') to either use a custom HTML page served by
     722        the backend, or include '&autoplay=1'
     723        '''
     724        m = re.search('/v/([^?]+)', elem.get('url'))
     725        if m:
     726            url = self.mythxml.getInternetContentUrl("nv_python_libs/configs/HTML/youtube.html", \
     727                                                     m.group(1))
     728            item['video'] = self.ampReplace(url)
     729        else:
     730            item['video'] = self.ampReplace((elem.get('url')+'&autoplay=1'))
     731
    718732    def makeURL(self, URL):
    719733        '''Form a URL to search for videos
    720734        return a URL
    class Videos(object): 
    868882                            if not elem.get(key) == '5':
    869883                                continue
    870884                            if elem.get('url'):
    871                                 metadata['video'] = self.ampReplace((elem.get('url')+'&amp;autoplay=1'))
     885                                self.processVideoUrl(metadata, elem)
    872886                                flash = True
    873887                        continue
    874888