Powershell music player
Table of contents
Powershell music player
In this post will be create a Powershell script that play a list of songs in a folder you specified.
I take the example code form the Music Player v1.0.1 by -Powershell Gallery
This Music player only takes 7.65KB in space.
In RAM like you supposed is between 20MB and 30MB.
First we need to create a Powershell file call what ever you want, i call them "PlayMusic.ps1".
Next start to coding the script, we need to receive 5 parameters:
Music path
If is on Shuffle playing mode
If is on Loop playing mode
If you want to Stop
File type of songs
with this parameters now will have all the configuration to start plating music, so you ask how to use this parameters in Powershell, yes!! like this:
Param (
[Alias('P')] [String] $PathMusic,
[Alias('Sh')] [switch] $Shuffle,
[Alias('St')] [Switch] $Stop,
[Alias('L')] [Switch] $Loop,
[Alias('Ft')] [String] $fileType
)
Next to this at the end of the file we need to put all the logic(right now is a mess) for the terminal input; maybe now works if you put all in one line but i'm no time to try, let's try by yourself's.
#Start-MediaPlayer
If ($Stop. IsPresent) {
Start-MediaPlayer -St $Stop
}
ElseIf ($PathMusic) {
If ($Shuffle.IsPresent) {
If ($fileType) {
Start-MediaPlayer $ -P $PathMusic -Sh $Shuffle -Ft $fileType
}
Else {
Start-MediaPlayer $ -P $PathMusic -Sh $Shuffle -Ft ".flac"
}
}
ElseIf ($Loop.IsPresent) {
If ($fileType) {
Start-MediaPlayer -P $PathMusic -L $Loop -Ft $fileType
}
Else {
Start-MediaPlayer -P $PathMusic -L $Loop -Ft ".flac"
}
}
Else {
Start-MediaPlayer -P $PathMusic -Ft ".flac"
}
}
Else {
Start-MediaPlayer -Ft ".flac"
}
Like you see in the code i use the ".flac" format as default, because this is my prefered music file type.
Summary
Here you have all the complete code for this script it takes 161 code lines.
# Create a playlist of files from folder
Param(
[Alias('P')] [String] $PathMusic,
[Alias('Sh')] [switch] $Shuffle,
[Alias('St')] [Switch] $Stop,
[Alias('L')] [Switch] $Loop,
[Alias('Ft')] [String] $fileType
)
function Start-MediaPlayer {
Param(
[Alias('P')] [String] $Path,
[Alias('Sh')] [switch] $Shuffle,
[Alias('St')] [Switch] $Stop,
[Alias('L')] [Switch] $Loop,
[Alias('Ft')] [String] $fileType
)
If ($Stop.IsPresent) {
Write-Host "Stoping any Already running instance of Media in background."
Get-Job MusicPlayer -ErrorAction SilentlyContinue | Remove-Job -Force
}
Else {
#Caches Path for next time in case you don't enter Path to the music directory
If ($Path) {
$Path | out-file C:\Temp\Musicplayer.txt
}
else {
If ((Get-Content C:\Temp\Musicplayer.txt -ErrorAction SilentlyContinue).Length -ne 0) {
Write-Host "You've not provided a music directory, looking for cached information from Previous use."
$Path = Get-Content C:\Temp\Musicplayer.txt
If (-not (Test-Path $Path)) {
Write-Host "Please provide a Path to a music directory.\nFound a cached directory $Path from previous use, but that too isn't accessible!"
# Mark Path as Empty string, If Cached Path doesn't exist
$Path = ''
}
}
else {
Write-Host "Please provide a Path to a music directory."
}
}
#initialization Script for back ground job
$init = {
# Function to calculate duration of song in Seconds
Function Get-SongDuration($FullName) {
$Shell = New-Object -COMObject Shell.Application
$Folder = $shell.Namespace($(Split-Path $FullName))
$File = $Folder.ParseName($(Split-Path $FullName -Leaf))
[int]$h, [int]$m, [int]$s = ($Folder.GetDetailsOf($File, 27)).split(":")
$h * 60 * 60 + $m * 60 + $s
}
# Function to Notify Information balloon message in system Tray
Function Show-NotifyBalloon($Message) {
[system.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') | Out-Null
$Global:Balloon = New-Object System.Windows.Forms.NotifyIcon
$Balloon.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon((Get-Process -id $pid | Select-Object -ExpandProperty Path))
$Balloon.BalloonTipIcon = 'Info'
$Balloon.BalloonTipText = $Message
$Balloon.BalloonTipTitle = 'Now Playing'
$Balloon.Visible = $true
$Balloon.ShowBalloonTip(1000)
}
Function PlayMusic($Path, $Shuffle, $Loop) {
# Calling required assembly
Add-Type -AssemblyName PresentationCore
# Instantiate Media Player Class
$MediaPlayer = New-Object System.Windows.Media.Mediaplayer
# Crunching the numbers and Information
$FileList = Get-ChildItem $Path -Recurse -Include *$fileType* | Select-Object fullname, @{n = 'Duration'; e = { get-songduration $_.fullname } }
$FileCount = $FileList.count
$TotalPlayDuration = [Math]::Round(($FileList.duration | Measure-Object -Sum).sum / 60)
# Condition to identifed the Mode chosed by the user
if ($Shuffle.IsPresent) {
$Mode = "Shuffle"
$FileList = $FileList | Sort-Object { Get-Random } # Find the target Music Files and sort them Randomly
}
Else {
$Mode = "Sequential"
}
# Check If user chose to play songs in Loop
If ($Loop.IsPresent) {
$Mode = $Mode + " in Loop"
$TotalPlayDuration = "Infinite"
}
If ($FileList) {
'' | Select-Object @{n = 'TotalSongs'; e = { $FileCount }; }, @{n = 'PlayDuration'; e = { [String]$TotalPlayDuration + " Mins" } }, @{n = 'Mode'; e = { $Mode } }
}
else {
Write-Host "No music files found in directory $Path."
}
Do {
$FileList | ForEach-Object {
$CurrentSongDuration = New-TimeSpan -Seconds (Get-SongDuration $_.fullname)
$Message = "Song : " + $(Split-Path $_.fullname -Leaf) + " `nPlay Duration : $($CurrentSongDuration.Minutes) Mins $($CurrentSongDuration.Seconds) Sec` nMode : $Mode"
$MediaPlayer.Open($_.FullName) # 1. Open Music file with media player
$MediaPlayer.Play() # 2. Play the Music File
Show-NotifyBalloon ($Message) # 3. Show a notification balloon in system tray
Start-Sleep -Seconds $_.duration # 4. Pause the script execution until song completes
$MediaPlayer.Stop() # 5. Stop the Song
$Balloon.Dispose(); $Balloon.visible = $false
}
}While ($Loop) # Play Infinitely If 'Loop' is chosen by user
}
}
# Removes any already running Job, and start a new job, that looks like changing the track
If ($(Get-Job Musicplayer -ErrorAction SilentlyContinue)) {
Get-Job MusicPlayer -ErrorAction SilentlyContinue | Remove-Job -Force
}
# Run only if Path was Defined or retrieved from cached information
If ($Path) {
Write-Host "Starting a background Job to play Music files"
Start-Job -Name MusicPlayer -InitializationScript $init -ScriptBlock { playmusic $args[0] $args[1] $args[2] } -ArgumentList $Path, $Shuffle, $Loop | Out-Null
Start-Sleep -Seconds 3 # Sleep to allow media player some breathing time to load files
Receive-Job -Name MusicPlayer | Format-Table @{n = 'TotalSongs'; e = { $_.TotalSongs }; alignment = 'left' }, @{n = 'TotalPlayDuration'; e = { $_.PlayDuration }; alignment = 'left' }, @{n = 'Mode'; e = { $_.Mode }; alignment = 'left' } -AutoSize
}
}
}
#Start-MediaPlayer
If ($Stop. IsPresent) {
Start-MediaPlayer -St $Stop
}
ElseIf ($PathMusic) {
If ($Shuffle.IsPresent) {
If ($fileType) {
Start-MediaPlayer $ -P $PathMusic -Sh $Shuffle -Ft $fileType
}
Else {
Start-MediaPlayer $ -P $PathMusic -Sh $Shuffle -Ft ".flac"
}
}
ElseIf ($Loop.IsPresent) {
If ($fileType) {
Start-MediaPlayer -P $PathMusic -L $Loop -Ft $fileType
}
Else {
Start-MediaPlayer -P $PathMusic -L $Loop -Ft ".flac"
}
}
Else {
Start-MediaPlayer -P $PathMusic -Ft ".flac"
}
}
Else {
Start-MediaPlayer -Ft ".flac"
}