mirror of https://codeberg.org/Sonoj/osamc.de
Compare commits
4 Commits
f0a0422b92
...
6742e702ee
Author | SHA1 | Date |
---|---|---|
Nils | 6742e702ee | |
Nils | 095136c5df | |
Nils | e4237262de | |
Nils | 2c4429b726 |
Binary file not shown.
|
@ -0,0 +1,172 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Audiowasserzeichen mit Audiowmark</title>
|
||||||
|
<link rel="stylesheet" href="normalize.css" type="text/css">
|
||||||
|
<link rel="stylesheet" href="sakura.css" type="text/css">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<h1>Audiowmark</h1>
|
||||||
|
|
||||||
|
<p>Falls du über eine Suchmaschine hierhergekommen bist: Dieses Dokument dient nur als
|
||||||
|
Begleitmaterial und Zusammenfassung eines mündlichen Vortrags</p>
|
||||||
|
|
||||||
|
<h2>Informationen und Links</h2>
|
||||||
|
|
||||||
|
<p>Kommandozeilen-Software von Stefan Westerfeld, entwickelt zum Einbetten von Audio-Wasserzeichen
|
||||||
|
in die Audiodaten einer Musikdatei. Eine 128-Bit-Nachricht wird fast unhörbar und direkt in der
|
||||||
|
Wellenform gespeichert und kann auch wieder ausgelesen werden. Zudem besteht die Möglichkeit, sie geheim zu verschlüsseln.
|
||||||
|
Der Prozess ist unabhängig vom Dateiformat, der Kompression und der Wiedergabeart, also
|
||||||
|
Datei, Streaming usw. Zum Auslesen der Nachricht ist die Originaldatei nicht erforderlich.</p>
|
||||||
|
|
||||||
|
<p>"Ticking all the boxes" für Open-Source-Software: GPL, Verschlüsselungsmethode ist bekannt und
|
||||||
|
einsehbar, basiert nur auf einem privaten Schlüssel (oder unverschlüsselt).</p>
|
||||||
|
|
||||||
|
<p>Hier geht es nur um die praktische Anwendung, nicht um die technischen Hintergründe.</p>
|
||||||
|
|
||||||
|
<p>Die Einsatzmöglichkeiten werden weiter unten erläutert, aber vorab der Hauptzweck: primär DRM
|
||||||
|
und Authentifizierung. Man kann individuelle Informationen (z.B. Kundennummern) in den Audiodaten
|
||||||
|
selbst speichern, ohne dass sie erkennbar und entfernbar sind, so zumindest das implizite
|
||||||
|
Versprechen des Autors.</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><a href="https://uplex.de/audiowmark/">Webseite</a></li>
|
||||||
|
<li><a href="https://uplex.de/audiowmark/README.html">Anleitung</a></li>
|
||||||
|
<li><a href="https://code.uplex.de/stefan/audiowmark">Quellcode</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Nicht in diesem Vortrag</h2>
|
||||||
|
<p>Es gibt auch 'videowmark', ein ähnliches Tool für Videos, das hier jedoch nicht behandelt wird.</p>
|
||||||
|
|
||||||
|
<h2>128-Bit-String – 32 Zeichen in Hexadezimaler Form</h2>
|
||||||
|
<p>Woher bekommt man diesen?</p>
|
||||||
|
|
||||||
|
<p>Als Hash. Die ersten 128 Bits eines SHA-256-Hashes (Kurze Frage: Wissen alle, was ein Hash ist? Wissen alle, was Hex 0-9A-F bedeutet?)</p>
|
||||||
|
<pre>
|
||||||
|
echo -n "OSAMC:BlackStorm:Download312" | sha256sum | head -c 32
|
||||||
|
b751e47bb131d84e6b67a3348c781d43
|
||||||
|
# head -c 32, weil es Hex ist: ein Hexwert ist 4 Bit. Also 128 Bit / 4 Bit = 32 Zeichen
|
||||||
|
# Audiowmark empfiehlt eine Datenbank anzulegen, da man Hashwerte nicht zurückentwickeln kann
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Oder 16 ASCII-Zeichen in Hexadezimaler Schreibweise:</p>
|
||||||
|
<pre>
|
||||||
|
echo -n "osamc:blkstm:312" | xxd -p -u
|
||||||
|
6F73616D633A626C6B73746D3A333132
|
||||||
|
# Rückgängig machen: echo -n "6F73616D633A626C6B73746D3A333132" | xxd -p -r
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>ine UUID, die zufälligerweise ebenfalls 128 Bit lang ist.</p>
|
||||||
|
<pre>
|
||||||
|
uuidgen | tr -d '-'
|
||||||
|
# 76fc5abe80f840729375fc4dc15e604d
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Oder 32 Zeichen, die zufällig alle Hexwerte 0-9A-F sind, aber bereits semantisch lesbar:</p>
|
||||||
|
<pre>
|
||||||
|
affe2222fefe1111affe2222fefe1111
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Um einen ausgelesenen String schnell mit dem eigenen zu vergleichen:</p>
|
||||||
|
<pre>
|
||||||
|
[ "affe2222fefe1111affe2222fefe1111" = "affe2222fefe1111affe2222fefe1111" ]; echo $? # Ergebnis 0 bedeutet, dass es der gleiche String ist.
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Beispiel 1: Unverschlüsselt in einer WAV-Datei</h2>
|
||||||
|
|
||||||
|
<p>Das Hinzufügen und Auslesen eines Wasserzeichens in einer unverschlüsselten WAV-Datei:</p>
|
||||||
|
<pre>
|
||||||
|
audiowmark add blackstorm.wav wm-blackstorm.wav b751e47bb131d84e6b67a3348c781d43
|
||||||
|
|
||||||
|
audiowmark get blackstorm.wav
|
||||||
|
# Leer
|
||||||
|
|
||||||
|
audiowmark get wm-blackstorm.wav
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Der Befehl "get" extrahiert die Nachricht aus der Audiodatei. Das Auffinden einer Nachricht,
|
||||||
|
obwohl keine vorhanden ist (oder eine falsche Nachricht), ist möglich, muss aber zu Ihrer privaten,
|
||||||
|
geheimen Datenbank passen. Laut den Entwicklern ist dies selten genug, um statistisch
|
||||||
|
vernachlässigbar zu sein. </p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>--detect-speed hilft gegen Konvertierungsfehler (z.B. digital-analog-digital-Kette mit Geschwindigkeitsänderungen). Laut Handbuch kann dies auch beabsichtigt sein, um das Wasserzeichen zu verschleiern.
|
||||||
|
<li>--detect-speed ist langsam und benötigt mehr RAM, daher ist es nicht die Standardeinstellung. Es unterstützt Multithreading.
|
||||||
|
<li>--detect-speed-patient ist noch effektiver, erfordert aber höheren Ressourcenverbrauch. Wenn Letzterer keine Rolle spielt, ist dies die bevorzugte Methode.
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
audiowmark get --detect-speed-patient wm-blackstorm.wav
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Es werden mehrere Nachrichten zurückgegeben, als Redundanz gegen Korruption und Kompression. Das dritte Feld ist der "Sync Score", je höher, desto besser. Das vierte Feld ist "Decoding Error", niedriger ist besser. Danach folgt der Blocktyp. Allein A ist in Ordnung, AB ist besser.</p>
|
||||||
|
|
||||||
|
<p>Am Ende erscheint ein "All" als Zusammenfassung, die man mit einem anderen Programm verarbeiten kann, z.B. in eine Datenbank einpflegen.</p>
|
||||||
|
|
||||||
|
<h2>Beispiel 2: Verschlüsselung</h2>
|
||||||
|
<p>Um zu verhindern, dass jeder mit Audiowmark die Nachricht auslesen kann bzw. um zu verhindern, dass festgestellt werden kann, ob ein Wasserzeichen vorhanden ist, wird eine interne Verschlüsselungsmethode bereitgestellt. Die Sicherheit dieser Methode wurde nicht überprüft.</p>
|
||||||
|
<pre>
|
||||||
|
audiowark gen-key osamc-music-distributor.key # Speichert den Schlüssel in einer Datei
|
||||||
|
# Schlüssel 88913063e57c946b37bf6ea8ce842d32
|
||||||
|
|
||||||
|
audiowmark add --key osamc-music-distributor.key blackstorm.wav wmk-blackstorm.wav b751e47bb131d84e6b67a3348c781d43
|
||||||
|
audiowark get --detect-speed-patient wmk-blackstorm.wav
|
||||||
|
# Leer
|
||||||
|
audiowmark get --detect-speed-patient --key osamc-music-distributor.key wmk-blackstorm.wav
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h2>Beispiel 3: Kompression</h2>
|
||||||
|
<p>Das Wasserzeichen bleibt auch nach der Kompression der Audiodatei erhalten:</p>
|
||||||
|
<pre>
|
||||||
|
opusenc wmk-blackstorm.wav wmk-blackstorm.opus
|
||||||
|
sox wmk-blackstorm.wav wmk-blackstorm.mp3
|
||||||
|
|
||||||
|
audiowmark get --detect-speed-patient --key osamc-music-distributor.key wmk-blackstorm.mp3
|
||||||
|
audiowmark get --detect-speed-patient --key osamc-music-distributor.key wmk-blackstorm.opus
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h2>Beispiel 4: Analog als Stream mit Pipes</h2>
|
||||||
|
<p>"Worst case": Eine verschlüsselte MP3-Version wird über Handy-Lautsprecher abgespielt und mit einem internen Laptopmikrofon aufgenommen.</p>
|
||||||
|
|
||||||
|
<p>Eigentlich war geplant, dies mit einem selbstgebauten Stream zu tun, aber es gab Probleme mit den Eingabeoptionen (--input-format raw). Jack_capture sollte funktionieren, aber es gab Probleme mit meinem Pipewire-Setup. Also wurde Audacity verwendet...</p>
|
||||||
|
|
||||||
|
<p>Da es sich um eine analoge Übertragung handelt, wird --detect-speed verwendet.</p>
|
||||||
|
|
||||||
|
<h2>Weitere Experiment-Ideen</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Sehr kurze Lieder, weniger als 10 Sekunden. Eventuell den --short Modus verwenden, siehe README.
|
||||||
|
<li>Die Musik in einem YouTube-Video einbetten und versuchen, sie daraus wieder herauszuhören. Eventuell den Stream mit einem virtuellen Systemmikrofon (JACK/Pipewire) abhören, um das Audio nicht herunterladen zu müssen.
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Die entscheidende Frage</h2>
|
||||||
|
<p>Ist das Wasserzeichen hörbar bzw. beeinträchtigt es die Audioqualität?</p>
|
||||||
|
|
||||||
|
<p>Hier können nur subjektive Eindrücke eine Antwort geben. Die README behauptet, dass die Qualität nicht beeinträchtigt wird, aber das ist nicht sicher. In diesem Beispielstück war zumindest nichts direkt hörbar. Es könnte jedoch sinnvoll sein, dies an einer reinen Sinuswelle zu testen.</p>
|
||||||
|
|
||||||
|
<p>Es ist definitiv möglich, die Musikqualität zu verschlechtern. So gibt es z.B. einen --strength-Flag, der mit Werten über 10 (Standard) zu schlechterer Qualität führt. Je höher die "strength", desto robuster gegen Audio-Kompression. 10 reicht für 128 kbit/s MP3. Für das Setzen und Auslesen der Nachricht muss derselbe strength-Wert verwendet werden, dieser sollte also notiert werden.</p>
|
||||||
|
|
||||||
|
<h2>Einsatzmöglichkeiten</h2>
|
||||||
|
<p>Frage ans Publikum: Wofür könnte dies nützlich sein, abgesehen von einem technischen Kuriosum? Gibt es Anforderungen, die nicht besser durch ein explizites paralleles Signal abgedeckt werden könnten (siehe Metadaten und Verkehrsinfo für Autoradios)?</p>
|
||||||
|
<ul>
|
||||||
|
<li>Gutartiger DRM: Urheberrechtsnachweis, um sein Copyleft durchzusetzen.</li>
|
||||||
|
<li>Bösartiger DRM: Musikplayer verweigert das Abspielen, falls die Datei nicht korrekt signiert ist. Anwalt wird automatisch informiert.</li>
|
||||||
|
<li>Automatisierung: "Ihr Download wird vorbereitet" und dann wird die Kundennummer in die Audiodatei eingebettet.</li>
|
||||||
|
<li>Novelty: "Limitierte, signierte digitale Auflage mit Seriennummer."</li>
|
||||||
|
<li>Patreon-Reward: Dein Name in der Musik als Audiowmark!</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Sollte man es also verwenden oder nicht? Hier sind Pro und Contra...</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Experimente:
|
||||||
|
<ul>
|
||||||
|
<li> In ein Video einbetten und auf youtube hochladen. Dann das ganze mit youtube-dl runterladen und schauen.
|
||||||
|
<li> Über Lautsprecher abspielen und sich das anhören: Raum und/oder Handy-Lautsprecher und Laptop-Mikrofon
|
||||||
|
</ul>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,8 @@
|
||||||
|
[Meta]
|
||||||
|
#YYYY-MM
|
||||||
|
Date = 2023-01
|
||||||
|
|
||||||
|
#e.g. CC-by-sa, CC-by, All Rights Reserved
|
||||||
|
License = CC-by-sa
|
||||||
|
PrettyName = Audio-Wasserzeichen mit "audiowmark"
|
||||||
|
Author = nils
|
|
@ -0,0 +1,427 @@
|
||||||
|
/*! normalize.css v6.0.0 | MIT License | github.com/necolas/normalize.css */
|
||||||
|
|
||||||
|
/* Document
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Correct the line height in all browsers.
|
||||||
|
* 2. Prevent adjustments of font size after orientation changes in
|
||||||
|
* IE on Windows Phone and in iOS.
|
||||||
|
*/
|
||||||
|
|
||||||
|
html {
|
||||||
|
line-height: 1.15; /* 1 */
|
||||||
|
-ms-text-size-adjust: 100%; /* 2 */
|
||||||
|
-webkit-text-size-adjust: 100%; /* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sections
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the correct display in IE 9-.
|
||||||
|
*/
|
||||||
|
|
||||||
|
article,
|
||||||
|
aside,
|
||||||
|
footer,
|
||||||
|
header,
|
||||||
|
nav,
|
||||||
|
section {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Correct the font size and margin on `h1` elements within `section` and
|
||||||
|
* `article` contexts in Chrome, Firefox, and Safari.
|
||||||
|
*/
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 2em;
|
||||||
|
margin: 0.67em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Grouping content
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the correct display in IE 9-.
|
||||||
|
* 1. Add the correct display in IE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
figcaption,
|
||||||
|
figure,
|
||||||
|
main { /* 1 */
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the correct margin in IE 8.
|
||||||
|
*/
|
||||||
|
|
||||||
|
figure {
|
||||||
|
margin: 1em 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Add the correct box sizing in Firefox.
|
||||||
|
* 2. Show the overflow in Edge and IE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
hr {
|
||||||
|
box-sizing: content-box; /* 1 */
|
||||||
|
height: 0; /* 1 */
|
||||||
|
overflow: visible; /* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Correct the inheritance and scaling of font size in all browsers.
|
||||||
|
* 2. Correct the odd `em` font sizing in all browsers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
pre {
|
||||||
|
font-family: monospace, monospace; /* 1 */
|
||||||
|
font-size: 1em; /* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Text-level semantics
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Remove the gray background on active links in IE 10.
|
||||||
|
* 2. Remove gaps in links underline in iOS 8+ and Safari 8+.
|
||||||
|
*/
|
||||||
|
|
||||||
|
a {
|
||||||
|
background-color: transparent; /* 1 */
|
||||||
|
-webkit-text-decoration-skip: objects; /* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Remove the bottom border in Chrome 57- and Firefox 39-.
|
||||||
|
* 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
|
||||||
|
*/
|
||||||
|
|
||||||
|
abbr[title] {
|
||||||
|
border-bottom: none; /* 1 */
|
||||||
|
text-decoration: underline; /* 2 */
|
||||||
|
text-decoration: underline dotted; /* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prevent the duplicate application of `bolder` by the next rule in Safari 6.
|
||||||
|
*/
|
||||||
|
|
||||||
|
b,
|
||||||
|
strong {
|
||||||
|
font-weight: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the correct font weight in Chrome, Edge, and Safari.
|
||||||
|
*/
|
||||||
|
|
||||||
|
b,
|
||||||
|
strong {
|
||||||
|
font-weight: bolder;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Correct the inheritance and scaling of font size in all browsers.
|
||||||
|
* 2. Correct the odd `em` font sizing in all browsers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
code,
|
||||||
|
kbd,
|
||||||
|
samp {
|
||||||
|
font-family: monospace, monospace; /* 1 */
|
||||||
|
font-size: 1em; /* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the correct font style in Android 4.3-.
|
||||||
|
*/
|
||||||
|
|
||||||
|
dfn {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the correct background and color in IE 9-.
|
||||||
|
*/
|
||||||
|
|
||||||
|
mark {
|
||||||
|
background-color: #ff0;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the correct font size in all browsers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
small {
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prevent `sub` and `sup` elements from affecting the line height in
|
||||||
|
* all browsers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
sub,
|
||||||
|
sup {
|
||||||
|
font-size: 75%;
|
||||||
|
line-height: 0;
|
||||||
|
position: relative;
|
||||||
|
vertical-align: baseline;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub {
|
||||||
|
bottom: -0.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
sup {
|
||||||
|
top: -0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Embedded content
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the correct display in IE 9-.
|
||||||
|
*/
|
||||||
|
|
||||||
|
audio,
|
||||||
|
video {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the correct display in iOS 4-7.
|
||||||
|
*/
|
||||||
|
|
||||||
|
audio:not([controls]) {
|
||||||
|
display: none;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the border on images inside links in IE 10-.
|
||||||
|
*/
|
||||||
|
|
||||||
|
img {
|
||||||
|
border-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hide the overflow in IE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
svg:not(:root) {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Forms
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the margin in Firefox and Safari.
|
||||||
|
*/
|
||||||
|
|
||||||
|
button,
|
||||||
|
input,
|
||||||
|
optgroup,
|
||||||
|
select,
|
||||||
|
textarea {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the overflow in IE.
|
||||||
|
* 1. Show the overflow in Edge.
|
||||||
|
*/
|
||||||
|
|
||||||
|
button,
|
||||||
|
input { /* 1 */
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the inheritance of text transform in Edge, Firefox, and IE.
|
||||||
|
* 1. Remove the inheritance of text transform in Firefox.
|
||||||
|
*/
|
||||||
|
|
||||||
|
button,
|
||||||
|
select { /* 1 */
|
||||||
|
text-transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
|
||||||
|
* controls in Android 4.
|
||||||
|
* 2. Correct the inability to style clickable types in iOS and Safari.
|
||||||
|
*/
|
||||||
|
|
||||||
|
button,
|
||||||
|
html [type="button"], /* 1 */
|
||||||
|
[type="reset"],
|
||||||
|
[type="submit"] {
|
||||||
|
-webkit-appearance: button; /* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the inner border and padding in Firefox.
|
||||||
|
*/
|
||||||
|
|
||||||
|
button::-moz-focus-inner,
|
||||||
|
[type="button"]::-moz-focus-inner,
|
||||||
|
[type="reset"]::-moz-focus-inner,
|
||||||
|
[type="submit"]::-moz-focus-inner {
|
||||||
|
border-style: none;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Restore the focus styles unset by the previous rule.
|
||||||
|
*/
|
||||||
|
|
||||||
|
button:-moz-focusring,
|
||||||
|
[type="button"]:-moz-focusring,
|
||||||
|
[type="reset"]:-moz-focusring,
|
||||||
|
[type="submit"]:-moz-focusring {
|
||||||
|
outline: 1px dotted ButtonText;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Correct the text wrapping in Edge and IE.
|
||||||
|
* 2. Correct the color inheritance from `fieldset` elements in IE.
|
||||||
|
* 3. Remove the padding so developers are not caught out when they zero out
|
||||||
|
* `fieldset` elements in all browsers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
legend {
|
||||||
|
box-sizing: border-box; /* 1 */
|
||||||
|
color: inherit; /* 2 */
|
||||||
|
display: table; /* 1 */
|
||||||
|
max-width: 100%; /* 1 */
|
||||||
|
padding: 0; /* 3 */
|
||||||
|
white-space: normal; /* 1 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Add the correct display in IE 9-.
|
||||||
|
* 2. Add the correct vertical alignment in Chrome, Firefox, and Opera.
|
||||||
|
*/
|
||||||
|
|
||||||
|
progress {
|
||||||
|
display: inline-block; /* 1 */
|
||||||
|
vertical-align: baseline; /* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the default vertical scrollbar in IE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
textarea {
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Add the correct box sizing in IE 10-.
|
||||||
|
* 2. Remove the padding in IE 10-.
|
||||||
|
*/
|
||||||
|
|
||||||
|
[type="checkbox"],
|
||||||
|
[type="radio"] {
|
||||||
|
box-sizing: border-box; /* 1 */
|
||||||
|
padding: 0; /* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Correct the cursor style of increment and decrement buttons in Chrome.
|
||||||
|
*/
|
||||||
|
|
||||||
|
[type="number"]::-webkit-inner-spin-button,
|
||||||
|
[type="number"]::-webkit-outer-spin-button {
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Correct the odd appearance in Chrome and Safari.
|
||||||
|
* 2. Correct the outline style in Safari.
|
||||||
|
*/
|
||||||
|
|
||||||
|
[type="search"] {
|
||||||
|
-webkit-appearance: textfield; /* 1 */
|
||||||
|
outline-offset: -2px; /* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the inner padding and cancel buttons in Chrome and Safari on macOS.
|
||||||
|
*/
|
||||||
|
|
||||||
|
[type="search"]::-webkit-search-cancel-button,
|
||||||
|
[type="search"]::-webkit-search-decoration {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Correct the inability to style clickable types in iOS and Safari.
|
||||||
|
* 2. Change font properties to `inherit` in Safari.
|
||||||
|
*/
|
||||||
|
|
||||||
|
::-webkit-file-upload-button {
|
||||||
|
-webkit-appearance: button; /* 1 */
|
||||||
|
font: inherit; /* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Interactive
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add the correct display in IE 9-.
|
||||||
|
* 1. Add the correct display in Edge, IE, and Firefox.
|
||||||
|
*/
|
||||||
|
|
||||||
|
details, /* 1 */
|
||||||
|
menu {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add the correct display in all browsers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
summary {
|
||||||
|
display: list-item;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Scripting
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the correct display in IE 9-.
|
||||||
|
*/
|
||||||
|
|
||||||
|
canvas {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the correct display in IE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
template {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hidden
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the correct display in IE 10-.
|
||||||
|
*/
|
||||||
|
|
||||||
|
[hidden] {
|
||||||
|
display: none;
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
# watermarking key for audiowmark
|
||||||
|
|
||||||
|
key 88913063e57c946b37bf6ea8ce842d32
|
|
@ -0,0 +1,165 @@
|
||||||
|
/* Sakura.css v1.0.0
|
||||||
|
* ================
|
||||||
|
* Minimal css theme.
|
||||||
|
* Project: https://github.com/oxalorg/sakura
|
||||||
|
*/
|
||||||
|
/* Body */
|
||||||
|
html {
|
||||||
|
font-size: 62.5%;
|
||||||
|
font-family: serif; }
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-size: 1.8rem;
|
||||||
|
line-height: 1.618;
|
||||||
|
max-width: 38em;
|
||||||
|
margin: auto;
|
||||||
|
color: #4a4a4a;
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
padding: 13px; }
|
||||||
|
|
||||||
|
@media (max-width: 684px) {
|
||||||
|
body {
|
||||||
|
font-size: 1.53rem; } }
|
||||||
|
|
||||||
|
@media (max-width: 382px) {
|
||||||
|
body {
|
||||||
|
font-size: 1.35rem; } }
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
line-height: 1.1;
|
||||||
|
font-family: Verdana, Geneva, sans-serif;
|
||||||
|
font-weight: 700;
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
word-wrap: break-word;
|
||||||
|
-ms-word-break: break-all;
|
||||||
|
word-break: break-word;
|
||||||
|
-ms-hyphens: auto;
|
||||||
|
-moz-hyphens: auto;
|
||||||
|
-webkit-hyphens: auto;
|
||||||
|
hyphens: auto; }
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 2.35em; }
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 2.00em; }
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 1.75em; }
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
font-size: 1.5em; }
|
||||||
|
|
||||||
|
h5 {
|
||||||
|
font-size: 1.25em; }
|
||||||
|
|
||||||
|
h6 {
|
||||||
|
font-size: 1em; }
|
||||||
|
|
||||||
|
small, sub, sup {
|
||||||
|
font-size: 75%; }
|
||||||
|
|
||||||
|
hr {
|
||||||
|
border-color: #2c8898; }
|
||||||
|
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
color: #2c8898; }
|
||||||
|
a:hover {
|
||||||
|
color: #982c61;
|
||||||
|
border-bottom: 2px solid #4a4a4a; }
|
||||||
|
|
||||||
|
ul {
|
||||||
|
padding-left: 1.4em; }
|
||||||
|
|
||||||
|
li {
|
||||||
|
margin-bottom: 0.4em; }
|
||||||
|
|
||||||
|
blockquote {
|
||||||
|
font-style: italic;
|
||||||
|
margin-left: 1.5em;
|
||||||
|
padding-left: 1em;
|
||||||
|
border-left: 3px solid #2c8898; }
|
||||||
|
|
||||||
|
img {
|
||||||
|
max-width: 100%; }
|
||||||
|
|
||||||
|
/* Pre and Code */
|
||||||
|
pre {
|
||||||
|
background-color: #f1f1f1;
|
||||||
|
display: block;
|
||||||
|
padding: 1em;
|
||||||
|
overflow-x: auto; }
|
||||||
|
|
||||||
|
code {
|
||||||
|
font-size: 0.9em;
|
||||||
|
padding: 0 0.5em;
|
||||||
|
background-color: #f1f1f1;
|
||||||
|
white-space: pre-wrap; }
|
||||||
|
|
||||||
|
pre > code {
|
||||||
|
padding: 0;
|
||||||
|
background-color: transparent;
|
||||||
|
white-space: pre; }
|
||||||
|
|
||||||
|
/* Tables */
|
||||||
|
table {
|
||||||
|
text-align: justify;
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse; }
|
||||||
|
|
||||||
|
td, th {
|
||||||
|
padding: 0.5em;
|
||||||
|
border-bottom: 1px solid #f1f1f1; }
|
||||||
|
|
||||||
|
/* Buttons, forms and input */
|
||||||
|
input, textarea {
|
||||||
|
border: 1px solid #4a4a4a; }
|
||||||
|
input:focus, textarea:focus {
|
||||||
|
border: 1px solid #2c8898; }
|
||||||
|
|
||||||
|
textarea {
|
||||||
|
width: 100%; }
|
||||||
|
|
||||||
|
.button, button, input[type="submit"], input[type="reset"], input[type="button"] {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 5px 10px;
|
||||||
|
text-align: center;
|
||||||
|
text-decoration: none;
|
||||||
|
white-space: nowrap;
|
||||||
|
background-color: #2c8898;
|
||||||
|
color: #f9f9f9;
|
||||||
|
border-radius: 1px;
|
||||||
|
border: 1px solid #2c8898;
|
||||||
|
cursor: pointer;
|
||||||
|
box-sizing: border-box; }
|
||||||
|
.button[disabled], button[disabled], input[type="submit"][disabled], input[type="reset"][disabled], input[type="button"][disabled] {
|
||||||
|
cursor: default;
|
||||||
|
opacity: .5; }
|
||||||
|
.button:focus, .button:hover, button:focus, button:hover, input[type="submit"]:focus, input[type="submit"]:hover, input[type="reset"]:focus, input[type="reset"]:hover, input[type="button"]:focus, input[type="button"]:hover {
|
||||||
|
background-color: #982c61;
|
||||||
|
border-color: #982c61;
|
||||||
|
color: #f9f9f9;
|
||||||
|
outline: 0; }
|
||||||
|
|
||||||
|
textarea, select, input[type] {
|
||||||
|
color: #4a4a4a;
|
||||||
|
padding: 6px 10px;
|
||||||
|
/* The 6px vertically centers text on FF, ignored by Webkit */
|
||||||
|
margin-bottom: 10px;
|
||||||
|
background-color: #f1f1f1;
|
||||||
|
border: 1px solid #f1f1f1;
|
||||||
|
border-radius: 4px;
|
||||||
|
box-shadow: none;
|
||||||
|
box-sizing: border-box; }
|
||||||
|
textarea:focus, select:focus, input[type]:focus {
|
||||||
|
border: 1px solid #2c8898;
|
||||||
|
outline: 0; }
|
||||||
|
|
||||||
|
input[type="checkbox"]:focus {
|
||||||
|
outline: 1px dotted #2c8898; }
|
||||||
|
|
||||||
|
label, legend, fieldset {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: .5rem;
|
||||||
|
font-weight: 600; }
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -6,9 +6,27 @@
|
||||||
<pre> <!-- Keep pure text line breaks -->
|
<pre> <!-- Keep pure text line breaks -->
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
//see https://github.com/vstelmakh/url-highlight
|
$autoloadPath = '/home/meeehgru/vendor/autoload.php';
|
||||||
require '/home/meeehgru/vendor/autoload.php'; //relative path with DIR . concat does not work
|
|
||||||
|
// Check if autoload.php file exists
|
||||||
|
if (!file_exists($autoloadPath)) {
|
||||||
|
echo "<p>PHP Configuration changed. The autoload.php file is missing. Please run <code>composer install</code> or <code>composer require vstelmakh/url-highlight</code>. Please inform the osamc.de staff about this problem.</p>";
|
||||||
|
exit; // Stop script execution
|
||||||
|
}
|
||||||
|
|
||||||
|
require $autoloadPath;
|
||||||
|
|
||||||
|
// Check if UrlHighlight class exists using its fully qualified name
|
||||||
|
if (!class_exists('VStelmakh\UrlHighlight\UrlHighlight')) {
|
||||||
|
echo "<p>PHP Configuration changed. Run <code>composer require vstelmakh/url-highlight</code>. Please inform the osamc.de staff about this problem.</p>";
|
||||||
|
exit; // Stop script execution
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now we can use the use statement
|
||||||
use VStelmakh\UrlHighlight\UrlHighlight;
|
use VStelmakh\UrlHighlight\UrlHighlight;
|
||||||
|
|
||||||
|
|
||||||
|
// Main logic of the script starts here
|
||||||
$urlHighlight = new UrlHighlight();
|
$urlHighlight = new UrlHighlight();
|
||||||
|
|
||||||
$files = glob("./protokolle/osamc_*.txt");
|
$files = glob("./protokolle/osamc_*.txt");
|
||||||
|
@ -18,10 +36,9 @@ foreach(array_reverse($files) as $file){
|
||||||
echo "\n";
|
echo "\n";
|
||||||
echo $urlHighlight->highlightUrls(file_get_contents($file));
|
echo $urlHighlight->highlightUrls(file_get_contents($file));
|
||||||
echo "\n";
|
echo "\n";
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
fclose($out);
|
// Remove fclose($out); as $out is not defined
|
||||||
|
|
||||||
?>
|
?>
|
||||||
</pre>
|
</pre>
|
||||||
</body>
|
</body>
|
||||||
|
|
Loading…
Reference in New Issue