Commit 4ac09db3 authored by jan.koester's avatar jan.koester
Browse files

test

parent f687e3ba
Loading
Loading
Loading
Loading
+24.7 KiB

File added.

No diff preview for this file type.

+166 −0
Original line number Diff line number Diff line
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 930" font-family="Segoe UI, Arial, sans-serif" font-size="13">
  <defs>
    <marker id="arrow" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto">
      <path d="M0,0 L8,3 L0,6 Z" fill="#555"/>
    </marker>
    <filter id="shadow" x="-2%" y="-2%" width="104%" height="104%">
      <feDropShadow dx="1" dy="1" stdDeviation="2" flood-opacity="0.12"/>
    </filter>
  </defs>

  <!-- Client-Schicht -->
  <rect x="30" y="10" width="900" height="60" rx="8" fill="#fffde7" stroke="#f9a825" stroke-width="2" filter="url(#shadow)"/>
  <text x="60" y="18" font-size="11" fill="#f57f17" font-weight="bold" dy="1em">Client-Schicht</text>
  <rect x="60" y="30" width="200" height="30" rx="5" fill="#fff9c4" stroke="#f9a825"/>
  <text x="160" y="50" text-anchor="middle" font-size="12">🌐 Browser / Client</text>
  <rect x="700" y="30" width="200" height="30" rx="5" fill="#fff9c4" stroke="#f9a825"/>
  <text x="800" y="50" text-anchor="middle" font-size="12">🖥️ Blogi Editor (Qt6)</text>

  <!-- Editor-Schicht -->
  <rect x="530" y="100" width="400" height="60" rx="8" fill="#e1f5fe" stroke="#0288d1" stroke-width="2" filter="url(#shadow)"/>
  <text x="550" y="108" font-size="11" fill="#01579b" font-weight="bold" dy="1em">Editor-Schicht</text>
  <rect x="545" y="128" width="110" height="26" rx="4" fill="#b3e5fc" stroke="#0288d1"/>
  <text x="600" y="146" text-anchor="middle" font-size="11">QML UI</text>
  <rect x="668" y="128" width="110" height="26" rx="4" fill="#b3e5fc" stroke="#0288d1"/>
  <text x="723" y="146" text-anchor="middle" font-size="11">Editor Core</text>
  <rect x="791" y="128" width="120" height="26" rx="4" fill="#b3e5fc" stroke="#0288d1"/>
  <text x="851" y="146" text-anchor="middle" font-size="11">Widget-Plugins</text>

  <!-- Pfeile innerhalb Editor -->
  <line x1="655" y1="141" x2="665" y2="141" stroke="#555" stroke-width="1.5" marker-end="url(#arrow)"/>
  <line x1="778" y1="141" x2="788" y2="141" stroke="#555" stroke-width="1.5" marker-end="url(#arrow)"/>

  <!-- Plugin-Schicht -->
  <rect x="30" y="200" width="900" height="80" rx="8" fill="#f3e5f5" stroke="#7b1fa2" stroke-width="2" filter="url(#shadow)"/>
  <text x="60" y="208" font-size="11" fill="#4a148c" font-weight="bold" dy="1em">Plugin-Schicht (13 Plugins · stellen API bereit)</text>
  <rect x="60" y="232" width="260" height="26" rx="4" fill="#e1bee7" stroke="#7b1fa2"/>
  <text x="190" y="250" text-anchor="middle" font-size="11">content · media · staticpage</text>
  <rect x="340" y="232" width="280" height="26" rx="4" fill="#e1bee7" stroke="#7b1fa2"/>
  <text x="480" y="250" text-anchor="middle" font-size="11">navbar · template · contact · survey</text>
  <rect x="640" y="232" width="270" height="26" rx="4" fill="#e1bee7" stroke="#7b1fa2"/>
  <text x="775" y="250" text-anchor="middle" font-size="11">youtube · social · nodeinfo · gtm · …</text>

  <!-- Kern-Schicht -->
  <rect x="30" y="320" width="900" height="80" rx="8" fill="#fff3e0" stroke="#ef6c00" stroke-width="2" filter="url(#shadow)"/>
  <text x="60" y="328" font-size="11" fill="#e65100" font-weight="bold" dy="1em">Kern (blogidev – statische Bibliothek)</text>
  <rect x="60" y="352" width="260" height="26" rx="4" fill="#ffe0b2" stroke="#ef6c00"/>
  <text x="190" y="370" text-anchor="middle" font-size="11">Blogi HTTP Handler · Plugin API</text>
  <rect x="340" y="352" width="280" height="26" rx="4" fill="#ffe0b2" stroke="#ef6c00"/>
  <text x="480" y="370" text-anchor="middle" font-size="11">Auth · Session · Theme · i18n</text>
  <rect x="640" y="352" width="270" height="26" rx="4" fill="#ffe0b2" stroke="#ef6c00"/>
  <text x="775" y="370" text-anchor="middle" font-size="11">Config · Mail · Cookie · Compress</text>

  <!-- Framework-Schicht -->
  <rect x="30" y="440" width="900" height="70" rx="8" fill="#e8f5e9" stroke="#2e7d32" stroke-width="2" filter="url(#shadow)"/>
  <text x="60" y="448" font-size="11" fill="#1b5e20" font-weight="bold" dy="1em">Framework (eigene Bibliotheken)</text>
  <rect x="60" y="468" width="160" height="26" rx="4" fill="#c8e6c9" stroke="#2e7d32"/>
  <text x="140" y="486" text-anchor="middle" font-size="11">libhttppp</text>
  <rect x="240" y="468" width="160" height="26" rx="4" fill="#c8e6c9" stroke="#2e7d32"/>
  <text x="320" y="486" text-anchor="middle" font-size="11">libhtmlpp</text>
  <rect x="420" y="468" width="160" height="26" rx="4" fill="#c8e6c9" stroke="#2e7d32"/>
  <text x="500" y="486" text-anchor="middle" font-size="11">libnetplus</text>
  <rect x="600" y="468" width="160" height="26" rx="4" fill="#c8e6c9" stroke="#2e7d32"/>
  <text x="680" y="486" text-anchor="middle" font-size="11">libcmdplus</text>
  <rect x="780" y="468" width="130" height="26" rx="4" fill="#c8e6c9" stroke="#2e7d32"/>
  <text x="845" y="486" text-anchor="middle" font-size="11">libconfplus</text>

  <!-- Daten & Services -->
  <rect x="30" y="550" width="900" height="70" rx="8" fill="#fce4ec" stroke="#c62828" stroke-width="2" filter="url(#shadow)"/>
  <text x="60" y="558" font-size="11" fill="#b71c1c" font-weight="bold" dy="1em">Daten &amp; Services</text>
  <rect x="60" y="578" width="190" height="26" rx="4" fill="#f8bbd0" stroke="#c62828"/>
  <text x="155" y="596" text-anchor="middle" font-size="11">authdb</text>
  <rect x="270" y="578" width="190" height="26" rx="4" fill="#f8bbd0" stroke="#c62828"/>
  <text x="365" y="596" text-anchor="middle" font-size="11">mediadb</text>
  <rect x="480" y="578" width="190" height="26" rx="4" fill="#f8bbd0" stroke="#c62828"/>
  <text x="575" y="596" text-anchor="middle" font-size="11">libdbpp</text>
  <rect x="690" y="578" width="190" height="26" rx="4" fill="#f8bbd0" stroke="#c62828"/>
  <text x="785" y="596" text-anchor="middle" font-size="11">smtpclient</text>

  <!-- Persistenz-Schicht (libparitypp + Datenbank) -->
  <rect x="30" y="660" width="900" height="60" rx="8" fill="#e8eaf6" stroke="#3949ab" stroke-width="2" filter="url(#shadow)"/>
  <text x="60" y="668" font-size="11" fill="#1a237e" font-weight="bold" dy="1em">Persistenz-Schicht</text>
  <rect x="60" y="680" width="200" height="26" rx="4" fill="#c5cae9" stroke="#3949ab"/>
  <text x="160" y="698" text-anchor="middle" font-size="12" font-weight="bold">libparitypp</text>
  <rect x="280" y="680" width="160" height="26" rx="4" fill="#d1c4e9" stroke="#5e35b1"/>
  <text x="360" y="698" text-anchor="middle" font-size="11">Binärspeicher</text>
  <rect x="530" y="677" width="190" height="32" rx="16" fill="#c5cae9" stroke="#3f51b5" stroke-width="2"/>
  <text x="625" y="698" text-anchor="middle" font-size="12" font-weight="bold" fill="#283593">Datenbank</text>

  <!-- Hilfsbibliotheken -->
  <rect x="30" y="760" width="900" height="70" rx="8" fill="#f5f5f5" stroke="#616161" stroke-width="2" filter="url(#shadow)"/>
  <text x="60" y="768" font-size="11" fill="#212121" font-weight="bold" dy="1em">Hilfsbibliotheken</text>
  <rect x="60" y="788" width="160" height="26" rx="4" fill="#e0e0e0" stroke="#616161"/>
  <text x="140" y="806" text-anchor="middle" font-size="11">Qt6</text>
  <rect x="240" y="788" width="160" height="26" rx="4" fill="#e0e0e0" stroke="#616161"/>
  <text x="320" y="806" text-anchor="middle" font-size="11">json-c</text>
  <rect x="420" y="788" width="160" height="26" rx="4" fill="#e0e0e0" stroke="#616161"/>
  <text x="500" y="806" text-anchor="middle" font-size="11">tinyxml2</text>
  <rect x="600" y="788" width="160" height="26" rx="4" fill="#e0e0e0" stroke="#616161"/>
  <text x="680" y="806" text-anchor="middle" font-size="11">libuuidp</text>
  <rect x="780" y="788" width="130" height="26" rx="4" fill="#e0e0e0" stroke="#616161"/>
  <text x="845" y="806" text-anchor="middle" font-size="11">Brotli</text>



  <!-- ══ Vertikale Pfeile (Schicht → Schicht) ══ -->

  <!-- Browser → Plugin-Schicht -->
  <line x1="160" y1="60" x2="160" y2="197" stroke="#555" stroke-width="1.8" marker-end="url(#arrow)"/>
  <!-- Browser → Kern -->
  <line x1="200" y1="60" x2="200" y2="317" stroke="#999" stroke-width="1.2" stroke-dasharray="5,3" marker-end="url(#arrow)"/>

  <!-- Editor App → Editor-Schicht -->
  <line x1="800" y1="60" x2="800" y2="97" stroke="#555" stroke-width="1.8" marker-end="url(#arrow)"/>

  <!-- Editor-Schicht → Plugin-Schicht -->
  <line x1="730" y1="160" x2="730" y2="197" stroke="#555" stroke-width="1.8" marker-end="url(#arrow)"/>

  <!-- Plugin-Schicht → Kern -->
  <line x1="480" y1="280" x2="480" y2="317" stroke="#555" stroke-width="1.8" marker-end="url(#arrow)"/>

  <!-- Kern → Framework -->
  <line x1="480" y1="400" x2="480" y2="437" stroke="#555" stroke-width="1.8" marker-end="url(#arrow)"/>

  <!-- Kern → Daten & Services -->
  <line x1="680" y1="400" x2="680" y2="547" stroke="#555" stroke-width="1.8" marker-end="url(#arrow)"/>

  <!-- libhttppp → libnetplus -->
  <line x1="220" y1="481" x2="418" y2="481" stroke="#2e7d32" stroke-width="1.4" marker-end="url(#arrow)"/>

  <!-- authdb → libparitypp -->
  <line x1="155" y1="604" x2="155" y2="677" stroke="#3949ab" stroke-width="1.6" marker-end="url(#arrow)"/>

  <!-- mediadb → libparitypp -->
  <line x1="260" y1="604" x2="160" y2="677" stroke="#3949ab" stroke-width="1.6" marker-end="url(#arrow)"/>

  <!-- libdbpp → Datenbank -->
  <line x1="575" y1="604" x2="625" y2="674" stroke="#3f51b5" stroke-width="1.8" marker-end="url(#arrow)"/>

  <!-- libparitypp → Binärspeicher -->
  <line x1="260" y1="693" x2="278" y2="693" stroke="#5e35b1" stroke-width="1.4" marker-end="url(#arrow)"/>

  <!-- Legende -->
  <rect x="30" y="850" width="900" height="60" rx="6" fill="#fafafa" stroke="#ccc"/>
  <text x="50" y="870" font-size="11" font-weight="bold" fill="#333">Legende:</text>
  <line x1="120" y1="866" x2="160" y2="866" stroke="#555" stroke-width="1.8" marker-end="url(#arrow)"/>
  <text x="168" y="870" font-size="11" fill="#555">Abhängigkeit</text>
  <line x1="280" y1="866" x2="320" y2="866" stroke="#999" stroke-width="1.2" stroke-dasharray="5,3" marker-end="url(#arrow)"/>
  <text x="328" y="870" font-size="11" fill="#555">Direktzugriff (HTTP)</text>

  <rect x="50" y="884" width="14" height="14" rx="3" fill="#fffde7" stroke="#f9a825"/>
  <text x="72" y="896" font-size="11" fill="#555">Client</text>
  <rect x="130" y="884" width="14" height="14" rx="3" fill="#e1f5fe" stroke="#0288d1"/>
  <text x="152" y="896" font-size="11" fill="#555">Editor</text>
  <rect x="210" y="884" width="14" height="14" rx="3" fill="#f3e5f5" stroke="#7b1fa2"/>
  <text x="232" y="896" font-size="11" fill="#555">Plugins</text>
  <rect x="300" y="884" width="14" height="14" rx="3" fill="#fff3e0" stroke="#ef6c00"/>
  <text x="322" y="896" font-size="11" fill="#555">Kern</text>
  <rect x="370" y="884" width="14" height="14" rx="3" fill="#e8f5e9" stroke="#2e7d32"/>
  <text x="392" y="896" font-size="11" fill="#555">Framework</text>
  <rect x="470" y="884" width="14" height="14" rx="3" fill="#fce4ec" stroke="#c62828"/>
  <text x="492" y="896" font-size="11" fill="#555">Daten</text>
  <rect x="550" y="884" width="14" height="14" rx="3" fill="#e8eaf6" stroke="#3949ab"/>
  <text x="572" y="896" font-size="11" fill="#555">Persistenz</text>
  <rect x="650" y="884" width="14" height="14" rx="3" fill="#f5f5f5" stroke="#616161"/>
  <text x="672" y="896" font-size="11" fill="#555">Hilfslibs</text>
</svg>
+9 −2
Original line number Diff line number Diff line
@@ -936,9 +936,16 @@ namespace blogi {
                }

                // Stream from mediadb via GetStream
                // Videos use /raw endpoint; images use /preview with optional resize params
                // Videos and untransformed images use /raw; images needing resize/conversion use /preview
                std::string rawUrl;
                if (isVideo) {
                bool needsTransform = (reqWidth > 0 || reqHeight > 0);
                if(!needsTransform && !fmt.empty()){
                    std::string origExt;
                    size_t dp = mi.filename.rfind('.');
                    if(dp != std::string::npos) origExt = mi.filename.substr(dp + 1);
                    if(fmt != origExt) needsTransform = true;
                }
                if (isVideo || !needsTransform) {
                    rawUrl = "/media/" + mediaId + "/raw";
                } else {
                    rawUrl = "/media/" + mediaId + "/preview";