]> git.0d.be Git - panikweb-esperanzah.git/commitdiff
add back bonnes-ondes import command, for completeness
authorFrédéric Péters <fpeters@0d.be>
Wed, 21 Jul 2021 08:30:19 +0000 (10:30 +0200)
committerFrédéric Péters <fpeters@0d.be>
Wed, 21 Jul 2021 08:30:19 +0000 (10:30 +0200)
Original history:

commit 6c4a2e9505cd2614f0151850f8f6b5047510e6dc
Author: Frédéric Péters <fpeters@0d.be>
Date:   Sat Jul 21 19:06:21 2018 +0200

    bonnes-ondes: add support for manual audiobank references

commit f505a6da27b6d704cac250e59e26faa14ee07754
Author: Frédéric Péters <fpeters@0d.be>
Date:   Sat Jul 21 17:35:27 2018 +0200

    bonnes ondes: handle unicode image filenames

commit fe79eabdec8eebee03565a807cae260643654290
Author: Frédéric Péters <fpeters@0d.be>
Date:   Sat Jul 21 16:38:26 2018 +0200

    bonnes-ondes: switch importer to textile for formatted texts

commit 173290ee8352efbdc7cc079e3862707328ae3ce5
Author: Frédéric Péters <fpeters@0d.be>
Date:   Sat Jul 21 13:42:22 2018 +0200

    add command to import from bonnes ondes export

panikweb_esperanzah/management/__init__.py [new file with mode: 0644]
panikweb_esperanzah/management/commands/__init__.py [new file with mode: 0644]
panikweb_esperanzah/management/commands/import_bonnes_ondes.py [new file with mode: 0644]

diff --git a/panikweb_esperanzah/management/__init__.py b/panikweb_esperanzah/management/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/panikweb_esperanzah/management/commands/__init__.py b/panikweb_esperanzah/management/commands/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/panikweb_esperanzah/management/commands/import_bonnes_ondes.py b/panikweb_esperanzah/management/commands/import_bonnes_ondes.py
new file mode 100644 (file)
index 0000000..8ee42f2
--- /dev/null
@@ -0,0 +1,87 @@
+# coding: utf-8
+
+import os
+import yaml
+import textile
+from pytz import timezone
+
+from django.core.files import File
+from django.core.management.base import BaseCommand, CommandError
+from django.utils.timezone import make_naive, utc
+
+from emissions.models import Emission, Episode, SoundFile, Diffusion
+
+def construct_ruby_object(loader, suffix, node):
+    return loader.construct_yaml_map(node)
+
+def construct_ruby_sym(loader, node):
+    return loader.construct_yaml_str(node)
+
+yaml.add_multi_constructor(u"!ruby/object:", construct_ruby_object)
+yaml.add_constructor(u"!ruby/sym", construct_ruby_sym)
+
+def get_as_html(text):
+    return textile.textile(text)
+
+class Command(BaseCommand):
+    def add_arguments(self, parser):
+        parser.add_argument('--dirname', metavar='DIRNAME')
+        parser.add_argument('--edition', metavar='EDITION')
+
+    def handle(self, dirname, edition, *args, **kwargs):
+        print dirname, edition
+        emission, created = Emission.objects.get_or_create(
+                slug='edition-%s' % edition,
+                defaults={
+                    'title': u'Édition %s' % edition,
+                    'text': u'<p>Une bien belle année.</p>'
+                })
+        show = yaml.load(open(os.path.join(dirname, 'show.yaml')))
+        emission.title = show['attributes']['name']
+        emission.text = get_as_html(show['attributes']['description'])
+        emission.archived = True
+        emission.save()
+
+        europe_brussels = timezone('Europe/Brussels')
+        episodes = yaml.load(open(os.path.join(dirname, 'episodes.yaml')))
+        images = {}
+        for image_data in yaml.load(open(os.path.join(dirname, 'images.yaml'))):
+            images[image_data['attributes']['id']] = image_data['attributes']['content_uid'].encode('raw_unicode_escape').decode('utf-8')
+
+        episode_ids = {}
+        for episode_data in episodes:
+            episode, created = Episode.objects.get_or_create(
+                    slug=episode_data['attributes']['slug'],
+                    emission=emission,
+                    defaults={
+                        'title': episode_data['attributes']['title'],
+                    })
+            episode.diffusions().delete()
+            broadcasted_at = utc.localize(episode_data['attributes']['broadcasted_at']).astimezone(europe_brussels)
+            Diffusion(episode=episode, datetime=make_naive(broadcasted_at)).save()
+            episode.text = get_as_html(episode_data['attributes']['description'])
+            if not episode.image and episode_data['attributes'].get('image_id'):
+                episode.image = File(open(os.path.join(dirname, 'images', images[episode_data['attributes']['image_id']])))
+            episode.save()
+            episode_ids[episode_data['attributes']['id']] = episode.id
+
+        soundfiles = {}
+        for soundfile_data in yaml.load(open(os.path.join(dirname, 'contents.yaml'))):
+            audiobank_id = soundfile_data['attributes']['audiobank_id']
+            if audiobank_id:
+                filepath = os.path.join(dirname, 'casts', '%s.ogg' % audiobank_id)
+                if not os.path.exists(filepath):
+                    continue
+            audiobank_cast = soundfile_data['attributes'].get('audiobank_cast')
+            if audiobank_cast:
+                filepath = os.path.join(dirname, 'casts', '%s.ogg' % audiobank_cast)
+                if not os.path.exists(filepath):
+                    continue
+            episode = episode_ids[soundfile_data['attributes']['episode_id']]
+            soundfile, created = SoundFile.objects.get_or_create(
+                    episode_id=episode,
+                    title=soundfile_data['attributes']['name'],
+                    fragment=not(soundfile_data['attributes']['principal']))
+            soundfile.podcastable = True
+            soundfile.file = File(open(filepath))
+            soundfile.save()