Forget autoexec.py: the right way to automatically starts addons
#16
I am using autoexec.py in Rom Collection Browser in two scenarios:
- relaunching RCB when emulator is used in solo mode (quit XBMC -> start emu -> play game -> quit emu -> start XBMC -> launch RCB)
- start scraping games at XBMC startup (background scraping while watching movies etc.)

What is the suggested way to get this working with the new service mechanism?
1. Add extension point "xbmc.service" to the original addon pointing to a little startup module that checks what to do (do nothing, launch RCB or start scraping)
2. Add one or two additional service addons that perform the tasks. In this case: How do I enable/disable a service from python code?

Edit: Nevermind, I decided to go with the second option.
Reply
#17
Quote:What is the suggested way to get this working with the new service mechanism?
I am also interested in best practise for this situation.
Reply
#18
Not sure, if this is the official way, but I did it like this and it was accepted to go into the repo:

- In main addon write a setting with the action for the service
- On XBMC startup the service checks the setting and disables the setting again
- The service does its job

Example service code is here.
Reply
#19
I've followed the guidance at http://wiki.xbmc.org/index.php?title=HOW...g_services and have an issue using an autologout service started at login.

Before explaining the issue, see the script shown below for reference. addon.xml:

Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="script.autologout"
       name="autologout"
       version="0.2"
       provider-name="Steve Evans">
  <requires>
    <import addon="xbmc.python" version="1.0"/>
  </requires>
  <extension point="xbmc.service"
             library="default.py" start="login">
  </extension>
  <extension point="xbmc.addon.metadata">
    <platform>all</platform>
    <summary lang="en">Auto-logout if left idle</summary>
  </extension>
</addon>

default.py:

Code:
import xbmc,time

# idle time in minutes
IDLE_TIME_MIN = 5
      
s = 1
while s > 0:
    # get idle time
    it = xbmc.getGlobalIdleTime()
    #calculate sleep time in msec
    s = ((IDLE_TIME_MIN * 60) - it ) * 1000
    # sleep for IDLE_TIME_MIN if playing
    if (xbmc.Player().isPlaying()): s = IDLE_TIME_MIN * 60 * 1000
#    print("autologout: Sleeping for %d ms" % s)
    if (s > 0): xbmc.sleep(s)

# log off
print('autologout: Logging off')
xbmc.executebuiltin('System.LogOff')
#print('autologout: Logged off')

I use profiles to manage who gets to watch what, and also have assigned the red button on my remote to logout by tweaking .xbmc/userdata/keymaps/remote.xml by adding the following.

Code:
<red>System.LogOff</red>

Should I forget to hit the red button after viewing something I don't want the kids watching, the above script will log off automatically after 5 minutes on inactivity. Everything appears OK, however, should I remember to log off, this script, launched at logon, isn't terminated. If I log into and out of a few profiles, several copies of the script end up running at the same time, evidenced by the following appearing in the log 5 minutes later:

Code:
19:48:41 T:3069180784  NOTICE: autologout: Logging off
19:48:41 T:3069180784    INFO: Scriptresult: Success
19:48:41 T:3069180784    INFO: Python script interrupted by user
19:48:41 T:3069180784   DEBUG: Thread XBPyThread 3069180784 terminating
19:48:41 T:3010460528  NOTICE: autologout: Logging off
19:48:41 T:3010460528    INFO: Scriptresult: Success
19:48:41 T:3010460528    INFO: Python script stopped
19:48:41 T:3010460528   DEBUG: Thread XBPyThread 3010460528 terminating
19:48:41 T:81242992  NOTICE: autologout: Logging off
19:48:41 T:81242992    INFO: Scriptresult: Success
19:48:41 T:81242992    INFO: Python script stopped
19:48:41 T:81242992   DEBUG: Thread XBPyThread 81242992 terminating
19:48:41 T:3035626352  NOTICE: autologout: Logging off
19:48:41 T:3035626352    INFO: Scriptresult: Success
19:48:41 T:3035626352    INFO: Python script interrupted by user
19:48:41 T:3035626352   DEBUG: Thread XBPyThread 3035626352 terminating

In the above example there were clearly three copies of the script still running.

So, my question is, how should service scripts started at login be terminated?

Steve
Reply
#20
Is there a way to pass an argument to my script at startup using this method?
Reply
#21
Come on guys... I hate to be impatient, but...

The URL quoted above describes how to terminate a service launched at startup; ie terminate on XBMC shutdown, but I'm still in the dark about how to terminate a service started at login.

There needs to be a function that reports that we're logging out, or have logged out.

Steve
Reply
#22
I have solved this with a pid-file. if a pid-file isn't present, the process runs at first time, otherwise your process is already running. Don't forget to delete the pid-file if your process terminate correctly otherwise a new process will not start.

