new-blogentry -topic "Powershell and More"

My observations about Powershell, Windows, System Center and life.

Recent comments

Tags

Don't show

    Disclaimer

    Any opinions expressed herein are completely accidental. But if one happens to slip in, it represents my own personal opinion and NO one elses. I'm also not concerned with changing anyone elses opinion, so any rants about anything presented on this site are likely to be 100% ignored.

    © Copyright 2010

    Ripping CDs with Powershell

    Reading books is one of my favorite past times, but since I have 4 kids and an insane job… I settle for listening to them as audiobooks. I wanted to rip some Audiobook CD’s to WMA for playing on  my Sansa Fuze and I wanted to tinker with automating Windows Media Encoder. Combine all that with some perverse pleasure in doing almost anything in powershell and you have the following script.

    I couldn’t find a .NET class for ripping audio from CDs, but I did find BonkEnc that has a command line executable which I could conveniently automate from powershell. You should download the plain zip package of BonkEnc from http://www.bonkenc.org and extract the contents to a subfolder of your Module Root.

    Using BonkEnc to end up with a folder full of WAV files from the CD was relatively easy. Trying to script the Windows Media Encoder was an exercise in pure brute force. I took every vbscript example I could find and attempted to port to Powershell, which I finally managed; but it may not be entirely pretty. You be the judge.

    I’ve been using this script as a dot-sourced PS1 for a few weeks now, but due to the dependency on 2 third party components (bonkenc and taglib-sharp) – finding a way to make it portable for posting online was frustrating me. I had too many hard coded paths. So I used this as an excuse to play with Modules in CTP2. As such the script presented does require CTP2.

    You’ll need to download Taglib-Sharp from http://www.taglib-sharp.com/Download/ and place the taglib-sharp.dll in your Module Root folder or a subfolder.

    And finally, be sure you download and install the 32bit version of Windows Media Encoder from http://www.microsoft.com/downloads/details.aspx?FamilyID=5691ba02-e496-465a-bba9-b2f1182cdf24&displaylang=en. If you are using Vista, be sure to visit http://support.microsoft.com/default.aspx/kb/929182 for a hotfix.

    Create a folder named “Packages” under your “WindowsPowershell” folder (in your “Documents” or “My Documents” folder). Next create a folder named “Rip-Audiobook” under the newly created Packages folder and drop the Rip-Audiobook.psm1 file into it. This is your Module Root folder. Drop BonkEnc and Taglib-sharp in this folder (or subfolder) and execute the following line in powershell:

    45# add-module Rip-Audiobook
    

    Insert the Audiobook CD and execute the following:

    48# Rip-Audiobook
    

    Follow the prompts and enter requested information so the resultant WMA file will be properly Tagged. Tag information is saved in an XML file for the next time you run Rip-Audiobook. You can just press ENTER to avoid reentering information that hasn’t changed.

    Answer the following configuration questions (Pressing ENTER will use the default value shown).  
    Destination Folder (C:\Users\gaurhoth\music):                                                   
    Title (The Fires of Heaven):                                                                     
    Author (Robert Jordan):                                                                          
    Series (Wheel of Time, Book 05):                                                                 
    CD Number (2):                                                                                   
    

    You’ll be prompted when everything is completed and you should find your WMA file where ever you specified for the ‘Destination Folder’.

    Here’s the Code (There’s a link to download the PSM1 file at the bottom of this post).

    function Start-Process {
    # Allows us to start the process with -elevated switch
    # to accomodate Vista. You'll be prompted for elevation
    # if you don't run powershell elevated.
        param ($apppath, [switch]$elevated)
        $se = new-object "System.Diagnostics.ProcessStartInfo"
        $se.UseShellExecute = $FALSE
        if ($elevated) { $se.Verb = "runas" }
        $se.RedirectStandardOutput = $TRUE

        $se.FileName = $apppath
        $se.Arguments = [string]$Args

        [System.Diagnostics.Process]::Start($se)
    }

    function New-TempFolder {
        # Prepare new temporary folder
        do {
            $temp = [io.path]::GetTempPath() + [io.path]::GetRandomFileName()
        } while ( $temp | Test-Path )
        mkdir $temp
    }

    function Encode-Audio {
        param (
            [string]$destination,
            [IO.FileInfo[]]$SourceFiles,
            $Profile = 'Windows Media Audio 8 for Dial-up Modem (CD quality, 64 Kbps)'
        )

    Write-Host @'
    ______________________________________________________________
    /  Encode-Audio:
    |    by Gaurhoth (http://www.skyeagle.net/blog)
    |  
    |  This script encodes a set of source WAV files to a single WMA.
    |  
    |  Example Usage:
    |    Encode-Audio -destination "$home\Music\Encoded-Audio.WMA" `
    |           -SourceFiles $("$home\music\WAVDIR\" | dir | sort)
    |    
    |  Requirements:
    |    Windows Media Encoder 9 (32bit tested)
    |       http://www.microsoft.com/downloads/details.aspx?FamilyID=5691ba02-e496-465a-bba9-b2f1182cdf24&displaylang=en
    \______________________________________________________________
    '@


        $encoder = new-object -com WMEncEng.WMEncoder
        $sc = $encoder.SourceGroupCollection
        $encoder.file.localfilename = $destination
        $profile = $encoder.profilecollection | ? { $_.name -eq $profile }

        # cycle through all WAV files and add a 'sourcegroup' for
        # each and assign correct encode profile.
        $sourcefiles = $sourcefiles | ? { $_.Extension -eq '.wav' }

        for ($i = 0; $i -lt ($sourcefiles.count); $i ++ ) {

            $sg = $sc.add($sourcefiles[$i].basename)
            $audsrc = $sg.addSource(1)
            $audsrc.setinput($sourcefiles[$i].fullname)
            $sg.profile = $profile

            # Set rollover to move to next Sourcegroup unless this is last file
            if ($i -lt ($sourcefiles.count - 1 )) { $sg.SetAutoRollover([int](-1),[string]$($sourcefiles[$i + 1].basename)) }
        }

        $sc.Active = $sc.Item(0)
        $encoder.autostop = $TRUE
        $encoder.PrepareToEncode($TRUE)
        $encoder.start()

        $totalwavesize = ($sourcefiles | Measure-Object length -Sum).sum

        do { $per = [int]((($destination | dir).length) / ($totalwavesize / 21) * 100)
            Write-Progress -Activity "Encoding Audio" -Status "progress" -PercentComplete $per
            start-sleep -milli 500
        } until ( $encoder.runstate -eq 5 )
        write-progress -Activity "Encoding Audio" -Status "progress" -completed

        $encoder.preparetoencode($FALSE)
        $encoder.SourceGroupCollection | % { $encoder.sourcegroupcollection.Remove($_.name) }
        $encoder.stop()
        $encoder = $null
    }

    function Rip-Audiobook {
        Write-Host @'
    ______________________________________________________________
    /  Rip-AudioBook:
    |   by Gaurhoth (http://www.skyeagle.net/blog)
    |  
    |  This script takes an Audio CD and rips each track to
    |  a set of WAVE files in a temporary folder. These WAVE
    |  files are then processed using Windows Media Encoder
    |  to a single merged WMA file that is saved in folder
    |  specified by $DestinationPath.
    |  
    |  Requirements:
    |    BonkEnc 1.07 |       http://www.bonkenc.org/
    |    Taglib-Sharp
    |       http://www.taglib-sharp.com/Download/
    |    Windows Media Encoder 9 (32bit tested)
    |       http://www.microsoft.com/downloads/details.aspx?FamilyID=5691ba02-e496-465a-bba9-b2f1182cdf24&displaylang=en
    \______________________________________________________________          
    '@


        $configfile="$PsScriptRoot\psbonkconfig.xml"
        $cddrive = 0 # change to reflect a different CD Rom drive.

        # Pull configuration information from xml file
        if (Test-Path $configfile) {
            $config = Import-Clixml $configfile
        } else {
            # No config file. Start from scratch.
            $config = "" | Select Title,Author,Series,cd,bonkexe,taglib,destinationpath
        }

        dir $PsScriptRoot -Filter "taglib-sharp.dll" -Recurse | % {
            $config.taglib = $_.fullname
            [void][Reflection.Assembly]::LoadFile($config.taglib)
        }

        Write-Host "Answer the following configuration questions (Pressing ENTER will use the default value shown)." -ForegroundColor Yellow

        # Try to find becmd.exe (bonkenc cmd line ripper) somewhere in the Module Root or subfolder.
        dir $PsScriptRoot -Filter "becmd.exe" -Recurse | % {
            $config.bonkexe = $_.fullname
        }
        while (-not ([io.file]::exists($($config.bonkexe)))) {
            Write-Host -foreground yellow "`nbecmd.exe path was not found. Please enter full path to becmd.exe."
            Read-Host "Enter path to becmd.exe ($($config.bonkexe))" | % { if ($_) { $config.bonkexe = $_ } }
        }

        if (-not $config.destinationpath) { $config.destinationpath = "$home\music" }
        Read-Host "Destination Folder `($($config.destinationpath)`)" | % { if ($_) { $config.destinationpath = $_ } }
        while (-not ([io.directory]::Exists($config.destinationpath))) {
            Write-Host "`nThe folder specified ($($config.destinationpath)) does not exists. Please specify a valid folder."
            Read-Host "Destination Folder `($($config.destinationpath)`)" | % { if ($_) { $config.destinationpath = $_ } }
        }

        # Ask for tag information using defaults from $config object
        # Pressing Enter accepts default value.
        Read-Host "Title `($($config.title)`)"   | % { if ($_) { $config.Title = $_ } }
        Read-Host "Author `($($config.Author)`)" | % { if ($_) { $config.Author = $_ } }
        Read-Host "Series `($($config.Series)`)" | % { if ($_) { $config.Series = $_ } }
        Read-Host "CD Number `($($config.CD)`)"  | % { if ($_) { $config.CD  = $_ } }

        $temp = New-Tempfolder

        $bonksession = Start-Process -elevated $config.bonkexe "-cd $cddrive -e WAVE -t 120 -d $temp -track all"
        write-host -foreground Yellow "`nPlease Wait... running BonkEnc to extract audio from your CD."
        $bonksession.waitforexit()

        (New-Object -ComObject WMPlayer.ocx).cdromCollection.Item($cddrive).eject()

        $destination = "{0}\{1} - {2}.wma" -f $config.destinationpath,$config.CD,$config.Title

        write-host -foreground Yellow "`nRunning Windows Media Encoder to convert the extracted audio to WMA..."
        if ( $temp | dir ) {
            Encode-Audio -destination $destination -sourcefiles $($temp | dir | sort)

            # Tag the WMA file
            $media = [TagLib.File]::Create($destination)
            $media.Tag.Artists = $config.author
            $media.tag.Album = $config.series
            $media.Tag.Title = $config.title
            $media.Tag.Track = $config.cd
            $media.Save()

            # Increment the track/cd number so it'll default to
            # correct number on next run.
            $config.cd = $([int]$config.cd + 1)
            $config | Export-Clixml $configfile

            Write-Host -Foreground Yellow "`n`nCompleted. CD has been saved to $destination."

        } else {
            write-host "Failed to find CD Tracks to encode. Be sure to insert a CD and close the Tray."
        }

        del "$temp\cd*track*.wav"
        del $temp -rec


    }

    Export-ModuleMember Rip-Audiobook

     

    Download Link: rip-audiobook.psm1 (6.98 kb)


    Categories: CTP | powershell | Modules
    Posted by gaurhoth on Tuesday, June 03, 2008 6:42 AM
    E-mail | Permalink | Comments (59) | Post RSSRSS comment feed

    Related posts

    Comments

    outdoorfireplaces

    Sunday, October 18, 2009 3:17 AM

    outdoorfireplaces

    I recently came across your blog and have been reading along. I thought I would leave my first comment. I don't know what to say except that I have enjoyed reading. Nice blog. I will keep visiting this blog very often.

    Cialis us

    Monday, October 19, 2009 12:50 PM

    Cialis

    New works! And such excellent work! The music is perfect, and the story you tell is without words - that is to say, free of language - and therefore universal. Consider YouTube & other venues for distribution that can spread this message. many thanks

    comprar cialis be

    Friday, October 23, 2009 2:22 AM

    comprar cialis

    I Rip CDs with Powershell - wonderful App.

    comprar viagra ca

    Friday, October 23, 2009 2:24 AM

    comprar viagra

    I agree with you! ;) cool app.

    acheter viagra ie

    Friday, October 23, 2009 2:25 AM

    acheter viagra

    that's not working for me Frown

    Kenali Dan Kunjungi Objek Wisata Di Pandeglang us

    Saturday, October 24, 2009 1:17 AM

    Kenali Dan Kunjungi Objek Wisata Di Pandeglang

    I havent any word to appreciate this post.....Really i am impressed from this post....the person who create this post it was a great human..thanks for shared this with us.

    Kerja Keras Adalah Energi Kita us

    Monday, October 26, 2009 2:06 PM

    Kerja Keras Adalah Energi Kita

    Hello admin, I must admit that today is my first time I visit here. However, I have found so many interesting thing in your blog and I really love that. Keep up the good work!

    Belajar Blogging us

    Wednesday, November 04, 2009 11:32 AM

    Belajar Blogging

    hello, this is my first time i visit here. I found so many interesting in your blog especially its discussion. keep up the good work.

    Seo Go Blog us

    Wednesday, November 04, 2009 11:32 AM

    Seo Go Blog

    Nice blog, just bookmarked it for later reference

    Personal Blog us

    Wednesday, November 04, 2009 11:33 AM

    Personal Blog

    Have you ever considered adding more videos to your blog posts to keep the readers more entertained?

    seo us

    Wednesday, November 04, 2009 11:33 AM

    seo

    great site

    home improvement advice us

    Wednesday, November 18, 2009 10:00 AM

    home improvement advice

    useful post. thank you

    mengembalikan jati diri bangsa us

    Tuesday, November 24, 2009 8:52 PM

    mengembalikan jati diri bangsa

    I found so many interesting in your blog especially its discussion. keep up the good work.

    games addicting

    Sunday, November 29, 2009 3:50 AM

    games addicting

    Hello admin, very informative article! Pleasee continue this great work!

    youdoodolls

    Sunday, November 29, 2009 7:59 AM

    youdoodolls

    I stumbled upon your blog by chance. Very informative post. Take care, Belle Ker ~ pocketpeople

    Office Phone System us

    Sunday, November 29, 2009 6:39 PM

    Office Phone System

    That is nice to now finally locate a web site where the blogger knows really well about his subject.

    xowii us

    Wednesday, December 02, 2009 11:30 AM

    xowii

    New works! And such excellent work! The music is perfect, and the story you tell is without words - that is to say, free of language - and therefore universal. Consider YouTube & other venues for distribution that can spread this message. many thanks

    pets us

    Thursday, December 03, 2009 12:22 AM

    pets

    thanks for the useful tips here. I've got a home improvement blog that I work very hard on like you are doing here. My efforts skew towards a lot of general topics and hopefully provide high level answers for what people are searching for. Keep on doing a great job with your site

    Ezine gb

    Monday, December 07, 2009 5:53 PM

    Ezine

    I wanted to thank you for this excellent read!! I definitely loved every little bit of it. I have you bookmarked your site to check out the latest stuff you post.

    Andrew A. Sailer gb

    Tuesday, December 08, 2009 5:13 PM

    Andrew A. Sailer

    A thoughtful insight and ideas I will use on my blog. You've obviously spent some time on this. Well done!

    Download music gb

    Tuesday, December 08, 2009 7:59 PM

    Download music

    This is my first time i visit here. I found so many interesting stuff in your blog especially its discussion. From the tons of comments on your articles, I guess I am not the only one having all the enjoyment here! keep up the good work.

    internet marketing training courses us

    Wednesday, December 09, 2009 2:32 AM

    internet marketing training courses

    Hi webmaster, commenters and everybody else !!! The blog was absolutely fantastic! Lots of great information and inspiration, both of which we all need!b Keep 'em coming... you all do such a great job at such Concepts... can't tell you how much I, for one appreciate all you do!



    Regards and respect
    Hinds




    steel garage us

    Friday, December 11, 2009 2:31 AM

    steel garage

    Thank you for another great article. Where else could anyone get that kind of information in such a perfect way of presentation.


    Regards
    Devane

    acai berry supplements us

    Saturday, December 12, 2009 2:10 AM

    acai berry supplements

    Greetings to all, This site is excellent and so is the manner in which the theme was explained. I like some of the comments also even though I would rather we remain on the topic so that to add value to the idea. It will be also encouraging to the one who penned it down if we all could share it around (for those who have social accounts such as a reddit, facebook,..). Again, Thanks..

    luxury hotel bangkok us

    Saturday, December 12, 2009 2:11 AM

    luxury hotel bangkok

    Took me time to read all the comments, but I really enjoyed the article. It proved to be Very helpful to me and I am sure to all the commenters here! It's always nice when you can not only be informed, but also entertained! I'm sure you had fun writing this article.



    Regards
    Saephan






    Pierrus Piruoliat

    Saturday, December 12, 2009 7:05 AM

    Pierrus Piruoliat

    Generally I do not write on blogs, but I would like to say that this blog really forced me to do so! Congratulations, really nice post. http://www.casinos-pokers.net

    ed hardy

    Saturday, December 12, 2009 7:53 PM

    ed hardy

    Thank you for another great article. Where else could anyone get that kind of information in such a perfect way of presentation.

    Georges Frankinstin

    Sunday, December 13, 2009 9:53 AM

    Georges Frankinstin

    Generally I do not write on sites, but I would like to say that this article really convinced me to do so! Thanks, very good post. http://www.le-holdem.com

    Emma Oliperio

    Monday, December 14, 2009 2:03 AM

    Emma Oliperio

    Generally I do not write on articles, but I would like to say that this blog really convinced me to do so! Congratulations, very good post. http://www.ungb.fr

    Eva Zacker

    Monday, December 14, 2009 2:52 AM

    Eva Zacker

    Generally I do not write on articles, but I would like to say that this blog really convinced me to do so! Congratulations, very good post. http://www.ungb.fr

    Mike puroliou

    Monday, December 14, 2009 7:17 AM

    Mike puroliou

    Usually I do not submit on articles, but I would like to say that this article really forced me to do so! Thanks, very nice article. http://www.parie-en-ligne.net

    Nicolas Hausfrissel

    Wednesday, December 16, 2009 2:20 AM

    Nicolas Hausfrissel

    Usually I do not submit on articles, but I would like to say that this article really forced me to do so! Thanks, very nice article. http://www.entrainement-poker.com

    Emma Oliperio

    Wednesday, December 16, 2009 3:25 AM

    Emma Oliperio

    Generally I do not post on articles, but I would like to say that this article really convinced me to do so! Thanks, really good article. http://www.craps-guide.com

    Georges Frankinstin

    Wednesday, December 16, 2009 3:25 AM

    Georges Frankinstin

    Usually I do not submit on articles, but I would like to say that this article really forced me to do so! Thanks, very nice article. http://www.entrainement-poker.com

    Georges Frankinstin

    Wednesday, December 16, 2009 3:25 AM

    Georges Frankinstin

    Generally I do not post on sites, but I would like to say that this article really convinced me to do so! Thanks, really nice article. http://www.le-holdem.com

    watch free movie us

    Wednesday, December 16, 2009 5:27 AM

    watch free movie

    This is really a Super knowledge gaining article and all thanks to google search engine get me on here. I loved reading your article and added to the bookmarks. The views you tried to put up was clearly understandable. My hubby also appreciated after reading this post. I will read for more sooner. bye - Sim

    1000 games us

    Wednesday, December 16, 2009 5:33 PM

    1000 games

    Unfortunately it's not working for me.

    Early Learning gb

    Wednesday, December 16, 2009 9:22 PM

    Early Learning

    Aw, this was a really quality post. In theory I'd like to write like this too - taking time and real effort to make a good article... but what can I say... I procrastinate alot and never seem to get something done.

    Phantom Of The Opera gb

    Friday, December 18, 2009 7:42 AM

    Phantom Of The Opera

    I thought it was going to be some boring old post, but it really compensated for my time. I will post a link to this page on my blog. I am sure my visitors will find that very useful.

    Football Headlines gb

    Friday, December 18, 2009 5:58 PM

    Football Headlines

    Aw, this was a really quality post. In theory I'd like to write like this too - taking time and real effort to make a good article... but what can I say... I procrastinate alot and never seem to get something done.

    9¢ downloads gb

    Sunday, December 20, 2009 8:07 AM

    9¢ downloads

    This is my first time i visit here. I found so many interesting stuff in your blog especially its discussion. From the tons of comments on your articles, I guess I am not the only one having all the enjoyment here! keep up the good work.

    Angila Mascot

    Sunday, December 20, 2009 7:53 PM

    Angila Mascot

    I heard there is a great solitaire game. My close friend told me about it, and I really think it's the best solitaire game ever made! I got it here: <a href="http://www.funsolitairegame.com/">Try" rel="nofollow">http://www.funsolitairegame.com/">Try It Now</a> http://www.funsolitairegame.com/

    buy fioricet now us

    Monday, December 21, 2009 6:25 AM

    buy fioricet now

    Dude.. I am not much into reading, but somehow I got to read lots of articles on your blog. Its amazing how interesting it is for me to visit you very often.

    usa online casinos us

    Monday, December 21, 2009 10:22 AM

    usa online casinos

    Admiring the time and effort you put into your blog and detailed information you offer! I will bookmark your blog and have my children check up here often. Thumbs up!

    Shavonda Lees us

    Tuesday, December 22, 2009 12:02 AM

    Shavonda Lees

    Hello, just needed you to know I have added your site to my Google bookmarks because of your great blog layout. But seriously, I think your site has one of the freshest theme I've came across. It really helps make reading your blog a lot better.

    windows registry repair

    Tuesday, December 22, 2009 7:51 AM

    windows registry repair

    I just read a great article on registry and PC optimization at Ezine articles. Here is the link ezinearticles.com/

    boise home listings us

    Tuesday, December 22, 2009 7:01 PM

    boise home listings

    Nice to be visiting your blog again, it has been months for me. Well this article that i've been waited for so long. I need this article to complete my assignment in the college, and it has same topic with your article. Thanks, great share.

    Joey us

    Wednesday, December 23, 2009 4:10 PM

    Joey

    Substantially, the article is actually the best on this worthw hile topic. I concur with your conclusions and will thirstily look forward to your coming updates. Just saying thanks will not just be adequate, for the great clarity in your writing. I will immediately grab your rss feed to stay privy of any updates. Fabulous work and much success in your business enterprize!

    Spencer us

    Wednesday, December 23, 2009 10:27 PM

    Spencer

    Its good to see you posting on this topic, I should book mark this website. Keep up the good work.

    sunglasses oakley ca

    Thursday, December 24, 2009 1:33 AM

    sunglasses oakley

    Hi, I applaud your blog for informing people, very interesting article, keep up it coming Smile

    assurance hypothécaire us

    Thursday, December 24, 2009 2:42 PM

    assurance hypothécaire

    When I originally commented I clicked the "Notify me when new comments are added" checkbox and now each time a comment is added I get four emails with the same comment.
    Is there any way you can remove me from that service?
    Thanks!

    cartier watches ca

    Thursday, December 24, 2009 10:47 PM

    cartier watches

    Hi, I applaud your blog for informing people, very interesting article, keep up it coming Smile

    xp blue screen fix cn

    Friday, December 25, 2009 7:18 AM

    xp blue screen fix

    wow, awesome post, i'm gonna? and it should work&nbsp; right?

    bulgari sunglasses ca

    Saturday, December 26, 2009 1:59 AM

    bulgari sunglasses

    Hi, I applaud your blog for informing people, very interesting article, keep up it coming Smile

    Mary us

    Saturday, December 26, 2009 7:24 AM

    Mary

    You had some good ideas there. I made a search on the issue and noticed most peoples will agree with your blog.

    Landen us

    Saturday, December 26, 2009 11:45 AM

    Landen

    I have been looking for content like this for a research project I am working. Thanks very much.

    adwords keyword us

    Sunday, December 27, 2009 2:23 AM

    adwords keyword

    That is some inspirational stuff. Never knew that opinions could be this varied. Thanks for all the enthusiasm to offer such helpful information here.

    training game us

    Sunday, December 27, 2009 4:50 AM

    training game

    Pretty good post. I just stumbled upon your blog and wanted to say that I have really enjoyed reading your blog posts. Any way I'll be subscribing to your feed and I hope you post again soon.

    t leukemia us

    Sunday, December 27, 2009 7:04 AM

    t leukemia

    Intimately, the article is really the best on this precious topic. I concur with your conclusions and will eagerly look forward to your approaching updates. Just saying thanks will not just be sufficient, for the extraordinary lucidity in your writing. I will directly grab your rss feed to stay abreast of any updates. De lightful work and much success in your business endeavors!

    Add comment


    (Will show your Gravatar icon)  

    [b][/b] - [i][/i] - [u][/u]- [quote][/quote]