News:

Would you like to say "Thanks!" for extra support or new features that we provided? Donations are gratefully accepted.

Main Menu

Voxcommando Media Player Classic Integration.

Started by xtermin8r, May 18, 2014, 12:28:08 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

xtermin8r

Today's xperiment will be integrating media player classic into the collective.

MPC-HC is an extremely light-weight, open source media player for Windows®. It supports all common video and audio file formats available for playback.

http://mpc-hc.org/
Neural Net Based Artificial Intelligence.

xtermin8r

#1
Integration complete.

Method 1
Command line arguments:

example below tells mpc to play all files in a certain directory.



<?xml version="1.0" encoding="utf-16"?>
<command id="252" name="mpc music videos" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
  <action>
    <cmdType>Launch</cmdType>
    <cmdString>FILEPATH TO YOUR MPC-HC INSTALLATION\mpc-hc.exe&amp;&amp;FILE PATH FOR YOUR MEDIA FOLDER</cmdString>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>TTS.Speak</cmdType>
    <cmdString>playing music videos</cmdString>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <phrase>play music videos</phrase>
</command>


for more command line switches goto help, command line switches

Method 2
Http Api

Enable web interface in mpc by clicking on view,options.



click on launch in web browser.

now if you see this below in your web browser, all is well.



now make note of the url in the address bar

mine looks like this: http://localhost:13579/
13579 is the port

now for vc to get involved, we will use the scrape command in the command builder, the command below is for play
replace 13579 with your port number



<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.2.1.6-->
<command id="348" name="mpc_play" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
  <action>
    <cmdType>Scrape</cmdType>
    <params>
      <param>http://localhost:13579/command.html?wm_command=887&amp;null=0</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <phrase>play media</phrase>
</command>


some commands :

play
http://localhost:13579/command.html?wm_command=887&null=0
pause
http://localhost:13579/command.html?wm_command=888&null=0
stop
http://localhost:13579/command.html?wm_command=890&null=0
previous
http://localhost:13579/command.html?wm_command=921&null=0
next
http://localhost:13579/command.html?wm_command=922&null=0

for more on http commands open mpc web interface, click on "The media player interface made by chobits"
http://localhost:13579/controls.html



now view page source.

the stop command



so the command for stop will be.
http://localhost:13579/command.html?wm_command=890&null=0

The command I use for the payload xml :

<?xml version="1.0" encoding="utf-16"?>
<command id="604" name="mpc browser" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
  <action>
    <cmdType>Scrape</cmdType>
    <cmdString>http://localhost:13579/browser.html?path={1}</cmdString>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <phrase>m p c,media player classic,music video,play music video</phrase>
  <payloadFromXML phraseOnly="False" use2partPhrase="False" phraseConnector="by" Phrase2wildcard="anyone" optional="False">E:\Appz\Vox\Payloads\musicvideos.xml</payloadFromXML>
</command>






Neural Net Based Artificial Intelligence.

Kalle

***********  get excited and make things  **********

xtermin8r

Neural Net Based Artificial Intelligence.

xtermin8r

#4
interesting thing to note here is mpc has a web based file browser



http://localhost:13579/browser.html?path="somefile"


wouldn't it be nice if we could command mpc like xbmc to play us files by artist, name, title etc ?

</tr>
<tr class="mp4">
<td class="browser-td"><a href="/browser.html?path=E:\Videos\Music%20Vids\Tron%20Legacy%20Video%20_The%20Game%20Has%20Changed_.mp4">Tron Legacy Video _The Game Has Changed_.mp4</a></td>
<td class="browser-td"><span class="nobr">MP4</span></td>
<td class="browser-td align-right"><span class="nobr">48948K</span></td>
<td class="browser-td"><span class="nobr">2012.08.26 01:50</span></td>
</tr>


time to make a payload xml somehow, using regex and what not  :bonk
Neural Net Based Artificial Intelligence.

xtermin8r

#5
great news, I managed to write a python script (not in Iron Python) that creates a music videos payload xml for media player classic.
and it's working fine.

Ill upload the python script as soon as I "iron out"   :biglaugh  some issues, may take some time coz I suck at regex.
I'll upload a video also, I hope.


Neural Net Based Artificial Intelligence.

xtermin8r

#6
below is the Iron Python script for vc.


#-------------------------------------------------------------------------------
# Name:        VC MPC Payload Xml Generator
# Purpose:     I need it
#
# Author:      xtermin8r
#
# Created:     18/05/2014
# Copyright:   (c) xtermin8r 2014
# Licence:     111000111010
#-------------------------------------------------------------------------------
import urllib, urllib2
import re
import os
from re import findall
from xml.etree import ElementTree as ET

#function get rid of unwanted characters
def cfix(zx):
   global x
   f2 = re.sub( '\s+', ' ', zx).strip()
   f2 = f2.replace(" -", "")
   f2 = f2.replace("-", "")
   f2 = f2.replace(":", ".")
   f2 = re.sub( '\s+', ' ', f2).strip()
   x = f2
#    print(x)
   return x

# http request
url = "http://localhost:13579/browser.html?path=E:\Videos\Music%20Vids"
response = urllib.urlopen(url)
html = response.read()
htmlStr = str(html)

# close it
response.close()

#print(htmlStr)
#<a href="/browser.html?path=E:\Videos\Music%20Vids\Snap%20-%20The%20Power%20(HQ).mp4">Snap - The Power (HQ).mp4</a></td>
adata = findall('path=(.*?)">(.*?)\<', htmlStr)
#print(adata)

