Moi taas!
Windows Media Playerin komentorivituki on hyvin huono, joten teen ohjelman käyttämään VLC:tä musiikin ja elokuvien toistoon. Tarvitsisin muutaman koodin, jolla saisin tehtyä erillaisia asioita VLC:ssä. Tässä nykyiset koodit, jotka toimivat. Windows XP käyttöjärjestelmänä siis.
Käynnistää ohjelman: "C:\Program Files\VideoLAN\VLC\vlc.exe" Avaa kansion soitettavaksi: "C:\Program Files\VideoLAN\VLC\vlc.exe" "C:\Polku\Kansioon\Jossa\Kappaleet\Sijaitsevat" Avaa tiedoston soitettavaksi: "C:\Program Files\VideoLAN\VLC\vlc.exe" "C:\Polku\Soitettavaan\Tiedostoon"
Vielä pitäisi komentorivillä saada tehtyä seuraavat asiat:
VLC:n omat ohjeet ovat todella sekavia, enkä ole niistä ymmärtänyt mitään.
Mikäli haluat antaa komentoja jo käynnissä olevalle VLC:lle, ei se onnistu komentoriviltä, vaan joudut käyttämään telnet- tai http-käyttöliittymää.
Selaimella se onnistuu (Selasin jotain ohjeita, jossa oli noita funktioita), mutta voiko ohjelmani lähettää suoraan ohjelmalle netin yli tietoa ilman, että tarvittaisiin selainta?
Miten telnet toimii tässä?
Macro kirjoitti:
voiko ohjelmani lähettää suoraan ohjelmalle netin yli
Sun oma ohjelmas voi puhua ihan yhtä lailla HTTP:tä VLC:lle kuin se selainki.
Käsittääkseni selain vaatii VLC-laajennoksen, jotta se voi "puhua HTTP:tä" VLC:lle. Miten ohjelmani pystyy tälläisen tekemään?
Muokkaus. Selailtuani tarpeeksi kauan, löysin kirjaston pyvlc. Koitan tällä saada ohjelman toimimaan. Otan silti vinkkejä vastaan tähän "HTTP:n puhumiseen" VLC Playerille.
Macro kirjoitti:
Käsittääkseni selain vaatii VLC-laajennoksen
Ai, olipa kökkö systeemi.
No, sitten voit puhua HTTP:n sijasta sitä samaa protokollaa kuin se laajennos puhuu.
Löysin pari kirjastoa, libvlc ja pyvlc. Kumminkin kirjastojen ohjeet olivat vajaita (libvlc:stä näin vain puhuttavan foorumeilla), joten niistä ei saanut mitään vihjeitä.
En ymmärrä noita juttuja, että "puhu samaa protokkollaa kuin se laajennos puhuu". Siis mitä pitäisi tehdä? Miten Python sovellukseni pystyy tekemään tuollaisia asioita?
Muokkaus. Onko VLC:n Telnet interface "näkymätön", kun mitään ei tapadu klikatessani View -> Add interface -> Telnet Interface. Pythonilla on telnetlib, jolla voisi keskustella tuon VLC:n kanssa. Onko tämä järkevä vaihtoehto?
Mitä funktioita telnetlib:stä tarvitsee, että voi lähettää tietoja VLC:lle telnetillä? Kun klikkaa yllä mainitsemastani menusta, niin klikatessa "Console", aukeaa rc interface. Täällä toimivat hienosti seuraavat komennot: next, prev, pause, play, stop ja moni muu. Toimisivatkohan kaikki samat telnetillä? Mm...
Koitin Windowsin HyperTerminalia, otin yhteyden localhostiin 4212 portilla ja enter. HyperTerminaalin ikkunaan tuli "Password: ", johon piti antaa salasana. Kirjoitin "admin", joka pitäisi olla VLC:n rc:n salasana (remote control). Mitään ei tapahtunut.
Pitääkö VLC:tä konfiguroida jotenkin, että sitä voi näin etähallita? Käynnistin VLC telnetin näin: "C:\Program Files\VideoLAN\VLC\vlc.exe" -- intf telnet
Aukesi konsoli-ikkuna, johon sai antaa komentoja. Pitääkö jotain erikoista tehdä vielä? Olen asetuksista enabloinut VLC:n rc:n.
Kirjoitin Pythonin dokumentaation pohjalta esimerkin klientistä, mutta tämä ei toiminut.
import telnetlib tn = telnetlib.Telnet("localhost", 4212) tn.read_until("Password: ") tn.write("admin\n") while True: s = input("Lähetä VLC:lle: ") if s == "exit": break tn.write(str(s) + "\n") tn.write("exit\n")
Virhe tulee,
Traceback (most recent call last): File "C:\Documents and Settings\xxx\Desktop\telnetlib.py", line 1, in <module> import telnetlib File "C:\Documents and Settings\xxx\Desktop\telnetlib.py", line 3, in <module> tn = telnetlib.Telnet("localhost", 4212) AttributeError: 'module' object has no attribute 'Telnet'
Macro kirjoitti:
import telnetlib tn = telnetlib.Telnet("localhost", 4212) tn.read_until("Password: ") tn.write("admin\n") while True: s = input("Lähetä VLC:lle: ") if s == "exit": break tn.write(str(s) + "\n") tn.write("exit\n")Traceback (most recent call last): File "C:\Documents and Settings\xxx\Desktop\telnetlib.py", line 1, in <module> import telnetlib File "C:\Documents and Settings\xxx\Desktop\telnetlib.py", line 3, in <module> tn = telnetlib.Telnet("localhost", 4212) AttributeError: 'module' object has no attribute 'Telnet'
Laita tuo "Telnet" pienellä. Se saattaa olla syynä. Eli näin:
import telnetlib tn = telnetlib.telnet("localhost", 4212) tn.read_until("Password: ") tn.write("admin\n") while True: s = input("Lähetä VLC:lle: ") if s == "exit": break tn.write(str(s) + "\n") tn.write("exit\n")
Tuolla ei ollut mitään vaikutusta.
Minkä olet laittanut kooditiedoston nimeksi? Et kai vaan telnetlib.py? Tuo virheilmoitus tulisi ainakin siinä tapauksessa, koska "import telnetlib" tulkittaisiin niin, että haluat importoida nykyisestä hakemistosta tuon saman tiedoston, eikä se sisällä Telnet- tai telnet-luokkaa.
Edit: olet, senhän näkee virheilmoituksestakin:
"File "C:\Documents and Settings\xxx\Desktop\telnetlib.py", line 1, in <module>"
Eli nimeä tuo tiedosto paremmin, jottei nimikonflikteja tule.
Kun olet antanut VLC:lle salasanan telnetillä, sen pitäisi tulostaa "Welcome Master!", jonka jälkeen voit antaa komentoja.
HTTP-käyttöliittymä ei ainakaan minulla vaatinut mitään laajennosta. Esimerkiksi soivan kappaleen pysäyttäminen onnistuu lähettämällä sivupyyntö: http://localhost:8080/requests/status.xml?
Telnethän ei liikennöi mitään protokollakohtaista, joten Pythonissa normaalin socket-yhteyden pitäisi käydä ihan hyvin.
Edit: Kun käynnistät VLC:n telnet-käyttöliittymän VLC:n GUI:sta, ei siitä ilmoiteta mitenkään, se vain käynnistyy taustalla.
En ymmärrä, miksi tuo telnet-juttu ei toimi. Koodini ylhäällä toimii (kunhan lisäsin s-muuttujan lähetyksen yhteydessä encode("ascii") ja muuhun dataan b"data"), mutta mitään ei tapahdu serverillä. Koitan, saisinko sen paremmin toimimaan tuolla http-käyttöliittymällä, mutta kiinnostaisi tämä telnet silti :)
Joo, en muistanut että import sisällyttää tuolla tavalla tiedostoja, joten en tajunnut nimetä sitä tiedostoa eri nimellä.
Toimiiko se telnet-käyttöliittymä edes, jos kirjoitat komentoriville "telnet localhost 4212"?
-tossu- kirjoitti:
Toimiiko se telnet-käyttöliittymä edes, jos kirjoitat komentoriville "telnet localhost 4212"?
"Connecting To localhost...Could not open connection to the host, on port 4212: Connect failed"
Eli ei.
Olithan ottanut sen käyttöön parametrilla tai sieltä menusta? Eikös se joskus toiminut ainakin salasanakyselyyn asti?
Jos telnet ei ala toimimaan, voit tietysti käyttää HTTP:tä, mikäli se toimii, mutta telnet on varmasti helpompi.
Onnistuin sössimään jotain VLC:n asetuksissa, ja koko ohjelma ei enään käynnistynyt. Asensin uudelleen, laitoin ruksin asetuksissa kohtaan Remote control ja voilâ! telnet localhost 4212 toimi. En tiennytkään, että Windowsissa on tuollainen telnet-systeemi.
Jostain syystä samat komennot eivät toimi tässä kuin avaisi VLC:stä remote control interfacen. Eli, jos kirjoitan telnettiin pause, tulee "Unknown command".
VLC media player 1.1.0 The Luggage Password: Welcome, Master > help Commands Syntax: new (name) vod|broadcast|schedule [properties] setup (name) (properties) show [(name)|media|schedule] del (name)|all|media|schedule control (name) [instance_name] (command) save (config_file) export load (config_file) Media Proprieties Syntax: input (input_name) inputdel (input_name)|all inputdeln input_number output (output_name) option (option_name)[=value] enabled|disabled loop|unloop (broadcast only) mux (mux_name) Schedule Proprieties Syntax: enabled|disabled append (command_until_rest_of_the_line) date (year)/(month)/(day)-(hour):(minutes):(seconds)|now period (years_aka_12_months)/(months_aka_30_days)/(days)-(hours):(minute s):(seconds) repeat (number_of_repetitions) Control Commands Syntax: play [input_number] pause stop seek [+-](percentage) | [+-](seconds)s | [+-](milliseconds)ms Telnet Specific Commands: quit : logout from telnet/shutdown VLC from local shell description : describe this module shutdown : shutdown VLC help : show this help logout : logout license : print VLC's license message lock : lock the telnet prompt >
Näin saan tietää help komennolla. Eikös Control Commands Syntax kohdassa olekkin play, pause ja stop? Mikseivät nämä toimi? :o
Toisesta koneesta ei pysty yhdistämään telnetillä IP:n kanssa.
Jostain syystä koneeni VLC:tä ei huvita tiettyjä komentoriviparametrejä (--telnet-password, --telnet-port, --rc-host jne.), mutta kokeile komentoa
vlc --extraintf rc --rc-host localhost:4212
, ja yhdistä telnetillä, jos kaikki toimii hyvin pitäisi RC-käyttöliittymään pystyä yhdistämään.
Käynnistin sen noinkin, mutta ei se mitään auttanut. Samalla tavalla se toimii. Miten yllä olevan help-komennon tuloksen perusteella komennot pitäisi antaa? Minusta niin, kuin ehdotinkin.
Telnetissä on käytössä eri komennot, eli esim. "control <name> pause", eikä minulla ainakaan oli mitään aavistusta mitä <name>:n paikalle kuuluisi laittaa. Mikäli saisit VLC:n RC-käyttöliittymän tajuamaan, että pitää kuunella TCP-sockettia, eikä komentoriviä, voisit käyttää niitä yksinkertaisempia komentoja.
Lisäksi sinun kannattaa ainakin katsoa http://wiki.videolan.org/Console
Edit: VLC:n RC-käyttöliittymä tuntuu bugittavan aika pahasti, toisella koneella (VLC 1.0.6) komento
vlc --extraintf rc --rc-host localhost:1337
käynnisti hienosti RC-käyttöliittymän ja siihen voi yhdistää telnetillä, toisella koneella (VLC 1.1.0) sama komento käynnisti RC-käyttöliittymän konsoliin, vaikka sen piti toimia verkossa. Sinulla näyttää olevan juuri VLC:n versio 1.1.0, jossa tuo ei toimi.
Miten tuo ei toimi siis? Minulla tuo komento avaa VLC:n graafisen käyttöliittymän VLC:stä ja siihen voi yhdistää Telnetillä. Kyllä, minulla on uusin versio käytössä. Tietääkö joku, mitä -tossu-:n mainitseman <name>:n kohdalle kuuluu? Kun etsin netistä, niin sain käsityksen, että siihen kuuluisi "median" nimi. Mitä sitten tarkoittaneekaan.
Jos lähetän control audio pause
, saan vastauksen "control : audio : media unknown".
Tuo minun komentoni ei avaa telnet-käyttöliittymää, vaan rc-käyttöliittymän, joka hyväksyy yksinkertaisempia komentoja esim. "pause". Versiossa 1.1.0 se ei vaan jostain syystä toimi niin kuin pitäisi.
-tossu- kirjoitti:
toisella koneella (VLC 1.1.0) sama komento käynnisti RC-käyttöliittymän konsoliin, vaikka sen piti toimia verkossa.
Kuten VLC osaa itsekin kertoa, on olemassa myös käyttöliittymä oldrc.
$ vlc -I oldrc --rc-host localhost:1234
Keskustelu onnistuu ihan tavallisella TCP-socketilla vaikka komentoriviltä netcat-ohjelmalla:
$ nc localhost 1234 help +----[ Remote control commands ] | | add XYZ . . . . . . . . . . . . add XYZ to playlist | ... | logout . . . . . . . exit (if in socket connection) | quit . . . . . . . . . . . . . . . . . . . quit vlc | +----[ end of help ] enqueue kappale.mp3 trying to enqueue kappale.mp3 to playlist enqueue: returned 0 (no error) play play: returned 0 (no error)
Minulla VLC 1.1.0 ei ainakaan valittanut mitään kun yritin käyttää rc-käyttöliittymää, se ei vain toiminut niin kuin halusin, mutta oldrc tosiaan toimii, hyvä niin, eli sillä Macro voi käskyttää VLC:tä kätevästi.
Mulla on toi 1.1.0, joo, mutta ei tuo auttanut mitään kun laitoin sen oldrc:tä käyttämään. Samalla tavalla se toimii, paitsi graafinen käyttöliittymä jää uupumaan. Komennot eivät ole erillaiset.
Otithan yhteyden RC-käyttöliittymään, etkä telnet-käyttöliittymään. Mitä se RC-käyttöliittymä sanoo jos annat sille vaikka komennon "pause"?
Joo, emmä tollasta tajunnut. En saanut siihen millään yhteyttä noin, enkä jaksanut alkaa tehdä omaa ohjelmaa nyt. En löytänyt Windowsille mitään netcat ohjelmaa, tai vastaavaa, joka toimisi.
Et tarvitse netcattia, komento telnet ajaa saman asian. Mikäli käytit Metabolixin VLC-kometoa, saat RC-yhteyden komennolla "telnet localhost 1234".
Aaa. :D Joo, emmä tajunnut että se toimii, kun tuli vain musta ruutu. Se ei nähtävästi tulosta mitään kun se on yhdistänyt. Kiitos tiedosta.
Metabolixin käynnistyskoodi avaa vain terminaali-ikkunan, miten VLC:n GUI:n saisi myös näkyviin? Omalla ohjelmallani tuota on helppo kontrolloida, mutta koneen käyttäjä (eli minä) ei välttämättä tykkää kun joutuu koodeja syöttämään säätöä varten. Saako myös tuon terminaali-ikkunan piiloon, kun GUI näkyy?
Komennolla
vlc --extraintf oldrc --rc-host localhost:1234
pitäisi VLC:n GUI:n tulla näkyviin.
Joo, noin se toimikin. VLC:n asetuksista sai piilotettua komentorivi-ikkunan yhdellä ruksituksella. Nytten katson, miten se sopii ohjelmaani.
Miksei toisesta tietokoneesta saa yhteyttä Telnetillä VLC:n RC:hen? Kohdekoneen portti 1234 on auki, ja paikalliselta koneelta saa yhteyden. Käytin komentoa "vlc --extraintf oldrc --rc-host localhost:1234" VLC:n avaamiseen, ja "telnet 192.168.100.21 1234" yhteyden ottamiseen toiselta koneelta.
Macro kirjoitti:
Miksei toisesta tietokoneesta saa yhteyttä Telnetillä VLC:n RC:hen? Käytin komentoa "vlc --extraintf oldrc --rc-host localhost:1234" VLC:n avaamiseen, ja "telnet 192.168.100.21 1234" yhteyden ottamiseen toiselta koneelta.
Kokeilepas huviksesi muuttaa tuohon localhost:in paikalle tuo sama IP-osoite, mihin yrität telnetillä päästä kiinni. Tuo localhost on loopback network interface ja osoite on paikallinen: 127.0.0.1, siihen ei ole tarkoitus päästä ulkoapäin.
Ei tietenkään ulkoapäin pääse localhost-osoitteella toiseen koneeseen. Koitin paikallisella koneella ottaa samaiseen koneeseen yhteyden sen IP:llä; ei toiminut.
Etkö yllä kertonut käynnistäväsi VLC:n kuuntelemaan yhteydenottoja komennolla: "vlc --extraintf oldrc --rc-host localhost:1234" ?
Meinasin, että laita tuon localhost:in paikalle koneen oma hostname (sysname), tai IP-osoite, mikä näkyy ulospäin.
Äh, olimpas tyhmä. Kiitos sulle :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.