Added summary template editor, improved summary template format and options.

This commit is contained in:
2024-08-25 02:51:16 +02:00
parent d2c9b447ee
commit e2cffbdde2
6 changed files with 313 additions and 56 deletions

View File

@@ -314,6 +314,13 @@
@focus="$event.target.select()"
>
<Icon
v-tooltip="'Edit template'"
icon="pencil5"
class="edit"
@click="showSummaryDialog = true"
/>
<Icon
v-tooltip="'Copy to clipboard'"
icon="copy"
@@ -324,6 +331,12 @@
</div>
</div>
</div>
<EditSummary
v-if="showSummaryDialog"
:release="scene"
@close="showSummaryDialog = false"
/>
</div>
</template>
@@ -331,7 +344,9 @@
import { ref, computed, inject } from 'vue';
import { formatDate, formatDuration } from '#/utils/format.js';
import events from '#/src/events.js';
import getPath from '#/src/get-path.js';
import processSummaryTemplate from '#/utils/process-summary-template.js';
import ActorTile from '#/components/actors/tile.vue';
import MovieTile from '#/components/movies/tile.vue';
@@ -339,8 +354,7 @@ import SerieTile from '#/components/series/tile.vue';
import Player from '#/components/video/player.vue';
import Heart from '#/components/stashes/heart.vue';
import Campaign from '#/components/campaigns/campaign.vue';
import summaryTemplate from '#/assets/summary.yaml';
import EditSummary from '#/components/scenes/edit-summary.vue';
const { pageProps, campaigns } = inject('pageContext');
const { scene } = pageProps;
@@ -348,6 +362,8 @@ const { scene } = pageProps;
const playing = ref(false);
const paused = ref(false);
const showSummaryDialog = ref(false);
const qualities = {
2160: '4K',
1440: 'Quad HD',
@@ -375,62 +391,24 @@ const poster = computed(() => {
return null;
});
const propProcessors = {
channel: (sceneInfo) => sceneInfo.channel?.name || sceneInfo.network?.name,
network: (sceneInfo) => sceneInfo.network?.name || sceneInfo.channel?.name,
actors: (sceneInfo) => sceneInfo.actors.map((actor) => actor.name),
movie: (sceneInfo) => sceneInfo.movies[0]?.title,
date: (sceneInfo, format) => formatDate(sceneInfo.effectiveDate, format),
};
function processTemplate(chain, delimit = ' ', wrapOpen = '', wrapClose = '') {
const results = chain.reduce((result, item) => {
if (typeof item === 'string') {
const [prop, format] = item.split('|');
const value = propProcessors[prop]?.(scene, format) || scene[prop];
if (Array.isArray(value)) {
return result.concat(value.join(format || ', '));
}
return result.concat(value);
}
if (Array.isArray(item)) {
const values = processTemplate(item, ', ');
return result.concat(values);
}
if (typeof item === 'object') {
const [meta, items] = Object.entries(item)[0];
const [delimiter, wrapStart, wrapEnd] = meta.split('|');
const values = processTemplate(items, delimiter, wrapStart, wrapEnd);
return result.concat(values);
}
return [];
}, []);
if (results.length > 0) {
return `${wrapOpen}${results.filter(Boolean).join(delimit)}${wrapClose}`;
}
return '';
}
const summary = (() => {
try {
return processTemplate(summaryTemplate);
const result = processSummaryTemplate(scene);
return result;
} catch (error) {
console.error(`Failed to process template: ${error.message}`);
console.error(`Failed to process summary template: ${error.message}`);
return null;
}
})();
function copySummary() {
navigator.clipboard.writeText(summary);
events.emit('feedback', {
type: 'success',
message: 'Summary copied to clipboard',
});
}
</script>