mirror of
https://github.com/Alexander-D-Karpov/akarpov
synced 2024-11-22 06:16:34 +03:00
added og meta tegs
This commit is contained in:
parent
3a172e558a
commit
4c2a00a06a
|
@ -80,3 +80,20 @@
|
||||||
| source_code
|
| source_code
|
||||||
| fonts_ext
|
| fonts_ext
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
"video": {
|
||||||
|
"mp4": video.basic.meta,
|
||||||
|
"ogg": video.basic.meta,
|
||||||
|
"mpeg": video.basic.meta,
|
||||||
|
"quicktime": video.basic.meta,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
meta_extensions = {
|
||||||
|
"mp4": video.basic.meta,
|
||||||
|
"mov": video.basic.meta,
|
||||||
|
"ogv": video.basic.meta,
|
||||||
|
"mpeg": video.basic.meta,
|
||||||
|
}
|
||||||
|
|
|
@ -63,3 +63,29 @@ def view(file: File) -> (str, str):
|
||||||
)
|
)
|
||||||
|
|
||||||
return static, content
|
return static, content
|
||||||
|
|
||||||
|
|
||||||
|
def meta(file: File):
|
||||||
|
descr = ""
|
||||||
|
i = 0
|
||||||
|
with file.file.open("r") as f:
|
||||||
|
lines = f.readlines()
|
||||||
|
for line in lines:
|
||||||
|
descr += line + "\n"
|
||||||
|
i += 1
|
||||||
|
if i > 100:
|
||||||
|
descr += "..."
|
||||||
|
break
|
||||||
|
url = file.get_absolute_url()
|
||||||
|
|
||||||
|
meat_f = f"""
|
||||||
|
<meta property="og:type" content="article">
|
||||||
|
<meta property="og:title" content="{file.name}">
|
||||||
|
<meta property="og:url" content="{url}">
|
||||||
|
<meta property="og:image" content="">
|
||||||
|
<meta property="og:description" content="{descr}">
|
||||||
|
<meta property="article:author" content="{file.user.username}">
|
||||||
|
<meta property="article:published_time" content="{file.created}">
|
||||||
|
<meta property="article:modified_time" content="{file.modified}">
|
||||||
|
"""
|
||||||
|
return meat_f
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
import ffmpeg
|
||||||
|
|
||||||
from akarpov.files.models import File
|
from akarpov.files.models import File
|
||||||
|
|
||||||
|
|
||||||
|
@ -26,3 +28,51 @@ def view(file: File) -> (str, str):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
return static, content
|
return static, content
|
||||||
|
|
||||||
|
|
||||||
|
def meta(file: File):
|
||||||
|
stream = ffmpeg.probe(file.file.path, select_streams="v")["streams"][0]
|
||||||
|
width = ""
|
||||||
|
height = ""
|
||||||
|
preview = file.preview.url if file.preview else ""
|
||||||
|
url = file.get_absolute_url()
|
||||||
|
description = file.description if file.description else ""
|
||||||
|
if "width" in stream:
|
||||||
|
width = stream["width"]
|
||||||
|
if "height" in stream:
|
||||||
|
height = stream["height"]
|
||||||
|
|
||||||
|
meat_f = f"""
|
||||||
|
<meta property="og:site_name" content="akarpov">
|
||||||
|
<meta property="og:url" content="{url}">
|
||||||
|
<meta property="og:title" content="{file.name}">
|
||||||
|
<meta property="og:image" content="{preview}">
|
||||||
|
|
||||||
|
<meta property="og:description" content="{description}">
|
||||||
|
|
||||||
|
<meta property="og:type" content="video">
|
||||||
|
<meta property="og:video:url" content="{file.file.url}">
|
||||||
|
<meta property="og:video:secure_url" content="{file.file.url}">
|
||||||
|
<meta property="og:video:type" content="{file.file_type}">
|
||||||
|
<meta property="og:video:width" content="1280">
|
||||||
|
<meta property="og:video:height" content="720">
|
||||||
|
<meta property="og:video:url" content="{file.file.url}">
|
||||||
|
<meta property="og:video:secure_url" content="{file.file.url}">
|
||||||
|
<meta property="og:video:type" content="{file.file_type}">
|
||||||
|
<meta property="og:video:width" content="{width}">
|
||||||
|
<meta property="og:video:height" content="{height}">
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="player">
|
||||||
|
<meta name="twitter:site" content="{url}">
|
||||||
|
<meta name="twitter:url" content="{url}">
|
||||||
|
<meta name="twitter:title" content="{file.name}">
|
||||||
|
<meta name="twitter:description" content="{file.description}">
|
||||||
|
<meta name="twitter:image" content="{preview}">
|
||||||
|
<meta name="twitter:app:name:iphone" content="Akarpov">
|
||||||
|
<meta name="twitter:app:name:ipad" content="Akarpov">
|
||||||
|
<meta name="twitter:app:name:googleplay" content="Akarpov">
|
||||||
|
<meta name="twitter:player" content="{file.file.url}">
|
||||||
|
<meta name="twitter:player:width" content="{width}">
|
||||||
|
<meta name="twitter:player:height" content="{height}">
|
||||||
|
"""
|
||||||
|
return meat_f
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
import structlog
|
import structlog
|
||||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
from django.core.exceptions import PermissionDenied
|
from django.core.exceptions import PermissionDenied
|
||||||
|
from django.http import HttpResponseRedirect
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.views.generic import DetailView, ListView, RedirectView, UpdateView
|
from django.views.generic import DetailView, ListView, RedirectView, UpdateView
|
||||||
|
@ -16,7 +17,7 @@
|
||||||
)
|
)
|
||||||
from akarpov.files.forms import FileForm
|
from akarpov.files.forms import FileForm
|
||||||
from akarpov.files.models import File, Folder
|
from akarpov.files.models import File, Folder
|
||||||
from akarpov.files.previews import extensions, previews
|
from akarpov.files.previews import extensions, meta, meta_extensions, previews
|
||||||
|
|
||||||
logger = structlog.get_logger(__name__)
|
logger = structlog.get_logger(__name__)
|
||||||
|
|
||||||
|
@ -58,11 +59,21 @@ class FileView(DetailView):
|
||||||
model = File
|
model = File
|
||||||
slug_field = "slug"
|
slug_field = "slug"
|
||||||
|
|
||||||
|
def dispatch(self, request, *args, **kwargs):
|
||||||
|
# redirect if bot
|
||||||
|
file = self.get_object()
|
||||||
|
useragent = request.META["HTTP_USER_AGENT"].lower()
|
||||||
|
if "bot" in useragent:
|
||||||
|
if file.file_type and file.file_type.split("/")[0] == "image":
|
||||||
|
return HttpResponseRedirect(file.file.url)
|
||||||
|
return super().dispatch(request, *args, **kwargs)
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super().get_context_data(**kwargs)
|
||||||
context["has_perm"] = self.object.user == self.request.user
|
context["has_perm"] = self.object.user == self.request.user
|
||||||
static = ""
|
static = ""
|
||||||
content = ""
|
content = ""
|
||||||
|
meta_s = ""
|
||||||
extension = self.object.file.path.split(".")[-1]
|
extension = self.object.file.path.split(".")[-1]
|
||||||
try:
|
try:
|
||||||
if self.object.file_type:
|
if self.object.file_type:
|
||||||
|
@ -76,10 +87,23 @@ def get_context_data(self, **kwargs):
|
||||||
static, content = extensions[extension](self.object)
|
static, content = extensions[extension](self.object)
|
||||||
elif extension in extensions:
|
elif extension in extensions:
|
||||||
static, content = extensions[extension](self.object)
|
static, content = extensions[extension](self.object)
|
||||||
|
|
||||||
|
if self.object.file_type:
|
||||||
|
t1, t2 = self.object.file_type.split("/")
|
||||||
|
loaded = False
|
||||||
|
if t1 in meta:
|
||||||
|
if t2 in meta[t1]:
|
||||||
|
meta_s = meta[t1][t2](self.object)
|
||||||
|
loaded = True
|
||||||
|
if not loaded and extension in meta_extensions:
|
||||||
|
meta_s = meta_extensions[extension](self.object)
|
||||||
|
elif extension in meta_extensions:
|
||||||
|
meta_s = meta_extensions[extension](self.object)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(e)
|
logger.error(e)
|
||||||
context["preview_static"] = static
|
context["preview_static"] = static
|
||||||
context["preview_content"] = content
|
context["preview_content"] = content
|
||||||
|
context["meta"] = meta_s
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
|
BIN
akarpov/static/images/logo.jpg
Normal file
BIN
akarpov/static/images/logo.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 48 KiB |
|
@ -1,5 +1,11 @@
|
||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
{% block title %}sanspie: akarpov{% endblock title %}
|
{% block title %}sanspie: akarpov{% endblock title %}
|
||||||
|
|
||||||
|
{% block meta %}
|
||||||
|
<meta itemprop="description" content="about sanspie">
|
||||||
|
<meta property="og:description" content="about sanspie">
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block css %}
|
{% block css %}
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/devicons/devicon@latest/devicon.min.css">
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/devicons/devicon@latest/devicon.min.css">
|
||||||
<script src="https://kit.fontawesome.com/87f586cb23.js" crossorigin="anonymous"></script>
|
<script src="https://kit.fontawesome.com/87f586cb23.js" crossorigin="anonymous"></script>
|
||||||
|
|
|
@ -6,8 +6,16 @@
|
||||||
<meta http-equiv="x-ua-compatible" content="ie=edge">
|
<meta http-equiv="x-ua-compatible" content="ie=edge">
|
||||||
<title>{% block title %}akarpov{% endblock title %}</title>
|
<title>{% block title %}akarpov{% endblock title %}</title>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<meta name="description" content="My collection of apps and tools">
|
<!-- Facebook Meta Tags -->
|
||||||
<meta name="author" content="sanspie">
|
<meta property="og:title" content="sanspie's site" />
|
||||||
|
<meta property="og:site_name" content="akarpov.ru"/>
|
||||||
|
<meta property="og:image" content="{% static 'images/logo.jpg' %}" />
|
||||||
|
<meta property="og:image:width" content="32" />
|
||||||
|
<meta property="og:image:height" content="32" />
|
||||||
|
<meta property="og:type" content="website" />
|
||||||
|
<meta property="og:image" content="">
|
||||||
|
{% block meta %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
<link rel="icon" href="{% static 'images/favicons/favicon.ico' %}">
|
<link rel="icon" href="{% static 'images/favicons/favicon.ico' %}">
|
||||||
|
|
||||||
|
@ -28,6 +36,7 @@
|
||||||
{% endblock javascript %}
|
{% endblock javascript %}
|
||||||
<script defer src="{% static 'js/bootstrap.bundle.min.js' %}" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
<script defer src="{% static 'js/bootstrap.bundle.min.js' %}" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||||
<script defer src="{% static 'js/project.js' %}"></script>
|
<script defer src="{% static 'js/project.js' %}"></script>
|
||||||
|
<noscript><h1 style="text-align: center">In order to use site properly enable JavaScript!</h1></noscript>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
|
@ -1,11 +1,18 @@
|
||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
|
{% block meta %}
|
||||||
|
{% autoescape off %}
|
||||||
|
{{ meta }}
|
||||||
|
{% endautoescape %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block javascript %}
|
{% block javascript %}
|
||||||
{% autoescape off %}
|
{% autoescape off %}
|
||||||
{{ preview_static }}
|
{{ preview_static }}
|
||||||
{% endautoescape %}
|
{% endautoescape %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row m-2">
|
<div class="row m-2">
|
||||||
<h1 class="fs-1 text-break mb-4">{{ file.name }}
|
<h1 class="fs-1 text-break mb-4">{{ file.name }}
|
||||||
|
|
11
local.yml
11
local.yml
|
@ -18,9 +18,6 @@ services:
|
||||||
- mailhog
|
- mailhog
|
||||||
volumes:
|
volumes:
|
||||||
- .:/app:z
|
- .:/app:z
|
||||||
- type: bind
|
|
||||||
source: ./akarpov/media/
|
|
||||||
target: /app/akarpov/media/
|
|
||||||
env_file:
|
env_file:
|
||||||
- ./.envs/.local/.django
|
- ./.envs/.local/.django
|
||||||
- ./.envs/.local/.postgres
|
- ./.envs/.local/.postgres
|
||||||
|
@ -54,10 +51,6 @@ services:
|
||||||
<<: *django
|
<<: *django
|
||||||
image: akarpov_local_celeryworker
|
image: akarpov_local_celeryworker
|
||||||
container_name: akarpov_local_celeryworker
|
container_name: akarpov_local_celeryworker
|
||||||
volumes:
|
|
||||||
- type: bind
|
|
||||||
source: ./akarpov/media/
|
|
||||||
target: /app/akarpov/media/
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- redis
|
- redis
|
||||||
- postgres
|
- postgres
|
||||||
|
@ -69,10 +62,6 @@ services:
|
||||||
<<: *django
|
<<: *django
|
||||||
image: akarpov_local_celerybeat
|
image: akarpov_local_celerybeat
|
||||||
container_name: akarpov_local_celerybeat
|
container_name: akarpov_local_celerybeat
|
||||||
volumes:
|
|
||||||
- type: bind
|
|
||||||
source: ./akarpov/media/
|
|
||||||
target: /app/akarpov/media/
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- redis
|
- redis
|
||||||
- postgres
|
- postgres
|
||||||
|
|
|
@ -15,6 +15,10 @@ services:
|
||||||
depends_on:
|
depends_on:
|
||||||
- postgres
|
- postgres
|
||||||
- redis
|
- redis
|
||||||
|
volumes:
|
||||||
|
- type: bind
|
||||||
|
source: /var/www/media/
|
||||||
|
target: /app/akarpov/media/
|
||||||
env_file:
|
env_file:
|
||||||
- ./.envs/.production/.django
|
- ./.envs/.production/.django
|
||||||
- ./.envs/.production/.postgres
|
- ./.envs/.production/.postgres
|
||||||
|
@ -36,11 +40,19 @@ services:
|
||||||
|
|
||||||
celeryworker:
|
celeryworker:
|
||||||
<<: *django
|
<<: *django
|
||||||
|
volumes:
|
||||||
|
- type: bind
|
||||||
|
source: /var/www/media/
|
||||||
|
target: /app/akarpov/media/
|
||||||
image: akarpov_production_celeryworker
|
image: akarpov_production_celeryworker
|
||||||
command: /start-celeryworker
|
command: /start-celeryworker
|
||||||
|
|
||||||
celerybeat:
|
celerybeat:
|
||||||
<<: *django
|
<<: *django
|
||||||
|
volumes:
|
||||||
|
- type: bind
|
||||||
|
source: /var/www/media/
|
||||||
|
target: /app/akarpov/media/
|
||||||
image: akarpov_production_celerybeat
|
image: akarpov_production_celerybeat
|
||||||
command: /start-celerybeat
|
command: /start-celerybeat
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user