Code:
import os
import subprocess
import xbmc
import xbmcaddon
import xbmcgui

__addonname__ = 'script.program.youraddon'
__datapath__ = xbmc.translatePath(os.path.join('special://temp',__addonname__))
if not os.path.exists(__datapath__): os.makedirs(__datapath__)

PIDFILE = os.path.join(__datapath__, 'youraddon.PID')

def isPIDFile():
    # check for PIDFILE, if no PIDFILE available, user or system has
    # powered|logged on the system at first time else a process is already
    # running
    
    pf = False
        syscmd = subprocess.Popen(['pidof','xbmc.bin'],stdout=subprocess.PIPE)
        pidofXBMC =  syscmd.stdout.read().strip()
    if not os.path.isfile(PIDFILE):
            f = open(PIDFILE, 'w')
            f.write(pidofXBMC + '\n')
        f.close()
        print 'system powered on first time'
    else:
        f = open(PIDFILE, 'r')
        pidofFile = f.readline().strip()
        f.close()
        if pidofFile == pidofXBMC:
            pf = True
        else:
                # XBMC is probably crashed before
                f = open(PIDFILE, 'w')
                f.write(pidofXBMC + '\n')
                f.close()
                print 'found old PIDFile, XBMC probably crashed'
    return pf


### MAIN SERVICE ###

if not isPIDFile():
    # your application code
    # last line:
    if os.path.isfile(PIDFILE): os.remove(PIDFILE)
else:
    # do nothing
    pass


The pid-file is located at ~/.<USER>/temp/script.program.youraddon/youraddon.PID
Hope this helps

_BJ1
Reply
#23
Is there any way to execute script before exit or stop xbmc? I am trying to stop bash script I started with xbmc.servise on XBMC start.

Code:
<extension point="xbmc.service"
             library="service.py" start="login|startup|stop">
</extension>
Reply
#24
Code:
<extension point="xbmc.service"
             library="service.py" start="login|startup|stop">
</extension>

Is there any way I can get it to start with a keyboard button as opposed to login, startup, and/or stop?
Reply
#25
queeup Wrote:Is there any way to execute script before exit or stop xbmc? I am trying to stop bash script I started with xbmc.servise on XBMC start.

Code:
<extension point="xbmc.service"
             library="service.py" start="login|startup|stop">
</extension>

LakersFan Wrote:
Code:
<extension point="xbmc.service"
             library="service.py" start="login|startup|stop">
</extension>

Is there any way I can get it to start with a keyboard button as opposed to login, startup, and/or stop?

Do not use "startup" and "login" at the same time!!
Either use "startup" and the script will be run at startup or use "login" and it will be started on login and stopped on logout (logout only from beta3 and up)
Read/follow the forum rules.
For troubleshooting and bug reporting, read this first
Interested in seeing some YouTube videos about Kodi? Go here and subscribe
Reply
#26
Exclamation 
Please be aware that the 'startup' option contains a design flaw when using multiple profiles!

Code:
<extension point="xbmc.service"
             library="service.py" start="startup">
</extension>

Let's assume we have three profiles (Master user, Alice and Bob) and we are using the login screen at startup of XBMC.
At startup of XBMC, the service will start automatically and you will be presented with the login screen (if enabled). Now, with no one logged in yet, from which profile will your addon load its settings? Well, actually someone is already logged in and this can be either Master user, Alice or Bob depending on who was logged in during the last session.

So when using multiple profiles, the configuration of your addon must be exactly the same for all profiles, otherwise you won't know what your addon will do. One time it will use the settings from Alice, the next time from Bob and another time the settings from the Master user may be used.

In my opinion, addon services starting at startup must always use the settings from the Master user, should only be configurable by the master user and should only be enabled/disabled by the master user. Services that require profile specific settings should use the 'login' start type.

Any thoughts on this?
Reply
#27
Having some form of autoexec.py to auto launch external programs, would great in future releases.

I'm using autoexec.py to run some bash scripts (they run xmodmap and hidd commands).

If the autoexec.py function is removed after Eden... how would I do the same thing ?


Reply
#28
Follow-up to Steve Evan's post on 2011-09-06 21:05 concerning the "autologout" script...

Where do I place the addon.xml and default.py files?
Reply
#29
(2013-05-15, 05:17)ignisuti Wrote: Follow-up to Steve Evan's post on 2011-09-06 21:05 concerning the "autologout" script...

Where do I place the addon.xml and default.py files?

If you want to do auto logout on idle, you may want to check out my addon: Load a configurable default profile on startup of XBMC
Reply

Logout Mark Read Team Forum Stats Members Help
Forget autoexec.py: the right way to automatically starts addons2