Loading architecture_overview.avif 0 → 100644 +24.7 KiB File added.No diff preview for this file type. View file architecture_overview.svg 0 → 100644 +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 & 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> plugins/media/media.cpp +9 −2 Original line number Diff line number Diff line Loading @@ -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"; Loading Loading
architecture_overview.avif 0 → 100644 +24.7 KiB File added.No diff preview for this file type. View file
architecture_overview.svg 0 → 100644 +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 & 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>
plugins/media/media.cpp +9 −2 Original line number Diff line number Diff line Loading @@ -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"; Loading