Site icon Blog ARC Optimizer

Exportation d’élĂ©ments multimĂ©dias avec les extensions Sitecore PowerShell / Blogs / Perficient

Exportation d’élĂ©ments multimĂ©dias avec les extensions Sitecore PowerShell / Blogs / Perficient


Introduction 📖

À ce stade, je pense que tous les dĂ©veloppeurs Sitecore utilisent ou ont au moins entendu parler de Extensions PowerShell de Sitecore (SPE). Ce module puissant pour Sitecore est automatiquement inclus pour la plupart des Ă©quipes et des projets. Le module est inclus avec les instances XM Cloud par dĂ©faut; si vous utilisez XM Cloud, vous disposez dĂ©jĂ  de SPE. Si, d’une maniĂšre ou d’une autre, vous n’avez pas entendu parler de SPE, arrĂȘtez tout ce que vous faites et allez le vĂ©rifier. đŸšȘđŸƒâ€â™‚ïž

SPE comprend plusieurs modules prĂȘts Ă  l’emploi (OOTB) rapports que les utilisateurs peuvent exĂ©cuter. Sur un projet rĂ©cent, l’un de ces rapports est arrivĂ© : le ÉlĂ©ments multimĂ©dias inutilisĂ©s rapport qui se trouve dans l’arborescence de contenu de Sitecore au chemin suivant :

/sitecore/system/Modules/PowerShell/Script Library/SPE/Reporting/Content Reports/Reports/Media Audit/Unused media items

Ce rapport gĂ©nĂšre une liste d’élĂ©ments multimĂ©dias qui se trouvent dans la mĂ©diathĂšque mais qui ne sont pas utilisĂ©s dans Sitecore, oĂč « utilisĂ© » est dĂ©fini comme Ă©tant rĂ©fĂ©rencĂ© au moins une fois dans la base de donnĂ©es de liens Sitecore. En d’autres termes, le rapport rĂ©pertorie les Ă©lĂ©ments multimĂ©dias qui sont (probablement) prenant juste de la place.

Extension du rapport 🚀

Dans mon cas, plutĂŽt que de gĂ©nĂ©rer un rapport sur les Ă©lĂ©ments multimĂ©dias inutilisĂ©s, je devais faire le contraire : gĂ©nĂ©rer un rapport sur les Ă©lĂ©ments multimĂ©dias inutilisĂ©s. utilisĂ© Ă©lĂ©ments multimĂ©dias et exportez ces Ă©lĂ©ments Ă  l’aide de packages de contenu (qui seront installĂ©s dans des environnements supĂ©rieurs dans le cadre d’une migration de contenu). Utiliser l’OOTB ÉlĂ©ments multimĂ©dias inutilisĂ©s rapport comme point de dĂ©part, j’ai Ă©crit un script plus gĂ©nĂ©rique et Ă  usage gĂ©nĂ©ral pour regrouper les Ă©lĂ©ments multimĂ©dias en fonction de plusieurs critĂšres. Lorsque le script est exĂ©cutĂ©, cela ressemble Ă  ceci (j’ai utilisĂ© PowerShell ISE inclus avec SPE pour exĂ©cuter le script) :


suite ci-dessous 👇 (
J’ai besoin d’un moniteur plus grand đŸ–„)

Paramùtres ⚙

