VoxCommando

VoxNastics (User Guides and Mods) => Tips and Tricks => Topic started by: nime5ter on December 04, 2015, 10:44:35 AM

Title: Fun with files
Post by: nime5ter on December 04, 2015, 10:44:35 AM
Here's a fun one for folks who like to kick it old-school.

**Caution: For experienced users or those with more technical background**

Scan any directory/subdirectory and capture all the file paths etc. Nice if you want to generate payload xml to access certain files directly, rather than through one of the standard media player plugins, for example. Of course, there are other uses as well.

James originally experimented with this using Launch.CMD, but using Launch.Capture turns out to be much neater and more reliable across systems (I think). So, once again: hat-tip to Master James. ;)

http://voxcommando.com/mediawiki/index.php?title=Actions#Launch

Here is an example where we scan our NAS movies directory and then generate a payload xml of all the movie files. Included are some sample commands that then launch and play any of the titles using your default movie player if you have one.

You could do the same thing with folders of Word documents, or whatever.

Code: [Select]
<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.2.0.9-->
<commandGroup open="False" name="example - scan movie folders to create payload xml" enabled="True" prefix="" priority="0" requiredProcess="" description="">
  <command id="344" name="Scan movie folder" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <action>
      <cmdType>Launch.Capture</cmdType>
      <params>
        <param>C:\Windows\System32\cmd.exe</param>
        <param>/C dir \\NAS\video\Movies\*.??? /s /b /A:-D</param>
        <param>True</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>RegExTool.Open</cmdType>
      <params>
        <param>True</param>
      </params>
      <cmdRepeat>0</cmdRepeat>
    </action>
    <action>
      <cmdType>Results.RegEx</cmdType>
      <params>
        <param>(.*\\)(.*?)(  \.mkv  |  \.avi  |  \.mp4)</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>PayloadXML.Clear</cmdType>
      <params>
        <param>payloads\myMovies.xml</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>PayloadXML.AddPair</cmdType>
      <params>
        <param>payloads\myMovies.xml</param>
        <param>{Match.{i}}</param>
        <param>{Match.{i}.2}</param>
      </params>
      <cmdRepeat>{#M}</cmdRepeat>
    </action>
    <action>
      <cmdType>OSD.ShowText</cmdType>
      <params>
        <param>created xml with {#m} movies</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <phrase>Scan my movie folder</phrase>
  </command>
  <command id="345" name="play my movie" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <action>
      <cmdType>Launch.OpenFile</cmdType>
      <params>
        <param>{1}</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>TTS.Speak</cmdType>
      <params>
        <param>Now playing {PF.1}</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <phrase>play my movie</phrase>
    <payloadFromXML phraseOnly="False" use2partPhrase="False" phraseConnector="by" Phrase2wildcard="anyone" optional="False">payloads\myMovies.xml</payloadFromXML>
  </command>
  <command id="381" name="play a random movie" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <action>
      <cmdType>PayloadXML.GetRandomP</cmdType>
      <params>
        <param>payloads\myMovies.xml</param>
        <param>1</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>OSD.ShowText</cmdType>
      <params>
        <param>Now playing {Match.1}</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>PayloadXML.GetValue</cmdType>
      <params>
        <param>payloads\myMovies.xml</param>
        <param>{Match.1}</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>Launch.OpenFile</cmdType>
      <params>
        <param>{LastResult}</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <phrase>play a random movie</phrase>
  </command>
</commandGroup>

If you're too young to know how to use command line stuff, now's your chance to see how it works and explore how these fundamental concepts can be enriched in the VC environment.

To experiment with the above xml, you'll have to replace our NAS path with an appropriate equivalent on your system.

I find the SS64 website is a great reference for command syntax. http://ss64.com/nt/ (in this case, follow the "Dir" link)
Title: Re: Fun with files
Post by: Kalle on December 04, 2015, 01:13:14 PM
Wow great idea  8)
Title: Re: Fun with files
Post by: nime5ter on December 04, 2015, 03:07:47 PM
Agreed. :)

It's so versatile.

The only thing is, if you want to generate a payload XML file for a really large number of items, then the method I use above (PayloadXML.AddPair) isn't the ideal method. It is fine for a relatively small number of items (it worked fine for my ~100 movie files), but for a huge number of items it will at least freeze VC for a long time.

Here is another example where I scan my mp3 directory and create a payload xml for all the tracks. Here I use Results.MatchtoXML (http://voxcommando.com/mediawiki/index.php?title=Actions#MatchToXML), which is a much more efficient process.

Code: [Select]
<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.2.0.9-->
<commandGroup open="True" name="get my mp3s" enabled="True" prefix="" priority="0" requiredProcess="" description="">
  <command id="277" name="get my mp3 files" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="In this example, I scan my mp3 directory's folders/subfolders. Be careful of which directory you choose here!">
    <action>
      <cmdType>PayloadXML.Clear</cmdType>
      <params>
        <param>payloads\myMp3s.xml</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>Launch.Capture</cmdType>
      <params>
        <param>C:\Windows\System32\cmd.exe</param>
        <param>/C dir d:\mp3  /b /s </param>
        <param>True</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>RegExTool.Open</cmdType>
      <params>
        <param>True</param>
      </params>
      <cmdRepeat>0</cmdRepeat>
    </action>
    <action>
      <cmdType>Results.RegEx</cmdType>
      <params>
        <param>(.+\\(.+)\.mp3)</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>Results.MatchToXML</cmdType>
      <params>
        <param>payloads\myMp3s.xml</param>
        <param />
        <param>True</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <phrase>get my mp3 files</phrase>
  </command>
  <command id="326" name="play mp3" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <action>
      <cmdType>OSD.ShowText</cmdType>
      <params>
        <param>Playing {PF.1}</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <action>
      <cmdType>Audio.Play</cmdType>
      <params>
        <param>{1}</param>
      </params>
      <cmdRepeat>1</cmdRepeat>
    </action>
    <phrase>please play the track</phrase>
    <payloadFromXML phraseOnly="False" use2partPhrase="False" phraseConnector="by" Phrase2wildcard="anyone" optional="False">payloads\myMp3s.xml</payloadFromXML>
  </command>
  <command id="340" name="stop this track" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
    <action>
      <cmdType>Audio.Stop</cmdType>
      <params />
      <cmdRepeat>1</cmdRepeat>
    </action>
    <phrase>stop this track</phrase>
  </command>
</commandGroup>
Title: Re: Fun with files
Post by: SteveB69 on December 22, 2015, 07:44:38 PM
Any chance of a step by step to put this all together? Please?  :)
Title: Re: Fun with files
Post by: SteveB69 on January 01, 2016, 10:22:14 PM
Soz but still not getting this, my mps3s are stored in E:\My Music but I can't figure out where I enter this?
Title: Re: Fun with files
Post by: the1Dmitri on January 02, 2016, 08:06:21 AM
Soz but still not getting this, my mps3s are stored in E:\My Music but I can't figure out where I enter this?

 Where is says /C dir d:\mp3  /b /s change d:\mp3 to where your music files are located. In your case it should be /C dir E:\My Music  /b /s
Title: Re: Fun with files
Post by: the1Dmitri on January 02, 2016, 08:08:44 AM
Very useful. Thanks nime5ter.  :)

When I first saw the title I thought it said "fun with flies" and my first thought was "ooh a voice controlled fly swatter"  :bonk
Title: Re: Fun with files
Post by: jitterjames on January 02, 2016, 08:25:03 AM
(https://s3.amazonaws.com/lowres.cartoonstock.com/animals-bug-insect-fly-roach-beetle-smb090122_low.jpg)
Title: Re: Fun with files
Post by: nime5ter on January 02, 2016, 08:44:38 AM
Thanks the1Dmitri. :)

Soz but still not getting this, my mps3s are stored in E:\My Music but I can't figure out where I enter this?

It looks like you've since found my answer to this question, which I answered when you asked for assistance in a separate thread: http://voxcommando.com/forum/index.php?topic=2422.msg20895#msg20895

I don't know whether you're subscribed to receive e-mail alerts when people respond to your posts? If not, you may want to enable that option in your forum settings.
Title: Re: Fun with files
Post by: SteveB69 on January 03, 2016, 10:43:12 PM
Yeah thanks nime5ter, way to many emails in my life but for some reason this did end up over 2 topics.
Apologies