diff --git a/src/node/consumer/package.json b/src/node/consumer/package.json index 7ee62a4..d0fa58d 100644 --- a/src/node/consumer/package.json +++ b/src/node/consumer/package.json @@ -21,7 +21,7 @@ "cache-manager": "^5.4.0", "google-sr": "^3.2.1", "inversify": "^6.0.2", - "magnet-uri": "^7.0.5", + "magnet-uri": "^6.2.0", "moment": "^2.30.1", "name-to-imdb": "^3.0.4", "parse-torrent-title": "https://github.com/TheBeastLT/parse-torrent-title.git#022408972c2a040f846331a912a6a8487746a654", diff --git a/src/node/consumer/test/torrent_download_service.test.ts b/src/node/consumer/test/torrent_download_service.test.ts new file mode 100644 index 0000000..7b19925 --- /dev/null +++ b/src/node/consumer/test/torrent_download_service.test.ts @@ -0,0 +1,141 @@ +import "reflect-metadata"; // required +import { ILoggingService } from '@interfaces/logging_service'; +import {IParsedTorrent} from "@interfaces/parsed_torrent"; +import { TorrentDownloadService } from '@services/torrent_download_service'; +import torrentStream from 'torrent-stream'; + +jest.mock('@services/logging_service', () => { + return { + error: jest.fn(), + info: jest.fn(), + debug: jest.fn(), + } +}) + +jest.mock('torrent-stream', () => { + return jest.fn().mockImplementation(() => ({ + on: jest.fn(), + files: [], + destroy: jest.fn(), + })); +}); + +describe('TorrentDownloadService', () => { + let torrentDownloadService: TorrentDownloadService, + mockLoggingService: ILoggingService; + + beforeEach(() => { + mockLoggingService = jest.requireMock('@services/logging_service'); + torrentDownloadService = new TorrentDownloadService(mockLoggingService); + }); + + it('should get torrent files', async () => { + const mockTorrent: IParsedTorrent = { + size: 123456789, + isPack: false, + imdbId: 'tt1234567', + kitsuId: 1234, + trackers: 'http://tracker1.com,http://tracker2.com', + provider: 'provider1', + infoHash: '1234567890abcdef', + type: 'movie', + uploadDate: new Date(), + seeders: 100, + torrentId: 'torrent1', + fileCollection: { }, + title: 'Test Movie', + year: 2020, + season: 1, + episode: 1, + resolution: '1080p', + codec: 'H.264', + audio: 'AAC', + group: 'GRP', + extended: false, + hardcoded: false, + proper: false, + repack: false, + container: 'mp4', + unrated: false, + }; + + const mockFiles = [ + { + name: 'file1.mp4', + path: '/path/to/file1.mp4', + length: 123456789, + fileIndex: 0, + select: jest.fn(), + deselect: jest.fn(), + createReadStream: jest.fn(), + }, + { + name: 'file2.srt', + path: '/path/to/file2.srt', + length: 987654321, + fileIndex: 1, + select: jest.fn(), + deselect: jest.fn(), + createReadStream: jest.fn(), + }, + ]; + + + const mockEngine = { + on: jest.fn((event, callback) => { + if (event === 'ready') { + callback(); + } + }), + files: mockFiles, + destroy: jest.fn(), + connect: jest.fn(), + disconnect: jest.fn(), + block: jest.fn(), + remove: jest.fn(), + listen: jest.fn(), + swarm: { + downloaded: 2, + }, + infoHash: 'mockInfoHash', + }; + + (torrentStream as jest.MockedFunction).mockReturnValue(mockEngine); + + + const result = await torrentDownloadService.getTorrentFiles(mockTorrent); + + expect(result).toEqual({ + contents: mockFiles.map(file => ({ + path: file.path, + fileIndex: file.fileIndex, + infoHash: mockTorrent.infoHash, + size: file.length + })), + videos: mockFiles.filter(file => file.name.endsWith('.mp4')).map(file => ({ + fileIndex: file.fileIndex, + infoHash: mockTorrent.infoHash, + path: file.path, + size: file.length, + title: file.name.split('.')[0], + extension: file.name.split('.')[1], + container: file.name.split('.')[1], + imdbId: mockTorrent.imdbId, + imdbSeason: mockTorrent.season, + imdbEpisode: mockTorrent.episode, + kitsuId: mockTorrent.kitsuId, + kitsuEpisode: mockTorrent.episode, + })), + subtitles: mockFiles.filter(file => file.name.endsWith('.srt')).map(file => ({ + fileIndex: file.fileIndex, + infoHash: mockTorrent.infoHash, + path: file.path, + title: file.name, + fileId: file.fileIndex, + })), + }); + + expect(torrentStream).toHaveBeenCalledWith(expect.any(String), expect.any(Object)); + expect(mockLoggingService.debug).toHaveBeenCalledWith(`Adding torrent with infoHash ${mockTorrent.infoHash} to torrent engine...`); + }); +}); \ No newline at end of file diff --git a/src/node/consumer/yarn.lock b/src/node/consumer/yarn.lock index 393b538..1869770 100644 --- a/src/node/consumer/yarn.lock +++ b/src/node/consumer/yarn.lock @@ -978,13 +978,6 @@ dependencies: "@sinonjs/commons" "^3.0.0" -"@thaunknown/thirty-two@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@thaunknown/thirty-two/-/thirty-two-1.0.3.tgz#64883031c4444c0fd75436219189ab5816b5b826" - integrity sha512-bD6PvWbaf53JC04O7WnGDjqZBDgja/KT2Jd/6I2vJBIy+DLmQfQJZZ/G+16nAkVq1yGTIkO4rfc4RlH0DmEEqA== - dependencies: - uint8-util "^2.1.9" - "@tirke/node-cache-manager-mongodb@^1.6.0": version "1.6.0" resolved "https://registry.yarnpkg.com/@tirke/node-cache-manager-mongodb/-/node-cache-manager-mongodb-1.6.0.tgz#e730623ae53d4b3e6c6328baab0cff49ed6cb4ce" @@ -1580,11 +1573,6 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-arraybuffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" - integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== - base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -1605,10 +1593,10 @@ bencode@^2.0.0: resolved "https://registry.yarnpkg.com/bencode/-/bencode-2.0.3.tgz#89b9c80ea1b8573554915a7d0c15f62b0aa7fc52" integrity sha512-D/vrAD4dLVX23NalHwb8dSvsUsxeRPO8Y7ToKA015JQYq69MLDOMkC0uGZYA/MPpltLO8rt8eqFC2j8DxjTZ/w== -bep53-range@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bep53-range/-/bep53-range-2.0.0.tgz#a1770475661b4b814c4359e4b66f7cbd88de2b10" - integrity sha512-sMm2sV5PRs0YOVk0LTKtjuIprVzxgTQUsrGX/7Yph2Rm4FO2Fqqtq7hNjsOB5xezM4v4+5rljCgK++UeQJZguA== +bep53-range@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/bep53-range/-/bep53-range-1.1.1.tgz#20fd125b00a413254a77d42f63a43750ca7e64ac" + integrity sha512-ct6s33iiwRCUPp9KXnJ4QMWDgHIgaw36caK/5XEQ9L8dCzSQlJt1Vk6VmHh1VD4AlGCAI4C2zmtfItifBBPrhQ== binary-extensions@^2.0.0: version "2.2.0" @@ -4118,14 +4106,13 @@ magnet-uri@^4.0.0: thirty-two "^0.0.2" xtend "^4.0.0" -magnet-uri@^7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/magnet-uri/-/magnet-uri-7.0.5.tgz#7b5143fd5527f3f612959eeeae264d6f4aeff37b" - integrity sha512-Ke+dDiYHK1Rq/ZyGUAgk7NIkoypivxolTj/A0qr60ypP0FjeP+NTUNEhr965HsRan0zGxKEBK73+SsjRyJWkXg== +magnet-uri@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/magnet-uri/-/magnet-uri-6.2.0.tgz#10f7be050bf23452df210838239b118463c3eeff" + integrity sha512-O9AgdDwT771fnUj0giPYu/rACpz8173y8UXCSOdLITjOVfBenZ9H9q3FqQmveK+ORUMuD+BkKNSZP8C3+IMAKQ== dependencies: - "@thaunknown/thirty-two" "^1.0.3" - bep53-range "^2.0.0" - uint8-util "^2.1.9" + bep53-range "^1.1.0" + thirty-two "^1.0.2" make-dir@^4.0.0: version "4.0.0" @@ -5744,6 +5731,11 @@ thirty-two@^0.0.2: resolved "https://registry.yarnpkg.com/thirty-two/-/thirty-two-0.0.2.tgz#4253e29d8cb058f0480267c5698c0e4927e54b6a" integrity sha512-0j1A9eqbP8dSEtkqqEJGpYFN2lPgQR1d0qKS2KNAmIxkK6gV37D5hRa5b/mYzVL1fyAVWBkeUDIXybZdCLVBzA== +thirty-two@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/thirty-two/-/thirty-two-1.0.2.tgz#4ca2fffc02a51290d2744b9e3f557693ca6b627a" + integrity sha512-OEI0IWCe+Dw46019YLl6V10Us5bi574EvlJEOcAkB29IzQ/mYD1A6RyNHLjZPiHCmuodxvgF6U+vZO1L15lxVA== + thread-stream@^2.0.0: version "2.4.1" resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-2.4.1.tgz#6d588b14f0546e59d3f306614f044bc01ce43351" @@ -5983,13 +5975,6 @@ typescript@^5.3.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== -uint8-util@^2.1.9: - version "2.2.4" - resolved "https://registry.yarnpkg.com/uint8-util/-/uint8-util-2.2.4.tgz#4df57c7b25b821d02b1599e80f0f1f5f56bc90e1" - integrity sha512-uEI5lLozmKQPYEevfEhP9LY3Je5ZmrQhaWXrzTVqrLNQl36xsRh8NiAxYwB9J+2BAt99TRbmCkROQB2ZKhx4UA== - dependencies: - base64-arraybuffer "^1.0.2" - ultron@1.0.x: version "1.0.2" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa"