podverse-parser 5.1.0-alpha.1 → 5.1.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/config/index.d.ts +9 -3
  2. package/dist/config/index.d.ts.map +1 -1
  3. package/dist/config/index.js +9 -3
  4. package/dist/factories/firebaseAccessTokenService.d.ts +3 -0
  5. package/dist/factories/firebaseAccessTokenService.d.ts.map +1 -0
  6. package/dist/factories/firebaseAccessTokenService.js +9 -0
  7. package/dist/factories/loggerService.d.ts +3 -0
  8. package/dist/factories/loggerService.d.ts.map +1 -0
  9. package/dist/factories/loggerService.js +9 -0
  10. package/dist/factories/notificationsService.d.ts +3 -0
  11. package/dist/factories/notificationsService.d.ts.map +1 -0
  12. package/dist/factories/notificationsService.js +12 -0
  13. package/dist/factories/podcastIndex.d.ts.map +1 -1
  14. package/dist/factories/podcastIndex.js +8 -5
  15. package/dist/factories/timerManager.d.ts +3 -0
  16. package/dist/factories/timerManager.d.ts.map +1 -0
  17. package/dist/factories/timerManager.js +7 -0
  18. package/dist/lib/chapters/chapters.d.ts.map +1 -1
  19. package/dist/lib/chapters/chapters.js +2 -1
  20. package/dist/lib/compat/partytime/channel.d.ts +1 -1
  21. package/dist/lib/compat/partytime/channel.d.ts.map +1 -1
  22. package/dist/lib/compat/partytime/channel.js +10 -6
  23. package/dist/lib/rss/channel/channel.d.ts.map +1 -1
  24. package/dist/lib/rss/channel/channel.js +4 -5
  25. package/dist/lib/rss/channel/channelAbout.d.ts.map +1 -1
  26. package/dist/lib/rss/channel/channelAbout.js +3 -3
  27. package/dist/lib/rss/channel/channelCategory.d.ts.map +1 -1
  28. package/dist/lib/rss/channel/channelCategory.js +3 -3
  29. package/dist/lib/rss/channel/channelChat.d.ts.map +1 -1
  30. package/dist/lib/rss/channel/channelChat.js +3 -3
  31. package/dist/lib/rss/channel/channelDescription.d.ts.map +1 -1
  32. package/dist/lib/rss/channel/channelDescription.js +3 -3
  33. package/dist/lib/rss/channel/channelFunding.d.ts.map +1 -1
  34. package/dist/lib/rss/channel/channelFunding.js +3 -3
  35. package/dist/lib/rss/channel/channelImage.d.ts.map +1 -1
  36. package/dist/lib/rss/channel/channelImage.js +3 -3
  37. package/dist/lib/rss/channel/channelLicense.d.ts.map +1 -1
  38. package/dist/lib/rss/channel/channelLicense.js +3 -3
  39. package/dist/lib/rss/channel/channelLocation.d.ts.map +1 -1
  40. package/dist/lib/rss/channel/channelLocation.js +3 -3
  41. package/dist/lib/rss/channel/channelPerson.d.ts.map +1 -1
  42. package/dist/lib/rss/channel/channelPerson.js +3 -3
  43. package/dist/lib/rss/channel/channelPodroll.d.ts.map +1 -1
  44. package/dist/lib/rss/channel/channelPodroll.js +3 -3
  45. package/dist/lib/rss/channel/channelPublisher.d.ts.map +1 -1
  46. package/dist/lib/rss/channel/channelPublisher.js +3 -3
  47. package/dist/lib/rss/channel/channelRemoteItem.d.ts.map +1 -1
  48. package/dist/lib/rss/channel/channelRemoteItem.js +3 -3
  49. package/dist/lib/rss/channel/channelSeason.d.ts.map +1 -1
  50. package/dist/lib/rss/channel/channelSeason.js +3 -3
  51. package/dist/lib/rss/channel/channelSocialInteract.d.ts.map +1 -1
  52. package/dist/lib/rss/channel/channelSocialInteract.js +3 -3
  53. package/dist/lib/rss/channel/channelTrailer.d.ts.map +1 -1
  54. package/dist/lib/rss/channel/channelTrailer.js +3 -3
  55. package/dist/lib/rss/channel/channelTxt.d.ts.map +1 -1
  56. package/dist/lib/rss/channel/channelTxt.js +3 -3
  57. package/dist/lib/rss/channel/channelValue.d.ts.map +1 -1
  58. package/dist/lib/rss/channel/channelValue.js +3 -3
  59. package/dist/lib/rss/errors.d.ts +7 -0
  60. package/dist/lib/rss/errors.d.ts.map +1 -0
  61. package/dist/lib/rss/errors.js +17 -0
  62. package/dist/lib/rss/feed/feed.d.ts.map +1 -1
  63. package/dist/lib/rss/feed/feed.js +14 -12
  64. package/dist/lib/rss/hash/parsedFeed.d.ts.map +1 -1
  65. package/dist/lib/rss/hash/parsedFeed.js +2 -2
  66. package/dist/lib/rss/item/item.d.ts.map +1 -1
  67. package/dist/lib/rss/item/item.js +45 -44
  68. package/dist/lib/rss/liveItem/liveItem.d.ts.map +1 -1
  69. package/dist/lib/rss/liveItem/liveItem.js +9 -4
  70. package/dist/lib/rss/parser.d.ts.map +1 -1
  71. package/dist/lib/rss/parser.js +30 -15
  72. package/dist/lib/rss/remoteItemParser.d.ts.map +1 -1
  73. package/dist/lib/rss/remoteItemParser.js +3 -2
  74. package/package.json +5 -5
@@ -10,11 +10,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.handleParsedChannelSeasons = void 0;
13
- const podverse_helpers_1 = require("podverse-helpers");
14
13
  const podverse_orm_1 = require("podverse-orm");
15
14
  const channel_1 = require("@parser/lib/compat/partytime/channel");
