opium_inside 24.04.2010 14:01

Скриптынебольшой now-playing между mocp и pidgin

По просьбе Главного начинаю выкладывать некоторые скрипты для пополнения функционала mocp.
Собственно, первый скрипт, написан на python с использованием D-bus. По вызову скрипта статус пиджина меняется на название текущего воспроизводимого трека.

В файле конфигурации mocp (~/.moc/config) есть строка вида "# OnSongChange = «/home/...». Файл, путь к которому передаётся в качестве аргумента этому параметру, и будет выполняться при смене трека. Можно туда прописать адрес данного скрипта, и он будет выполняться при каждой смене песни. Если место уже занято (например и чаще всего OSD), а автосмену статуса охота, то будет разумно добавить в конец OSD-скрипта строчку вида
python ~/.moc/scriptname.py


 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Если mocp и pidgin на разных хостах, то используйте эту команду
# ssh 192.168.0.153 python - producer < script.py | python script.py

import os, sys

def set_status(message, local_vars=
):
if not local_vars:
import dbus
obj = dbus.SessionBus().get_object("im.pidgin.purple.PurpleService",
"/im/pidgin/purple/PurpleObject")
purple = dbus.Interface(obj, "im.pidgin.purple.PurpleInterface")
local_vars.extend(<obj>)
obj, purple = local_vars
current = purple.PurpleSavedstatusGetCurrent()
status_type = purple.PurpleSavedstatusGetType(current)
saved = purple.PurpleSavedstatusNew("", status_type)
purple.PurpleSavedstatusSetMessage(saved, message)
purple.PurpleSavedstatusActivate(saved)

def get_mocp_title():
import subprocess
pipe = subprocess.Popen("mocp -i".split(), stdout=subprocess.PIPE).stdout
value = None
for line in pipe:
if ':' in line:
header, val = line.split(':', 1)
if header=="File":
value = os.path.basename(val.strip()).split('.')<0>
if header=="Title" and val.strip():
value = val.strip()
if value: return value.decode('utf-8', 'ignore')

if len(sys.argv) &gt; 1 and sys.argv<1> == "producer":
import time
oldst = None
while 1:
st = get_mocp_title()
if st != oldst:
print st.encode('utf-8')
sys.stdout.flush()
oldst = st
time.sleep(100)
elif len(sys.argv) &gt; 1 and sys.argv<1> == "consumer":
while 1:
line = sys.stdin.readline().decode('utf-8')
if not line: break
st = line.strip()
print "setting status:", st
set_status(st)
else:
st = get_mocp_title()
if st:
set_status(st)
</obj>



Тэги: moc mocp pidgin player python
+ 7 -
Похожие Поделиться

ner_uto 24.04.2010 17:48 #
А можно код прокомментировать? А то вдруг чего захочется под себя подпилить:)
opium_inside 24.04.2010 19:39 #
Код писался давно, на основе чьего-то чужого, тоже не комментированного кода, мои знания питона находятся где-то в районе плинтуса (я больше по Perl-у и *sh), поэтому писалось в основном интуитивно... но я попробую. :)
VGusev2007 24.04.2010 18:52 #
Какие версии pidgin и D-bus требуются?
opium_inside 24.04.2010 19:43 #
pidgin >= 2.5.2 (возможна работа на более ранних версиях, не тестировалось)
D-bus, насколько я помню, может похвастаться тем, что не ломает свой API, поэтому даже самый заядлый Debian'щик не уйдет обиженным.
VGusev2007 24.04.2010 18:54 #
На Ubuntu 8.10 заработало :)
VGusev2007 24.04.2010 18:58 #
И так: 1) не плохо бы довершить статью, дабы дополнить полное how-to, чтобы переключение статусов сменялось автоматически при запуске очередного трека.

