Сценарий Systemd + Python, который запускает VLC, не позволяет dbus управлять доступом к VLC

Мне удалось добиться этого с помощью следующего:

#!/bin/bash

search_dir=~/tmp

dirs=( $( find "$search_dir" -type f -name "*.txt" -exec dirname {} \; | sort -u ) )
exclude=()

for dir in "${dirs[@]}"; do
    exclude+=( -not -path "$dir" )
done

find "$search_dir" "${exclude[@]}"  -type d 

Измените переменную search_dirна родительский каталог, с которым вы хотите работать.

Затем он установит массив dirsдля каждого каталога, который содержит файлы.txt.

Затем каждый из этих каталогов будет добавлен в массив excludeв формате, который можно передать в find. Затем мы снова ищем в вашем родительском каталоге все каталоги, которых нет в массиве исключений.

1
25.06.2020, 19:49
2 ответа
[Unit]
Description=Test VLC From Python Script

[Service]
User=user
Environment="DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus"
ExecStart=/usr/bin/screen -D -S testvlc -m /home/user/testvlc

[Install]
WantedBy=multi-user.target

Кроме того, если вы запустите это из ~/.config/systemd/user, все будет нормально работать, включая 4K. Изменил разыскиваемый на default.targetи добавил After=graphical-session.target, удалил User=и Environment=и использовалsystemctl --user

0
18.03.2021, 23:24

Я делал что-то подобное в том смысле, что хочу управлять VLC из python через DBus.

Я настроил VLC в качестве службы, активируемой через DBus. Для этого мне нужно было сделать две вещи:

  1. Определить службу DBus
  2. Определите файл модуля systemd для VLC, который будет активирован, когда dbus обнаружит активность в #1.

Для службы DBus мне нужно было создать файл в /usr/share/dbus-1/services. Я назвал это org.mpris.MediaPlayer2.vlc.service. К сожалению, я не смог найти способ настроить его в каталоге пользователя.

# /usr/share/dbus-1/services/org.mpris.MediaPlayer2.vlc.service
[D-BUS Service]
Name=org.mpris.MediaPlayer2.vlc
Exec=/bin/false
SystemdService=vlc.service

С помощью этой информации мы сообщаем DBus, что любая активность, связанная с шиной, определенной параметром Name(org.mpris.MediaPlayer2.vlc), потребует активации службы vlc.service. Поэтому нам нужно определить такую ​​​​службу через файл модуля systemd. Вы можете поместить этот файл либо в~/.config/sytemd/user/(для пользовательской службы ), либо в/usr/lib/systemd/user/(для системной службы ).

# vlc.service
[Unit]
Description=VLC media player DBus activated service

[Service]
Type=dbus
BusName=org.mpris.MediaPlayer2.vlc
Environment=""
ExecStart=/home/jbellon/test/ytube-dl/vlc/install/usr/bin/vlc -I "dummy"

Обратите внимание, что тип службы здесь — DBus. Вы можете проверить свойства служб DBus в документации по файлу модуля Systemd.

Прошло некоторое время с тех пор, как я понял это правильно (, и я не осмеливался изменить его с ), но я думаю, что у меня были проблемы с использованием cvlc, поэтому я пошел прямо с основной программой, используя фиктивный интерфейс (-I "dummy"), что в основном то же самое.

Как только я разберусь с этим, вам просто нужно убедиться, что Systemd знает о сервисе VLC (systemctl daemon-reload), а также о DBus (, для этого вам нужно перезапустить DBus ).

Чтобы проверить это, вы можете попробовать сделать запрос к службе DBus, например, изучить интерфейс:

$ systemctl --user status vlc --lines 0
● vlc.service - VLC media player DBus activated service
   Loaded: loaded (vlc.service; bad; vendor preset: enabled)
   Active: inactive (dead)
$ gdbus introspect --session --dest org.mpris.MediaPlayer2.vlc -o /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2 &> /dev/null
$ systemctl --user status vlc --lines 0
● vlc.service - VLC media player DBus activated service
   Loaded: loaded (vlc.service; bad; vendor preset: enabled)
   Active: active (running) since Mon 2020-08-17 22:43:53 BST; 1s ago
 Main PID: 56522 (vlc)
    Tasks: 4 (limit: 38349)
   Memory: 2.0M
      CPU: 13ms
   CGroup: /user.slice/user-1000.slice/user@1000.service/vlc.service
           └─56522 /usr/bin/vlc -I dummy
0
18.03.2021, 23:24

Теги

Похожие вопросы