15
+ const timerManager_1 = require("@parser/factories/timerManager");
16
16
  const handleParsedChannelSeasons = (parsedFeed, channel) => __awaiter(void 0, void 0, void 0, function* () {
17
- podverse_helpers_1.timerManager.start('handleParsedChannelSeasons');
17
+ timerManager_1.timerManager.start('handleParsedChannelSeasons');
18
18
  const channelSeasonService = new podverse_orm_1.ChannelSeasonService();
19
19
  const channelSeasonDtos = (0, channel_1.compatChannelSeasonDtos)(parsedFeed);
20
20
  if (channelSeasonDtos.length > 0) {
@@ -23,6 +23,6 @@ const handleParsedChannelSeasons = (parsedFeed, channel) => __awaiter(void 0, vo
23
23
  else {
24
24
  yield channelSeasonService.deleteAll(channel);
25
25
  }
26
- podverse_helpers_1.timerManager.end('handleParsedChannelSeasons');
26
+ timerManager_1.timerManager.end('handleParsedChannelSeasons');
27
27
  });
28
28
  exports.handleParsedChannelSeasons = handleParsedChannelSeasons;
@@ -1 +1 @@
1
- {"version":3,"file":"channelSocialInteract.d.ts","sourceRoot":"","sources":["../../../../src/lib/rss/channel/channelSocialInteract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAgC,aAAa,EAAE,MAAM,cAAc,CAAC;AAIpF,eAAO,MAAM,iCAAiC,GAC5C,YAAY,UAAU,EACtB,SAAS,OAAO,EAChB,6BAA6B,aAAa,kBAO3C,CAAC"}
1
+ {"version":3,"file":"channelSocialInteract.d.ts","sourceRoot":"","sources":["../../../../src/lib/rss/channel/channelSocialInteract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAgC,aAAa,EAAE,MAAM,cAAc,CAAC;AAKpF,eAAO,MAAM,iCAAiC,GAC5C,YAAY,UAAU,EACtB,SAAS,OAAO,EAChB,6BAA6B,aAAa,kBAO3C,CAAC"}
@@ -10,15 +10,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.handleParsedChannelSocialInteract = void 0;
13
- const podverse_helpers_1 = require("podverse-helpers");
14
13
  const podverse_orm_1 = require("podverse-orm");
15
14
  const channel_1 = require("@parser/lib/compat/partytime/channel");
16
15
  const handleParsedManyData_1 = require("../base/handleParsedManyData");
16
+ const timerManager_1 = require("@parser/factories/timerManager");
17
17
  const handleParsedChannelSocialInteract = (parsedFeed, channel, transactionalEntityManager) => __awaiter(void 0, void 0, void 0, function* () {
18
- podverse_helpers_1.timerManager.start("handleParsedChannelSocialInteract");
18
+ timerManager_1.timerManager.start("handleParsedChannelSocialInteract");
19
19
  const channelSocialInteractService = new podverse_orm_1.ChannelSocialInteractService(transactionalEntityManager);
20
20
  const channelSocialInteractDtos = (0, channel_1.compatChannelSocialInteractDtos)(parsedFeed);
21
21
  yield (0, handleParsedManyData_1.handleParsedManyData)(channel, channelSocialInteractService, channelSocialInteractDtos);
22
- podverse_helpers_1.timerManager.end("handleParsedChannelSocialInteract");
22
+ timerManager_1.timerManager.end("handleParsedChannelSocialInteract");
23
23
  });
24
24
  exports.handleParsedChannelSocialInteract = handleParsedChannelSocialInteract;
@@ -1 +1 @@
1
- {"version":3,"file":"channelTrailer.d.ts","sourceRoot":"","sources":["../../../../src/lib/rss/channel/channelTrailer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAE,aAAa,EAA4C,aAAa,EAAE,MAAM,cAAc,CAAC;AAG/G,eAAO,MAAM,0BAA0B,GACrC,YAAY,UAAU,EACtB,SAAS,OAAO,EAChB,oBAAoB,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,EACjD,6BAA6B,aAAa,kBAwB3C,CAAC"}
1
+ {"version":3,"file":"channelTrailer.d.ts","sourceRoot":"","sources":["../../../../src/lib/rss/channel/channelTrailer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,aAAa,EAA4C,aAAa,EAAE,MAAM,cAAc,CAAC;AAI/G,eAAO,MAAM,0BAA0B,GACrC,YAAY,UAAU,EACtB,SAAS,OAAO,EAChB,oBAAoB,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,EACjD,6BAA6B,aAAa,kBAwB3C,CAAC"}
@@ -10,11 +10,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.handleParsedChannelTrailer = void 0;
13
- const podverse_helpers_1 = require("podverse-helpers");
14
13
  const podverse_orm_1 = require("podverse-orm");
15
14
  const channel_1 = require("@parser/lib/compat/partytime/channel");
15
+ const timerManager_1 = require("@parser/factories/timerManager");
16
16
  const handleParsedChannelTrailer = (parsedFeed, channel, channelSeasonIndex, transactionalEntityManager) => __awaiter(void 0, void 0, void 0, function* () {
17
- podverse_helpers_1.timerManager.start("handleParsedChannelTrailer");
17
+ timerManager_1.timerManager.start("handleParsedChannelTrailer");
18
18
  const channelTrailerService = new podverse_orm_1.ChannelTrailerService(transactionalEntityManager);
19
19
  const channelTrailerDtos = (0, channel_1.compatChannelTrailerDtos)(parsedFeed);
20
20
  const enrichedChannelTrailerDtos = channelTrailerDtos.map((channelTrailerDto) => {
@@ -34,6 +34,6 @@ const handleParsedChannelTrailer = (parsedFeed, channel, channelSeasonIndex, tra
34
34
  else {
35
35
  yield channelTrailerService.deleteAll(channel);
36
36
  }
37
- podverse_helpers_1.timerManager.end("handleParsedChannelTrailer");
37
+ timerManager_1.timerManager.end("handleParsedChannelTrailer");
38
38
  });
39
39
  exports.handleParsedChannelTrailer = handleParsedChannelTrailer;
@@ -1 +1 @@
1
- {"version":3,"file":"channelTxt.d.ts","sourceRoot":"","sources":["../../../../src/lib/rss/channel/channelTxt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAqB,aAAa,EAAE,MAAM,cAAc,CAAC;AAIzE,eAAO,MAAM,sBAAsB,GACjC,YAAY,UAAU,EACtB,SAAS,OAAO,EAChB,6BAA6B,aAAa,kBAO3C,CAAC"}
1
+ {"version":3,"file":"channelTxt.d.ts","sourceRoot":"","sources":["../../../../src/lib/rss/channel/channelTxt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAqB,aAAa,EAAE,MAAM,cAAc,CAAC;AAKzE,eAAO,MAAM,sBAAsB,GACjC,YAAY,UAAU,EACtB,SAAS,OAAO,EAChB,6BAA6B,aAAa,kBAO3C,CAAC"}
@@ -10,15 +10,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.handleParsedChannelTxt = void 0;
13
- const podverse_helpers_1 = require("podverse-helpers");
14
13
  const podverse_orm_1 = require("podverse-orm");
15
14
  const channel_1 = require("@parser/lib/compat/partytime/channel");
16
15
  const handleParsedManyData_1 = require("../base/handleParsedManyData");
16
+ const timerManager_1 = require("@parser/factories/timerManager");
17
17
  const handleParsedChannelTxt = (parsedFeed, channel, transactionalEntityManager) => __awaiter(void 0, void 0, void 0, function* () {
18
- podverse_helpers_1.timerManager.start("handleParsedChannelTxt");
18
+ timerManager_1.timerManager.start("handleParsedChannelTxt");
19
19
  const channelTxtService = new podverse_orm_1.ChannelTxtService(transactionalEntityManager);
20
20
  const channelTxtDtos = (0, channel_1.compatChannelTxtDtos)(parsedFeed);
21
21
  yield (0, handleParsedManyData_1.handleParsedManyData)(channel, channelTxtService, channelTxtDtos);
22
- podverse_helpers_1.timerManager.end("handleParsedChannelTxt");
22
+ timerManager_1.timerManager.end("handleParsedChannelTxt");
23
23
  });
24
24
  exports.handleParsedChannelTxt = handleParsedChannelTxt;
@@ -1 +1 @@
1
- {"version":3,"file":"channelValue.d.ts","sourceRoot":"","sources":["../../../../src/lib/rss/channel/channelValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAqD,aAAa,EAAE,MAAM,cAAc,CAAC;AAGzG,eAAO,MAAM,wBAAwB,GACnC,YAAY,UAAU,EACtB,SAAS,OAAO,EAChB,6BAA6B,aAAa,kBAwB3C,CAAC"}
1
+ {"version":3,"file":"channelValue.d.ts","sourceRoot":"","sources":["../../../../src/lib/rss/channel/channelValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAqD,aAAa,EAAE,MAAM,cAAc,CAAC;AAIzG,eAAO,MAAM,wBAAwB,GACnC,YAAY,UAAU,EACtB,SAAS,OAAO,EAChB,6BAA6B,aAAa,kBAwB3C,CAAC"}
@@ -10,11 +10,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.handleParsedChannelValue = void 0;
13
- const podverse_helpers_1 = require("podverse-helpers");
14
13
  const podverse_orm_1 = require("podverse-orm");
15
14
  const channel_1 = require("@parser/lib/compat/partytime/channel");
15
+ const timerManager_1 = require("@parser/factories/timerManager");
16
16
  const handleParsedChannelValue = (parsedFeed, channel, transactionalEntityManager) => __awaiter(void 0, void 0, void 0, function* () {
17
- podverse_helpers_1.timerManager.start("handleParsedChannelValue");
17
+ timerManager_1.timerManager.start("handleParsedChannelValue");
18
18
  const channelValueService = new podverse_orm_1.ChannelValueService(transactionalEntityManager);
19
19
  const channelValueDtos = (0, channel_1.compatChannelValueDtos)(parsedFeed);
20
20
  const channelValueRecipientService = new podverse_orm_1.ChannelValueRecipientService(transactionalEntityManager);
@@ -35,6 +35,6 @@ const handleParsedChannelValue = (parsedFeed, channel, transactionalEntityManage
35
35
  else {
36
36
  yield channelValueService.deleteAll(channel);
37
37
  }
38
- podverse_helpers_1.timerManager.end("handleParsedChannelValue");
38
+ timerManager_1.timerManager.end("handleParsedChannelValue");
39
39
  });
40
40
  exports.handleParsedChannelValue = handleParsedChannelValue;
@@ -0,0 +1,7 @@
1
+ export declare class FeedIsParsingError extends Error {
2
+ constructor(feedId: number);
3
+ }
4
+ export declare class FeedNoChangesSinceLastParsedError extends Error {
5
+ constructor(feedId: number);
6
+ }
7
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/lib/rss/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,MAAM,EAAE,MAAM;CAI3B;AAED,qBAAa,iCAAkC,SAAQ,KAAK;gBAC9C,MAAM,EAAE,MAAM;CAI3B"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FeedNoChangesSinceLastParsedError = exports.FeedIsParsingError = void 0;
4
+ class FeedIsParsingError extends Error {
5
+ constructor(feedId) {
6
+ super(`Feed ${feedId} is already parsing`);
7
+ this.name = 'FeedIsParsingError';
8
+ }
9
+ }
10
+ exports.FeedIsParsingError = FeedIsParsingError;
11
+ class FeedNoChangesSinceLastParsedError extends Error {
12
+ constructor(feedId) {
13
+ super(`Feed ${feedId} has no changes since last parsed.`);
14
+ this.name = 'FeedNoChangesSinceLastParsedError';
15
+ }
16
+ }
17
+ exports.FeedNoChangesSinceLastParsedError = FeedNoChangesSinceLastParsedError;
@@ -1 +1 @@
1
- {"version":3,"file":"feed.d.ts","sourceRoot":"","sources":["../../../../src/lib/rss/feed/feed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,IAAI,EAA+B,MAAM,cAAc,CAAC;AAKjE,eAAO,MAAM,gBAAgB,GAAU,KAAK,MAAM,EAAE,kBAAkB,MAAM,KAAG,OAAO,CAAC,IAAI,CA0B1F,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAU,MAAM,IAAI,KAAG,OAAO,CAAC,UAAU,CAsCzE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAU,YAAY,UAAU,EAAE,MAAM,IAAI,KAAG,OAAO,CAAC,IAAI,CAYvF,CAAC"}
1
+ {"version":3,"file":"feed.d.ts","sourceRoot":"","sources":["../../../../src/lib/rss/feed/feed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,IAAI,EAA+B,MAAM,cAAc,CAAC;AAMjE,eAAO,MAAM,gBAAgB,GAAU,KAAK,MAAM,EAAE,kBAAkB,MAAM,KAAG,OAAO,CAAC,IAAI,CA8B1F,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAU,MAAM,IAAI,KAAG,OAAO,CAAC,UAAU,CAsCzE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAU,YAAY,UAAU,EAAE,MAAM,IAAI,KAAG,OAAO,CAAC,IAAI,CAUvF,CAAC"}
@@ -12,11 +12,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.handleParsedFeed = exports.handleRequestRSSFeed = exports.handleGetRSSFeed = void 0;
13
13
  const podverse_helpers_1 = require("podverse-helpers");
14
14
  const podverse_orm_1 = require("podverse-orm");
15
- const config_1 = require("@parser/config");
16
15
  const parsedFeed_1 = require("../hash/parsedFeed");
17
16
  const parser_1 = require("../parser");
17
+ const errors_1 = require("../errors");
18
+ const timerManager_1 = require("@parser/factories/timerManager");
18
19
  const handleGetRSSFeed = (url, podcast_index_id) => __awaiter(void 0, void 0, void 0, function* () {
19
- podverse_helpers_1.timerManager.start('handleGetRSSFeed');
20
+ timerManager_1.timerManager.start('handleGetRSSFeed');
20
21
  const feedService = new podverse_orm_1.FeedService();
21
22
  let feed = yield feedService.getByUrlAndPodcastIndexId({ url, podcast_index_id });
22
23
  if (!feed) {
@@ -27,9 +28,13 @@ const handleGetRSSFeed = (url, podcast_index_id) => __awaiter(void 0, void 0, vo
27
28
  }
28
29
  }
29
30
  if (!feed) {
31
+ const response = yield (0, podverse_helpers_1.request)(url, { method: 'HEAD' });
32
+ if (!response || response.status < 200 || response.status >= 300) {
33
+ throw new Error(`HEAD request failed for ${url} with status ${response === null || response === void 0 ? void 0 : response.status}`);
34
+ }
30
35
  feed = yield feedService.getOrCreate({ url, podcast_index_id });
31
36
  }
32
- podverse_helpers_1.timerManager.end('handleGetRSSFeed');
37
+ timerManager_1.timerManager.end('handleGetRSSFeed');
33
38
  if (!feed) {
34
39
  throw new Error(`parseRSSFeedAndSaveToDatabase: feed not found for ${url}`);
35
40
  }
@@ -37,7 +42,7 @@ const handleGetRSSFeed = (url, podcast_index_id) => __awaiter(void 0, void 0, vo
37
42
  });
38
43
  exports.handleGetRSSFeed = handleGetRSSFeed;
39
44
  const handleRequestRSSFeed = (feed) => __awaiter(void 0, void 0, void 0, function* () {
40
- podverse_helpers_1.timerManager.start('handleRequestRSSFeed');
45
+ timerManager_1.timerManager.start('handleRequestRSSFeed');
41
46
  const feedLogService = new podverse_orm_1.FeedLogService();
42
47
  let parsedFeed = null;
43
48
  try {
@@ -69,30 +74,27 @@ const handleRequestRSSFeed = (feed) => __awaiter(void 0, void 0, void 0, functio
69
74
  });
70
75
  return (0, podverse_helpers_1.throwRequestError)('parsedFeed no data found');
71
76
  }
72
- podverse_helpers_1.timerManager.end('handleRequestRSSFeed');
77
+ timerManager_1.timerManager.end('handleRequestRSSFeed');
73
78
  return parsedFeed;
74
79
  });
75
80
  exports.handleRequestRSSFeed = handleRequestRSSFeed;
76
81
  const handleParsedFeed = (parsedFeed, feed) => __awaiter(void 0, void 0, void 0, function* () {
77
82
  const currentFeedFileHash = (0, parsedFeed_1.getParsedFeedMd5Hash)(parsedFeed);
78
- if (config_1.config.nodeEnv === 'production') {
79
- checkIfFeedIsParsing(feed);
80
- if (feed.last_parsed_file_hash === currentFeedFileHash) {
81
- throw new Error(`Feed ${feed.id} has no changes since last parsed.`);
82
- }
83
+ checkIfFeedIsParsing(feed);
84
+ if (feed.last_parsed_file_hash === currentFeedFileHash) {
85
+ throw new errors_1.FeedNoChangesSinceLastParsedError(feed.id);
83
86
  }
84
87
  const feedService = new podverse_orm_1.FeedService();
85
88
  return feedService.update(feed.id, { last_parsed_file_hash: currentFeedFileHash });
86
89
  });
87
90
  exports.handleParsedFeed = handleParsedFeed;
88
91
  const checkIfFeedIsParsing = (feed) => {
89
- // TODO: handle with caching db / redis instead of database?
90
92
  if (feed.is_parsing) {
91
93
  const parsingDate = new Date(feed.is_parsing);
92
94
  const currentDate = new Date();
93
95
  const timeDifference = (currentDate.getTime() - parsingDate.getTime()) / (1000 * 60);
94
96
  if (timeDifference <= 15) {
95
- throw new Error(`Feed ${feed.id} is already parsing`);
97
+ throw new errors_1.FeedIsParsingError(feed.id);
96
98
  }
97
99
  }
98
100
  };
@@ -1 +1 @@
1
- {"version":3,"file":"parsedFeed.d.ts","sourceRoot":"","sources":["../../../../src/lib/rss/hash/parsedFeed.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,eAAO,MAAM,oBAAoB,GAAI,YAAY,UAAU,KAAG,MAK7D,CAAC"}
1
+ {"version":3,"file":"parsedFeed.d.ts","sourceRoot":"","sources":["../../../../src/lib/rss/hash/parsedFeed.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,eAAO,MAAM,oBAAoB,GAAI,YAAY,UAAU,KAAG,MAY7D,CAAC"}
@@ -12,10 +12,10 @@ var __rest = (this && this.__rest) || function (s, e) {
12
12
  };
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
14
  exports.getParsedFeedMd5Hash = void 0;
15
+ /* eslint-disable @typescript-eslint/no-unused-vars */
15
16
  const podverse_helpers_1 = require("podverse-helpers");
16
17
  const getParsedFeedMd5Hash = (parsedFeed) => {
17
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
18
- const { lastUpdate, lastBuildDate, pubDate } = parsedFeed, parsedFeedPruned = __rest(parsedFeed, ["lastUpdate", "lastBuildDate", "pubDate"]);
18
+ const { lastUpdate, lastBuildDate, pubDate, newestItemPubDate, oldestItemPubDate, lastPubDate } = parsedFeed, parsedFeedPruned = __rest(parsedFeed, ["lastUpdate", "lastBuildDate", "pubDate", "newestItemPubDate", "oldestItemPubDate", "lastPubDate"]);
19
19
  const currentFeedFileHash = (0, podverse_helpers_1.getMd5Hash)(parsedFeedPruned);
20
20
  return currentFeedFileHash;
21
21
  };
@@ -1 +1 @@
1
- {"version":3,"file":"item.d.ts","sourceRoot":"","sources":["../../../../src/lib/rss/item/item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAA0B,OAAO,EAAE,kBAAkB,EAAe,MAAM,cAAc,CAAC;AA2ChG,KAAK,oBAAoB,GAAG;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,4BAA4B,EAAE,MAAM,CAAC;IACrC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,2BAA2B,EAAE,MAAM,CAAC;IACpC,yBAAyB,EAAE,MAAM,CAAC;IAClC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,uBAAuB,EAAE,MAAM,CAAC;IAChC,wBAAwB,EAAE,MAAM,CAAC;IACjC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,6BAA6B,EAAE,MAAM,CAAC;IACtC,8BAA8B,EAAE,MAAM,CAAC;IACvC,yBAAyB,EAAE,MAAM,CAAC;IAClC,0BAA0B,EAAE,MAAM,CAAC;IACnC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAAC;AAWF,KAAK,gBAAgB,GAAG;IACtB,UAAU,EAAE,GAAG,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,kBAAkB,EAAE,kBAAkB,CAAA;IACtC,0BAA0B,CAAC,EAAE,GAAG,CAAA;IAChC,gBAAgB,EAAE,oBAAoB,CAAA;IACtC,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAC;AAEF,eAAO,MAAM,0BAA0B,QAAO,oBAqB7C,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,wBAAwB,EAAE,MAAM,EAAE,CAAA;CACnC,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAU,aAAa,OAAO,EAAE,EAAE,SAAS,OAAO,EAAE,oBAAoB,kBAAkB,KAAG,OAAO,CAAC,uBAAuB,CAqEzJ,CAAC;AAwCF,eAAO,MAAM,gBAAgB,GAAU,uGAOpC,gBAAgB,kBAoFlB,CAAC"}
1
+ {"version":3,"file":"item.d.ts","sourceRoot":"","sources":["../../../../src/lib/rss/item/item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAA0B,OAAO,EAAE,kBAAkB,EAAe,MAAM,cAAc,CAAC;AA4ChG,KAAK,oBAAoB,GAAG;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,4BAA4B,EAAE,MAAM,CAAC;IACrC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,2BAA2B,EAAE,MAAM,CAAC;IACpC,yBAAyB,EAAE,MAAM,CAAC;IAClC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,uBAAuB,EAAE,MAAM,CAAC;IAChC,wBAAwB,EAAE,MAAM,CAAC;IACjC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,6BAA6B,EAAE,MAAM,CAAC;IACtC,8BAA8B,EAAE,MAAM,CAAC;IACvC,yBAAyB,EAAE,MAAM,CAAC;IAClC,0BAA0B,EAAE,MAAM,CAAC;IACnC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAAC;AAYF,KAAK,gBAAgB,GAAG;IAEtB,UAAU,EAAE,GAAG,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,kBAAkB,EAAE,kBAAkB,CAAA;IAEtC,0BAA0B,CAAC,EAAE,GAAG,CAAA;IAChC,gBAAgB,EAAE,oBAAoB,CAAA;IACtC,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAC;AAEF,eAAO,MAAM,0BAA0B,QAAO,oBAqB7C,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,wBAAwB,EAAE,MAAM,EAAE,CAAA;CACnC,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAU,aAAa,OAAO,EAAE,EAAE,SAAS,OAAO,EAAE,oBAAoB,kBAAkB,KAAG,OAAO,CAAC,uBAAuB,CAqEzJ,CAAC;AAwCF,eAAO,MAAM,gBAAgB,GAAU,uGAOpC,gBAAgB,kBAoFlB,CAAC"}
@@ -29,8 +29,9 @@ const itemTranscript_1 = require("@parser/lib/rss/item/itemTranscript");
29
29
  const itemTxt_1 = require("@parser/lib/rss/item/itemTxt");
30
30
  const itemValue_1 = require("@parser/lib/rss/item/itemValue");
31
31
  const itemChat_1 = require("@parser/lib/rss/item/itemChat");
32
- const config_1 = require("@parser/config");
33
32
  const itemFlagStatus_1 = require("podverse-orm/dist/entities/item/itemFlagStatus");
33
+ const timerManager_1 = require("@parser/factories/timerManager");
34
+ const loggerService_1 = require("@parser/factories/loggerService");
34
35
  const removeInvalidItems = (parsedItems) => {
35
36
  const seenEnclosureUrls = new Set();
36
37
  const seenGuids = new Set();
@@ -74,10 +75,10 @@ const createItemTimerAccumulator = () => {
74
75
  exports.createItemTimerAccumulator = createItemTimerAccumulator;
75
76
  const handleParsedItems = (parsedItems, channel, channelSeasonIndex) => __awaiter(void 0, void 0, void 0, function* () {
76
77
  const itemService = new podverse_orm_1.ItemService();
77
- podverse_helpers_1.timerManager.start('getManyByChannel');
78
+ timerManager_1.timerManager.start('getManyByChannel');
78
79
  const existingItems = yield itemService.getManyByChannel(channel, { select: ['id', 'guid', 'guid_enclosure_url'] });
79
- podverse_helpers_1.timerManager.end('getManyByChannel');
80
- podverse_helpers_1.timerManager.start('existingItemIds');
80
+ timerManager_1.timerManager.end('getManyByChannel');
81
+ timerManager_1.timerManager.start('existingItemIds');
81
82
  const existingItemIds = existingItems.map(item => item.id);
82
83
  const existingItemGuids = new Set(existingItems.map(item => item.guid));
83
84
  const existingItemGuidEnclosureUrls = new Set(existingItems.map(item => item.guid_enclosure_url));
@@ -87,10 +88,10 @@ const handleParsedItems = (parsedItems, channel, channelSeasonIndex) => __awaite
87
88
  const uniqueParsedItems = removeInvalidItems(parsedItems);
88
89
  const parsedItemBatchs = (0, podverse_helpers_1.chunkArray)(uniqueParsedItems, 100);
89
90
  const timerAccumulator = (0, exports.createItemTimerAccumulator)();
90
- podverse_helpers_1.timerManager.end('existingItemIds');
91
+ timerManager_1.timerManager.end('existingItemIds');
91
92
  for (const parsedItemBatch of parsedItemBatchs) {
92
- podverse_helpers_1.timerManager.start('handleParsedItemBatch');
93
- if (config_1.config.shouldLogTimer) {
93
+ timerManager_1.timerManager.start('handleParsedItemBatch');
94
+ if (timerManager_1.timerManager.shouldLogTimer) {
94
95
  yield handleParsedItemBatch({
95
96
  parsedItemBatch,
96
97
  channel,
@@ -119,11 +120,11 @@ const handleParsedItems = (parsedItems, channel, channelSeasonIndex) => __awaite
119
120
  });
120
121
  }));
121
122
  }
122
- podverse_helpers_1.timerManager.end('handleParsedItemBatch');
123
+ timerManager_1.timerManager.end('handleParsedItemBatch');
123
124
  }
124
- if (config_1.config.shouldLogTimer) {
125
+ if (timerManager_1.timerManager.shouldLogTimer) {
125
126
  Object.entries(timerAccumulator).forEach(([key, value]) => {
126
- podverse_helpers_1.logger.info(`${key} took ${value}ms`);
127
+ loggerService_1.loggerService.info(`${key} took ${value}ms`);
127
128
  });
128
129
  }
129
130
  const itemIdsToDelete = existingItemIds.filter(id => !updatedItemIds.includes(id));
@@ -158,19 +159,19 @@ const handleParsedItemBatch = (_a) => __awaiter(void 0, [_a], void 0, function*
158
159
  const handleParsedItem = (_a) => __awaiter(void 0, [_a], void 0, function* ({ parsedItem, channel, channelSeasonIndex, transactionalEntityManager, timerAccumulator, isLiveItem }) {
159
160
  const itemService = new podverse_orm_1.ItemService();
160
161
  const itemDto = (0, item_1.compatItemDto)(parsedItem, { isLiveItem });
161
- podverse_helpers_1.timerManager.start('updateItem');
162
+ timerManager_1.timerManager.start('updateItem');
162
163
  const item = yield itemService.update(channel, itemFlagStatus_1.ItemFlagStatusStatusEnum.Active, itemDto);
163
- timerAccumulator.updateItem = podverse_helpers_1.timerManager.end('updateItem', true) + timerAccumulator.updateItem;
164
+ timerAccumulator.updateItem = timerManager_1.timerManager.end('updateItem', true) + timerAccumulator.updateItem;
164
165
  const preventTimerLog = true;
165
- podverse_helpers_1.timerManager.start('handleParsedItemAbout');
166
+ timerManager_1.timerManager.start('handleParsedItemAbout');
166
167
  yield (0, itemAbout_1.handleParsedItemAbout)(parsedItem, item, transactionalEntityManager);
167
- timerAccumulator.handleParsedItemAbout = podverse_helpers_1.timerManager.end('handleParsedItemAbout', preventTimerLog) + timerAccumulator.handleParsedItemAbout;
168
- podverse_helpers_1.timerManager.start('handleParsedItemChapterFeed');
168
+ timerAccumulator.handleParsedItemAbout = timerManager_1.timerManager.end('handleParsedItemAbout', preventTimerLog) + timerAccumulator.handleParsedItemAbout;
169
+ timerManager_1.timerManager.start('handleParsedItemChapterFeed');
169
170
  yield (0, itemChaptersFeed_1.handleParsedItemChaptersFeed)(parsedItem, item, transactionalEntityManager);
170
- timerAccumulator.handleParsedItemChaptersFeed = podverse_helpers_1.timerManager.end('handleParsedItemChapterFeed', preventTimerLog) + timerAccumulator.handleParsedItemChaptersFeed;
171
- podverse_helpers_1.timerManager.start('handleParsedItemChat');
171
+ timerAccumulator.handleParsedItemChaptersFeed = timerManager_1.timerManager.end('handleParsedItemChapterFeed', preventTimerLog) + timerAccumulator.handleParsedItemChaptersFeed;
172
+ timerManager_1.timerManager.start('handleParsedItemChat');
172
173
  yield (0, itemChat_1.handleParsedItemChat)(parsedItem, item, transactionalEntityManager);
173
- timerAccumulator.handleParsedItemChat = podverse_helpers_1.timerManager.end('handleParsedItemChat', preventTimerLog) + timerAccumulator.handleParsedItemChat;
174
+ timerAccumulator.handleParsedItemChat = timerManager_1.timerManager.end('handleParsedItemChat', preventTimerLog) + timerAccumulator.handleParsedItemChat;
174
175
  // // PTDO: add itemContentLinkService support after partytime adds chat support
175
176
  // const itemContentLinkService = new ItemContentLinkService();
176
177
  // const itemContentLinkDtos = compatItemContentLinkDtos(parsedItem);
@@ -179,45 +180,45 @@ const handleParsedItem = (_a) => __awaiter(void 0, [_a], void 0, function* ({ pa
179
180
  // } else {
180
181
  // await itemContentLinkService._deleteAll(item);
181
182
  // }
182
- podverse_helpers_1.timerManager.start('handleParsedItemDescription');
183
+ timerManager_1.timerManager.start('handleParsedItemDescription');
183
184
  yield (0, itemDescription_1.handleParsedItemDescription)(parsedItem, item, transactionalEntityManager);
184
- timerAccumulator.handleParsedItemDescription = podverse_helpers_1.timerManager.end('handleParsedItemDescription', preventTimerLog) + timerAccumulator.handleParsedItemDescription;
185
- podverse_helpers_1.timerManager.start('handleParsedItemEnclosure');
185
+ timerAccumulator.handleParsedItemDescription = timerManager_1.timerManager.end('handleParsedItemDescription', preventTimerLog) + timerAccumulator.handleParsedItemDescription;
186
+ timerManager_1.timerManager.start('handleParsedItemEnclosure');
186
187
  yield (0, itemEnclosure_1.handleParsedItemEnclosure)(parsedItem, item, transactionalEntityManager);
187
- timerAccumulator.handleParsedItemEnclosure = podverse_helpers_1.timerManager.end('handleParsedItemEnclosure', preventTimerLog) + timerAccumulator.handleParsedItemEnclosure;
188
- podverse_helpers_1.timerManager.start('handleParsedItemImage');
188
+ timerAccumulator.handleParsedItemEnclosure = timerManager_1.timerManager.end('handleParsedItemEnclosure', preventTimerLog) + timerAccumulator.handleParsedItemEnclosure;
189
+ timerManager_1.timerManager.start('handleParsedItemImage');
189
190
  yield (0, itemImage_1.handleParsedItemImage)(parsedItem, item, transactionalEntityManager);
190
- timerAccumulator.handleParsedItemImage = podverse_helpers_1.timerManager.end('handleParsedItemImage', preventTimerLog) + timerAccumulator.handleParsedItemImage;
191
- podverse_helpers_1.timerManager.start('handleParsedItemLicense');
191
+ timerAccumulator.handleParsedItemImage = timerManager_1.timerManager.end('handleParsedItemImage', preventTimerLog) + timerAccumulator.handleParsedItemImage;
192
+ timerManager_1.timerManager.start('handleParsedItemLicense');
192
193
  yield (0, itemLicense_1.handleParsedItemLicense)(parsedItem, item, transactionalEntityManager);
193
- timerAccumulator.handleParsedItemLicense = podverse_helpers_1.timerManager.end('handleParsedItemLicense', preventTimerLog) + timerAccumulator.handleParsedItemLicense;
194
- podverse_helpers_1.timerManager.start('handleParsedItemLocation');
194
+ timerAccumulator.handleParsedItemLicense = timerManager_1.timerManager.end('handleParsedItemLicense', preventTimerLog) + timerAccumulator.handleParsedItemLicense;
195
+ timerManager_1.timerManager.start('handleParsedItemLocation');
195
196
  yield (0, itemLocation_1.handleParsedItemLocation)(parsedItem, item, transactionalEntityManager);
196
- timerAccumulator.handleParsedItemLocation = podverse_helpers_1.timerManager.end('handleParsedItemLocation', preventTimerLog) + timerAccumulator.handleParsedItemLocation;
197
- podverse_helpers_1.timerManager.start('handleParsedItemPerson');
197
+ timerAccumulator.handleParsedItemLocation = timerManager_1.timerManager.end('handleParsedItemLocation', preventTimerLog) + timerAccumulator.handleParsedItemLocation;
198
+ timerManager_1.timerManager.start('handleParsedItemPerson');
198
199
  yield (0, itemPerson_1.handleParsedItemPerson)(parsedItem, item, transactionalEntityManager);
199
- timerAccumulator.handleParsedItemPerson = podverse_helpers_1.timerManager.end('handleParsedItemPerson', preventTimerLog) + timerAccumulator.handleParsedItemPerson;
200
- podverse_helpers_1.timerManager.start('handleParsedItemSeason');
200
+ timerAccumulator.handleParsedItemPerson = timerManager_1.timerManager.end('handleParsedItemPerson', preventTimerLog) + timerAccumulator.handleParsedItemPerson;
201
+ timerManager_1.timerManager.start('handleParsedItemSeason');
201
202
  yield (0, itemSeason_1.handleParsedItemSeason)(parsedItem, item, channelSeasonIndex, transactionalEntityManager);
202
- timerAccumulator.handleParsedItemSeason = podverse_helpers_1.timerManager.end('handleParsedItemSeason', preventTimerLog) + timerAccumulator.handleParsedItemSeason;
203
- podverse_helpers_1.timerManager.start('handleParsedItemSeasonEpisode');
203
+ timerAccumulator.handleParsedItemSeason = timerManager_1.timerManager.end('handleParsedItemSeason', preventTimerLog) + timerAccumulator.handleParsedItemSeason;
204
+ timerManager_1.timerManager.start('handleParsedItemSeasonEpisode');
204
205
  yield (0, itemSeasonEpisode_1.handleParsedItemSeasonEpisode)(parsedItem, item, transactionalEntityManager);
205
- timerAccumulator.handleParsedItemSeasonEpisode = podverse_helpers_1.timerManager.end('handleParsedItemSeasonEpisode', preventTimerLog) + timerAccumulator.handleParsedItemSeasonEpisode;
206
- podverse_helpers_1.timerManager.start('handleParsedItemSocialInteract');
206
+ timerAccumulator.handleParsedItemSeasonEpisode = timerManager_1.timerManager.end('handleParsedItemSeasonEpisode', preventTimerLog) + timerAccumulator.handleParsedItemSeasonEpisode;
207
+ timerManager_1.timerManager.start('handleParsedItemSocialInteract');
207
208
  yield (0, itemSocialInteract_1.handleParsedItemSocialInteract)(parsedItem, item, transactionalEntityManager);
208
- timerAccumulator.handleParsedItemSocialInteract = podverse_helpers_1.timerManager.end('handleParsedItemSocialInteract', preventTimerLog) + timerAccumulator.handleParsedItemSocialInteract;
209
- podverse_helpers_1.timerManager.start('handleParsedItemSoundbite');
209
+ timerAccumulator.handleParsedItemSocialInteract = timerManager_1.timerManager.end('handleParsedItemSocialInteract', preventTimerLog) + timerAccumulator.handleParsedItemSocialInteract;
210
+ timerManager_1.timerManager.start('handleParsedItemSoundbite');
210
211
  yield (0, itemSoundbite_1.handleParsedItemSoundbite)(parsedItem, item, transactionalEntityManager);
211
- timerAccumulator.handleParsedItemSoundbite = podverse_helpers_1.timerManager.end('handleParsedItemSoundbite', preventTimerLog) + timerAccumulator.handleParsedItemSoundbite;
212
- podverse_helpers_1.timerManager.start('handleParsedItemTranscript');
212
+ timerAccumulator.handleParsedItemSoundbite = timerManager_1.timerManager.end('handleParsedItemSoundbite', preventTimerLog) + timerAccumulator.handleParsedItemSoundbite;
213
+ timerManager_1.timerManager.start('handleParsedItemTranscript');
213
214
  yield (0, itemTranscript_1.handleParsedItemTranscript)(parsedItem, item, transactionalEntityManager);
214
- timerAccumulator.handleParsedItemTranscript = podverse_helpers_1.timerManager.end('handleParsedItemTranscript', preventTimerLog) + timerAccumulator.handleParsedItemTranscript;
215
- podverse_helpers_1.timerManager.start('handleParsedItemTxt');
215
+ timerAccumulator.handleParsedItemTranscript = timerManager_1.timerManager.end('handleParsedItemTranscript', preventTimerLog) + timerAccumulator.handleParsedItemTranscript;
216
+ timerManager_1.timerManager.start('handleParsedItemTxt');
216
217
  yield (0, itemTxt_1.handleParsedItemTxt)(parsedItem, item, transactionalEntityManager);
217
- timerAccumulator.handleParsedItemTxt = podverse_helpers_1.timerManager.end('handleParsedItemTxt', preventTimerLog) + timerAccumulator.handleParsedItemTxt;
218
- podverse_helpers_1.timerManager.start('handleParsedItemValue');
218
+ timerAccumulator.handleParsedItemTxt = timerManager_1.timerManager.end('handleParsedItemTxt', preventTimerLog) + timerAccumulator.handleParsedItemTxt;
219
+ timerManager_1.timerManager.start('handleParsedItemValue');
219
220
  yield (0, itemValue_1.handleParsedItemValue)(parsedItem, item, channel, transactionalEntityManager);
220
- timerAccumulator.handleParsedItemValue = podverse_helpers_1.timerManager.end('handleParsedItemValue', preventTimerLog) + timerAccumulator.handleParsedItemValue;
221
+ timerAccumulator.handleParsedItemValue = timerManager_1.timerManager.end('handleParsedItemValue', preventTimerLog) + timerAccumulator.handleParsedItemValue;
221
222
  return item;
222
223
  });
223
224
  exports.handleParsedItem = handleParsedItem;
@@ -1 +1 @@
1
- {"version":3,"file":"liveItem.d.ts","sourceRoot":"","sources":["../../../../src/lib/rss/liveItem/liveItem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AAEpF,OAAO,EAA0B,OAAO,EAAE,kBAAkB,EAA0F,MAAM,cAAc,CAAC;AAM3K,MAAM,MAAM,2BAA2B,GAAG;IACxC,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAyDF,eAAO,MAAM,qBAAqB,GAChC,iBAAiB,qBAAqB,EAAE,EACxC,SAAS,OAAO,EAChB,oBAAoB,kBAAkB,KACrC,OAAO,CAAC,2BAA2B,CAsCrC,CAAC"}
1
+ {"version":3,"file":"liveItem.d.ts","sourceRoot":"","sources":["../../../../src/lib/rss/liveItem/liveItem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AAEpF,OAAO,EAA0B,OAAO,EAAE,kBAAkB,EAA0F,MAAM,cAAc,CAAC;AAO3K,MAAM,MAAM,2BAA2B,GAAG;IACxC,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AA2DF,eAAO,MAAM,qBAAqB,GAChC,iBAAiB,qBAAqB,EAAE,EACxC,SAAS,OAAO,EAChB,oBAAoB,kBAAkB,KACrC,OAAO,CAAC,2BAA2B,CAsCrC,CAAC"}
@@ -12,11 +12,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.handleParsedLiveItems = void 0;
13
13
  const podverse_helpers_1 = require("podverse-helpers");
14
14
  const podverse_orm_1 = require("podverse-orm");
15
- const config_1 = require("@parser/config");
16
15
  const liveItem_1 = require("@parser/lib/compat/partytime/liveItem");
17
16
  const item_1 = require("@parser/lib/rss/item/item");
18
17
  const itemFlagStatus_1 = require("podverse-orm/dist/entities/item/itemFlagStatus");
19
- const processLiveItemBatch = (liveItemObjDtosBatch, channel, channelSeasonIndex, existingLiveItemMap, updatedLiveItemIds, newItemGuids, transactionalEntityManager, timerAccumulator, liveItemService) => __awaiter(void 0, void 0, void 0, function* () {
18
+ const timerManager_1 = require("@parser/factories/timerManager");
19
+ const loggerService_1 = require("@parser/factories/loggerService");
20
+ const processLiveItemBatch = (liveItemObjDtosBatch, channel, channelSeasonIndex, existingLiveItemMap, updatedLiveItemIds, newItemGuids,
21
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
+ transactionalEntityManager,
23
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
+ timerAccumulator, liveItemService) => __awaiter(void 0, void 0, void 0, function* () {
20
25
  for (const liveItemObjDto of liveItemObjDtosBatch) {
21
26
  const itemDto = liveItemObjDto.item;
22
27
  const item = yield (0, item_1.handleParsedItem)({
@@ -39,9 +44,9 @@ const processLiveItemBatch = (liveItemObjDtosBatch, channel, channelSeasonIndex,
39
44
  }
40
45
  });
41
46
  const logTimerAccumulator = (timerAccumulator) => {
42
- if (config_1.config.shouldLogTimer) {
47
+ if (timerManager_1.timerManager.shouldLogTimer) {
43
48
  Object.entries(timerAccumulator).forEach(([key, value]) => {
44
- podverse_helpers_1.logger.info(`${key} took ${value}ms`);
49
+ loggerService_1.loggerService.info(`${key} took ${value}ms`);
45
50
  });
46
51
  }
47
52
  };
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/lib/rss/parser.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,kBAAkB,GAAU,KAAK,MAAM,oDASnD,CAAC;AAQF,eAAO,MAAM,6BAA6B,GAAU,KAAK,MAAM,EAAE,kBAAkB,MAAM,kBA6ExF,CAAC"}
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/lib/rss/parser.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,kBAAkB,GAAU,KAAK,MAAM,oDAUnD,CAAC;AAQF,eAAO,MAAM,6BAA6B,GAAU,KAAK,MAAM,EAAE,kBAAkB,MAAM,kBAsFxF,CAAC"}
@@ -11,10 +11,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.parseRSSFeedAndSaveToDatabase = exports.getAndParseRSSFeed = void 0;
13
13
  const podcast_partytime_1 = require("podcast-partytime");
14
- const podverse_external_services_1 = require("podverse-external-services");
15
14
  const podverse_helpers_1 = require("podverse-helpers");
16
15
  const podverse_orm_1 = require("podverse-orm");
17
- const config_1 = require("@parser/config");
18
16
  const notifications_1 = require("@parser/lib/notifications");
19
17
  const channel_1 = require("@parser/lib/rss/channel/channel");
20
18
  const channelSeason_1 = require("@parser/lib/rss/channel/channelSeason");
@@ -22,13 +20,19 @@ const feed_1 = require("@parser/lib/rss/feed/feed");
22
20
  const item_1 = require("@parser/lib/rss/item/item");
23
21
  const liveItem_1 = require("@parser/lib/rss/liveItem/liveItem");
24
22
  const remoteItemParser_1 = require("@parser/lib/rss/remoteItemParser");
23
+ const errors_1 = require("./errors");
24
+ const timerManager_1 = require("@parser/factories/timerManager");
25
+ const loggerService_1 = require("@parser/factories/loggerService");
26
+ const firebaseAccessTokenService_1 = require("@parser/factories/firebaseAccessTokenService");
27
+ const notificationsService_1 = require("@parser/factories/notificationsService");
25
28
  /*
26
29
  NOTE: All RSS feeds that have a podcast_index_id will be saved to the database.
27
30
  RSS feeds without podcast_index_id (Add By RSS feeds) will NOT be saved to the database.
28
31
  */
29
32
  const getAndParseRSSFeed = (url) => __awaiter(void 0, void 0, void 0, function* () {
30
- const xml = yield (0, podverse_helpers_1.request)(url);
31
- const parsedFeed = (0, podcast_partytime_1.parseFeed)(xml, { allowMissingGuid: true });
33
+ const response = yield (0, podverse_helpers_1.request)(url);
34
+ const data = response.data;
35
+ const parsedFeed = (0, podcast_partytime_1.parseFeed)(data, { allowMissingGuid: true });
32
36
  if (!parsedFeed) {
33
37
  throw new Error(`getAndParseRSSFeed: parsedFeed not found for ${url}`);
34
38
  }
@@ -45,9 +49,12 @@ const parseRSSFeedAndSaveToDatabase = (url, podcast_index_id) => __awaiter(void
45
49
  let feed = null;
46
50
  let channel = null;
47
51
  const timerFullRunLabel = `parseRSSFeedAndSaveToDatabase ${url} ${podcast_index_id}`;
48
- podverse_helpers_1.timerManager.start(timerFullRunLabel);
52
+ timerManager_1.timerManager.start(timerFullRunLabel);
49
53
  try {
50
- podverse_helpers_1.logger.info(`parseRSSFeedAndSaveToDatabase ${url} ${podcast_index_id}`);
54
+ if (!url || !podcast_index_id) {
55
+ throw new Error(`parseRSSFeedAndSaveToDatabase: url or podcast_index_id is missing for ${url} ${podcast_index_id}`);
56
+ }
57
+ loggerService_1.loggerService.info(`parseRSSFeedAndSaveToDatabase ${url} ${podcast_index_id}`);
51
58
  feed = yield (0, feed_1.handleGetRSSFeed)(url, podcast_index_id);
52
59
  if (!(0, podverse_orm_1.checkIfFeedFlagStatusShouldParse)(feed.feed_flag_status.id)) {
53
60
  throw new Error(`parseRSSFeedAndSaveToDatabase: feed_flag_status.status is not Active or AlwaysAllow for ${feed.id} ${feed.channel.podcast_index_id} ${feed.url}`);
@@ -65,15 +72,16 @@ const parseRSSFeedAndSaveToDatabase = (url, podcast_index_id) => __awaiter(void
65
72
  const channelSeasonService = new podverse_orm_1.ChannelSeasonService();
66
73
  const channelSeasonIndex = yield channelSeasonService.getChannelSeasonIndex(channel);
67
74
  yield (0, channel_1.handleParsedChannel)(parsedFeed, channel, channelSeasonIndex);
68
- podverse_helpers_1.logger.info(`item count: ${parsedFeed.items.length}`);
75
+ loggerService_1.loggerService.info(`item count: ${parsedFeed.items.length}`);
69
76
  const newItemIdentifiers = yield (0, item_1.handleParsedItems)(parsedFeed.items, channel, channelSeasonIndex);
70
77
  let newLiveItemIdentifiers = { newItemGuids: [] };
71
78
  if (parsedFeed.podcastLiveItems) {
72
79
  newLiveItemIdentifiers = yield (0, liveItem_1.handleParsedLiveItems)(parsedFeed.podcastLiveItems, channel, channelSeasonIndex);
73
80
  }
74
81
  if (newItemIdentifiers.newItemGuids.length > 0 || newLiveItemIdentifiers.newItemGuids.length > 0) {
75
- const googleAuthToken = yield (0, podverse_external_services_1.firebaseGenerateAccessToken)();
76
- const notificationsService = new podverse_external_services_1.NotificationsService({ googleAuthToken });
82
+ const firebaseAccessTokenService = (0, firebaseAccessTokenService_1.firebaseAccessTokenServiceFactory)();
83
+ const googleAuthToken = yield firebaseAccessTokenService.generateAccessToken();
84
+ const notificationsService = (0, notificationsService_1.NotificationsServiceFactory)(googleAuthToken);
77
85
  const accountFCMDeviceService = new podverse_orm_1.AccountFCMDeviceService();
78
86
  const itemService = new podverse_orm_1.ItemService();
79
87
  if (newItemIdentifiers.newItemGuids.length > 0) {
@@ -87,18 +95,25 @@ const parseRSSFeedAndSaveToDatabase = (url, podcast_index_id) => __awaiter(void
87
95
  yield feedLogService.update(feed, { last_finished_parse_time: new Date() });
88
96
  }
89
97
  catch (error) {
90
- (0, podverse_helpers_1.logError)('parseRSSFeedAndSaveToDatabase', error);
98
+ if (error instanceof errors_1.FeedIsParsingError) {
99
+ loggerService_1.loggerService.warn(`Feed ${feed === null || feed === void 0 ? void 0 : feed.id} is already parsing.`);
100
+ }
101
+ else if (error instanceof errors_1.FeedNoChangesSinceLastParsedError) {
102
+ loggerService_1.loggerService.warn(`Feed ${feed === null || feed === void 0 ? void 0 : feed.id} has no changes since last parsed.`);
103
+ }
104
+ else {
105
+ // TODO: Handle other errors
106
+ loggerService_1.loggerService.logError('parseRSSFeedAndSaveToDatabase', error);
107
+ }
91
108
  }
92
109
  finally {
93
- podverse_helpers_1.timerManager.endAll();
110
+ timerManager_1.timerManager.endAll();
94
111
  if (feed) {
95
112
  yield feedService.update(feed.id, { is_parsing: null });
96
113
  }
97
114
  }
98
- if (config_1.config.nodeEnv === 'production') {
99
- if (channel) {
100
- yield (0, remoteItemParser_1.handleAllRemoteItemsFeedParsing)(channel);
101
- }
115
+ if (channel) {
116
+ yield (0, remoteItemParser_1.handleAllRemoteItemsFeedParsing)(channel);
102
117
  }
103
118
  return;
104
119
  });
@@ -1 +1 @@
1
- {"version":3,"file":"remoteItemParser.d.ts","sourceRoot":"","sources":["../../../src/lib/rss/remoteItemParser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EACsD,MAAM,cAAc,CAAC;AAoD3F,eAAO,MAAM,+BAA+B,GAAU,SAAS,OAAO,kBAOrE,CAAC"}
1
+ {"version":3,"file":"remoteItemParser.d.ts","sourceRoot":"","sources":["../../../src/lib/rss/remoteItemParser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EACsD,MAAM,cAAc,CAAC;AAqD3F,eAAO,MAAM,+BAA+B,GAAU,SAAS,OAAO,kBAOrE,CAAC"}
@@ -14,6 +14,7 @@ const podverse_helpers_1 = require("podverse-helpers");
14
14
  const podverse_orm_1 = require("podverse-orm");
15
15
  const podcastIndex_1 = require("@parser/factories/podcastIndex");
16
16
  const parser_1 = require("@parser/lib/rss/parser");
17
+ const loggerService_1 = require("@parser/factories/loggerService");
17
18
  function handleRequestDelay(url) {
18
19
  return __awaiter(this, void 0, void 0, function* () {
19
20
  const delayConfig = [
@@ -34,7 +35,7 @@ const handleRemoteItemsFeedParsing = (feedGuidsToParse) => __awaiter(void 0, voi
34
35
  const feedService = new podverse_orm_1.FeedService();
35
36
  const pvExistingFeed = yield feedService.getByPodcastGuid(feedGuid);
36
37
  if (!pvExistingFeed) {
37
- const piFeedDataResponse = yield podcastIndex_1.podcastIndexService.getPodcastByGuid(feedGuid);
38
+ const piFeedDataResponse = yield podcastIndex_1.podcastIndexService.podcastGetByGuid(feedGuid);
38
39
  if (((_a = piFeedDataResponse === null || piFeedDataResponse === void 0 ? void 0 : piFeedDataResponse.feed) === null || _a === void 0 ? void 0 : _a.id) && ((_b = piFeedDataResponse === null || piFeedDataResponse === void 0 ? void 0 : piFeedDataResponse.feed) === null || _b === void 0 ? void 0 : _b.url)) {
39
40
  const piFeedData = {
40
41
  id: piFeedDataResponse.feed.id,
@@ -49,7 +50,7 @@ const handleRemoteItemsFeedParsing = (feedGuidsToParse) => __awaiter(void 0, voi
49
50
  let feed = yield feedService.getByUrlAndPodcastIndexId({ url: piFeedData.url, podcast_index_id: piFeedData.id });
50
51
  if (!feed) {
51
52
  yield handleRequestDelay(piFeedData.url);
52
- podverse_helpers_1.logger.info(`handleRemoteItemsFeedParsing: ${piFeedData.url} ${piFeedData.id}`);
53
+ loggerService_1.loggerService.info(`handleRemoteItemsFeedParsing: ${piFeedData.url} ${piFeedData.id}`);
53
54
  yield (0, parser_1.parseRSSFeedAndSaveToDatabase)(piFeedData.url, piFeedData.id);
54
55
  }
55
56
  }