From 934e06e44e6e0440f6194391844071f5f4e6cf62 Mon Sep 17 00:00:00 2001 From: chocolateboy Date: Mon, 10 May 2021 21:06:29 +0000 Subject: [PATCH 1/9] Fix documentation typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index eade643..b5a75a8 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ var parseVideo = require("video-name-parser"); parseVideo("south park s01e01.avi"); // { name: "south park", season: 1, episode: [1], type: "series", tag: [] } parseVideo("south park s01e01e02.avi"); // { name: "south park", season: 1, episode: [1,2], type: "series", tag: [] } parseVideo("The.Wizard.of.Oz.1939.1080p.BrRip.x264.mp4"); // { name: "wizard of oz", year: 1939, type: "movie", tag: [ "hd", "1080p" ] } -parseVideo("something else.mp4"); // { name: "other" } // no year or season/ep found, assuming 'other' +parseVideo("something else.mp4"); // { type: "other" } // no year or season/ep found, assuming 'other' ``` ## Returned properties From d907d7c8e798dafc1e99f0d9fb6847d6723dd70d Mon Sep 17 00:00:00 2001 From: chocolateboy Date: Sat, 5 Jun 2021 16:47:18 +0000 Subject: [PATCH 2/9] Fix documentation typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b5a75a8..33f085b 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Parse names of video files to identify quality (e.g. 1080p), season/episode, yea var parseVideo = require("video-name-parser"); parseVideo("south park s01e01.avi"); // { name: "south park", season: 1, episode: [1], type: "series", tag: [] } parseVideo("south park s01e01e02.avi"); // { name: "south park", season: 1, episode: [1,2], type: "series", tag: [] } -parseVideo("The.Wizard.of.Oz.1939.1080p.BrRip.x264.mp4"); // { name: "wizard of oz", year: 1939, type: "movie", tag: [ "hd", "1080p" ] } +parseVideo("The.Wizard.of.Oz.1939.1080p.BrRip.x264.mp4"); // { name: "the wizard of oz", year: 1939, type: "movie", tag: [ "hd", "1080p" ] } parseVideo("something else.mp4"); // { type: "other" } // no year or season/ep found, assuming 'other' ``` From 15b8c3b7dac5214d7fd69157bc6ff7109c93725c Mon Sep 17 00:00:00 2001 From: Sahin Deniz Date: Tue, 5 Mar 2024 22:18:34 +0300 Subject: [PATCH 3/9] Episode name expression fix --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 49ac095..6162acf 100644 --- a/index.js +++ b/index.js @@ -104,7 +104,7 @@ function parseVideoName(filePath, options) meta.season = parseInt(seasonMatch[1], 10); /* TODO: consider the case when a hyphen is used for multiple episodes ; e.g. e1-3 */ - var episodeMatch = x.match(/E(\d{2})/ig); + var episodeMatch = x.match(/(?<=\W|\d)E(\d{2})/ig); if (episodeMatch) meta.episode = episodeMatch.map(function(y) { return parseInt(y.slice(1), 10) }); From 11066029244c759e482f6e3753ab322c452fdf4b Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Tue, 5 Mar 2024 22:20:40 +0200 Subject: [PATCH 4/9] 1.4.7 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index b54fcc4..6f39816 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "video-name-parser", - "version": "1.4.6", + "version": "1.4.7", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 58d3c0e..a0ae857 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "video-name-parser", - "version": "1.4.6", + "version": "1.4.7", "description": "Parse names of video files to identify quality (e.g. 1080p), season/episode, year, etc.", "main": "index.js", "scripts": { From 8fe724db0c78fd4b16b4286d1825736de6adc781 Mon Sep 17 00:00:00 2001 From: Joelacus Date: Tue, 2 Apr 2024 03:46:47 +0100 Subject: [PATCH 5/9] Updated Readme --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a5d6053..78f2cf7 100644 --- a/README.md +++ b/README.md @@ -26,10 +26,12 @@ parseVideo("something else.mp4"); // { type: "other" } // no year or season/ep f **extra** - optional ```{ extra: true }``` ``` { - resolution: [ '1080p' ], - audio: ['dts-hd'], - codec: [ 'x264' ], + resolution: ['1080p'], + audioCodec: ['dts-hd'], + videoCodec: ['x264'], + hdr: ['10bit'], lowQualitySrc: [], - highQualitySrc: [ 'brrip' ] + highQualitySrc: ['brrip'], + container: ['mkv'] } ``` From f419ec2ef592af1a084cc715ff3e4cbd1d000cec Mon Sep 17 00:00:00 2001 From: Joelacus Date: Tue, 2 Apr 2024 03:47:43 +0100 Subject: [PATCH 6/9] 2.1.0 --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 755094e..58724eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "video-name-parser", - "version": "2.0.0", + "version": "2.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { From e0067e1faf80758ed304fa937fbc83bc209028b6 Mon Sep 17 00:00:00 2001 From: Joelacus Date: Tue, 2 Apr 2024 03:48:22 +0100 Subject: [PATCH 7/9] 2.1.0 and fixed a typo --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 52eff5b..eb44888 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "video-name-parser", - "version": "2.0.0", + "version": "2.1.0", "description": "Parse names of video files to identify quality (e.g. 1080p), season/episode, year, etc.", "main": "index.js", "scripts": { @@ -16,7 +16,7 @@ "keywords": [ "parsing", "video", - "naem" + "name" ], "author": "Ivo Georgiev (http://ivogeorgiev.com)", "license": "MIT", From 0bba07b355bffdd80b5ea3500bd4854d747ad2e4 Mon Sep 17 00:00:00 2001 From: Joelacus Date: Tue, 2 Apr 2024 03:56:13 +0100 Subject: [PATCH 8/9] Updated audio and video codecs, and added hdr and container keywords --- keywords.js | 75 ++++++++++++++++++++++++++++------------------------- 1 file changed, 40 insertions(+), 35 deletions(-) diff --git a/keywords.js b/keywords.js index 7b04459..2c61569 100644 --- a/keywords.js +++ b/keywords.js @@ -1,35 +1,40 @@ -'use strict ' - -var keywordType = { - none: 0, - resolution: 1, - audio: 2, - codec: 3, - lowQualitySrc: 4, - highQualitySrc: 5, -} - -var resolutionKeywords = ['1080p', '1080i', '1920x1080', '720p', '720i', '480p', '480i', '1440p', '1440i', '2k', '2160p', '2160i', '3840x2160', '4k']; - -var codecKeywords = ['divx', 'xvid', 'x264', 'x265', 'h264', 'hevc', 'avchd']; - -var audioKeywords = ['dts', 'dts-hd', 'acc', 'aac2.0', 'aac 2.0', 'mp3', 'wav', 'truehd', 'ac3', 'ac-3', 'atmos', 'dtsma', 'dolby', 'dolbydigital', 'dolby-digital', 'eac3']; - -var lowQualityReleaseKeywords = ['camrip', 'cam', 'ts', 'hdts', 'telesync', 'pdvd', 'predvdrip', 'wp', 'workprint', 'tc', 'hdtc', 'telecine', - 'src', 'screener', 'dvdscr', 'dvdscreener', 'bdscr', 'ddc', 'r5']; - -var highQualityReleaseKeywords = ['ppv', 'ppvrip', 'dvdrip', 'dvdmux', 'dvdr', 'dvd-full', 'full-rip', 'iso rip', 'lossless rip', 'untouched rip', 'dvd-5', 'dvd-9', 'dsr', - 'dsrip', 'satrip', 'dthrip', 'dvbrip', 'hdtv', 'pdtv', 'dtvrip', 'tvrip', 'hdtvrip', 'vodrip', 'vodr', 'webdl', 'web dl', 'web-dl', 'web', 'hdrip', 'web-dlrip', 'webrip', - 'web-cap', 'webcap', 'web cap', 'blu-ray', 'bluray', 'bdrip', 'bdrip', 'brrip', 'bdmv', 'bdr', 'bd25', 'bd50', 'bd5', 'bd9', 'ultrahd', 'remux']; - -var allKeywords = resolutionKeywords.concat(codecKeywords).concat(audioKeywords).concat(lowQualityReleaseKeywords).concat(highQualityReleaseKeywords) - -module.exports = { - keywordType: keywordType, - resolutionKeywords: resolutionKeywords, - codecKeywords: codecKeywords, - audioKeywords: audioKeywords, - lowQualityReleaseKeywords: lowQualityReleaseKeywords, - highQualityReleaseKeywords: highQualityReleaseKeywords, - allKeywords: allKeywords -} \ No newline at end of file +'use strict ' + +var keywordType = { + none: 0, + resolution: 1, + audioCodec: 2, + videoCodec: 3, + lowQualitySrc: 4, + highQualitySrc: 5, + hdr: 6, + container: 7, +} + +var resolutionKeywords = ['1080p', '1080i', '1920x1080', '720p', '720i', '480p', '480i', '1440p', '1440i', '2k', '2160p', '2160i', '3840x2160', '4k']; + +var audioCodecKeywords = ['dts', 'dts-hd', 'acc', 'aac2.0', 'aac 2.0', 'mp3', 'wav', 'truehd', 'ac3', 'ac-3', 'atmos', 'dtsma', 'dolby', 'dolbydigital', 'dolby-digital', 'eac3', '6ch', 'dd5.1', 'dd 5.1', 'ddp5.1','ddp 5.1', 'aac5.1', 'aac 5.1']; + +var videoCodecKeywords = ['divx', 'xvid', 'rv10', 'rv13', 'rv20', 'rv30', 'rv40', 'mpeg', 'mpeg2', 'mpeg-2', 'mpg2', 'h262', 'h.262', 'x262', 'xmpeg2', 'mpeg2x', 'mpeg4', 'h263', 'h.263', 'x263', 'h264', 'h.264', 'x264', 'h265', 'h.265', 'x265', 'hevc', 'avchd', 'av1']; + +var hdrKeywords = ['hdr', 'hdr10plus', '10bit', '10bits', 'hevc10', 'yuv420p10'] + +var lowQualityReleaseKeywords = ['camrip', 'cam', 'hqcam', 'ts', 'hdts', 'telesync', 'pdvd', 'predvdrip', 'wp', 'workprint', 'tc', 'hdtc', 'telecine', 'src', 'screener', 'dvdscr', 'dvdscreener', 'bdscr', 'ddc', 'r5', 'vhs', 'vhsrip']; + +var highQualityReleaseKeywords = ['ppv', 'ppvrip', 'dvdrip', 'dvdmux', 'dvdr', 'dvd-full', 'full-rip', 'iso rip', 'lossless rip', 'untouched rip', 'dvd-5', 'dvd-9', 'dsr', 'dsrip', 'satrip', 'dthrip', 'dvbrip', 'hdtv', 'pdtv', 'dtvrip', 'tvrip', 'hdtvrip', 'vodrip', 'vodr', 'webdl', 'web dl', 'web-dl', 'web', 'hdrip', 'web-dlrip', 'webrip', 'web-cap', 'webcap', 'web cap', 'blu-ray', 'bluray', 'bdrip', 'bdrip', 'brrip', 'bdmv', 'bdr', 'bd25', 'bd50', 'bd5', 'bd9', 'ultrahd', 'remux', 'uhd']; + +var containerKeywords = ['mkv', 'mp4', 'avi'] + +var allKeywords = resolutionKeywords.concat(audioCodecKeywords).concat(videoCodecKeywords).concat(hdrKeywords).concat(lowQualityReleaseKeywords).concat(highQualityReleaseKeywords).concat(containerKeywords) + +module.exports = { + keywordType: keywordType, + resolutionKeywords: resolutionKeywords, + audioCodecKeywords: audioCodecKeywords, + videoCodecKeywords: videoCodecKeywords, + hdrKeywords: hdrKeywords, + lowQualityReleaseKeywords: lowQualityReleaseKeywords, + highQualityReleaseKeywords: highQualityReleaseKeywords, + containerKeywords: containerKeywords, + allKeywords: allKeywords +} From a96ac722b1526ef34d7e615bf41b992744920c82 Mon Sep 17 00:00:00 2001 From: Joelacus Date: Tue, 2 Apr 2024 03:57:57 +0100 Subject: [PATCH 9/9] Added hdr and container keywords --- extra.js | 186 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 98 insertions(+), 88 deletions(-) diff --git a/extra.js b/extra.js index 49c8af3..073984f 100644 --- a/extra.js +++ b/extra.js @@ -1,88 +1,98 @@ -'use strict ' - -var { - keywordType, - resolutionKeywords, - codecKeywords, - audioKeywords, - lowQualityReleaseKeywords, - highQualityReleaseKeywords, - allKeywords -} = require('./keywords') - -// chars without escaping: [](). -;,_/\+ -var separatorChars = '([\\[\\](). \\-;,_\\/\\\\+])' -// NOTE: Needs node ^8.10.0 V8 > 6.2 to work with lookbehind ?<= -var leftBoundary = '(^|(?<=' + separatorChars + '{1}))' -var rightBoundary = '((?=' + separatorChars + '{1})|$)' - -var allKeywordsPattern = '(' + allKeywords.join('|') + ')' -var allKeywordsRegEx = new RegExp(leftBoundary + allKeywordsPattern + rightBoundary, 'gi') - -var keywordsWithType = (function () { - var allKeywordsObj = {} - - function addToAllKeywords(arr, type) { - return arr.forEach(element => { - allKeywordsObj[element] = type - }) - } - - addToAllKeywords(resolutionKeywords, keywordType.resolution) - addToAllKeywords(codecKeywords, keywordType.codec) - addToAllKeywords(audioKeywords, keywordType.audio) - addToAllKeywords(lowQualityReleaseKeywords, keywordType.lowQualitySrc) - addToAllKeywords(highQualityReleaseKeywords, keywordType.highQualitySrc) - - return allKeywordsObj -}()) - -function pushUniqueToArray(arr, val) { - if (arr.indexOf(val) < 0) { - arr.push(val) - } -} - -function getExtra(filePath) { - var extraData = { resolution: [], audio: [], codec: [], lowQualitySrc: [], highQualitySrc: [], } - - if (!filePath - || (typeof filePath !== 'string')) { - return extraData - } - - var match = filePath.match(allKeywordsRegEx) - - if (match) - match.reduce(function (extra, m) { - m = m.toLowerCase() - switch (keywordsWithType[m]) { - case keywordType.resolution: - pushUniqueToArray(extra.resolution, m) - break; - case keywordType.audio: - pushUniqueToArray(extra.audio, m) - break; - case keywordType.codec: - pushUniqueToArray(extra.codec, m) - break; - case keywordType.lowQualitySrc: - pushUniqueToArray(extra.lowQualitySrc, m) - break; - case keywordType.highQualitySrc: - pushUniqueToArray(extra.highQualitySrc, m) - break; - default: - break; - } - - return extra - - }, extraData) - - return extraData -} - -module.exports = { - getExtra: getExtra -} \ No newline at end of file +'use strict ' + +var { + keywordType, + resolutionKeywords, + audioCodecKeywords, + videoCodecKeywords, + hdrKeywords, + lowQualityReleaseKeywords, + highQualityReleaseKeywords, + containerKeywords, + allKeywords +} = require('./keywords') + +// chars without escaping: [](). -;,_/\+ +var separatorChars = '([\\[\\](). \\-;,_\\/\\\\+])' +// NOTE: Needs node ^8.10.0 V8 > 6.2 to work with lookbehind ?<= +var leftBoundary = '(^|(?<=' + separatorChars + '{1}))' +var rightBoundary = '((?=' + separatorChars + '{1})|$)' + +var allKeywordsPattern = '(' + allKeywords.join('|') + ')' +var allKeywordsRegEx = new RegExp(leftBoundary + allKeywordsPattern + rightBoundary, 'gi') + +var keywordsWithType = (function () { + var allKeywordsObj = {} + + function addToAllKeywords(arr, type) { + return arr.forEach(element => { + allKeywordsObj[element] = type + }) + } + + addToAllKeywords(resolutionKeywords, keywordType.resolution) + addToAllKeywords(audioCodecKeywords, keywordType.audioCodec) + addToAllKeywords(videoCodecKeywords, keywordType.videoCodec) + addToAllKeywords(hdrKeywords, keywordType.hdr) + addToAllKeywords(lowQualityReleaseKeywords, keywordType.lowQualitySrc) + addToAllKeywords(highQualityReleaseKeywords, keywordType.highQualitySrc) + addToAllKeywords(containerKeywords, keywordType.container) + + return allKeywordsObj +}()) + +function pushUniqueToArray(arr, val) { + if (arr.indexOf(val) < 0) { + arr.push(val) + } +} + +function getExtra(filePath) { + var extraData = { resolution: [], audioCodec: [], videoCodec: [], hdr: [], lowQualitySrc: [], highQualitySrc: [], container: []} + + if (!filePath + || (typeof filePath !== 'string')) { + return extraData + } + + var match = filePath.match(allKeywordsRegEx) + + if (match) + match.reduce(function (extra, m) { + m = m.toLowerCase() + switch (keywordsWithType[m]) { + case keywordType.resolution: + pushUniqueToArray(extra.resolution, m) + break; + case keywordType.audioCodec: + pushUniqueToArray(extra.audioCodec, m) + break; + case keywordType.videoCodec: + pushUniqueToArray(extra.videoCodec, m) + break; + case keywordType.hdr: + pushUniqueToArray(extra.hdr, m) + break; + case keywordType.lowQualitySrc: + pushUniqueToArray(extra.lowQualitySrc, m) + break; + case keywordType.highQualitySrc: + pushUniqueToArray(extra.highQualitySrc, m) + break; + case keywordType.container: + pushUniqueToArray(extra.container, m) + break; + default: + break; + } + + return extra + + }, extraData) + + return extraData +} + +module.exports = { + getExtra: getExtra +}