Voici un aperçu des différents paramÚtres :

  • MĂ©dias Ă  inclure
    • DĂ©faut: UtilisĂ©
    • Ce paramĂštre dĂ©termine si les processus de script ont utilisĂ© des Ă©lĂ©ments multimĂ©dias, des Ă©lĂ©ments multimĂ©dias inutilisĂ©s ou Ă  la fois des Ă©lĂ©ments multimĂ©dias utilisĂ©s et inutilisĂ©s. Pour dĂ©terminer si un Ă©lĂ©ment est utilisĂ© ou non, le script interroge la base de donnĂ©es de liens pour obtenir le nombre de rĂ©fĂ©rents pour l’élĂ©ment.
  • Dossiers de la bibliothĂšque multimĂ©dia
    • DĂ©faut: (aucun)
    • Utilisez ce paramĂštre pour dĂ©signer les dossiers Ă  partir desquels vous souhaitez que le script extraie et traite les Ă©lĂ©ments multimĂ©dias. Le script inclut une vĂ©rification pour empĂȘcher le traitement des Ă©lĂ©ments multimĂ©dias en double si, pour une raison quelconque, plusieurs dossiers multimĂ©dias qui se chevauchent sont sĂ©lectionnĂ©s.
    • Notez que le nƓud de la bibliothĂšque multimĂ©dia racine peut ĂȘtre sĂ©lectionnĂ©, mais cela n’est pas idĂ©al pour des raisons de performances. Il est prĂ©fĂ©rable de limiter le script aux dossiers multimĂ©dias dont vous savez qu’ils contiennent les Ă©lĂ©ments multimĂ©dias que vous devez exporter. Si aucun dossier n’est sĂ©lectionnĂ©, le script ne fait rien.
  • Extensions Ă  inclure
    • DĂ©faut: (aucun)
    • Si vous souhaitez que le script traite uniquement les Ă©lĂ©ments multimĂ©dias avec certaines extensions, vĂ©rifiez les extensions correspondantes ici. Notez que, par dĂ©faut, aucune extension n’est cochĂ©e et aucun filtrage d’extension n’est appliquĂ©. Vous souhaitez uniquement exporter des PDF ? VĂ©rifier la pdf extension. Vous voulez tous les Ă©lĂ©ments multimĂ©dias, quelle que soit leur extension ? Ne cochez aucune extension.
  • Date limite
    • DĂ©faut: (aucun)
    • S’il est spĂ©cifiĂ©, ce paramĂštre oblige le script Ă  traiter uniquement les Ă©lĂ©ments multimĂ©dias qui ont Ă©tĂ© crĂ©Ă©s ou mis Ă  jour. aprĂšs cette date.
    • Ce paramĂštre est utile si vous devez exĂ©cuter une exportation « delta » pour rĂ©cupĂ©rer des Ă©lĂ©ments nouveaux ou mis Ă  jour depuis une exĂ©cution prĂ©cĂ©dente. N’oubliez pas la date de votre derniĂšre course. Notez que les noms de fichiers des packages gĂ©nĂ©rĂ©s incluent un horodatage, par exemple : 20240323T0504075151Z – Exporter les Ă©lĂ©ments multimĂ©dias 1.zip.
  • Taille maximale du paquet
    • DĂ©faut: 25 Mo
    • Le script utilise le Size champ sur les Ă©lĂ©ments multimĂ©dias pour estimer la taille globale des fichiers dans un package de contenu donnĂ©. Si la taille totale des Ă©lĂ©ments multimĂ©dias empaquetĂ©s atteint ce seuil, un package supplĂ©mentaire est crĂ©Ă© jusqu’à ce que tous les Ă©lĂ©ments multimĂ©dias soient empaquetĂ©s.
    • Le script peut gĂ©nĂ©rer des packages qui sont plus grand que cette taille – la vĂ©rification du seuil a lieu aprĂšs un fichier a Ă©tĂ© ajoutĂ©. Notez Ă©galement que la taille sur le disque d’un Ă©lĂ©ment sĂ©rialisĂ© n’est pas exactement la mĂȘme que le nombre d’octets stockĂ©s dans le fichier. Size champ. En d’autres termes, la logique du « package chunking » est approximative.
    • De maniĂšre anecdotique, j’ai remarquĂ© que lorsque les packages de contenu deviennent volumineux (x > 200 Mo), leur tĂ©lĂ©chargement et leur installation peuvent devenir risquĂ©s, en fonction de l’environnement. Choisissez une taille adaptĂ©e Ă  votre cas d’utilisation.
  • Exclure les dossiers systĂšme
    • Par dĂ©faut : CochĂ© (☑)
    • Si cette case est cochĂ©e, le script ignorera tous les Ă©lĂ©ments multimĂ©dias dont le chemin contient /System/. Ceci est utile pour exclure, par exemple, les miniatures gĂ©nĂ©rĂ©es par Sitecore.
  • Sortie dĂ©taillĂ©e de la console
    • Par dĂ©faut : CochĂ© (☑)
    • Si cette case est cochĂ©e, une sortie supplĂ©mentaire est Ă©crite sur la console, ce qui peut ĂȘtre utile lors d’un essai Ă  sec avec le mode dĂ©bogage (ci-dessous).
  • Mode dĂ©bogage
    • Par dĂ©faut : CochĂ© (☑)
    • Si cette case est cochĂ©e, le script n’écrira aucun package de contenu sur le disque. Ceci est utile lors de l’exĂ©cution d’exĂ©cutions Ă  sec du script pour gĂ©nĂ©rer le rapport dĂ©taillant quel Ă©lĂ©ment se trouve dans quel package avant de s’engager Ă  Ă©crire un nombre potentiellement important de fichiers ou des fichiers individuels volumineux sur le disque.
    • En supposant que cette case Ă  cocher est dĂ©cochĂ©les packages de contenu rĂ©sultants sont enregistrĂ©s sur le disque sous le $SitecorePackageFolder chemin, qui est gĂ©nĂ©ralement C:\inetpub\wwwroot\App_Data\packages.
    • Si vous ne voyez aucun package de contenu sur le disque, assurez-vous que ce paramĂštre est dĂ©cochĂ©.