2) в pidgin, в истории статусов сохраняется все статусы, в том числе и проигрываемые треки... Это не годится никуда :(
VGusev2007 24.04.2010 19:06 #
В файле конфигурации mocp (~/.moc/config) есть строка вида "# OnSongChange = «/home/...». Файл, путь к которому передаётся в качестве аргумента этому параметру, и будет выполняться при смене трека. Можно сразу раскоментировать строку и прописать в качестве параметра что-то вроде «home/username/.moc/osd.sh».


Нашёл, только конечно не плохо было бы каждый скрпит хотябы копипастить этот текст.
VGusev2007 24.04.2010 19:10 #
Да чтож я такой не терпеливый, подскажите как сделать, чтобы показывалось не таг, а имя файла. :)
VGusev2007 24.04.2010 19:15 #
Поменял Title на File, и стало показывать полный путь. - Полный путь до файла это КРУТО! Но у меня имя пользователя в системе не пристойное. :( Надо бы на ~ поменять, или обрезать :)
VGusev2007 24.04.2010 19:18 #
Реквестирую: сделать имя файла вместо тага, но преобразовать его в: ~/music/my_song.mp3 , сделать свою надпись в конце вида powered by mocp! Для изуверов можно парсить uname -a :)
opium_inside 24.04.2010 19:50 #
Лично я не отношусь к числу лиц, которые любят хвастаться своим плеером/системой прямо в статусе im, но идея забавная) Попробую выполнить реквест на досуге. Если есть энтузиазм, с радостью включу в скрипт патч :) А пока займусь комментированием кода чтобы в этом индийском безобразии можно было хоть как-то разобраться кому-то кроме меня.
opium_inside 24.04.2010 19:48 #
Дружище, будьте умеренны в любви к стимуляторам =)
VGusev2007 24.04.2010 19:55 #
Ох, давненько я хотел подобной штуки, просто дорвался :)

Хочется взрослому дядечке поиграться с этим как дитя...

Можно писать не uname конечно, но писать что-то своё.
opium_inside 24.04.2010 19:46 #
могу, конечно, дополнить. Но сам использую забинденную под это дело кнопочку на мультимедиа-клавиатуре (бывают моменты, когда хочется поделиться музыкой со всем миром, но они у меня бывают нечасто). Сейчас допишу.

2) Это, конечно, печально. Но ничего поделать не могу. Есть предложения по тому как это исправить?
VGusev2007 24.04.2010 19:53 #
2) к сожалению нету... Это надо копать исходники pidgin на предмет очистки статусов, да ещё и через D-bus. Это конечно весьма не просто :(

Мои знания в python вообще никакие.

В общем хотелось бы и к тагам и к файлам парсить что-то своё, и имя файла выводить с тильдой.

Я понимаю, что оно всё Вам на фиг не надо. Но очень уж я просто давно хотел такой возможности, поэтому очень обрадовался, когда прочитал про "Наше Радио" и про push статуса pidgin.

С тагами конечно беда, часть в CP, часть в UTF, часть без оных... Но да ладно.

Если не трудно, реализуйте добавление своей надписи. В pithon только интуитивно понимаю чего делает код, но сам не асилю.
opium_inside 24.04.2010 20:15 #
Я рад, что кому-то кроме меня пригодилось это поделие :) Спасибо за участие.

Я, к сожалению, сейчас имею довольно плотный рабочий график, но я с удовольствием повожусь на досуге с вашим реквестом.

По части "добавить в статус что-то своё в конец", это элементарно реализуется в течение 10 минут правки кода, только еще не придумал как было бы изящнее эту надпись сделать по выбору пользователя. Все-таки зашивать её прямо в код было бы слишком грубо, даже если это будет глобальная переменная в самом верху над шабангом с комментарием. Думаю, будет приниматься в качестве первого аргумента к скрипту.

В плане добавить тильду вместо /home/user/, тут всё сложнее. Мы не сами получаем имя файла, мы его принимаем из stdout самого mocp, а там оно указано именно так. Можно, конечно, сочинить регекспу, которая бы меняла все что перед вторым слешем включительно на ~, это я тоже смогу. Но, повторюсь, мои знания питона относятся к "могу с перловским акцентом сказать пару фраз с разговорником", поэтому подождем питонистов. Может кто-то захочет включиться) Если нет, завтра будем потихоньку быдлокодить.
VGusev2007 24.04.2010 21:20 #
Я понял, там mocp -i вывод используется, я его посмотрел разумеется. Да, каким-нибудь awk или sed или чего там самим python вывод просто обрезать, чтобы было: ./song.mp3 -- так думаю проще будет. Не обязательно ~.

В общем уже пару часов пользуюсь. Рад пока дико. :) Так я давно этого всего хотел. Linux уже три года как одна система, а такой я ребёнок иногда ещё. :)

Да, про аргумент не плохо сказали, но можно и глобальную перменную.

Я вижу, что код не сложный совсем, но так как нету опыта, могу лишь комментировать и просить, ну и тестировать. :)