Something went wrong. Try again.
Self-hosted web interface and downloader for Qobuz.
downloader self-hosted music qobuz
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943.discog-view { & .discog-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;
& .discog-artist-name { font-size: 1.4rem; font-weight: 700; }
& .discog-total-count { font-size: 0.8rem; opacity: 0.8; } }
& .filtered-releases-section { & .filtered-releases-summary { cursor: pointer; user-select: none; list-style: none;
&::-webkit-details-marker { display: none; }
&::marker { display: none; }
& .section-title { margin-bottom: 0; } }
& .filtered-groups-container { & .results-grid { margin-bottom: 13px;
&:first-of-type { margin-top: 13px; }
&:last-of-type { margin-bottom: 0; } } } }}
.album-detail-view { & .album-detail-header { display: flex; gap: 20px; margin-bottom: 24px; flex-wrap: wrap;
& .album-detail-cover { width: var(--album-detail-cover-size); height: var(--album-detail-cover-size); object-fit: cover; border: 4px ridge var(--border-color); }
& .album-detail-cover-placeholder { width: var(--album-detail-cover-size); height: var(--album-detail-cover-size); background-color: var(--surface-high-color); display: flex; align-items: center; justify-content: center; font-size: 0.75rem; font-weight: 600; border: 4px ridge var(--border-color); }
& .album-detail-info { flex: 1; min-width: 240px; display: flex; flex-direction: column; justify-content: space-between;
& .album-detail-text { display: flex; flex-direction: column;
& .album-detail-title { font-size: 1.3rem; font-weight: 700; line-height: normal;
& .album-detail-version { font-weight: 400; font-size: 0.9em; opacity: 0.7; } }
& .album-detail-artist { font-size: 0.95rem; line-height: normal; margin-bottom: 8px;
& .artist-name-bold { font-weight: 600; } }
& .album-detail-label { font-size: 0.8rem; margin-bottom: 2px; }
& .album-detail-upc { font-size: 0.8rem; margin-bottom: 2px;
& a { color: inherit; text-decoration: none;
&:hover { text-decoration: underline; } } }
& .album-detail-meta { font-size: 0.8rem; margin-bottom: 20px; } }
& .album-detail-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; align-self: flex-start; }
& button, & .btn { align-self: flex-start; line-height: normal; } } }
& .mb-releases-container, & .mb-releases-section { margin-bottom: 24px; }
& .mb-releases-section { & .mb-message { font-size: 0.82rem; padding: 12px 14px; background-color: var(--surface-color); border: 2px inset var(--border-color); color: var(--text-color); opacity: 0.8; }
& .mb-error-message { color: var(--accent-color); font-weight: 500; }
& .mb-table-container { background-color: var(--surface-color); border: 2px inset var(--border-color); overflow-x: auto; max-width: 100%; }
& .mb-table { width: 100%; border-collapse: collapse; font-size: 0.8rem;
& .mb-group-header { font-weight: 600; font-size: 0.78rem; padding: 6px 8px; background-color: color-mix(in srgb, var(--surface-color) 70%, var(--border-color) 30%); border-bottom: 1px solid var(--border-color); color: var(--text-color);
& .mb-group-count { font-weight: 400; font-size: 0.74rem; opacity: 0.65; } }
& .mb-group-row:not(:first-child) .mb-group-header { border-top: 1px solid var(--border-color); }
& td { padding: 4px 8px; border-bottom: 1px solid var(--border-color); vertical-align: middle;
&:not(.mb-cell-title) { white-space: nowrap; } }
& .mb-row { block-size: 36px; }
& .mb-row-matched { background-color: color-mix(in srgb, var(--accent-color) 8%, transparent); }
& .mb-row-tagged { background-color: color-mix(in srgb, var(--accent-color) 16%, transparent); border-left: 3px solid var(--accent-color); }
& .mb-cell-title { font-weight: 600; min-width: 140px;
& a { color: inherit; text-decoration: none;
&:hover { color: var(--accent-color); text-decoration: underline; } }
& .mb-title-disambig { font-weight: 400; font-size: 0.76rem; opacity: 0.65; margin-left: 4px; }
& .badge-match, & .badge-tagged { margin-left: 6px; } }
& .mb-cell-tracks { text-align: center; }
& .mb-cell-label { max-width: 150px; overflow: hidden; text-overflow: ellipsis; }
& .mb-cell-catnum, & .mb-cell-barcode { & code { font-size: 0.76rem; } }
& .mb-row:has(.mb-expand-checkbox:checked) td { border-bottom: none; }
& .mb-detail-row { display: none; background-color: var(--surface-color); }
& .mb-row:has(.mb-expand-checkbox:checked)+.mb-detail-row { display: table-row; }
& .mb-detail-cell { padding: 0 !important; }
& .mb-detail-container { border-bottom: 1px solid var(--border-color); background: color-mix(in srgb, var(--surface-color) 70%, var(--bg-color)); position: relative; }
& .mb-detail-header { display: flex; align-items: center; justify-content: flex-end; padding: 6px 8px; background: color-mix(in srgb, var(--surface-color) 70%, var(--bg-color)); position: absolute; top: 0; right: 0; }
& .mb-detail-title { font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; opacity: 0.7; }
& .btn-confirm-tag { padding: 2px 8px; font-size: 0.72rem; line-height: 1.4; }
& .mb-log-output { margin: 0; padding: 46px 12px 10px 12px; color: var(--text-color); border-radius: 4px; font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace; font-size: 0.75rem; line-height: 1.45; max-height: 360px; overflow-y: auto; white-space: pre-wrap; word-break: break-all; }
& .mb-log-line { display: block; }
& .mb-log-success { margin-top: 6px; font-weight: 600; }
& .mb-log-error { color: var(--accent-color); margin-top: 6px; font-weight: 600; }
& .mb-log-loading { display: inline-flex; align-items: center; gap: 8px; }
& .mb-cell-action { text-align: right; white-space: nowrap; user-select: none;
& .btn-tag, & .btn-harmony { padding: 2px 8px; font-size: 0.72rem; text-decoration: none; display: inline-flex; align-items: center; justify-content: center; margin-left: 4px; cursor: pointer; user-select: none; } } }
&:not(:has(#mb-show-all-toggle:checked)) .mb-row-nondigital { display: none; }
&:has(#mb-show-all-toggle:checked) .mb-toggle-show { display: none; }
&:not(:has(#mb-show-all-toggle:checked)) .mb-toggle-hide { display: none; }
& .btn-mb-toggle { cursor: pointer; user-select: none; } }
& .mb-loading-state { display: flex; align-items: center; gap: 10px; padding: 14px 16px; font-size: 0.82rem; font-weight: 500; background-color: var(--surface-color); border: 2px inset var(--border-color); opacity: 0.9; }
& .mb-spinner { display: inline-block; width: 12px; height: 12px; border: 2px solid var(--border-color); border-top-color: var(--accent-color); border-radius: 50% !important; animation: track-spin 0.6s linear infinite; flex-shrink: 0; }
& .disc-title { font-size: 0.8rem; margin-top: 14px; margin-bottom: 6px; }
& .track-list { background-color: var(--surface-color); border: 2px inset var(--border-color); margin-bottom: 13px;
& .track-item { display: flex; flex-direction: column; padding: 8px 13px; gap: 6px;
&:last-child { border-bottom: none; }
& .track-row { display: flex; align-items: center; gap: 12px; width: 100%; }
& .track-number { font-weight: 500; font-size: 0.85rem; flex-shrink: 0; width: 24px; text-align: center; }
& .track-play-btn { background: none; border: none; cursor: pointer; color: var(--text-color); width: 24px; height: 24px; display: inline-flex; align-items: center; justify-content: center; padding: 0; flex-shrink: 0; position: relative;
& .track-num-label { font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; font-weight: 500; font-size: 0.85rem; display: block; }
& .track-icon-play, & .track-icon-pause, & .track-icon-loading { display: none; }
&:hover { color: var(--accent-color); } }
&:not(.is-playing):not(.is-paused):not(.is-loading):hover .track-play-btn { & .track-num-label { display: none; }
& .track-icon-play { display: block; fill: var(--accent-color); } }
&.is-playing .track-play-btn { & .track-num-label { display: none; }
& .track-icon-pause { display: block; fill: var(--accent-color); } }
&.is-paused .track-play-btn { & .track-num-label { display: none; }
& .track-icon-play { display: block; fill: var(--accent-color); } }
&.is-loading .track-play-btn { & .track-num-label { display: none; }
& .track-icon-loading { display: inline-block; width: 12px; height: 12px; border: 2px solid var(--border-color); border-top-color: var(--accent-color); border-radius: 50% !important; animation: track-spin 0.6s linear infinite; } }
& .track-info { flex: 1; min-width: 0;
& .track-title-row { display: flex; align-items: baseline; gap: 4px; flex-wrap: wrap;
& .track-title { font-weight: 500; font-size: 0.9rem; }
& .track-version { font-weight: 400; font-size: 0.82rem; opacity: 0.7; } }
& .track-performer { opacity: 0.65; font-size: 0.78rem; margin-top: 2px; } }
& .track-scrubber-container { display: none; width: 100%; cursor: pointer; padding: 2px 0 0 0;
& .track-scrubber-bar { height: 4px; background: var(--border-color); width: 100%; position: relative; overflow: hidden;
& .track-scrubber-fill { height: 100%; width: 0%; background: var(--accent-color); transition: width 0.1s linear; } } }
&.is-playing .track-scrubber-container, &.is-paused .track-scrubber-container, &.is-loading .track-scrubber-container { display: block; }
& .track-duration { opacity: 0.7; font-size: 0.85rem; flex-shrink: 0; font-variant-numeric: tabular-nums; }
&.is-playing .track-duration, &.is-paused .track-duration { opacity: 1; font-weight: 500; color: var(--accent-color); } } }
& .album-copyright { font-size: 0.8rem; opacity: 0.75; border-top: 1px solid var(--border-color); padding-top: 8px; white-space: pre-line; }}
.description-container { margin-bottom: 20px;
& .description-content { display: -webkit-box; -webkit-line-clamp: 4; line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden; max-height: calc(4 * 1.6 * 0.86rem); font-size: 0.86rem; line-height: 1.6;
& p { margin-bottom: 0.8em;
&:last-child { margin-bottom: 0; } } }
&.expanded .description-content { display: block; overflow: visible; max-height: none; -webkit-line-clamp: unset; line-clamp: unset; }
& .btn-description-toggle { background: none; border: none; color: var(--accent-color); font-weight: 600; font-size: 0.8rem; cursor: pointer; padding: 4px 0 0 0; margin-top: 6px; display: inline-block;
&:hover { text-decoration: underline; } }}
.queue-container-desktop { width: 100%;}
.queue-container-mobile { display: none; position: fixed; bottom: 32px; left: 48px; right: 48px; z-index: 1000; align-items: center;
& .search-form { margin: 0; width: 100%;
& .search-input { border: 1px inset var(--border-color); } }
& .queue-drawer { width: 100%; background-color: var(--bg-color);
& .queue-header { block-size: 42px; pointer-events: auto; cursor: pointer; user-select: none; list-style: none; padding: 10px 14px; display: flex; align-items: center; justify-content: space-between; border: 1px outset var(--border-color); background-color: var(--surface-color);
&::-webkit-details-marker { display: none; }
&:hover { background-color: var(--surface-high-color); }
& .queue-title-group { display: flex; align-items: baseline;
& .queue-title { font-size: 0.85rem; }
& .queue-count { font-size: 0.82rem; } } }
& .queue-content { max-height: 85vh; } }}
.queue-start-btn { width: 100%; font-weight: 600; padding: 8px 12px;
&:active { padding: 8.5px 11.5px 7.5px 12.5px; }}
.queue-list { height: calc(100dvh - 226px); scrollbar-width: none; overflow-y: auto; padding-block: 13px 32px; display: flex; flex-direction: column;
& .queue-item-details { border: 1px outset var(--border-color); background-color: var(--surface-color);
& .queue-item { display: flex; flex-direction: column; padding: 8px; gap: 4px; cursor: pointer; user-select: none; list-style: none;
&::-webkit-details-marker { display: none; }
& .queue-item-main { display: flex; align-items: flex-start; gap: 6px; width: 100%; }
& .queue-progress { font-size: 0.72rem; color: var(--accent-color); font-weight: 600; margin-top: 2px; width: 100%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } }
& .queue-cover, & .queue-cover-placeholder { height: 64px; width: 64px; aspect-ratio: 1 / 1; object-fit: cover; flex-shrink: 0; background-color: var(--surface-high-color); border: 2px ridge var(--border-color); }
& .queue-item-info { flex: 1; min-width: 0;
& .queue-item-title { font-weight: 600; font-size: 0.82rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; line-height: normal; }
& .queue-item-artist { font-size: 0.76rem; opacity: 0.85; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; line-height: normal; margin-block-end: 5px; }
& .queue-item-specs { font-size: 0.7rem; opacity: 0.75; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; line-height: normal; }
& .queue-item-upc { font-size: 0.68rem; opacity: 0.6; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; line-height: normal; } }
& .queue-item-actions { display: flex; flex-direction: column; align-items: flex-end; justify-content: space-between; align-self: stretch; gap: 5px; flex-shrink: 0;
& .queue-remove-btn { color: var(--text-color); cursor: pointer; font-size: 1rem; line-height: 1; padding: 1px 4px;
&:active { padding: 1.5px 3.5px 0.5px 4.5px; } } }
& .queue-tracks { background-color: var(--surface-high-color); padding: 6px 8px; display: flex; flex-direction: column; gap: 4px;
& .queue-track-row { display: flex; align-items: center; justify-content: space-between; font-size: 0.72rem; gap: 6px;
& .queue-track-num { opacity: 0.6; width: 18px; flex-shrink: 0; }
& .queue-track-title { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
& .queue-track-meta { flex-shrink: 0;
& .queue-track-pct { color: var(--accent-color); font-weight: 600; }
& .queue-track-badge { font-size: 0.62rem; padding: 0; } } } } }}
.downloads-page-container { & .results-grid { margin-bottom: 13px;
&:first-of-type { margin-top: 13px; }
&:last-of-type { margin-bottom: 0; } }}
@media (max-width: 1100px) { .app-brand { margin: 0; }
.queue-container-desktop { display: none; }
.queue-container-mobile { display: flex; flex-direction: column; }
.queue-list { padding: 0; height: unset; max-height: calc(85dvh - 35.5px); }}
@keyframes track-spin { to { transform: rotate(360deg); }}