Видео смотреть бесплатно

Смотреть узбекский видео

Официальный сайт forexnw 24/7/365

Смотреть видео бесплатно

jungo 16.06.2011 01:30

Я рекомендуюУправляем плейлистами deadbeef из dmenu

Здравствуйте.

Я меломан с относительно большой музыкальной коллекцией и часто люблю послушать различные группы, даже в течение одного дня бывает включаю три-пять разных плейлистов.
Создать новый плейлист и добавить в него нужную группу не сложно и очень быстро :) Но я не люблю отрывать руки от клавиатуры (xmonad, кхе-кхе), поэтому мне лень перекладывать руку на трекболл и выбирать нужную директорию с музыкальной начинкой.
А так как dmenu - это наше всё, то я решил использовать его в вертикальном режиме - по нажатию хоткея сверху экрана появляется вертикальная менюшка со всеми плейлистами, остается только набрать две-три буквы из названия группы и клацнуть энтер :)

Музыки у меня много, вся она аккуратно разложена в директорию music. Руками создавать для каждой группы плейлист это непозволительный труд, поэтому и этот процесс автоматизирован - скрипт ищет все файлы в директории с музыкой и создает плейлист по названию корневой директории группы.

Хотя, наверное, все представляют как выглядит dmenu (в смысле те, кто пользуется), всё же выложу скриншот:
dmenu


Окно высотой 10 строк, по умолчанию, оформление под тему Zenburn.
Шрифты Droid Sans (dmenu-xft из AUR в Archlinux). Думаю понятно, что подправить цвет и шрифт под себя проще простого (чтобы выглядело красиво :))
В теле самого скрипта настраиваются директории музыки и плейлистов и само оформление dmenu.

Скрипт запускается с двумя опциями:


К сожалению в текущей версии deadbeef (0.5.1) нет (или я не нашел) возможности управления непосредственно плейлистами, т.е.

deadbeef playlist.{m3u,dbpl,pls}

или

deadbeef --queue playlist.{m3u,dbpl,pls}

открывает пустой плейлист с заголовком "Default" и всё.

Поэтому тут немного хитрая схема:
1. заставляем дедбиф проиграть первый файл из указанного плейлиста (тогда содержимое текущего плейлиста Default очищается и добавляется единственный новый трек).
2. по-одиночке добавляем оставшиеся файлы (выглядит не очень, но меня вполне устраивает)

Скрипт написан на питоне 3 (должен работать и на втором):
 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
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# deadbeef default playlist control script which uses dmenu
# by jungo

import os
import sys
from subprocess import Popen, PIPE

music_dir = '/home/media/music/'
playlist_dir = '/home/jungo/.playlists/'

dmenu_config = '-i -l 10 -fn "xft:Droid Sans:bold:pixelsize=18" -nb "#333333" -nf "#b3b3a1" -sb "#1e2320" -sf "#a3cacc"'

def escape(s):
"""
escapes string to acceptable format
"""
for sign in ['\\', ' ', '&', '\'', '"', '(', ')']:
s = s.replace(sign, '\\' + sign)
return s

def get_playlist_name(filepath):
"""
gets playlist name in the path
example: filepath is /home/media/music/AC-DC/1994 Remasters/album.flac
playlist will be 'AC-DC'
"""
dirs = len([x for x in music_dir.split('/') if x])
fp = [x for x in filepath.split('/') if x][dirs:]
if fp:
return fp[0]

def play():
"""
plays first song in playlist and queues all other
"""
playlist = Popen('cd '+playlist_dir+' && ls --color=never -A *.m3u | dmenu '+dmenu_config,
stdout=PIPE,
shell=True).communicate()[0]

with open(os.path.join(playlist_dir, playlist.decode('utf-8')), 'r') as f:
song = escape(f.readline())
Popen('deadbeef '+ song, shell=True).communicate()
for song in f.readlines():
Popen('deadbeef --queue '+escape(song), shell=True).communicate()

def create_playlists():
"""
creates playlist with extension m3u (without #EXTINF)
"""
for root, dirs, files in os.walk(music_dir):
for f in files:
ext = os.path.splitext(f)[1]
if ext in ['.flac','.mp3','.ogg','.wav','.m4a','.wv','.ape','.dts','.tta']:
filepath = os.path.join(root, f)
playlist_file = os.path.join(playlist_dir,
get_playlist_name(filepath)) + '.m3u'
with open(playlist_file, 'a') as playlist:
playlist.writelines(filepath+'\n')

try:
if sys.argv[1] == 'create':
create_playlists()
elif sys.argv[1] == 'play':
play()
except IndexError:
print(sys.argv[0], 'create to create playlists')
print(sys.argv[0], 'play to show dmenu to choose playlist')



На этом всё. Кому понравится - пользуйтесь на здоровье ;)


Тэги: deadbeef dmenu
+ 8 -
Похожие Поделиться

kakty3 16.06.2011 05:07 #
+ 4 -
по-моему нужно экранировать больше символов, т.е. у меня такая же ф-я выглядит так
1
2
3
4
5
def transform(filename):
   "transform full name of file to the acceptable string"
   for sign in ['\\', ' ', '&', '\'', '"', '(', ')']:
           filename = filename.replace(sign, '\\' + sign)
   return filename
jungo 16.06.2011 12:59 #
+ 0 -
Спасибо, отличное уточнение.

В хорошем качестве hd видео

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн