Merge pull request #1241 from chme/webui-owntone

Web interface "OwnTone"
This commit is contained in:
Christian Meffert 2021-05-15 07:33:38 +02:00 committed by GitHub
commit 760d5af435
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
32 changed files with 2928 additions and 4125 deletions

View File

@ -8,7 +8,8 @@ htdocsdir = $(datadir)/owntone/htdocs
dist_htdocs_DATA = \
$(WEBINTERFACE_SRC) \
android-chrome-96x96.png \
android-chrome-192x192.png \
android-chrome-512x512.png \
apple-touch-icon.png \
browserconfig.xml \
favicon.ico \

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 523 B

After

Width:  |  Height:  |  Size: 875 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 935 B

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
htdocs/favicon.ico Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -1 +1 @@
<!DOCTYPE html><html class="has-navbar-fixed-top has-navbar-fixed-bottom"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>forked-daapd-web 2</title><link rel="apple-touch-icon" sizes="120x120" href="apple-touch-icon.png?ver1.1"><link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png"><link rel="manifest" href="site.webmanifest"><link rel="mask-icon" href="safari-pinned-tab.svg" color="#5bbad5"><meta name="msapplication-TileColor" content="#da532c"><meta name="theme-color" content="#ffffff"><link href="player/css/app.css" rel="preload" as="style"><link href="player/css/chunk-vendors.css" rel="preload" as="style"><link href="player/js/app.js" rel="modulepreload" as="script"><link href="player/js/chunk-vendors.js" rel="modulepreload" as="script"><link href="player/css/chunk-vendors.css" rel="stylesheet"><link href="player/css/app.css" rel="stylesheet"></head><body><div id="app"></div><script type="module" src="player/js/chunk-vendors.js"></script><script type="module" src="player/js/app.js"></script><script>!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script><script src="player/js/chunk-vendors-legacy.js" nomodule></script><script src="player/js/app-legacy.js" nomodule></script></body></html>
<!DOCTYPE html><html class="has-navbar-fixed-top has-navbar-fixed-bottom"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>OwnTone Web</title><link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png?ver2.0"><link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png"><link rel="manifest" href="site.webmanifest"><link rel="mask-icon" href="safari-pinned-tab.svg" color="#5bbad5"><meta name="msapplication-TileColor" content="#da532c"><meta name="theme-color" content="#ffffff"><link href="player/css/app.css" rel="preload" as="style"><link href="player/css/chunk-vendors.css" rel="preload" as="style"><link href="player/js/app.js" rel="modulepreload" as="script"><link href="player/js/chunk-vendors.js" rel="modulepreload" as="script"><link href="player/css/chunk-vendors.css" rel="stylesheet"><link href="player/css/app.css" rel="stylesheet"></head><body><div id="app"></div><script type="module" src="player/js/chunk-vendors.js"></script><script type="module" src="player/js/app.js"></script><script>!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script><script src="player/js/chunk-vendors-legacy.js" nomodule></script><script src="player/js/app-legacy.js" nomodule></script></body></html>

370
htdocs/logo.svg Executable file → Normal file
View File

