Gisclub

4K | HDTV Ресиверы Enigma2 => Общие вопросы для всей линейки ресиверов на Enigma2 => Плагины => Тема начата: Дмитрий73 от 15 декабря | 2012г. | 11:49:17

Название: Seekbar Mod
Отправлено: Дмитрий73 от 15 декабря | 2012г. | 11:49:17
Модификация стандартного плагина Seekbar,который во время воспроизведения видео контента, стандартным видеоплеером, на кнопках << >>(длинное нажатие) выдаст вам удобное меню перемотки вперед-назад.
Поддержка:
-плагин MediaPlayer
-плагин DVDPlayer(старая версия)
-плагин MyTube
-встроенный DVDPlayer в Пли

Просьба отписаться,если словите креш,не совсем уверен,что сделал все правильно.
Но это дело поправимое,просто выложите креш-лог.
Название: Seekbar Mod
Отправлено: westsib от 15 декабря | 2012г. | 12:57:29
На  BP 2.0v1.0 работает  :drinks:
Что означает параметр "чувствительность"?
Название: Seekbar Mod
Отправлено: Дмитрий73 от 15 декабря | 2012г. | 14:14:03
На  BP 2.0v1.0 работает  :drinks:
Что означает параметр "чувствительность"?
На сколько секунд переместить курсор при каждом нажатии.
Если 10,то около минуты,если 1,то около 5 сек.
Название: Seekbar Mod
Отправлено: westsib от 15 декабря | 2012г. | 14:29:31
Чувствительность выставить не получается. Всегда по дефолту 10.
И переход по кнопкам <> только к началу фильма.
Название: Seekbar Mod
Отправлено: Дмитрий73 от 15 декабря | 2012г. | 14:34:34
Чувствительность выставить не получается. Всегда по дефолту 10.
Странно,цифровыми кнопками не меняется?
Плаг вообще то автоматом сохраняет,от 1 до 10.Как поставил,так и будет.
И переход по кнопкам <> только к началу фильма.
Что даже на файлах *.ts?
Название: Seekbar Mod
Отправлено: westsib от 15 декабря | 2012г. | 14:44:08
Цифровыми не меняется.
На .ts  переход есть.
Название: Seekbar Mod
Отправлено: Дмитрий73 от 15 декабря | 2012г. | 15:09:24
Цифровыми не меняется.
На .ts  переход есть.
Да,это проблемы драйверов в ву,в обеих случаях.
Название: Seekbar Mod
Отправлено: Дмитрий73 от 26 июля | 2013г. | 16:18:50
Версия 1.2
-добавлена поддержка nStreamVOD
Название: Seekbar Mod
Отправлено: Дмитрий73 от 13 декабря | 2013г. | 09:28:41
Версия 1.4
-добавлена поддержка таймшифта
Название: Seekbar Mod
Отправлено: grizli от 13 декабря | 2013г. | 10:57:15
Дмитрий73 (https://gisclub.tv/index.php?action=profile;u=12376), а как сделать что бы он вызывался кнопками влево вправо, короткое нажатие ?
Название: Seekbar Mod
Отправлено: Дмитрий73 от 13 декабря | 2013г. | 13:48:37
Дмитрий73 (https://gisclub.tv/index.php?action=profile;u=12376), а как сделать что бы он вызывался кнопками влево вправо, короткое нажатие ?
Через MQB наверное.
Название: Seekbar Mod
Отправлено: MegAndretH от 07 марта | 2014г. | 00:36:32
grizli
Если вопрос еще актуален, то допишите в /usr/share/enigma2/keymap.xml строки
   <map context="InfobarSeekActions">
      <device name="dreambox advanced remote control (native)">
         <key id="KEY_PREVIOUSSONG" mapto="seekBack" flags="b" />
         <key id="KEY_NEXTSONG" mapto="seekFwd" flags="b" />
         <key id="KEY_PREVIOUSSONG" mapto="seekBackManual" flags="l" />
         <key id="KEY_NEXTSONG" mapto="seekFwdManual" flags="l" />
         <key id="KEY_LEFT" mapto="seekBackManual" flags="m" />
         <key id="KEY_RIGHT" mapto="seekFwdManual" flags="m" />
      </device>
Дмитрий73
Можно ли сделать, чтобы при отсутствии строк, выделенных красным, они дописывались бы в файл?
И еще. По-моему, функция переназначения кнопок не отключается через меню.
Название: Seekbar Mod
Отправлено: sawa wapos от 15 июля | 2014г. | 15:53:29
Как установить на опенпли 4 ?
Название: Seekbar Mod
Отправлено: MegAndretH от 15 июля | 2014г. | 18:38:18
На фиде есть. Или несколько сообщений выше установочный пакет.
Название: Seekbar Mod
Отправлено: sawa wapos от 15 июля | 2014г. | 19:00:39
Не стает ни одна !
Название: Seekbar Mod
Отправлено: scorpionas56 от 15 июля | 2014г. | 19:07:08
Не стает ни одна !
Ставил два последних варианта, в плагинах не отображались,но на кнопки реагировали по-разному-значит что-то работает.
Название: Seekbar Mod
Отправлено: MegAndretH от 15 июля | 2014г. | 19:13:50
sawa wapos. При воспроизведении вызывается долгим нажатием кнопок перемотки, в плагинах не отображается.
Название: Seekbar Mod
Отправлено: Ingo от 08 февраля | 2016г. | 23:59:28
Очень актуальная тема, решил поднять, Спасибо автору.
Seasondream, Mediaportal, IPTVPlayer ...
Название: Seekbar Mod
Отправлено: Ingo от 12 февраля | 2016г. | 14:42:42
Тема только для Seekbar Mod , по TimeSeekBar здесь можно искать передержки?
Название: Seekbar Mod
Отправлено: Ingo от 15 февраля | 2016г. | 12:33:26
Не выходит сделать управление Seasondream в Seekbar Mod (в частности перемотку FLV), помогите разобраться.
Делал по аналогии, строго не судите ...
##
## Seekbar
## by AliAbdul
## mod Dima73(2012)
from Components.ActionMap import ActionMap
from Components.config import config, ConfigInteger, ConfigNumber, ConfigSelection, ConfigSubsection, ConfigYesNo, getConfigListEntry
from Components.ConfigList import ConfigListScreen
from Components.Label import Label
from Components.Language import language
from Components.Pixmap import MovingPixmap
from enigma import eTimer
from keyids import KEYIDS
from os import environ
from Screens.Screen import Screen
from Screens.InfoBar import MoviePlayer, InfoBar
from Tools.Directories import fileExists, resolveFilename, SCOPE_LANGUAGE, SCOPE_PLUGINS
from Tools.KeyBindings import addKeyBinding
import gettext, keymapparser



##############################################

config.plugins.Seekbar = ConfigSubsection()
config.plugins.Seekbar.overwrite_left_right = ConfigYesNo(default=True)
config.plugins.Seekbar.sensibility = ConfigInteger(default=10, limits=(1, 10))

##############################################

lang = language.getLanguage()
environ["LANGUAGE"] = lang[:2]
gettext.bindtextdomain("enigma2", resolveFilename(SCOPE_LANGUAGE))
gettext.textdomain("enigma2")
gettext.bindtextdomain("Seekbar", "%s%s" % (resolveFilename(SCOPE_PLUGINS), "Extensions/Seekbar/locale/"))

def _(txt):
   t = gettext.dgettext("Seekbar", txt)
   if t == txt:
      t = gettext.gettext(txt)
   return t

##############################################

class Seekbar(ConfigListScreen, Screen):
   skin = """
   <screen position="center,center" size="560,160" title="%s">
      <widget name="config" position="10,10" size="540,100" scrollbarMode="showOnDemand" />
      <widget name="cursor" position="0,125" size="8,18" pixmap="skin_default/position_arrow.png" alphatest="on" />
      <widget source="session.CurrentService" render="PositionGauge" position="145,140" size="270,10" zPosition="2" pointer="skin_default/position_pointer.png:540,0" transparent="1" foregroundColor="#20224f">
         <convert type="ServicePosition">Gauge</convert>
      </widget>
      <widget name="time" position="50,130" size="100,20" font="Regular;20" halign="left" backgroundColor="#4e5a74" transparent="1" />
      <widget source="session.CurrentService" render="Label" position="420,130" size="90,24" font="Regular;20" halign="right" backgroundColor="#4e5a74" transparent="1">
         <convert type="ServicePosition">Length</convert>
      </widget>
   </screen>""" % _("Seek")

   def __init__(self, session, instance, fwd):
      Screen.__init__(self, session)
      
      self.session = session
      self.infobarInstance = instance
      self.fwd = fwd
      if isinstance(session.current_dialog, MoviePlayer):
         self.movie = True
      else:
         self.movie = False
      try:
         if isinstance(session.current_dialog, MoviePlayer2):
            self.media = True
         else:
            self.media = False
      except:
         self.media = False
      try:
         if isinstance(session.current_dialog, DVDPlayer):
            self.dvd_pli = True
         else:
            self.dvd_pli = False
      except:
         self.dvd_pli = False
      try:
         if isinstance(session.current_dialog, DVDPlayer2):
            self.old_dvd = True
         else:
            self.old_dvd = False
      except:
         self.old_dvd = False
      try:
         if isinstance(session.current_dialog, MyTubePlayer):
            self.mytube = True
         else:
            self.mytube = False
      except:
         self.mytube = False
      try:
         if isinstance(session.current_dialog, nVODplayer):
            self.vod = True
         else:
            self.vod = False
      except:
         self.vod = False
      try:
         if isinstance(session.current_dialog, VODplayer):
            self.cSc_vod = True
         else:
            self.cSc_vod = False
      except:
         self.cSc_vod = False
      try:
            if isinstance(session.current_dialog, Player):
            self.seasondream = True
         else:
            self.seasondream = False
      except:
         self.seasondream = False
      try:
         if isinstance(session.current_dialog, InfoBar):
            self.timeshift = True
         else:
            self.timeshift = False
      except:
         self.timeshift = False
      self.percent = 0.0
      self.length = None
      service = session.nav.getCurrentService()
      if service:
         self.seek = service.seek()
         if self.seek:
            self.length = self.seek.getLength()
            position = self.seek.getPlayPosition()
            if self.length and position:
               if int(position[1]) > 0:
                  self.percent = float(position[1]) * 100.0 / float(self.length[1])
      
      self.minuteInput = ConfigNumber(default=5)
      self.positionEntry = ConfigSelection(choices=["<>"], default="<>")
      if self.fwd:
         txt = _("Jump x minutes forward:")
      else:
         txt = _("Jump x minutes back:")
      ConfigListScreen.__init__(self, [
         getConfigListEntry(txt, self.minuteInput),
         getConfigListEntry(_("Go to position:"), self.positionEntry),
         getConfigListEntry(_("Sensibility:"), config.plugins.Seekbar.sensibility),
         getConfigListEntry(_("Overwrite left and right buttons:"), config.plugins.Seekbar.overwrite_left_right)])
      
      self["cursor"] = MovingPixmap()
      self["time"] = Label()
      
      self["actions"] = ActionMap(["WizardActions"], {"back": self.exit}, -1)
      
      self.cursorTimer = eTimer()
      self.cursorTimer.callback.append(self.updateCursor)
      self.cursorTimer.start(200, False)
      
      self.onLayoutFinish.append(self.firstStart)

   def firstStart(self):
      self["config"].setCurrentIndex(1)

   def updateCursor(self):
      if self.length:
         x = 145 + int(2.7 * self.percent)
         self["cursor"].moveTo(x, 125, 1)
         self["cursor"].startMoving()
         pts = int(float(self.length[1]) / 100.0 * self.percent)
         self["time"].setText("%d:%02d" % ((pts/60/90000), ((pts/90000)%60)))

   def exit(self):
      self.cursorTimer.stop()
      ConfigListScreen.saveAll(self)
      self.close()

   def keyOK(self):
      sel = self["config"].getCurrent()[1]
      if sel == self.positionEntry:
         if self.length:
            if self.old_dvd: # seekTo() doesn't work for DVD Player
               oldPosition = self.seek.getPlayPosition()[1]
               newPosition = int(float(self.length[1]) / 100.0 * self.percent)
               if newPosition > oldPosition:
                  pts = newPosition - oldPosition
               else:
                  pts = -1*(oldPosition - newPosition)
               DVDPlayer2.doSeekRelative(self.infobarInstance, pts)
            elif self.media:
               oldPosition = self.seek.getPlayPosition()[1]
               newPosition = int(float(self.length[1]) / 100.0 * self.percent)
               if newPosition > oldPosition:
                  pts = newPosition - oldPosition
               else:
                  pts = -1 * (oldPosition - newPosition)
               MoviePlayer2.doSeekRelative(self.infobarInstance, pts)
            elif self.dvd_pli:
               oldPosition = self.seek.getPlayPosition()[1]
               newPosition = int(float(self.length[1]) / 100.0 * self.percent)
               if newPosition > oldPosition:
                  pts = newPosition - oldPosition
               else:
                  pts = -1 * (oldPosition - newPosition)
               DVDPlayer.doSeekRelative(self.infobarInstance, pts)
            elif self.mytube:
               oldPosition = self.seek.getPlayPosition()[1]
               newPosition = int(float(self.length[1]) / 100.0 * self.percent)
               if newPosition > oldPosition:
                  pts = newPosition - oldPosition
               else:
                  pts = -1 * (oldPosition - newPosition)
               MyTubePlayer.doSeekRelative(self.infobarInstance, pts)
            elif self.vod:
               oldPosition = self.seek.getPlayPosition()[1]
               newPosition = int(float(self.length[1]) / 100.0 * self.percent)
               if newPosition > oldPosition:
                  pts = newPosition - oldPosition
               else:
                  pts = -1 * (oldPosition - newPosition)
               nVODplayer.doSeekRelative(self.infobarInstance, pts)
            elif self.cSc_vod:
               oldPosition = self.seek.getPlayPosition()[1]
               newPosition = int(float(self.length[1]) / 100.0 * self.percent)
               if newPosition > oldPosition:
                  pts = newPosition - oldPosition
               else:
                  pts = -1 * (oldPosition - newPosition)
               VODplayer.doSeekRelative(self.infobarInstance, pts)
            elif self.seasondream:
               oldPosition = self.seek.getPlayPosition()[1]
               newPosition = int(float(self.length[1]) / 100.0 * self.percent)
               if newPosition > oldPosition:
                  pts = newPosition - oldPosition
               else:
                  pts = -1 * (oldPosition - newPosition)
               Player.doSeekRelative(self.infobarInstance, pts)
            elif self.movie:
               self.seek.seekTo(int(float(self.length[1]) / 100.0 * self.percent))
            elif self.timeshift:
               self.seek.seekTo(int(float(self.length[1]) / 100.0 * self.percent))
            else:
               pass
            self.exit()
      elif sel == self.minuteInput:
         pts = self.minuteInput.value * 60 * 90000
         if self.fwd == False:
            pts = -1*pts
         if self.old_dvd:
            DVDPlayer2.doSeekRelative(self.infobarInstance, pts)
         elif self.media:
            MoviePlayer2.doSeekRelative(self.infobarInstance, pts)
         elif self.dvd_pli:
            DVDPlayer.doSeekRelative(self.infobarInstance, pts)
         elif self.mytube:
            MyTubePlayer.doSeekRelative(self.infobarInstance, pts)
         elif self.vod:
            nVODplayer.doSeekRelative(self.infobarInstance, pts)
         elif self.cSc_vod:
            VODplayer.doSeekRelative(self.infobarInstance, pts)
         elif self.movie:
            MoviePlayer.doSeekRelative(self.infobarInstance, pts)
         elif self.seasondream:
            Player.doSeekRelative(self.infobarInstance, pts)
         elif self.timeshift:
            InfoBar.doSeekRelative(self.infobarInstance, pts)
         else:
            pass
         self.exit()

   def keyLeft(self):
      sel = self["config"].getCurrent()[1]
      if sel == self.positionEntry:
         self.percent -= float(config.plugins.Seekbar.sensibility.value) / 10.0
         if self.percent < 0.0:
            self.percent = 0.0
      else:
         ConfigListScreen.keyLeft(self)

   def keyRight(self):
      sel = self["config"].getCurrent()[1]
      if sel == self.positionEntry:
         self.percent += float(config.plugins.Seekbar.sensibility.value) / 10.0
         if self.percent > 100.0:
            self.percent = 100.0
      else:
         ConfigListScreen.keyRight(self)

   def keyNumberGlobal(self, number):
      sel = self["config"].getCurrent()[1]
      if sel == self.positionEntry:
         self.percent = float(number) * 10.0
      else:
         ConfigListScreen.keyNumberGlobal(self, number)

##############################################
# This hack overwrites the functions seekFwdManual and seekBackManual of the InfoBarSeek class (MoviePlayer and DVDPlayer)

def seekbar(instance, fwd=True):
   if instance and instance.session:
      instance.session.open(Seekbar, instance, fwd)

def seekbarBack(instance):
   seekbar(instance, False)

MoviePlayer.seekFwdManual = seekbar
MoviePlayer.seekBackManual = seekbarBack
InfoBar.seekFwdManual = seekbar
InfoBar.seekBackManual = seekbarBack
if fileExists("/usr/lib/enigma2/python/Screens/DVD.pyo"):
   try:
      from Screens.DVD import DVDPlayer
   except:
      pass
   else:
      DVDPlayer.seekFwdManual = seekbar
      DVDPlayer.seekBackManual = seekbarBack

dvdPlayer = "%s%s" % (resolveFilename(SCOPE_PLUGINS), "Extensions/DVDPlayer/plugin.py")
dvdPlayerKeymap = "%s%s" % (resolveFilename(SCOPE_PLUGINS), "Extensions/DVDPlayer/keymap.xml")
if fileExists(dvdPlayer) and fileExists(dvdPlayerKeymap):
   try:
      from Plugins.Extensions.DVDPlayer.plugin import DVDPlayer as DVDPlayer2
   except:
      pass
   else:
      DVDPlayer2.seekFwdManual = seekbar
      DVDPlayer2.seekBackManual = seekbarBack
mediaPlayer = '%s%s' % (resolveFilename(SCOPE_PLUGINS), 'Extensions/MediaPlayer/plugin.py')
if fileExists(mediaPlayer) or fileExists("%sc" % mediaPlayer):
   try:
      from Plugins.Extensions.MediaPlayer.plugin import MediaPlayer as MoviePlayer2
   except:
      pass
   else:
      MoviePlayer2.seekFwdManual = seekbar
      MoviePlayer2.seekBackManual = seekbarBack
mytubePlayer = '%s%s' % (resolveFilename(SCOPE_PLUGINS), 'Extensions/MyTube/plugin.py')
if fileExists(mytubePlayer) or fileExists("%sc" % mytubePlayer):
   try:
      from Plugins.Extensions.MyTube.plugin import MyTubePlayer
   except:
      pass
   else:
      MyTubePlayer.seekFwdManual = seekbar
      MyTubePlayer.seekBackManual = seekbarBack
nStreamVODPlayer = '%s%s' % (resolveFilename(SCOPE_PLUGINS), 'Extensions/nStreamVOD/plugin.pyo')
if fileExists(nStreamVODPlayer):
   try:
      from Plugins.Extensions.nStreamVOD.plugin import nVODplayer
   except:
      pass
   else:
      nVODplayer.seekFwdManual = seekbar
      nVODplayer.seekBackManual = seekbarBack
cScVODPlayer = '%s%s' % (resolveFilename(SCOPE_PLUGINS), 'Extensions/cScVOD/plugin.pyo')
if fileExists(cScVODPlayer):
   try:
      from Plugins.Extensions.cScVOD.plugin import VODplayer
   except:
      pass
   else:
      VODplayer.seekFwdManual = seekbar
      VODplayer.seekBackManual = seekbarBack
SeasondreamPlayer = '%s%s' % (resolveFilename(SCOPE_PLUGINS), 'Extensions/Seasondream/Player.pyo')
if fileExists(SeasondreamPlayer):
   try:
      from Plugins.Extensions.Seasondream.Player import Player
   except:
      pass
   else:
      Player.seekFwdManual = seekbar
      Player.seekBackManual = seekbarBack

      ##############################################
# This hack puts the functions seekFwdManual and seekBackManual to the maped keys to seekbarRight and seekbarLeft

DoBind = ActionMap.doBind
def doBind(instance):
   if not instance.bound:
      for ctx in instance.contexts:
         if ctx == "InfobarSeekActions":
            if instance.actions.has_key("seekFwdManual"):
               instance.actions["seekbarRight"] = instance.actions["seekFwdManual"]
            if instance.actions.has_key("seekBackManual"):
               instance.actions["seekbarLeft"] = instance.actions["seekBackManual"]
         DoBind(instance)

if config.plugins.Seekbar.overwrite_left_right.value:
   ActionMap.doBind = doBind

##############################################
# This hack maps the keys left and right to seekbarRight and seekbarLeft in the InfobarSeekActions-context

KeymapError = keymapparser.KeymapError
ParseKeys = keymapparser.parseKeys
def parseKeys(context, filename, actionmap, device, keys):
   if context == "InfobarSeekActions":
      if device == "generic":
         for x in keys.findall("key"):
            get_attr = x.attrib.get
            mapto = get_attr("mapto")
            id = get_attr("id")
            if id == "KEY_LEFT":
               mapto = "seekbarLeft"
            if id == "KEY_RIGHT":
               mapto = "seekbarRight"
            flags = get_attr("flags")
            flag_ascii_to_id = lambda x: {'m':1,'b':2,'r':4,'l':8}

            flags = sum(map(flag_ascii_to_id, flags))
            assert mapto, "%s: must specify mapto in context %s, id '%s'" % (filename, context, id)
            assert id, "%s: must specify id in context %s, mapto '%s'" % (filename, context, mapto)
            assert flags, "%s: must specify at least one flag in context %s, id '%s'" % (filename, context, id)
            if len(id) == 1:
               keyid = ord(id) | 0x8000
            elif id[0] == '\\':
               if id[1] == 'x':
                  keyid = int(id[2:], 0x10) | 0x8000
               elif id[1] == 'd':
                  keyid = int(id[2:]) | 0x8000
               else:
                  raise KeymapError("key id '" + str(id) + "' is neither hex nor dec")
            else:
               try:
                  keyid = KEYIDS[id]
               except:
                  raise KeymapError("key id '" + str(id) + "' is illegal")
            actionmap.bindKey(filename, device, keyid, flags, context, mapto)
            addKeyBinding(filename, keyid, context, mapto, flags)
      else:
         ParseKeys(context, filename, actionmap, device, keys)
   else:
      ParseKeys(context, filename, actionmap, device, keys)

if config.plugins.Seekbar.overwrite_left_right.value:
   keymapparser.parseKeys = parseKeys
   keymapparser.removeKeymap(config.usage.keymap.value)
   keymapparser.readKeymap(config.usage.keymap.value)

##############################################

def Plugins(**kwargs):
   return []
Еще бы упраправление на кн. "Право", "Лево"  :blush:
Название: Seekbar Mod
Отправлено: scorpionas56 от 15 февраля | 2016г. | 12:42:03
Не выходит
Рассмотри этот вариант TimeSeekBar (https://gisclub.tv/avtorskie-plaginy/timeseekbar-46243/)