#Create Music Videos Phrases txt File
tf = open("music_videos.txt", "wb")

for value,phrase in adata:
  print(phrase)
  tf.write((str(phrase) + "\n"))
tf.close()

#create the root </PayloadsRoot> <PayloadsRoot>
root_element = ET.Element("PayloadsRoot")

for value,phrase in adata:
   #print(k,v)
   #create the first subelemet <payload> </payload>
   pay_element = ET.SubElement(root_element, "payload")
   #create the first child <value> </value>
   child = ET.SubElement(pay_element, "value")
   child.text = value
   #create the second child <phrase> </phrase>
   child = ET.Element("phrase")
   #get the filename without the extension
   fileName = (os.path.splitext(phrase)[0])
   #get rid of unwanted characters
   cfix(fileName)
   fileName = x
   child.text = fileName
   #now append
   pay_element.append(child)

#Let's see the results
a = ET.tostring(root_element)
#print a

def indent(elem, level=0):
   i = "\n" + level*'\t'
   if len(elem):
       if not elem.text or not elem.text.strip():
           elem.text = i + '\t'
       if not elem.tail or not elem.tail.strip():
           elem.tail = i
       for elem in elem:
           indent(elem, level+1)
       if not elem.tail or not elem.tail.strip():
           elem.tail = i
   else:
       if level and (not elem.tail or not elem.tail.strip()):
           elem.tail = i

indent(root_element)
#print ( ET.tostring(root_element) )

output_file = open( 'E:\Appz\Vox\VC_187_Eden\payloads\musicvideos.xml', 'w' )
output_file.write( '<?xml version="1.0" encoding="utf-8"?>'+'\n' )
output_file.write( '<!--A VoxCommando Payload file-->' +'\n' )
output_file.write( ET.tostring(root_element) )
output_file.close()


Enjoy.

I'll be uploading a video soon, stay tuned.
Neural Net Based Artificial Intelligence.

nime5ter

Amazing stuff, xtermin8r.  :clap

You've been busy.

So is etree working OK for you in Iron Python then or did you have to build in some workarounds? I seem to remember someone else here running into a bug to do with character encoding?  :-\

Also, I was curious if you had a particular reason that you preferred to scan your directory using Python rather than with the VCFileScanner tool that comes in the VC Extras package? Were you running into problems with that?

(i.e., http://voxcommando.com/mediawiki/index.php?title=Installation#VoxCommando_Extras)
TIPS: POST VC VERSION #. Explain what you want VC to do. Say what you've tried & what happened, or post a video demo. Attach VC log. Link to instructions followed.  Post your command (xml)

xtermin8r


Quote from: nime5ter on May 20, 2014, 02:48:02 PM
Amazing stuff, xtermin8r.  :clap

You've been busy.

So is etree working OK for you in Iron Python then or did you have to build in some workarounds? I seem to remember someone else here running into a bug to do with character encoding?  :-\

Also, I was curious if you had a particular reason that you preferred to scan your directory using Python rather than with the VCFileScanner tool that comes in the VC Extras package? Were you running into problems with that?

(i.e., http://voxcommando.com/mediawiki/index.php?title=Installation#VoxCommando_Extras)

Thanks Naomi.
I have not had any problems with etree as of yet. The reason I did it in Python was, I already had something written in Python for the task, and I find it easier to debug, and I wasn't aware of VCFilescanner  :bonk. I'm gonna give VCFilescanner a bash.
Neural Net Based Artificial Intelligence.

xtermin8r

WOW VCFilescanner is awesome, It was only today I was wondering how the hell am I going to scan the sub directories in Python.
Thank you so much for telling me about VCFilescanner, you and the voxinator have saved me hours of precious time.



Neural Net Based Artificial Intelligence.

jitterjames

There is also the commandline call to dir/s and the fact that the Launch.Capture action can now get back results...

I think that the method:
bool savePayloadFile(string strPath, Dictionary<string, string> payloadPairs, bool subsetMatching);
might also be helpful, but I've never actually tried to use it from python.  The idea would be to create a dictionary (myDictionary) of value/phrase pairs and then create a payloadxml file with a line of python code similar to this:
savePayloadFile("payloads\mvideoyfiles.xml", myDictionary, True)

I think your python code is very interesting as a starting point for doing much more sophisticated things, so thanks very much for posting it.  I admit that I have been too busy to give it a proper look but I certainly will soon.

xtermin8r

I have a problem the phrase and value that are generated by VCFilescanner are in the WRONG place I think, and it's not working.
I'm using VC 1.187.



Neural Net Based Artificial Intelligence.

jitterjames

WTF?

I need to take a look at this.  I guess no one else has tried to use this program recently...  :bonk

jitterjames

I made this and I don't use it personally, and I guess no one has every really tested and commented on it so ...  that's what happens.

The fact that the columns are reversed should be trivial to fix.   The hard part is to find the source code!

xtermin8r

Quote from: jitterjames on May 20, 2014, 06:49:01 PM
I made this and I don't use it personally, and I guess no one has every really tested and commented on it so ...  that's what happens.

The fact that the columns are reversed should be trivial to fix.   The hard part is to find the source code!

if you don't find the source let me know, I may be able to help.
Neural Net Based Artificial Intelligence.