This commit is contained in:
Abdulmhsen B. A. A
2022-05-19 23:23:15 +03:00
parent 4af8f95054
commit 1ee3a9b350
6 changed files with 92 additions and 71 deletions

View File

@@ -45,7 +45,7 @@ class Command extends BaseCommand
$data['meta']['url'] = $data['meta']['simple_url'] = $url;
$data['meta']['get'] = $data['meta']['env'] = [];
$data['meta']['SERVER'] = array_replace_recursive($data['meta']['SERVER'], [
'APP_VERSION' => Config::get('version'),
'APP_VERSION' => getAppVersion(),
'PHP_VERSION' => PHP_VERSION,
'PHP_VERSION_ID' => PHP_VERSION_ID,
'PHP_OS' => PHP_OS,

View File

@@ -10,7 +10,6 @@ use App\Libs\Data;
use App\Libs\Entity\StateInterface;
use App\Libs\Mappers\ImportInterface;
use App\Libs\Options;
use App\Libs\Storage\PDO\PDOAdapter;
use App\Libs\Storage\StorageInterface;
use Psr\Log\LoggerInterface;
use RuntimeException;
@@ -105,8 +104,6 @@ class ImportCommand extends Command
$isCustom = !empty($serversFilter) && count($selected) >= 1;
$supported = Config::get('supported', []);
$this->logger->info(sprintf('Running WatchState Version \'%s\'.', getAppVersion()));
$mapperOpts = [];
if ($input->getOption('dry-run')) {
@@ -171,15 +168,13 @@ class ImportCommand extends Command
/** @var array<array-key,ResponseInterface> $queue */
$queue = [];
if (count($list) >= 1) {
$this->logger->info('Preloading all mapper data.');
$this->mapper->loadData();
$this->logger->info('Finished preloading mapper data.');
}
$this->logger->notice(sprintf('Running WatchState Version \'%s\'.', getAppVersion()));
if ($this->storage instanceof PDOAdapter) {
$this->storage->singleTransaction();
}
$this->logger->notice('MAPPER: Preloading database into memory.');
$this->mapper->loadData();
$this->logger->notice('MAPPER: Finished Preloading database.');
$this->storage->singleTransaction();
foreach ($list as $name => &$server) {
Data::addBucket($name);

View File

@@ -184,7 +184,7 @@ final class MemoryMapper implements ImportInterface
$count = count($this->changed);
$this->logger->notice(
0 === $count ? 'No changes detected.' : sprintf('Updating backend storage with \'%d\' changes.', $count)
0 === $count ? 'MAPPER: No changes detected.' : sprintf('MAPPER: Updating \'%d\' db records.', $count)
);
$inDryRunMode = $this->inDryRunMode();

View File

@@ -151,15 +151,6 @@ class EmbyServer extends JellyfinServer
iFace::COLUMN_VIA => $this->name,
iFace::COLUMN_TITLE => ag($json, ['Item.Name', 'Item.OriginalTitle'], '??'),
iFace::COLUMN_YEAR => ag($json, 'Item.ProductionYear', 0000),
iFace::COLUMN_SEASON => null,
iFace::COLUMN_EPISODE => null,
iFace::COLUMN_META_DATA_EXTRA => [
iFace::COLUMN_META_DATA_EXTRA_DATE => makeDate(
ag($json, ['Item.PremiereDate', 'Item.ProductionYear', 'Item.DateCreated'], 'now')
)->format('Y-m-d'),
iFace::COLUMN_META_DATA_EXTRA_EVENT => $event,
],
iFace::COLUMN_META_DATA_PAYLOAD => $json,
],
],
iFace::COLUMN_EXTRA => [],
@@ -171,16 +162,22 @@ class EmbyServer extends JellyfinServer
$row[iFace::COLUMN_EPISODE] = ag($json, 'Item.IndexNumber', 0);
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_SEASON] = ag($json, 'Item.ParentIndexNumber', 0);
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_EPISODE] = ag($json, 'Item.IndexNumber', 0);
if (null !== ($epTitle = ag($json, ['Item.Name', 'Item.OriginalTitle'], null))) {
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_META_DATA_EXTRA][iFace::COLUMN_META_DATA_EXTRA_TITLE] = $epTitle;
}
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_META_DATA_EXTRA][iFace::COLUMN_META_DATA_EXTRA_TITLE] = ag(
$json,
['Item.Name', 'Item.OriginalTitle'],
'??'
);
if (null !== ag($json, 'Item.SeriesId')) {
$row[iFace::COLUMN_PARENT] = $this->getEpisodeParent(ag($json, 'Item.SeriesId'), '');
}
}
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_META_DATA_EXTRA][iFace::COLUMN_META_DATA_EXTRA_DATE] = makeDate(
ag($json, ['Item.PremiereDate', 'Item.ProductionYear', 'Item.DateCreated'], 'now')
)->format('Y-m-d');
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_META_DATA_EXTRA][iFace::COLUMN_META_DATA_EXTRA_EVENT] = $event;
$entity = Container::get(iFace::class)::fromArray($row)->setIsTainted($isTainted);
if (!$entity->hasGuids() && !$entity->hasRelativeGuid()) {

View File

@@ -338,15 +338,7 @@ class JellyfinServer implements ServerInterface
iFace::COLUMN_VIA => $this->name,
iFace::COLUMN_TITLE => ag($json, ['Name', 'OriginalTitle'], '??'),
iFace::COLUMN_YEAR => (string)ag($json, 'Year', 0000),
iFace::COLUMN_SEASON => null,
iFace::COLUMN_EPISODE => null,
iFace::COLUMN_META_DATA_EXTRA => [
iFace::COLUMN_META_DATA_EXTRA_DATE => makeDate(
ag($json, ['PremiereDate', 'ProductionYear', 'DateCreated'], 'now')
)->format('Y-m-d'),
iFace::COLUMN_META_DATA_EXTRA_EVENT => $event,
],
iFace::COLUMN_META_DATA_PAYLOAD => $json,
iFace::COLUMN_GUIDS => array_change_key_case($providersId, CASE_LOWER)
]
],
iFace::COLUMN_EXTRA => [],
@@ -360,10 +352,11 @@ class JellyfinServer implements ServerInterface
$row[iFace::COLUMN_EPISODE] = ag($json, 'EpisodeNumber', 0);
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_SEASON] = ag($json, 'SeasonNumber', 0);
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_EPISODE] = ag($json, 'EpisodeNumber', 0);
if (null !== ($epTitle = ag($json, ['Name', 'OriginalTitle'], null))) {
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_META_DATA_EXTRA][iFace::COLUMN_META_DATA_EXTRA_TITLE] = $epTitle;
}
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_META_DATA_EXTRA][iFace::COLUMN_META_DATA_EXTRA_TITLE] = ag(
$json,
['Name', 'OriginalTitle'],
'??'
);
if (null !== $seriesName) {
$row[iFace::COLUMN_PARENT] = $this->getEpisodeParent(
@@ -373,6 +366,11 @@ class JellyfinServer implements ServerInterface
}
}
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_META_DATA_EXTRA][iFace::COLUMN_META_DATA_EXTRA_DATE] = makeDate(
ag($json, ['PremiereDate', 'ProductionYear', 'DateCreated'], 'now')
)->format('Y-m-d');
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_META_DATA_EXTRA][iFace::COLUMN_META_DATA_EXTRA_EVENT] = $event;
$entity = Container::get(iFace::class)::fromArray($row)->setIsTainted($isTainted);
if (!$entity->hasGuids() && !$entity->hasRelativeGuid()) {
@@ -1680,14 +1678,7 @@ class JellyfinServer implements ServerInterface
iFace::COLUMN_VIA => $this->name,
iFace::COLUMN_TITLE => $item->Name ?? $item->OriginalTitle ?? '??',
iFace::COLUMN_YEAR => $item->ProductionYear ?? 0000,
iFace::COLUMN_SEASON => null,
iFace::COLUMN_EPISODE => null,
iFace::COLUMN_META_DATA_EXTRA => [
iFace::COLUMN_META_DATA_EXTRA_DATE => makeDate(
$item->PremiereDate ?? $item->ProductionYear ?? 'now'
)->format('Y-m-d'),
],
iFace::COLUMN_META_DATA_PAYLOAD => get_object_vars($item),
iFace::COLUMN_GUIDS => array_change_key_case((array)($item->ProviderIds ?? []), CASE_LOWER),
],
],
iFace::COLUMN_EXTRA => [],
@@ -1699,16 +1690,18 @@ class JellyfinServer implements ServerInterface
$row[iFace::COLUMN_EPISODE] = $item->IndexNumber ?? 0;
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_SEASON] = $item->ParentIndexNumber ?? 0;
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_EPISODE] = $item->IndexNumber ?? 0;
if (null !== ($item->Name ?? null)) {
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_META_DATA_EXTRA][iFace::COLUMN_META_DATA_EXTRA_TITLE] = $item->Name;
}
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_META_DATA_EXTRA][iFace::COLUMN_META_DATA_EXTRA_TITLE] = $item->Name ?? $item->OriginalTitle ?? '??';
if (null !== ($item->SeriesId ?? null)) {
$row[iFace::COLUMN_PARENT] = $this->cacheShow[$item->SeriesId] ?? [];
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_PARENT] = $row[iFace::COLUMN_PARENT];
}
}
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_META_DATA_EXTRA][iFace::COLUMN_META_DATA_EXTRA_DATE] = makeDate(
$item->PremiereDate ?? $item->ProductionYear ?? 'now'
)->format('Y-m-d');
$entity = Container::get(iFace::class)::fromArray($row);
foreach ([...$entity->getRelativePointers(), ...$entity->getPointers()] as $guid) {

View File

@@ -385,17 +385,7 @@ class PlexServer implements ServerInterface
iFace::COLUMN_VIA => $this->name,
iFace::COLUMN_TITLE => ag($item, ['title', 'originalTitle'], '??'),
iFace::COLUMN_YEAR => (int)ag($item, ['grandParentYear', 'parentYear', 'year'], 0000),
iFace::COLUMN_SEASON => null,
iFace::COLUMN_EPISODE => null,
iFace::COLUMN_META_DATA_EXTRA => [
iFace::COLUMN_META_DATA_EXTRA_DATE => makeDate(
ag($item, 'originallyAvailableAt', 'now')
)->format(
'Y-m-d'
),
iFace::COLUMN_META_DATA_EXTRA_EVENT => $event,
],
iFace::COLUMN_META_DATA_PAYLOAD => $json,
iFace::COLUMN_GUIDS => ag($item, 'Guid', []),
],
],
iFace::COLUMN_EXTRA => [],
@@ -415,9 +405,17 @@ class PlexServer implements ServerInterface
if (null !== ($parentId = ag($item, ['grandparentRatingKey', 'parentRatingKey'], null))) {
$row[iFace::COLUMN_PARENT] = $this->getEpisodeParent($parentId);
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_PARENT] = $row[iFace::COLUMN_PARENT];
}
}
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_META_DATA_EXTRA][iFace::COLUMN_META_DATA_EXTRA_DATE] = makeDate(
ag($item, 'originallyAvailableAt', 'now')
)->format(
'Y-m-d'
);
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_META_DATA_EXTRA][iFace::COLUMN_META_DATA_EXTRA_EVENT] = $event;
$entity = Container::get(iFace::class)::fromArray($row)->setIsTainted($isTainted);
if (!$entity->hasGuids() && !$entity->hasRelativeGuid()) {
@@ -1653,6 +1651,44 @@ class PlexServer implements ServerInterface
$this->cacheShow[$item->ratingKey] = Guid::fromArray($this->getGuids($item->Guid))->getAll();
}
protected function parseGuids(array $guids): array
{
$guid = [];
foreach ($guids as $_id) {
try {
$val = is_object($_id) ? $_id->id : $_id['id'];
if (empty($val)) {
continue;
}
if (true === str_starts_with($val, 'com.plexapp.agents.')) {
// -- DO NOT accept plex relative unique ids, we generate our own.
if (substr_count($val, '/') >= 3) {
continue;
}
$val = $this->parseLegacyAgent($val);
}
if (false === str_contains($val, '://')) {
continue;
}
[$key, $value] = explode('://', $val);
$key = strtolower($key);
$guid[$key] = $value;
} catch (Throwable) {
continue;
}
}
ksort($guid);
return $guid;
}
protected function getGuids(array $guids): array
{
$guid = [];
@@ -1826,14 +1862,7 @@ class PlexServer implements ServerInterface
iFace::COLUMN_VIA => $this->name,
iFace::COLUMN_TITLE => $item->title ?? $item->originalTitle ?? '??',
iFace::COLUMN_YEAR => (int)($item->grandParentYear ?? $item->parentYear ?? $item->year ?? 0000),
iFace::COLUMN_SEASON => null,
iFace::COLUMN_EPISODE => null,
iFace::COLUMN_META_DATA_EXTRA => [
iFace::COLUMN_META_DATA_EXTRA_DATE => makeDate($item->originallyAvailableAt ?? 'now')->format(
'Y-m-d'
),
],
iFace::COLUMN_META_DATA_PAYLOAD => get_object_vars($item),
iFace::COLUMN_GUIDS => $this->parseGuids($item->Guid ?? []),
],
],
iFace::COLUMN_EXTRA => [],
@@ -1845,15 +1874,22 @@ class PlexServer implements ServerInterface
$row[iFace::COLUMN_EPISODE] = $item->index ?? 0;
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_SEASON] = $item->parentIndex ?? 0;
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_EPISODE] = $item->index ?? 0;
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_META_DATA_EXTRA][iFace::COLUMN_META_DATA_EXTRA_TITLE] = $item->title ?? $item->originalTitle ?? '??';
$parentId = $item->grandparentRatingKey ?? $item->parentRatingKey ?? null;
if (null !== $parentId) {
$row[iFace::COLUMN_PARENT] = $this->getEpisodeParent($parentId);
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_PARENT] = $row[iFace::COLUMN_PARENT];
}
}
$row[iFace::COLUMN_META_DATA][$this->name][iFace::COLUMN_META_DATA_EXTRA][iFace::COLUMN_META_DATA_EXTRA_DATE] = makeDate(
$item->originallyAvailableAt ?? 'now'
)->format(
'Y-m-d'
);
$entity = Container::get(iFace::class)::fromArray($row);
foreach ([...$entity->getRelativePointers(), ...$entity->getPointers()] as $guid) {