Forget autoexec.py: the right way to automatically starts addons

  Thread Rating:
  • 2 Votes - 5 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Post Reply
malte Offline
Skilled Python Coder
Posts: 1,351
Joined: Jan 2010
Reputation: 28
Location: Germany
Post: #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.
(This post was last modified: 2011-06-03 20:32 by malte.)
find quote
vikjon0 Offline
---
Posts: 2,500
Joined: Apr 2009
Reputation: 8
Location: Sweden
Post: #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.
find quote
malte Offline
Skilled Python Coder
Posts: 1,351
Joined: Jan 2010
Reputation: 28
Location: Germany
Post: #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.
find quote
Steve Evans Offline
Junior Member
Posts: 20
Joined: Dec 2010
Reputation: 0
Post: #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
find quote
paddycarey Offline
Senior Member
Posts: 246
Joined: Sep 2009
Reputation: 8
Post: #20
Is there a way to pass an argument to my script at startup using this method?
find quote
Steve Evans Offline
Junior Member
Posts: 20
Joined: Dec 2010
Reputation: 0
Post: #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
find quote
_BJ1 Offline
Senior Member
Posts: 171
Joined: Apr 2010
Reputation: 0
Location: Germany
Post: #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
(This post was last modified: 2011-10-07 22:49 by _BJ1.)
find quote
queeup Offline
Posting Freak
Posts: 763
Joined: Feb 2009
Reputation: 16
Post: #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>
find quote
LakersFan Offline
Senior Member
Posts: 259
Joined: Jan 2008
Reputation: 0
Post: #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?
find quote
Martijn Offline
Team Kodi
Posts: 11,946
Joined: Jul 2011
Reputation: 170
Location: Dawn of time
Post: #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)

Always read the XBMC online-manual, FAQ and search the forums before posting.
Do NOT e-mail Team-XBMC members asking for support. Read/follow the forum rules.
For troubleshooting and bug reporting, make sure you read this first

For your mediacenter artwork go to
[Image: fanarttv.png]
find quote
leechguy Offline
Senior Member
Posts: 156
Joined: Aug 2009
Reputation: 6
Location: The Netherlands
Exclamation  RE: Forget autoexec.py: the right way to automatically starts addons
Post: #26
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?
find quote
Spinner65 Offline
Junior Member
Posts: 18
Joined: Nov 2012
Reputation: 0
Post: #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 ?
find quote
ignisuti Offline
Junior Member
Posts: 15
Joined: Feb 2012
Reputation: 0
Post: #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?
find quote
leechguy Offline
Senior Member
Posts: 156
Joined: Aug 2009
Reputation: 6
Location: The Netherlands
Post: #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
find quote
Post Reply