diff --git a/edge/src/names.rs b/edge/src/names.rs index f832e3c..f6c73da 100644 --- a/edge/src/names.rs +++ b/edge/src/names.rs @@ -759,7 +759,8 @@ static SIZE_AFTER_COUNTER: LazyLock = LazyLock::new(|| re(r"(\[[0-9]+/[0- /// A host and a sponsor in a subject's remainder (BOILERPLATE in lib/release/identity.ts). static BOILERPLATE: LazyLock = LazyLock::new(|| re(r"(?i)\(?\bwww(?: [A-Za-z0-9]+)*? (?:org|com|net|info|nl|de|eu|to|biz|us)\b\)?|?")); -static HASHED: LazyLock = LazyLock::new(|| re(r"(?i)^[0-9a-f]{8,}(?:_[0-9a-f]{6,}){2,}(?:-[0-9a-z]+)?$")); +/// Also one long hex run ("6c57319fbae505679737bd46a76193a1-u4e.part6.rar"). +static HASHED: LazyLock = LazyLock::new(|| re(r"(?i)^(?:[0-9a-f]{8,}(?:_[0-9a-f]{6,}){2,}|[0-9a-f]{24,})(?:-[0-9a-z]+)?$")); static SCENE_TRACK: LazyLock = LazyLock::new(|| re(r"^[0-9]{1,3}[-_ .]+(.+?)(?:_-_| - |-)")); static VOLUME_NUMBER: LazyLock = LazyLock::new(|| re(r"^(.*[^0-9. ])[. ]([0-9]{1,5})\.?$")); @@ -1398,6 +1399,9 @@ mod image_set_tests { let u4e = |n: &str| release_identity("p", &format!(r#"Seit 1753 Tagen - usenet4ever.info - "{n}" yEnc"#), n); assert_eq!(u4e("055631a1_b6c820bc_a856086c_85112a5-u4e.part01.rar").key, u4e("055631a1_b6c820bc_a856086c_85112a5-u4e.par2").key); assert_ne!(u4e("055631a1_b6c820bc_a856086c_85112a5-u4e.part01.rar").key, u4e("4cc7c4c6_d3c2fecf_0bff51d6_d10df86-u4e.part01.rar").key); + let gb = |n: &str| release_identity("p", &format!(r#"German Board - [Usenet4ever.info] und [SecretUsenet.com] - "{n}" yEnc"#), n); + assert_eq!(gb("6c57319fbae505679737bd46a76193a1-u4e.part6.rar").key, gb("6c57319fbae505679737bd46a76193a1-u4e.par2").key); + assert_ne!(gb("6c57319fbae505679737bd46a76193a1-u4e.part6.rar").key, gb("6fc0ff192a355703b3e81557893013b1-u4e.part6.rar").key); let pck = |i: &str, n: &str| release_identity("p", &format!(r#"(????) [{i}/2195] - "{n}" yEnc"#), n); assert_eq!(pck("0659", "DN.VPL PCK.1508").key, pck("0660", "DN.VPL PCK.1509").key); assert_eq!(pck("0659", "DN.VPL PCK.1508").name, "DN.VPL PCK.1508"); diff --git a/lib/release/identity.ts b/lib/release/identity.ts index c32f016..556f916 100644 --- a/lib/release/identity.ts +++ b/lib/release/identity.ts @@ -133,7 +133,9 @@ const VIDEO = /\.(mkv|mp4|avi|m4v|ts|wmv|mov)$/i const EPISODE = /^(.+?)[ ._-]+S(\d{1,2})E\d{1,3}/i /** A host and a sponsor in a subject's remainder (its dots and dashes spaces): "(www Thunder News org)", "". */ const BOILERPLATE = /\(?\bwww(?: [A-Za-z0-9]+)*? (?:org|com|net|info|nl|de|eu|to|biz|us)\b\)?|?/gi -const HASHED = /^[0-9a-f]{8,}(?:_[0-9a-f]{6,}){2,}(?:-[0-9a-z]+)?$/i +// Also one long hex run ("German Board - [Usenet4ever.info] und [SecretUsenet.com] - "6c57319fbae505679737bd46a76193a1-u4e.part6.rar"": +// 11 uploads were one release of 14,450 files; LOG.md 2026-10-12 (24)). +const HASHED = /^(?:[0-9a-f]{8,}(?:_[0-9a-f]{6,}){2,}|[0-9a-f]{24,})(?:-[0-9a-z]+)?$/i const SCENE_TRACK = /^\d{1,3}[-_ .]+(.+?)(?:_-_| - |-)/ const VOLUME_NUMBER = /^(.*[^\d. ])[. ](\d{1,5})\.?$/ diff --git a/tests/unit/release/identity.spec.ts b/tests/unit/release/identity.spec.ts index f603a5a..dcf0b2a 100644 --- a/tests/unit/release/identity.spec.ts +++ b/tests/unit/release/identity.spec.ts @@ -328,6 +328,9 @@ test.group('release / par2 names', () => { const u4e = (n: string) => id(`Seit 1753 Tagen - usenet4ever.info - "${n}" yEnc`, n) assert.equal(u4e('055631a1_b6c820bc_a856086c_85112a5-u4e.part01.rar').key, u4e('055631a1_b6c820bc_a856086c_85112a5-u4e.par2').key) assert.notEqual(u4e('055631a1_b6c820bc_a856086c_85112a5-u4e.part01.rar').key, u4e('4cc7c4c6_d3c2fecf_0bff51d6_d10df86-u4e.part01.rar').key) + const gb = (n: string) => id(`German Board - [Usenet4ever.info] und [SecretUsenet.com] - "${n}" yEnc`, n) + assert.equal(gb('6c57319fbae505679737bd46a76193a1-u4e.part6.rar').key, gb('6c57319fbae505679737bd46a76193a1-u4e.par2').key) + assert.notEqual(gb('6c57319fbae505679737bd46a76193a1-u4e.part6.rar').key, gb('6fc0ff192a355703b3e81557893013b1-u4e.part6.rar').key) const pck = (i: string, n: string) => id(`(????) [${i}/2195] - "${n}" yEnc`, n) assert.equal(pck('0659', 'DN.VPL PCK.1508').key, pck('0660', 'DN.VPL PCK.1509').key) assert.equal(pck('0659', 'DN.VPL PCK.1508').name, 'DN.VPL PCK.1508')