diff --git a/.gitignore b/.gitignore
index c4aab041b..906aa8dd9 100755
--- a/.gitignore
+++ b/.gitignore
@@ -1,32 +1,23 @@
-# Compiled Object files.
*.slo
*.lo
*.o
*.obj
-
-# Compiled Dynamic libraries.
*.so
*.dylib
*.dll
-
-# Compiled Static libraries.
*.lai
*.la
*.a
*.lib
-
-# Executables.
*.exe
*.out
*.app
-
-# Other files.
*.autosave
*.user*
localization/*qm
*.TMP
resources/skins/*/*.map
-
-# Build directory.
+aqtinstall.log
+.sass-cache
build-dir/
docs/build
\ No newline at end of file
diff --git a/docs/source/features/mediaplayer.md b/docs/source/features/mediaplayer.md
new file mode 100644
index 000000000..008031237
--- /dev/null
+++ b/docs/source/features/mediaplayer.md
@@ -0,0 +1,17 @@
+Media Player
+============
+RSS Guard offers some abilities everyone would expect from typical podcast client. It offers built-in media player on some platforms:
+* All[^1] [non-`lite`](../variants) builds offer `libmpv`-based media player which supports almost all features offered by `libmpv`, including keyboar d/mouse navigation, on-screen controller and custom configuration files loading. At this point. Also, `yt-dlp` is deployed on some[^2] platforms which allows comfortable Youtube videos playback.
+* All [`lite`](../variants) include more basic media player based on `QtMultimedia` backend. This backend is usually itself based on `ffmpeg` so it can play fairly wide range of media formats.
+
+[^1]: At this point, precompiled binaries for Mac OS X do not have this backend enabled and rely on `QtMultimedia` backend instead.
+[^2]: `yt-dlp` is contained in binaries for Windows. For other operating systems, I recommend to install `yt-dlp` or `youtube-dl` system-wide and add it to your `PATH` environment variable. Also, custom path to the tool can be tweaked in `mpv.conf`.
+
+## Usage
+This feature is available for each hyperlink URL. You can either right-click any link in embedded article/web browser or you can use `Articles -> Play in media player` menu item.
+
+## Configuration
+See `Settings -> Media player` configuration section in RSS Guard. User data [placeholder](userdata) is supported.
+
+## `libmpv` Backend
+Note that this backend does support full `mpv` configuration mechanism. You can set path to custom configuration folder in settings (see above). If you select empty folder, then RSS Guard automatically copies sample configuration files into it.
\ No newline at end of file
diff --git a/docs/source/variants.md b/docs/source/variants.md
new file mode 100644
index 000000000..fbcb4ef74
--- /dev/null
+++ b/docs/source/variants.md
@@ -0,0 +1,6 @@
+Variants
+========
+RSS Guard is distributed in two flavours:
+* Full package with `QtWebEngine`-based bundled article viewer: This variant displays articles with their full formatting and layout in embedded Chromium-based web browser. This variant of RSS Guard should be okay for everyone. Also, installation packages are relatively big. Also, this RSS Guard flavor offers more powerful [media player](features/mediaplayer).
+
+* Lite package with simple text-based article viewer: This variant displays article in a much simpler and much more lightweight web viewer component. All packages of this variant have `lite` keyword in their names. This flavor of RSS Guard does NOT have a JavaScript support and is meant for people who value their privacy. Also, it offers more limited media player.
\ No newline at end of file
diff --git a/resources/rssguard.qrc b/resources/rssguard.qrc
index 551ec4d09..2a2e78e7c 100644
--- a/resources/rssguard.qrc
+++ b/resources/rssguard.qrc
@@ -83,6 +83,8 @@
skins/nudus-base/html_enclosure_image.html
skins/nudus-base/html_single_message.html
skins/nudus-base/html_wrapper.html
+ skins/nudus-base/lite_html_enclosure_every.html
+ skins/nudus-base/lite_html_single_message.html
skins/nudus-dark/html_wrapper.html
skins/nudus-dark/html_style.css
@@ -92,6 +94,7 @@
skins/nudus-light/html_style.css
skins/nudus-light/metadata.xml
skins/nudus-light/qt_style.qss
+ skins/nudus-light/lite_html_style.css
initial_feeds/feeds-en_US.opml
diff --git a/resources/skins/nudus-base/lite_html_enclosure_every.html b/resources/skins/nudus-base/lite_html_enclosure_every.html
new file mode 100644
index 000000000..5436edb38
--- /dev/null
+++ b/resources/skins/nudus-base/lite_html_enclosure_every.html
@@ -0,0 +1 @@
+ %2%3
\ No newline at end of file
diff --git a/resources/skins/nudus-base/lite_html_single_message.html b/resources/skins/nudus-base/lite_html_single_message.html
new file mode 100644
index 000000000..a0de106e0
--- /dev/null
+++ b/resources/skins/nudus-base/lite_html_single_message.html
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/resources/skins/nudus-base/lite_html_style_base.scss b/resources/skins/nudus-base/lite_html_style_base.scss
new file mode 100644
index 000000000..ef4522001
--- /dev/null
+++ b/resources/skins/nudus-base/lite_html_style_base.scss
@@ -0,0 +1,28 @@
+body,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p,
+blockquote,
+pre,
+hr,
+dl,
+dd,
+ol,
+ul,
+figure {
+ margin: 0;
+ padding: 0;
+}
+
+body {
+ background-color: $col_back;
+ color: $col_front;
+}
+
+a {
+ color: $col_link;
+}
\ No newline at end of file
diff --git a/resources/skins/nudus-light/html_style.css b/resources/skins/nudus-light/html_style.css
index d04d749ec..27ecf833f 100644
--- a/resources/skins/nudus-light/html_style.css
+++ b/resources/skins/nudus-light/html_style.css
@@ -1,15 +1,13 @@
@charset "UTF-8";
* {
font-family: inherit;
- font-size: inherit;
-}
+ font-size: inherit; }
body, h1, h2, h3, h4, h5, h6,
p, blockquote, pre, hr,
dl, dd, ol, ul, figure {
margin: 0;
- padding: 0;
-}
+ padding: 0; }
body {
background-color: #FBFBFB;
@@ -19,148 +17,115 @@ body {
-webkit-font-feature-settings: "kern" 1;
font-feature-settings: "kern" 1;
font-kerning: normal;
- min-height: 100vh;
-}
+ min-height: 100vh; }
::selection {
background-color: #5D88D2;
- text-shadow: none;
-}
+ text-shadow: none; }
h1, h2, h3, h4, h5, h6,
p, blockquote, pre,
ul, ol, dl, figure,
details {
- margin-bottom: 10px;
-}
+ margin-bottom: 10px; }
hr {
background-color: #CFCFCF;
border: none;
display: block;
height: 2px;
- margin: 10px 0;
-}
+ margin: 10px 0; }
h1, h2, h3, h4, h5, h6 {
- font-weight: 600 !important;
-}
+ font-weight: 600 !important; }
h1 {
- font-size: 1.25rem !important;
-}
+ font-size: 1.25rem !important; }
h2 {
- font-size: 1.20rem !important;
-}
+ font-size: 1.20rem !important; }
h3 {
- font-size: 1.15rem !important;
-}
+ font-size: 1.15rem !important; }
h4 {
- font-size: 1.1rem !important;
-}
+ font-size: 1.1rem !important; }
h5 {
- font-size: 1rem !important;
-}
+ font-size: 1rem !important; }
h6 {
- font-size: .95rem !important;
-}
+ font-size: .95rem !important; }
b {
- font-weight: bold !important;
-}
+ font-weight: bold !important; }
i {
- font-style: italic !important;
-}
+ font-style: italic !important; }
strong {
- font-weight: 800 !important;
-}
+ font-weight: 800 !important; }
em {
- font-style: oblique !important;
-}
+ font-style: oblique !important; }
mark {
- background-color: #FFECCC;
-}
+ background-color: #FFECCC; }
sub,
sup {
- font-size: .8rem !important;
-}
+ font-size: .8rem !important; }
small {
- font-size: .9rem !important;
-}
+ font-size: .9rem !important; }
abbr {
cursor: help;
font-style: italic !important;
- font-weight: 100 !important;
-}
+ font-weight: 100 !important; }
q {
- font-style: italic !important;
-}
-q::before {
- content: '“';
-}
-q::after {
- content: '”';
-}
+ font-style: italic !important; }
+ q::before {
+ content: '“'; }
+ q::after {
+ content: '”'; }
time {
- font-weight: 450 !important;
-}
+ font-weight: 450 !important; }
var {
font-style: oblique !important;
- font-weight: 500 !important;
-}
+ font-weight: 500 !important; }
a {
- color: #5D88D2;
-}
-a:hover {
- text-decoration: none;
-}
-a:focus {
- box-shadow: none;
- outline: none;
-}
+ color: #5D88D2; }
+ a:hover {
+ text-decoration: none; }
+ a:focus {
+ box-shadow: none;
+ outline: none; }
cite {
font-style: italic !important;
- font-weight: bold !important;
-}
+ font-weight: bold !important; }
figure {
- max-width: 100%;
-}
+ max-width: 100%; }
figure > img {
- display: block;
-}
+ display: block; }
figcaption {
- font-size: .8rem !important;
-}
+ font-size: .8rem !important; }
blockquote {
border-left: 0.3em solid #CFCFCF;
margin-left: 0;
- padding: 0 10px;
-}
-blockquote,
-blockquote p {
- color: #343434;
-}
+ padding: 0 10px; }
+ blockquote,
+ blockquote p {
+ color: #343434; }
pre,
code {
@@ -168,14 +133,12 @@ code {
border-radius: 0.1em;
color: #343434;
font-family: monospace;
- font-size: .95rem !important;
-}
+ font-size: .95rem !important; }
code {
background-color: #F1F1F1;
padding: 0 .25em;
- word-break: break-word;
-}
+ word-break: break-word; }
pre {
background-color: #F1F1F1;
@@ -183,16 +146,14 @@ pre {
padding: 7px 13px;
tab-size: 2;
white-space: pre !important;
- width: unset !important;
-}
-pre > code {
- background-color: unset;
- border: none;
- color: unset;
- padding-right: 0;
- padding-left: 0;
- tab-size: 2;
-}
+ width: unset !important; }
+ pre > code {
+ background-color: unset;
+ border: none;
+ color: unset;
+ padding-right: 0;
+ padding-left: 0;
+ tab-size: 2; }
kbd {
background: #F1F1F1;
@@ -201,8 +162,7 @@ kbd {
border-radius: 0.1em;
box-shadow: 0 2px 4px #ececec, inset 0 1px #FBFBFB;
font-size: .9rem !important;
- padding: .1em .4em .2em .4em;
-}
+ padding: .1em .4em .2em .4em; }
select {
background-color: #F1F1F1;
@@ -210,138 +170,105 @@ select {
border-radius: 0.1em;
color: #000000;
padding: .04em .25em;
- width: 100%;
-}
-select:focus {
- box-shadow: none;
- outline: none;
- background-color: #FBFBFB;
-}
-select > option {
- background-color: #FBFBFB;
-}
+ width: 100%; }
+ select:focus {
+ box-shadow: none;
+ outline: none;
+ background-color: #FBFBFB; }
+ select > option {
+ background-color: #FBFBFB; }
table {
border-collapse: collapse;
- width: 100% !important;
-}
+ width: 100% !important; }
li {
- display: list-item;
-}
+ display: list-item; }
ul,
ol {
- padding-left: 1.5em;
-}
+ padding-left: 1.5em; }
ul {
- list-style-type: disc;
-}
-ul li ul {
- list-style-type: square;
-}
+ list-style-type: disc; }
+ ul li ul {
+ list-style-type: square; }
ol {
- list-style-type: decimal;
-}
-ol li ol {
- list-style-type: lower-roman;
-}
+ list-style-type: decimal; }
+ ol li ol {
+ list-style-type: lower-roman; }
img {
- height: auto;
-}
+ height: auto; }
details {
border: 1px solid #F1F1F1;
border-radius: 0.1em;
- padding: .5em .5em 0;
-}
-details > summary {
- background-color: #F1F1F1;
- border-radius: 0.09em;
- cursor: pointer;
- margin: -.5em -.5em 0;
- padding-left: .5em;
-}
-details > summary:focus {
- box-shadow: none;
- outline: none;
-}
-details *:last-child {
- margin-bottom: 0;
-}
+ padding: .5em .5em 0; }
+ details > summary {
+ background-color: #F1F1F1;
+ border-radius: 0.09em;
+ cursor: pointer;
+ margin: -.5em -.5em 0;
+ padding-left: .5em; }
+ details > summary:focus {
+ box-shadow: none;
+ outline: none; }
+ details *:last-child {
+ margin-bottom: 0; }
details[open] {
border-color: #DEDEDE;
- padding: .5em;
-}
-details[open] > summary {
- border-bottom: 1px solid #DEDEDE;
- border-radius: 0.09em 0.09em 0 0;
- margin-bottom: .5em;
-}
+ padding: .5em; }
+ details[open] > summary {
+ border-bottom: 1px solid #DEDEDE;
+ border-radius: 0.09em 0.09em 0 0;
+ margin-bottom: .5em; }
iframe {
max-width: 100%;
height: auto;
- width: auto;
-}
+ width: auto; }
a:focus,
select:focus,
summary:focus {
background-color: #DEDEDE;
- text-shadow: 0 -1px #FBFBFB;
-}
+ text-shadow: 0 -1px #FBFBFB; }
:target {
- outline: 1px solid #5D88D2;
-}
+ outline: 1px solid #5D88D2; }
.rssguard-mwrapper {
- padding: 10px !important;
-}
-.rssguard-mwrapper .rssguard-mhead .msmall,
-.rssguard-mwrapper .rssguard-mhead .mlinks {
- opacity: .8;
-}
-.rssguard-mwrapper .rssguard-mhead > h1 {
- margin: 0;
-}
-.rssguard-mwrapper .rssguard-mhead .msmall {
- font-size: .9em;
-}
-.rssguard-mwrapper .rssguard-mhead .mlinks .menc {
- word-break: break-word;
-}
-.rssguard-mwrapper .rssguard-mhead .mlinks .mwrapurl {
- display: inline-flex;
-}
-.rssguard-mwrapper .rssguard-mhead .mlinks .mwrapurl a[href=""], .rssguard-mwrapper .rssguard-mhead .mlinks .mwrapurl a[href=""] + span {
- display: none;
-}
-.rssguard-mwrapper .rssguard-mbody img {
- max-width: 450px !important;
- max-height: unset !important;
-}
-@media only screen and (max-width: 800px) {
+ padding: 10px !important; }
+ .rssguard-mwrapper .rssguard-mhead .msmall,
+ .rssguard-mwrapper .rssguard-mhead .mlinks {
+ opacity: .8; }
+ .rssguard-mwrapper .rssguard-mhead > h1 {
+ margin: 0; }
+ .rssguard-mwrapper .rssguard-mhead .msmall {
+ font-size: .9em; }
+ .rssguard-mwrapper .rssguard-mhead .mlinks .menc {
+ word-break: break-word; }
+ .rssguard-mwrapper .rssguard-mhead .mlinks .mwrapurl {
+ display: inline-flex; }
+ .rssguard-mwrapper .rssguard-mhead .mlinks .mwrapurl a[href=""], .rssguard-mwrapper .rssguard-mhead .mlinks .mwrapurl a[href=""] + span {
+ display: none; }
.rssguard-mwrapper .rssguard-mbody img {
- max-width: 100% !important;
- }
-}
+ max-width: 450px !important;
+ max-height: unset !important; }
+ @media only screen and (max-width: 800px) {
+ .rssguard-mwrapper .rssguard-mbody img {
+ max-width: 100% !important; } }
.rssguard-mbody {
- word-break: break-word;
-}
+ word-break: break-word; }
table {
- word-break: normal;
-}
+ word-break: normal; }
::selection {
- color: #F1F1F1;
-}
+ color: #F1F1F1; }
/*# sourceMappingURL=html_style.css.map */
diff --git a/resources/skins/nudus-light/lite_html_style.css b/resources/skins/nudus-light/lite_html_style.css
new file mode 100644
index 000000000..2da6139a2
--- /dev/null
+++ b/resources/skins/nudus-light/lite_html_style.css
@@ -0,0 +1,25 @@
+body,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p,
+blockquote,
+pre,
+hr,
+dl,
+dd,
+ol,
+ul,
+figure {
+ margin: 0;
+ padding: 0; }
+
+body {
+ background-color: #FBFBFB;
+ color: #000000; }
+
+a {
+ color: #0f80f1; }
diff --git a/resources/skins/nudus-light/lite_html_style.scss b/resources/skins/nudus-light/lite_html_style.scss
new file mode 100644
index 000000000..3a375fdad
--- /dev/null
+++ b/resources/skins/nudus-light/lite_html_style.scss
@@ -0,0 +1,7 @@
+@charset "utf-8";
+
+$col_back: #FBFBFB !default;
+$col_front: #000000 !default;
+$col_link: #0f80f1 !default;
+
+@import "../nudus-base/lite_html_style_base";
\ No newline at end of file
diff --git a/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp b/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp
index cb3f78538..7af0774e0 100644
--- a/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp
+++ b/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp
@@ -38,6 +38,7 @@ TextBrowserViewer::TextBrowserViewer(QWidget* parent)
setDocument(m_document.data());
// Apply master CSS.
+ /*
QColor a_color = qApp->skins()->colorForModel(SkinEnums::PaletteColors::FgInteresting).value();
if (!a_color.isValid()) {
@@ -45,6 +46,7 @@ TextBrowserViewer::TextBrowserViewer(QWidget* parent)
}
m_document.data()->setDefaultStyleSheet(QSL("a { color: %1; }").arg(a_color.name()));
+ */
/*
m_document->setDefaultStyleSheet("p {"