Compare commits

...

3 commits

Author SHA1 Message Date
j
b9c464b7a1 work around browser playback restrictions 2025-02-01 16:03:27 +05:30
j
57a0c3a032 some browsers / devices only support yuv420p 2025-02-01 16:03:06 +05:30
j
56fa0986be unify video element 2025-02-01 16:00:42 +05:30
8 changed files with 55 additions and 8 deletions

View file

@ -202,10 +202,16 @@ class Content(models.Model):
video_path = self.photo.image.path.replace('.gif', '.mp4') video_path = self.photo.image.path.replace('.gif', '.mp4')
image_path = self.photo.image.path.replace('.gif', '.jpg') image_path = self.photo.image.path.replace('.gif', '.jpg')
if not os.path.exists(video_path): if not os.path.exists(video_path):
height = self.photo.image.height
if height % 2:
height += 1
cmd = [ cmd = [
'ffmpeg', 'ffmpeg',
'-hide_banner', '-nostats', '-loglevel', 'error', '-hide_banner', '-nostats', '-loglevel', 'error',
'-i', self.photo.image.path, video_path '-i', self.photo.image.path,
'-vf', 'scale=-2:%s' % height,
'-pix_fmt', 'yuv420p',
video_path
] ]
subprocess.call(cmd) subprocess.call(cmd)
if not os.path.exists(image_path): if not os.path.exists(image_path):
@ -217,6 +223,11 @@ class Content(models.Model):
subprocess.call(cmd) subprocess.call(cmd)
return self.photo.image.url.replace('.gif', '.mp4') return self.photo.image.url.replace('.gif', '.mp4')
@cached_property
def video_gif(self):
html = '<video autoplay loop mouted playsinline src="%s" class="gif"></video>' % self.video_url
return mark_safe(html)
@cached_property @cached_property
def image_url(self): def image_url(self):
if self.photo: if self.photo:

View file

@ -9,7 +9,7 @@
<title>CAMP</title> <title>CAMP</title>
{% endblock %} {% endblock %}
<link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=Open+Sans"/> <link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=Open+Sans"/>
<link rel="stylesheet" type="text/css" href="{% static "css/foundation.css" %}"> <link rel="stylesheet" type="text/css" href="{% static "css/foundation.css" %}?20250201">
<link rel="stylesheet" type="text/css" href="{% static "css/jquery.bxslider.css" %}"> <link rel="stylesheet" type="text/css" href="{% static "css/jquery.bxslider.css" %}">
<link rel="stylesheet" type="text/css" href="{% static "css/main.css" %}"> <link rel="stylesheet" type="text/css" href="{% static "css/main.css" %}">
<link rel="stylesheet" type="text/css" href="{% static "css/app.css" %}"> <link rel="stylesheet" type="text/css" href="{% static "css/app.css" %}">
@ -117,6 +117,42 @@
}); });
} }
$(document).ready(loadSlideshow); $(document).ready(loadSlideshow);
var restrictedElements = [];
function removeBehaviorsRestrictions(event) {
if (restrictedElements.length > 0) {
var rElements = restrictedElements;
restrictedElements = [];
rElements.forEach(function(video) {
if (video.autoplay && video.paused) {
video.load()
video.play()
if (video.paused) {
restrictedElements.push(video)
}
} else if (video.readyState < 4) {
video.load()
}
});
}
}
if (document.querySelector('video')) {
let video = document.createElement('video');
video.muted = true
video.play();
if (video.paused) {
restrictedElements = document.querySelectorAll('video.gif')
window.addEventListener('keydown', removeBehaviorsRestrictions);
window.addEventListener('mousedown', removeBehaviorsRestrictions);
window.addEventListener('touchstart', removeBehaviorsRestrictions);
restrictedElements.forEach(video => {
if (!video.poster) {
video.poster = video.src.replace('.mp4', '.jpg')
video.muted = true
}
})
}
}
</script> </script>
{% block end %} {% block end %}
{% endblock %} {% endblock %}

View file

@ -7,7 +7,7 @@
{% include "edit.html" %} {% include "edit.html" %}
<div class="large-8 medium-8 columns special-column"> <div class="large-8 medium-8 columns special-column">
{% if content.video_url %} {% if content.video_url %}
<video class="gif" autoplay loop src="{{ content.video_url }}"></video> {{ content.video_gif }}
{% elif content.image_url %} {% elif content.image_url %}
<img src="{{ content.image_url }}"> <img src="{{ content.image_url }}">
{% endif %} {% endif %}

View file

@ -17,7 +17,7 @@
<div class="small-6 columns"> <div class="small-6 columns">
<a href="{{ content.get_absolute_url }}"> <a href="{{ content.get_absolute_url }}">
{% if content.video_url %} {% if content.video_url %}
<video class="gif" autoplay loop src="{{ content.video_url }}"></video> {{ content.video_gif }}
{% else %} {% else %}
<img src="{{ content.image_url }}"> <img src="{{ content.image_url }}">
{% endif %} {% endif %}

View file

@ -1,7 +1,7 @@
{% for content in featured %} {% for content in featured %}
<div class="large-8 medium-8 columns special-column"> <div class="large-8 medium-8 columns special-column">
{% if content.video_url %} {% if content.video_url %}
<a href="{{ content.get_absolute_url }}"><video class="gif" autoplay loop src="{{ content.video_url }}"></video></a> <a href="{{ content.get_absolute_url }}">{{ content.video_gif }}</a>
{% elif content.image_url %} {% elif content.image_url %}
<a href="{{ content.get_absolute_url }}"><img src="{{ content.image_url }}"></a> <a href="{{ content.get_absolute_url }}"><img src="{{ content.image_url }}"></a>
{% endif %} {% endif %}

View file

@ -11,7 +11,7 @@
{% else %} {% else %}
<div class="small-6 columns"> <div class="small-6 columns">
{% if content.video_url %} {% if content.video_url %}
<a href="{{ content.get_absolute_url }}"><video class="gif" autoplay loop src="{{ content.video_url }}"></video></a> <a href="{{ content.get_absolute_url }}">{{ content.video_gif }}</a>
{% elif content.image_url %} {% elif content.image_url %}
<a href="{{ content.get_absolute_url }}"><img src="{{ content.image_url }}"></a> <a href="{{ content.get_absolute_url }}"><img src="{{ content.image_url }}"></a>
{% endif %} {% endif %}

View file

@ -26,7 +26,7 @@
<div class="row results"> <div class="row results">
<div class="small-6 medium-4 medium-offset-2 large-2 large-offset-2 columns"> <div class="small-6 medium-4 medium-offset-2 large-2 large-offset-2 columns">
{% if row.video_url %} {% if row.video_url %}
<a href="{{ row.get_absolute_url }}"><video class="gif" autoplay loop src="{{ row.video_url }}"></video></a> <a href="{{ row.get_absolute_url }}">{{ row.video_gif }}</a>
{% elif row.image_url %} {% elif row.image_url %}
<a href="{{ row.get_absolute_url }}"><img src="{{ row.image_url }}"></a> <a href="{{ row.get_absolute_url }}"><img src="{{ row.image_url }}"></a>
{% else %} {% else %}

View file

@ -12,7 +12,7 @@
{% if content.image_url %} {% if content.image_url %}
<div class="small-6 columns"> <div class="small-6 columns">
{% if content.video_url %} {% if content.video_url %}
<video class="gif" autoplay loop src="{{ content.video_url }}"></video> {{ content.video_gif }}
{% elif content.image_url %} {% elif content.image_url %}
<img src="{{ content.image_url }}"> <img src="{{ content.image_url }}">
{% endif %} {% endif %}