11<template >
22 <section >
33 <InfoHeader :item =" itemDetails" :active-provider =" provider" />
4- <ItemsListing
5- itemtype =" albumtracks"
6- :parent-item =" itemDetails"
7- :show-provider =" false"
8- :show-favorites-only-filter =" false"
9- :load-data =" loadAlbumTracks"
10- :sort-keys =" ['track_number', 'sort_name', 'duration']"
11- :update-available =" updateAvailable"
12- @refresh-clicked ="
13- loadItemDetails();
14- updateAvailable = false;
15- "
16- :title =" $t('tracks')"
17- :checksum =" provider+itemId"
18- />
19- <ItemsListing
20- itemtype =" albumversions"
21- :parent-item =" itemDetails"
22- :show-provider =" true"
23- :show-favorites-only-filter =" false"
24- :load-data =" loadAlbumVersions"
25- :sort-keys =" ['provider', 'sort_name', 'year']"
26- :update-available =" updateAvailable"
27- @refresh-clicked ="
28- loadItemDetails();
29- updateAvailable = false;
30- "
31- :title =" $t('other_versions')"
32- :hide-on-empty =" true"
33- :checksum =" provider+itemId"
34- />
35- <!-- buttons to show more items on streaming providers-->
36- <v-card v-if =" itemDetails && itemDetails.provider == 'library'" style =" margin-left : 20px ; margin-right : 20px " >
37- <div v-for =" providerMapping in getStreamingProviderMappings(itemDetails)" :key =" providerMapping.provider_instance" >
38- <ListItem
39- v-if =" ![providerMapping.provider_domain, providerMapping.provider_instance].includes(provider)"
40- @click ="
41- $router.replace({
42- name: 'album',
43- params: {
44- itemId: providerMapping.item_id,
45- provider: providerMapping.provider_instance,
46- },
47- })
48- "
49- :subtitle ="
50- $t('check_item_on_provider', [
51- itemDetails.name,
52- api.providerManifests[providerMapping.provider_domain].name,
53- ])
54- "
55- >
56- <template #prepend >
57- <div >
58- <ProviderIcon :domain =" providerMapping.provider_domain" :size =" 30" />
59- </div >
60- </template >
61- </ListItem >
62- <ListItem
63- v-if =" provider != 'library' && itemDetails.provider == 'library'"
64- @click ="
65- $router.replace({
66- name: 'album',
67- params: {
68- itemId: itemDetails.item_id,
69- provider: itemDetails.provider,
70- },
71- })
72- "
73- :subtitle =" $t('check_item_in_library', [itemDetails.name])"
74- >
75- <template #prepend >
76- <div >
77- <ProviderIcon domain =" library" :size =" 30" />
78- </div >
79- </template >
80- </ListItem >
81- </div >
82- </v-card >
4+ <Container >
5+ <ItemsListing
6+ itemtype =" albumtracks"
7+ :parent-item =" itemDetails"
8+ :show-provider =" false"
9+ :show-favorites-only-filter =" false"
10+ :load-data =" loadAlbumTracks"
11+ :sort-keys =" ['track_number', 'sort_name', 'duration']"
12+ :update-available =" updateAvailable"
13+ @refresh-clicked ="
14+ loadItemDetails();
15+ updateAvailable = false;
16+ "
17+ :title =" $t('tracks')"
18+ :checksum =" provider + itemId"
19+ />
20+ <br />
21+ <ItemsListing
22+ itemtype =" albumversions"
23+ :parent-item =" itemDetails"
24+ :show-provider =" true"
25+ :show-favorites-only-filter =" false"
26+ :load-data =" loadAlbumVersions"
27+ :sort-keys =" ['provider', 'sort_name', 'year']"
28+ :update-available =" updateAvailable"
29+ @refresh-clicked ="
30+ loadItemDetails();
31+ updateAvailable = false;
32+ "
33+ :title =" $t('other_versions')"
34+ :hide-on-empty =" true"
35+ :checksum =" provider + itemId"
36+ />
37+
38+ <br />
39+
40+ <!-- provider mapping details -->
41+ <v-card style =" margin-bottom : 10px " v-if =" provider == 'library'" >
42+ <v-toolbar color =" transparent" :title =" $t('mapped_providers')" style =" height : 55px " > </v-toolbar >
43+ <v-divider />
44+ <Container >
45+ <v-list >
46+ <ListItem
47+ v-for =" providerMapping in itemDetails?.provider_mappings"
48+ @click ="
49+ $router.push({
50+ name: 'album',
51+ params: {
52+ itemId: providerMapping.item_id,
53+ provider: providerMapping.provider_instance,
54+ },
55+ })
56+ "
57+ >
58+ <template #prepend >
59+ <ProviderIcon :domain =" providerMapping.provider_domain" :size =" 30" />
60+ </template >
61+ <template #title >
62+ {{ api.providerManifests[providerMapping.provider_domain].name }}
63+ </template >
64+ <template #subtitle >
65+ {{ providerMapping.item_id }} |
66+ {{ providerMapping.audio_format.content_type }} |
67+ {{ providerMapping.audio_format.sample_rate / 1000 }}kHz/{{ providerMapping.audio_format.bit_depth }}
68+ bits
69+ </template >
70+ <template #append >
71+ <v-btn
72+ variant =" plain"
73+ icon =" mdi-open-in-new"
74+ v-if =" providerMapping.url"
75+ @click.prevent ="
76+ openLinkInNewTab(providerMapping.url)"
77+ ></v-btn >
78+ </template >
79+ </ListItem >
80+ </v-list >
81+ </Container >
82+ </v-card >
83+ </Container >
8384 </section >
8485</template >
8586
@@ -91,8 +92,9 @@ import { EventType, type Album, type EventMessage, type MediaItemType } from '..
9192import { api } from ' ../plugins/api' ;
9293import { ref , onMounted , onBeforeUnmount , watch } from ' vue' ;
9394import ListItem from ' ../components/mods/ListItem.vue' ;
95+ import Container from ' ../components/mods/Container.vue' ;
9496import ProviderIcon from ' @/components/ProviderIcon.vue' ;
95- import {getStreamingProviderMappings } from ' ../utils'
97+ import { getStreamingProviderMappings } from ' ../utils' ;
9698
9799export interface Props {
98100 itemId: string ;
@@ -145,8 +147,21 @@ const loadAlbumVersions = async function (
145147 search ? : string ,
146148 favoritesOnly = true ,
147149) {
148- const albumVersions = await api .getAlbumVersions (props .itemId , props .provider );
149- return filteredItems (albumVersions , offset , limit , sort , search , favoritesOnly );
150+ const allVersions: Album [] = [];
151+
152+ if (props .provider == ' library' ) {
153+ const albumVersions = await api .getAlbumVersions (props .itemId , props .provider );
154+ allVersions .push (... albumVersions );
155+ }
156+ for (const providerMapping of getStreamingProviderMappings (itemDetails .value ! )) {
157+ const albumVersions = await api .getAlbumVersions (providerMapping .item_id , providerMapping .provider_instance );
158+ allVersions .push (... albumVersions );
159+ }
160+ return filteredItems (allVersions , offset , limit , sort , search , favoritesOnly );
161+ };
162+
163+ const openLinkInNewTab = function (url : string ) {
164+ window .open (url , ' _blank' );
150165};
151166 </script >
152167
0 commit comments