#!/usr/bin/perl die("No HOME set, cannot install defaults.\n") if !$ENV{HOME}; die("No XBMC_HOME set, cannot install defaults.\n") if !$ENV{'XBMC_HOME'}; sub get_home { return $ENV{'HOME'} if defined $ENV{'HOME'}; } sub get_extras { # XBMC_HOME is assumed to be always setup return $ENV{'XBMC_HOME'}."/extras/" if get_os() eq "osx"; return; } sub get_xbmc_home { my $os = get_os(); my $home = get_home(); return if !defined $home; if ( $os eq "osx" ) { return $home."/Library/Application Support/XBMC"; } elsif ( $os eq "linux" ) { return $home."/.xbmc"; } return; } sub get_os { if ( defined $ENV{'OSTYPE'} && $ENV{'OSTYPE'} =~ /linux/ ) { return "linux"; } return "osx"; } sub get_userdata_path { my $xhome = get_xbmc_home(); return if !defined $xhome; return "$xhome/userdata"; } sub setup_sources { my $xbmchome = get_xbmc_home(); my $userdata = get_userdata_path(); my $sources = $userdata."/sources.xml"; # check whether a sources.xml already exists, and if it does back it up if ( -f $sources ) { print STDERR "sources.xml found at \"$sources\", backing up\n"; my $backup_sources = $sources.".".time().".xml"; `cp -f \"$sources\" \"$backup_sources\"`; } # construct a sources.xml string my $sources_xml = get_sources_xml( get_default_sources() ); if ( $sources_xml ) { open SOURCES, ">$sources" || exit; print SOURCES get_sources_xml( get_default_sources() ); close SOURCES; } } sub get_sources_xml { my $sources = shift; my ($sourcetype, $source); return if !defined $sources; my $xml = "\n"; while ( ($sourcetype, $source) = each ( %$sources ) ) { $xml .= (" " x 4)."<$sourcetype>\n"; $xml .= (" " x 8)."\n"; my ($name, $path); while ( ($name, $path) = each( %{ $source } ) ) { $xml .= (" " x 8)."\n"; $xml .= (" " x 12)."$name\n"; if ( $path =~ /(.*)\^\^(.*)/ ) { $xml .= (" " x 12)."".$1."\n"; $xml .= (" " x 12)."".$2."\n"; } else { $xml .= (" " x 12)."".$path."\n"; } $xml .= (" " x 8)."\n"; } $xml .= (" " x 4)."\n"; } $xml .= "\n"; return $xml; } sub get_default_sources { my $sources = {}; my $home = get_home(); my $xbmchome = get_xbmc_home(); return if !defined $xbmchome; $sources->{'programs'} = {}; $sources->{'video'} = {}; $sources->{'music'} = {}; $sources->{'pictures'} = {}; $sources->{'files'} = {}; if ( get_os() eq "osx" ) { # Default sources for OS X $sources->{'music'}->{'Music'} = $home."/Music"; $sources->{'music'}->{'Music Playlists'} = "special://musicplaylists"; $sources->{'video'}->{'Movies'} = $home."/Movies"; $sources->{'video'}->{'Video Playlists'} = "special://videoplaylists"; $sources->{'pictures'}->{'Pictures'} = $home."/Pictures"; } elsif ( get_os() eq "linux" ) { # Default source for Linux for my $key ( keys %$sources ) { $sources->{$key}->{'Media'} = "/media"; $sources->{$key}->{'Home'} = "$home"; $sources->{$key}->{'Desktop'} = "$home/Desktop"; $sources->{$key}->{'Root'} = "/"; } } return $sources; } sub first_xbmc_run() { my $home = get_xbmc_home(); if ( ! -f "$home/.setup_complete" ) { return 1; } return; } sub first_xbmc_version_run() { my $home = get_xbmc_home(); if ( ! -f "$home/.setup_complete" ) { return 1; } return; } sub setup_default_xbmc() { my $extras = get_extras(); my $xhome = get_xbmc_home(); my $userdata = get_userdata_path(); die("No extras :(\n") if !defined $extras; die("No XBMC home folder :(\n") if !defined $xhome; die ("No userdata folder :(\n") if !defined $userdata; # create userdata directory if it doesn't exist `mkdir -p "$userdata"`; # copy extra stuff to xbmc's userdata directory `cp -fRv "$extras/user/" "$userdata"`; setup_sources(); `touch -f "$xhome/.setup_complete"`; } sub setup_version_xbmc() { #TODO } if (first_xbmc_run()) { setup_default_xbmc(); } if (first_xbmc_version_run()) { setup_version_xbmc(); }