diff --git a/addon/addon.js b/addon/addon.js index 314499e..fd04b7d 100644 --- a/addon/addon.js +++ b/addon/addon.js @@ -82,9 +82,9 @@ function filterByProvider(streams, providers) { return streams; } return streams.filter(stream => { - const parts = stream.title.split('\n'); - const provider = parts[parts.length - 2].match(/\w+$/)[0]; - return providers.includes(provider.toLowerCase()); + const match = stream.title.match(/[🛈⚙].* ([^ \n]+)/); + const provider = match && match[1].toLowerCase(); + return providers.includes(provider); }) } diff --git a/addon/lib/languages.js b/addon/lib/languages.js new file mode 100644 index 0000000..21d42e6 --- /dev/null +++ b/addon/lib/languages.js @@ -0,0 +1,45 @@ +const languageMapping = { + 'dubbed': 'Dubbed', + 'multi': 'Multi', + 'english': '🇬🇧', + 'japanese': '🇯🇵', + 'korean': '🇰🇷', + 'chinese': '🇨🇳', + 'french': '🇫🇷', + 'german': '🇩🇪', + 'dutch': '🇳🇱', + 'portuguese': '🇵🇹', + 'spanish': '🇪🇸', + 'italian': '🇮🇹', + 'russian': '🇷🇺', + 'hindi': '🇮🇳', + 'telugu': '🇮🇳', + 'tamil': '🇮🇳', + 'polish': '🇵🇱', + 'lithuanian': '🇱🇹', + 'czech': '🇨🇿', + 'hungarian': '🇭🇺', + 'romanian': '🇷🇴', + 'croatian': '🇭🇷', + 'greek': '🇬🇷', + 'danish': '🇩🇰', + 'finnish': '🇫🇮', + 'swedish': '🇸🇪', + 'norwegian': '🇳🇴', + 'turkish': '🇹🇷', + 'arabic': '🇸🇦', + 'hebrew': '🇮🇱' +} + +function mapLanguages(languages) { + const mapped = languages + .map(language => languageMapping[language]) + .filter(language => language) + .sort((a, b) => Object.values(languageMapping).indexOf(a) - Object.values(languageMapping).indexOf(b)); + const unmapped = languages + .filter(language => !languageMapping[language]) + .sort((a, b) => a.localeCompare(b)) + return [...new Set([].concat(mapped).concat(unmapped))]; +} + +module.exports = { mapLanguages } \ No newline at end of file diff --git a/addon/lib/streamInfo.js b/addon/lib/streamInfo.js index 656b6a9..5fa0459 100644 --- a/addon/lib/streamInfo.js +++ b/addon/lib/streamInfo.js @@ -1,4 +1,6 @@ const titleParser = require('parse-torrent-title'); +const { Type } = require('./types'); +const { mapLanguages } = require('./languages'); const ADDON_NAME = 'Torrentio'; const UNKNOWN_SIZE = 300000000; @@ -12,8 +14,12 @@ function toStreamInfo(record) { [ joinDetailParts([record.torrent.title.replace(/[, ]+/g, ' ')]), joinDetailParts([!sameInfo && record.title.replace(/[, ]+/g, ' ') || undefined]), - joinDetailParts([formatSize(record.size), record.torrent.provider], '⚙️️ '), - joinDetailParts([record.torrent.seeders], '👤 ') + joinDetailParts([ + joinDetailParts([record.torrent.seeders], '👤 '), + joinDetailParts([formatSize(record.size)], '💾 '), + joinDetailParts([record.torrent.provider], '🛈 ') + ]), + joinDetailParts(getLanguages(record, torrentInfo, fileInfo), '', ' / '), ], '', '\n' @@ -21,7 +27,7 @@ function toStreamInfo(record) { const name = joinDetailParts( [ joinDetailParts([ADDON_NAME]), - joinDetailParts([getQuality(record, fileInfo, torrentInfo)]) + joinDetailParts([getQuality(record, torrentInfo, fileInfo)]) ], '', '\n' @@ -35,7 +41,7 @@ function toStreamInfo(record) { }; } -function getQuality(record, fileInfo, torrentInfo) { +function getQuality(record, torrentInfo, fileInfo) { const resolution = fileInfo.resolution || torrentInfo.resolution || record.torrent.resolution; const source = fileInfo.source || torrentInfo.source; if (['CAM', 'TeleSync'].includes(source)) { @@ -44,6 +50,24 @@ function getQuality(record, fileInfo, torrentInfo) { return resolution || source; } +function getLanguages(record, torrentInfo, fileInfo) { + const providerLanguages = record.torrent.languages && titleParser.parse(record.torrent.languages).languages || []; + const torrentLanguages = torrentInfo.languages || []; + let languages = [].concat(torrentLanguages).concat(providerLanguages); + if (record.kitsuId || record.torrent.type === Type.ANIME) { + const dubbed = torrentInfo.dubbed || fileInfo.dubbed || languages.includes('multi'); + // no need to display japanese for anime or english if anime is dubbed + languages = languages.concat(dubbed ? ['dubbed'] : []) + .filter(lang => lang !== 'japanese') + .filter(lang => dubbed && lang !== 'english' || !dubbed); + } + if (languages.length === 1 && languages.includes('english')) { + // no need to display languages if only english is present + languages = []; + } + return mapLanguages(languages); +} + function joinDetailParts(parts, prefix = '', delimiter = ' ') { const filtered = parts.filter((part) => part !== undefined && part !== null).join(delimiter); diff --git a/addon/package-lock.json b/addon/package-lock.json index 645260c..cf89f6b 100644 --- a/addon/package-lock.json +++ b/addon/package-lock.json @@ -1599,8 +1599,8 @@ } }, "parse-torrent-title": { - "version": "git://github.com/TheBeastLT/parse-torrent-title.git#f69da3adba502690dfdef8ab4f1d188f0d6077cb", - "from": "git://github.com/TheBeastLT/parse-torrent-title.git#f69da3adba502690dfdef8ab4f1d188f0d6077cb", + "version": "git://github.com/TheBeastLT/parse-torrent-title.git#86dc66fc3b05d798f400d3a457720890dced4901", + "from": "git://github.com/TheBeastLT/parse-torrent-title.git#86dc66fc3b05d798f400d3a457720890dced4901", "requires": { "moment": "^2.24.0" } diff --git a/addon/package.json b/addon/package.json index 887cf69..e0fe179 100644 --- a/addon/package.json +++ b/addon/package.json @@ -14,7 +14,7 @@ "named-queue": "^2.2.1", "needle": "^2.2.4", "magnet-uri": "^5.1.7", - "parse-torrent-title": "git://github.com/TheBeastLT/parse-torrent-title.git#f69da3adba502690dfdef8ab4f1d188f0d6077cb", + "parse-torrent-title": "git://github.com/TheBeastLT/parse-torrent-title.git#86dc66fc3b05d798f400d3a457720890dced4901", "pg": "^7.8.2", "pg-hstore": "^2.3.2", "real-debrid-api": "git://github.com/TheBeastLT/node-real-debrid.git#935a5c23ae809edbcd2a111526a7f74d6767c50d",