Merge branch 'master' into #85-no-buefy

This commit is contained in:
Casper Sillemann 2020-09-02 22:52:23 +02:00 committed by GitHub
commit e466996fc2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
55 changed files with 1030 additions and 257257 deletions

33
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View file

@ -0,0 +1,33 @@
---
name: Bug report
about: Create a report to help us improve
title: "[BUG]"
labels: Support
assignees: ukdtom
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS, Windows 10, OpenSuse Leap 15.2 etc.]
**Additional context**
Add any other context about the problem here.
**Logs**
Please provide WebTools-NG logs in a zip

View file

@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for this project
title: "[RFE]"
labels: enhancement
assignees: ukdtom
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View file

@ -7,6 +7,7 @@
[![master](https://img.shields.io/badge/master-stable-green.svg?maxAge=2592000)]()
![Maintenance](https://img.shields.io/badge/Maintained-Yes-green.svg)
NOTE: This is **NOT** ready for production yet....In fact not even in beta ;)
Please see the wiki for futher information

View file

@ -6,8 +6,8 @@ For security issues, we only support the latest version.
| Version | Supported |
| ------- | ------------------ |
| 1.0.0 | :white_check_mark: |
| < 1.0.0 | :x: |
| Latest | :white_check_mark: |
| < Latest | :x: |
## Reporting a Vulnerability

442
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,10 @@
{
"name": "webtools-ng",
"version": "0.1.0",
"version": "0.1.2",
"description": "WebTools Next Generation 4 Plex",
"author": "dane22 & CPSO",
"license": "MPL-2.0",
"homepage": "https://github.com/WebTools-NG/WebTools-NG",
"private": true,
"scripts": {
"serve": "vue-cli-service electron:serve",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

View file

@ -5,7 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
<title><%= htmlWebpackPlugin.options.title %> V<%= process.env.VUE_APP_VERSION %></title>
</head>
<body>
<noscript>

View file

@ -69,11 +69,11 @@
"menuGithub": "Github",
"menuManual": "Manual"
},
"NavSections":{
"Tools": "Tools",
"Options": "Options"
},
"Modules": {
"Sidebar": {
"NavSections":{
"Tools": "Tools",
"Options": "Options"
},
"ET": {
"Settings": "Settings"
},
@ -101,11 +101,12 @@
"Description": "@:Modules.ET.Name allows you to export detail information about the media in your libraries",
"Name": "ExportTool",
"HSelectMedia": "Select Library Type",
"HSelectSelection": "Select Media Libary",
"SelectSelection": "Select Selection",
"HSelectSelection": "Select Media Libary",
"HExportMedia": "Export Media",
"RadioMovies": "Movies",
"RadioTVSeries": "TV Series",
"RadioTVEpisodes": "TV Episodes",
"RadioTVShowEpisodes": "TV Shows and Episodes",
"RadioMusic": "Music",
"RadioPhotos": "Photos",
"RadioOtherVideos": "Other Videos",
@ -120,6 +121,7 @@
"ArraySep": "Delimiter for multiple info in same field",
"ColumnSep": "Delimiter between columns in CSV file (Use 9 for TAB)",
"TimeOut": "Timeout when requesting info from PMS in sec (Global setting)",
"ExportToExcel": "Export to xlsx as well as csv",
"OrgTitleNull": "Default \"Original Title\" to \"Title\", if empty",
"SortTitleNull": "Default \"Sort Title\" to \"Title\", if empty",
"AutoXLSCol": "Autosize column (xlsx only)",
@ -143,7 +145,9 @@
"GetSectionItems": "Fetching items {idx} in chunks of {chunck}"
},
"ErrorNoOutDirTitle": "No output directory defined",
"ErrorNoOutDirMsg": "You need to define an output directory in the settings page first"
"ErrorNoOutDirMsg": "You need to define an output directory in the settings page first",
"ErrorBadSepTitle": "Column separator issue",
"ErrorBadSep": "Column separator can only be one character"
},
"About": {
"Description": "@:Modules.About.Name",
@ -151,7 +155,7 @@
"Name": "About us and credits",
"MainDevelopers": "Main Developers",
"Devdane22": "Tommy (aka dane22), a Plex community member (ukdtom on GitHub)",
"DevCPSO": "Casper (aka CPSO), a soon-to-be Plex community member (CPSO on GitHub)",
"DevCPSO": "Casper (aka CPSO), a Plex community member (CPSO on GitHub)",
"TranslationBetaTestersTitle": "Translators and Beta Testers",
"TranslationBetaTestersText": "A huge thanks goes out to all the people who helped in translating and testing @:Common.AppName",
"PlexPoCredits": "And many thanks to the authors/developers and staff at Plex. We are eternally grateful for your dedication, talent and hard work! And to our friends at POEditor.com, who provide a free translation site because we are an Open-Source project."

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

View file

@ -101,14 +101,16 @@ export default {
this.getOnlineLangs();
},
methods: {
forcedownload() {
this.$store.dispatch("updateAndSetLang", { "langCode": i18n.locale, "forceDownload": true});
async forcedownload() {
this.olLangs = [];
await this.$store.dispatch("updateAndSetLang", { "langCode": i18n.locale, "forceDownload": true});
this.getOnlineLangs();
},
joinPOE() {
shell.openExternal("https://poeditor.com/join/project/yFjdfkDfup")
shell.openExternal("https://github.com/WebTools-NG/WebTools-NG/wiki/Translator")
},
getOnlineLangs() {
var onlineLangs = this.$store.getters.getLanguages
async getOnlineLangs() {
var onlineLangs = await this.$store.getters.getLanguages
for (var i=0; i<onlineLangs.length; i++) {
var langName = onlineLangs[i]['name'] + ' (' + onlineLangs[i]['percentage'] + '%)';
const entry = {}

View file

@ -9,6 +9,7 @@
<script>
const log = require('electron-log');
import '@fortawesome/fontawesome-free/css/all.css'
import etIcon from '@/assets/ET-256.png';
import i18n from '../../i18n'
export default {
data() {
@ -16,22 +17,27 @@ import i18n from '../../i18n'
menu: [
{
href: { path: '/home' },
title: i18n.t("Common.Menu.Modules.Home.NavTitle"),
title: i18n.t("Common.Menu.Sidebar.Home.NavTitle"),
icon: 'fa fa-home'
},
{
header: true,
title: i18n.t("Common.Menu.NavSections.Tools"),
title: i18n.t("Common.Menu.Sidebar.NavSections.Tools"),
hiddenOnCollapse: true
},
{
href: { path: '/export' },
title: 'Export',
icon: 'fas fa-file-export',
// icon: 'fas fa-file-export',
icon: {
//adjust element
element: 'img',
attributes: { src: etIcon },
},
child: [
{
href: '/export/settings',
title: i18n.t("Common.Menu.Modules.ET.Settings"),
title: i18n.t("Common.Menu.Sidebar.ET.Settings"),
icon: 'fa fa-cog'
}
]
@ -39,28 +45,28 @@ import i18n from '../../i18n'
},
{
header: true,
title: i18n.t("Common.Menu.NavSections.Options"),
title: i18n.t("Common.Menu.Sidebar.NavSections.Options"),
hiddenOnCollapse: true
},
{
href: { path: '/language' },
title: i18n.t("Common.Menu.Modules.Language.NavTitle"),
title: i18n.t("Common.Menu.Sidebar.Language.NavTitle"),
icon: 'fas fa-language'
},
{
href: { path: '/about' },
title: i18n.t("Common.Menu.Modules.About.NavTitle"),
title: i18n.t("Common.Menu.Sidebar.About.NavTitle"),
icon: 'fas fa-question-circle'
},
{
href: { path: '/' },
title: i18n.t("Common.Menu.Modules.Theme.NavTitle"),
title: i18n.t("Common.Menu.Sidebar.Theme.NavTitle"),
icon: 'fas fa-palette',
hidden: true
},
{
href: { path: '/' },
title: i18n.t("Common.Menu.Modules.Reset.NavTitle"),
title: i18n.t("Common.Menu.Sidebar.Reset.NavTitle"),
icon: 'fas fa-power-off',
hidden: true
}

View file

@ -5,6 +5,8 @@
<small>{{ $t("Modules.ET.Description") }}</small>
</h2>
<br />
<div> <!-- 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">
@ -19,10 +21,12 @@
name="mediaType"
></b-form-radio-group>
</b-form-group>
</div>
<div> <!-- Select Library -->
<b-form-group id="etLibraryGroup" v-bind:label="$t('Modules.ET.HSelectSelection')" label-size="lg" label-class="font-weight-bold pt-0">
</div>
<div class="d-flex align-items-center">
<b-form-group id="etLibraryGroup" v-bind:label="$t('Modules.ET.HSelectSelection')" label-size="lg" label-class="font-weight-bold pt-0">
<div ref="libSpinner" id="libSpinner" :hidden="selLibraryWait">
<b-spinner id="libLoad" class="ml-auto text-danger"></b-spinner>
</div>
<b-tooltip target="etLibraryGroup" triggers="hover">
{{ $t('Modules.ET.TT-ETLibrary') }}
</b-tooltip>
@ -30,10 +34,10 @@
v-model="selLibrary"
id="selLibrary"
@change.native="enableBtnExport"
:options="pmsSections"
:options="selLibraryOptions"
name="selLibrary">
</b-form-select>
</b-form-group>
</b-form-group>
</div>
<div> <!-- Select Export Level -->
@ -89,26 +93,42 @@
import i18n from '../../../i18n';
import store from '../../../store';
import { wtconfig } from '../../../wtutils';
const log = require("electron-log");
export default {
data() {
return {
return {
selLibraryWait: true,
btnDisable: true,
selMediaType: "movie",
selLibrary: "",
selLibraryOptions: [],
selLevel: "",
selLevelName: "",
optionsMediaType: [
{ text: 'Movies', value: 'movie', disabled: false },
{ text: 'Shows', value: 'show', disabled: true },
{ text: 'Artist', value: 'artist', disabled: true },
{ text: 'Photos', value: 'photo', disabled: true },
{ text: 'Other Videos', value: 'other', disabled: true }
]
{ 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.RadioOtherVideos'), value: 'other', disabled: true }
]
};
},
watch: {
// Watch for when selected server address is updated
selectedServerAddress: async function(){
// Changed, so we need to update the libraries
this.selLibraryWait = false;
this.selLibrary = '';
await this.getPMSSections();
this.selLibraryWait = true;
},
selectedServerAddressUpdateInProgress: async function(){
this.selLibraryWait = false;
}
},
created() {
log.info("ET Created");
this.$store.commit("UPDATE_SELECTEDLIBTYPE", this.selMediaType);
@ -116,30 +136,17 @@
this.fetchSelection();
},
computed: {
pmsSections: function() {
const sections = this.$store.getters.getPmsSections;
const result = [];
if (Array.isArray(sections) && sections.length) {
sections.forEach(req => {
if (req.type == this.selMediaType) {
log.debug(`pushing library: ${req.title} to results`);
let item = {};
item['text']=req.title;
item['value']=req.key;
result.push(item);
}
});
} else {
log.error("No Library found");
result.push["No Library found"];
}
return result;
},
exportLevels: function() {
et.getLevelDisplayName('My Level', this.selMediaType)
selectedServerAddress: function(){
return this.$store.getters.getSelectedServerAddress
},
selectedServerAddressUpdateInProgress(){
return this.$store.getters.getSelectedServerAddressUpdateInProgress
},
exportLevels: function() {
et.getLevelDisplayName('My Level', this.selMediaType);
// Returns valid levels for selected media type
const etLevel = et.getLevels(this.selMediaType);
let targetType = this.selMediaType;
const etLevel = et.getLevels(targetType);
const etCustomLevel = et.getCustomLevels(this.selMediaType);
const options = []
const item = {}
@ -181,6 +188,33 @@
}
},
methods: {
getPMSSections: async function(){
this.selLibrary = "Loading...";
await this.$store.dispatch('fetchSections')
const sections = await this.$store.getters.getPmsSections;
const result = [];
// If episodes, we need to show shows
let targetType = this.selMediaType;
if (targetType == 'episode')
{
targetType = 'show'
}
if (Array.isArray(sections) && sections.length) {
sections.forEach(req => {
if (req.type == targetType) {
log.debug(`pushing library: ${req.title} to results`);
let item = [];
item['text']=req.title;
item['value']=req.key;
result.push(Object.assign({}, item));
}
});
} else {
log.error("No Library found");
result.push["No Library found"];
}
this.selLibraryOptions = result;
},
selectSelection: function(selected) {
log.debug(selected);
this.$store.commit("UPDATE_SELECTEDSECTION", selected);
@ -192,13 +226,13 @@
changeType: function() {
// Triggers when lib type is changed
this.selLibrary = '';
this.selLevel = '';
this.selLevel = '';
this.getPMSSections();
this.$store.commit("UPDATE_SELECTEDLIBTYPE", this.selMediaType);
},
selectExportLevel: function() {
this.enableBtnExport();
},
},
getMedia() {
log.info("getMedia Called");
if (wtconfig.get('ET.OutPath', "") == "")
@ -218,12 +252,13 @@
this.$store.commit("UPDATE_EXPORTSTATUS", i18n.t("Modules.ET.Status.StartExport"));
this.$store.dispatch("exportMedias");
},
fetchSelection() {
async fetchSelection() {
log.debug("fetchSelection");
let serverCheck = this.$store.getters.getSelectedServer;
if (serverCheck !== "none") {
log.debug("serverCheck is not null, running fetchSections ");
this.$store.dispatch("fetchSections");
this.getPMSSections();
//await this.$store.dispatch("fetchSections");
} else {
log.debug("serverCheck is none");
this.$bvToast.toast(this.$t("Modules.ET.ErrorNoServerSelectedMsg"), {

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,17 +0,0 @@
[
{"Title":
{"key":"title","call":1,"type":"string"}
},
{"Media ID":
{"key":"ratingKey","call":1,"type":"string"}
},
{"Subtitle Stream Default":
{
"key":"$.Media[*].Part[*].Stream[?(@.streamType==3)].default",
"call":2,
"type":"array",
"subtype":"string",
"subkey":"default"
}
}
]

View file

@ -1,648 +0,0 @@
{
"MediaContainer":{
"size":1,
"allowSync":true,
"identifier":"com.plexapp.plugins.library",
"librarySectionID":4,
"librarySectionTitle":"Movies",
"librarySectionUUID":"611d44e2-c4cc-4cec-8b65-d77b037e1b3d",
"mediaTagPrefix":"/system/bundle/media/flags/",
"mediaTagVersion":1576869286,
"Metadata":[
{
"ratingKey":"9050",
"key":"/library/metadata/9050",
"guid":"com.plexapp.agents.imdb://tt0463854?lang=en",
"studio":"DNA Films",
"type":"movie",
"title":"28 Weeks Later",
"librarySectionTitle":"Movies",
"librarySectionID":4,
"librarySectionKey":"/library/sections/4",
"contentRating":"dk/15",
"summary":"The inhabitants of the British Isles have lost their battle against the onslaught of disease, as the deadly rage virus has killed every citizen there. Six months later, a group of Americans dare to set foot on the isles, convinced the danger has come and gone. But it soon becomes all too clear that the scourge continues to live, waiting to pounce on its next victims.",
"rating":7.1,
"audienceRating":6.7,
"year":2007,
"tagline":"When days turn to weeks... the horror returns.",
"thumb":"/library/metadata/9050/thumb/1575678555",
"art":"/library/metadata/9050/art/1575678555",
"duration":5757240,
"originallyAvailableAt":"2007-04-26",
"addedAt":1186162396,
"updatedAt":1575678555,
"audienceRatingImage":"rottentomatoes://image.rating.upright",
"chapterSource":"agent",
"primaryExtraKey":"/library/metadata/9454",
"ratingImage":"rottentomatoes://image.rating.ripe",
"Media":[
{
"id":9333,
"duration":5757240,
"bitrate":1022,
"width":592,
"height":320,
"aspectRatio":1.85,
"audioChannels":2,
"audioCodec":"mp3",
"videoCodec":"mpeg4",
"videoResolution":"sd",
"container":"avi",
"videoFrameRate":"PAL",
"videoProfile":"advanced simple",
"Part":[
{
"id":29662,
"key":"/library/parts/29662/1186162396/file.avi",
"duration":5757240,
"file":"/share/CACHEDEV1_DATA/video/old-movies/#/28 Weeks Later (2007)/28 Weeks Later.avi",
"size":735303680,
"container":"avi",
"videoProfile":"advanced simple",
"Stream":[
{
"id":67012,
"streamType":1,
"codec":"mpeg4",
"index":0,
"bitrate":879,
"bitDepth":8,
"chromaLocation":"left",
"chromaSubsampling":"4:2:0",
"frameRate":25,
"height":320,
"level":5,
"profile":"advanced simple",
"refFrames":1,
"width":592,
"displayTitle":"SD (MPEG4)"
},
{
"id":67013,
"streamType":2,
"selected":true,
"codec":"mp3",
"index":1,
"channels":2,
"bitrate":129,
"audioChannelLayout":"stereo",
"samplingRate":44100,
"streamIdentifier":"1",
"displayTitle":"Unknown (MP3 Stereo)"
},
{
"id":87333,
"key":"/library/streams/87333",
"streamType":3,
"selected":true,
"codec":"srt",
"language":"Dansk",
"languageCode":"dan",
"format":"srt",
"displayTitle":"Dansk (SRT External)"
}
]
}
]
}
],
"Genre":[
{
"id":66,
"filter":"genre=66",
"tag":"Drama"
},
{
"id":425,
"filter":"genre=425",
"tag":"Horror"
},
{
"id":13303,
"filter":"genre=13303",
"tag":"Sci-Fi"
}
],
"Director":[
{
"id":707,
"filter":"director=707",
"tag":"Juan Carlos Fresnadillo"
}
],
"Writer":[
{
"id":15263,
"filter":"writer=15263",
"tag":"Juan Carlos Fresnadillo"
},
{
"id":15261,
"filter":"writer=15261",
"tag":"Enrique López Lavigne"
},
{
"id":15264,
"filter":"writer=15264",
"tag":"Rowan Joffe"
},
{
"id":15262,
"filter":"writer=15262",
"tag":"Jesús Olmo"
}
],
"Producer":[
{
"id":15212,
"filter":"producer=15212",
"tag":"Andrew Macdonald"
},
{
"id":15314,
"filter":"producer=15314",
"tag":"Allon Reich"
},
{
"id":15315,
"filter":"producer=15315",
"tag":"Bernard Bellew"
},
{
"id":15316,
"filter":"producer=15316",
"tag":"Enrique López Lavigne"
}
],
"Country":[
{
"id":13562,
"filter":"country=13562",
"tag":"United Kingdom"
}
],
"Collection":[
{
"id":15213,
"filter":"collection=15213",
"tag":"28 Days/Weeks Later"
}
],
"Role":[
{
"id":15281,
"filter":"actor=15281",
"tag":"Imogen Poots",
"role":"Tammy Harris",
"thumb":"http://image.tmdb.org/t/p/original/kJOUQP0I5HzyenTLWUTCdx6mIAk.jpg"
},
{
"id":5195,
"filter":"actor=5195",
"tag":"Robert Carlyle",
"role":"Don",
"thumb":"http://image.tmdb.org/t/p/original/dLNeFPfJACiCiUz3oEdAjeKIwvZ.jpg"
},
{
"id":15302,
"filter":"actor=15302",
"tag":"Rose Byrne",
"role":"Scarlet",
"thumb":"http://image.tmdb.org/t/p/original/4oQWCLK7gd6RNKF0WJipJo7TyFP.jpg"
},
{
"id":15286,
"filter":"actor=15286",
"tag":"Jeremy Renner",
"role":"Sergeant Doyle",
"thumb":"http://image.tmdb.org/t/p/original/g8gheNEdPSXWH5SnjfjTYWj5ziU.jpg"
},
{
"id":3146,
"filter":"actor=3146",
"tag":"Harold Perrineau",
"role":"Flynn",
"thumb":"http://image.tmdb.org/t/p/original/dvvViqumTolGoCut6YiGow666z2.jpg"
},
{
"id":15269,
"filter":"actor=15269",
"tag":"Catherine McCormack",
"role":"Alice",
"thumb":"http://image.tmdb.org/t/p/original/a8Jszh3rHQ2T4u1VyE4lXrb0uDI.jpg"
},
{
"id":13551,
"filter":"actor=13551",
"tag":"Idris Elba",
"role":"General Stone",
"thumb":"http://image.tmdb.org/t/p/original/be1bVF7qGX91a6c5WeRPs5pKXln.jpg"
},
{
"id":15294,
"filter":"actor=15294",
"tag":"Mackintosh Muggleton",
"role":"Andy",
"thumb":"http://image.tmdb.org/t/p/original/iQFNTcNVfgHE4CZ4UoLhpNQoNmB.jpg"
},
{
"id":15266,
"filter":"actor=15266",
"tag":"Amanda Walker",
"role":"Sally",
"thumb":"http://image.tmdb.org/t/p/original/bOjEahLqTmhO6gFBTLnN5g2xOpn.jpg"
},
{
"id":15305,"filter":"actor=15305",
"tag":"Shahid Ahmed",
"role":"Jacob",
"thumb":"http://image.tmdb.org/t/p/original/uwepvgBhG6AgTl4hqOapKcQsGK3.jpg"
},
{
"id":15280,
"filter":"actor=15280",
"tag":"Garfield Morgan",
"role":"Geoff",
"thumb":"http://image.tmdb.org/t/p/original/hbCQsxjwJEjx7evHmIVX3No9WSM.jpg"
},
{
"id":15278,
"filter":"actor=15278",
"tag":"Emily Beecham",
"role":"Karen",
"thumb":"http://image.tmdb.org/t/p/original/cwBsTcY0FLnVYvRUY6cTutZsfPs.jpg"
},
{
"id":15268,
"filter":"actor=15268",
"tag":"Beans El-Balawi",
"role":"Boy in Cottage",
"thumb":"http://image.tmdb.org/t/p/original/gKKgurTC5zBJDiNSUnSxTWLmT4N.jpg"
},
{
"id":15297,
"filter":"actor=15297",
"tag":"Meghan Popiel",
"role":"DLR Soldier",
"thumb":"http://image.tmdb.org/t/p/original/3clr9teZrczPM3lTwHKXH14De21.jpg"
},
{
"id":15307,
"filter":"actor=15307",
"tag":"Stewart Alexander",
"role":"Military Officer",
"thumb":"http://image.tmdb.org/t/p/original/hCnwlefK3ws4zYacepkUH9r3xlp.jpg"
},
{
"id":15298,
"filter":"actor=15298",
"tag":"Philip Bulcock",
"role":"Senior Medical Officer",
"thumb":"http://image.tmdb.org/t/p/original/1HTTFGHLopYndPS5aYucpG79wTO.jpg"
},
{
"id":15270,
"filter":"actor=15270",
"tag":"Chris Ryman",
"role":"Rooftop Sniper",
"thumb":"http://image.tmdb.org/t/p/original/qTXI6K6TrbJiUxOp9dbgd4mLKJg.jpg"
},
{
"id":15312,
"filter":"actor=15312",
"tag":"Tristan Tait",
"role":"Soldier",
"thumb":"http://image.tmdb.org/t/p/original/8XDYVxAyJq81qysTzE5p0KCgSKY.jpg"
},
{
"id":15313,
"filter":"actor=15313",
"tag":"William Meredith",
"role":"Medical Officer",
"thumb":"http://image.tmdb.org/t/p/original/5AFiiW7d8MBsnhJhjcVE2LmlqPg.jpg"
},
{
"id":15309,
"filter":"actor=15309",
"tag":"Thomas Garvey",
"role":"Bunker Major"
},
{
"id":15310,
"filter":"actor=15310",
"tag":"Tom Bodell",
"role":"Medical Centre Lobby Soldier"
},
{
"id":15267,
"filter":"actor=15267",
"tag":"Andrew Byron",
"role":"Carpark Soldier",
"thumb":"http://image.tmdb.org/t/p/original/yOoY7YAfKzLfJIw9dOyvczH2xmi.jpg"
},
{
"id":15303,
"filter":"actor=15303",
"tag":"Sarah Finigan",
"role":"Carpark Civilian",
"thumb":"http://image.tmdb.org/t/p/original/77UiRlRRT3792HxusFxuPMrkNaW.jpg"
},
{
"id":15301,
"filter":"actor=15301",
"tag":"Roderic Culver",
"role":"Carpark Civilian",
"thumb":"http://image.tmdb.org/t/p/original/pN6V2Ga9N8qwyzcD7yrlIMhU3CH.jpg"
},
{
"id":15295,
"filter":"actor=15295",
"tag":"Maeve Malley-Ryan",
"role":"Carpark Civilian",
"thumb":"http://image.tmdb.org/t/p/original/8idtel3Nk44EUrwZI1voUMQdmoO.jpg"
},
{
"id":15277,
"filter":"actor=15277",
"tag":"Ed Coleman",
"role":"Carpark Civilian",
"thumb":"http://image.tmdb.org/t/p/original/gFRjKe4QfoilRuXTZFsRZ4Eo0Gb.jpg"
},
{
"id":15290,
"filter":"actor=15290",
"tag":"Karen Meagher",
"role":"Carpark Civilian",
"thumb":"http://image.tmdb.org/t/p/original/iIhQNJCYVsOmiMmP40FDub1CSBW.jpg"
},
{
"id":15265,
"filter":"actor=15265",
"tag":"Amanda Lawrence",
"role":"Carpark Civilian",
"thumb":"http://image.tmdb.org/t/p/original/n0RmDWYo266XvrNlS0aZCXSOihn.jpg"
},
{
"id":15276,
"filter":"actor=15276",
"tag":"Drew Rhys-Williams",
"role":"Carpark Civilian",
"thumb":"http://image.tmdb.org/t/p/original/7GmTgiU4qrQTpJyL9a6hsvaSE7x.jpg"
},
{
"id":15300,
"filter":"actor=15300",
"tag":"Raymond Waring",
"role":"Sam",
"thumb":"http://image.tmdb.org/t/p/original/iI9pw8ukPkgLRF20YVonTO5VQp8.jpg"
},
{
"id":15292,
"filter":"actor=15292",
"tag":"Kish Sharma",
"role":"Depot Man"
},
{
"id":15284,
"filter":"actor=15284",
"tag":"Jane Thorne",
"role":"Depot Woman",
"thumb":"http://image.tmdb.org/t/p/original/wZnyLVOfkIrhEsNQFADSa5bAeBw.jpg"
},
{
"id":15273,
"filter":"actor=15273",
"tag":"Dean Alexandrou",
"role":"Infected Person (uncredited)",
"thumb":"http://image.tmdb.org/t/p/original/kr1WMrKVCx9eGJm4thT19gtrpA6.jpg"
},
{
"id":15275,
"filter":"actor=15275",
"tag":"Didier Dell Benjamin",
"role":"Civilian (uncredited)",
"thumb":"http://image.tmdb.org/t/p/original/ckwkBkKsC2Wt2GOrILtDBDFLY8X.jpg"
},
{
"id":15279,
"filter":"actor=15279",
"tag":"Gareth Clarke",
"role":"Infected Person (uncredited)"
},
{
"id":15282,
"filter":"actor=15282",
"tag":"James Fiddy",
"role":"Victim (uncredited)",
"thumb":"http://image.tmdb.org/t/p/original/8RYvhkfNCuWiZOeWrzl46QWTCSU.jpg"
},
{
"id":15311,
"filter":"actor=15311",
"tag":"Tommy Gunn",
"role":"Marine (uncredited)",
"thumb":"http://image.tmdb.org/t/p/original/yiBD0BrDZIsSN4m8f0d8Hl76Eo9.jpg"
},
{
"id":15272,
"filter":"actor=15272",
"tag":"Daniel Jefferson",
"role":"Civilian (uncredited)",
"thumb":"http://image.tmdb.org/t/p/original/lWy5MZMXcLuzsGdAeT9GuDdo4F9.jpg"
},
{
"id":15274,
"filter":"actor=15274",
"tag":"Debbie Kurup",
"role":"Infected Person (uncredited)",
"thumb":"http://image.tmdb.org/t/p/original/orhBknLRtV7AGXVkEAlol0p7ncq.jpg"
},
{
"id":15304,
"filter":"actor=15304",
"tag":"Selina Lo",
"role":"Infected Person (uncredited)",
"thumb":"http://image.tmdb.org/t/p/original/vz3r7SYYWSp4Lte0JwvtTqxXsh9.jpg"
},
{
"id":15288,
"filter":"actor=15288",
"tag":"João Costa Menezes",
"role":"Infected Person (uncredited)",
"thumb":"http://image.tmdb.org/t/p/original/xDnd4tnHZAgdMgmt443E4nG7Ko0.jpg"
},
{
"id":15283,
"filter":"actor=15283",
"tag":"Jane Osborn",
"role":"Infected Person (uncredited)",
"thumb":"http://image.tmdb.org/t/p/original/tCXL4SuqvDH0wk0J6A7OEADKY2L.jpg"
},
{
"id":15289,
"filter":"actor=15289",
"tag":"Jude Poyer",
"role":"Infected Person (uncredited)",
"thumb":"http://image.tmdb.org/t/p/original/quUa0O1fTgPH5aRRq3RNYL6pg8b.jpg"
},
{
"id":15287,
"filter":"actor=15287",
"tag":"Joseph Ripley",
"role":"Infected person (uncredited)"
},
{
"id":15306,
"filter":"actor=15306",
"tag":"Simon Delaney",
"role":"Carpark Civilian",
"thumb":"http://image.tmdb.org/t/p/original/x74QVhesWL0nM0EFIosl6awxcIu.jpg"
},
{
"id":15308,
"filter":"actor=15308",
"tag":"Stuart Adams",
"role":"Don"
},
{
"id":15271,
"filter":"actor=15271",
"tag":"Daniel Baggs",
"role":"Jeremy Renner - Double (uncredited)"
},
{
"id":15291,"filter":"actor=15291","tag":"Katie Borland",
"role":"Infected (uncredited)",
"thumb":"http://image.tmdb.org/t/p/original/vRtWKZJKwTtkF8ZQAl56WIwSCid.jpg"
},
{
"id":15285,
"filter":"actor=15285",
"tag":"Jason Curle",
"role":"Infected Person (uncredited)"
},
{
"id":15293,
"filter":"actor=15293",
"tag":"Laine Edwards",
"role":"Civilian (uncredited)"
},
{
"id":15299,
"filter":"actor=15299",
"tag":"Pip Henderson",
"role":"Infected (uncredited)"
},
{
"id":15296,
"filter":"actor=15296",
"tag":"Matt Reeves",
"role":"Bunker Soldier",
"thumb":"http://image.tmdb.org/t/p/original/fj2OSoBhVepDZSfLXisGJmMXDNo.jpg"
}
],
"Similar":[
{
"id":13343,
"filter":"similar=13343",
"tag":"28 Days Later"
},
{
"id":14197,
"filter":"similar=14197",
"tag":"30 Days of Night"
},
{
"id":15252,
"filter":"similar=15252",
"tag":"Dawn of the Dead"
},
{
"id":15255,
"filter":"similar=15255",
"tag":"Land of the Dead"
},
{
"id":14209,
"filter":"similar=14209",
"tag":"The Crazies"
},
{
"id":15350,"filter":"similar=15350",
"tag":"Pandorum"
},
{
"id":15258,
"filter":"similar=15258",
"tag":"Sunshine"
},
{
"id":15253,
"filter":"similar=15253",
"tag":"Daybreakers"
},
{
"id":755,
"filter":"similar=755",
"tag":"The Mist"
},
{
"id":13355,
"filter":"similar=13355",
"tag":"The Descent"
},
{
"id":15254,
"filter":"similar=15254",
"tag":"Event Horizon"
},
{
"id":14210,
"filter":"similar=14210",
"tag":"The Hills Have Eyes"
},
{
"id":15256,
"filter":"similar=15256",
"tag":"Planet Terror"
},
{
"id":14207,
"filter":"similar=14207",
"tag":"Silent Hill"
},
{
"id":15349,
"filter":"similar=15349",
"tag":"Monsters"
},
{
"id":15353,
"filter":"similar=15353",
"tag":"The Happening"
},
{
"id":15517,
"filter":"similar=15517",
"tag":"1408"
},
{
"id":15348,
"filter":"similar=15348",
"tag":"Doomsday"
},
{
"id":53994,
"filter":"similar=53994",
"tag":"Resident Evil"
},
{
"id":14199,
"filter":"similar=14199",
"tag":"Drag Me to Hell"
}
]
}
]
}
}

View file

@ -1,76 +0,0 @@
{
"ratingKey":"9050",
"key":"/library/metadata/9050",
"guid":"com.plexapp.agents.imdb://tt0463854?lang=en",
"studio":"DNA Films",
"type":"movie",
"title":"28 Weeks Later",
"contentRating":"dk/15",
"summary":"The inhabitants of the British Isles have lost their battle against the onslaught of disease, as the deadly rage virus has killed every citizen there. Six months later, a group of Americans dare to set foot on the isles, convinced the danger has come and gone. But it soon becomes all too clear that the scourge continues to live, waiting to pounce on its next victims.",
"rating":7.1,
"audienceRating":6.7,
"year":2007,
"tagline":"When days turn to weeks... the horror returns.",
"thumb":"/library/metadata/9050/thumb/1575678555",
"art":"/library/metadata/9050/art/1575678555",
"duration":5757240,
"originallyAvailableAt":"2007-04-26",
"addedAt":1186162396,
"updatedAt":1575678555,
"lastViewedAt":1575678555,
"audienceRatingImage":"rottentomatoes://image.rating.upright",
"chapterSource":"agent",
"primaryExtraKey":"/library/metadata/9454",
"ratingImage":"rottentomatoes://image.rating.ripe",
"Media":[
{
"id":9333,
"duration":5757240,
"bitrate":1022,
"width":592,
"height":320,
"aspectRatio":1.85,
"audioChannels":2,
"audioCodec":"mp3",
"videoCodec":"mpeg4",
"videoResolution":"sd",
"container":"avi",
"videoFrameRate":"PAL",
"videoProfile":"advanced simple",
"Part":[
{
"id":29662,
"key":"/library/parts/29662/1186162396/file.avi",
"duration":5757240,
"file":"/share/CACHEDEV1_DATA/video/old-movies/#/28 Weeks Later (2007)/28 Weeks Later.avi",
"size":735303680,
"container":"avi",
"videoProfile":"advanced simple"
}
]
}
],
"Genre":[
{
"tag":"Drama"
},
{
"tag":"Horror"
}
],
"Director":[{"tag":"Juan Carlos Fresnadillo"}],
"Writer":[{"tag":"Enrique López Lavigne"},{"tag":"Jesús Olmo"}],
"Country":[{"tag":"United Kingdom"}],
"Collection":[{"tag":"28 Days/Weeks Later"}],
"Role":[
{
"tag":"Amanda Lawrence"
},
{
"tag":"Amanda Walker"
},
{
"tag":"Andrew Byron"
}
]
}

View file

@ -1,106 +0,0 @@
{
"MediaContainer":{
"size":30,
"totalSize":2570,
"allowSync":true,
"art":"/:/resources/movie-fanart.jpg",
"identifier":"com.plexapp.plugins.library",
"librarySectionID":4,
"librarySectionTitle":"Movies",
"librarySectionUUID":"611d44e2-c4cc-4cec-8b65-d77b037e1b3d",
"mediaTagPrefix":"/system/bundle/media/flags/",
"mediaTagVersion":1576869286,
"offset":31,
"thumb":"/:/resources/movie.png",
"title1":"Movies",
"title2":"All Movies",
"viewGroup":"movie",
"viewMode":65592,
"Metadata":[
{
"ratingKey":"9042",
"key":"/library/metadata/9042",
"guid":"com.plexapp.agents.imdb://tt4385888?lang=en",
"studio":"Annapurna Pictures",
"type":"movie",
"title":"20th Century Women",
"contentRating":"dk/fr.u.7",
"summary":"In 1979 Santa Barbara, California, Dorothea Fields is a determined single mother in her mid-50s who is raising her adolescent son, Jamie, at a moment brimming with cultural change and rebellion. Dorothea enlists the help of two younger women Abbie, a free-spirited punk artist living as a boarder in the Fields' home and Julie, a savvy and provocative teenage neighbour to help with Jamie's upbringing.",
"rating":8.9,
"audienceRating":7.3,
"year":2016,
"thumb":"/library/metadata/9042/thumb/1575678525",
"art":"/library/metadata/9042/art/1575678525",
"duration":7124159,
"originallyAvailableAt":"2016-12-28",
"addedAt":1490792202,
"updatedAt":1575678525,
"audienceRatingImage":"rottentomatoes://image.rating.upright",
"chapterSource":"media",
"primaryExtraKey":"/library/metadata/9421",
"ratingImage":"rottentomatoes://image.rating.ripe",
"Media":[
{
"id":9325,
"duration":7124159,
"bitrate":10980,
"width":1920,
"height":960,
"aspectRatio":1.85,
"audioChannels":6,
"audioCodec":"ac3",
"videoCodec":"h264",
"videoResolution":"1080",
"container":"mkv",
"videoFrameRate":"24p",
"audioProfile":"dts",
"videoProfile":"high",
"Part":[
{
"id":29623,
"key":"/library/parts/29623/1567348678/file.mkv",
"duration":7124159,
"file":"/share/CACHEDEV1_DATA/video/old-movies/#/20th Century Women (2016)/20th.Century.Women.2016.1080p.BluRay.x264-GECKOS.mkv",
"size":9777930144,
"audioProfile":"dts",
"container":"mkv",
"videoProfile":"high"
}]
}],
"Genre":[
{
"tag":"Comedy"
},
{
"tag":"Drama"
}
],
"Director":[
{
"tag":"Mike Mills"
}
],
"Writer":[
{
"tag":"Mike Mills"
}
],
"Country":[
{
"tag":"USA"
}
],
"Role":[
{
"tag":"Alia Shawkat"
},
{
"tag":"Alison Elliott"
},
{
"tag":"Annette Bening"
}
]
},
{
"ratingKey":"9050","key":"/library/metadata/9050","guid":"com.plexapp.agents.imdb://tt0463854?lang=en","studio":"DNA Films","type":"movie","title":"28 Weeks Later","contentRating":"dk/15","summary":"The inhabitants of the British Isles have lost their battle against the onslaught of disease, as the deadly rage virus has killed every citizen there. Six months later, a group of Americans dare to set foot on the isles, convinced the danger has come and gone. But it soon becomes all too clear that the scourge continues to live, waiting to pounce on its next victims.","rating":7.1,"audienceRating":6.7,"year":2007,"tagline":"When days turn to weeks... the horror returns.","thumb":"/library/metadata/9050/thumb/1575678555","art":"/library/metadata/9050/art/1575678555","duration":5757240,"originallyAvailableAt":"2007-04-26","addedAt":1186162396,"updatedAt":1575678555,"lastViewedAt":1575678555,"audienceRatingImage":"rottentomatoes://image.rating.upright","chapterSource":"agent","primaryExtraKey":"/library/metadata/9454","ratingImage":"rottentomatoes://image.rating.ripe","Media":[{"id":9333,"duration":5757240,"bitrate":1022,"width":592,"height":320,"aspectRatio":1.85,"audioChannels":2,"audioCodec":"mp3","videoCodec":"mpeg4","videoResolution":"sd","container":"avi","videoFrameRate":"PAL","videoProfile":"advanced simple","Part":[{"id":29662,"key":"/library/parts/29662/1186162396/file.avi","duration":5757240,"file":"/share/CACHEDEV1_DATA/video/old-movies/#/28 Weeks Later (2007)/28 Weeks Later.avi","size":735303680,"container":"avi","videoProfile":"advanced simple"}]}],"Genre":[{"tag":"Drama"},{"tag":"Horror"}],"Director":[{"tag":"Juan Carlos Fresnadillo"}],"Writer":[{"tag":"Enrique López Lavigne"},{"tag":"Jesús Olmo"}],"Country":[{"tag":"United Kingdom"}],"Collection":[{"tag":"28 Days/Weeks Later"}],"Role":[{"tag":"Amanda Lawrence"},{"tag":"Amanda Walker"},{"tag":"Andrew Byron"}]}]}}

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -1,122 +0,0 @@
{
"ratingKey":"9042",
"key":"/library/metadata/9042",
"guid":"com.plexapp.agents.imdb://tt4385888?lang=en",
"studio":"Annapurna Pictures",
"type":"movie",
"title":"20th Century Women",
"librarySectionTitle":"Movies",
"librarySectionID":4,
"librarySectionKey":"/library/sections/4",
"contentRating":"dk/fr.u.7",
"summary":"In 1979 Santa Barbara, California, Dorothea Fields is a determined single mother in her mid-50s who is raising her adolescent son, Jamie, at a moment brimming with cultural change and rebellion. Dorothea enlists the help of two younger women Abbie, a free-spirited punk artist living as a boarder in the Fields' home and Julie, a savvy and provocative teenage neighbour to help with Jamie's upbringing.",
"rating":8.9,
"audienceRating":7.3,
"year":2016,
"thumb":"/library/metadata/9042/thumb/1575678525",
"art":"/library/metadata/9042/art/1575678525",
"duration":7124159,
"originallyAvailableAt":"2016-12-28",
"addedAt":1490792202,
"updatedAt":1575678525,
"audienceRatingImage":"rottentomatoes://image.rating.upright",
"chapterSource":"media",
"primaryExtraKey":"/library/metadata/9421",
"ratingImage":"rottentomatoes://image.rating.ripe",
"Media":[
{
"id":9325,
"duration":7124159,
"bitrate":10980,
"width":1920,
"height":960,
"aspectRatio":1.85,
"audioChannels":6,
"audioCodec":"ac3",
"videoCodec":"h264",
"videoResolution":"1080",
"container":"mkv",
"videoFrameRate":"24p",
"audioProfile":"dts",
"videoProfile":"high",
"Part":[
{
"id":29623,
"key":"/library/parts/29623/1567348678/file.mkv",
"duration":7124159,
"file":"/share/CACHEDEV1_DATA/video/old-movies/#/20th Century Women (2016)/20th.Century.Women.2016.1080p.BluRay.x264-GECKOS.mkv",
"size":9777930144,
"audioProfile":"dts",
"container":"mkv",
"videoProfile":"high",
"Stream":[
{
"id":66877,
"streamType":1,
"default":true,
"codec":"h264",
"index":0,
"bitrate":8996,
"bitDepth":8,
"chromaLocation":"left",
"chromaSubsampling":"4:2:0",
"frameRate":23.976,
"hasScalingMatrix":false,
"height":960,
"level":41,
"profile":"high",
"refFrames":4,
"scanType":"progressive",
"width":1920,
"displayTitle":"1080p (H.264)"
},
{
"id":66878,"streamType":2,"selected":true,"default":true,
"codec":"ac3","index":1,"channels":6,"bitrate":448,
"language":"English","languageCode":"eng",
"audioChannelLayout":"5.1(side)","samplingRate":48000,
"displayTitle":"English (AC3 5.1)"
},
{
"id":145278,"streamType":2,"codec":"dca","index":2,
"channels":6,"bitrate":1536,"language":"English",
"languageCode":"eng","audioChannelLayout":"5.1(side)",
"bitDepth":24,"profile":"dts","samplingRate":48000,
"displayTitle":"English (DTS 5.1)"},{"id":66880,
"streamType":3,"codec":"srt","index":3,"bitrate":0,
"language":"English","languageCode":"eng",
"displayTitle":"English (SRT)"},{"id":145279,
"streamType":3,"codec":"srt","index":4,"bitrate":0,
"language":"English","languageCode":"eng","title":"SDH",
"displayTitle":"English (SRT)"
},
{
"id":87315,"key":"/library/streams/87315",
"streamType":3,"selected":true,"codec":"srt",
"language":"Dansk","languageCode":"dan","format":"srt",
"displayTitle":"Dansk (SRT External)"
},
{
"id":87314,"key":"/library/streams/87314","streamType":3,
"codec":"srt","language":"English","languageCode":"eng",
"format":"srt","displayTitle":"English (SRT External)"
}
]
}
]
}
],
"Genre":[
{
"id":7,"filter":"genre=7","tag":"Comedy"
},
{
"id":66,"filter":"genre=66","tag":"Drama"
}
],
"Director":[
{
"id":14818,"filter":"director=14818","tag":"Mike Mills"
}
],"Writer":[{"id":14819,"filter":"writer=14819","tag":"Mike Mills"}],"Producer":[{"id":14840,"filter":"producer=14840","tag":"Anne Carey"},{"id":14841,"filter":"producer=14841","tag":"Megan Ellison"},{"id":14842,"filter":"producer=14842","tag":"Youree Henley"}],"Country":[{"id":13306,"filter":"country=13306","tag":"USA"}],"Role":[{"id":14822,"filter":"actor=14822","tag":"Annette Bening","role":"Dorothea Fields","thumb":"http://image.tmdb.org/t/p/original/vVAvoiE6FQ4couqaB0ogaHR6Ef7.jpg"},{"id":14827,"filter":"actor=14827","tag":"Elle Fanning","role":"Julie Miller","thumb":"http://image.tmdb.org/t/p/original/e8CUyxQSE99y5IOfzSLtHC0B0Ch.jpg"},{"id":14830,"filter":"actor=14830","tag":"Greta Gerwig","role":"Abbie Porter","thumb":"http://image.tmdb.org/t/p/original/3H0xzU12GTNJyQTpGysEuI9KyiQ.jpg"},{"id":14834,"filter":"actor=14834","tag":"Lucas Jade Zumann","role":"Jamie Fields","thumb":"http://image.tmdb.org/t/p/original/7ocQJdexgzKx4Yqk0qs9fChIniV.jpg"},{"id":14823,"filter":"actor=14823","tag":"Billy Crudup","role":"William","thumb":"http://image.tmdb.org/t/p/original/2fuCSqWskRaHNBJQsfb0iDPfnWa.jpg"},{"id":14820,"filter":"actor=14820","tag":"Alia Shawkat","role":"Trish","thumb":"http://image.tmdb.org/t/p/original/3A9fLNoFLkbMlSpzoOCWlVIdKKw.jpg"},{"id":14826,"filter":"actor=14826","tag":"Darrell Britt-Gibson","role":"Julian","thumb":"http://image.tmdb.org/t/p/original/cCfTL6qkctE088J3qr8qtgGrZa1.jpg"},{"id":14837,"filter":"actor=14837","tag":"Thea Gill","role":"Gail Porter","thumb":"http://image.tmdb.org/t/p/original/xFG4j3Ll0iVjLaR6jzSNysymxPx.jpg"},{"id":96315,"filter":"actor=96315","tag":"Laura Slade Wiggins","role":"Lynette Winters","thumb":"http://image.tmdb.org/t/p/original/xaDDy9Lsn8CEZe7b1JbdK5GKE8Z.jpg"},{"id":14836,"filter":"actor=14836","tag":"Nathalie Love","role":"Cindy","thumb":"http://image.tmdb.org/t/p/original/8PcM8xE8bSpfQkoNBhVPjPlOX1Z.jpg"},{"id":14821,"filter":"actor=14821","tag":"Alison Elliott","role":"Julie's Mother","thumb":"http://image.tmdb.org/t/p/original/lu5ePooNr1mXNPoEJbxcdmZNqEz.jpg"},{"id":14828,"filter":"actor=14828","tag":"Finn Roberts","role":"Tim Drammer","thumb":"http://image.tmdb.org/t/p/original/pt6b2kHhXpHQ93ROWXAgwfD3YFo.jpg"},{"id":14831,"filter":"actor=14831","tag":"Kirk Bovill","role":"Dorothea's Dinner Guest"},{"id":825,"filter":"actor=825","tag":"Waleed Zuaiter","role":"Charlie","thumb":"http://image.tmdb.org/t/p/original/b7NMq4XyyFkZRKKCag3mpR74jJX.jpg"},{"id":14767,"filter":"actor=14767","tag":"John Billingsley","role":"Doctor","thumb":"http://image.tmdb.org/t/p/original/fHQ6ecMufxLwUAbN3dX3yxFAn5d.jpg"},{"id":14825,"filter":"actor=14825","tag":"Curran Walters","role":"Matt","thumb":"http://image.tmdb.org/t/p/original/aCQvYZwxzteT1gAqHc3eFLYQBDj.jpg"},{"id":14838,"filter":"actor=14838","tag":"Vitaly Andrew LeBeau","role":"Young Jamie"},{"id":14824,"filter":"actor=14824","tag":"Cameron Gellman","role":"Mark","thumb":"http://image.tmdb.org/t/p/original/czeicsWwYVJDTqiZLgx9sDl98O8.jpg"},{"id":14829,"filter":"actor=14829","tag":"Finnegan Seeker Bell","role":"Brian"},{"id":14839,"filter":"actor=14839","tag":"Zoë Nanos","role":"Tanya"},{"id":14833,"filter":"actor=14833","tag":"Lauren Foley","role":"Michelle"},{"id":14835,"filter":"actor=14835","tag":"Matthew Cardarople","role":"Bartender","thumb":"http://image.tmdb.org/t/p/original/1PYYUktSJYQP9JZKeQC2rhmhoYD.jpg"}],"Similar":[{"id":14851,"filter":"similar=14851","tag":"Certain Women"},{"id":14858,"filter":"similar=14858","tag":"Mistress America"},{"id":14860,"filter":"similar=14860","tag":"Paterson"},{"id":14856,"filter":"similar=14856","tag":"Loving"},{"id":14865,"filter":"similar=14865","tag":"Toni Erdmann"},{"id":14854,"filter":"similar=14854","tag":"Frances Ha"},{"id":14857,"filter":"similar=14857","tag":"Maggie's Plan"},{"id":14850,"filter":"similar=14850","tag":"American Honey"},{"id":14855,"filter":"similar=14855","tag":"Jackie"},{"id":14861,"filter":"similar=14861","tag":"Personal Shopper"},{"id":59785,"filter":"similar=59785","tag":"Beginners"},{"id":17005,"filter":"similar=17005","tag":"The Florida Project"},{"id":14862,"filter":"similar=14862","tag":"Sing Street"},{"id":14863,"filter":"similar=14863","tag":"Tangerine"},{"id":16995,"filter":"similar=16995","tag":"Columbus"},{"id":14847,"filter":"similar=14847","tag":"45 Years"},{"id":14852,"filter":"similar=14852","tag":"Christine"},{"id":14848,"filter":"similar=14848","tag":"A Bigger Splash"},{"id":14853,"filter":"similar=14853","tag":"Elle"},
{"id":14859,"filter":"similar=14859","tag":"Other People"}]}

View file

@ -1,344 +0,0 @@
{
"ratingKey":"34765",
"key":"/library/metadata/34765",
"guid":"com.plexapp.agents.imdb://tt1131724?lang=en",
"studio":"Screen Australia",
"type":"movie",
"title":"2:22",
"librarySectionTitle":"Movies",
"librarySectionID":4,
"librarySectionKey":"/library/sections/4",
"contentRating":"PG-13",
"summary":"A man's life is derailed when an ominous pattern of events repeats itself in exactly the same manner every day, ending at precisely 2:22 p.m.",
"rating":5.8,
"year":2017,
"thumb":"/library/metadata/34765/thumb/1583190431",
"art":"/library/metadata/34765/art/1583190431",
"duration":5933984,
"originallyAvailableAt":"2017-06-29",
"addedAt":1583190383,
"updatedAt":1583190431,
"chapterSource":"media",
"primaryExtraKey":"/library/metadata/34766",
"ratingImage":"imdb://image.rating",
"Media":[
{
"id":59928,
"duration":5933984,
"bitrate":4934,
"width":1920,
"height":796,
"aspectRatio":2.35,
"audioChannels":6,
"audioCodec":"ac3",
"videoCodec":"h264",
"videoResolution":"1080",
"container":"mkv",
"videoFrameRate":"24p",
"videoProfile":"high",
"Part":[
{
"accessible":true,
"exists":true,
"id":63448,
"key":"/library/parts/63448/1583190312/file.mkv",
"duration":5933984,
"file":"/share/CACHEDEV1_DATA/video/old-movies/#/2-22 (2017)/2-22 (2017).mkv",
"size":3659878640,
"container":"mkv",
"hasThumbnail":"1",
"videoProfile":"high",
"Stream":[
{
"id":158470,
"streamType":1,
"default":true,
"codec":"h264",
"index":0,
"bitrate":4550,
"language":"English",
"languageCode":"eng",
"bitDepth":8,
"chromaLocation":"topleft",
"chromaSubsampling":"4:2:0",
"codedHeight":"800",
"codedWidth":"1920",
"colorPrimaries":"bt709",
"colorRange":"tv",
"colorSpace":"bt709",
"colorTrc":"bt709",
"frameRate":23.976,
"hasScalingMatrix":false,
"height":796,
"level":40,
"profile":"high",
"refFrames":5,
"scanType":"progressive",
"title":"2.22.2017.1080p.WEB-DL.DD5.1.H264-FGT",
"width":1920,
"displayTitle":"1080p (H.264)"
},
{
"id":158471,
"streamType":2,
"selected":true,
"default":true,
"codec":"ac3",
"index":1,
"channels":6,
"bitrate":384,
"language":"English",
"languageCode":"eng",
"audioChannelLayout":"5.1(side)",
"samplingRate":48000,
"title":"2.22.2017.1080p.WEB-DL.DD5.1.H264-FGT",
"displayTitle":"English (AC3 5.1)"
},
{
"id":158472,
"streamType":3,
"default":true,
"codec":"srt",
"index":2,
"language":"Dansk",
"languageCode":"dan",
"displayTitle":"Dansk (SRT)"
},
{
"id":158479,
"key":"/library/streams/158479",
"streamType":3,
"selected":true,
"codec":"srt",
"language":"Dansk",
"languageCode":"dan",
"format":"srt",
"displayTitle":"Dansk (SRT External)"
}
]
}
]
}
],
"Genre":[
{
"id":66,
"filter":"genre=66",
"tag":"Drama"
},
{
"id":13303,
"filter":"genre=13303",
"tag":"Sci-Fi"
},
{
"id":152,
"filter":"genre=152",
"tag":"Thriller"
}
],
"Director":[
{
"id":105448,
"filter":"director=105448",
"tag":"Paul Currie"
}
],
"Writer":[
{
"id":27748,
"filter":"writer=27748",
"tag":"Nathan Parker"
},
{
"id":105449,
"filter":"writer=105449",
"tag":"Todd Stein"
}
],
"Producer":[
{
"id":105466,
"filter":"producer=105466",
"tag":"Steve Hutensky"
},
{
"id":42213,
"filter":"producer=42213",
"tag":"Paul Currie"
},
{
"id":105467,
"filter":"producer=105467",
"tag":"Jodi Matterson"
}
],
"Country":[
{
"id":16788,
"filter":"country=16788",
"tag":"Australia"
}
],
"Role":[
{
"id":2594,
"filter":"actor=2594",
"tag":"Michiel Huisman",
"role":"Dylan Branson",
"thumb":"http://image.tmdb.org/t/p/original/tDv9whdA3nG5Q0pgwzXPTHnu84z.jpg"
},
{
"id":42205,
"filter":"actor=42205",
"tag":"Teresa Palmer",
"role":"Sarah",
"thumb":"http://image.tmdb.org/t/p/original/rbGnqOmLieJctfjmdcWIVQTiwhT.jpg"
},
{
"id":22071,"filter":"actor=22071","tag":"Sam Reid","role":"Jonas",
"thumb":"http://image.tmdb.org/t/p/original/apMtm8JeZbyI6ZCdbqkAfUNr0SW.jpg"
},
{
"id":71110,"filter":"actor=71110","tag":"John Waters","role":"Bill","thumb":"http://image.tmdb.org/t/p/original/9OhnYEPX1COFLuzSjxdNk7HbzxW.jpg"},{"id":40552,"filter":"actor=40552","tag":"Richard Davies","role":"Inky","thumb":"http://image.tmdb.org/t/p/original/tviPclkgyNe1yDURc3xe5wkWijg.jpg"
},
{
"id":872,"filter":"actor=872","tag":"Maeve Dermody","role":"Sandy","thumb":"http://image.tmdb.org/t/p/original/7C6xwwXBPERnVAst9SlfcqlK8bL.jpg"},{"id":105450,"filter":"actor=105450","tag":"Kerry Armstrong","role":"Catherine","thumb":"http://image.tmdb.org/t/p/original/fGAUJ4fDhGFr3eIbFYZ5Tyxr9A.jpg"},{"id":80752,"filter":"actor=80752","tag":"Simone Kessell","role":"Serena","thumb":"http://image.tmdb.org/t/p/original/8jHLphmnbYPymIm9ta1RmefLzdW.jpg"
},
{
"id":3021,"filter":"actor=3021","tag":"Remy Hii","role":"Benny","thumb":"http://image.tmdb.org/t/p/original/l6K5S3Pnxtj9JBz7qPhiHEekGpg.jpg"},{"id":105451,"filter":"actor=105451","tag":"Jessica Clarke","role":"Evelyn","thumb":"http://image.tmdb.org/t/p/original/eEvUjiC9KdLKSBmvd9nUV1sJWBb.jpg"},{"id":105452,"filter":"actor=105452","tag":"Zara Michales","role":"Ellie","thumb":"http://image.tmdb.org/t/p/original/dTJopTPVQVv6Hvm839vWJAdMayS.jpg"},{"id":33976,"filter":"actor=33976","tag":"Mitchell Butel","role":"Howard Pace","thumb":"http://image.tmdb.org/t/p/original/eGPy25wuJB8DvtkCbQfBz8xlPxm.jpg"},{"id":43180,"filter":"actor=43180","tag":"Dean Kyrwood","role":"Jeff Eggby","thumb":"http://image.tmdb.org/t/p/original/lPomK4tjx8Z0I6ckpwNzV2EPcsi.jpg"},{"id":105453,"filter":"actor=105453","tag":"Nancy Denis","role":"Regina Jones","thumb":"http://image.tmdb.org/t/p/original/iF2fsMzNvjnmJqyPobfLONW5Gdm.jpg"},{"id":105454,"filter":"actor=105454","tag":"Gordon Waddell","role":"Ed Full","thumb":"http://image.tmdb.org/t/p/original/gkR1KSDAYvKwYoMkcsue976dMf3.jpg"},{"id":105455,"filter":"actor=105455","tag":"Duncan Ragg","role":"Jake Redman","thumb":"http://image.tmdb.org/t/p/original/35WZW5r4iKaQWzRPQDV0x7GVgb7.jpg"},{"id":105456,"filter":"actor=105456","tag":"Carma Sharon","role":"Restaurant Patron","thumb":"http://image.tmdb.org/t/p/original/6S0lGG6Be0uhL4ScclEvoynZ5h4.jpg"
},
{
"id":105457,"filter":"actor=105457","tag":"Angie Tricker","role":"Commuter","thumb":"http://image.tmdb.org/t/p/original/stjJX7IbdnhWWNwmeYd4krsfBQl.jpg"},{"id":40793,"filter":"actor=40793","tag":"Marisa Lamonica","role":"Commuter","thumb":"http://image.tmdb.org/t/p/original/5PeKqYAlzsapwpGrXg0MhsBoq8s.jpg"},{"id":105458,"filter":"actor=105458","tag":"Katie McConnell","role":"School Teacher","thumb":"http://image.tmdb.org/t/p/original/qZqhpGNxOUw1siRWIRknU4CD0Qs.jpg"},{"id":105459,"filter":"actor=105459","tag":"Ezekiel Simat","role":"Attractive Socialite","thumb":"http://image.tmdb.org/t/p/original/adVTa4X5Fa8zjLL5xMCVywgrUhD.jpg"},{"id":40786,"filter":"actor=40786","tag":"Jean-Pierre Yerma","role":"Businessman","thumb":"http://image.tmdb.org/t/p/original/vf5elElGX25CrYkIxEsxLlCoucA.jpg"},{"id":105460,"filter":"actor=105460","tag":"Marek Radin","role":"Bike Messenger","thumb":"http://image.tmdb.org/t/p/original/pgmmAj1byaXbpnmZ1PokWXKJa2h.jpg"
},
{
"id":105461,
"filter":"actor=105461",
"tag":"Jack Ellis",
"role":"Noah Marks",
"thumb":"http://image.tmdb.org/t/p/original/siw9skaS2fSWZ63i21jUpMelZ8h.jpg"
},
{
"id":40795,"filter":"actor=40795","tag":"Michael-Anthony Taylor","role":"Ticket Attendant - Grand Central Station","thumb":"http://image.tmdb.org/t/p/original/7GyGFHEqViuB2QiueXhpHjIm13s.jpg"},{"id":105462,"filter":"actor=105462","tag":"Morrison James","role":"Ticket Booth Attendant - Grand Central Station","thumb":"http://image.tmdb.org/t/p/original/braNh7qDYl3CWX415BRRWXy58Xd.jpg"},{"id":105463,"filter":"actor=105463","tag":"Amanda Azarian","role":"Neighbor","thumb":"http://image.tmdb.org/t/p/original/9Moc42Btv8K6Q7dVFnycvHo05A4.jpg"},{"id":26647,"filter":"actor=26647","tag":"Erica Long","role":"New York Businesswoman","thumb":"http://image.tmdb.org/t/p/original/xjuZkP5wv7zGIe7jzA5BfUN5KqV.jpg"},{"id":105464,"filter":"actor=105464","tag":"Shameer Birges","role":"Cab driver","thumb":"http://image.tmdb.org/t/p/original/hFG2wgOn8hkhJ7cUeFHlIDYBcbS.jpg"
},
{
"id":105465,"filter":"actor=105465","tag":"Madison McKoy","role":"Crash Site Man","thumb":"http://image.tmdb.org/t/p/original/wNGNZuC62eEmJOyfbIYRyIWimNq.jpg"
},
{
"id":40857,"filter":"actor=40857",
"tag":"Nora Sommerkamp",
"role":"Casual Woman / Hip Gallery Visitor",
"thumb":"http://image.tmdb.org/t/p/original/A1W0zcZs3m7wxXosKW7YUNe1RnM.jpg"
}
],
"Similar":[
{
"id":20654,
"filter":"similar=20654",
"tag":"Overdrive"
},
{
"id":26333,"filter":"similar=26333","tag":"Flatliners"},{"id":16874,"filter":"similar=16874","tag":"Before I Fall"},{"id":32222,"filter":"similar=32222","tag":"The Circle"},{"id":56162,"filter":"similar=56162","tag":"USS Indianapolis: Men of Courage"},{"id":18537,"filter":"similar=18537","tag":"Unlocked"
},
{
"id":54904,"filter":"similar=54904","tag":"Collide"},{"id":27739,"filter":"similar=27739","tag":"A Family Man"},{"id":27308,"filter":"similar=27308","tag":"Shot Caller"},{"id":37534,"filter":"similar=37534","tag":"The Snowman"},{"id":17826,"filter":"similar=17826","tag":"The Ottoman Lieutenant"},{"id":19086,"filter":"similar=19086","tag":"Security"},{"id":19733,"filter":"similar=19733","tag":"The Dark Tower"},{"id":16889,"filter":"similar=16889","tag":"The Space Between Us"},{"id":20651,"filter":"similar=20651","tag":"Geostorm"},{"id":57977,"filter":"similar=57977","tag":"Incarnate"},{"id":19088,"filter":"similar=19088","tag":"The Hunter's Prayer"},{"id":100761,"filter":"similar=100761","tag":"Shut In"
},
{
"id":19080,"filter":"similar=19080","tag":"First Kill"},{"id":20648,"filter":"similar=20648","tag":"24 Hours to Live"
}
],
"Extras":{
"size":1,
"Metadata":[
{
"ratingKey":"34766",
"key":"/library/metadata/34766",
"guid":"iva://api.internetvideoarchive.com/2.0/DataService/VideoAssets(528888)?lang=en&bitrates=80,212,450,750,1500,2500,5000,8000&duration=141&adaptive=1&dts=0",
"type":"clip",
"title":"2:22 (Clean Trailer)",
"summary":"",
"index":1,
"year":2017,
"thumb":"/library/metadata/34766/thumb/1583190431",
"subtype":"trailer",
"duration":141000,
"originallyAvailableAt":"2017-11-29",
"addedAt":1583190431,
"extraType":"1",
"Media":[
{
"id":59929,
"duration":141000,
"bitrate":2500,
"width":1920,
"height":1080,
"aspectRatio":1.78,
"audioCodec":"aac",
"videoCodec":"h264",
"videoResolution":"1080",
"container":"mp4",
"premium":true,
"Part":[
{
"id":63449,
"duration":141000,
"container":"mp4",
"key":"/services/iva/assets/528888/video.mp4?bitrate=2500",
"optimizedForStreaming":true,
"Stream":[
{
"id":158473,
"streamType":1,
"codec":"h264",
"index":0,
"bitrate":2500,
"height":1080,
"width":1920,
"displayTitle":"1080p (H.264)"
},
{
"id":158474,"streamType":2,
"selected":true,
"codec":"aac",
"index":1,
"channels":2,
"language":"English",
"languageCode":"eng",
"displayTitle":"English (AAC Stereo)"
}
]
}
]
},
{
"id":59930,"duration":141000,"bitrate":1500,
"width":1280,"height":720,"aspectRatio":1.78,
"audioCodec":"aac","videoCodec":"h264",
"videoResolution":"720","container":"mp4",
"premium":true,
"Part":[
{
"id":63450,
"duration":141000,
"container":"mp4",
"key":"/services/iva/assets/528888/video.mp4?bitrate=1500",
"optimizedForStreaming":true,
"Stream":[
{
"id":158475,"streamType":1,"codec":"h264","index":0,
"bitrate":1500,"height":720,"width":1280,
"displayTitle":"720p (H.264)"
},
{
"id":158476,"streamType":2,"selected":true,"codec":"aac",
"index":1,"channels":2,"language":"English",
"languageCode":"eng",
"displayTitle":"English (AAC Stereo)"
}
]
}
]
},
{
"id":59931,"duration":141000,"bitrate":450,"width":640,"height":480,"aspectRatio":1.33,"audioCodec":"aac","videoCodec":"h264",
"videoResolution":"480","container":"mp4","premium":true,"Part":[{"id":63451,"duration":141000,"container":"mp4","key":"/services/iva/assets/528888/video.mp4?bitrate=450","optimizedForStreaming":true,"Stream":[{"id":158477,"streamType":1,"codec":"h264","index":0,"bitrate":450,"height":480,"width":640,"displayTitle":"480p (H.264)"},{"id":158478,"streamType":2,"selected":true,"codec":"aac","index":1,"channels":2,"language":"English","languageCode":"eng","displayTitle":"English (AAC Stereo)"}]}]}]}]}}

File diff suppressed because one or more lines are too long

View file

@ -1,54 +0,0 @@
[
{
"accessible": true,
"exists": true,
"id": 29652,
"key": "/library/parts/29652/1567110629/file.mkv",
"duration": 6555328,
"file": "/share/CACHEDEV1_DATA/video/old-movies/#/2 Fast 2 Furious (2003)/2 Fast 2 Furious.2003.1080p.[mkvonly].mkv",
"size": 5056165150,
"audioProfile": "dts",
"container": "mkv",
"deepAnalysisVersion": "4",
"indexes": "sd",
"requiredBandwidths": "12566,11762,9535,7249,6673,6673,6673,6673",
"videoProfile": "high",
"Stream": [
]
},
{
"id": 42871,
"key": "/library/parts/42871/1423608842/file.mkv",
"duration": 6410985,
"file": "/share/CACHEDEV1_DATA/video/old-movies/f/The Fast and the Furious (2001)/The.Fast.and.the.Furious.2001.1080p.[mkvonly].mkv",
"size": 5477082722,
"audioProfile": "dts",
"container": "mkv",
"deepAnalysisVersion": "4",
"requiredBandwidths": "13924,11021,9123,7933,7431,7160,7160,7160",
"videoProfile": "high"
},
{
"id": 34583,
"key": "/library/parts/34583/1423467436/file.mkv",
"duration": 6405396,
"file": "/share/CACHEDEV1_DATA/video/old-movies/f/Fast and Furious (2009)/Fast.and.Furious.2009.[mkvonly].mkv",
"size": 5467565449,
"audioProfile": "dts",
"container": "mkv",
"deepAnalysisVersion": "4",
"requiredBandwidths": "17671,13493,9945,8390,8372,8372,8372,8372",
"videoProfile": "high"
},
{
"id": 29051,
"key": "/library/parts/29051/1423608403/file.mkv",
"duration": 6206272,
"file": "/share/CACHEDEV1_DATA/video/old-movies/a/Annapolis (2006)/annapolis.720p-x264.mkv",
"size": 4695969110,
"container": "mkv",
"deepAnalysisVersion": "4",
"requiredBandwidths": "13531,11830,8166,6975,6588,6484,6484,6484",
"videoProfile": "high"
}
]

File diff suppressed because it is too large Load diff

View file

@ -1,205 +0,0 @@
{
"MediaContainer": {
"size": 30,
"totalSize": 2570,
"allowSync": true,
"art": "/:/resources/movie-fanart.jpg",
"identifier": "com.plexapp.plugins.library",
"librarySectionID": 4,
"librarySectionTitle": "Movies",
"librarySectionUUID": "611d44e2-c4cc-4cec-8b65-d77b037e1b3d",
"mediaTagPrefix": "/system/bundle/media/flags/",
"mediaTagVersion": 1576869286,
"offset": 31,
"thumb": "/:/resources/movie.png",
"title1": "Movies",
"title2": "All Movies",
"viewGroup": "movie",
"viewMode": 65592,
"Metadata": [
{
"ratingKey": "9042",
"key": "/library/metadata/9042",
"guid": "com.plexapp.agents.imdb://tt4385888?lang=en",
"studio": "Annapurna Pictures",
"type": "movie",
"title": "20th Century Women",
"contentRating": "dk/fr.u.7",
"summary": "In 1979 Santa Barbara, California, Dorothea Fields is a determined single mother in her mid-50s who is raising her adolescent son, Jamie, at a moment brimming with cultural change and rebellion. Dorothea enlists the help of two younger women Abbie, a free-spirited punk artist living as a boarder in the Fields' home and Julie, a savvy and provocative teenage neighbour to help with Jamie's upbringing.",
"rating": 8.9,
"audienceRating": 7.3,
"year": 2016,
"thumb": "/library/metadata/9042/thumb/1575678525",
"art": "/library/metadata/9042/art/1575678525",
"duration": 7124159,
"originallyAvailableAt": "2016-12-28",
"addedAt": 1490792202,
"updatedAt": 1575678525,
"audienceRatingImage": "rottentomatoes://image.rating.upright",
"chapterSource": "media",
"primaryExtraKey": "/library/metadata/9421",
"ratingImage": "rottentomatoes://image.rating.ripe",
"Media": [
{
"id": 9325,
"duration": 7124159,
"bitrate": 10980,
"width": 1920,
"height": 960,
"aspectRatio": 1.85,
"audioChannels": 6,
"audioCodec": "ac3",
"videoCodec": "h264",
"videoResolution": "1080",
"container": "mkv",
"videoFrameRate": "24p",
"audioProfile": "dts",
"videoProfile": "high",
"Part": [
{
"id": 29623,
"key": "/library/parts/29623/1567348678/file.mkv",
"duration": 7124159,
"file": "/share/CACHEDEV1_DATA/video/old-movies/#/20th Century Women (2016)/20th.Century.Women.2016.1080p.BluRay.x264-GECKOS.mkv",
"size": 9777930144,
"audioProfile": "dts",
"container": "mkv",
"videoProfile": "high"
}
]
}
],
"Genre": [
{
"tag": "Comedy"
},
{
"tag": "Drama"
}
],
"Director": [
{
"tag": "Mike Mills"
}
],
"Writer": [
{
"tag": "Mike Mills"
}
],
"Country": [
{
"tag": "USA"
}
],
"Role": [
{
"tag": "Alia Shawkat"
},
{
"tag": "Alison Elliott"
},
{
"tag": "Annette Bening"
}
]
},
{
"ratingKey": "9050",
"key": "/library/metadata/9050",
"guid": "com.plexapp.agents.imdb://tt0463854?lang=en",
"studio": "DNA Films",
"type": "movie",
"title": "28 Weeks Later",
"contentRating": "dk/15",
"summary": "The inhabitants of the British Isles have lost their battle against the onslaught of disease, as the deadly rage virus has killed every citizen there. Six months later, a group of Americans dare to set foot on the isles, convinced the danger has come and gone. But it soon becomes all too clear that the scourge continues to live, waiting to pounce on its next victims.",
"rating": 7.1,
"audienceRating": 6.7,
"year": 2007,
"tagline": "When days turn to weeks... the horror returns.",
"thumb": "/library/metadata/9050/thumb/1575678555",
"art": "/library/metadata/9050/art/1575678555",
"duration": 5757240,
"originallyAvailableAt": "2007-04-26",
"addedAt": 1186162396,
"updatedAt": 1575678555,
"lastViewedAt": 1575678555,
"audienceRatingImage": "rottentomatoes://image.rating.upright",
"chapterSource": "agent",
"primaryExtraKey": "/library/metadata/9454",
"ratingImage": "rottentomatoes://image.rating.ripe",
"Media": [
{
"id": 9333,
"duration": 5757240,
"bitrate": 1022,
"width": 592,
"height": 320,
"aspectRatio": 1.85,
"audioChannels": 2,
"audioCodec": "mp3",
"videoCodec": "mpeg4",
"videoResolution": "sd",
"container": "avi",
"videoFrameRate": "PAL",
"videoProfile": "advanced simple",
"Part": [
{
"id": 29662,
"key": "/library/parts/29662/1186162396/file.avi",
"duration": 5757240,
"file": "/share/CACHEDEV1_DATA/video/old-movies/#/28 Weeks Later (2007)/28 Weeks Later.avi",
"size": 735303680,
"container": "avi",
"videoProfile": "advanced simple"
}
]
}
],
"Genre": [
{
"tag": "Drama"
},
{
"tag": "Horror"
}
],
"Director": [
{
"tag": "Juan Carlos Fresnadillo"
}
],
"Writer": [
{
"tag": "Enrique López Lavigne"
},
{
"tag": "Jesús Olmo"
}
],
"Country": [
{
"tag": "United Kingdom"
}
],
"Collection": [
{
"tag": "28 Days/Weeks Later"
}
],
"Role": [
{
"tag": "Amanda Lawrence"
},
{
"tag": "Amanda Walker"
},
{
"tag": "Andrew Byron"
}
]
}
]
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,207 +0,0 @@
{
"MediaContainer": {
"size": 200,
"totalSize": 2570,
"allowSync": true,
"art": "/:/resources/movie-fanart.jpg",
"identifier": "com.plexapp.plugins.library",
"librarySectionID": 4,
"librarySectionTitle": "Movies",
"librarySectionUUID": "611d44e2-c4cc-4cec-8b65-d77b037e1b3d",
"mediaTagPrefix": "/system/bundle/media/flags/",
"mediaTagVersion": 1576869286,
"offset": 0,
"thumb": "/:/resources/movie.png",
"title1": "Movies",
"title2": "All Movies",
"viewGroup": "movie",
"viewMode": 65592,
"Metadata": [
{
"ratingKey": "9036",
"key": "/library/metadata/9036",
"guid": "com.plexapp.agents.imdb://tt0322259?lang=en",
"studio": "Mikona Productions GmbH & Co. KG",
"type": "movie",
"title": "2 Fast 2 Furious",
"contentRating": "dk/11",
"summary": "It's a major double-cross when former police officer Brian O'Conner teams up with his ex-con buddy Roman Pearce to transport a shipment of \"dirty\" money for shady Miami-based import-export dealer Carter Verone. But the guys are actually working with undercover agent Monica Fuentes to bring Verone down.",
"rating": 3.6,
"userRating": "2.5",
"audienceRating": 5.0,
"year": 2003,
"tagline": "How Fast Do You Want It?",
"thumb": "/library/metadata/9036/thumb/1575678418",
"art": "/library/metadata/9036/art/1575678418",
"duration": 6555328,
"originallyAvailableAt": "2003-06-05",
"addedAt": 1423435770,
"updatedAt": 1575678418,
"audienceRatingImage": "rottentomatoes://image.rating.spilled",
"chapterSource": "mixed",
"primaryExtraKey": "/library/metadata/9397",
"ratingImage": "rottentomatoes://image.rating.rotten",
"Media": [
{
"id": 9319,
"duration": 6555328,
"bitrate": 6170,
"width": 1280,
"height": 536,
"aspectRatio": 2.35,
"audioChannels": 6,
"audioCodec": "ac3",
"videoCodec": "h264",
"videoResolution": "720",
"container": "mkv",
"videoFrameRate": "24p",
"audioProfile": "dts",
"videoProfile": "high",
"Part": [
{
"id": 29652,
"key": "/library/parts/29652/1567110629/file.mkv",
"duration": 6555328,
"file": "/share/CACHEDEV1_DATA/video/old-movies/#/2 Fast 2 Furious (2003)/2 Fast 2 Furious.2003.1080p.[mkvonly].mkv",
"size": 5056165150,
"audioProfile": "dts",
"container": "mkv",
"videoProfile": "high"
}
]
}
],
"Genre": [
{
"tag": "Action"
},
{
"tag": "Crime"
}
],
"Director": [
{
"tag": "John Singleton"
}
],
"Writer": [
{
"tag": "Derek Haas"
},
{
"tag": "Michael Brandt"
}
],
"Country": [
{
"tag": "USA"
}
],
"Collection": [
{
"tag": "The Fast and the Furious"
}
],
"Role": [
{
"tag": "Amaury Nolasco"
},
{
"tag": "Bettina Huffer"
},
{
"tag": "Cobette Harper"
}
]
},
{
"ratingKey": "34765",
"key": "/library/metadata/34765",
"guid": "com.plexapp.agents.imdb://tt1131724?lang=en",
"studio": "Screen Australia",
"type": "movie",
"title": "2:22",
"contentRating": "PG-13",
"summary": "A man's life is derailed when an ominous pattern of events repeats itself in exactly the same manner every day, ending at precisely 2:22 p.m.",
"rating": 5.8,
"year": 2017,
"thumb": "/library/metadata/34765/thumb/1583190431",
"art": "/library/metadata/34765/art/1583190431",
"duration": 5933984,
"originallyAvailableAt": "2017-06-29",
"addedAt": 1583190383,
"updatedAt": 1583190431,
"chapterSource": "media",
"primaryExtraKey": "/library/metadata/34766",
"ratingImage": "imdb://image.rating",
"Media": [
{
"id": 59928,
"duration": 5933984,
"bitrate": 4934,
"width": 1920,
"height": 796,
"aspectRatio": 2.35,
"audioChannels": 6,
"audioCodec": "ac3",
"videoCodec": "h264",
"videoResolution": "1080",
"container": "mkv",
"videoFrameRate": "24p",
"videoProfile": "high",
"Part": [
{
"id": 63448,
"key": "/library/parts/63448/1583190312/file.mkv",
"duration": 5933984,
"file": "/share/CACHEDEV1_DATA/video/old-movies/#/2-22 (2017)/2-22 (2017).mkv",
"size": 3659878640,
"container": "mkv",
"hasThumbnail": "1",
"videoProfile": "high"
}
]
}
],
"Genre": [
{
"tag": "Drama"
},
{
"tag": "Sci-Fi"
}
],
"Director": [
{
"tag": "Paul Currie"
}
],
"Writer": [
{
"tag": "Nathan Parker"
},
{
"tag": "Todd Stein"
}
],
"Country": [
{
"tag": "Australia"
}
],
"Role": [
{
"tag": "Michiel Huisman"
},
{
"tag": "Teresa Palmer"
},
{
"tag": "Sam Reid"
}
]
}
]
}
}

View file

@ -12,13 +12,13 @@
</b-input-group-append>
</b-input-group>
</div>
<b-input-group id="ArraySep" :prepend="$t('Modules.ET.Settings.ArraySep')" class="mt-3">
<b-input-group id="ArraySepGrp" :prepend="$t('Modules.ET.Settings.ArraySep')" class="mt-3">
<b-form-input id="ArraySep" name="ArraySep" type="text" class="form-control" v-model="ArraySep" :disabled=false :maxlength=1 @change="setArraySep()"></b-form-input>
</b-input-group>
<b-input-group id="ColumnSep" :prepend="$t('Modules.ET.Settings.ColumnSep')" class="mt-3">
<b-form-input id="ColumnSep" name="ColumnSep" type="text" class="form-control" v-model="ColumnSep" :disabled=false :maxlength=1 @change="setColumnSep()"></b-form-input>
<b-input-group id="ColumnSepGrp" :prepend="$t('Modules.ET.Settings.ColumnSep')" class="mt-3">
<b-form-input id="ColumnSep" name="ColumnSep" type="text" class="form-control" v-model="ColumnSep" :disabled=false :maxlength=1 @change="setColumnSep"></b-form-input>
</b-input-group>
<b-input-group id="TimeOut" :prepend="$t('Modules.ET.Settings.TimeOut')" class="mt-3">
<b-input-group id="TimeOutGrp" :prepend="$t('Modules.ET.Settings.TimeOut')" class="mt-3">
<b-form-input id="TimeOut" name="TimeOut" type="text" class="form-control" v-model="TimeOut" :disabled=false :maxlength=2 @change="setTimeOut()"></b-form-input>
</b-input-group>
<b-form-group id="b-form-group">
@ -40,16 +40,27 @@
import i18n from '../../../../i18n'
export default {
created() {
this.getcbDefaults()
this.getcbDefaults();
if (wtconfig.get('ET.ColumnSep') == '\t')
{
this.ColumnSep = '{TAB}';
}
else
{
this.ColumnSep = wtconfig.get('ET.ColumnSep');
}
},
data() {
return {
outDirVal: wtconfig.get('ET.OutPath', i18n.t('Modules.ET.Settings.SelectOutDir')),
ArraySep: wtconfig.get('ET.ArraySep'),
ColumnSep: wtconfig.get('ET.ColumnSep'),
// ColumnSep: wtconfig.get('ET.ColumnSep'),
ColumnSep: '',
//ColumnSep1: this.computedColumnSep,
TimeOut: wtconfig.get('PMS.TimeOut'),
cbSelected: [],
cbOptions: [
{ text: i18n.t('Modules.ET.Settings.ExportToExcel'), value: 'ExpExcel' },
{ text: i18n.t('Modules.ET.Settings.OrgTitleNull'), value: 'OrgTitleNull' },
{ text: i18n.t('Modules.ET.Settings.SortTitleNull'), value: 'SortTitleNull' },
{ text: i18n.t('Modules.ET.Settings.AutoXLSCol'), value: 'AutoXLSCol' },
@ -57,9 +68,42 @@
]
};
},
computed: {
ColumnSep22: {
// getter
get: function () {
if ( wtconfig.get('ET.ColumnSep') != '\t' ){
console.log('Ged normal retur')
return wtconfig.get('ET.ColumnSep')
}
else
{
console.log('Ged tab retur')
return '{TAB}'
}
},
// setter
set: function (newValue) {
wtconfig.set('ET.ColumnSep', newValue)
}
},
computedColumnSep123: function(){
if ( wtconfig.get('ET.ColumnSep') != '\t' ){
console.log('Ged normal retur')
return wtconfig.get('ET.ColumnSep')
}
else
{
console.log('Ged tab retur')
return '{TAB}'
}
}
},
methods: {
getcbDefaults(){
const cbItems = ["OrgTitleNull", "SortTitleNull", "AutoXLSCol", "AutoXLSRow"];
const cbItems = ["ExpExcel", "OrgTitleNull", "SortTitleNull", "AutoXLSCol", "AutoXLSRow"];
for(let i = 0; i < cbItems.length; i++){
if (wtconfig.get("ET." + cbItems[i], false)){
this.cbSelected.push(cbItems[i])
@ -68,7 +112,7 @@
},
filterTable(){
this.$nextTick(()=>{console.log(this.cbSelected);})
for( var cbItem of ["OrgTitleNull", "SortTitleNull", "AutoXLSCol", "AutoXLSRow"]){
for( var cbItem of ["ExpExcel","OrgTitleNull", "SortTitleNull", "AutoXLSCol", "AutoXLSRow"]){
wtconfig.set("ET." + cbItem, (this.cbSelected.includes(cbItem)))
}
},
@ -83,23 +127,36 @@
log.debug(`Selected Directory is ${outDir}`);
}
},
setColumnSep: function(){
if (this.ColumnSep == '9')
setColumnSep(val){
if (val.length > 1)
{
wtconfig.set('ET.ColumnSep', '\t')
this.$bvToast.toast(this.$t("Modules.ET.ErrorBadSep"), {
title: this.$t("Modules.ET.ErrorBadSepTitle"),
autoHideDelay: 3000,
solid: true,
variant: 'primary',
toaster: 'b-toaster-bottom-center'
});
}
else
{
wtconfig.set('ET.ColumnSep', this.ColumnSep)
{
if (val == '9')
{
wtconfig.set('ET.ColumnSep', '\t')
this.ColumnSep = '{TAB}'
}
else
{
wtconfig.set('ET.ColumnSep', this.ColumnSep)
}
}
},
},
setArraySep: function(){
wtconfig.set('ET.ArraySep', this.ArraySep)
},
setTimeOut: function(){
wtconfig.set('PMS.TimeOut', this.TimeOut)
}
}
};

View file

@ -6,9 +6,7 @@
"Level 3": "level3",
"Level 4": "level4",
"Level 5": "level5",
"Level 6": "level6",
"Tommy": "tommy"
"Level 6": "level6"
},
"LevelCount": {
"Level 1": 1,
@ -16,24 +14,9 @@
"Level 3": 2,
"Level 4": 2,
"Level 5": 2,
"Level 6": 2,
"Tommy": 2
"Level 6": 2
},
"level": {
"tommy": [
"Title",
"Part Duration"
],
"Inspect": [
"Part Duration"
],
"level": {
"level1": [
"Media ID", "Title", "Sort title",
"Studio", "Content Rating", "Year",
@ -1147,11 +1130,270 @@
}
}
},
"episode": {
"levels": {
"Level 1": "level1",
"Level 2": "level2",
"Tommy": "tommy"
},
"LevelCount": {
"Level 1": 1,
"Level 2": 1,
"Level 3": 1,
"Level 4": 2,
"Level 5": 2,
"Level 6": 2,
"Tommy": 1
},
"level": {
"tommy": [
"Media ID"
],
"verified": [
"Series Title",
"Episode Sort Title",
"Episode Title",
"Year",
"Season",
"Episode",
"Content Rating",
"Summary",
"Rating",
"User Rating"
],
"Clear Fields": [
"Writers",
"Duration",
"Added",
"Updated",
"Poster url",
"Collection",
"Locked Fields",
"View Count"
],
"Invalid, belongs to shows": [
"Studio",
"Originally Aired",
"Directors"
],
"level1": [
"Media ID",
"Series Title",
"Episode Sort Title",
"Episode Title",
"Year",
"Season",
"Episode",
"Content Rating",
"Summary",
"Rating",
"User Rating"
],
"level2": [
"Writers",
"Duration",
"Added",
"Updated",
"Poster url",
"Collection",
"Locked Fields",
"View Count"
]
},
"fields": {
"Media ID":
{
"key": "$.ratingKey",
"call": 1,
"type": "string"
},
"Series Title":
{
"key": "$.grandparentTitle",
"call": 1,
"type": "string"
},
"Episode Sort Title":
{
"key": "$.titleSort",
"call": 1,
"type": "string"
},
"Episode Title":
{
"key": "$.title",
"call": 1,
"type": "string"
},
"Year":
{
"key": "$.year",
"call": 1,
"type": "string"
},
"Season":
{
"key": "$.parentIndex",
"call": 1,
"type": "string"
},
"Episode":
{
"key": "$.index",
"call": 1,
"type": "string"
},
"Content Rating":
{
"key": "$.contentRating",
"call": 1,
"type": "string"
},
"Summary":
{
"key": "$.summary",
"call": 1,
"type": "string"
},
"Rating":
{
"key": "$.rating",
"call": 1,
"type": "string"
},
"User Rating":
{
"key": "$.userRating",
"call": 1,
"type": "string"
},
"Studio":
{
"key": "$.studio",
"call": 1,
"type": "string"
},
"Originally Aired":
{},
"Directors":
{},
"Writers":
{},
"Duration":
{},
"Added":
{},
"Updated":
{},
"Poster url":
{},
"Collection":
{},
"Locked Fields":
{},
"View Count":
{}
}
},
"show": {
"levels": {
"No Level Yet": "level1"
"Level 1": "level1",
"Tommy": "tommy"
},
"LevelCount": {
"Level 1": 1,
"Level 2": 1,
"Level 3": 1,
"Level 4": 2,
"Level 5": 2,
"Level 6": 2,
"Tommy": 1
},
"level": {
"tommy": [
"Title",
"Part Duration"
]
},
"fields": {
"Media ID":
{
"key": "$.ratingKey",
"call": 1,
"type": "string"
},
"Series Title":
{
"key": "$.grandparentTitle",
"call": 1,
"type": "string"
},
"Episode Sort Title":
{
"key": "$.titleSort",
"call": 1,
"type": "string"
},
"Episode Title":
{
"key": "$.title",
"call": 1,
"type": "string"
},
"Year":
{
"key": "$.year",
"call": 1,
"type": "string"
},
"Season":
{
"key": "$.parentIndex",
"call": 1,
"type": "string"
},
"Episode":
{
"key": "$.index",
"call": 1,
"type": "string"
},
"Content Rating":
{
"key": "$.contentRating",
"call": 1,
"type": "string"
},
"Summary":
{
"key": "$.summary",
"call": 1,
"type": "string"
},
"Rating":
{
"key": "$.rating",
"call": 1,
"type": "string"
},
"User Rating":
{
"key": "$.userRating",
"call": 1,
"type": "string"
}
}
},
"artist": {
"levels": {

View file

@ -25,7 +25,7 @@ const et = new class ET {
async getSectionData({sectionName, baseURL, accessToken, libType})
{
const sectionData = []
log.info(`Starting getSectionData with Name: ${sectionName}`)
log.info(`Starting getSectionData with Name: ${sectionName} and with a type of: ${libType}`)
// Get Section Key
const libKey = await et.getSectionKey({libName: sectionName, baseURL: baseURL, accessToken: accessToken})
log.debug(`Get SectionKey as: ${libKey}`)
@ -42,7 +42,14 @@ const et = new class ET {
const element = '/library/sections/' + libKey
let size
do {
postURI = `/all?X-Plex-Container-Start=${idx}&X-Plex-Container-Size=${step}`;
postURI = `/all?X-Plex-Container-Start=${idx}&X-Plex-Container-Size=${step}`;
if (libType == 'episode')
{
console.log('Ged Episodes needed, so adding the type')
console.log('Ged url called: ' + baseURL + element + postURI)
postURI += '&type=4'
}
console.log('GED postURI: ' + postURI)
chuncks = await et.getItemData({baseURL: baseURL, accessToken: accessToken, element: element, postURI: postURI});
size = JSONPath({path: '$.MediaContainer.size', json: chuncks});
log.verbose(`getSectionData chunck size is ${size} and idx is ${idx}`)
@ -89,7 +96,8 @@ const et = new class ET {
}
getRealLevelName(level, libType) {
// First get the real name of the level, and not just the display name
// First get the real name of the level, and not just the display name
console.log('GED getRealLevelName LibType: ' + libType)
const levelName = def[libType]['levels'][level]
return levelName
}
@ -116,12 +124,12 @@ const et = new class ET {
subItem['type'] = JSONPath({path: '$..type', json: section})[0];
result.push(subItem)
}
await Promise.resolve(result)
await Promise.resolve(result)
return result
}
getLevelDisplayName(level, libType){
// return displayname fort with buildin levels
// return displayname for the buildin levels
const levels = et.getLevels(libType)
let result = '';
loop1:
@ -163,7 +171,8 @@ const et = new class ET {
getLevelFields(level, libType) {
// return fields in a level
const out = []
const out = []
console.log('GED getLevelFields LibType: ' + libType)
const levels = def[libType]['level'][et.getRealLevelName(level, libType)]
Object.keys(levels).forEach(function(key) {
out.push(levels[key])
@ -180,7 +189,8 @@ const et = new class ET {
getLevels(libType) {
// Returns an json of levels for a selected type og medias, like 'movie'
const levels = def[libType]['levels']
const levels = def[libType]['levels']
console.log('GED getLevels LibType: ' + libType)
log.debug('ET LevelNames: ' + JSON.stringify(levels))
return levels
}
@ -196,6 +206,7 @@ const et = new class ET {
getLevelKeys(libType){
// Only return the keys for possible levels
const out = []
console.log('GED getLevelKeys LibType: ' + libType)
const levels = def[libType]['levels']
Object.keys(levels).forEach(function(key) {
out.push(key)
@ -389,7 +400,7 @@ const excel2 = new class Excel {
const fields = et.getLevelFields(Level, libType)
for (var i=0; i<fields.length; i++) {
log.verbose('Column: ' + fields[i] + ' - ' + fields[i])
let column = { header: fields[i], key: fields[i] }
let column = { header: fields[i], key: fields[i], width: 5 }
columns.push(column)
}
Sheet.columns = columns
@ -399,6 +410,11 @@ const excel2 = new class Excel {
pattern:'solid',
fgColor:{ argb:'729fcf' }
}
// Set header font to bold
Sheet.getRow(1).font = {bold: true}
/* Sheet.autoFilter = {
from: 'A1',
@ -478,7 +494,8 @@ const excel2 = new class Excel {
}
async addRowToTmp( { libType, level, data, stream }) {
// log.debug(`Start addRowToTmp. libType: ${libType} - level: ${level}`)
log.debug(`Start addRowToTmp. libType: ${libType} - level: ${level}`)
console.log('Ged data: ' + JSON.stringify(data))
let date, year, month, day, hours, minutes, seconds
const fields = et.getFields( libType, level)
let lookup, val, array, i, valArray, valArrayVal, subType, subKey
@ -486,7 +503,8 @@ const excel2 = new class Excel {
let result = ''
for (var x=0; x<fields.length; x++) {
var name = Object.keys(fields[x]);
lookup = JSONPath({path: '$..key', json: fields[x]})[0];
lookup = JSONPath({path: '$..key', json: fields[x]})[0];
console.log('Ged lookup: ' + lookup)
switch(String(JSONPath({path: '$..type', json: fields[x]}))) {
case "string":
val = JSONPath({path: String(lookup), json: data})[0];
@ -717,36 +735,84 @@ const excel2 = new class Excel {
row.forEach(element => {
excel2.AddRow(sheet, element)
});
}
}
async createOutFile( {libName, level, libType, outType, baseURL, accessToken} )
{
async sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
async createXLSXFile( {csvFile, level, libType, libName} )
{
// This will loop thru a csv file, and create xlsx file
// First create a WorkBook
// const workBook = await excel2.NewExcelWorkBook()
const workBook = await excel2.NewExcelWorkBook()
// Create Sheet
// let sheet = await excel2.NewSheet(workBook, libName, level)
let sheet = await excel2.NewSheet(workBook, libName, level)
// Add the header to the sheet
//const header = await excel2.AddHeader(sheet, level, libType)
await excel2.AddHeader(sheet, level, libType)
/*
autoFilter sadly doesn't work :(
sheet.autoFilter = {
from: 'A1',
to: 'E1',
exclude: [1, 2] // excludes columns B and C from showing the AutoFilter button
} */
// Read the csv file line by line
var lineReader = require('readline').createInterface({
input: require('fs').createReadStream(csvFile)
});
var lineno = 0;
lineReader.on('line', async function (line) {
// Skip first line
if (lineno != 0){
var lineArr = line.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);
await sheet.addRow(lineArr)
}
lineno++;
});
lineReader.on('close', async function () {
if (wtconfig.get('ET.AutoXLSCol', false))
{
log.info('Setting xlsx column width')
sheet.columns.forEach(function(column){
var dataMax = 0;
column.eachCell({ includeEmpty: true }, function(cell){
try {
var columnLength = cell.value.length;
if (columnLength > dataMax) {
dataMax = columnLength;
}
}
catch (error) {
// Failed, since either number or null, so simply ignoring
}
})
column.width = dataMax < 10 ? 10 : dataMax;
});
log.info('Setting xlsx column width ended')
}
await excel2.SaveWorkbook(workBook, libName, level, "xlsx")
});
}
async createOutFile( {libName, level, libType, baseURL, accessToken} )
{
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
const call = await et.getLevelCall(libType, level)
outType
//outType, call
const call = await et.getLevelCall(libType, level)
// Open a file stream
const tmpFile = await excel2.getFileName({ Library: libName, Level: level, Type: 'tmp' })
var fs = require('fs');
var stream = fs.createWriteStream(tmpFile, {flags:'a'});
stream.write( strHeader + "\n");
// Add the header
stream.write( strHeader + "\n");
// Get all the items in small chuncks
var sectionData = await et.getSectionData({sectionName: libName, baseURL: baseURL, accessToken: accessToken, libType: libType})
log.verbose(`Amount of chunks in sectionData are: ${sectionData.length}`)
@ -765,12 +831,11 @@ const excel2 = new class Excel {
{
// Get ratingKeys in the chunk
const urls = await JSONPath({path: '$..ratingKey', json: sectionChunk});
let urlStr = urls.join(',')
let urlStr = urls.join(',');
log.verbose(`Items to lookup are: ${urlStr}`)
store.commit("UPDATE_EXPORTSTATUS", i18n.t('Modules.ET.Status.Processing-Chunk-Detailed', {current: x, total: sectionData.length, urlStr: urlStr}))
//store.commit("UPDATE_EXPORTSTATUS", `Processing chunk ${x} of ${sectionData.length}.\nItems to export: \n${urlStr}`)
store.commit("UPDATE_EXPORTSTATUS", i18n.t('Modules.ET.Status.Processing-Chunk-Detailed', {current: x, total: sectionData.length, urlStr: urlStr}))
const urlWIthPath = '/library/metadata/' + urlStr
log.verbose(`Items retrieved`)
log.verbose(`Items retrieved`);
const contents = await et.getItemData({baseURL: baseURL, accessToken: accessToken, element: urlWIthPath});
const contentsItems = await JSONPath({path: '$.MediaContainer.Metadata[*]', json: contents});
for (item of contentsItems){
@ -780,18 +845,15 @@ const excel2 = new class Excel {
}
stream.end();
// Rename to real file name
var newFile = tmpFile.replace('.tmp', '.csv')
fs.rename(tmpFile, newFile, function (err) {
if (err) throw err;
console.log('renamed complete');
});
store.commit("UPDATE_EXPORTSTATUS", `Export finished. File:"${newFile}" created`)
// Save Excel file
// const result = await excel2.SaveWorkbook(workBook, libName, level, outType)
// return result
var newFile = tmpFile.replace('.tmp', '.csv')
fs.renameSync(tmpFile, newFile);
console.log('renamed complete');
// Need to export to xlsx as well?
if (wtconfig.get('ET.ExpExcel')){
log.info('We need to create an xlsx file as well')
await excel2.createXLSXFile( {csvFile: newFile, level: level, libType: libType, libName: libName})
}
store.commit("UPDATE_EXPORTSTATUS", `Export finished. File:"${newFile}" created`);
}
}

View file

@ -0,0 +1,50 @@
{
"ratingKey":"1653",
"key":"/library/metadata/1653",
"parentRatingKey":"1643",
"grandparentRatingKey":"1642",
"guid":"com.plexapp.agents.thetvdb://356202/1/10?lang=en",
"parentGuid":"com.plexapp.agents.thetvdb://356202/1?lang=en",
"grandparentGuid":"com.plexapp.agents.thetvdb://356202?lang=en",
"type":"episode","title":"A City Upon a Hill",
"titleSort":"City Upon a Hill",
"grandparentKey":"/library/metadata/1642",
"parentKey":"/library/metadata/1643",
"grandparentTitle":"For All Mankind",
"parentTitle":"Season 1",
"contentRating":"TV-MA",
"summary":"Ed handles a trespasser. Ellen and Deke chart a new course without Mission Control.",
"index":10,
"parentIndex":1,
"year":2019,
"thumb":"/library/metadata/1653/thumb/1577660763",
"art":"/library/metadata/1642/art/1577660764",
"parentThumb":"/library/metadata/1643/thumb/1577660764",
"grandparentThumb":"/library/metadata/1642/thumb/1577660764",
"grandparentArt":"/library/metadata/1642/art/1577660764",
"duration":4563104,
"originallyAvailableAt":"2019-12-20",
"addedAt":1577227543,
"updatedAt":1577660763,
"Media":[
{
"id":1506,"duration":4563104,"bitrate":4698,"width":1356,"height":678,
"aspectRatio":1.85,"audioChannels":6,"audioCodec":"eac3",
"videoCodec":"h264","videoResolution":"720","container":"mkv",
"videoFrameRate":"24p","videoProfile":"high",
"Part":[
{
"id":1516,"key":"/library/parts/1516/1577227543/file.mkv",
"duration":4563104,
"file":"/share/CACHEDEV1_DATA/video/shows/For All Mankind/Season 01/For.All.Mankind.S01E10.iNTERNAL.720p.WEB.H264-AMRAP.mkv",
"size":2679942218,"container":"mkv","indexes":"sd",
"videoProfile":"high"
}
]
}
],
"Writer":[
{"tag":"Ben Nedivi"},
{"tag":"Matt Wolpert"}
]
}

View file

@ -2,52 +2,74 @@ const log = require('electron-log');
import axios from 'axios'
import store from '../../../store';
const ptv = new class PTV {
constructor() {
}
checkServerConnect(server) {
log.info("NUGGA : ET : checkServerConnect called")
server.connections.forEach((val) => {
log.info(val.uri)
let baseurl = val.uri
axios.get(baseurl + '/identity', {
timeout: 5000
async checkServerConnect(server) {
log.info(`Checking address for server: ${server.name}`);
// Set WaitState
store.commit("UPDATE_PLEX_SELECTED_SERVER_STATUS", true);
let PMSAddress = '';
let local = false;
// Start with the local address check first
for (var i = 0; i < server.connections.length; i++) {
//server.connections.forEach((val) => {
let val = server.connections[i];
log.info(`Checking: ${val.uri}`);
let baseurl = val.uri;
await axios.get(baseurl + '/identity', {
headers: {
Accept: 'application/json'
},
timeout: 5000
})
.then(response => {
log.info(response)
if(response.status == 200){
log.info("NUGGA: PTV : checkServerConnect: response status is 200")
log.info("NUGGA : PLT : address for 200 server: " + baseurl)
store.commit("UPDATE_SELECTED_SERVER_ADDRESS", baseurl);
.then(response => {
if(response.status == 200){
log.info(`Address ${baseurl} is alive, so check if local`);
if ( val.local == true){
log.info(`It's a local server, so need to check if correct one`);
const machineIdentifier = response.data['MediaContainer']['machineIdentifier'];
if (machineIdentifier == server.clientIdentifier){
log.info(`Local server found as: ${baseurl}`);
PMSAddress = baseurl;
local = true;
}
}
else
{
// only if we didn't find the local one?
if ( local == false)
{
log.info(`No local server found yet, so checking ${baseurl}`)
const machineIdentifier = response.data['MediaContainer']['machineIdentifier'];
if (machineIdentifier == server.clientIdentifier){
log.info(`Remote server found as: ${baseurl}`);
PMSAddress = baseurl;
}
}
}
}
}).catch((error) => {
}).catch((error) => {
if (error.response) {
// The request was made and tgite server responded with a status code
// that falls out of the range of 2xx
log.warn(error.response.data)
log.warn(error.response.status)
alert(error.response.data.error)
//this.danger(error.response.status, error.response.data.error);
// The request was made and server responded with a status code
// that falls out of the range of 2xx
log.warn(error.response.status)
} else if (error.request) {
// The request was made but no response was received
// `error.request` is an instance of XMLHttpRequest in the browser and an instance of
// http.ClientRequest in node.js
log.warn(error.request);
// The request was made but no response was received
log.warn('No response recieved');
}
else {
else {
// Something happened in setting up the request that triggered an Error
log.warn('Error', error.message);
}
log.error(error);
}
}
)
}
)
let serverAdress = []
return serverAdress
}
log.info(`Returning valid address as: ${PMSAddress}`)
store.commit("UPDATE_SELECTED_SERVER_ADDRESS", PMSAddress);
store.commit("UPDATE_PLEX_SELECTED_SERVER_STATUS", false);
return PMSAddress
}
}
export {ptv};

View file

@ -1,4 +1,3 @@
import axios from 'axios';
import {excel2} from '../../components/modules/ExportTools/et'
import {et} from '../../components/modules/ExportTools/et'
const log = require('electron-log');
@ -40,27 +39,24 @@ const mutations = {
const actions = {
async fetchSections({ commit, getters }) {
log.info("fetchSections called")
var baseURL = getters.getSlectedServerAddress
var accessToken = getters.getSlectedServerToken
log.info("fetchSections called")
var baseURL = getters.getSelectedServerAddress
var accessToken = getters.getSelectedServerToken
commit('UPDATE_SECTIONS', await et.getSections(baseURL, accessToken))
},
exportMedias({ commit, getters }) {
// Vars OK
var baseURL = getters.getSlectedServerAddress
var accessToken = getters.getSlectedServerToken
},
exportMedias({ getters }) {
var baseURL = getters.getSelectedServerAddress
var accessToken = getters.getSelectedServerToken
var libType = getters.getLibType
var levelName = et.getLevelDisplayName(getters.getSelectedExportLevel, libType)
var key = getters.getSelectedSection
var mediaSize = ''
var calcSize = 0
var libName = et.getLibDisplayName(getters.getSelectedSection, getters.getPmsSections)
libName, levelName, libType, 'xlsx', baseURL, accessToken
excel2
axios, commit, key, mediaSize, calcSize
excel2.createOutFile( {libName: libName, level: levelName, libType: libType, outType: 'xlsx', baseURL: baseURL, accessToken: accessToken} );
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
} );
}
}

View file

@ -8,15 +8,18 @@ const state = {
plexServers: [],
selectedServer: 'none',
selectedServerAddress: '',
selectedServerAddressUpdateInProgress: false,
selectedServerToken: '',
authenticated: false,
authToken: '',
avatar: '',
plexname: '',
filteredProducts: []
plexname: ''
};
const mutations = {
UPDATE_PLEX_SELECTED_SERVER_STATUS(state, payload) {
state.selectedServerAddressUpdateInProgress = payload;
},
UPDATE_PLEX_SERVERS(state, payload) {
state.plexServers = payload;
},
@ -25,8 +28,7 @@ const mutations = {
state.selectedServerToken = value.accessToken
},
UPDATE_SELECTED_SERVER_ADDRESS(state, value) {
state.selectedServerAddress = value
log.info('UPDATE_SELECTED_SERVER_ADDRESS: ' + value)
state.selectedServerAddress = value
},
UPDATE_AUTHENTICATED(state, value){
state.authenticated = value
@ -71,7 +73,7 @@ const actions = {
pmsServer['accessToken'] = req.accessToken;
pmsServer['connections'] = req.connections;
pmsServer['clientIdentifier'] = req.clientIdentifier
log.warn('fetchPlexServers : ser ikke owned')
log.warn('fetchPlexServers : See not owned servers as well')
result.push(pmsServer);
}
} else {
@ -122,7 +124,7 @@ const actions = {
commit('UPDATE_AVATAR', response.data.user.thumb)
commit('UPDATE_PLEXNAME', response.data.user.username)
router.replace({name: "home"});
})
})
.catch(function (error) {
if (error.response) {
// The request was made and the server responded with a status code
@ -140,6 +142,9 @@ const actions = {
// Something happened in setting up the request that triggered an Error
log.error('loginToPlex: ' + error.message)
}})
},
updatingServerAddress({ commit}, status){
commit('UPDATE_PLEX_SELECTED_SERVER_STATUS', status)
}
};
@ -149,8 +154,9 @@ const getters = {
getAvatar: state => state.avatar,
getPlexName: state => state.plexname,
getSelectedServer: state => state.selectedServer,
getSlectedServerAddress: state => state.selectedServerAddress,
getSlectedServerToken: state => state.selectedServerToken
getSelectedServerAddress: state => state.selectedServerAddress,
getSelectedServerAddressUpdateInProgress: state => state.selectedServerAddressUpdateInProgress,
getSelectedServerToken: state => state.selectedServerToken
,
};

View file

@ -80,7 +80,9 @@ const actions = {
responseType: 'stream'
})
var json = JSON.stringify(dwnlresp.data);
fs.writeFileSync(path, json);
fs.writeFileSync(path, json);
// Update lang complete state, if updated
await this.dispatch("fetchPOELang");
}
}

View file

@ -74,11 +74,9 @@ const wtutils = new class WTUtils {
}
get LogMac() {
// does this work?
console.log('******* Need Help here ***********');
console.log('Mac Log dir detected as : ' + wtutils.Home + '/Library/Logs/' + wtutils.AppName);
console.log('********* Is that correct? ********** ');
return wtutils.Home + '/Library/Logs/' + wtutils.AppName;
const logDir = wtutils.Home.replace('Application Support', 'Logs');
log.info(`Log directory on Mac is detected as: ${logDir}`)
return logDir;
}
/*
@ -95,9 +93,15 @@ const wtutils = new class WTUtils {
{
localHome = __dirname.replace('node_modules\\electron\\dist\\resources\\electron.asar\\renderer', 'public/locales');
}
else if (wtutils.isMac)
{
console.log('Ged MAC dir: ' + __dirname)
localHome = __dirname.replace('node_modules/electron/dist/Electron.app/Contents/Resources/electron.asar/renderer', 'public/locales');
}
else
{
localHome = __dirname.replace('node_modules/electron/dist/resources/electron.asar/renderer', 'public/locales');
}
}
else

View file

@ -1,3 +1,5 @@
process.env.VUE_APP_VERSION = process.env.npm_package_version;
module.exports = {
pluginOptions: {
i18n: {
@ -7,16 +9,21 @@ module.exports = {
enableInSFC: false
},
electronBuilder: {
builderOptions: {
builderOptions: {
appId: "com.webtools.webtools-ng",
"extraResources": [
{
"from": "./public/locales",
"to": "locales"
}
],
"linux": {
"category": "Utility"
}
linux: {
category: "Utility",
icon: 'src/assets/WebTools-512.png'
},
win: {
icon: 'src/assets/WebTools-512.png'
}
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
wiki/Images/LevelSelect.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

BIN
wiki/Images/Translator.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
wiki/Images/WebTools-24.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
wiki/Images/WebTools-32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
wiki/Images/WebTools-48.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

BIN
wiki/Images/WebTools-72.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

1
wiki/Images/placeholder Normal file
View file

@ -0,0 +1 @@