diff --git a/.gitignore b/.gitignore index 5d381cc..03eda02 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,12 @@ +# Konfiguration ignorieren +config.json + +# genrerierte QR-Codes ignorieren +qr/ + +# Linklisten ignorieren +*.csv + # ---> Python # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..91bec39 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "nextcloud-API"] + path = nextcloud-API + url = https://github.com/MrCapsLock/nextcloud-API.git + branch = develop diff --git a/README.md b/README.md index 9739414..035bf8b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,49 @@ -# HyFeeTools +## HyFeeTools +Dieses Repo enthält nützliche Skripte für die Verwendung von [HyFee](https://hyfee.de/) von Christian Mayr mit einer Nextcloud. -Nützliche Skripte für die Verwendung von [HyFee](https://hyfee.de/) von Christian Mayr mit einer Nextcloud. \ No newline at end of file +### Übersicht +#### HyFee Vorab-Code-Generator +Der Generator kann genutzt werden, um eine beliebige Anzahl an Platzhalter-Codes für HyFee in einer Nextcloud zu generieren. + +```python main.py``` + +### Installation +0. Abhängigkeiten installieren: ```pip install qrcode --user``` +1. Git Repo clonen: ```git clone https://dev.spittank.org/daniel/HyFeeTools.git``` +2. Nextcloud-API-Wrapper installieren: + ```bash + git submodule init + cd nextcloud-API + python setup.py build + python setup.py install --user + ``` +3. Konfigurationsbeispiel ```config.json.example``` nach ```config.json``` kopieren und Einstellungen anpassen. + +### Verwendung +Der Generator kann direkt aufgerufen werden und verarbeitet die folgenden optionalen Kommandozeilenargumente: + +- ```-n NUMBER``` oder ```--number NUMBER``` für die Anzahl der zu erstellenden Platzhalter. +- ```-t TYP``` oder ```--type TYP``` für den Typ der zu erstellenden Platzhalter (audio, image, pdf, video, dir). +- ```-s SUBJECT``` oder ```--subject SUBJECT``` für einen frei zu wählenden Bezeichner, der statt der Uhrzeit im Dateinamen der Platzhalter verwendet wird. +- ```--qr``` für die Ausgabe von QR-Codes als Einzelbilder. + +Der Generator gibt immer eine CSV-Datei der erstellten Codes aus. Diese befindet sich standardmäßig im Verzeichnis des Skripts und hat den Namen der Serie, i.d.R. also Datum und Uhrzeit der Generierung. Diese kann z.B. für den Seriendruck verwendet werden. + +Folgendes Beispiel legt zwei Videoplatzhalter an und gibt QR-Codes dafür aus. + +```bash +./generator.py -n 2 -t video --qr +``` + +### Verwendete Bibliotheken +Der Generator greift für die Verbindung zu Nextcloud auf den [nextcloud-api-wrapper von luffah](https://github.com/luffah/nextcloud-API). Es wird allerdings eine Developement-Version von [MrCapsLock](https://github.com/MrCapsLock/nextcloud-API/tree/develop) verwendet, da der entsprechende Pullrequest bisher nicht angenommen wurde. + +Die geänderte Version ist notwendig, um die Anzeige eines Downloadlinks zu deaktivieren. Das Paket ist diesem Repo als Submodul hinzugefügt. Um das Paket zu installieren kann wie folgt vorgegangen werden (Linux / mac OS): + +```bash +git submodule init +cd nextcloud-API +python setup.py build +python setup.py install --user +``` +Außerdem verwendet der Generator das Paket qrcode. Zur Installation kann PIP verwendet werden: ```pip install qrcode --user``` diff --git a/config.json.example b/config.json.example new file mode 100644 index 0000000..4688728 --- /dev/null +++ b/config.json.example @@ -0,0 +1,6 @@ +{ + "url": "https://nextcloud.server.example", + "user": "mein.account", + "pass": "passwort", + "dir": "/hyfee" +} diff --git a/generator.py b/generator.py new file mode 100755 index 0000000..e4f389d --- /dev/null +++ b/generator.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python3 + +# Importe +from pprint import pprint + +import json + +import os + +from nextcloud import NextCloud +from nextcloud.codes import ShareType, Permission + +from datetime import datetime + +# Konfiguration laden +konfigurationsdatei = open('config.json') +ncc = json.load(konfigurationsdatei) +konfigurationsdatei.close() + +# Dateinamen für Vorlagen +TPL_PATH = 'tpl' +TPL_AUDIO = TPL_PATH + '/vorlage.mp3' +TPL_IMAGE = TPL_PATH + '/vorlage.jpg' +TPL_VIDEO = TPL_PATH + '/vorlage.mp4' +TPL_PDF = TPL_PATH + '/vorlage.pdf' + +TPL_NC_PATH = ncc['dir'] + '/tpl' +TPL_NC_AUDIO = TPL_NC_PATH + '/vorlage.mp3' +TPL_NC_IMAGE = TPL_NC_PATH + '/vorlage.jpg' +TPL_NC_VIDEO = TPL_NC_PATH + '/vorlage.mp4' +TPL_NC_PDF = TPL_NC_PATH + '/vorlage.pdf' + +def initialisierung(): + # Mit Nextcloud verbinden und Operationen durchführen + with NextCloud(ncc['url'], user=ncc['user'], password=ncc['pass']) as nxc: + + # Existiert das Vorlagenverzeichnis? + if not nxc.list_folders(path=TPL_NC_PATH, depth=0).data: + print('Vorlagenverzeichnis wird angelegt...') + # Verzeichnis anlegen + nxc.create_folder(TPL_NC_PATH) + + # Existiert die Audiovorlage? + if not nxc.list_folders(path=TPL_NC_AUDIO, depth=0).data: + print('Audiovorlage wird hochgeladen...') + # Audiovorlage hochladen + nxc.upload_file(TPL_AUDIO, TPL_NC_AUDIO) + + # Existiert die Bildvorlage? + if not nxc.list_folders(path=TPL_NC_IMAGE, depth=0).data: + print('Bildvorlage wird hochgeladen...') + # Bildvorlage hochladen + nxc.upload_file(TPL_IMAGE, TPL_NC_IMAGE) + + # Existiert die PDF-Vorlage? + if not nxc.list_folders(path=TPL_NC_PDF, depth=0).data: + print('PDF-Vorlage wird hochgeladen...') + # PDF-Vorlage hochladen + nxc.upload_file(TPL_PDF, TPL_NC_PDF) + + # Existiert die Videovorlage? + if not nxc.list_folders(path=TPL_NC_VIDEO, depth=0).data: + print('Videovorlage wird hochgeladen...') + # Videovorlage hochladen + nxc.upload_file(TPL_VIDEO, TPL_NC_VIDEO) + +def generiere_platzhalter(anzahl=1, typ='audio', subject='DateTime', qrcodes=False): + # leere Liste anlegen + linkliste = [] + + # Vorbereiten des Generierens von QR-Codes + if qrcodes: + # Library importieren + import qrcode + # Verzeichnis anlegen + if not os.path.isdir('qr'): + os.mkdir('qr') + + # Platzhaltertyp konfigurieren + typ = typ.lower() + if typ == 'audio': + # Dateiendung bestimmen: + suffix = '.mp3' + TPL_NC = TPL_NC_AUDIO + elif typ == 'image': + # Dateiendung bestimmen: + suffix = '.jpg' + TPL_NC = TPL_NC_IMAGE + elif typ == 'pdf': + # Dateiendung bestimmen: + suffix = '.pdf' + TPL_NC = TPL_NC_PDF + elif typ == 'video': + # Dateiendung bestimmen: + suffix = '.mp4' + TPL_NC = TPL_NC_VIDEO + else: + # Kein Suffix, keine Vorlage für Verzeichnis + typ = 'dir' + suffix = '' + TPL_NC = '' + + # Mit Nextcloud verbinden und Operationen durchführen + with NextCloud(ncc['url'], user=ncc['user'], password=ncc['pass']) as nxc: + + # Aktuelles Datum und Uhrzeit ermitteln + today = datetime.now() + + # Dateien kopieren und freigeben + for i in range(anzahl): + # Statusnachricht anzeigen + print('Generiere Platzhalter #{:0>4d}'.format(i)) + + # Zieldateiname generieren + if subject == 'DateTime': + prefix = today.strftime('%Y_%m_%d-%H_%M-%S') + else: + prefix = today.strftime('%Y_%m_%d_') + subject + '_' + typ + dateiname = prefix + '_{0:0>4d}'.format(i) + suffix + + # Vorlage kopieren oder Verzeichnis anlegen + if typ == 'dir': + nxc.assure_folder_exists(ncc['dir'] + '/' + dateiname) + else: + nxc.copy_path(TPL_NC, ncc['dir'] + '/' + dateiname) + # Freigeben + aw = nxc.create_share(path=ncc['dir'] + '/' + dateiname, share_type=ShareType.PUBLIC_LINK) + # Download verbergen + nxc.update_share(aw.data['id'], hide_download=True) + + # QR-Code generieren + if qrcodes: + img = qrcode.make(aw.data['url']) + img.save('qr/' + prefix + '_{0:0>4d}.png'.format(i)) + + # Nummer hinzufügen + aw.data['number'] = i + aw.data['number_fmt'] = '{:0>4d}'.format(i) + + # Datum und Zeit hinzufügen + aw.data['date'] = today.strftime('%Y-%m-%d') + aw.data['time'] = today.strftime('%H:%M:%S') + + # Zur Liste hinzufügen + linkliste.append(aw.data) + + # Liste in Datei schreiben + with open(prefix + '_liste.csv', 'w') as datei: + datei.write('number, numbder_fmt, date, time, path, url\n') + for link in linkliste: + datei.write('{number}, {number_fmt}, {date}, {time}, {path}, {url}\n'.format( + number = link['number'], + number_fmt = link['number_fmt'], + date = link['date'], + time = link['time'], + path = link['path'], + url = link['url']) + ) + +if __name__ == "__main__": + # Parse Kommandozeilenargumente + + import argparse + + parser = argparse.ArgumentParser(add_help=True) + parser.add_argument('-n', '--number', + default=1, + dest='number', + help='Anzahl der zu generierenden Platzhalter. Standard: 1', + type=int + ) + parser.add_argument('-t', '--type', + default='audio', + dest='typ', + help='Typ des Platzhalters (audio, image, pdf, video, dir). Standard: audio', + type=str + ) + parser.add_argument('-s', '--subject', + default='DateTime', + dest='subject', + help='Betreff des Platzhalters (wird im Dateinamen verwendet und in die Liste ausgegeben). Standard: DateTime (Uhrzeit als Betreff)', + type=str + ) + parser.add_argument('--qr', + action='store_true', + dest='qrcodes', + help='Generiere einzelne QR-Codes' + ) + args = parser.parse_args() + + # Initialisiere die Vorlagen in der Nextcloud + initialisierung() + generiere_platzhalter(anzahl=args.number, + typ=args.typ, + subject=args.subject, + qrcodes=args.qrcodes) diff --git a/nextcloud-API b/nextcloud-API new file mode 160000 index 0000000..0047ae0 --- /dev/null +++ b/nextcloud-API @@ -0,0 +1 @@ +Subproject commit 0047ae08f4f023c4e30c108f82aa65ad80f800b9 diff --git a/tpl/vorlage.jpg b/tpl/vorlage.jpg new file mode 100644 index 0000000..d6d0457 Binary files /dev/null and b/tpl/vorlage.jpg differ diff --git a/tpl/vorlage.mp3 b/tpl/vorlage.mp3 new file mode 100644 index 0000000..68295e8 Binary files /dev/null and b/tpl/vorlage.mp3 differ diff --git a/tpl/vorlage.mp4 b/tpl/vorlage.mp4 new file mode 100644 index 0000000..220669a Binary files /dev/null and b/tpl/vorlage.mp4 differ diff --git a/tpl/vorlage.pdf b/tpl/vorlage.pdf new file mode 100644 index 0000000..ec22951 Binary files /dev/null and b/tpl/vorlage.pdf differ