forked from rc/aircox
work on player: integrate vuejs + noscript; remove TemplateMixin for Component and ExposedData; rewrite most of the player; clean up files; do lot of other things
This commit is contained in:
@ -1,4 +1,4 @@
|
||||
{% load staticfiles %}
|
||||
{% load static %}
|
||||
{% load i18n %}
|
||||
|
||||
{% load wagtailcore_tags %}
|
||||
@ -26,14 +26,33 @@
|
||||
{% block css_extras %}{% endblock %}
|
||||
{% endblock %}
|
||||
|
||||
{% if settings.DEBUG %}
|
||||
<script src="{% static 'lib/vue.js' %}">
|
||||
{% else %}
|
||||
<script src="{% static 'lib/vue.min.js' %}">
|
||||
{% endif %}
|
||||
|
||||
<script src="{% static 'aircox_cms/js/bootstrap.js' %}"></script>
|
||||
<script src="{% static 'aircox_cms/js/utils.js' %}"></script>
|
||||
<script src="{% static 'aircox_cms/js/player.js' %}"></script>
|
||||
|
||||
<title>{{ page.title }}</title>
|
||||
|
||||
{# TODO: include vues somewhere else #}
|
||||
{% include "aircox_cms/vues/player.html" %}
|
||||
|
||||
<script>
|
||||
window.addEventListener('loaded', function() {
|
||||
new Vue({
|
||||
el: "#app",
|
||||
delimiters: ['${', '}'],
|
||||
});
|
||||
|
||||
}, false);
|
||||
</script>
|
||||
</head>
|
||||
{% spaceless %}
|
||||
<body>
|
||||
<body id="app">
|
||||
<nav class="top">
|
||||
<div class="menu row">
|
||||
{% render_sections position="top" %}
|
||||
|
@ -1,5 +1,6 @@
|
||||
{% extends "aircox_cms/publication.html" %}
|
||||
{% load i18n %}
|
||||
{% load aircox_cms %}
|
||||
|
||||
{% block content_extras %}
|
||||
{% with tracks=page.tracks.all %}
|
||||
@ -32,39 +33,9 @@
|
||||
</section>
|
||||
{% endif %}
|
||||
|
||||
{% with podcasts=self.get_podcasts %}
|
||||
{% if podcasts %}
|
||||
<section class="podcasts list">
|
||||
<h2>{% trans "Podcasts" %}</h2>
|
||||
<div id="player_diff_{{ page.id }}" class="player">
|
||||
{% include 'aircox_cms/snippets/player.html' %}
|
||||
|
||||
<script>
|
||||
var podcasts = new Player('player_diff_{{ page.id }}', undefined, true)
|
||||
{% for item in podcasts %}
|
||||
{% if not item.embed %}
|
||||
podcasts.playlist.add(new Sound(
|
||||
title='{{ item.name|escape }}',
|
||||
detail='{{ item.detail_url }}',
|
||||
duration={{ item.duration|date:"H*3600+i*60+s" }},
|
||||
streams='{{ item.url }}',
|
||||
{% if page and page.cover %}cover='{{ page.icon }}',{% endif %}
|
||||
undefined
|
||||
));
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</script>
|
||||
<p>
|
||||
{% for item in podcasts %}
|
||||
{% if item.embed %}
|
||||
{{ item.embed|safe }}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
{% render_section section=podcasts %}
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
|
@ -20,11 +20,6 @@
|
||||
{% with list_paginator=paginator %}
|
||||
{% include "aircox_cms/snippets/list.html" %}
|
||||
{% endwith %}
|
||||
{% else %}
|
||||
{# detail view #}
|
||||
{% if page.links.count %}
|
||||
{% include "aircox_cms/sections/section_link_list.html" %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
@ -1,4 +1,4 @@
|
||||
{% extends "aircox_cms/sections/section_item.html" %}
|
||||
{% extends "aircox_cms/sections/item.html" %}
|
||||
{% load wagtailimages_tags %}
|
||||
{% load aircox_cms %}
|
||||
|
@ -1,4 +1,4 @@
|
||||
{% extends "aircox_cms/sections/section_item.html" %}
|
||||
{% extends "aircox_cms/sections/item.html" %}
|
||||
|
||||
{% block content %}
|
||||
{% with url=url url_text=self.url_text %}
|
@ -1,4 +1,4 @@
|
||||
{% extends "aircox_cms/sections/section_item.html" %}
|
||||
{% extends "aircox_cms/sections/item.html" %}
|
||||
|
||||
{% block content %}
|
||||
{% with item_date_format="H:i" list_css_class="date_list" list_no_cover=True list_no_headline=True %}
|
54
aircox_cms/templates/aircox_cms/sections/playlist.html
Executable file
54
aircox_cms/templates/aircox_cms/sections/playlist.html
Executable file
@ -0,0 +1,54 @@
|
||||
{% extends 'aircox_cms/sections/item.html' %}
|
||||
|
||||
{% load staticfiles %}
|
||||
{% load i18n %}
|
||||
{% load aircox_cms %}
|
||||
|
||||
{% block content %}
|
||||
{% with playlist_id="playlist"|gen_id %}
|
||||
<a-playlist class="playlist" id="{{ playlist_id }}">
|
||||
<noscript>
|
||||
{% for track in tracks %}
|
||||
<li class="item">
|
||||
<span class="name">{{ track.name }} ({{ track.duration|date:"H\"i's" }}): </span>
|
||||
<span class="podcast">
|
||||
{% if not track.embed %}
|
||||
<audio src="{{ track.url|escape }}" controls>
|
||||
{% else %}
|
||||
{{ track.embed|safe }}
|
||||
{% endif %}
|
||||
</span>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</noscript>
|
||||
<script>
|
||||
window.addEventListener('load', function() {
|
||||
var playlist = new Playlist({
|
||||
data: {
|
||||
id: "{{ playlist_id }}",
|
||||
{% if is_default %}
|
||||
default: true,
|
||||
{% endif %}
|
||||
{% if single_mode %}
|
||||
single_mode: true,
|
||||
{% endif %}
|
||||
{% if modifiable %}
|
||||
modifiable: true,
|
||||
{% endif %}
|
||||
{% if storage_key %}
|
||||
storage_key: "{{ storage_key }}",
|
||||
{% endif %}
|
||||
tracks: [
|
||||
{% for track in tracks %}
|
||||
new Track({{ track.to_json }}),
|
||||
{% endfor %}
|
||||
],
|
||||
},
|
||||
});
|
||||
playlist.$mount('#{{ playlist_id }}');
|
||||
}, false);
|
||||
</script>
|
||||
</a-playlist>
|
||||
{% endwith %}
|
||||
{% endblock %}
|
||||
|
@ -1,4 +1,4 @@
|
||||
{% extends "aircox_cms/sections/section_item.html" %}
|
||||
{% extends "aircox_cms/sections/item.html" %}
|
||||
{% load i18n %}
|
||||
{% load static %}
|
||||
|
@ -1,4 +1,4 @@
|
||||
{% extends "aircox_cms/sections/section_item.html" %}
|
||||
{% extends "aircox_cms/sections/item.html" %}
|
||||
{% load i18n %}
|
||||
{% load static %}
|
||||
|
@ -1,25 +0,0 @@
|
||||
{% extends 'aircox_cms/sections/section_item.html' %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
<div id="player" class="player">
|
||||
{% include "aircox_cms/snippets/player.html" %}
|
||||
</div>
|
||||
|
||||
<script>
|
||||
var player = new Player('player', '{% url 'aircox.on_air' %}', true);
|
||||
var sound = player.playlist.add(
|
||||
new Sound(
|
||||
'{{ self.live_title }}',
|
||||
'', undefined,
|
||||
streams=[ {% for stream in streams %}'{{ stream }}',{% endfor %} ],
|
||||
cover = undefined,
|
||||
on_air = true
|
||||
), undefined, 0
|
||||
);
|
||||
sound.item.className += ' live';
|
||||
player.playlist.select(sound, false);
|
||||
player.update_on_air();
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
@ -1,4 +1,4 @@
|
||||
{% extends "aircox_cms/sections/section_item.html" %}
|
||||
{% extends "aircox_cms/sections/item.html" %}
|
||||
|
||||
{% block content %}
|
||||
{% include "aircox_cms/snippets/date_list.html" %}
|
@ -1,49 +0,0 @@
|
||||
{% load staticfiles %}
|
||||
{% load i18n %}
|
||||
|
||||
<audio preload="metadata">
|
||||
{% trans "Your browser does not support the <code>audio</code> element." %}
|
||||
{% for stream in streams %}
|
||||
<source src="{{ stream }}" />
|
||||
{% endfor %}
|
||||
</audio>
|
||||
|
||||
<div class="playlist">
|
||||
<li class='item list_item flex_row' style="display: none;">
|
||||
<div class="button">
|
||||
<img src="" class="cover"/>
|
||||
<img src="{% static "aircox/images/play.png" %}" class="play"
|
||||
title="{% trans "play" %}" />
|
||||
<img src="{% static "aircox/images/pause.png" %}" class="pause"
|
||||
title="{% trans "pause" %}" />
|
||||
<img src="{% static "aircox/images/loading.png" %}" class="loading"
|
||||
title="{% trans "loading..." %}" />
|
||||
</div>
|
||||
|
||||
<div class="flex_item">
|
||||
<h3 class="title flex_item">{{ self.live_title }}</h3>
|
||||
<div class="content flex_row">
|
||||
<span class="info position flex_item"></span>
|
||||
<span class="info duration flex_item"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<span class="actions">
|
||||
<a class="action add" title="{% trans "add to the player" %}">+</a>
|
||||
<a class="action detail" title="{% trans "more informations" %}">➔</a>
|
||||
<a class="action remove" title="{% trans "remove this sound" %}">✖</a>
|
||||
</span>
|
||||
</li>
|
||||
</div>
|
||||
|
||||
<div class="controls">
|
||||
<div class="progress">
|
||||
<!-- <div class="info duration"></span> -->
|
||||
<progress class="flex_item progress" value="0" max="1"></progress>
|
||||
</div>
|
||||
|
||||
<input type="checkbox" class="single" id="player_single_mode">
|
||||
<label for="player_single_mode" class="info"
|
||||
title="{% trans "enable and disable single mode" %}">↻</label>
|
||||
</div>
|
||||
|
82
aircox_cms/templates/aircox_cms/vues/player.html
Normal file
82
aircox_cms/templates/aircox_cms/vues/player.html
Normal file
@ -0,0 +1,82 @@
|
||||
{% load staticfiles %}
|
||||
{% load i18n %}
|
||||
|
||||
<script type="text/x-template" id="template-sound">
|
||||
<div class="sound">
|
||||
<audio preload="metadata" ref="audio"
|
||||
@pause="state = State.Stop"
|
||||
@playing="state = State.Play"
|
||||
@ended="ended"
|
||||
@timeupdate="timeUpdate"
|
||||
>
|
||||
<source v-for="source in track.sources" :src="source">
|
||||
</audio>
|
||||
<img :src="track.cover" v-if="track.cover" class="icon cover">
|
||||
<button class="button" @click="play_stop">
|
||||
<img class="icon pause"
|
||||
src="{% static "aircox/images/pause.png" %}"
|
||||
title="{% trans "Click to pause" %}"
|
||||
v-if="state === State.Play" >
|
||||
<img class="icon loading"
|
||||
src="{% static "aircox/images/loading.png" %}"
|
||||
title="{% trans "Loading... Click to pause" %}"
|
||||
v-else-if="state === State.Loading" >
|
||||
<img class="icon play"
|
||||
src="{% static "aircox/images/play.png" %}"
|
||||
title="{% trans "Click to play" %}"
|
||||
v-else >
|
||||
</button>
|
||||
<div>
|
||||
<h3>
|
||||
<a :href="detail_url">[[ track.name ]]</a>
|
||||
</h3>
|
||||
<span v-if="track.duration" class="info">
|
||||
[[ (track.duration[0] && track.duration[0] + '"') || '' ]]
|
||||
[[ track.duration[1] + "'" + track.duration[2] ]]
|
||||
</span>
|
||||
</div>
|
||||
<div class="actions">
|
||||
<a class="action remove"
|
||||
title="{% trans "Remove from playlist" %}"
|
||||
v-if="this.$parent.modifiable"
|
||||
@click="remove"
|
||||
>✖</a>
|
||||
<a class="action add"
|
||||
title="{% trans "Add to my playlist" %}"
|
||||
@click="add_to_playlist"
|
||||
v-else
|
||||
>+</a>
|
||||
</div>
|
||||
<div class="content flex_row" v-show="track.duration != null">
|
||||
<span v-if="seek_position !== null">[[ seek_position ]]</span>
|
||||
<span v-else>[[ position ]]</span>
|
||||
<progress class="flex_item progress" ref="progress"
|
||||
v-show="track.duration"
|
||||
v-on:click.prevent="progress_clicked"
|
||||
v-on:mousemove = "progress_mouse_move"
|
||||
v-on:mouseout = "progress_mouse_out"
|
||||
:value="position" :max="duration"
|
||||
></progress>
|
||||
</div>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
|
||||
<script type="text/x-template" id="template-playlist">
|
||||
<div class="playlist">
|
||||
<a-sound v-for="track in tracks" ref="sounds"
|
||||
:id="track.id" :track="track"
|
||||
@ended="sound_ended"
|
||||
@beforeDestroy="sound_ended"
|
||||
/>
|
||||
|
||||
<div v-show="tracks.length > 1" class="playlist_footer">
|
||||
<input type="checkbox" class="single" id="[[ playlist ]]_single_mode"
|
||||
value="true" v-model="single_mode">
|
||||
<label for="[[ playlist ]]_single_mode" class="info"
|
||||
title="{% trans "Enable and disable single mode" %}">↻</label>
|
||||
</div>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
|
Reference in New Issue
Block a user