2
0
Fork 0
mirror of https://github.com/WebTools-NG/WebTools-NG synced 2025-03-09 00:37:20 +00:00

Merge branch 'master' into #184-Get-Github-Commit-into-version-number

This commit is contained in:
UKDTOM 2020-10-16 23:22:07 +02:00
commit 21240f938f
33 changed files with 603 additions and 60 deletions

View file

@ -1,14 +1,25 @@
# ![Logo](https://github.com/WebTools-NG/WebTools-NG/blob/master/src/assets/WebTools-48x48.png) WebTools-ng Change log
## V0.1.16
## V0.1.8
**Note**: This version is an Alhpa version, that is not made public, and first version with a changelog
**Note**: This version is an Alhpa version, that is not made public
* [#173 Sidebar not updated when changing languages](https://github.com/WebTools-NG/WebTools-NG/issues/173)
## V0.1.7
**Note**: This version is an Alhpa version, that is not made public
* [#21 ET Fields selection for custom levels](https://github.com/WebTools-NG/WebTools-NG/issues/21) (Custom levels)
## V0.1.6
**Note**: This version is an Alhpa version, that is not made public
* [#179 BUG: Text fields spotted in the wild, that corrupts export](https://github.com/WebTools-NG/WebTools-NG/issues/179)
* [#103 AutoUpdate](https://github.com/WebTools-NG/WebTools-NG/issues/103)
## V0.1.15
## V0.1.5
**Note**: This version is an Alhpa version, that is not made public, and first version with a changelog

View file

@ -1,4 +1,4 @@
# ![Logo](https://github.com/WebTools-NG/WebTools-NG/blob/master/src/assets/WebTools-48x48.png) WebTools-NG
# ![Logo](https://github.com/WebTools-NG/WebTools-NG/blob/master/wiki/icons/WebTools-48-NG.png) WebTools-NG
[![GitHub issues](https://img.shields.io/github/issues/WebTools-NG/WebTools-NG.svg?style=flat)](https://github.com/WebTools-NG/WebTools-NG/issues)
[![Release](https://img.shields.io/github/release/WebTools-NG/WebTools-NG.svg?style=flat)](https://github.com/WebTools-NG/WebTools-NG/releases/latest)

13
package-lock.json generated
View file

@ -12301,6 +12301,11 @@
"is-plain-obj": "^1.0.0"
}
},
"sortablejs": {
"version": "1.12.0",
"resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.12.0.tgz",
"integrity": "sha512-bPn57rCjBRlt2sC24RBsu40wZsmLkSo2XeqG8k6DC1zru5eObQUIPPZAQG7W2SJ8FZQYq+BEJmvuw1Zxb3chqg=="
},
"source-list-map": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
@ -14327,6 +14332,14 @@
"integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
"dev": true
},
"vuedraggable": {
"version": "2.24.1",
"resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.1.tgz",
"integrity": "sha512-G1fxO1oshx+WLdieSGl6jSJdlHOQFga1FpjuUpgXldbpKNzxpjsGn4xYNnRHVrOAqm8aG5FfpdQlh5LHesxCeA==",
"requires": {
"sortablejs": "^1.10.1"
}
},
"vuex": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/vuex/-/vuex-3.5.1.tgz",

View file

@ -1,6 +1,6 @@
{
"name": "webtools-ng",
"version": "0.1.6",
"version": "0.1.8",
"description": "WebTools Next Generation 4 Plex",
"author": "dane22 & CPSO",
"license": "MPL-2.0",
@ -46,6 +46,7 @@
"vue-i18n": "^8.18.2",
"vue-router": "^3.3.4",
"vue-sidebar-menu": "^4.6.2",
"vuedraggable": "^2.24.1",
"vuex": "^3.5.1",
"vuex-persist": "^2.2.0"
},

View file

@ -78,7 +78,8 @@
"Options": "Options"
},
"ET": {
"Settings": "Settings"
"Settings": "Settings",
"Custom": "Custom Levels"
},
"About": {
"NavTitle": "About Us"
@ -110,6 +111,24 @@
},
"Modules": {
"ET": {
"Custom": {
"Title": "Custom levels",
"Description": "A custom level allows you to create your own export levels",
"NewCustomLevel": "< Define new level >",
"CustomLevels": "*** Custom levels ***",
"DeleteLevel": "Do you want to delete selected level?",
"NewLevelTitle": "Enter name for the new level",
"NewLevelName": "< Enter name for new level >",
"NewLevelSaveTxt": "Save",
"CustomLevel": "Custom Level",
"btnDelete": "Delete level",
"btnSave": "Save level",
"confirmDelete": "Are you sure you want to delete {0}",
"Delete": "Delete",
"Cancel": "Cancel",
"availFields": "Availible fields:",
"customFields": "Custom fields:"
},
"Description": "@:Modules.ET.Name allows you to export detail information about the media in your libraries",
"Name": "ExportTools",
"HSelectMedia": "Select Library Type",
@ -143,8 +162,7 @@
"LevelInfo": "Export level determines which data are going to be exported.",
"ExportLevel": "Export Level",
"SelectLevel": "Select level",
"BuildInLevels": "*** Built-in levels ***",
"CustomLevels": "*** Custom levels ***",
"BuildInLevels": "*** Built-in levels ***",
"NoLevelFound": "N/A",
"TT-ETType": "Here you select the type of library you want to export",
"TT-ETLibrary": "Here you select library you want to export",

View file

@ -7,28 +7,33 @@
</template>
<script>
const log = require('electron-log');
console.log = log.log;
import '@fortawesome/fontawesome-free/css/all.css'
import etIcon from '@/assets/ET-256.png';
import i18n from '../../i18n'
const log = require('electron-log');
console.log = log.log;
import '@fortawesome/fontawesome-free/css/all.css'
import etIcon from '@/assets/ET-256.png';
export default {
data() {
return {
menu: [
collapsed: false
}
},
computed: {
menu(){
return [
{
href: { path: '/home' },
title: i18n.t("Common.Menu.Sidebar.Home.NavTitle"),
href: { path: '/home' },
title: this.$t("Common.Menu.Sidebar.Home.NavTitle"),
icon: 'fa fa-home'
},
{
header: true,
title: i18n.t("Common.Menu.Sidebar.NavSections.Tools"),
title: this.$t("Common.Menu.Sidebar.NavSections.Tools"),
hiddenOnCollapse: true
},
{
href: { path: '/export' },
title: i18n.t("Modules.ET.Name"),
title: this.$t("Modules.ET.Name"),
// icon: 'fas fa-file-export',
icon: {
//adjust element
@ -38,7 +43,12 @@ import i18n from '../../i18n'
child: [
{
href: '/export/settings',
title: i18n.t("Common.Menu.Sidebar.ET.Settings"),
title: this.$t("Common.Menu.Sidebar.ET.Settings"),
icon: 'fa fa-cog'
},
{
href: '/export/custom',
title: this.$t("Common.Menu.Sidebar.ET.Custom"),
icon: 'fa fa-cog'
}
]
@ -46,46 +56,46 @@ import i18n from '../../i18n'
},
{
header: true,
title: i18n.t("Common.Menu.Sidebar.NavSections.Options"),
title: this.$t("Common.Menu.Sidebar.NavSections.Options"),
hiddenOnCollapse: true
},
{
href: { path: '/language' },
title: i18n.t("Common.Menu.Sidebar.Language.NavTitle"),
title: this.$t("Common.Menu.Sidebar.Language.NavTitle"),
//icon: 'fas fa-language'
icon: 'fa fa-globe'
},
{
href: '/settings',
title: i18n.t("Common.Menu.Sidebar.Settings.NavTitle"),
title: this.$t("Common.Menu.Sidebar.Settings.NavTitle"),
icon: 'fa fa-cog'
},
{
href: { path: '/about' },
title: i18n.t("Common.Menu.Sidebar.About.NavTitle"),
title: this.$t("Common.Menu.Sidebar.About.NavTitle"),
icon: 'fas fa-question-circle'
},
{
href: { path: '/' },
title: i18n.t("Common.Menu.Sidebar.Theme.NavTitle"),
title: this.$t("Common.Menu.Sidebar.Theme.NavTitle"),
icon: 'fas fa-palette',
hidden: true
},
{
href: { path: '/' },
title: i18n.t("Common.Menu.Sidebar.Reset.NavTitle"),
title: this.$t("Common.Menu.Sidebar.Reset.NavTitle"),
icon: 'fas fa-power-off',
hidden: true
}
],
collapsed: false,
}
},methods: {
onToggleCollapse(collapsed) {
]
}
},
methods: {
onToggleCollapse(collapsed) {
this.$emit("e-iscollapsed", collapsed);
log.info(collapsed)
},
},
}
}
}
</script>

View file

@ -0,0 +1,383 @@
<template>
<b-container fluid>
<div class="col-lg-10 col-md-12 col-xs-12">
<h1>{{ $t("Modules.ET.Custom.Title") }}</h1>
<p>{{ $t("Modules.ET.Custom.Description") }}</p>
</div>
<br />
<!-- Media type to export -->
<b-form-group id="etTypeGroup" v-bind:label="$t('Modules.ET.HSelectMedia')" label-size="lg" label-class="font-weight-bold pt-0">
<b-tooltip target="etTypeGroup" triggers="hover">
{{ $t('Modules.ET.TT-ETType') }}
</b-tooltip>
<b-form-radio-group
id="mediaType"
v-model="selMediaType"
@change.native="changeType()"
:options="optionsMediaType"
name="mediaType">
</b-form-radio-group>
</b-form-group>
<div> <!-- Select Custom Level -->
<b-form-group id="etLevelGroup" v-bind:label="$t('Modules.ET.Custom.CustomLevel')" label-size="lg" label-class="font-weight-bold pt-0">
<b-tooltip target="etLevelGroup" triggers="hover">
{{ $t('Modules.ET.TT-ETLevel') }}
</b-tooltip>
<b-form-select
class="form-control"
:v-model="selCustLevel"
ref="selLevel"
id="selLevel"
v-on:change="selectExportLevel"
:options="optionsLevels"
name="selLevel">
</b-form-select>
</b-form-group>
</div>
<b-modal ref="showNewLevel" hide-footer v-bind:title=this.customTitle >
<div class="d-block text-center">
<b-form-input v-model="NewLevelName" v-bind:placeholder=this.NewLevelInputTxt ></b-form-input>
</div>
<b-button class="mt-3" variant="outline-primary" block @click="addNewLevel">{{ this.NewLevelSaveTxt }}</b-button>
</b-modal>
<b-modal ref="confirmDeleteLevel" hide-footer v-bind:title=this.deleteLevel >
<div class="d-block text-center">
{{ $t('Modules.ET.Custom.confirmDelete', [this.selCustLevel]) }}
</div>
<b-button class="mt-3" variant="info" block @click="deleteClose">{{ $t('Modules.ET.Custom.Cancel') }}</b-button>
<b-button class="mt-3" variant="danger" block @click="deleteCustomLevel">{{ $t('Modules.ET.Custom.Delete') }}</b-button>
</b-modal>
<!-- Buttons -->
<div id="buttons" class="text-center">
<b-button-group >
<b-button variant="success" class="mr-1" @click="saveCustomLevel"> {{ $t('Modules.ET.Custom.btnSave') }} </b-button>
<b-button variant="danger" class="mr-1" :disabled="this.btnDeleteEnabled == 0" @click="confirmDeleteLevel">{{ $t('Modules.ET.Custom.btnDelete') }}</b-button>
</b-button-group>
</div>
<div class="row">
<div class="col-md3">
<div id="rowheader" class="font-weight-bold pt-0">
{{ $t('Modules.ET.Custom.availFields') }}
</div>
<draggable class="list-group" :list="fieldList" group="fields">
<div class="list-group-item" v-for="(element) in fieldList" :key="element.name">
{{ element.name }}
</div>
</draggable>
</div>
<div class="col-md3">
<div id="rowheader" class="font-weight-bold pt-0">
{{ $t('Modules.ET.Custom.customFields') }}
</div>
<draggable class="list-group" :list="resultList" group="fields">
<div class="list-group-item" v-for="(element) in resultList" :key="element.name">
{{ element.name }}
</div>
</draggable>
</div>
</div>
</b-container>
</template>
<script>
import { et } from "../scripts/et";
import i18n from '../../../../i18n';
import { wtconfig } from '../../General/wtutils';
import draggable from 'vuedraggable'
const log = require("electron-log");
export default {
components: {
draggable,
},
data() {
return {
selMediaType: "movie",
optionsMediaType: [
{ text: i18n.t('Modules.ET.RadioMovies'), value: 'movie', disabled: false },
{ text: i18n.t('Modules.ET.RadioTVSeries'), value: 'show', disabled: true },
{ text: i18n.t('Modules.ET.RadioTVEpisodes'), value: 'episode', disabled: false },
{ text: i18n.t('Modules.ET.RadioTVShowEpisodes'), value: 'showepisode', disabled: true },
{ text: i18n.t('Modules.ET.RadioMusic'), value: 'artist', disabled: true },
{ text: i18n.t('Modules.ET.RadioPhotos'), value: 'photo', disabled: true },
{ text: i18n.t('Modules.ET.RadioPlayLists'), value: 'playlist', disabled: true }
],
selCustLevel: "",
deleteLevel: this.$t('Modules.ET.Custom.DeleteLevel'),
customTitle: this.$t('Modules.ET.Custom.NewLevelTitle'),
NewLevelInputTxt: this.$t('Modules.ET.Custom.NewLevelName'),
NewLevelSaveTxt: this.$t('Modules.ET.Custom.NewLevelSaveTxt'),
NewLevelName: '',
editable: true,
isDragging: false,
delayedDragging: false,
fieldList: [],
btnDeleteEnabled: false,
optionsLevels: null,
resultList: []
}
},
watch: {
isDragging(newValue) {
if (newValue) {
this.delayedDragging = true;
return;
}
this.$nextTick(() => {
this.delayedDragging = false;
});
}
},
computed: {
dragOptions() {
return {
animation: 0,
group: "description",
disabled: !this.editable,
ghostClass: "ghost"
};
},
listString() {
return JSON.stringify(this.list, null, 2);
}
},
mounted() {
log.debug('Custom level page selected')
// Populate combobox
this.genExportLevels();
},
methods: {
getCustomLevel() {
log.debug(`Customlevel ${this.selCustLevel} selected`);
// Get fields from config.json file
const custLevel = wtconfig.get(`ET.CustomLevels.${this.selMediaType}.level.${this.selCustLevel}`)
// Add to resultList
this.resultList = custLevel.map((name, index) => {
return { name, order: index + 1, fixed: false };
});
log.debug(`Custom level ${this.selCustLevel} is set as: ${ JSON.stringify(this.resultList) }`);
// Now remove already added from avail fields
for (var idx in custLevel){
for (var availidx in this.fieldList){
if (custLevel[idx] == this.fieldList[availidx].name)
{
this.fieldList.splice(availidx,1)
}
}
}
},
deleteClose() {
this.$refs['confirmDeleteLevel'].hide();
log.info('Delete aborted');
},
orderList() {
this.list = this.list.sort((one, two) => {
return one.order - two.order;
});
},
onMove({ relatedContext, draggedContext }) {
const relatedElement = relatedContext.element;
const draggedElement = draggedContext.element;
return (
(!relatedElement || !relatedElement.fixed) && !draggedElement.fixed
);
},
genExportLevels() {
et.getLevelDisplayName('My Level', this.selMediaType);
// Returns valid levels for selected media type
const etCustomLevel = et.getCustomLevels(this.selMediaType);
const options = [];
const item = {};
let custLabel = {};
custLabel['text']=this.$t('Modules.ET.Custom.CustomLevels');
custLabel['disabled']=true;
custLabel['value']='';
options.push(custLabel);
let newLabel = {}
newLabel['text']=this.$t('Modules.ET.Custom.NewCustomLevel');
newLabel['disabled']=false;
newLabel['value']='NewLevel';
options.push(newLabel);
Object.keys(etCustomLevel).forEach(function(key) {
let option = {}
option['value'] = etCustomLevel[key];
if (key === "No Level Yet") {
option['text']=i18n.t('Modules.ET.NoLevelFound');
option['disabled'] = true;
}
else { option['text'] = key; }
options.push(option);
});
item['options']=options;
this.optionsLevels = options;
this.fieldList = et.getAllFields( {libType: this.selMediaType});
},
addNewLevel(){
// Hide Modal box
this.$refs['showNewLevel'].hide();
// Get current level names
let curLevels = wtconfig.get(`ET.CustomLevels.${this.selMediaType}.levels`);
// Add new level to JSON
curLevels[this.NewLevelName] = this.NewLevelName;
// Save
wtconfig.set(`ET.CustomLevels.${this.selMediaType}.levels`, curLevels);
// Get current level counts
let curLevelCount = wtconfig.get(`ET.CustomLevels.${this.selMediaType}.LevelCount`);
// Add new level to JSON
curLevelCount[this.NewLevelName] = 0;
// Save
wtconfig.set(`ET.CustomLevels.${this.selMediaType}.LevelCount`, curLevelCount);
// Get current level names
let curLevel = wtconfig.get(`ET.CustomLevels.${this.selMediaType}.level`);
// Add new level to JSON
curLevel[this.NewLevelName] = [];
// Save
wtconfig.set(`ET.CustomLevels.${this.selMediaType}.level`, curLevel);
// Update combobox
this.genExportLevels();
//this.exportLevels;
this.selCustLevel = this.NewLevelName;
console.log ('Ged ********** above doesnt work ***********')
},
updateLevelCount() {
var def;
// We need to load fields and defs into def var
switch(this.selMediaType) {
case 'movie':
// code block
def = JSON.parse(JSON.stringify(require('./../defs/def-Movie.json')));
break;
case 'episode':
// code block
def = JSON.parse(JSON.stringify(require('./../defs/def-Episode.json')));
break;
case 'show':
// code block
def = JSON.parse(JSON.stringify(require('./../defs/def-Show.json')));
break;
case 'artist':
// code block
def = JSON.parse(JSON.stringify(require('./../defs/def-Artist.json')));
break;
case 'photo':
// code block
def = JSON.parse(JSON.stringify(require('./../defs/def-Photo.json')));
break;
default:
// code block
}
var fields = def[this.selMediaType]['fields'];
// Release def memory again
def = null;
const levelFields = wtconfig.get(`ET.CustomLevels.${this.selMediaType}.level.${this.selCustLevel}`);
let curLevel = 0;
levelFields.forEach(function (item) {
// Get field level
var count = fields[item]['call'];
if (count > curLevel)
{
curLevel = count;
}
});
log.info(`LevelCount for "${this.selCustLevel}" of the type "${this.selMediaType}" was calculated as:${curLevel}`);
wtconfig.set(`ET.CustomLevels.${this.selMediaType}.LevelCount.${this.selCustLevel}`, curLevel);
},
changeType: function() {
// Triggers when lib type is changed
this.genExportLevels();
this.btnDeleteEnabled = false;
this.resultList = [];
},
deleteCustomLevel() {
log.info(`User confirmed to delete custom level: ${this.selCustLevel}`);
this.$refs['confirmDeleteLevel'].hide();
wtconfig.delete(`ET.CustomLevels.${this.selMediaType}.levels.${this.selCustLevel}`);
wtconfig.delete(`ET.CustomLevels.${this.selMediaType}.LevelCount.${this.selCustLevel}`);
wtconfig.delete(`ET.CustomLevels.${this.selMediaType}.level.${this.selCustLevel}`);
this.genExportLevels();
this.resultList = [];
},
saveCustomLevel() {
let result = []
for(var k in this.resultList) {
result.push(this.resultList[k].name);
}
// Get current level names
let curLevel = wtconfig.get(`ET.CustomLevels.${this.selMediaType}.level`);
// Add new level to JSON
curLevel[this.selCustLevel] = result;
log.info(`Saving custom level ${this.selCustLevel} as ${JSON.stringify(result)}`)
wtconfig.set(`ET.CustomLevels.${this.selMediaType}.level`, curLevel);
// Now we need to update levelcount for the level
this.updateLevelCount();
},
confirmDeleteLevel() {
log.info(`User asked to delete a custom level`);
this.$refs['confirmDeleteLevel'].show();
},
selectExportLevel: function(value) {
log.info(`Custom ExportLevel selected as: ${value}`)
if ( value == 'NewLevel') {
// Create new level
this.$refs['showNewLevel'].show();
}
else {
this.btnDeleteEnabled = true;
this.selCustLevel = value;
}
this.resultList = [];
this.genExportLevels();
this.getCustomLevel();
}
}
};
</script>
<style scoped>
#rowheader{
margin-left: 25px;
margin-bottom: 10px;
}
.list-group{
width: 350px;
height: 250px;
margin-bottom: 10px;
overflow:scroll;
/* -webkit-overflow-scrolling: touch; */
margin-right: 10px;
margin-left: 10px;
}
.ghost {
opacity: 0.5;
background: #c8ebfb;
}
.list-group {
min-height: 20px;
}
.list-group-item {
cursor: move;
}
.list-group-item i {
cursor: pointer;
}
#buttons {
width: auto;
margin-top: 5px;
margin-bottom: 15px;
}
</style>

View file

@ -101,8 +101,7 @@
selMediaType: "movie",
selLibrary: "",
selLibraryOptions: [],
selLevel: "",
selLevelName: "",
selLevel: "",
optionsMediaType: [
{ text: i18n.t('Modules.ET.RadioMovies'), value: 'movie', disabled: false },
{ text: i18n.t('Modules.ET.RadioTVSeries'), value: 'show', disabled: true },
@ -149,7 +148,7 @@
const options = []
const item = {}
let custLabel = {}
custLabel['text']=this.$t('Modules.ET.CustomLevels');
custLabel['text']=this.$t('Modules.ET.Custom.CustomLevels');
custLabel['disabled']=true;
custLabel['value']='';
options.push(custLabel);

View file

@ -1,5 +1,3 @@
/* eslint-disable no-unreachable */
//var def = JSON.parse(JSON.stringify(require('./definitions.json')));
var def;
var defLevels = JSON.parse(JSON.stringify(require('./../defs/def-Levels.json')));
@ -169,7 +167,12 @@ const et = new class ET {
getLevelFields(level, libType) {
// return fields in a level
const out = []
const realName = et.getRealLevelName(level, libType);
let realName = et.getRealLevelName(level, libType);
if (realName == undefined)
{
// We are dealing with a custom level here
realName = level
}
log.debug(`RealName is ${realName}`)
// We need to load fields and defs into def var
switch(libType) {
@ -196,7 +199,12 @@ const et = new class ET {
default:
// code block
}
const levels = def[libType]['level'][realName];
let levels = def[libType]['level'][realName];
if (levels == undefined)
{
// We are dealing with a custom level
levels = wtconfig.get(`ET.CustomLevels.${libType}.level.${realName}`);
}
Object.keys(levels).forEach(function(key) {
out.push(levels[key])
});
@ -221,14 +229,13 @@ const et = new class ET {
const notDefined = {"No Level Yet": ""}
// Returns an json of custom levels for a selected type og medias, like 'movie'
const levels = wtconfig.get(`ET.CustomLevels.${libType}.levels`, notDefined)
log.debug('ET LevelNames: ' + JSON.stringify(levels))
log.debug('ET Custom LevelNames: ' + JSON.stringify(levels))
return levels
}
getLevelKeys(libType){
// Only return the keys for possible levels
const out = []
console.log('GED getLevelKeys LibType: ' + libType)
const out = []
const levels = defLevels[libType]['levels']
Object.keys(levels).forEach(function(key) {
out.push(key)
@ -305,6 +312,42 @@ const et = new class ET {
return out
}
// Return all field keys defined for a lib type, in a sorted array of json, with an index
getAllFields( {libType}) {
// We need to load fields and defs into typeFields var
let typeFields;
switch(libType) {
case 'movie':
// code block
typeFields = JSON.parse(JSON.stringify(require('./../defs/def-Movie.json')));
break;
case 'episode':
// code block
typeFields = JSON.parse(JSON.stringify(require('./../defs/def-Episode.json')));
break;
case 'show':
// code block
typeFields = JSON.parse(JSON.stringify(require('./../defs/def-Show.json')));
break;
case 'artist':
// code block
typeFields = JSON.parse(JSON.stringify(require('./../defs/def-Artist.json')));
break;
case 'photo':
// code block
typeFields = JSON.parse(JSON.stringify(require('./../defs/def-Photo.json')));
break;
default:
// code block
}
// Get all the fields keys
var filteredFields = JSONPath({path: '$.' + libType + '.fields.*~', json: typeFields});
// Sort them, and add an index as well, so drageble is happy
return filteredFields.sort().map((name, index) => {
return { name, order: index + 1 };
});
}
getFields( libType, level) {
// Get field and type for level
const fields = et.getLevelFields(level, libType)
@ -562,13 +605,13 @@ const excel2 = new class Excel {
async addRowToTmp( { libType, level, data, stream }) {
log.debug(`Start addRowToTmp. libType: ${libType} - level: ${level}`)
let date, year, month, day, hours, minutes, seconds
const fields = et.getFields( libType, level)
const fields = et.getFields( libType, level)
let lookup, val, array, i, valArray, valArrayVal, subType, subKey
let str = ''
let result = ''
for (var x=0; x<fields.length; x++) {
var name = Object.keys(fields[x]);
lookup = JSONPath({path: '$..key', json: fields[x]})[0];
var name = Object.keys(fields[x]);
lookup = JSONPath({path: '$..key', json: fields[x]})[0];
switch(String(JSONPath({path: '$..type', json: fields[x]}))) {
case "string":
val = String(JSONPath({path: String(lookup), json: data})[0]);
@ -585,19 +628,18 @@ const excel2 = new class Excel {
valArray = []
for (i=0; i<array.length; i++) {
subType = JSONPath({path: '$..subtype', json: fields[x]});
subKey = JSONPath({path: '$..subkey', json: fields[x]});
subKey = JSONPath({path: '$..subkey', json: fields[x]});
switch(String(subType)) {
case "string":
valArrayVal = String(JSONPath({path: String(subKey), json: array[i]})[0]);
// Make N/A if not found
console.log('Ged valArrayVal: ' + valArrayVal)
if (valArrayVal == null || valArrayVal == "")
//if ( typeof valArrayVal !== 'undefined' && valArrayVal && valArrayVal != '')
{
valArrayVal = wtconfig.get('ET.NotAvail', 'N/A')
}
// Remove CR, LineFeed ' and " from the string if present
val = val.replace(/(\r\n)|'|"/g, "");
valArrayVal = valArrayVal.replace(/(\r\n)|'|"/g, "");
break;
case "time":
valArrayVal = JSONPath({path: String(subKey), json: array[i]});
@ -669,7 +711,7 @@ const excel2 = new class Excel {
break;
default:
log.error(`No Hit addRowToSheet for ${String(JSONPath({path: '$..type', json: fields[x]}))}`)
}
}
let doPostProc = JSONPath({path: '$..postProcess', json: fields[x]})
if ( doPostProc == 'true')
{
@ -754,7 +796,7 @@ const excel2 = new class Excel {
async createOutFile( {libName, level, libType, baseURL, accessToken} )
{
const header = excel2.GetHeader(level, libType)
const header = excel2.GetHeader(level, libType)
log.debug(`header: ${header}`);
const strHeader = header.join(wtconfig.get('ET.ColumnSep', ','))
// Now we need to find out how many calls to make
@ -789,7 +831,7 @@ const excel2 = new class Excel {
const urlWIthPath = '/library/metadata/' + urlStr
log.verbose(`Items retrieved`);
const contents = await et.getItemData({baseURL: baseURL, accessToken: accessToken, element: urlWIthPath});
const contentsItems = await JSONPath({path: '$.MediaContainer.Metadata[*]', json: contents});
const contentsItems = await JSONPath({path: '$.MediaContainer.Metadata[*]', json: contents});
for (item of contentsItems){
await excel2.addRowToTmp( { libType: libType, level: level, data: item, stream: stream } );
}

View file

@ -241,9 +241,69 @@ const wtutils = new class WTUtils {
if ( wtconfig.get('ET.NotAvail', 'N/A') == 'N/A' ){
wtconfig.set('ET.NotAvail', 'N/A')
}
if ( wtconfig.get('ET.CustomLevels.episode.levels', 'N/A') == 'N/A' ){
wtconfig.set('ET.CustomLevels.episode.levels', {})
}
if ( wtconfig.get('ET.CustomLevels.episode.level', 'N/A') == 'N/A' ){
wtconfig.set('ET.CustomLevels.episode.level', {})
}
if ( wtconfig.get('ET.CustomLevels.episode.LevelCount', 'N/A') == 'N/A' ){
wtconfig.set('ET.CustomLevels.episode.LevelCount', {})
}
if ( wtconfig.get('ET.CustomLevels.movie.levels', 'N/A') == 'N/A' ){
wtconfig.set('ET.CustomLevels.movie.levels', {})
}
if ( wtconfig.get('ET.CustomLevels.movie.LevelCount', 'N/A') == 'N/A' ){
wtconfig.set('ET.CustomLevels.movie.LevelCount', {})
}
if ( wtconfig.get('ET.CustomLevels.movie.level', 'N/A') == 'N/A' ){
wtconfig.set('ET.CustomLevels.movie.level', {})
}
if ( wtconfig.get('ET.CustomLevels.show.levels', 'N/A') == 'N/A' ){
wtconfig.set('ET.CustomLevels.show.levels', {})
}
if ( wtconfig.get('ET.CustomLevels.show.LevelCount', 'N/A') == 'N/A' ){
wtconfig.set('ET.CustomLevels.show.LevelCount', {})
}
if ( wtconfig.get('ET.CustomLevels.show.level', 'N/A') == 'N/A' ){
wtconfig.set('ET.CustomLevels.show.level', {})
}
if ( wtconfig.get('ET.CustomLevels.showepisode.levels', 'N/A') == 'N/A' ){
wtconfig.set('ET.CustomLevels.showepisode.levels', {})
}
if ( wtconfig.get('ET.CustomLevels.showepisode.LevelCount', 'N/A') == 'N/A' ){
wtconfig.set('ET.CustomLevels.showepisode.LevelCount', {})
}
if ( wtconfig.get('ET.CustomLevels.showepisode.level', 'N/A') == 'N/A' ){
wtconfig.set('ET.CustomLevels.showepisode.level', {})
}
if ( wtconfig.get('ET.CustomLevels.artist.levels', 'N/A') == 'N/A' ){
wtconfig.set('ET.CustomLevels.artist.levels', {})
}
if ( wtconfig.get('ET.CustomLevels.artist.LevelCount', 'N/A') == 'N/A' ){
wtconfig.set('ET.CustomLevels.artist.LevelCount', {})
}
if ( wtconfig.get('ET.CustomLevels.artist.level', 'N/A') == 'N/A' ){
wtconfig.set('ET.CustomLevels.artist.level', {})
}
if ( wtconfig.get('ET.CustomLevels.photo.levels', 'N/A') == 'N/A' ){
wtconfig.set('ET.CustomLevels.photo.levels', {})
}
if ( wtconfig.get('ET.CustomLevels.photo.LevelCount', 'N/A') == 'N/A' ){
wtconfig.set('ET.CustomLevels.photo.LevelCount', {})
}
if ( wtconfig.get('ET.CustomLevels.photo.level', 'N/A') == 'N/A' ){
wtconfig.set('ET.CustomLevels.photo.level', {})
}
if ( wtconfig.get('ET.CustomLevels.playlist.levels', 'N/A') == 'N/A' ){
wtconfig.set('ET.CustomLevels.playlist.levels', {})
}
if ( wtconfig.get('ET.CustomLevels.playlist.LevelCount', 'N/A') == 'N/A' ){
wtconfig.set('ET.CustomLevels.playlist.LevelCount', {})
}
if ( wtconfig.get('ET.CustomLevels.playlist.level', 'N/A') == 'N/A' ){
wtconfig.set('ET.CustomLevels.playlist.level', {})
}
// All done, so stamp version number
wtconfig.set('General.version', wtutils.AppVersion)
}

View file

@ -11,8 +11,7 @@
<dt>{{ $t("Modules.ET.Name") }}</dt>
<dd>* {{ $t("Modules.ET.Description") }} </dd>
</dl>
</div>
<!-- <b-modal ref="showUpdate" hide-footer title= {{ updateTitle }} > -->
</div>
<b-modal ref="showUpdate" hide-footer v-bind:title=this.updateTitle >
<div class="d-block text-center">
{{ this.body }}

View file

@ -8,6 +8,7 @@ import GlobalSettings from '../components/modules/Main/GlobalSettings'
import About from '../components/modules/Main/About'
import Store from '../store/index.js'
import ExportSettings from '../components/modules/ExportTools/Settings/settings'
import ExportCustom from '../components/modules/ExportTools/Custom/custom'
Vue.use(VueRouter)
const router = new VueRouter({
@ -45,6 +46,12 @@ Vue.use(VueRouter)
component: ExportSettings,
meta: {requiresAuth: true}
},
{
path: '/export/custom',
name: "exportcustom",
component: ExportCustom,
meta: {requiresAuth: true}
},
{
path: '/language',
name: "language",

View file

@ -50,15 +50,15 @@ const actions = {
var accessToken = getters.getSelectedServerToken
var libType = getters.getLibType
var levelName = et.getLevelDisplayName(getters.getSelectedExportLevel, libType)
var libName = et.getLibDisplayName(getters.getSelectedSection, getters.getPmsSections)
var levelName = et.getLevelDisplayName(getters.getSelectedExportLevel, libType);
var libName = et.getLibDisplayName(getters.getSelectedSection, getters.getPmsSections);
excel2.createOutFile( {
libName: libName,
level: levelName,
libType: libType,
baseURL: baseURL,
accessToken: accessToken
} );
} );
}
}

Binary file not shown.

Before

(image error) Size: 11 KiB

Binary file not shown.

After

(image error) Size: 12 KiB

Binary file not shown.

After

(image error) Size: 11 KiB

Binary file not shown.

Before

(image error) Size: 11 KiB

BIN
wiki/icons/Beta.png Normal file

Binary file not shown.

After

(image error) Size: 20 KiB

Binary file not shown.

After

(image error) Size: 10 KiB

Binary file not shown.

After

(image error) Size: 26 KiB

Binary file not shown.

Before

(image error) Size: 12 KiB

BIN
wiki/icons/Tux-314x314.png Normal file

Binary file not shown.

After

(image error) Size: 14 KiB

Binary file not shown.

After

(image error) Size: 3.1 KiB

Binary file not shown.

After

(image error) Size: 53 KiB

Binary file not shown.

After

(image error) Size: 3.9 KiB

Binary file not shown.

After

(image error) Size: 5.7 KiB

Binary file not shown.

After

(image error) Size: 136 KiB

Binary file not shown.

After

(image error) Size: 9 KiB

Binary file not shown.

After

(image error) Size: 142 KiB

Binary file not shown.

After

(image error) Size: 22 KiB

Binary file not shown.

Before

(image error) Size: 8.1 KiB

Binary file not shown.

After

(image error) Size: 7.7 KiB

Binary file not shown.

After

(image error) Size: 5.8 KiB