From 4921467627c6ecff351df42dd2df861d496e3311 Mon Sep 17 00:00:00 2001 From: pcnick Date: Tue, 10 Oct 2023 22:46:59 +0800 Subject: [PATCH] Animelibk 0.3.3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 功能 + 新增規則設定檔功能,以減少指令檔修改。 + 運作模式新增判斷功能。 --- Animelibk.ps1 | 121 ++++++++++++++++++++++++++------------------------ 1 file changed, 64 insertions(+), 57 deletions(-) diff --git a/Animelibk.ps1 b/Animelibk.ps1 index f40d0de..9d7e48d 100644 --- a/Animelibk.ps1 +++ b/Animelibk.ps1 @@ -1,9 +1,13 @@ param( $Path, $Index = "H:\AnimeLib", + $VarConfig, + $RecorDB = "animelibk.ini", + $Include = @(".rmvb", ".mp4", ".mkv", ".ass", ".ssa"), [switch] $Single, [switch] $Force, - [switch] $Sub + [switch] $Sub, + [switch] $testrun ) Import-Module -Name ($PSScriptRoot + "\PathChar.psd1") Import-Module -Name ($PSScriptRoot + "\NameRegex.psd1") @@ -13,16 +17,54 @@ $TargetName = "" #$DestinName = "真の仲間" Write-Output $Path #$Index = "L:\AnimeLib" + +# scriptblock 減少重複 +$RegexpSet = { + # 全域化 + # 因應檔名不同而設定多組正規方式 + Set-Variable -Name "EpisodeRegex" -Scope global -Value @( + "(?:S\d{2})?[\s]?-[\s]E?(?\d{2})" + "[\[\b\s](?\d{2})[\s_]?(?:[vV]\d|END|FIN)[\]\b\s]" + "\[(?\d{1,2})\D{2}\]" + "\[(?\d{1,2})\]" + ) + + Set-Variable -Name "NameRegex" -Scope global -Value @( + "[\[\b\s](?[^\[\]]*)[\]\b\s]?$" + ) +} + +if ($VarConfig) { + if (Test-Path $PSScriptRoot\$VarConfig) { + $T = Get-Content -Encoding UTF8 $PSScriptRoot\$VarConfig | % { $H = @{} ; $S = $null} { + if ($_ -match "^\[(?\w*)\]" ) { + $S = $Matches["T"] + $H.add($S, @()) + } elseif ($_ -match ".+" ) { + $H[$S] = $H[$S] + @($_ -replace '"', '') + } + } { $H ; Clear-Variable -Name "H"} + $T.GetEnumerator() | % { Set-Variable -Name $_.name -Value $_.value} + } else { + &$RegexpSet + $EpisodeRegex | % {"[EpisodeRegex]"}{ """$_""" }{""} | Out-File -Encoding UTF8 $PSScriptRoot\$VarConfig + $NameRegex | % {"[NameRegex]"}{ """$_""" } | Out-File -Encoding UTF8 -Append $PSScriptRoot\$VarConfig + } + +} else { + &$RegexpSet +} #$Path = "L:\Anime\202001 ネコぱら\[Nekomoe kissaten][Nekopara][01-12][BDRip][1080p][CHT]\[Nekomoe kissaten][Nekopara][12][1080p][CHT].mp4" #$Path = "L:\Anime\202004 ストライク・ザ・ブラッド OVA IV\[Suzu-Kaze][Strike_the_Blood_IV_OVA][01-12FIN][BDRip_1080P][HEVC_YUV420P10]\[Suzu-Kaze] Strike the Blood IV 12FIN [BDRip 1920x1080 HEVC YUV420P10 FLAC].mkv" #$Path = "H:\Anime\201901 盾の勇者の成り上がり\[LKSUB][Tate no Yuusha no Nariagari][01-25][GB][720P][MP4]\[LKSUB][Tate no Yuusha no Nariagari][01][GB][720P].mp4" -#$Path = "H:\Data\Downloads\因為不是真正的夥伴而被逐出勇者隊伍\[Shin no Nakama][01][BIG5][1080P].mp4" + $JsonPath = $("$Index\Anime\* $TargetName", $($Path -replace '(.*\\[^\[\\\]]*)\\\[.*', '$1') | ? {Test-Path $_}) -$WorkData = $(if (Test-Path "$JsonPath\animelibk.json") { - Get-Content "$JsonPath\animelibk.json" | ConvertFrom-Json +$WorkData = $(if (Test-Path $RecorDB) { + Get-Content $RecorDB | ConvertFrom-Json } else { - "" | select ID, WorkName, TargetName, DestinName, Season, Episode + "" | Select-Object ID, WorkName, TargetName, DestinName, Season, Episode }) +if ($RecorDB -notmatch ":") { $RecorDB = "$JsonPath\$RecorDB" } # 確認資料狀態,缺少則進行物件資料建立 if (-not($WorkData.WorkName)) { @@ -42,11 +84,15 @@ if (-not($WorkData.Episode)) { } $WorkData -$Seasons_TC = "", "第一季", "第二季", "第三季", "第四季", "第五季" +#$Seasons_TC = "", "第一季", "第二季", "第三季", "第四季", "第五季" +$Seasons_TC = "", "Seasons 1", "Seasons 2", "Seasons 3", "Seasons 4", "Seasons 5" +$Lang = @{ + Season = "Season {0:00}" +} $Year = @($($JsonPath -replace '.*\\((?\d{4})?(?\d{2})?).*$', '${Y}'), $(get-date -Format 'yyyy')) | ? {-not([string]::IsNullOrEmpty($_))} | Select -First 1 # 取得目標資料夾是否存在,不存在建立資料夾,並取得資料夾物件 -$LinkPath = "{2}\{0}\{1}" -f $WorkData.DestinName, $Seasons_TC[$WorkData.Season], $Index +$LinkPath = "{2}\{0}\{1}" -f $WorkData.DestinName, $($Lang["Season"] -f $WorkData.Season), $Index $LinkDir = $(if (-not(Test-Path -Path "$LinkPath*")) { New-Item -Path "$LinkPath ($Year)" -ItemType Directory -Force } else { @@ -66,19 +112,7 @@ function Get-StandName { Get-Item -Path $(Edit-PathChar $FileObj) }) - # 因應檔名不同而設定多組正規方式 - $EpisodeRegex = @( - "(?:S\d{2})?[\s]?-[\s]E?(?\d{2})" - "[\[\b\s](?\d{2})[\s_]?(?:[vV]\d|END|FIN)[\]\b\s]" - "\[(?\d{1,2})\w{2}\]" - "\[(?\d{1,2})\]" - ) - - $NameRegex = @( - "[\[\b\s](?[^\[\]]*)[\]\b\s]?$" - ) - - $Result = $File.Name | % { Get-NameRegex $_ -Regex $EpisodeRegex } | % { $(Get-NameRegex $_["L"] -Regex $NameRegex -Exclude "(BD|DVD|HDTV)RIP" -End) + $_ } | Select -First 1 + $Result = $File.Name | % { Get-NameRegex $_ -Regex $EpisodeRegex } | % { $(Get-NameRegex $_["L"] -Regex $NameRegex -Exclude "(BD|DVD|HDTV)RIP|BIG5" -End) + $_ } | Select -First 1 # 建立回傳資料物件,以方便後續資料處理。 $OutputData = "" | Select newName, Season, Episode, newFullName; @@ -119,6 +153,14 @@ if ($Single) { } elseif ($Sub) { $List = @(Get-Item -Path $(Edit-PathChar $Path)) $BuildList = $List | select $FileObj, $StructPathObj, $NewNameObj | ? {$_.File.Extension -in @(".ass", ".ssa")} +} elseif ($testrun) { + $List = @(Edit-PathChar $Path | Get-Item | ? { $_.GetType().Name -eq "FileInfo" }) + + @(Edit-PathChar $Path | Get-Item | ? { $_.GetType().Name -eq "DirectoryInfo" } | % { $_.GetFiles() }) + $BuildList = $List | select $FileObj, $StructPathObj, $NewNameObj + if ($Include -ne "") { $BuildList = $BuildList | ? {$_.File.Extension -in $Include} } + if (-not($Force)) { $BuildList = $BuildList | ? {$_.NewName.Episode -notin $WorkData.Episode} } +} else { + exit 0; } $ENDResult = $BuildList | % { @@ -138,40 +180,5 @@ $ENDResult = $BuildList | % { #$ENDResult #$ENDResult.gettype(); if (-not($Sub)) { $ENDResult | % { if ($_.Episode) { $WorkData.Episode += $_.Episode }}} -$WorkData | ConvertTo-Json | Out-File -Encoding "UTF8" "$JsonPath\animelibk.json" -exit 0; - -##### 以下試寫或測試用 ##### -# SIG # Begin signature block -# MIIFxwYJKoZIhvcNAQcCoIIFuDCCBbQCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB -# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR -# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUnaUT7B6+atzTGRJLSX59DzPX -# fjGgggNSMIIDTjCCAjagAwIBAgIQdMnAQ4BDAo9Lgfn+QeDdhjANBgkqhkiG9w0B -# AQUFADAqMRMwEQYDVQQDDApOaWNrIENoYW5nMRMwEQYDVQQKDAplYXJpY2sub3Jn -# MB4XDTIxMTAzMTEwMDI1MVoXDTIyMTAzMTEwMjI1MVowMzEiMCAGCSqGSIb3DQEJ -# ARYTcGNuaWNrMTAwQGdtYWlsLmNvbTENMAsGA1UEAwwETmljazCCASIwDQYJKoZI -# hvcNAQEBBQADggEPADCCAQoCggEBAMEnEk3/5rkEMibDbbfOXQaerk5xXSJmY8gf -# FAVUbrGfjzYHcRsPRzdb/pstcZGS2XUCoX2a57lQhACStns9dXeYfWhzNeAiSEAy -# iaJzUj5ELcH5TzT+mjeJQX6upeHOexO1TmtuM6mugpl9SvNQFqbQXlPHHmoLE3OC -# UzzjEC0AkHkcSiLdqtmSbRmaomcDMbtJgZHUciWE/p6mmAbpv2R4rdKSYSiI8UsE -# UclzkeTNrYKmJNiM0R+X1LyZVY6HAHN8dR3tjBnEPYoPxRAz4d2FEajvumzosNUr -# ni9LROnRxQXa048ZcsNArNZDQXe+Rc+PWhzbqHhy8rBllgZ08XkCAwEAAaNnMGUw -# DgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMB8GA1UdIwQYMBaA -# FBXyUrhn78ppKe7GRmHS6vbsNae/MB0GA1UdDgQWBBRs5+Yfb/14jwpjUNpTUuR1 -# 759t9TANBgkqhkiG9w0BAQUFAAOCAQEACSL1BqUcrqh+bBqr5rQ5mArCVxsBW92r -# HenPY48dKdhGgMODtxuo7osZLk7Il+aXhAsvNTSfmc92H5eDXFqZ565jm8r6FF1C -# f1oKxznmtxd4oyXflCRqBz+OGuXLq8dG9gWT7OisKWe0hifSMGaZ9afpNeiFLuD1 -# GSGk5E0W+bUyezCmjOdNWYIW452brt8rJS21WWVVvrsGjgJoTdsoAkFek8OEm82+ -# 1UR7xZOHybLvi8N0gvD+UFlVvcv6pmgUqaz5DS7J2si75Xj9pThE6/bPu/fkpc53 -# gMbleXNaqXIKeJTbI5hi2crlKyXBe/GfuK0Tv+06S1sL32VAs1VwmjGCAd8wggHb -# AgEBMD4wKjETMBEGA1UEAwwKTmljayBDaGFuZzETMBEGA1UECgwKZWFyaWNrLm9y -# ZwIQdMnAQ4BDAo9Lgfn+QeDdhjAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEK -# MAigAoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3 -# AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUEzAOjNkB8uaWsHtC -# RUzsrJzTfYMwDQYJKoZIhvcNAQEBBQAEggEAnvzVdQvGridnk2wdfYs8SjLEZYhc -# K3b7zpo5sNczj/zEFSsCskDik+oJ7p+vRszo7WGNt2/vJsbFPsIROYkxzV5UdgZR -# BDTpQhcRLPSdw6kipbKk1MPD6nmpCqQ1BdsvALJH8BXxr8UlaYZMhLiUS8dVx1Vh -# Cr4zTBc1nmHf/QdLlNyHieCdCqwLam87yN03u9NXDqearWwP+Zh/58I+qCQjs3sU -# coB9S7DCjoMp0NCpntohLkB2ZyLXdfbQM4bNUqQra5bcZAUAx6pPaDucCAqVbTtY -# fhXHdsfH9i1gd2TQUYkMBW59QwWy3EyeC5eKkBO+aQUj+85PH8DQftKFsg== -# SIG # End signature block +$WorkData | ConvertTo-Json | Out-File -Encoding "UTF8" $RecorDB +exit 0; \ No newline at end of file