Re-post from here…
So about a year ago I changed my phone to a Windows mobile 7. Overall I’m really happy with it. Without setting the world alight with evangelistic wars, I think that if the Metro interface had come before the iPhone arrived then it’s likely it would be the dominant UI.
Anyway, one major problem I had arrived when it came to playing audiobooks. The issue was that I had three challenges when playing on the windows phone.
a) For space considerations, I wanted “read” chapters to be removed from the phone automatically
b) Some books have hundreds of chapters, but some have 12 chapters each >1hr in length. It was almost impossible to pick up where you left off. Therefore I needed to use the podcast “resume” functionality in Zune
c) This led to problem #3 – when I converted the “genre” using MP3Tagedit to podcast, they would frequently end up in a jumbled play-order depending on their date, so I needed to then ensure that Chapter1 had an earlier timestamp than chapter 2 etc. to force the right order in WP7. I could eventually get what I wanted but it was very painful and involved a bunch of manual steps as well as using BulkEditor and MP3Tagedit.
I found part of the answer in an excellent post over here, where it referenced TAGLIB# . So I launched powershell for the first time and wrote the script below.
Now, if you target it at a folder such as…
William Shakespeare/
Merchant of Venice/
Chapter1.mp3 ……
Hamlet/
Chapter1.mp3…..
It will loop through the subdirectories… renaming the files in sequence… setting the appropriate MP3 tag entries… Author = William Shakespeare/Album = BookDirectoryName/Chapter = Title.. and setting timestamp to force Zune to recognise chapter 1 as being before chapter 2..
So, here’s the code I used:
Function Zune { [CmdletBinding()] param( [Parameter(Position=0, Mandatory=$True)] [ValidateNotNullOrEmpty()] [System.String] $Library, [Parameter(Position=1)] [ValidateNotNull()] [System.String] $Genre ) cls $OriginDir = Get-Location #========Does the libary exist and contain books?============================================= if ((Test-Path -Path $Library) -eq $false) { write-output "$Library Does Not Exist" Break } $Books = Get-ChildItem $Library | where {$_.psiscontainer} if (!$books) { Write-Output "$Library Contains no books" Break } $librarylocation = Get-Item $Library fault Parameters=========================================================== if (!$Genre) { $Genre="Podcast" Write-Host "Genre is blank, using Default $Genre" -foregroundcolor DarkGreen } else { Write-Output "Genre is " + $Genre } #========Load Assemblies====================================================================== $TaglibLocation = (Resolve-path ($ProfileDir + "taglibtaglib-sharp.dll")) Add-Type -Path ($TaglibLocation) Write-output "Taglib Loaded Successfully" #========Set up Recursive Subdirectories====================================================== Write-Output "Processing the Library $Library" $NumberBooks = $books | Measure-Object | Select-Object -ExpandProperty Count Write-Output "Total Number of Runs is $Numberbooks" if ($NumberBooks -gt 0) { Set-Location $Librarylocation foreach ($book in $Books) { Write-Host "==================================================" -foregroundcolor Blue Write-Output "$("Processing the Book ")$($book.name)$(" in ")$($librarylocation)" $Chapters = Get-ChildItem $book.name *.mp3 | Sort-Object Name $NumberChapters = $Chapters | Measure-Object | Select-Object -ExpandProperty Count if ($NumberChapters -gt 0) { if ($NumberChapters -le 100) { $pad = 2 } elseif ($NumberChapters -le 255) { $pad = 3 } elseif ($NumberChapters -ge 256) { Write-Output "$("Too Many chapters in the book :")$($book.name)" Break } Write-Output "$("Processing ")$($NumberChapters)$(" Chapters")" #========Set up Recursive Subdirectories========================================== $book.fullname set-location $book.fullname $i=1 foreach ($chapter in $Chapters) { $title = "{0:D$pad}" -f ($i) +"$(" of $NumberChapters- ")$($book.name)" $Filename = $title + '.mp3' $chapter.fullname $media = [TagLib.File]::Create($chapter.Fullname) $media.Tag.Title = $title $media.Tag.Performers = "Narrator" $media.Tag.AlbumArtists = (get-culture).Textinfo.Totitlecase($Library.tolower()) $media.Tag.Composers = "Composer" $media.Tag.Album = $book.name $media.Tag.Comment = $chapter.Name $media.Tag.Genres = $Genre if (!$media.Tag.Year) {$media.tag.year = (Get-date).Year} $media.Tag.Track = $i $media.Tag.Artists = (get-culture).Textinfo.Totitlecase($Library.tolower()) $media.Save() $chapter.Creationtime = (Get-Date).date.addminutes($i) $chapter.LastWriteTime = (Get-Date).date.addminutes($i) #$chapter.LastAccessTime = (Get-Date).date.addminutes($i) $chapter.LastWriteTimeUTC = (Get-Date).date.addminutes($i) $chapter.CreationtimeUTC = (Get-Date).date.addminutes($i) #$chapter.LastAccessTimeUTC = (Get-Date).date.addminutes($i) Write-Output "$("Renaming ")$($chapter.name)$(" to ")$($Filename)" Rename-Item $chapter.fullname $filename $i++ } } else { Write-Output "$("No Chapters inside the book :")$($book)" } Set-Location $Librarylocation } #=============================================================================================== #======================== end of loop on books ============================================= #=============================================================================================== } else { Write-Output "$($"No Books inside the Library "$($Library))" } #=================================================================================================== #======================== end of function ================================================== #=================================================================================================== Set-Location $OriginDir } Export-ModuleMember -Function Zune