datasets.service.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import { Injectable } from '@nestjs/common';
  2. import Database from 'better-sqlite3';
  3. import fs from 'fs';
  4. import path from 'path';
  5. @Injectable()
  6. export class DatasetsService {
  7. private dbPath: string;
  8. constructor() {
  9. // Find project root by traversing up from current directory until we find the root package.json
  10. let projectRoot = process.cwd();
  11. while (projectRoot !== path.dirname(projectRoot)) {
  12. if (fs.existsSync(path.join(projectRoot, 'package.json'))) {
  13. try {
  14. const pkg = JSON.parse(
  15. fs.readFileSync(path.join(projectRoot, 'package.json'), 'utf-8'),
  16. );
  17. if (pkg.name === 'watch-finished-turbo') {
  18. break;
  19. }
  20. } catch (e) {
  21. // ignore
  22. }
  23. }
  24. projectRoot = path.dirname(projectRoot);
  25. }
  26. this.dbPath = path.resolve(projectRoot, 'data/database.db');
  27. }
  28. /**
  29. * Returns all enabled dataset paths from the settings.datasets key in the database
  30. * Only includes paths from datasets that are not explicitly disabled
  31. */
  32. getEnabledDatasetPaths(): string[] {
  33. const db = new Database(this.dbPath, { readonly: true });
  34. const row = db
  35. .prepare('SELECT value FROM settings WHERE key = ?')
  36. .get('datasets') as { value?: string } | undefined;
  37. db.close();
  38. if (!row || !row.value) return [];
  39. let datasets;
  40. try {
  41. datasets = JSON.parse(row.value);
  42. } catch (e) {
  43. return [];
  44. }
  45. // Each dataset (kids, pr0n, tvshows, etc) is an object, each value is a config object
  46. // Find all paths in all datasets
  47. const paths: string[] = [];
  48. for (const datasetName of Object.keys(datasets)) {
  49. const datasetObj = datasets[datasetName];
  50. if (typeof datasetObj === 'object' && datasetObj !== null) {
  51. // Check if dataset is explicitly disabled (handles false, "false", 0, "0", etc.)
  52. const isDisabled =
  53. datasetObj.enabled === false ||
  54. datasetObj.enabled === 'false' ||
  55. datasetObj.enabled === 0 ||
  56. datasetObj.enabled === '0';
  57. if (!isDisabled) {
  58. for (const pathKey of Object.keys(datasetObj)) {
  59. if (pathKey !== 'enabled') {
  60. // Skip the enabled property itself
  61. paths.push(pathKey);
  62. }
  63. }
  64. }
  65. }
  66. }
  67. return paths;
  68. }
  69. /**
  70. * Returns all dataset names from the settings.datasets key in the database
  71. * Includes both enabled and disabled datasets
  72. */
  73. getAllDatasetNames(): string[] {
  74. const db = new Database(this.dbPath, { readonly: true });
  75. const row = db
  76. .prepare('SELECT value FROM settings WHERE key = ?')
  77. .get('datasets') as { value?: string } | undefined;
  78. db.close();
  79. if (!row || !row.value) return [];
  80. let datasets;
  81. try {
  82. datasets = JSON.parse(row.value);
  83. } catch (e) {
  84. return [];
  85. }
  86. return Object.keys(datasets);
  87. }
  88. /**
  89. * Returns the full dataset configuration from settings
  90. */
  91. getDatasetConfig(): Record<string, any> {
  92. const db = new Database(this.dbPath, { readonly: true });
  93. const row = db
  94. .prepare('SELECT value FROM settings WHERE key = ?')
  95. .get('datasets') as { value?: string } | undefined;
  96. db.close();
  97. if (!row || !row.value) return {};
  98. try {
  99. return JSON.parse(row.value);
  100. } catch (e) {
  101. return {};
  102. }
  103. }
  104. /**
  105. * Returns the exts array for a specific dataset
  106. */
  107. getDatasetExts(datasetName: string): string[] | null {
  108. const config = this.getDatasetConfig();
  109. const datasetConfig = config[datasetName];
  110. if (!datasetConfig || !datasetConfig.exts) {
  111. return null;
  112. }
  113. return Array.isArray(datasetConfig.exts) ? datasetConfig.exts : null;
  114. }
  115. }