LINUX.ORG.RU

web-интерфейс для Clementine

 , , , ,


2

1

Начал искать сабж и ничего не нашел кроме брошенного еще в 2012 вот этого варианта: https://code.google.com/p/clementine-webremote/

Видимо всем хватает ремотконтроля для андроида. Но заводить последний только ради управления плеером нелепо. Поставил. Стили не загружаются, картинки не загружаются (((

А я о python знаю только, что он есть. Полазил по коду. Ну вобщем загрузку ресурсов я поправил на скорую руку, уж не знаю насколько это корректно, но этот код я думаю сложно испортить:

if self.path.endswith(".png"):
				self.show_button()
			if self.path.endswith(".jpg") and self.connectToClementine():
				self.show_cover()
			elif self.path.endswith(".css"):
				f = open(config.Workdir + '/style.css')
				self.send_response(200)
				self.send_header('Content-type', 'text/css')
				self.end_headers()
				self.wfile.write(f.read())
				f.close()
			elif self.path.endswith(".js"):
				f = open(config.Workdir + '/' + self.path)
				self.send_response(200)
				self.send_header('Content-type', 'text/css')
				self.end_headers()
				self.wfile.write(f.read())
				f.close()
:'(

Ясно что это надо переписывать.

Кроме того добавил возможность локализации, правда на js - ну это даже может и лучше - будет ориентироваться на настройки браузера.

Вот: https://yadi.sk/d/6ofLG7K7WY39J

Собственно я понимаю, что наверно кроме меня это нахрен никому не надо, поэтому все, что мне надо придется запилить самому. Отсюда просьба - дайте ссылку на что-то по python, желательно на великом и могучем, что поможет быстро въехать в пространства имен, все эти import ... as ... и во взаимодействие с системой наверное. В остальном вроде более-менее понятно. Ну кроме совсем глупого - тут вложенность что, отступами регулируется?

А, ну или дайте ссыль на какой-нибудь другой wuй.

★★★★★

Да, про взаимодействие с системой я имел ввиду нечто, что поможет понять вот это:

import dbus
import dbus.service
import sys
from dbus.mainloop.qt import DBusQtMainLoop

class Clementine:
  
	def __init__(self):
		self.bus = dbus.SessionBus()
		#try:
			#self.server = self.bus.get_object('org.mpris.clementine', '/Player')
			#self.tracklist = self.bus.get_object('org.mpris.clementine', '/TrackList')
			##qdbus org.mpris.clementine /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Pause 
			#self.mpris2 = self.bus.get_object('org.mpris.clementine', '/org/mpris/MediaPlayer2')
			#self.mpris2player = dbus.Interface(self.mpris2, dbus_interface='org.mpris.MediaPlayer2.Player')
		#except:
			#print "Clementine is not running? Exiting..."
			#sys.exit(-1)
		
		# Handle exception in http.py
		self.server = self.bus.get_object('org.mpris.clementine', '/Player')
		self.tracklist = self.bus.get_object('org.mpris.clementine', '/TrackList')
		self.mpris2 = self.bus.get_object('org.mpris.clementine', '/org/mpris/MediaPlayer2')
		self.mpris2player = dbus.Interface(self.mpris2, dbus_interface='org.mpris.MediaPlayer2.Player')
		self.propertiesManager = dbus.Interface(self.mpris2, 'org.freedesktop.DBus.Properties')
	
	def Next(self):
		self.server.Next()
		return True
  
	def Prev(self):
		self.server.Prev()
		return True
    
	def Play(self):
		self.server.Play()
		return True
	
	def Stop(self):
		self.server.Stop()
		return True
		
	def Pause(self):
		self.server.Pause()
		return True
	
	def GetInfo(self):
		return self.server.GetMetadata()
Что это за батарейка и как работает.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

Это dbus же, программа регестрируется в dbus в системе и предоставляет список действий которые поддерживает. И через dbus же можно эти все команды дергать, либо просто из терминала, либо через обертки для ЯП.

Вроде так.

NeverLoved ★★★★★
()
Ответ на: комментарий от NeverLoved

Ну общий смысл примерно понятен - да. Но вот конкретный вопрос - как мне узнать список доступных действий. Я не понял (((

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic
$ qdbus org.mpris.MediaPlayer2.clementine
/
/Player
/TrackList
/org
/org/mpris
/org/mpris/MediaPlayer2
$ qdbus org.mpris.MediaPlayer2.clementine /Player
signal void org.freedesktop.MediaPlayer.CapsChange(int)
method int org.freedesktop.MediaPlayer.GetCaps()
method QVariantMap org.freedesktop.MediaPlayer.GetMetadata()
method QDBusRawType::(iiii) org.freedesktop.MediaPlayer.GetStatus()
method void org.freedesktop.MediaPlayer.Mute()
method void org.freedesktop.MediaPlayer.Next()
method void org.freedesktop.MediaPlayer.Pause()
method void org.freedesktop.MediaPlayer.Play()
method int org.freedesktop.MediaPlayer.PositionGet()
method void org.freedesktop.MediaPlayer.PositionSet(int)
method void org.freedesktop.MediaPlayer.Prev()
method void org.freedesktop.MediaPlayer.Repeat(bool)
method void org.freedesktop.MediaPlayer.ShowOSD()
signal void org.freedesktop.MediaPlayer.StatusChange(QDBusRawType::(iiii)
method void org.freedesktop.MediaPlayer.Stop()
signal void org.freedesktop.MediaPlayer.TrackChange(QVariantMap)
method void org.freedesktop.MediaPlayer.VolumeDown(int)
method int org.freedesktop.MediaPlayer.VolumeGet()
method void org.freedesktop.MediaPlayer.VolumeSet(int)
method void org.freedesktop.MediaPlayer.VolumeUp(int)
method QDBusVariant org.freedesktop.DBus.Properties.Get(QString interface_name, QString property_name)
method QVariantMap org.freedesktop.DBus.Properties.GetAll(QString interface_name)
method void org.freedesktop.DBus.Properties.Set(QString interface_name, QString property_name, QDBusVariant value)
method QString org.freedesktop.DBus.Introspectable.Introspect()
method QString org.freedesktop.DBus.Peer.GetMachineId()
method void org.freedesktop.DBus.Peer.Ping()
NeverLoved ★★★★★
()
Последнее исправление: NeverLoved (всего исправлений: 1)
Ответ на: комментарий от NeverLoved

Вот тебе даже пример:

$ qdbus org.mpris.MediaPlayer2.clementine /Player org.freedesktop.MediaPlayer.GetMetadata
album: Serpents Of The Light
artist: Deicide
arturl: file:///tmp/clementine-art-JZ2985.jpg
audio-bitrate: 192
audio-samplerate: 44100
bpm: -1
genre: Death Metal
location: file:///home/neverloved/Музыка/Deicide/1997 - Serpents Of The Light/05-I Am No One.mp3
mtime: 218000
performer: Deicide
time: 218
title: I Am No One
tracknumber: 5
year: 1997
NeverLoved ★★★★★
()

что-то по python, желательно на великом и могучем, что поможет быстро въехать в пространства имен, все эти import ... as ... и во взаимодействие с системой наверное.

«Изучаем Python» М. Лутца

MrClon ★★★★★
()
Ответ на: комментарий от anonymous

Да, понятно. Но мне хотелось бы рулить именно Clementine. Жене например не понятно будет. А так у нее на компе привыный фейс и на телевизоре этой же хрень управляешь.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от MrClon

Спс - попробую. Вконце-концов webface к плееру штука вроде не сложная. )))

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от NeverLoved

Не могу понять как получить продолжительность проигрываемого трека.

Т.е. я могу конечно получить текущий трек в треклисте и потом из треклиста выдернуть продолжительность, но это выглядит костыльно...

Вообще странно что есть org.freedesktop.MediaPlayer.PositionGet() и есть org.freedesktop.MediaPlayer.PositionSet(int), но нет чего-то вроде org.freedesktop.MediaPlayer.PositionMaxGet() (((

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от d2

Спасибо, но я немного не то имел ввиду. Там о том как организовать взаимодействие и с этим тут полный порядок. Это наверное единственная часть проги которая не требует рефакторинга, по крайней мере с моей точки зрения. Т.е. биндинг из python организован предыдущими разрабами - у меня есть доступ ко всем методам. Но я не знаю какой метод и как использовать.

Однако все равно - спасибо, ибо это заставило меня еще раз поглядеть в метадата, а там есть время... Не знаю куда смотрел раньше. Теперь надо подумать как реализовать визуализацию прогрессбара и индюка громкости - у меня пока циферами. По уму надо бы было svg, но мне лень и еще я не знаю как со встроенным svg в мобильных устройствах - у меня, слава богу ни одного нет.

Пока перрепиливаю на ajax просто - осталось отдача плэйлиста и работа с ним.

Suntechnic ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.