Sortie 📝

Le script fournit essentiellement trois formes diffĂ©rentes de sortie : la sortie de la console, la boĂźte de dialogue typique des rĂ©sultats du rapport SPE (avec fonctionnalitĂ© d’exportation CSV et Excel) et les packages de contenu eux-mĂȘmes qui sont Ă©crits sur le disque. Par exemple, en supposant que la sortie de la console dĂ©taillĂ©e soit cochĂ©e et que la taille maximale du package soit de 100 Mo, la sortie de la console pourrait ressembler Ă  ceci :

La ligne cyan affiche le nombre total d’élĂ©ments multimĂ©dias Ă  traiter en fonction des paramĂštres. Les lignes vertes dĂ©taillent le premier package Ă  crĂ©er, les lignes magenta rĂ©pertoriant chaque Ă©lĂ©ment multimĂ©dia de ce premier package. Les lignes vertes et magenta se rĂ©pĂštent jusqu’à ce que tous les Ă©lĂ©ments multimĂ©dias soient traitĂ©s et que tous les packages de contenu soient gĂ©nĂ©rĂ©s. Le dernier morceau de sortie de la console ressemblera Ă  ceci :

Les lignes grises reprĂ©sentent les chemins sur le disque pour chacun des packages de contenu gĂ©nĂ©rĂ©s. Notez que les packages gĂ©nĂ©rĂ©s sont nommĂ©s Ă  l’aide d’un modĂšle qui inclut un horodatage ; il s’agit de l’heure (du serveur) Ă  laquelle le script a Ă©tĂ© exĂ©cutĂ© et sera la mĂȘme date et heure pour tous les packages gĂ©nĂ©rĂ©s lors d’une exĂ©cution particuliĂšre.

La boßte de dialogue des résultats du rapport est similaire aux autres rapports SPE et pourrait ressembler à ceci :

À partir de lĂ , l’utilisateur peut voir quels Ă©lĂ©ments multimĂ©dias se trouvent dans quels packages. En exportant ces donnĂ©es vers un fichier CSV ou Excel, les utilisateurs peuvent auditer les packages de contenu installĂ©s, configurer une automatisation supplĂ©mentaire en aval, utiliser le fichier comme manifeste pour l’archivage des Ă©lĂ©ments multimĂ©dias, etc.

IdĂ©es d’amĂ©liorations 💡