@ -1,353 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!-- Generator: Adobe Illustrator 25.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" style="enable-background:new 0 0 128 128;" xml:space="preserve">
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<style type="text/css">
.st0{fill:#00D1B2;}
.st1{clip-path:url(#SVGID_2_);fill:#479386;}
.st2{clip-path:url(#SVGID_4_);fill:#479386;}
.st3{clip-path:url(#SVGID_6_);fill:#479386;}
.st4{clip-path:url(#SVGID_8_);fill:#479386;}
.st5{clip-path:url(#SVGID_10_);fill:#479386;}
.st6{clip-path:url(#SVGID_12_);fill:#479386;}
.st7{clip-path:url(#SVGID_14_);fill:#479386;}
.st8{clip-path:url(#SVGID_16_);fill:#479386;}
.st9{clip-path:url(#SVGID_18_);fill:#479386;}
.st10{clip-path:url(#SVGID_20_);fill:#479386;}
.st11{clip-path:url(#SVGID_22_);fill:#479386;}
.st12{clip-path:url(#SVGID_24_);fill:#479386;}
.st13{clip-path:url(#SVGID_26_);fill:#479386;}
.st14{clip-path:url(#SVGID_28_);fill:#479386;}
.st15{clip-path:url(#SVGID_30_);fill:#479386;}
.st16{clip-path:url(#SVGID_32_);fill:#479386;}
.st17{clip-path:url(#SVGID_34_);fill:#479386;}
.st18{clip-path:url(#SVGID_36_);fill:#479386;}
.st19{clip-path:url(#SVGID_38_);fill:#479386;}
.st20{clip-path:url(#SVGID_40_);fill:#479386;}
.st21{clip-path:url(#SVGID_42_);fill:#479386;}
.st22{clip-path:url(#SVGID_44_);fill:#479386;}
.st23{clip-path:url(#SVGID_46_);fill:#479386;}
.st24{clip-path:url(#SVGID_48_);fill:#479386;}
.st25{clip-path:url(#SVGID_50_);fill:#479386;}
.st26{clip-path:url(#SVGID_52_);fill:#479386;}
.st27{fill:#FFFFFF;}
.st0{fill:#107A66;}
.st1{fill:#479386;}
.st2{fill:#00D1B2;}
.st3{fill:#FFFFFF;}
</style>
<polygon class="st0" points="20.4,64.1 20.4,9.5 67.7,36.9 115,64.1 67.7,91.5 20.4,118.7 "/>
<path class="st0" d="M390.5,193.9h30.3c18.5,49.6,13.9,104.8-12.7,150.6c-5.1,8.8-11,17.2-17.6,24.9V193.9z"/>
<path class="st1" d="M440.3,163.9h-79.8v269.6C453.8,378.5,488.6,260.8,440.3,163.9L440.3,163.9z"/>
<path class="st2" d="M256,432c-97,0-176-79-176-176S159,80,256,80c26.9-0.1,53.4,6.1,77.5,17.9H187.9v96h99.8v235.2
C277.2,431,266.6,432,256,432z"/>
<path class="st1" d="M157.9,147.8v76.1h99.8v178H256c-80.6,0-146-65.4-145.9-146.1c0-38.7,15.4-75.8,42.7-103.1
C154.4,151,156.1,149.4,157.9,147.8 M256,50C142.2,50,50,142.2,50,256s92.2,206,206,206c20.9,0,41.7-3.2,61.7-9.4V163.9h-99.8v-36
h199.4C378.3,78.6,318.8,49.9,256,50z"/>
<path class="st2" d="M429.7,183.5c19.7,46.8,19.7,99.6,0,146.4c-12.9,30.1-33.2,56.4-59.2,76.3v3.8c48.5-36,77-92.9,77-153.3
c0.1-28.4-6.3-56.4-18.5-82h-3.3C427.1,177.6,428.5,180.5,429.7,183.5z"/>
<path class="st2" d="M434,256.7c0.1-28.5-6.8-56.7-20-82h-3.4c2.4,4.6,4.7,9.3,6.7,14.1c18.3,43.4,18.3,92.4,0,135.8
c-8.8,20.7-21.5,39.6-37.4,55.5c-3,3-6.2,5.9-9.4,8.7v3.9C410.8,359,434,309.2,434,256.7z"/>
<path class="st2" d="M420.5,256.7c0-28.8-7.5-57.1-21.9-82h-3.5c3.7,6.2,6.9,12.7,9.8,19.3c25.6,60.3,11.9,130.1-34.4,176.4v4.2
C402.5,343.7,420.5,301.2,420.5,256.7z"/>
<path class="st2" d="M382.7,174.7h-3.5c5.2,7.8,9.6,16,13.2,24.6c21.3,50.5,12.9,108.7-21.9,151v4.7
C414.2,304.3,419.1,230.8,382.7,174.7z"/>
<path class="st2" d="M370.5,180.7v5.5c26.7,43.2,26.7,97.8,0,141v5.5C401.1,286.7,401.1,226.7,370.5,180.7z"/>
<g>
<g>
<defs>
<path id="SVGID_1_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="8.3" class="st1" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_3_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="12.8" class="st2" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_5_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_6_">
<use xlink:href="#SVGID_5_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="17.2" class="st3" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_7_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_8_">
<use xlink:href="#SVGID_7_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="21.6" class="st4" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_9_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_10_">
<use xlink:href="#SVGID_9_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="26" class="st5" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_11_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_12_">
<use xlink:href="#SVGID_11_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="30.6" class="st6" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_13_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_14_">
<use xlink:href="#SVGID_13_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="35" class="st7" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_15_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_16_">
<use xlink:href="#SVGID_15_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="39.4" class="st8" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_17_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_18_">
<use xlink:href="#SVGID_17_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="43.8" class="st9" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_19_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_20_">
<use xlink:href="#SVGID_19_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="48.3" class="st10" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_21_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_22_">
<use xlink:href="#SVGID_21_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="52.8" class="st11" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_23_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_24_">
<use xlink:href="#SVGID_23_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="57.2" class="st12" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_25_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_26_">
<use xlink:href="#SVGID_25_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="61.6" class="st13" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_27_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_28_">
<use xlink:href="#SVGID_27_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="66" class="st14" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_29_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_30_">
<use xlink:href="#SVGID_29_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="70.5" class="st15" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_31_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_32_">
<use xlink:href="#SVGID_31_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="74.9" class="st16" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_33_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_34_">
<use xlink:href="#SVGID_33_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="79.4" class="st17" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_35_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_36_">
<use xlink:href="#SVGID_35_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="83.8" class="st18" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_37_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_38_">
<use xlink:href="#SVGID_37_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="88.3" class="st19" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_39_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_40_">
<use xlink:href="#SVGID_39_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="92.7" class="st20" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_41_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_42_">
<use xlink:href="#SVGID_41_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="97.1" class="st21" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_43_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_44_">
<use xlink:href="#SVGID_43_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="101.5" class="st22" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_45_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_46_">
<use xlink:href="#SVGID_45_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="106.1" class="st23" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_47_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_48_">
<use xlink:href="#SVGID_47_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="110.5" class="st24" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_49_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_50_">
<use xlink:href="#SVGID_49_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="114.9" class="st25" width="124.3" height="1"/>
</g>
<g>
<defs>
<path id="SVGID_51_" d="M116.2,62L69,34.6L21.7,7.4C21.3,7.1,20.8,7,20.4,7s-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6
c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1S117,62.3,116.2,62z"
/>
</defs>
<clipPath id="SVGID_52_">
<use xlink:href="#SVGID_51_" style="overflow:visible;"/>
</clipPath>
<rect x="4.9" y="119.3" class="st26" width="124.3" height="1"/>
</g>
</g>
<path class="st0" d="M20.4,9.5l47.3,27.4L115,64.2L67.7,91.5l-47.3,27.4V64.1L20.4,9.5 M20.4,7c-0.4,0-0.9,0.1-1.3,0.4
c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4L69,93.5l47.3-27.4
c0.8-0.5,1.3-1.3,1.3-2.1s-0.5-1.8-1.3-2.1L69,34.6L21.7,7.4C21.3,7.1,20.9,7,20.4,7L20.4,7z"/>
<g>
<path class="st27" d="M20.4,119.9c-0.3,0-0.4,0-0.6-0.1c-0.4-0.3-0.6-0.6-0.6-1.1V9.5c0-0.5,0.3-0.9,0.6-1.1
c0.3-0.1,0.4-0.1,0.6-0.1s0.4,0,0.6,0.1l37.6,21.7c0.4,0.3,0.6,0.6,0.6,1.1v12.2c0,0.4-0.3,0.9-0.6,1c-0.3,0.1-0.5,0.3-0.6,0.3
c-0.1,0-0.4,0-0.5-0.1L33.8,33.8v17.3l24.5,4.8c0.6,0.1,1,0.6,1,1.3v10.6c0,0.4-0.1,0.6-0.4,0.9C58.6,68.9,58.4,69,58,69l-23.8-1.8
v44.1c0,0.5-0.3,0.9-0.6,1.1l-12.5,7.2C20.9,119.9,20.7,119.9,20.4,119.9z"/>
<g>
<path class="st0" d="M20.4,9.5L58,31.2v12.2L32.5,32v20.3l25.5,5v10.6L32.9,66v45.4l-12.5,7.2V64.1L20.4,9.5 M20.4,7
c-0.4,0-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v54.6v54.6c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4s0.9-0.1,1.3-0.4
l12.5-7.2c0.8-0.5,1.3-1.3,1.3-2.1V68.8l22.4,1.6H58c0.6,0,1.3-0.3,1.8-0.6c0.5-0.5,0.8-1.1,0.8-1.9V57.3c0-1.3-0.9-2.3-2-2.5
l-23.3-4.7V35.9L57,45.7c0.4,0.1,0.6,0.3,1,0.3c0.5,0,1-0.1,1.4-0.4c0.8-0.5,1.1-1.3,1.1-2.1V31.2c0-0.9-0.5-1.8-1.3-2.1L21.7,7.4
C21.3,7.1,20.9,7,20.4,7L20.4,7z"/>
</g>
</g>
<g>
<g>
<path class="st27" d="M65.8,93.8c-0.3,0-0.4,0-0.6-0.1c-0.4-0.3-0.6-0.6-0.6-1.1V35.7c0-0.5,0.3-0.9,0.6-1.1
c0.3-0.1,0.4-0.1,0.6-0.1c0.3,0,0.4,0,0.6,0.1L115.6,63c0.4,0.3,0.6,0.6,0.6,1.1s-0.3,0.9-0.6,1.1L66.4,93.6
C66.2,93.7,65.9,93.8,65.8,93.8z M77,76.7L98,63.6L77.2,52.4L77,76.7z"/>
</g>
<g>
<path class="st0" d="M65.8,35.7l1.9,1.1L115,64.2L67.7,91.5l-1.9,1.1V35.7 M75.8,79l24.8-15.5L76,50.4L75.8,79 M65.8,33.2
c-0.4,0-0.9,0.1-1.3,0.4c-0.8,0.5-1.3,1.3-1.3,2.1v56.8c0,0.9,0.5,1.8,1.3,2.1c0.4,0.3,0.9,0.4,1.3,0.4c0.4,0,0.9-0.1,1.3-0.4
l1.9-1.1l47.3-27.4c0.8-0.5,1.3-1.3,1.3-2.1c0-0.9-0.5-1.8-1.3-2.1L69,34.6l-1.9-1.1C66.7,33.3,66.2,33.2,65.8,33.2L65.8,33.2z
M78.3,74.4l0.3-19.9l17,9.2L78.3,74.4L78.3,74.4z"/>
</g>
<path class="st3" d="M417.3,127.9H217.9v36h99.8v288.7c15.1-4.7,29.5-11.2,42.8-19.1V163.9h79.8C433.9,151.1,426.2,139,417.3,127.9
z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -2,14 +2,41 @@
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="128.000000pt" height="128.000000pt" viewBox="0 0 128.000000 128.000000"
width="700.000000pt" height="700.000000pt" viewBox="0 0 700.000000 700.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,128.000000) scale(0.100000,-0.100000)"
<g transform="translate(0.000000,700.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M164 625 c0 -267 4 -485 8 -485 5 0 225 108 490 241 l481 241 -486
244 c-267 134 -487 244 -489 244 -2 0 -4 -218 -4 -485z"/>
<path d="M3173 6294 c-330 -40 -614 -124 -918 -274 -299 -147 -489 -284 -741
-535 -250 -249 -386 -439 -540 -750 -128 -260 -212 -532 -261 -845 -26 -164
-26 -616 0 -780 87 -555 303 -1035 647 -1435 450 -523 1045 -852 1740 -960
141 -22 515 -31 662 -16 159 17 324 46 461 83 l117 31 0 1973 0 1974 -680 0
-680 0 0 250 0 250 1356 0 1355 0 -22 33 c-12 17 -97 106 -188 197 -250 249
-439 385 -746 535 -310 152 -615 240 -954 274 -140 15 -470 12 -608 -5z m-333
-2354 l680 0 0 -1215 0 -1215 -79 0 c-261 0 -571 79 -836 212 -187 94 -331
197 -488 347 -391 375 -607 885 -607 1431 0 531 200 1020 572 1400 l73 75 3
-517 2 -518 680 0z"/>
<path d="M4930 2920 l0 -1841 23 12 c43 23 193 127 287 199 136 104 389 362
496 505 298 398 476 825 550 1317 21 145 30 505 15 654 -32 315 -117 629 -244
907 l-40 87 -543 0 -544 0 0 -1840z m318 1662 c38 -53 131 -237 168 -332 90
-231 133 -441 141 -686 9 -264 -21 -479 -103 -724 -74 -222 -168 -402 -313
-594 -60 -80 -66 -86 -69 -61 -3 18 8 41 36 78 518 678 555 1608 94 2325 -13
20 -13 22 6 22 11 0 30 -13 40 -28z m234 -34 c134 -260 208 -493 249 -788 18
-128 15 -432 -6 -575 -67 -464 -269 -887 -584 -1225 -63 -67 -70 -72 -71 -50
0 18 21 50 71 105 370 411 569 927 569 1473 0 343 -73 659 -223 962 -39 80
-73 148 -75 153 -2 4 6 7 17 7 15 0 29 -16 53 -62z m234 -58 c89 -197 151
-405 191 -645 25 -153 25 -542 0 -700 -87 -556 -349 -1057 -743 -1423 -74 -69
-90 -79 -92 -63 -2 15 27 51 105 128 366 365 593 798 684 1308 27 150 37 491
20 646 -32 283 -110 556 -222 781 -22 43 -39 80 -39 83 0 4 10 5 22 3 18 -2
33 -26 74 -118z m193 18 c382 -906 225 -1946 -407 -2698 -91 -109 -242 -257
-354 -348 -71 -58 -78 -61 -78 -40 0 18 27 47 112 119 177 150 371 375 505
586 85 136 207 394 257 543 49 150 86 307 113 480 23 154 23 527 0 683 -36
236 -101 471 -183 663 -24 57 -44 106 -44 109 0 3 8 5 18 5 13 0 29 -27 61
-102z m-775 -95 c107 -189 188 -424 222 -639 25 -165 23 -424 -5 -588 -40
-231 -111 -430 -219 -620 -50 -85 -57 -95 -60 -71 -3 19 16 65 56 144 110 212
168 393 197 617 49 376 -30 795 -211 1118 -24 43 -44 91 -44 107 0 16 2 29 4
29 3 0 30 -44 60 -97z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 652 B

After

Width:  |  Height:  |  Size: 2.5 KiB

6437
web-src/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,8 @@
{
"name": "forked-daapd-web",
"version": "0.8.5",
"name": "owntone-web",
"version": "1.0.0",
"private": true,
"description": "forked-daapd web interface",
"description": "OwnTone web interface",
"author": "chme <christian.meffert@googlemail.com>",
"scripts": {
"serve": "vue-cli-service serve",
@ -12,13 +12,13 @@
},
"dependencies": {
"axios": "^0.21.1",
"bulma": "^0.9.1",
"bulma": "^0.9.2",
"bulma-switch": "^2.0.0",
"core-js": "^3.8.2",
"core-js": "^3.12.1",
"mdi": "^2.2.43",
"moment": "^2.29.1",
"moment-duration-format": "^2.3.2",
"npm": "^6.14.11",
"npm": "^7.12.1",
"reconnectingwebsocket": "^1.0.0",
"spotify-web-api-js": "^1.5.1",
"string-to-color": "^2.2.2",
@ -28,26 +28,26 @@
"vue-observe-visibility": "^1.0.0",
"vue-progressbar": "^0.7.5",
"vue-range-slider": "^0.6.0",
"vue-router": "^3.4.9",
"vue-router": "^3.5.1",
"vue-scrollto": "^2.20.0",
"vue-tiny-lazyload-img": "^0.1.0",
"vuedraggable": "^2.24.3",
"vuex": "^3.6.0"
"vuex": "^3.6.2"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^4.5.10",
"@vue/cli-plugin-eslint": "^4.5.10",
"@vue/cli-service": "^4.5.10",
"@vue/cli-plugin-babel": "^4.5.13",
"@vue/cli-plugin-eslint": "^4.5.13",
"@vue/cli-service": "^4.5.13",
"@vue/eslint-config-standard": "^6.0.0",
"babel-eslint": "^10.1.0",
"eslint": "^7.18.0",
"eslint": "^7.26.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^4.2.1",
"eslint-plugin-promise": "^5.1.0",
"eslint-plugin-standard": "^5.0.0",
"eslint-plugin-vue": "^7.4.1",
"sass": "^1.32.4",
"sass-loader": "^10.1.1",
"eslint-plugin-vue": "^7.9.0",
"sass": "^1.32.13",
"sass-loader": "^10",
"vue-template-compiler": "^2.6.12"
},
"license": "GPL-2.0"

4
web-src/public/index.html Normal file → Executable file
View File

@ -3,8 +3,8 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>forked-daapd-web 2</title>
<link rel="apple-touch-icon" sizes="120x120" href="apple-touch-icon.png?ver1.1">
<title>OwnTone Web</title>
<link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png?ver2.0">
<link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png">
<link rel="manifest" href="site.webmanifest">

View File

@ -85,7 +85,7 @@ export default {
methods: {
connect: function () {
this.$store.dispatch('add_notification', { text: 'Connecting to forked-daapd', type: 'info', topic: 'connection', timeout: 2000 })
this.$store.dispatch('add_notification', { text: 'Connecting to OwnTone server', type: 'info', topic: 'connection', timeout: 2000 })
webapi.config().then(({ data }) => {
this.$store.commit(types.UPDATE_CONFIG, data)
@ -95,7 +95,7 @@ export default {
this.open_ws()
this.$Progress.finish()
}).catch(() => {
this.$store.dispatch('add_notification', { text: 'Failed to connect to forked-daapd', type: 'danger', topic: 'connection' })
this.$store.dispatch('add_notification', { text: 'Failed to connect to OwnTone server', type: 'danger', topic: 'connection' })
})
},

View File

@ -15,7 +15,7 @@
<i class="mdi mdi-rss"></i>
</span>
</p>
<p class="help">Adding a podcast includes creating an RSS playlist, that will allow forked-daapd to manage the podcast subscription.
<p class="help">Adding a podcast includes creating an RSS playlist, that will allow OwnTone to manage the podcast subscription.
</p>
</div>
</form>

View File

@ -42,7 +42,7 @@
@click="on_click_outside_settings">
<a class="navbar-link is-arrowless">
<span class="icon is-hidden-touch"><i class="mdi mdi-24px mdi-menu"></i></span>
<span class="is-hidden-desktop has-text-weight-bold">forked-daapd</span>
<span class="is-hidden-desktop has-text-weight-bold">OwnTone</span>
</a>
<div class="navbar-dropdown is-right">

View File

@ -4,7 +4,7 @@
<div class="container">
<div class="columns is-centered">
<div class="column is-four-fifths has-text-centered-mobile">
<p class="heading"><b>forked-daapd</b> - version {{ config.version }}</p>
<p class="heading"><b>OwnTone</b> - version {{ config.version }}</p>
<h1 class="title is-4">{{ config.library_name }}</h1>
</div>
</div>
@ -95,7 +95,7 @@
<div class="column is-four-fifths">
<div class="content has-text-centered-mobile">
<p class="is-size-7">Compiled with support for {{ config.buildoptions | join }}.</p>
<p class="is-size-7">Web interface built with <a href="http://bulma.io">Bulma</a>, <a href="https://materialdesignicons.com/">Material Design Icons</a>, <a href="https://vuejs.org/">Vue.js</a>, <a href="https://github.com/mzabriskie/axios">axios</a> and <a href="https://github.com/ejurgensen/forked-daapd/network/dependencies">more</a>.</p>
<p class="is-size-7">Web interface built with <a href="http://bulma.io">Bulma</a>, <a href="https://materialdesignicons.com/">Material Design Icons</a>, <a href="https://vuejs.org/">Vue.js</a>, <a href="https://github.com/mzabriskie/axios">axios</a> and <a href="https://github.com/ejurgensen/OwnTone/network/dependencies">more</a>.</p>
</div>
</div>
</div>

View File

@ -13,7 +13,7 @@
<i class="mdi mdi-magnify"></i>
</span>
</p>
<p class="help has-text-centered">Tip: you can search by a smart playlist query language <a href="https://github.com/ejurgensen/forked-daapd/blob/master/README_SMARTPL.md" target="_blank">expression</a> if you prefix it
<p class="help has-text-centered">Tip: you can search by a smart playlist query language <a href="https://github.com/ejurgensen/OwnTone/blob/master/README_SMARTPL.md" target="_blank">expression</a> if you prefix it
with <code>query:</code>.
</p>
</div>

View File

@ -10,7 +10,7 @@
<template slot="content">
<div class="content">
<p>
forked-daapd supports PNG and JPEG artwork which is either placed as separate image files in the library,
OwnTone supports PNG and JPEG artwork which is either placed as separate image files in the library,
embedded in the media files or made available online by radio stations.
</p>
<p>In addition to that, you can enable fetching artwork from the following artwork providers:</p>

View File

@ -9,7 +9,7 @@
<template slot="content">
<div class="notification is-size-7" v-if="!spotify.libspotify_installed">
<p>forked-daapd was either built without support for Spotify or libspotify is not installed.</p>
<p>OwnTone was either built without support for Spotify or libspotify is not installed.</p>
</div>
<div v-if="spotify.libspotify_installed">
<div class="notification is-size-7">
@ -40,10 +40,10 @@
</form>
<p class="help is-danger">{{ libspotify.errors.error }}</p>
<p class="help">
libspotify enables forked-daapd to play Spotify tracks.
libspotify enables OwnTone to play Spotify tracks.
</p>
<p class="help">
forked-daapd will not store your password, but will still be able to log you in automatically afterwards, because libspotify saves a login token.
OwnTone will not store your password, but will still be able to log you in automatically afterwards, because libspotify saves a login token.
</p>
</div>
@ -55,7 +55,7 @@
Access granted for <b><code>{{ spotify.webapi_user }}</code></b>
</p>
<p class="help is-danger" v-if="spotify_missing_scope.length > 0">
Please reauthorize Web API access to grant forked-daapd the following additional access rights:
Please reauthorize Web API access to grant OwnTone the following additional access rights:
<b><code>{{ spotify_missing_scope | join }}</code></b>
</p>
<div class="field fd-has-margin-top ">
@ -79,7 +79,7 @@
<template slot="content">
<div class="notification is-size-7" v-if="!lastfm.enabled">
<p>forked-daapd was built without support for Last.fm.</p>
<p>OwnTone was built without support for Last.fm.</p>
</div>
<div v-if="lastfm.enabled">
<p class="content">
@ -105,7 +105,7 @@
</div>
<p class="help is-danger">{{ lastfm_login.errors.error }}</p>
<p class="help">
forked-daapd will not store your Last.fm username/password, only the session key. The session key does not expire.
OwnTone will not store your Last.fm username/password, only the session key. The session key does not expire.
</p>
</form>
</div>