feat(convert): ajoute la fouille des fichiers image et video

master
François Poulain 2 years ago
parent d020005721
commit 11114ce004
  1. 59
      drupal2spip_lal/base/convert.py
  2. 1
      requirements/base.txt

@ -1,3 +1,4 @@
import json
import logging
import os
import re
@ -12,6 +13,7 @@ from django.utils.timezone import make_aware, now
import mediafile
import request
from bs4 import BeautifulSoup as bs
from PIL import Image
from drupal2spip_lal.drupal import models as drupal
from drupal2spip_lal.spip import models as spip
@ -54,6 +56,16 @@ def strong_to_dl(html):
return '\n'.join(r)
def probe_video(path):
with Popen(
['ffprobe', '-print_format', 'json', '-show_streams', path],
stdout=PIPE,
stderr=PIPE,
) as proc:
streams = json.load(proc.stdout)['streams']
return [s for s in streams if s["codec_type"] == "video"]
def download(src, filename, force_download):
if src and src.startswith('/'):
src = 'http://{}{}'.format(settings.DRUPAL_FQDN, src)
@ -345,6 +357,10 @@ def convert_node(node, options):
fetch_and_remove_logo(article, force_download)
#
# Terms
#######
for term_node in node.termnode_set.all():
groupe, _ = spip.GroupesMots.objects.get_or_create(
titre=term_node.data.theme.name,
@ -363,6 +379,10 @@ def convert_node(node, options):
mot=mot, id_objet=article.pk, objet='article'
)
#
# Uploads
#########
images_mimes = [
'image/png',
'image/jpeg',
@ -387,6 +407,8 @@ def convert_node(node, options):
'media': 'file',
'extension': extension,
'fichier': fichier,
}
document_defaults = {
'titre': upload.description,
'date': convert_timestamp(upload.file.timestamp),
'taille': upload.file.filesize,
@ -394,32 +416,41 @@ def convert_node(node, options):
'mode': 'image' if is_image else 'document',
}
if is_image:
document_attributes['media'] = 'image'
document_attributes['hauteur'] = 1
document_attributes['largeur'] = 1
document_defaults['media'] = 'image'
try:
m = Image.open(path)
document_defaults['hauteur'] = m.height
document_defaults['largeur'] = m.width
except Exception as e:
logger.warn('Echec de lecture: {}'.format(e))
elif is_audio:
document_attributes['media'] = 'audio'
document_defaults['media'] = 'audio'
try:
m = mediafile.MediaFile(path)
document_attributes['duree'] = m.length
document_defaults['duree'] = m.length
if m.artist and m.album:
document_attributes['credits'] = '{} / {}'.format(
document_defaults['credits'] = '{} / {}'.format(
m.artist, m.album
)
elif m.artist:
document_attributes['credits'] = m.artist
document_defaults['credits'] = m.artist
elif m.album:
document_attributes['credits'] = m.album
document_defaults['credits'] = m.album
except Exception as e:
logger.warn('Echec de lecture: {}'.format(e))
elif is_video:
document_attributes['media'] = 'video'
document_attributes['duree'] = 1
document_attributes['hauteur'] = 1
document_attributes['largeur'] = 1
document_defaults['media'] = 'video'
try:
m = probe_video(path)[0]
document_defaults['duree'] = float(m.get('duration', 0))
document_defaults['hauteur'] = m.get('height', 0)
document_defaults['largeur'] = m.get('width', 0)
except Exception as e:
logger.warn('Echec de lecture: {}'.format(e))
document, _ = spip.Documents.objects.get_or_create(
**document_attributes, defaults={'maj': now},
document, _ = spip.Documents.objects.update_or_create(
**document_attributes,
defaults={**document_defaults, 'maj': now},
)
spip.DocumentsLiens.objects.get_or_create(
document=document,

@ -19,3 +19,4 @@ colorlog
# Media
# ------------------------------------------------------------------------------
mediafile
pillow

Loading…
Cancel
Save