Il y a toujours place Ă  l’amĂ©lioration. Voici quelques-unes de mes idĂ©es :

  • Ajouter la prise en charge des Ă©lĂ©ments non multimĂ©dias serait sympa, mĂȘme si cela signifierait devoir comprendre comment calculer la taille des packages. sans l’utilisation du Size champ (qui est unique aux Ă©lĂ©ments multimĂ©dias et est automatiquement dĂ©fini par Sitecore lors du tĂ©lĂ©chargement d’un fichier). Je suppose que vous pourriez dĂ©terminer la taille d’un article sĂ©rialisĂ© en mĂ©moire et l’utiliserâ€ŠđŸ€”
  • Y compris plus d’extensions : autres extensions d’image, extensions vidĂ©o, extensions Office, etc.
  • Autoriser une plage de dates pour traiter les fichiers ajoutĂ©s ou modifiĂ©s dans un laps de temps donnĂ©.
  • Exposer plus d’options pour l’installation du package plutĂŽt que de supposer un Ă©crasement.
  • Prise en charge d’une convention de dĂ©nomination configurable pour les packages gĂ©nĂ©rĂ©s.
  • Ajustements gĂ©nĂ©raux des performances.

Avez-vous d’autres idĂ©es d’amĂ©liorations ? Voyez-vous un bug ou une faute de frappe que j’ai manqué ? S’il vous plaĂźt laissez-moi un commentaire ci-dessous! 💬 👇

Le Code đŸ’»

Le script est disponible en tant que GitHub Gist public ici et est Ă©galement dupliquĂ© ci-dessous si vous ne comprenez pas l’essentiel (blague de papa ?).

<#
    .SYNOPSIS
        Creates content packages for media items matching certain criteria.
        By default, packages are saved to disk at C:\inetpub\wwwroot\App_Data\packages.
        
    .NOTES
        Original "Unused media items" report (/sitecore/system/Modules/PowerShell/Script Library/SPE/Reporting/Content Reports/Reports/Media Audit/Unused media items) written by Michael West.
        Additional parameters, filtering, content package creation, etc. written by Nick Sturdivant.

        This script requires that Sitecore PowerShell Extensions be installed.
#>

$reportName = "Export Media Items"

$extensionOptions = [ordered]@{ "bmp" = "bmp"; "gif" = "gif"; "jpg" = "jpg"; "jpeg" = "jpeg"; "pdf" = "pdf"; "png" = "png"; "svg" = "svg"; }
$maxPackageSizeOptions = [ordered]@{ "5 MB" = 5000000; "10 MB" = 10000000; "25 MB" = 25000000; "50 MB" = 50000000; "100 MB" = 100000000; "250 MB" = 250000000 }
$usedMediaItemOptions = [ordered]@{ "Both" = "both"; "Used" = "used"; "Unused" = "unused" }

$props = @{
    Parameters  = @(
        @{
            Name    = "usedMediaMode"
            Title   = "Media to Include"
            Tooltip = "Determines if the script processes used, unused, or both used and unused media items (where ""used"" is defined as having at least one entry in the link database)."
            Value   = "used"
            Options = $usedMediaItemOptions 
        }
        @{
            Name    = "selectedMediaFolders"
            Title   = "Media Library Folders"
            Tooltip = "The media library folders from which to include items."
            Value   = @()
            Editor  = "treelist" 
        }
        @{
            Name    = "selectedExtensions"
            Title   = "Extensions to Include"
            Tooltip = "The file extension(s) for the media items to process and include in the package(s)."
            Value   = @()
            Options = $extensionOptions
            Editor  = "check" 
        }
        @{
            Name    = "cutoffDate"
            Title   = "Cutoff Date"
            Tooltip = "If set, causes the script to only process media items that were created or updated after this date."
            Value   = [datetime]::MinValue
            Editor  = "date" 
        }
        @{
            Name    = "selectedMaxPackageSize"
            Title   = "Maximum Package Size"
            Tooltip = "The maximum size package the script will generate. If the total size of the media items to be packaged exceeds this limit, then multiple packages are created until all items have been packaged."
            Value   = 25000000
            Options = $maxPackageSizeOptions 
        }
        @{
            Name    = "excludeSystemFolders"
            Title   = "Exclude System Folders"
            Tooltip = "If checked, any media items with ""/System/"" anywhere in their path are ignored."
            Value   = $true
            Editor  = "check" 
        }
        @{
            Name    = "verboseOutput"
            Title   = "Verbose Console Output"
            Tooltip = "If checked, additional output will be written to the console."
            Value   = $true
            Editor  = "check" 
        }
        @{
            Name    = "debugMode"
            Title   = "Debug Mode"
            Tooltip = "If checked, no packages will be saved to disk."
            Value   = $true
            Editor  = "check" 
        }
    )
    Title       = " $reportName"
    Icon        = "OfficeWhite/32x32/box_into.png"
    Description = "This script queries for used and/or unused (referenced) media items and generates content packages containing those items."
    Width       = 600
    ShowHints   = $true
}

