forked from rc/aircox
		
	on_air
This commit is contained in:
		@ -1,4 +1,5 @@
 | 
				
			|||||||
from django.template.loader import render_to_string
 | 
					from django.template.loader import render_to_string
 | 
				
			||||||
 | 
					from django.http import HttpResponse
 | 
				
			||||||
from django.conf.urls import url
 | 
					from django.conf.urls import url
 | 
				
			||||||
from django.core.urlresolvers import reverse
 | 
					from django.core.urlresolvers import reverse
 | 
				
			||||||
from django.utils.text import slugify
 | 
					from django.utils.text import slugify
 | 
				
			||||||
@ -73,7 +74,7 @@ def part(view, name = None, pattern = None):
 | 
				
			|||||||
    view_.url = url
 | 
					    view_.url = url
 | 
				
			||||||
    return view_
 | 
					    return view_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def template(template_name):
 | 
					def template(name):
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    the decorated function returns a context that is used to
 | 
					    the decorated function returns a context that is used to
 | 
				
			||||||
    render a template value.
 | 
					    render a template value.
 | 
				
			||||||
@ -84,10 +85,10 @@ def template(template_name):
 | 
				
			|||||||
    def wrapper(func):
 | 
					    def wrapper(func):
 | 
				
			||||||
        def view_(cl, request, *args, **kwargs):
 | 
					        def view_(cl, request, *args, **kwargs):
 | 
				
			||||||
            context = func(cl, request, *args, **kwargs)
 | 
					            context = func(cl, request, *args, **kwargs)
 | 
				
			||||||
            if not context and hide_empty:
 | 
					            if not context:
 | 
				
			||||||
                return ''
 | 
					                return ''
 | 
				
			||||||
            context['embed'] = True
 | 
					            context['embed'] = True
 | 
				
			||||||
            return render_to_string(template_name, context, request=request)
 | 
					            return render_to_string(name, context, request=request)
 | 
				
			||||||
        view_.__name__ = func.__name__
 | 
					        view_.__name__ = func.__name__
 | 
				
			||||||
        return view_
 | 
					        return view_
 | 
				
			||||||
    return wrapper
 | 
					    return wrapper
 | 
				
			||||||
 | 
				
			|||||||
