Merge branch 'master' into #184-Get-Github-Commit-into-version-number
19
CHANGELOG.md
|
@ -1,14 +1,25 @@
|
|||
#  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
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#  WebTools-NG
|
||||
#  WebTools-NG
|
||||
|
||||
[](https://github.com/WebTools-NG/WebTools-NG/issues)
|
||||
[](https://github.com/WebTools-NG/WebTools-NG/releases/latest)
|
||||
|
|
13
package-lock.json
generated
|
@ -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",
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
383
src/components/modules/ExportTools/Custom/custom.vue
Normal 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>
|
|
@ -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);
|
||||
|
|
|
@ -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 } );
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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 }}
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
} );
|
||||
} );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Before ![]() (image error) Size: 11 KiB |
BIN
wiki/general/GlobalSetting2.png
Normal file
After ![]() (image error) Size: 12 KiB |
BIN
wiki/icons/Apple-logo-grey-625x625.png
Normal file
After ![]() (image error) Size: 11 KiB |
Before ![]() (image error) Size: 11 KiB |
BIN
wiki/icons/Beta.png
Normal file
After ![]() (image error) Size: 20 KiB |
BIN
wiki/icons/Global Icon II.png
Normal file
After ![]() (image error) Size: 10 KiB |
BIN
wiki/icons/Language Settings Logo.png
Normal file
After ![]() (image error) Size: 26 KiB |
Before ![]() (image error) Size: 12 KiB |
BIN
wiki/icons/Tux-314x314.png
Normal file
After ![]() (image error) Size: 14 KiB |
BIN
wiki/icons/WebTools-24-NG.png
Normal file
After ![]() (image error) Size: 3.1 KiB |
BIN
wiki/icons/WebTools-256-NG.png
Normal file
After ![]() (image error) Size: 53 KiB |
BIN
wiki/icons/WebTools-32-NG.png
Normal file
After ![]() (image error) Size: 3.9 KiB |
BIN
wiki/icons/WebTools-48-NG.png
Normal file
After ![]() (image error) Size: 5.7 KiB |
BIN
wiki/icons/WebTools-512-NG.png
Normal file
After ![]() (image error) Size: 136 KiB |
BIN
wiki/icons/WebTools-72-NG.png
Normal file
After ![]() (image error) Size: 9 KiB |
BIN
wiki/icons/WebTools-820x512-title.png
Normal file
After ![]() (image error) Size: 142 KiB |
BIN
wiki/modules/exporttools/CustomLevels3.png
Normal file
After ![]() (image error) Size: 22 KiB |
Before ![]() (image error) Size: 8.1 KiB |
BIN
wiki/modules/exporttools/LevelSelect2.png
Normal file
After ![]() (image error) Size: 7.7 KiB |
BIN
wiki/modules/exporttools/SaveCustomLevel.png
Normal file
After ![]() (image error) Size: 5.8 KiB |