$result = Read-Variable @props

$items = @()
$itemsReport = @()
$timestamp = (Get-Date -Format FileDateTimeUniversal)

if ($result -eq "cancel") {
    exit
}

function HasReference {
    param(
        $Item
    )
    
    $linkDb = [Sitecore.Globals]::LinkDatabase
    $linkDb.GetReferrerCount($Item) -gt 0
}

function Get-MediaItemWithReference {
    param(
        [string]$Path,
        [string[]]$Extensions
    )
    
    $mediaItemContainer = Get-Item ("master:" + $Path)
    $excludedTemplates = @([Sitecore.TemplateIDs]::MediaFolder, [Sitecore.TemplateIDs]::Node)
    $items = $mediaItemContainer.Axes.GetDescendants() | 
    Where-Object { $excludedTemplates -notcontains $_.TemplateID } | Initialize-Item | 
    Where-Object { -not $excludeSystemFolders -or ( -not ($_.FullPath -like "*/System/*") ) } |
    Where-Object { $cutoffDate -eq [datetime]::MinValue -or ( $_.__Created -gt $cutoffDate -or $_.__Updated -gt $cutoffDate ) } |
    Where-Object { $Extensions.Count -eq 0 -or $Extensions -contains $_.Fields["Extension"].Value }
    
    # filter based on usage (links)
    foreach ($item in $items) {
        if ($usedMediaMode -eq "both") {
            $item
        }
        if ($usedMediaMode -eq "used" -and (HasReference -Item $item)) {
            $item
        }
        if ($usedMediaMode -eq "unused" -and (-not (HasReference -Item $item))) {
            $item
        }
    }
}

function Build-Package {
    param(
        [Sitecore.Data.Items.Item[]]$Items,
        [int]$Size,
        [int]$PackageNumber,
        [ref]$ItemsReport
    )    
    
    if ($verboseOutput) {
        Write-Host ""
        Write-Host "Building package $PackageNumber..." -ForegroundColor Green
        Write-Host "Total items: $($Items.Count)" -ForegroundColor Green
        Write-Host "Total size: $Size bytes" -ForegroundColor Green
        Write-Host ""
    }
    
    $package = New-Package -Name "Export Media Items"
    $package.Sources.Clear()
    $package.Metadata.Author = "SPE"
    $package.Metadata.Version = $timestamp
    $package.Metadata.Readme = "A package containing media items; generated by a Sitecore PowerShell Extensions script."
    
    $packageZipFileName = "$( $package.Metadata.Version ) - $( $package.Name ) $PackageNumber.zip"
    
    foreach ($itemToPackage in $Items) {
        if ($verboseOutput) {
            Write-Host "`t+ $($itemToPackage.FullPath)` ($($itemToPackage.Fields["Size"].Value -as [int]) bytes)" -ForegroundColor Magenta
        }
        $source = Get-Item $itemToPackage.FullPath | New-ExplicitItemSource -Name "$($itemToPackage.ID)" -InstallMode Overwrite
        $package.Sources.Add($source)
        
        $ItemsReport.Value += @{
            ID       = $itemToPackage.ID
            FullPath = $itemToPackage.FullPath
            Package  = $packageZipFileName
        }
    }

    if (-not $debugMode) {
        Export-Package -Project $package -Path $packageZipFileName -Zip
    }
}

