You are here: Home » Topic » Requesting a rescan crashes svn-1696

Requesting a rescan crashes svn-1696

This topic contains 11 replies, has 2 voices, and was last updated by  fizze 8 years, 6 months ago.

Viewing 12 posts - 1 through 12 (of 12 total)
  • Author
    Posts
  • #2793

    Anonymous

    Howdy all,

    Every time I ask firefly/mt-daapd to rescan my library from the web interface, mt-daapd/Firefly crashes. I’ve tried hitting “Start Scan” and “Start Full Scan,” both of which produce the same results: a crash.

    My installation is pretty common, but here are the details:

    mt-daapd/Firefly Version: svn-1696
    Server OS: openSUSE 11.1
    Server Hardware: PC
    Client Device: MacBook Pro laptop (Intel – OS 10.5)
    Client Software: iTunes 8.0.2 (20)
    Connection: Ethernet (Server -> Router -> Laptop)
    Web Interface: Can connect, able to make config changes

    I initially had 1 mp3 file in my library. Once I got mt-daapd up and running, I was able to play, scrub, get track info on, etc. that 1 mp3. Then, I added 2 more songs into my library (for a total of 3). I tried initiating a rescan via the web interface, but that crashed mt-daapd/Firefly. After trying out all sorts of different ideas, I finally decided to delete songs3.db at /usr/local/var/cache/mt-daapd/songs3.db and force a rescan.

    Restarting mt-daapd/Firefly prompted the rescan, and the 2 new songs were added into the database. I can now stream all 3 songs to my laptop from my server. Problem is, initiating a rescan still causes mt-daapd/Firefly to crash. I have a large audio collection (I routinely clean-up id3 tags, add new songs, etc.), and deleting songs3.db, stopping mt-daapd, and then starting it back up again every single time I want to update the database isn’t really fixing the problem…

    Here’s /var/log/messages with debuglevel=9

    Mar 25 03:35:02 mediaserver mt-daapd[14319]: Firefly Version svn-1696: Starting with debuglevel 9
    Mar 25 03:35:02 mediaserver mt-daapd[14319]: Plugin loaded: rsp/svn-1696
    Mar 25 03:35:02 mediaserver mt-daapd[14319]: Plugin loaded: daap/svn-1696
    Mar 25 03:35:02 mediaserver mt-daapd[14319]: Plugin loaded: ssc-script/svn-1696
    Mar 25 03:35:02 mediaserver mt-daapd[14319]: Starting rendezvous daemon
    Mar 25 03:35:02 mediaserver mt-daapd[14319]: Starting signal handler
    Mar 25 03:35:02 mediaserver mt-daapd[14321]: Initializing database
    Mar 25 03:35:02 mediaserver mt-daapd[14321]: Starting web server from /usr/local/share/mt-daapd/admin-root on port 3689
    Mar 25 03:35:02 mediaserver mt-daapd[14321]: Registering rendezvous names
    Mar 25 03:35:02 mediaserver mt-daapd[14321]: Serving 3 songs. Startup complete in 0 seconds
    Mar 25 03:35:36 mediaserver su: (to root) todd on /dev/pts/8
    Mar 25 03:37:03 mediaserver mt-daapd[14321]: Thread 24: Out of memory
    Mar 25 03:37:03 mediaserver mt-daapd[14320]: Rendezvous socket closed (daap server crashed?) Aborting.

    And here’s the output of the /var/log/mt-daapd.log the instant after I hit “Scan”

    2009-03-25 03:37:02 (c2083dae): Got listen socket 9
    2009-03-25 03:37:02 (6729d1bf): Thread 23:
    2009-03-25 03:37:02 (6729d1bf): Request: GET /xml-rpc?method=stats HTTP/1.1
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Read: User-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.10 (like Gecko) SUSE
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Adding header *User-Agent=Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.10 (like Gecko) SUSE*
    2009-03-25 03:37:02 (6729d1bf): Added *User-Agent=Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.10 (like Gecko) SUSE*
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Read: Referer: http://localhost:3689/index.html
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Adding header *Referer=http://localhost:3689/index.html*
    2009-03-25 03:37:02 (6729d1bf): Added *Referer=http://localhost:3689/index.html*
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Read: Accept: text/html, image/jpeg, image/png, text/*, image/*, */*
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Adding header *Accept=text/html, image/jpeg, image/png, text/*, image/*, */**
    2009-03-25 03:37:02 (6729d1bf): Added *Accept=text/html, image/jpeg, image/png, text/*, image/*, */**
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Read: Accept-Encoding: x-gzip, x-deflate, gzip, deflate
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Adding header *Accept-Encoding=x-gzip, x-deflate, gzip, deflate*
    2009-03-25 03:37:02 (6729d1bf): Added *Accept-Encoding=x-gzip, x-deflate, gzip, deflate*
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Read: Accept-Charset: utf-8, utf-8;q=0.5, *;q=0.5
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Adding header *Accept-Charset=utf-8, utf-8;q=0.5, *;q=0.5*
    2009-03-25 03:37:02 (6729d1bf): Added *Accept-Charset=utf-8, utf-8;q=0.5, *;q=0.5*
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Read: Accept-Language: en
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Adding header *Accept-Language=en*
    2009-03-25 03:37:02 (6729d1bf): Added *Accept-Language=en*
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Read: Host: localhost:3689
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Adding header *Host=localhost:3689*
    2009-03-25 03:37:02 (6729d1bf): Added *Host=localhost:3689*
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Read: x-prototype-version: 1.4.0
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Adding header *x-prototype-version=1.4.0*
    2009-03-25 03:37:02 (6729d1bf): Added *x-prototype-version=1.4.0*
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Read: x-requested-with: XMLHttpRequest
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Adding header *x-requested-with=XMLHttpRequest*
    2009-03-25 03:37:02 (6729d1bf): Added *x-requested-with=XMLHttpRequest*
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Read: Authorization: Basic Om10LWRhYXBk
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Adding header *Authorization=Basic Om10LWRhYXBk*
    2009-03-25 03:37:02 (6729d1bf): Added *Authorization=Basic Om10LWRhYXBk*
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Read: Connection: Keep-Alive
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Adding header *Connection=Keep-Alive*
    2009-03-25 03:37:02 (6729d1bf): Added *Connection=Keep-Alive*
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Read:
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Headers parsed!
    2009-03-25 03:37:02 (6729d1bf): Checking to see if connection matches close
    2009-03-25 03:37:02 (6729d1bf): And it does NOT
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Connection type HTTP/1.1
    : Connection: persist
    2009-03-25 03:37:02 (6729d1bf): Thread 23: parsing GET args
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Adding arg method = stats
    2009-03-25 03:37:02 (6729d1bf): Added *method=stats*
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Done parsing GET/POST args!
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Original URI: /xml-rpc
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Translated URI: /xml-rpc
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Preparing to find handler
    2009-03-25 03:37:02 (6729d1bf): Checking /xml-rpc against handler for /
    2009-03-25 03:37:02 (6729d1bf): Thread 23: URI Match!
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Time is 1237970222 seconds after epoch
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Setting time header
    2009-03-25 03:37:02 (6729d1bf): Added *Date=Wed, 25 Mar 2009 08:37:02 GMT*
    2009-03-25 03:37:02 (6729d1bf): Added *Connection=keep-alive*
    2009-03-25 03:37:02 (6729d1bf): Added *Server=mt-daapd/svn-1696*
    2009-03-25 03:37:02 (6729d1bf): Added *Content-Type=text/html*
    2009-03-25 03:37:02 (6729d1bf): Added *Content-Language=en_us*
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Using non-default handler
    2009-03-25 03:37:02 (6729d1bf): in main_auth
    2009-03-25 03:37:02 (6729d1bf): Checking url /xml-rpc
    2009-03-25 03:37:02 (6729d1bf): Checking url /xml-rpc
    2009-03-25 03:37:02 (6729d1bf): Dispatching auth for /xml-rpc to config auth
    2009-03-25 03:37:02 (6729d1bf): Checking if pw required for /xml-rpc as admin
    2009-03-25 03:37:02 (6729d1bf): Yep
    2009-03-25 03:37:02 (6729d1bf): Preparing to decode Om10LWRhYXBk
    2009-03-25 03:37:02 (6729d1bf): Decoded :mt-daapd
    2009-03-25 03:37:02 (6729d1bf): Decoded user=, pw=mt-daapd
    2009-03-25 03:37:02 (6729d1bf): in main_auth
    2009-03-25 03:37:02 (6729d1bf): Checking url /xml-rpc
    2009-03-25 03:37:02 (6729d1bf): Checking url /xml-rpc
    2009-03-25 03:37:02 (6729d1bf): Dispatching auth for /xml-rpc to config auth
    2009-03-25 03:37:02 (6729d1bf): Added *HTTP_USER=*
    2009-03-25 03:37:02 (6729d1bf): Added *HTTP_PASSWD=mt-daapd*
    2009-03-25 03:37:02 (6729d1bf): in main_handler
    2009-03-25 03:37:02 (6729d1bf): Checking url /xml-rpc
    2009-03-25 03:37:02 (6729d1bf): Checking url /xml-rpc
    2009-03-25 03:37:02 (6729d1bf): Dispatching /xml-rpc to config handler
    2009-03-25 03:37:02 (6729d1bf): Entering config_handler
    2009-03-25 03:37:02 (6729d1bf): Entering config_set_status
    2009-03-25 03:37:02 (6729d1bf): Exiting config_set_status
    2009-03-25 03:37:02 (6729d1bf): Updating Connection from keep-alive to close
    2009-03-25 03:37:02 (6729d1bf): Entering config_set_status
    2009-03-25 03:37:02 (6729d1bf): Exiting config_set_status
    2009-03-25 03:37:02 (6729d1bf): Added *Cache-Control=no-cache*
    2009-03-25 03:37:02 (6729d1bf): Added *Expires=-1*
    2009-03-25 03:37:02 (6729d1bf): Updating Content-Type from text/html to text/xml; charset=utf-8
    2009-03-25 03:37:02 (6729d1bf): Emitting reponse header Expires: -1
    2009-03-25 03:37:02 (6729d1bf): Emitting reponse header Cache-Control: no-cache
    2009-03-25 03:37:02 (6729d1bf): Emitting reponse header Content-Language: en_us
    2009-03-25 03:37:02 (6729d1bf): Emitting reponse header Content-Type: text/xml; charset=utf-8
    2009-03-25 03:37:02 (6729d1bf): Emitting reponse header Server: mt-daapd/svn-1696
    2009-03-25 03:37:02 (6729d1bf): Emitting reponse header Connection: close
    2009-03-25 03:37:02 (6729d1bf): Emitting reponse header Date: Wed, 25 Mar 2009 08:37:02 GMT
    2009-03-25 03:37:02 (6729d1bf): Status inquiry
    2009-03-25 03:37:02 (45677c12): Processing rendezvous message
    2009-03-25 03:37:02 (6729d1bf): Returning status 0
    2009-03-25 03:37:02 (6729d1bf): Executing: select count(*) FROM songs
    2009-03-25 03:37:02 (6729d1bf): Creating new db handle
    2009-03-25 03:37:02 (6729d1bf): Thread 23: xml-rpc served
    2009-03-25 03:37:02 (6729d1bf): Entering config_set_status
    2009-03-25 03:37:02 (6729d1bf): Exiting config_set_status
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Terminating
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Freeing request headers
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Freeing response headers
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Freeing request vars
    2009-03-25 03:37:02 (6729d1bf): Thread 23: Closing fd
    2009-03-25 03:37:02 (6729d1bf): With thread 23 exiting, 0 are still running
    2009-03-25 03:37:03 (c2083dae): Got listen socket 10
    2009-03-25 03:37:03 (6729d1bf): Thread 24:
    2009-03-25 03:37:03 (6729d1bf): Request: POST /xml-rpc HTTP/1.1
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Read: User-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.10 (like Gecko) SUSE
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Adding header *User-Agent=Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.10 (like Gecko) SUSE*
    2009-03-25 03:37:03 (6729d1bf): Added *User-Agent=Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.10 (like Gecko) SUSE*
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Read: Referer: http://localhost:3689/index.html
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Adding header *Referer=http://localhost:3689/index.html*
    2009-03-25 03:37:03 (6729d1bf): Added *Referer=http://localhost:3689/index.html*
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Read: Pragma: no-cache
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Adding header *Pragma=no-cache*
    2009-03-25 03:37:03 (6729d1bf): Added *Pragma=no-cache*
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Read: Cache-control: no-cache
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Adding header *Cache-control=no-cache*
    2009-03-25 03:37:03 (6729d1bf): Added *Cache-control=no-cache*
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Read: Accept: text/html, image/jpeg, image/png, text/*, image/*, */*
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Adding header *Accept=text/html, image/jpeg, image/png, text/*, image/*, */**
    2009-03-25 03:37:03 (6729d1bf): Added *Accept=text/html, image/jpeg, image/png, text/*, image/*, */**
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Read: Accept-Encoding: x-gzip, x-deflate, gzip, deflate
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Adding header *Accept-Encoding=x-gzip, x-deflate, gzip, deflate*
    2009-03-25 03:37:03 (6729d1bf): Added *Accept-Encoding=x-gzip, x-deflate, gzip, deflate*
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Read: Accept-Charset: utf-8, utf-8;q=0.5, *;q=0.5
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Adding header *Accept-Charset=utf-8, utf-8;q=0.5, *;q=0.5*
    2009-03-25 03:37:03 (6729d1bf): Added *Accept-Charset=utf-8, utf-8;q=0.5, *;q=0.5*
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Read: Accept-Language: en
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Adding header *Accept-Language=en*
    2009-03-25 03:37:03 (6729d1bf): Added *Accept-Language=en*
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Read: Host: localhost:3689
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Adding header *Host=localhost:3689*
    2009-03-25 03:37:03 (6729d1bf): Added *Host=localhost:3689*
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Read: connection: close
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Adding header *connection=close*
    2009-03-25 03:37:03 (6729d1bf): Added *connection=close*
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Read: x-prototype-version: 1.4.0
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Adding header *x-prototype-version=1.4.0*
    2009-03-25 03:37:03 (6729d1bf): Added *x-prototype-version=1.4.0*
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Read: x-requested-with: XMLHttpRequest
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Adding header *x-requested-with=XMLHttpRequest*
    2009-03-25 03:37:03 (6729d1bf): Added *x-requested-with=XMLHttpRequest*
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Read: Content-type: application/x-www-form-urlencoded
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Adding header *Content-type=application/x-www-form-urlencoded*
    2009-03-25 03:37:03 (6729d1bf): Added *Content-type=application/x-www-form-urlencoded*
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Read: Authorization: Basic Om10LWRhYXBk
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Adding header *Authorization=Basic Om10LWRhYXBk*
    2009-03-25 03:37:03 (6729d1bf): Added *Authorization=Basic Om10LWRhYXBk*
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Read: Connection: Keep-Alive
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Adding header *Connection=Keep-Alive*
    2009-03-25 03:37:03 (6729d1bf): Updating Connection from close to Keep-Alive
    2009-03-25 03:37:03 (6729d1bf): Thread 24: Out of memory
    2009-03-25 03:37:03: Aborting
    2009-03-25 03:37:03 (45677c12): Processing rendezvous message
    2009-03-25 03:37:03 (45677c12): Rendezvous socket closed (daap server crashed?) Aborting.
    2009-03-25 03:37:03: Aborting

    As you can see, the crash is immediate – everything goes down in less than a second. I’ve done my best to get this far, but right now, I’m stuck… I could really use any assistance any of you might be able to offer.

    Thanks!

    -Todd

    #18165

    fizze
    Participant

    Well it’s an OOM. Are you using sqlite2 or sqlite3 as database?
    What binary do you use, or did you compile yourself?

    It’s indeed weird that that initial scan works, so I suspect database trouble.

    #18166

    Anonymous

    @fizze wrote:

    Well it’s an OOM. Are you using sqlite2 or sqlite3 as database?
    What binary do you use, or did you compile yourself?

    It’s indeed weird that that initial scan works, so I suspect database trouble.

    Aye – that’s what bothered me too… What would be different in scanning at start up but not via the web interface?

    Anyways, to answer your questions, I am using sqlite3, and I compiled myself.

    My steps for compiling were as follows:

    ./configure --enable-sqlite3 --with-sqlite3-includes=/usr/include --with-sqlite3-libs=/usr/lib64
    make
    make install

    My configuration file resides at /usr/local/etc/mt-daapd.conf and is as follows:

    # $Id: mt-daapd.conf.templ 1660 2007-09-12 13:08:04Z rpedde $
    #
    # This is the mt-daapd config file.
    #
    # If you have problems or questions with the format of this file,
    # direct your questions to [email protected]
    #
    # Questions and discussions about the format and content of this
    # config file can probably be obtained by consulting the wiki:
    #
    # http://wiki.fireflymediaserver.org/Config_File
    #
    # Or by asking questions on the forums at
    #
    # http://forums.fireflymediaserver.org
    #
    #

    [general]

    #
    # web_root (required)
    #
    # Location of the admin web pages.
    #
    # If you installed from .RPM, .deb, or tarball with --prefix=/usr, then
    # this is correct.
    #
    # If you installed from tarball without --prefix=/usr, then the correct
    # path is probably /usr/local/share/mt-daapd/admin-root.
    #

    web_root = /usr/local/share/mt-daapd/admin-root

    #
    # port (required)
    #
    # What port to listen on. It is possible to use a different
    # port, but this is the default iTunes port
    #

    port = 3689

    #
    # admin_pw (required)
    #
    # This is the password to the administrative pages
    #

    admin_pw = mt-daapd


    #
    # db_type (required)
    #
    # This is what kind of backend database to store the song
    # info in. Valid choices are "sqlite" and "sqlite3".
    #

    db_type = sqlite3

    #
    # db_parms
    #
    # This is any extra information the db needs to connect.
    # in the case of sqlite and sqlite3, this is the name
    # of the directory to store the database in
    #
    # If you installed from RPM or .deb, this path likely already
    # exists. If not, then you must create it. The directory itself
    # must be writable by the "runas" user.
    #

    db_parms = /usr/local/var/cache/mt-daapd

    #
    # mp3_dir (required)
    #
    # Location of the mp3 files to share. Note that because the
    # files are stored in the database by inode, these must be
    # in the same physical filesystem.
    #

    mp3_dir = /media/music

    #
    # servername (required)
    #
    # This is both the name of the server as advertised
    # via rendezvous, and the name of the database
    # exported via DAAP. Also know as "What shows up in iTunes".
    #

    servername = Firefly %v on %h

    #
    # runas (required)
    #
    # This is the user to drop privs to if running as
    # root. If mt-daapd is not started as root, this
    # configuration option is ignored. Notice that this
    # must be specified whether the server is running
    # as root or not.
    #
    # This is also ignored on Windows.
    #

    runas = nobody

    #
    # password (optional)
    #
    # This is the password required to listen to MP3 files
    # i.e. the password that iTunes prompts for
    #

    #password = mp3

    #
    # extensions (optional)
    #
    # These are the file extensions that the daap server will
    # try to index and serve. By default, it only indexes and
    # serves .mp3 files. It can also server .m4a and .m4p files,
    # and just about any other files, really. Unfortunately, while
    # it can *attempt* to serve other files (.ogg?), iTunes won't
    # play them. Perhaps this would be useful on Linux with
    # Rhythmbox, once it understands daap. (hurry up!)
    #
    # Failing that, one can use server-side conversion to transcode
    # non-standard (.ogg, .flac) music to wav on the server side.
    # See the ssc_* options below.
    #
    # To be able to index .ogg files, you'll need to have configured
    # with --enable-oggvorbis. For .flac, --enable-flac, for .mpc,
    # --enable-musepack.
    #

    extensions = .mp3,.m4a,.m4p

    #
    # ssc_codectypes (optional)
    #
    # List of codectypes for files that the daap server should
    # perform internal format conversion and present to clients
    # as WAV files. The file extensions that these codectypes correspond
    # to must also be present in 'extensions'
    # configuration value, or files are not probed in the first
    # place.
    #
    # Valid codectypes:
    #
    # mp4a - for AAC (.aac, .mp4, .m4a, .m4p)
    # mpeg - for mp3
    # wav - for wav
    # wma - for wma
    # ogg - for ogg
    # flac - for flac (.flac, .fla)
    # mpc for musepack (.mpc, .mpp, .mp+)
    # alac for alac (.m4a)
    #

    ssc_codectypes = ogg,flac,alac

    #
    # ssc_prog (optional)
    #
    # Program that is used in server side format conversion.
    # Program must accept following command line syntax:
    # ssc_prog filename offset length ...
    # Parameter filename is the real name of the file that is
    # to be converted and streamed, offset is number of bytes
    # that are skipped from the beginning of the _output_ file
    # before streaming is started, length is length of the song
    # in seconds (or zero). All other possible arguments must
    # be ignored. The resulting wav file (or the rest of
    # the file after initial seek) is written to the standard
    # output by the ssc_prog program. This is typically
    # a script that is a front end for different conversion tools
    # handling different formats.
    #

    ssc_prog = /usr/local/bin/mt-daapd-ssc.sh

    #
    # logfile (optional)
    #
    # This is the file to log to. If this is not configured,
    # then it will log to the syslog.
    #
    # Not that the -d switch will control the log verbosity.
    # By default, it runs at log level 1. Log level 9 will churn
    # out scads of useless debugging information. Values in between
    # will vary the amount of logging you get.
    #

    logfile = /var/log/mt-daapd.log

    #
    # rescan_interval
    #
    # How often to check the file system to see if any mp3 files
    # have been added or removed.
    #
    # if not specified, the default is 0, which disables background scanning.
    #
    # If background rescanning is disabled, a scan can still be forced from the
    # "status" page of the administrative web interface
    #
    # Setting a rescan_interval lower than the time it takes to rescan
    # won't hurt anything, it will just waste CPU, and make connect times
    # to the daap server longer.
    #
    #

    #rescan_interval = 300

    # always_scan
    #
    # The default behavior is not not do background rescans of the
    # filesystem unless there are clients connected. The thought is to
    # allow the drives to spin down unless they are in use. This might be
    # of more importance in IDE drives that aren't designed to be run
    # 24x7. Forcing a scan through the web interface will always work
    # though, even if no users are connected.

    # always_scan = 0

    #
    # scan_type
    #
    #
    # This sets how aggressively mp3 files should be scanned to determine
    # file length. There are three values:
    #
    # 0 (Normal)
    # Just scan the first mp3 frame to try and calculate size. This will
    # be accurate for most files, but VBR files without an Xing tag will
    # probably have wildly inaccurate file times. This is the default.
    #
    # 1 (Aggressive)
    # This checks the bitrates of 10 frames in the middle of the song.
    # This will still be inaccurate for VBR files without an Xing tag,
    # but they probably won't be quite as inaccurate as 0. This takes
    # more time, obviously, although the time hit will only happen the
    # first time you scan a particular file.
    #
    # 2 (Painfully aggressive)
    # This walks through the entire song, counting the number of frames.
    # This should result in accurate song times, but will take the most
    # time. Again, this will only have to be incurred the first time
    # the file is indexed.
    #

    scan_type = 2

    #
    # compress
    #
    # Whether to use gzip content-encoding when transferring playlists etc.
    # This was contributed as a patch by Ciamac Moallemi just prior to the 0.2.1
    # release, and as such, hasn't gotten as much testing as other features.
    #
    # This feature should substantially speed up transfers of large databases
    # and playlists.
    #
    # It will eventually default to 1, but currently it defaults to 0.
    #

    #compress = 0

    [plugins]
    plugin_dir = /usr/local/lib/mt-daapd/plugins


    [scanning]

    # should playlists be processed at all?
    #
    process_playlists = 1


    # should itunes xml files be processed?
    #
    process_itunes = 1

    # should m3u files be processed?
    #
    process_m3u = 1

    My openSUSE start-up script resides at /etc/init.d/mt-daapd and is as follows:

    # Copyright (c) 1995-2004 SUSE Linux AG, Nuernberg, Germany.
    # All rights reserved.
    #
    # Author: Dylan Muir
    #
    # /etc/init.d/mt-daapd
    # and its symbolic link
    # /usr/sbin/mt-daapd
    #
    # This program is free software; you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation; either version 2 of the License, or
    # (at your option) any later version.
    #
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    # GNU General Public License for more details.
    #
    # You should have received a copy of the GNU General Public License
    # along with this program; if not, write to the Free Software
    # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
    #
    #
    # LSB compatible service control script; see http://www.linuxbase.org/spec/
    #
    # Note: This template uses functions rc_XXX defined in /etc/rc.status on
    # UnitedLinux (UL) based Linux distributions. If you want to base your
    # script on this template and ensure that it works on non UL based LSB
    # compliant Linux distributions, you either have to provide the rc.status
    # functions from UL or change the script to work without them.
    #
    ### BEGIN INIT INFO
    # Provides: daap
    # Required-Start: $portmap $local_fs $remote_fs rendezvous
    # Should-Start:
    # Required-Stop: $portmap $local_fs $remote_fs rendezvous
    # Should-Stop:
    # Default-Start: 3 5
    # Default-Stop: 0 1 2 6
    # Short-Description: mt-daapd daemon providing DAAP serving
    # Description: mt-daapd allows iTunes-compatible clients
    # to connect, serves streams and allows download of files.
    # Also provides a web configuration interface on the DAAP port.
    ### END INIT INFO

    # Check for missing binaries (stale symlinks should not happen)
    # Note: Special treatment of stop for LSB conformance
    MT_DAAPD_BIN=/usr/local/sbin/mt-daapd
    test -x $MT_DAAPD_BIN || { echo "$MT_DAAPD_BIN not installed";
    if [ "$1" = "stop" ]; then exit 0;
    else exit 5; fi; }

    # Check for existence of needed config file and read it
    MT_DAAPD_CONFIG=/usr/local/etc/mt-daapd.conf
    test -r $MT_DAAPD_CONFIG || { echo "$MT_DAAPD_CONFIG does not exist";
    if [ "$1" = "stop" ]; then exit 0;
    else exit 6; fi; }

    # Directory to wait for
    MUSIC_WATCH_DIR=/media/music

    # Debug level
    MT_DAAPD_DEBUG_LEVEL=9

    # Shell functions sourced from /etc/rc.status:
    # rc_check check and set local and overall rc status
    # rc_status check and set local and overall rc status
    # rc_status -v be verbose in local rc status and clear it afterwards
    # rc_status -v -r ditto and clear both the local and overall rc status
    # rc_status -s display "skipped" and exit with status 3
    # rc_status -u display "unused" and exit with status 3
    # rc_failed set local and overall rc status to failed
    # rc_failed set local and overall rc status to
    # rc_reset clear both the local and overall rc status
    # rc_exit exit appropriate to overall rc status
    # rc_active checks whether a service is activated by symlinks
    . /etc/rc.status

    # Reset status of this service
    rc_reset

    # Return values acc. to LSB for all commands but status:
    # 0 - success
    # 1 - generic or unspecified error
    # 2 - invalid or excess argument(s)
    # 3 - unimplemented feature (e.g. "reload")
    # 4 - user had insufficient privileges
    # 5 - program is not installed
    # 6 - program is not configured
    # 7 - program is not running
    # 8--199 - reserved (8--99 LSB, 100--149 distrib, 150--199 appl)
    #
    # Note that starting an already running service, stopping
    # or restarting a not-running service as well as the restart
    # with force-reload (in case signaling is not supported) are
    # considered a success.

    case "$1" in
    start)
    echo -n "Starting mt-daapd "
    ## Recycle log file
    cp /var/log/mt-daapd.log /var/log/mt-daapd.0.log

    ## Wait for the music cache to appear
    while [ ! -e $MUSIC_WATCH_DIR ]
    do
    echo "mt-daapd: Waiting for music directory to appear..."
    sleep 1
    done

    ## Start daemon with startproc(8). If this fails
    ## the return value is set appropriately by startproc.
    /sbin/startproc $MT_DAAPD_BIN -c $MT_DAAPD_CONFIG -d $MT_DAAPD_DEBUG_LEVEL

    # Remember status and be verbose
    rc_status -v
    ;;
    stop)
    echo -n "Shutting down mt-daapd "
    ## Stop daemon with killproc(8) and if this fails
    ## killproc sets the return value according to LSB.

    killall -INT $MT_DAAPD_BIN

    # Remember status and be verbose
    rc_status -v
    ;;
    try-restart|condrestart)
    ## Do a restart only if the service was active before.
    ## Note: try-restart is now part of LSB (as of 1.9).
    ## RH has a similar command named condrestart.
    if test "$1" = "condrestart"; then
    echo "${attn} Use try-restart ${done}(LSB)${attn} rather than condrestart ${warn}(RH)${norm}"
    fi
    $0 status
    if test $? = 0; then
    $0 restart
    else
    rc_reset # Not running is not a failure.
    fi
    # Remember status and be quiet
    rc_status
    ;;
    restart)
    ## Stop the service and regardless of whether it was
    ## running or not, start it again.
    $0 stop
    sleep 3
    $0 start

    # Remember status and be quiet
    rc_status
    ;;
    force-reload)
    ## Signal the daemon to reload its config. Most daemons
    ## do this on signal 1 (SIGHUP).
    ## If it does not support it, restart the service if it
    ## is running.

    echo -n "Reload service mt-daapd "
    ## if it supports it:
    #/sbin/killproc -HUP $MT_DAAPD_BIN
    #touch /var/run/mt-daapd.pid
    #rc_status -v

    ## Otherwise:
    $0 try-restart
    rc_status
    ;;
    reload)
    ## Like force-reload, but if daemon does not support
    ## signaling, do nothing (!)

    # If it supports signaling:
    echo -n "Reload service mt-daapd "
    #/sbin/killproc -HUP $MT_DAAPD_BIN
    #touch /var/run/mt_daapd.pid
    #rc_status -v

    ## Otherwise if it does not support reload:
    rc_failed 3
    rc_status -v
    ;;
    status)
    echo -n "Checking for service mt-daapd "
    ## Check status with checkproc(8), if process is running
    ## checkproc will return with exit status 0.

    # Return value is slightly different for the status command:
    # 0 - service up and running
    # 1 - service dead, but /var/run/ pid file exists
    # 2 - service dead, but /var/lock/ lock file exists
    # 3 - service not running (unused)
    # 4 - service status unknown :-(
    # 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.)

    # NOTE: checkproc returns LSB compliant status values.
    /sbin/checkproc $MT_DAAPD_BIN
    # NOTE: rc_status knows that we called this init script with
    # "status" option and adapts its messages accordingly.
    rc_status -v
    ;;
    probe)
    ## Optional: Probe for the necessity of a reload, print out the
    ## argument to this init script which is required for a reload.
    ## Note: probe is not (yet) part of LSB (as of 1.9)

    test /etc/mt-daapd.conf -nt /var/run/mt-daapd.pid && echo reload
    ;;
    *)
    echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}"
    exit 1
    ;;
    esac
    rc_exit

    Out of curiosity, when you say “its an OOM” what are you referring to?

    Are there any commands you can think of that might help troubleshoot the database? Perhaps some sort of log I can take a look at that specifically deals with the database?

    #18167

    Anonymous

    Also, (sorry about all the questions) but as of Today, March 25th, 2009, do you know what the most current release of mt-daap/Firefly is? I’m confused about what’s what and how old a specific release is. I read that some people prefer to use an svn release in the 1500s, even though there are more recent builds in the 1600s (like mine, svn-1696) and in the 1700s… Why is that? Also, how does the 2.4 series relate to these svn-builds? Are there multiple “current” versions? If so, what’s the difference between them? And why does it seem like no new versions have come out in the past year or so… Have the developers of this project lost interest/moved on?

    #18168

    fizze
    Participant

    The 0.2.4 branch is ancient. It could be considered stable.
    The “nightlies” like svn-1586, svn-1696 are the “bleeding edge” of firefly, if you will. Almost everyone here runs one of these builds, and they have many features 0.2.4 lacks, and are also very stable. Uptimes >200d were reported.

    “OOM” is short Out Of Memory.
    Seeing that you compiled yourself, maybe you’ve used some unstable libs. Also it seems that you’re compiling on 64-bit, which is unusual.
    I think that’s the source for your troubles.

    #18169

    Anonymous

    @fizze wrote:

    The 0.2.4 branch is ancient. It could be considered stable.
    The “nightlies” like svn-1586, svn-1696 are the “bleeding edge” of firefly, if you will. Almost everyone here runs one of these builds, and they have many features 0.2.4 lacks, and are also very stable. Uptimes >200d were reported.

    “OOM” is short Out Of Memory.
    Seeing that you compiled yourself, maybe you’ve used some unstable libs. Also it seems that you’re compiling on 64-bit, which is unusual.
    I think that’s the source for your troubles.

    I see. So you’re saying that if I re-compile mt-daap/Firefly for 32-bit, that might resolve my issue? Hmmm… I’ll give it a try, but I dunno… SQLite3 and 64-bit libraries have been around an awfully long time to not already have all of those 64-bit problems hammered out… But you could be right. Hmmm…

    For the sake of documentation, I’ll report back tomorrow what I find. Thank you for all your help thus far, and stay tuned for an update in a few hours.

    #18170

    Anonymous

    Alright, I’ve recompiled using the non-64-bit libraries:

    ./configure --enable-sqlite3 --with-sqlite3-includes=/usr/include --with-sqlite3-libs=/usr/lib
    make
    make install

    Hitting “Rescan” on the web interface produces the exact same crash, down to the log details… I’m beginning to think that this software is old and just doesn’t work anymore. At least, not on anything reasonably recent… Or maybe I just don’t know how to compile… But I’m guessing it’s the former rather than the latter. It might work on other systems, but considering that the last recommended “nightly” build was released more than a year and a half ago, that the latest compiled binary is for Ubuntu 6.10 (when we’re fast approaching a 9.04 release), and the fact that you, fizze, as incredibly helpful and useful as you are, seem to be the only knowledgeable person on this board… Hmmm… Yes, I’m starting to fear that my suspicions of a dead project were spot on…

    I’m not sure if you know the developers very well, but perhaps making a post on the homepage warning users of the state of things might be a good idea… At least they’ll know that they’re somewhat on their own should trouble arise.

    I’m sure mt-daapd was a pretty cool piece of software back in the day… but 2 years later, I can’t even get the damned thing to run properly, and I’m not exactly new to this kind of stuff. Later on this weekend, I’ll have a look at the actual source, but chances of me actually figuring anything out, much less understanding with any amount of detail what I’m looking at, are slim. What release are you running, and under what OS? Do you use SQLite3 or 2?

    Thanks for all your help thus far.

    #18171

    Anonymous

    I’ve done some more trouble shooting, and just for the sake of documentation, I thought I’d make another post.

    I think the problem lies somewhere in the webserver. Deleting songs3.db and then restarting mt-daapd doesn’t cause the server to crash when it rescans my music directory… Only when I use the web interface does the crash actually happen. But browsers are horrible tools for capturing debug information, so I thought I’d try another route…

    Issuing the following command on the terminal:

    wget --delete-after "http://USERDOESNTMATTER:[email protected]:3689/config-update.html?action=rescan"

    Yields the following output:


    --2009-03-26 14:11:32-- http://USERDOESNTMATTER:*password*@localhost:3689/config-update.html?action=rescan
    Resolving localhost... 127.0.0.1
    Connecting to localhost|127.0.0.1|:3689... connected.
    HTTP request sent, awaiting response... 401 Unauthorized
    Connecting to localhost|127.0.0.1|:3689... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: unspecified [text/html]
    Saving to: `config-update.html?action=rescan'

    [ ] 3,211 --.-K/s in 0.02s

    2009-03-26 14:11:32 (129 KB/s) - `config-update.html?action=rescan' saved [3211]

    Removing config-update.html?action=rescan.
    *** glibc detected *** /usr/local/sbin/mt-daapd: free(): invalid pointer: 0x00007fff67a88178 ***
    ======= Backtrace: =========
    /lib64/libc.so.6[0x7fa25eaed118]
    /lib64/libc.so.6(cfree+0x76)[0x7fa25eaeec76]
    /usr/local/sbin/mt-daapd(db_sqlite2_enum_end+0x5e)[0x42cade]
    /usr/local/sbin/mt-daapd(db_sql_fetch_row+0x163)[0x42da73]
    /usr/local/sbin/mt-daapd(db_sql_fetch_path+0x4b)[0x42fceb]
    /usr/local/sbin/mt-daapd(db_fetch_path+0x35)[0x4159a5]
    /usr/local/sbin/mt-daapd(scan_filename+0x22d)[0x4145fd]
    /usr/local/sbin/mt-daapd[0x414c0b]
    /usr/local/sbin/mt-daapd(scan_init+0x89)[0x4155c9]
    /usr/local/sbin/mt-daapd(main+0x78b)[0x40e51b]
    /lib64/libc.so.6(__libc_start_main+0xe6)[0x7fa25ea97586]
    /usr/local/sbin/mt-daapd[0x40d769]
    ======= Memory map: ========
    00400000-0046b000 r-xp 00000000 08:41 5627905 /usr/local/sbin/mt-daapd
    0066b000-0066c000 r--p 0006b000 08:41 5627905 /usr/local/sbin/mt-daapd
    0066c000-00670000 rw-p 0006c000 08:41 5627905 /usr/local/sbin/mt-daapd
    00670000-006d2000 rw-p 00670000 00:00 0 [heap]
    7fa254000000-7fa254021000 rw-p 7fa254000000 00:00 0
    7fa254021000-7fa258000000 ---p 7fa254021000 00:00 0
    7fa25ba46000-7fa25ba47000 ---p 7fa25ba46000 00:00 0
    7fa25ba47000-7fa25c247000 rw-p 7fa25ba47000 00:00 0
    7fa25c247000-7fa25c248000 ---p 7fa25c247000 00:00 0
    7fa25c248000-7fa25ca48000 rw-p 7fa25c248000 00:00 0
    7fa25ca48000-7fa25ca49000 ---p 7fa25ca48000 00:00 0
    7fa25ca49000-7fa25d249000 rw-p 7fa25ca49000 00:00 0
    7fa25d249000-7fa25d25f000 r-xp 00000000 08:41 5619904 /lib64/libgcc_s.so.1
    7fa25d25f000-7fa25d45f000 ---p 00016000 08:41 5619904 /lib64/libgcc_s.so.1
    7fa25d45f000-7fa25d460000 r--p 00016000 08:41 5619904 /lib64/libgcc_s.so.1
    7fa25d460000-7fa25d461000 rw-p 00017000 08:41 5619904 /lib64/libgcc_s.so.1
    7fa25d461000-7fa25d462000 ---p 7fa25d461000 00:00 0
    7fa25d462000-7fa25dc62000 rw-p 7fa25d462000 00:00 0
    7fa25dc62000-7fa25dc63000 ---p 7fa25dc62000 00:00 0
    7fa25dc63000-7fa25e463000 rw-p 7fa25dc63000 00:00 0
    7fa25e463000-7fa25e468000 r-xp 00000000 08:41 3752987 /usr/local/lib/mt-daapd/plugins/rsp.so
    7fa25e468000-7fa25e667000 ---p 00005000 08:41 3752987 /usr/local/lib/mt-daapd/plugins/rsp.so
    7fa25e667000-7fa25e668000 r--p 00004000 08:41 3752987 /usr/local/lib/mt-daapd/plugins/rsp.so
    7fa25e668000-7fa25e669000 rw-p 00005000 08:41 3752987 /usr/local/lib/mt-daapd/plugins/rsp.so
    7fa25e669000-7fa25e674000 r-xp 00000000 08:41 3752985 /usr/local/lib/mt-daapd/plugins/out-daap.so
    7fa25e674000-7fa25e873000 ---p 0000b000 08:41 3752985 /usr/local/lib/mt-daapd/plugins/out-daap.so
    7fa25e873000-7fa25e874000 r--p 0000a000 08:41 3752985 /usr/local/lib/mt-daapd/plugins/out-daap.so
    7fa25e874000-7fa25e876000 rw-p 0000b000 08:41 3752985 /usr/local/lib/mt-daapd/plugins/out-daap.so
    7fa25e876000-7fa25e878000 r-xp 00000000 08:41 3752989 /usr/local/lib/mt-daapd/plugins/ssc-script.so
    7fa25e878000-7fa25ea77000 ---p 00002000 08:41 3752989 /usr/local/lib/mt-daapd/plugins/ssc-script.so
    7fa25ea77000-7fa25ea78000 r--p 00001000 08:41 3752989 /usr/local/lib/mt-daapd/plugins/ssc-script.so
    7fa25ea78000-7fa25ea79000 rw-p 00002000 08:41 3752989 /usr/local/lib/mt-daapd/plugins/ssc-script.so
    7fa25ea79000-7fa25ebc8000 r-xp 00000000 08:41 5619806 /lib64/libc-2.9.so
    7fa25ebc8000-7fa25edc8000 ---p 0014f000 08:41 5619806 /lib64/libc-2.9.so
    7fa25edc8000-7fa25edcc000 r--p 0014f000 08:41 5619806

    /sigh… same output on all the logs… Damn thing crashed again.

    But, this is interesting… while it’s been a while since I last got down and dirty writing code, I still remember enough to tell you that that right there looks an awful lot like a trace of exactly what was happening when mt-daapd/Firefly crashed. However, since I didn’t write this code, and since I’m not at all familiar with it, I may be wrong. And since I also know I’mlimited in my knowledge of the subject at hand, I’m going to not even going to try to speak on something I can barely interpret, much less understand…

    fizzle, given your helpful nature, you may know enough to shed a bit more light on this output, but I’d also really appreciate Ron weighing in on this matter too… Or, for that matter, anyone else who knows what’s going on here and can provide a suggestion. Bonus points to anyone who’s a code jockey and deals with this kind of stuff for a living.

    Anyone have any ideas?

    #18172

    fizze
    Participant

    Well I’ve compiled svn-1696 myself, on x86-32.
    Works like a charm.

    I use Ubuntu 8.10 server, and no really other fancy packages.
    Many folks compile themselves, even on BSD or Solaris, and noone’s ever experienced such a silly oom so far. 🙁

    Well, you can always try to compile against sqlite2, which is considered to be more stable?

    sudo dpkg -l|egrep "sqlite|flac|id3"
    ii id3tool 1.2a-4 Command line editor for id3 tags
    ii id3v2 0.1.11-3 A command line id3v2 tag editor
    ii libflac-dev 1.2.1-1.2 Free Lossless Audio Codec - C development li
    ii libflac7 1.1.2-8 Free Lossless Audio Codec - runtime C librar
    ii libflac8 1.2.1-1.2 Free Lossless Audio Codec - runtime C librar
    ii libid3-3.8.3c2a 3.8.3-7.2 Library for manipulating ID3v1 and ID3v2 tag
    ii libid3tag0 0.15.1b-10 ID3 tag reading library from the MAD project
    ii libid3tag0-dev 0.15.1b-10 ID3 tag reading library from the MAD project
    ii libsqlite0 2.8.17-4build1 SQLite shared library
    ii libsqlite3-0 3.5.9-3 SQLite 3 shared library
    ii libsqlite3-dev 3.5.9-3 SQLite 3 development files
    ii python-pysqlite2 2.4.1-1 Python interface to SQLite 3

    I can’t recall any other deps from the top of my head, but with those versions everything worked fine.

    For what it’s worth, here are my compile flags:

    ./configure --enable-sqlite3 --enable-upnp --enable-ffmpeg --enable-oggvorbis --with-ffmpeg-includes=/usr/include/f
    fmpeg/ --enable-flac

    Like I said, I fetched the sources for svn-1696.

    #18173

    Anonymous

    Oh dear lord… /sigh. I got it working. I have absolutely no idea why this particular solution works when nothing else does, but it works… I am able to reliably get the server to rescan, WITHOUT taking it down, or messing with any files…

    Give me a little while to write up a guide and maybe try to figure this out… I’ll be back later.

    #18174

    Anonymous

    Alright, here’s my documentation on how I got mt-daapd svn-1696 to work on openSUSE 11.1.

    I want to start off by saying that I don’t believe this installation to be reliable. This is mostly due to the fact that I don’t trust software that seemingly changes it’s behavior at random without any modification. And let me be explicitly clear about that: I’ve got a fair bit of experience in linux and long uptime services. Daemons like vsftpd, nntp, nfsd, Xvnc, rsyncd, etc. have all proven themselves to be unbelievably rock solid, and in some cases, have gone months without crashing. mt-daapd, on the other hand, strikes me as something more akin to crystal or fine china: it might be pretty, but I seriously doubt it’s as stable or rugged as any of the aforementioned daemons.

    I could be wrong, but I think the best way to find out will be to wait and see.

    Either way, if you run openSUSE 11.1, and you absolutely _have_ to get mt-daapd up and running, then listen up.

    First off, I just want to say that I’m not going to try to give you any false pretenses here about knowing what’s going on. I have no clue why this method, and only this method, works. It requires doing tons of (what I would consider) extraneous stuff, but at least it works. Lol, and that’s where it’s kinda funny: it’s not even going to work all the way – this will only give you control via the terminal – but it’s better than nothing.

    Here goes:

    1) SUSE -> YaST -> Software -> Software Management. Search for “sqlite”. Install the following:

    -dovecott11-backend-sqlite
    -libgda-3_0-sqlite
    -libsqlite3-0
    -libsqlite3-0-32bit
    -mono-data-sqlite
    -pdns-backend-sqlite2
    -pdns-backend-sqlite3
    -sqlite2
    -sqlite2-32bit
    -sqlite2-devel
    -sqlite3
    -sqlite3-devel

    Accept all those dependencies, and install.
    2) Download the svn-1696 release of mt-daapd/Firefly.
    3) Open up a terminal and log in as root with “su”.
    4)Type the following

    tar -zxvf mt-daapd-svn-1696.tar.gz

    If I were you, I’d just type the first few letters and start making liberal use of tab completion.
    5) Change into the untar’d directory

    cd mt-daapd-svn-1696

    6) Type the following (actually, load up this page in Konquerer or Firefox and just copy paste:

    ./configure --enable-sqlite3 --with-sqlite3-includes=/usr/inclue --with-sqlite3-libs=/usr/lib 

    7) Wait for that to finish, then type

    make

    followed by

    make install

    8) Then type

    vim /usr/local/etc/mt-daapd.conf

    9) Type

    i

    then copy and paste the following into the document:

    # $Id: mt-daapd.conf.templ 1660 2007-09-12 13:08:04Z rpedde $
    #
    # This is the mt-daapd config file.
    #
    # If you have problems or questions with the format of this file,
    # direct your questions to [email protected]
    #
    # Questions and discussions about the format and content of this
    # config file can probably be obtained by consulting the wiki:
    #
    # http://wiki.fireflymediaserver.org/Config_File
    #
    # Or by asking questions on the forums at
    #
    # http://forums.fireflymediaserver.org
    #
    #

    [general]

    #
    # web_root (required)
    #
    # Location of the admin web pages.
    #
    # If you installed from .RPM, .deb, or tarball with --prefix=/usr, then
    # this is correct.
    #
    # If you installed from tarball without --prefix=/usr, then the correct
    # path is probably /usr/local/share/mt-daapd/admin-root.
    #

    web_root = /usr/local/share/mt-daapd/admin-root

    #
    # port (required)
    #
    # What port to listen on. It is possible to use a different
    # port, but this is the default iTunes port
    #

    port = 3689

    #
    # admin_pw (required)
    #
    # This is the password to the administrative pages
    #

    admin_pw = mt-daapd


    #
    # db_type (required)
    #
    # This is what kind of backend database to store the song
    # info in. Valid choices are "sqlite" and "sqlite3".
    #

    db_type = sqlite

    #
    # db_parms
    #
    # This is any extra information the db needs to connect.
    # in the case of sqlite and sqlite3, this is the name
    # of the directory to store the database in
    #
    # If you installed from RPM or .deb, this path likely already
    # exists. If not, then you must create it. The directory itself
    # must be writable by the "runas" user.
    #

    db_parms = /usr/local/var/cache/mt-daapd

    #
    # mp3_dir (required)
    #
    # Location of the mp3 files to share. Note that because the
    # files are stored in the database by inode, these must be
    # in the same physical filesystem.
    #

    mp3_dir = /media/music

    #
    # servername (required)
    #
    # This is both the name of the server as advertised
    # via rendezvous, and the name of the database
    # exported via DAAP. Also know as "What shows up in iTunes".
    #

    servername = Firefly %v on %h

    #
    # runas (required)
    #
    # This is the user to drop privs to if running as
    # root. If mt-daapd is not started as root, this
    # configuration option is ignored. Notice that this
    # must be specified whether the server is running
    # as root or not.
    #
    # This is also ignored on Windows.
    #

    runas = nobody

    #
    # password (optional)
    #
    # This is the password required to listen to MP3 files
    # i.e. the password that iTunes prompts for
    #

    #password = mp3

    #
    # extensions (optional)
    #
    # These are the file extensions that the daap server will
    # try to index and serve. By default, it only indexes and
    # serves .mp3 files. It can also server .m4a and .m4p files,
    # and just about any other files, really. Unfortunately, while
    # it can *attempt* to serve other files (.ogg?), iTunes won't
    # play them. Perhaps this would be useful on Linux with
    # Rhythmbox, once it understands daap. (hurry up!)
    #
    # Failing that, one can use server-side conversion to transcode
    # non-standard (.ogg, .flac) music to wav on the server side.
    # See the ssc_* options below.
    #
    # To be able to index .ogg files, you'll need to have configured
    # with --enable-oggvorbis. For .flac, --enable-flac, for .mpc,
    # --enable-musepack.
    #

    extensions = .mp3,.m4a,.m4p

    #
    # ssc_codectypes (optional)
    #
    # List of codectypes for files that the daap server should
    # perform internal format conversion and present to clients
    # as WAV files. The file extensions that these codectypes correspond
    # to must also be present in 'extensions'
    # configuration value, or files are not probed in the first
    # place.
    #
    # Valid codectypes:
    #
    # mp4a - for AAC (.aac, .mp4, .m4a, .m4p)
    # mpeg - for mp3
    # wav - for wav
    # wma - for wma
    # ogg - for ogg
    # flac - for flac (.flac, .fla)
    # mpc for musepack (.mpc, .mpp, .mp+)
    # alac for alac (.m4a)
    #

    ssc_codectypes = ogg,flac,alac

    #
    # ssc_prog (optional)
    #
    # Program that is used in server side format conversion.
    # Program must accept following command line syntax:
    # ssc_prog filename offset length ...
    # Parameter filename is the real name of the file that is
    # to be converted and streamed, offset is number of bytes
    # that are skipped from the beginning of the _output_ file
    # before streaming is started, length is length of the song
    # in seconds (or zero). All other possible arguments must
    # be ignored. The resulting wav file (or the rest of
    # the file after initial seek) is written to the standard
    # output by the ssc_prog program. This is typically
    # a script that is a front end for different conversion tools
    # handling different formats.
    #

    ssc_prog = /usr/local/bin/mt-daapd-ssc.sh

    #
    # logfile (optional)
    #
    # This is the file to log to. If this is not configured,
    # then it will log to the syslog.
    #
    # Not that the -d switch will control the log verbosity.
    # By default, it runs at log level 1. Log level 9 will churn
    # out scads of useless debugging information. Values in between
    # will vary the amount of logging you get.
    #

    logfile = /var/log/mt-daapd.log

    #
    # rescan_interval
    #
    # How often to check the file system to see if any mp3 files
    # have been added or removed.
    #
    # if not specified, the default is 0, which disables background scanning.
    #
    # If background rescanning is disabled, a scan can still be forced from the
    # "status" page of the administrative web interface
    #
    # Setting a rescan_interval lower than the time it takes to rescan
    # won't hurt anything, it will just waste CPU, and make connect times
    # to the daap server longer.
    #
    #

    #rescan_interval = 300

    # always_scan
    #
    # The default behavior is not not do background rescans of the
    # filesystem unless there are clients connected. The thought is to
    # allow the drives to spin down unless they are in use. This might be
    # of more importance in IDE drives that aren't designed to be run
    # 24x7. Forcing a scan through the web interface will always work
    # though, even if no users are connected.

    # always_scan = 0

    #
    # scan_type
    #
    #
    # This sets how aggressively mp3 files should be scanned to determine
    # file length. There are three values:
    #
    # 0 (Normal)
    # Just scan the first mp3 frame to try and calculate size. This will
    # be accurate for most files, but VBR files without an Xing tag will
    # probably have wildly inaccurate file times. This is the default.
    #
    # 1 (Aggressive)
    # This checks the bitrates of 10 frames in the middle of the song.
    # This will still be inaccurate for VBR files without an Xing tag,
    # but they probably won't be quite as inaccurate as 0. This takes
    # more time, obviously, although the time hit will only happen the
    # first time you scan a particular file.
    #
    # 2 (Painfully aggressive)
    # This walks through the entire song, counting the number of frames.
    # This should result in accurate song times, but will take the most
    # time. Again, this will only have to be incurred the first time
    # the file is indexed.
    #

    scan_type = 2

    #
    # compress
    #
    # Whether to use gzip content-encoding when transferring playlists etc.
    # This was contributed as a patch by Ciamac Moallemi just prior to the 0.2.1
    # release, and as such, hasn't gotten as much testing as other features.
    #
    # This feature should substantially speed up transfers of large databases
    # and playlists.
    #
    # It will eventually default to 1, but currently it defaults to 0.
    #

    #compress = 0

    [plugins]
    plugin_dir = /usr/local/lib/mt-daapd/plugins


    [scanning]

    # should playlists be processed at all?
    #
    process_playlists = 1


    # should itunes xml files be processed?
    #
    process_itunes = 1

    # should m3u files be processed?
    #
    process_m3u = 1

    10) Type

    :w [ENTER]

    followed by

    :q [ENTER]

    11) Once vim quits, type

    chmod a+x /usr/local/etc/mt-daapd.conf

    followed by

    chmod o+w /usr/local/etc/mt-daapd.conf

    12) Again, going back to vim, we’re going to create our start-up script.

    vim /etc/init.d/mt-daapd

    13) Type

    i

    then copy and paste the following into the document:

    # Copyright (c) 1995-2004 SUSE Linux AG, Nuernberg, Germany.
    # All rights reserved.
    #
    # Author: Todd H. Poole - www.toddhpoole.com
    #
    # /etc/init.d/mt-daapd
    # and its symbolic link
    # /usr/sbin/mt-daapd
    #
    # This program is free software; you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation; either version 2 of the License, or
    # (at your option) any later version.
    #
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    # GNU General Public License for more details.
    #
    # You should have received a copy of the GNU General Public License
    # along with this program; if not, write to the Free Software
    # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
    #
    #
    # LSB compatible service control script; see http://www.linuxbase.org/spec/
    #
    # Note: This template uses functions rc_XXX defined in /etc/rc.status on
    # UnitedLinux (UL) based Linux distributions. If you want to base your
    # script on this template and ensure that it works on non UL based LSB
    # compliant Linux distributions, you either have to provide the rc.status
    # functions from UL or change the script to work without them.
    #
    ### BEGIN INIT INFO
    # Provides: daap
    # Required-Start: $portmap $local_fs $remote_fs rendezvous
    # Should-Start:
    # Required-Stop: $portmap $local_fs $remote_fs rendezvous
    # Should-Stop:
    # Default-Start: 3 5
    # Default-Stop: 0 1 2 6
    # Short-Description: mt-daapd daemon providing DAAP serving
    # Description: mt-daapd allows iTunes-compatible clients
    # to connect, serves streams and allows download of files.
    # Also provides a web configuration interface on the DAAP port.
    ### END INIT INFO

    # Check for missing binaries (stale symlinks should not happen)
    # Note: Special treatment of stop for LSB conformance
    MT_DAAPD_BIN=/usr/local/sbin/mt-daapd
    test -x $MT_DAAPD_BIN || { echo "$MT_DAAPD_BIN not installed";
    if [ "$1" = "stop" ]; then exit 0;
    else exit 5; fi; }

    # Check for existence of needed config file and read it
    MT_DAAPD_CONFIG=/usr/local/etc/mt-daapd.conf
    test -r $MT_DAAPD_CONFIG || { echo "$MT_DAAPD_CONFIG does not exist";
    if [ "$1" = "stop" ]; then exit 0;
    else exit 6; fi; }

    # Directory to wait for
    MUSIC_WATCH_DIR=/media/music

    # Debug level
    MT_DAAPD_DEBUG_LEVEL=9

    # Shell functions sourced from /etc/rc.status:
    # rc_check check and set local and overall rc status
    # rc_status check and set local and overall rc status
    # rc_status -v be verbose in local rc status and clear it afterwards
    # rc_status -v -r ditto and clear both the local and overall rc status
    # rc_status -s display "skipped" and exit with status 3
    # rc_status -u display "unused" and exit with status 3
    # rc_failed set local and overall rc status to failed
    # rc_failed set local and overall rc status to
    # rc_reset clear both the local and overall rc status
    # rc_exit exit appropriate to overall rc status
    # rc_active checks whether a service is activated by symlinks
    . /etc/rc.status

    # Reset status of this service
    rc_reset

    # Return values acc. to LSB for all commands but status:
    # 0 - success
    # 1 - generic or unspecified error
    # 2 - invalid or excess argument(s)
    # 3 - unimplemented feature (e.g. "reload")
    # 4 - user had insufficient privileges
    # 5 - program is not installed
    # 6 - program is not configured
    # 7 - program is not running
    # 8--199 - reserved (8--99 LSB, 100--149 distrib, 150--199 appl)
    #
    # Note that starting an already running service, stopping
    # or restarting a not-running service as well as the restart
    # with force-reload (in case signaling is not supported) are
    # considered a success.

    case "$1" in
    start)
    echo -n "Starting mt-daapd "
    ## Recycle log file
    cp /var/log/mt-daapd.log /var/log/mt-daapd.0.log

    ## Wait for the music cache to appear
    while [ ! -e $MUSIC_WATCH_DIR ]
    do
    echo "mt-daapd: Waiting for music directory to appear..."
    sleep 1
    done

    ## Start daemon with startproc(8). If this fails
    ## the return value is set appropriately by startproc.
    /sbin/startproc $MT_DAAPD_BIN -c $MT_DAAPD_CONFIG -d $MT_DAAPD_DEBUG_LEVEL

    # Remember status and be verbose
    rc_status -v
    ;;
    stop)
    echo -n "Shutting down mt-daapd "
    ## Stop daemon with killproc(8) and if this fails
    ## killproc sets the return value according to LSB.

    killall -INT $MT_DAAPD_BIN

    # Remember status and be verbose
    rc_status -v
    ;;
    try-restart|condrestart)
    ## Do a restart only if the service was active before.
    ## Note: try-restart is now part of LSB (as of 1.9).
    ## RH has a similar command named condrestart.
    if test "$1" = "condrestart"; then
    echo "${attn} Use try-restart ${done}(LSB)${attn} rather than condrestart ${warn}(RH)${norm}"
    fi
    $0 status
    if test $? = 0; then
    $0 restart
    else
    rc_reset # Not running is not a failure.
    fi
    # Remember status and be quiet
    rc_status
    ;;
    restart)
    ## Stop the service and regardless of whether it was
    ## running or not, start it again.
    $0 stop
    sleep 3
    $0 start

    # Remember status and be quiet
    rc_status
    ;;
    force-reload)
    ## Signal the daemon to reload its config. Most daemons
    ## do this on signal 1 (SIGHUP).
    ## If it does not support it, restart the service if it
    ## is running.

    echo -n "Reload service mt-daapd "
    ## if it supports it:
    #/sbin/killproc -HUP $MT_DAAPD_BIN
    #touch /var/run/mt-daapd.pid
    #rc_status -v

    ## Otherwise:
    $0 try-restart
    rc_status
    ;;
    reload)
    ## Like force-reload, but if daemon does not support
    ## signaling, do nothing (!)

    # If it supports signaling:
    echo -n "Reload service mt-daapd "
    #/sbin/killproc -HUP $MT_DAAPD_BIN
    #touch /var/run/mt_daapd.pid
    #rc_status -v

    ## Otherwise if it does not support reload:
    rc_failed 3
    rc_status -v
    ;;
    status)
    echo -n "Checking for service mt-daapd "
    ## Check status with checkproc(8), if process is running
    ## checkproc will return with exit status 0.

    # Return value is slightly different for the status command:
    # 0 - service up and running
    # 1 - service dead, but /var/run/ pid file exists
    # 2 - service dead, but /var/lock/ lock file exists
    # 3 - service not running (unused)
    # 4 - service status unknown :-(
    # 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.)

    # NOTE: checkproc returns LSB compliant status values.
    /sbin/checkproc $MT_DAAPD_BIN
    # NOTE: rc_status knows that we called this init script with
    # "status" option and adapts its messages accordingly.
    rc_status -v
    ;;
    probe)
    ## Optional: Probe for the necessity of a reload, print out the
    ## argument to this init script which is required for a reload.
    ## Note: probe is not (yet) part of LSB (as of 1.9)

    test /etc/mt-daapd.conf -nt /var/run/mt-daapd.pid && echo reload
    ;;
    *)
    echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}"
    exit 1
    ;;
    esac
    rc_exit

    14) Type

    :w [ENTER]

    followed by

    :q [ENTER]

    15) Now that you’re back at the terminal, type:

    chmod a+x /etc/init.d/mt-daapd

    followed by

    chmod o+w /etc/init.d/mt-daapd

    16) Type

    /etc/init.d/mt-daapd status

    to get the status of the mt-daapd server.

    /etc/init.d/mt-daapd stop 

    and

    /etc/init.d/mt-daapd start

    will stop and start the service.
    17) Try starting the service:

    /etc/init.d/mt-daapd start

    If it doesn’t start, then you and I are in the same boat, and you get to go to Cool Step 1). If it does start, then there’s something different between me and you, and you get to continue on to Step 18). Also, you should probably post why you think it worked, and what’s different between my server and yours. Are you 32 bit?
    18) After adding music to your music folder, type the following to get the server to rescan:

    wget --delete-after "http://USERDOESNTMATTER:[email protected]:3689/config-update.html?action=rescan" > /dev/null

    Note: I recommend only putting 1 or 2 mp3s in there at first… If you offload your entire library at once, you’ll have to wait a while for the server to scan through all of it, and you’ll increase the chances of mt-daapd/Firefly coming across something that might make it crash (some unusual character in the id3 tags, for example.)
    19) SUSE -> YaST -> Security and Users -> Firewall -> Allowed Services. Click on Advanced. Write “3689” under both “TCP Ports” and “UDP Ports”

    Cool Step 1) Go back to Step 6, replace the ./configure line with the one below (yes it is very similar but still different – just copy and paste), and start following all those steps all over again, starting with Step 7.

    ./configure --enable-sqlite3 --with-sqlite3-includes=/usr/inclue --with-sqlite-libs=/usr/lib

    Cool Step 2) Once you get to Step 17, and if the damned thing still doesn’t start up, then try this and start following all those steps all over again, starting with Step 7.

    ./configure --enable-sqlite3 --with-sqlite3-includes=/usr/inclue --with-sqlite3-libs=/usr/lib64 

    Cool Step 3) If it still doesn’t work… /sigh. I’m sorry… I don’t know what else to tell you. It took me a few days just to get this far. Try creating a new thread in the forums…

    Congratulations. You now have a mt-daapd sever that you can control via the Terminal. Load up your favorite daap-compliant software/hardware, and you should see the service appear immediately.

    That’s all I got for now. Control via the command line is really all I would have wanted in the first place… I’m a huge fan of automating simple tasks and just letting cron take care of them, so the easier it is to make something scriptable, the better.

    I’m not done just yet, but at least things are semi-working now. I’ll keep this thread updated if I discover anything else.

    -Todd

    #18175

    fizze
    Participant

    Woah, nice writeup.
    You’ve got a typo in the configure commands though.
    it’s “include” not “inclue”.

    Other than that all I see is that you enable sqlite3, but then use sqlite as a database…. are you sure that’s on intention?

Viewing 12 posts - 1 through 12 (of 12 total)

You must be logged in to reply to this topic.