@ -24,6 +24,9 @@ Part_.prototype = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  /// parse request result and save in this.stanza
 | 
					  /// parse request result and save in this.stanza
 | 
				
			||||||
  __parse_dom: function() {
 | 
					  __parse_dom: function() {
 | 
				
			||||||
 | 
					    if(self.stanza)
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var doc = document.implementation.createHTMLDocument('xhr').documentElement;
 | 
					    var doc = document.implementation.createHTMLDocument('xhr').documentElement;
 | 
				
			||||||
    doc.innerHTML = this.xhr.responseText;
 | 
					    doc.innerHTML = this.xhr.responseText;
 | 
				
			||||||
    this.stanza = doc;
 | 
					    this.stanza = doc;
 | 
				
			||||||
@ -61,9 +64,10 @@ Part_.prototype = {
 | 
				
			|||||||
    return this;
 | 
					    return this;
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // set selectors. if callback is set, call this callback
 | 
					  // set selectors.
 | 
				
			||||||
  // once data are retrieved with an object of
 | 
					  // * callback: if set, call it once data are downloaded with an object
 | 
				
			||||||
  // `selector_name: select_result`
 | 
					  //   of elements matched with the given selectors only. The object is
 | 
				
			||||||
 | 
					  //   made of `selector_name: select_result` items.
 | 
				
			||||||
  select: function(selectors, callback = undefined) {
 | 
					  select: function(selectors, callback = undefined) {
 | 
				
			||||||
    for(var i in selectors) {
 | 
					    for(var i in selectors) {
 | 
				
			||||||
      selector = selectors[i];
 | 
					      selector = selectors[i];
 | 
				
			||||||
@ -71,15 +75,19 @@ Part_.prototype = {
 | 
				
			|||||||
        selector = [selector]
 | 
					        selector = [selector]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      selector = new Part_.Selector(i, selector[0], selector[1], selector[2])
 | 
					      selector = new Part_.Selector(i, selector[0], selector[1], selector[2])
 | 
				
			||||||
 | 
					      selectors[i] = selector;
 | 
				
			||||||
      this.selectors.push(selector)
 | 
					      this.selectors.push(selector)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(callback) {
 | 
					    if(callback) {
 | 
				
			||||||
      var self = this;
 | 
					      var self = this;
 | 
				
			||||||
      this.actions.push(function() {
 | 
					      this.actions.push(function() {
 | 
				
			||||||
 | 
					        self.__parse_dom();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var r = {}
 | 
					        var r = {}
 | 
				
			||||||
        for(var i in self.selectors)
 | 
					        for(var i in selectors) {
 | 
				
			||||||
          r[i] = self.selectors[i].select(self.stanza);
 | 
					          r[i] = selectors[i].select(self.stanza);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        callback(r);
 | 
					        callback(r);
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -90,8 +98,7 @@ Part_.prototype = {
 | 
				
			|||||||
  map: function(dest) {
 | 
					  map: function(dest) {
 | 
				
			||||||
    var self = this;
 | 
					    var self = this;
 | 
				
			||||||
    this.actions.push(function() {
 | 
					    this.actions.push(function() {
 | 
				
			||||||
      if(!self.stanza)
 | 
					      self.__parse_dom();
 | 
				
			||||||
        self.__parse_dom();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      for(var i = 0; i < self.selectors.length; i++) {
 | 
					      for(var i = 0; i < self.selectors.length; i++) {
 | 
				
			||||||
        selector = self.selectors[i]
 | 
					        selector = self.selectors[i]
 | 
				
			||||||
@ -119,9 +126,7 @@ Part_.Selector = function(name, selector, attribute = null, all = false) {
 | 
				
			|||||||
Part_.Selector.prototype = {
 | 
					Part_.Selector.prototype = {
 | 
				
			||||||
  select: function(obj, use_attr = true) {
 | 
					  select: function(obj, use_attr = true) {
 | 
				
			||||||
    if(!this.all) {
 | 
					    if(!this.all) {
 | 
				
			||||||
      obj = obj.querySelectorAll(this.selector)
 | 
					      obj = obj.querySelector(this.selector)
 | 
				
			||||||
      if(obj)
 | 
					 | 
				
			||||||
        obj = obj[0];
 | 
					 | 
				
			||||||
      return (this.attribute && use_attr && obj) ? obj[this.attribute] : obj;
 | 
					      return (this.attribute && use_attr && obj) ? obj[this.attribute] : obj;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -20,16 +20,13 @@ class Player(sections.Section):
 | 
				
			|||||||
    template_name = 'aircox/website/player.html'
 | 
					    template_name = 'aircox/website/player.html'
 | 
				
			||||||
    live_streams = []
 | 
					    live_streams = []
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    A ListItem objects that display a list of available streams.
 | 
					    ListItem objects that display a list of available streams.
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    #default_sounds
 | 
					    #default_sounds
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @decorators.part
 | 
					    @decorators.part
 | 
				
			||||||
    @decorators.template(template_name = 'aircox/cms/list_item.html')
 | 
					    @decorators.template('aircox/cms/list_item.html')
 | 
				
			||||||
    def on_air(cl, request):
 | 
					    def on_air(cl, request):
 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        View that return what is on air formatted in JSON.
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        qs = programs.Diffusion.get(
 | 
					        qs = programs.Diffusion.get(
 | 
				
			||||||
            now = True,
 | 
					            now = True,
 | 
				
			||||||
            type = programs.Diffusion.Type.normal
 | 
					            type = programs.Diffusion.Type.normal
 | 
				
			||||||
@ -39,22 +36,18 @@ class Player(sections.Section):
 | 
				
			|||||||
            return ''
 | 
					            return ''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        qs = qs[0]
 | 
					        qs = qs[0]
 | 
				
			||||||
        post = models.Diffusion.objects.filter(related = qs)
 | 
					        post = models.Diffusion.objects.filter(related = qs) or \
 | 
				
			||||||
        if not post:
 | 
					               models.Program.objects.filter(related = qs.program)
 | 
				
			||||||
            post = models.Program.objects.filter(related = qs.program)
 | 
					        if post:
 | 
				
			||||||
 | 
					 | 
				
			||||||
        if not post:
 | 
					 | 
				
			||||||
            post = ListItem(title = qs.program.name)
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            post = post[0]
 | 
					            post = post[0]
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            post = ListItem(title = qs.program.name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            'item': post,
 | 
					            'item': post,
 | 
				
			||||||
            'list': sections.List,
 | 
					            'list': sections.List,
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return json.dumps({ 'title': post.title, 'url': post.url() })
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def get_context_data(self, *args, **kwargs):
 | 
					    def get_context_data(self, *args, **kwargs):
 | 
				
			||||||
        context = super().get_context_data(*args, **kwargs)
 | 
					        context = super().get_context_data(*args, **kwargs)
 | 
				
			||||||
        context.update({
 | 
					        context.update({
 | 
				
			||||||
 | 
				
			|||||||
@ -12,7 +12,6 @@
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.player-box {
 | 
					.player-box {
 | 
				
			||||||
    height: 2em;
 | 
					 | 
				
			||||||
    border-top-left-radius: 0.5em;
 | 
					    border-top-left-radius: 0.5em;
 | 
				
			||||||
    border-top-right-radius: 0.5em;
 | 
					    border-top-right-radius: 0.5em;
 | 
				
			||||||
    border: 1px #212121 solid;
 | 
					    border: 1px #212121 solid;
 | 
				
			||||||
@ -47,6 +46,30 @@
 | 
				
			|||||||
            margin-left: -100%;
 | 
					            margin-left: -100%;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#player .on_air {
 | 
				
			||||||
 | 
					    background-color: #414141;
 | 
				
			||||||
 | 
					    box-shadow: inset 0 0 0.2em rgba(0, 0, 0, 0.5);
 | 
				
			||||||
 | 
					    padding: 0.2em;
 | 
				
			||||||
 | 
					    margin: 0.2em 0em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  #player .on_air .title {
 | 
				
			||||||
 | 
					      font-size: 0.8em;
 | 
				
			||||||
 | 
					      display: inline;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  #player .on_air .title:before {
 | 
				
			||||||
 | 
					      content: "{% trans "on air //" %}";
 | 
				
			||||||
 | 
					      color: red;
 | 
				
			||||||
 | 
					      margin: 0.2em;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  #player .on_air a {
 | 
				
			||||||
 | 
					      float: right;
 | 
				
			||||||
 | 
					      color: black;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.playlists {}
 | 
					.playlists {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        .playlists nav {
 | 
					        .playlists nav {
 | 
				
			||||||
@ -77,7 +100,7 @@
 | 
				
			|||||||
    .playlist .item > * {
 | 
					    .playlist .item > * {
 | 
				
			||||||
        display: inline;
 | 
					        display: inline;
 | 
				
			||||||
        margin: 0.2em;
 | 
					        margin: 0.2em;
 | 
				
			||||||
        vertical-align: center;
 | 
					        vertical-align: middle;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    .playlist .item .info {
 | 
					    .playlist .item .info {
 | 
				
			||||||
@ -93,9 +116,13 @@
 | 
				
			|||||||
    .playlist .item[selected] .title {
 | 
					    .playlist .item[selected] .title {
 | 
				
			||||||
        color: #007EDF;
 | 
					        color: #007EDF;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
<div id="player">
 | 
					<div id="player">
 | 
				
			||||||
 | 
					    <li class='item' style="display: none;">
 | 
				
			||||||
 | 
					        <h2 class="title"></h2>
 | 
				
			||||||
 | 
					        <a class="url">+</a>
 | 
				
			||||||
 | 
					        <div class="info"></div>
 | 
				
			||||||
 | 
					    </li>
 | 
				
			||||||
    <div class="player-box">
 | 
					    <div class="player-box">
 | 
				
			||||||
        <div id="embed-player">
 | 
					        <div id="embed-player">
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
@ -112,16 +139,16 @@
 | 
				
			|||||||
            </span>
 | 
					            </span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            <h3 class="title"></h3>
 | 
					            <h3 class="title"></h3>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <div class='item on_air'>
 | 
				
			||||||
 | 
					                <h2 class="title"></h2>
 | 
				
			||||||
 | 
					                <a class="url">+</a>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
    <div class="playlists">
 | 
					    <div class="playlists">
 | 
				
			||||||
        <nav></nav>
 | 
					        <nav></nav>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
    <li class='item' style="display: none;">
 | 
					 | 
				
			||||||
        <h2 class="title"></h2>
 | 
					 | 
				
			||||||
        <a class="detail">+</a>
 | 
					 | 
				
			||||||
        <div class="info"></div>
 | 
					 | 
				
			||||||
    </li>
 | 
					 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
@ -154,7 +181,7 @@ Playlist.prototype = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /// Create an item and add to the given container [ = this.playlist ]
 | 
					    /// Create an item and add to the given container [ = this.playlist ]
 | 
				
			||||||
    add: function (info, container) {
 | 
					    add: function (info, container) {
 | 
				
			||||||
        item = player.player.querySelector('.item');
 | 
					        var item = player.player.querySelector('.item');
 | 
				
			||||||
        item = item.cloneNode(true);
 | 
					        item = item.cloneNode(true);
 | 
				
			||||||
        item.removeAttribute('style');
 | 
					        item.removeAttribute('style');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -167,15 +194,19 @@ Playlist.prototype = {
 | 
				
			|||||||
        item.info = info;
 | 
					        item.info = info;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        item.querySelector('.title').innerHTML = info.title;
 | 
					        item.querySelector('.title').innerHTML = info.title;
 | 
				
			||||||
        item.querySelector('.detail').href = info.url;
 | 
					        item.querySelector('.url').href = info.url;
 | 
				
			||||||
        item.querySelector('.info').innerHTML = info.info || '';
 | 
					        item.querySelector('.info').innerHTML = info.info || '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        item.addEventListener('click', function(event) {
 | 
					        if(info.class)
 | 
				
			||||||
            if(event.target.className.indexOf('detail') != -1)
 | 
					          item.className += " " + info.class;
 | 
				
			||||||
                return;
 | 
					
 | 
				
			||||||
            player.select(event.currentTarget.info);
 | 
					        if(info.stream || info.embed)
 | 
				
			||||||
            event.preventDefault();
 | 
					          item.addEventListener('click', function(event) {
 | 
				
			||||||
        }, true);
 | 
					              if(event.target.className.indexOf('url') != -1)
 | 
				
			||||||
 | 
					                  return;
 | 
				
			||||||
 | 
					              player.select(event.currentTarget.info);
 | 
				
			||||||
 | 
					              event.preventDefault();
 | 
				
			||||||
 | 
					          }, true);
 | 
				
			||||||
        this.items.push(info);
 | 
					        this.items.push(info);
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -227,16 +258,22 @@ player = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        this.select_playlist(this.recents);
 | 
					        this.select_playlist(this.recents);
 | 
				
			||||||
        this.select(this.live.items[0], false)
 | 
					        this.select(this.live.items[0], false)
 | 
				
			||||||
 | 
					        this.update_on_air();
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// update "on_air"
 | 
					    /// update on air informations
 | 
				
			||||||
    get_on_air: function() {
 | 
					    update_on_air: function() {
 | 
				
			||||||
      part = Part('').select({
 | 
					      part = Part('{% url "player_on_air" %}').get()
 | 
				
			||||||
          'title': '.title',
 | 
					          .select({
 | 
				
			||||||
          'url': 'a',
 | 
					            title: '.title',
 | 
				
			||||||
      }, function(r) {
 | 
					            url: ['.url', 'href'],
 | 
				
			||||||
        document.title = r.title;
 | 
					          })
 | 
				
			||||||
      });
 | 
					         .map(this.player.querySelector('.on_air'))
 | 
				
			||||||
 | 
					         .send();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      window.setTimeout(function() {
 | 
				
			||||||
 | 
					        player.update_on_air();
 | 
				
			||||||
 | 
					      }, 60000*5);
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// play a given item { title, src }
 | 
					    /// play a given item { title, src }
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user