foreach ($selectedMediaFolder in $selectedMediaFolders) {
    # ensure selected media folder is the media library itself or a folder within the media library
    if ($selectedMediaFolder.FullPath -ne "/sitecore/media library" -and $selectedMediaFolder.TemplateID -ne [Sitecore.TemplateIDs]::MediaFolder) {
        Write-Host "Selected folder $($selectedMediaFolder.FullPath) is neither the media library root nor a media folder within the media library and will be ignored." -ForegroundColor Yellow
        continue
    }
    
    $itemsFromPath = Get-MediaItemWithReference -Path $selectedMediaFolder.FullPath -Extensions $selectedExtensions
    
    # prevent duplicate items if overlapping media folders are selected
    foreach ($itemFromPath in $itemsFromPath) {
        $existingItem = $items | Where-Object { $_.ID -eq $itemFromPath.ID }
        if ($null -eq $existingItem) {
            $items += $itemFromPath
        }
    }
}

if ($items.Count -eq 0) {
    Show-Alert "There are no media items matching the specified parameters."
}
else {
    Write-Host "Total media items to be processed and packaged: $($items.Count)" -ForegroundColor Cyan

    $packageSize = 0
    $itemsInPackage = @()
    $itemsProcessed = 0
    $packageCount = 0
    
    foreach ($itemToPackage in $items) {
        $itemsInPackage += $itemToPackage
        $packageSize += $itemToPackage.Fields["Size"].Value -as [int]
        $itemsProcessed++
        
        if ($packageSize -ge $selectedMaxPackageSize -or $itemsProcessed -eq $items.Count) {
            
            $packageCount++

            Build-Package -Items $itemsInPackage -Size $packageSize -PackageNumber $packageCount -ItemsReport ([ref]$itemsReport)
            
            $packageSize = 0
            $itemsInPackage = @()
        }
    }
    
    # report output
    $mediaToInclude = ""
    if ($usedMediaMode -eq "both") {
        $mediaToInclude = "Both (used and unused)"
    } else {
        $mediaToInclude = ($usedMediaMode.Substring(0, 1).ToUpper() + $usedMediaMode.Substring(1))
    }
    $mediaFolders = ""
    $selectedMediaFolders | ForEach-Object { $mediaFolders += "<br/>&nbsp;&nbsp;- $($_.FullPath)" }
    $extensions = $selectedExtensions -join ", "
    if ($extensions -eq "") {
        $extensions = "(all)"
    }
    
    $infoDescription = "List of the media items matching the specified criteria that are contained within the generated content packages.<br/><br/>" +
    "Media to Include: $mediaToInclude<br/>" + 
    "Media Library Folders: $mediaFolders<br/>" +
    "Extensions to Include: $extensions<br/>" + 
    "Cutoff Date: "
    if ($cutoffDate -eq [datetime]::MinValue) {
        $infoDescription += "(none)<br/>"
    }
    else {
        $infoDescription += "$($cutoffDate.ToShortDateString())<br/>"
    }
    $infoDescription += "Maximum Package Size: $($selectedMaxPackageSize / 1000000) MB<br/>" +
    "Exclude System Folders: $excludeSystemFolders<br/>" +
    "Verbose: $verboseOutput<br/>" + 
    "Debug: $debugMode"

    $reportProps = @{
        InfoTitle       = $reportName
        InfoDescription = $infoDescription
        PageSize        = 25
        Title           = $reportName
    }
    
    Write-Host ""
    Write-Host "Finished! 🎉" -ForegroundColor Cyan

    if ($verboseOutput) {
        Write-Host ""
        $itemsReport | 
        ForEach-Object { $_.Package } | 
        Select-Object -Unique | 
        ForEach-Object { Write-Host ($SitecorePackageFolder + "\" + $_) -ForegroundColor Gray }
    }

    # display report output
    $itemsReport |
    Show-ListView @reportProps -Property @{ Label = "ID"; Expression = { $_.ID } },
    @{Label = "Full Path"; Expression = { $_.FullPath } },
    @{Label = "Package"; Expression = { $_.Package } }
}

(📝 Remarque : l’extrait de code ci-dessus Peut-ĂȘtre pas ĂȘtre tenu Ă  jour avec l’essentiel au fil du temps)






Source link
Quitter la version mobile