终于实现了 mocp 的随机播放

Totem,mplayer,sopcast,realplayer,bmp
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

终于实现了 mocp 的随机播放

#1

帖子 lilydjwg » 2009-10-31 13:17

别的不说了,贴代码:(注意是 Python3 的)

代码: 全选

#!/usr/bin/env python3
# fileencoding=utf-8

'''随机播放的 mocp'''

import os
import random

mocdir = os.path.expanduser('~/.moc/')

def getlist():
  '''从默认播放列表获取文件列表'''
  def getit(f):
    l = []
    for i in f:
      i = i.strip()
      if i.startswith('#'):
        continue
      l.append(i)
    return l

  file = os.path.join(mocdir, 'playlist.m3u')
  try:
    with open(file) as f:
      l = getit(f)
  except IOError as e:
    if e.errno == 21:
      print('错误:%s 是目录。' % e.filename, file=sys.stderr)
    else:
      print('未知错误:错误号', e.errno, ';错误信息', e.strerror, file=sys.stderr)
    sys.exit(FileError)
  
  return l

def playafile(l):
  '''随机播放一个文件'''
  file = random.choice(l)
  file = os.path.abspath(file)
  status = os.system("mocp --playit '%s'" % file)
  print('播放文件 %s。' % file)
  if status:
    print('错误:子进程 mocp 返回了错误号 %d。' % status, file=sys.stderr)

def main():
  playafile(getlist())

def usage():
  print('''rmocp --- 让 mocp 随机播放音乐
  
  说明:
    运行此程序即可让 mocp 随机播放它的播放列表中的音乐。
    在 mocp 中作如下设置可让其自动随机播放:
      取消 AutoNext;
      设置 OnStop 为本程序的绝对路径。
    
  作者:
    lilydjwg <lilydjwg@gmail.com>
    
  版本:
    1.0''')

if __name__ == '__main__':
  main()
怎么用里面写了。

我对 mocp 使用的 socket 通信特别感兴趣,就自己做了个 rmocp 程序(见附件,程序自身有使用说明)。后来才注意到 mocp 的 --playit 选项,发现要实现随机播放根本不用那么复杂(就上面不到 100 行的代码)。不过对于 socket 通信倒是学了不少,也算没白忙一场。而且,rmocp 是可以使用任意的播放列表的(包括从管道读取)。
附件
rmocp.zip
(3.24 KiB) 已下载 83 次
上次由 lilydjwg 在 2014-10-17 20:27,总共编辑 2 次。
头像
xjpvictor
帖子: 2837
注册时间: 2007-08-22 15:55
系统: Archlinux
来自: 新加坡
联系:

Re: 终于实现了 mocp 的随机播放

#2

帖子 xjpvictor » 2009-10-31 13:22

不错,支持下。
不过我比较期待的是能重启后继续上次播放的曲目。。
Entschuldigung. Ich habe keine ahnung.
Secure with PGP: gpg --recv-keys 0x68b6e3d8
Fingerprint: 5556 517C F52F E402 DDF5 5400 6D30 F13E 68B6 E3D8
Towards A Sustainable Earth: Print Only When Necessary
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 终于实现了 mocp 的随机播放

#3

帖子 lilydjwg » 2009-10-31 13:27

xjpvictor 写了:不错,支持下。
不过我比较期待的是能重启后继续上次播放的曲目。。
这个我不期待,所以没写。简单说一下
OnSongChange 设置成一个脚本,比如

代码: 全选

mocp -i | grep File | sed -e 's/File: //'> lastsong
想接着播放时,使用脚本

代码: 全选

cat lastsong | xargs mocp --playit
mocp --next
头像
潇洒走一回
帖子: 735
注册时间: 2009-05-20 21:43

Re: 终于实现了 mocp 的随机播放

#4

帖子 潇洒走一回 » 2009-10-31 15:59

关于moc的随机播放,还有添加和更新播放列表功能,本来就是moc已有的功能...请看viewtopic.php?f=74&t=230589&p=1541384#p1541384
头像
潇洒走一回
帖子: 735
注册时间: 2009-05-20 21:43

Re: 终于实现了 mocp 的随机播放

#6

帖子 潇洒走一回 » 2009-10-31 16:19

lilydjwg 写了:
xjpvictor 写了:不错,支持下。
不过我比较期待的是能重启后继续上次播放的曲目。。
这个我不期待,所以没写。简单说一下
OnSongChange 设置成一个脚本,比如

代码: 全选

mocp -i | grep File | sed -e 's/File: //'> lastsong
想接着播放时,使用脚本

代码: 全选

cat lastsong | xargs mocp --playit
mocp --next
通过这个方式记住上次未完的歌曲是行不通的,cat lastsong | xargs mocp --playit这条命令会在后台播放lastson,它不会占用shell,所以紧接着mocp --next又执行了,事实上,上次的歌曲根本没播放...所以还得调用mocp -i提取lastsong的时长,playit执行后,要sleep那个时长的时间,然后继续,当然还可以绕一下,使用mplayer来播放上次的歌曲,它是在前台运行的,把歌曲播放玩之后才交出控制权,所以可以把mocp -p写在mplayer $lastsong后面...
我说的两种方式,我都通过bash实现过,但是衔接的不太好...加上我对该功能不感兴趣,我在我个人的控制mocp播放的脚本中剔除了该功能
上次由 潇洒走一回 在 2009-10-31 16:35,总共编辑 1 次。