From a1a18f77a50804e0127dfa4b0f5240c49c541184 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Mon, 2 Jul 2012 21:24:02 -0700 Subject: Initial Commit --- subsonic-site/src/main/webapp/WEB-INF/web.xml | 13 + subsonic-site/src/main/webapp/ad.jsp | 6 + subsonic-site/src/main/webapp/adwords-android.jsp | 45 + subsonic-site/src/main/webapp/android-donation.jsp | 88 ++ .../src/main/webapp/api-addChatMessage.jsp | 28 + .../src/main/webapp/api-changePassword.jsp | 35 + .../src/main/webapp/api-createPlaylist.jsp | 39 + subsonic-site/src/main/webapp/api-createShare.jsp | 41 + subsonic-site/src/main/webapp/api-createUser.jsp | 112 +++ .../src/main/webapp/api-deletePlaylist.jsp | 27 + subsonic-site/src/main/webapp/api-deleteShare.jsp | 25 + subsonic-site/src/main/webapp/api-deleteUser.jsp | 28 + subsonic-site/src/main/webapp/api-download.jsp | 28 + subsonic-site/src/main/webapp/api-getAlbum.jsp | 29 + subsonic-site/src/main/webapp/api-getAlbumList.jsp | 44 + .../src/main/webapp/api-getAlbumList2.jsp | 42 + subsonic-site/src/main/webapp/api-getArtist.jsp | 29 + subsonic-site/src/main/webapp/api-getArtists.jsp | 15 + subsonic-site/src/main/webapp/api-getAvatar.jsp | 27 + .../src/main/webapp/api-getChatMessages.jsp | 28 + subsonic-site/src/main/webapp/api-getCoverArt.jsp | 34 + subsonic-site/src/main/webapp/api-getIndexes.jsp | 35 + subsonic-site/src/main/webapp/api-getLicense.jsp | 17 + subsonic-site/src/main/webapp/api-getLyrics.jsp | 35 + .../src/main/webapp/api-getMusicDirectory.jsp | 32 + .../src/main/webapp/api-getMusicFolders.jsp | 15 + .../src/main/webapp/api-getNowPlaying.jsp | 15 + subsonic-site/src/main/webapp/api-getPlaylist.jsp | 28 + subsonic-site/src/main/webapp/api-getPlaylists.jsp | 29 + subsonic-site/src/main/webapp/api-getPodcasts.jsp | 28 + .../src/main/webapp/api-getRandomSongs.jsp | 52 + subsonic-site/src/main/webapp/api-getShares.jsp | 14 + subsonic-site/src/main/webapp/api-getSong.jsp | 29 + subsonic-site/src/main/webapp/api-getStarred.jsp | 14 + subsonic-site/src/main/webapp/api-getStarred2.jsp | 14 + subsonic-site/src/main/webapp/api-getUser.jsp | 29 + subsonic-site/src/main/webapp/api-getVideos.jsp | 15 + .../src/main/webapp/api-jukeboxControl.jsp | 60 ++ subsonic-site/src/main/webapp/api-ping.jsp | 14 + subsonic-site/src/main/webapp/api-scrobble.jsp | 34 + subsonic-site/src/main/webapp/api-search.jsp | 65 ++ subsonic-site/src/main/webapp/api-search2.jsp | 65 ++ subsonic-site/src/main/webapp/api-search3.jsp | 65 ++ subsonic-site/src/main/webapp/api-setRating.jsp | 33 + subsonic-site/src/main/webapp/api-star.jsp | 41 + subsonic-site/src/main/webapp/api-stream.jsp | 59 ++ subsonic-site/src/main/webapp/api-unstar.jsp | 41 + .../src/main/webapp/api-updatePlaylist.jsp | 64 ++ subsonic-site/src/main/webapp/api-updateShare.jsp | 37 + subsonic-site/src/main/webapp/api.jsp | 425 ++++++++ subsonic-site/src/main/webapp/apps.jsp | 650 +++++++++++++ subsonic-site/src/main/webapp/banner.jsp | 103 ++ subsonic-site/src/main/webapp/changelog.jsp | 1011 ++++++++++++++++++++ subsonic-site/src/main/webapp/demo.jsp | 55 ++ subsonic-site/src/main/webapp/documentation.jsp | 66 ++ subsonic-site/src/main/webapp/donate.jsp | 26 + .../src/main/webapp/download-subsonic.jsp | 19 + subsonic-site/src/main/webapp/download.jsp | 165 ++++ subsonic-site/src/main/webapp/download2.jsp | 45 + subsonic-site/src/main/webapp/faq.jsp | 57 ++ subsonic-site/src/main/webapp/favicon.ico | Bin 0 -> 1150 bytes subsonic-site/src/main/webapp/features.jsp | 226 +++++ subsonic-site/src/main/webapp/footer.jsp | 11 + subsonic-site/src/main/webapp/forum.jsp | 3 + subsonic-site/src/main/webapp/getting-started.jsp | 175 ++++ subsonic-site/src/main/webapp/google-translate.jsp | 9 + subsonic-site/src/main/webapp/header.jsp | 18 + subsonic-site/src/main/webapp/hosting.jsp | 91 ++ subsonic-site/src/main/webapp/inc/css/banner.css | 104 ++ subsonic-site/src/main/webapp/inc/css/style.css | 345 +++++++ subsonic-site/src/main/webapp/inc/img/air.png | Bin 0 -> 1589 bytes subsonic-site/src/main/webapp/inc/img/android.png | Bin 0 -> 4032 bytes subsonic-site/src/main/webapp/inc/img/appstore.png | Bin 0 -> 2811 bytes .../main/webapp/inc/img/available_on_appstore.png | Bin 0 -> 10081 bytes .../main/webapp/inc/img/banner/android-video.png | Bin 0 -> 40397 bytes .../src/main/webapp/inc/img/banner/apps.png | Bin 0 -> 225880 bytes .../src/main/webapp/inc/img/banner/apps.xcf | Bin 0 -> 813795 bytes .../src/main/webapp/inc/img/banner/banner-01.jpg | Bin 0 -> 65070 bytes .../src/main/webapp/inc/img/banner/banner-bg.gif | Bin 0 -> 4094 bytes .../src/main/webapp/inc/img/banner/car.png | Bin 0 -> 258554 bytes .../src/main/webapp/inc/img/banner/iphone.png | Bin 0 -> 25818 bytes .../src/main/webapp/inc/img/banner/isub1.png | Bin 0 -> 39807 bytes .../src/main/webapp/inc/img/banner/next-hover.png | Bin 0 -> 1569 bytes .../src/main/webapp/inc/img/banner/next.png | Bin 0 -> 1492 bytes .../src/main/webapp/inc/img/banner/prev-hover.png | Bin 0 -> 1583 bytes .../src/main/webapp/inc/img/banner/prev.png | Bin 0 -> 1528 bytes .../src/main/webapp/inc/img/banner/screenshot.png | Bin 0 -> 109736 bytes .../src/main/webapp/inc/img/banner/video.png | Bin 0 -> 288813 bytes .../src/main/webapp/inc/img/banner/wp7.png | Bin 0 -> 66308 bytes .../src/main/webapp/inc/img/blackberry.png | Bin 0 -> 3889 bytes subsonic-site/src/main/webapp/inc/img/body-bg.gif | Bin 0 -> 370 bytes .../src/main/webapp/inc/img/button-download.png | Bin 0 -> 2846 bytes .../main/webapp/inc/img/change-password-small.png | Bin 0 -> 6437 bytes .../src/main/webapp/inc/img/change-password.png | Bin 0 -> 28840 bytes subsonic-site/src/main/webapp/inc/img/chumby.png | Bin 0 -> 3631 bytes .../src/main/webapp/inc/img/content-bg.gif | Bin 0 -> 509 bytes subsonic-site/src/main/webapp/inc/img/donate.png | Bin 0 -> 1036 bytes .../src/main/webapp/inc/img/download-fedora.png | Bin 0 -> 1007 bytes .../src/main/webapp/inc/img/download-linux.png | Bin 0 -> 866 bytes .../src/main/webapp/inc/img/download-mac.png | Bin 0 -> 552 bytes .../src/main/webapp/inc/img/download-ubuntu.png | Bin 0 -> 719 bytes .../src/main/webapp/inc/img/download-windows.png | Bin 0 -> 1017 bytes .../src/main/webapp/inc/img/download_small.gif | Bin 0 -> 313 bytes .../src/main/webapp/inc/img/fancyzoom/closebox.png | Bin 0 -> 1910 bytes .../src/main/webapp/inc/img/fancyzoom/spacer.gif | Bin 0 -> 43 bytes .../webapp/inc/img/fancyzoom/zoom-caption-fill.png | Bin 0 -> 134 bytes .../webapp/inc/img/fancyzoom/zoom-caption-l.png | Bin 0 -> 310 bytes .../webapp/inc/img/fancyzoom/zoom-caption-r.png | Bin 0 -> 290 bytes .../main/webapp/inc/img/fancyzoom/zoom-shadow1.png | Bin 0 -> 310 bytes .../main/webapp/inc/img/fancyzoom/zoom-shadow2.png | Bin 0 -> 164 bytes .../main/webapp/inc/img/fancyzoom/zoom-shadow3.png | Bin 0 -> 368 bytes .../main/webapp/inc/img/fancyzoom/zoom-shadow4.png | Bin 0 -> 178 bytes .../main/webapp/inc/img/fancyzoom/zoom-shadow5.png | Bin 0 -> 180 bytes .../main/webapp/inc/img/fancyzoom/zoom-shadow6.png | Bin 0 -> 428 bytes .../main/webapp/inc/img/fancyzoom/zoom-shadow7.png | Bin 0 -> 186 bytes .../main/webapp/inc/img/fancyzoom/zoom-shadow8.png | Bin 0 -> 426 bytes .../main/webapp/inc/img/fancyzoom/zoom-spin-1.png | Bin 0 -> 1882 bytes .../main/webapp/inc/img/fancyzoom/zoom-spin-10.png | Bin 0 -> 1892 bytes .../main/webapp/inc/img/fancyzoom/zoom-spin-11.png | Bin 0 -> 1901 bytes .../main/webapp/inc/img/fancyzoom/zoom-spin-12.png | Bin 0 -> 1902 bytes .../main/webapp/inc/img/fancyzoom/zoom-spin-2.png | Bin 0 -> 1893 bytes .../main/webapp/inc/img/fancyzoom/zoom-spin-3.png | Bin 0 -> 1922 bytes .../main/webapp/inc/img/fancyzoom/zoom-spin-4.png | Bin 0 -> 1890 bytes .../main/webapp/inc/img/fancyzoom/zoom-spin-5.png | Bin 0 -> 1938 bytes .../main/webapp/inc/img/fancyzoom/zoom-spin-6.png | Bin 0 -> 1927 bytes .../main/webapp/inc/img/fancyzoom/zoom-spin-7.png | Bin 0 -> 1898 bytes .../main/webapp/inc/img/fancyzoom/zoom-spin-8.png | Bin 0 -> 1910 bytes .../main/webapp/inc/img/fancyzoom/zoom-spin-9.png | Bin 0 -> 1901 bytes .../src/main/webapp/inc/img/features/amy-small.png | Bin 0 -> 22455 bytes .../src/main/webapp/inc/img/features/amy.png | Bin 0 -> 136659 bytes .../main/webapp/inc/img/features/avatar-small.png | Bin 0 -> 16135 bytes .../src/main/webapp/inc/img/features/avatar.png | Bin 0 -> 38811 bytes .../src/main/webapp/inc/img/features/bbc.png | Bin 0 -> 897 bytes .../src/main/webapp/inc/img/features/extras.png | Bin 0 -> 5493 bytes .../src/main/webapp/inc/img/features/extras.xcf | Bin 0 -> 21405 bytes .../src/main/webapp/inc/img/features/flac.png | Bin 0 -> 6082 bytes .../src/main/webapp/inc/img/features/itunes.png | Bin 0 -> 9047 bytes .../src/main/webapp/inc/img/features/lame.png | Bin 0 -> 6634 bytes .../src/main/webapp/inc/img/features/lame.png.orig | Bin 0 -> 6634 bytes .../src/main/webapp/inc/img/features/last-fm.png | Bin 0 -> 2158 bytes .../main/webapp/inc/img/features/logon-small.png | Bin 0 -> 7002 bytes .../src/main/webapp/inc/img/features/logon.png | Bin 0 -> 15407 bytes .../main/webapp/inc/img/features/media-support.png | Bin 0 -> 40814 bytes .../main/webapp/inc/img/features/media-support.xcf | Bin 0 -> 64150 bytes .../src/main/webapp/inc/img/features/mp3.png | Bin 0 -> 18814 bytes .../src/main/webapp/inc/img/features/mp3.png.orig | Bin 0 -> 18814 bytes .../src/main/webapp/inc/img/features/nrk.png | Bin 0 -> 2040 bytes .../inc/img/features/personal-settings-small.png | Bin 0 -> 13076 bytes .../webapp/inc/img/features/personal-settings.png | Bin 0 -> 7461 bytes .../src/main/webapp/inc/img/features/podcast.png | Bin 0 -> 3250 bytes .../src/main/webapp/inc/img/features/shoutcast.png | Bin 0 -> 8265 bytes .../webapp/inc/img/features/shoutcast.png.orig | Bin 0 -> 8265 bytes .../src/main/webapp/inc/img/features/wap-small.png | Bin 0 -> 23306 bytes .../src/main/webapp/inc/img/features/wap.png | Bin 0 -> 83573 bytes .../src/main/webapp/inc/img/features/wikipedia.png | Bin 0 -> 5617 bytes .../webapp/inc/img/features/wikipedia.png.orig | Bin 0 -> 16462 bytes .../src/main/webapp/inc/img/features/winamp.png | Bin 0 -> 40578 bytes .../main/webapp/inc/img/features/winamp.png.orig | Bin 0 -> 40578 bytes .../src/main/webapp/inc/img/features/wmp.png | Bin 0 -> 42662 bytes .../src/main/webapp/inc/img/features/wmp.png.orig | Bin 0 -> 42662 bytes subsonic-site/src/main/webapp/inc/img/footer.gif | Bin 0 -> 5338 bytes .../main/webapp/inc/img/gettingstarted/license.png | Bin 0 -> 44025 bytes .../inc/img/gettingstarted/license_thumb.png | Bin 0 -> 88683 bytes .../webapp/inc/img/gettingstarted/musicfolders.png | Bin 0 -> 38957 bytes .../inc/img/gettingstarted/musicfolders_thumb.png | Bin 0 -> 106793 bytes subsonic-site/src/main/webapp/inc/img/gigapros.png | Bin 0 -> 1840 bytes subsonic-site/src/main/webapp/inc/img/gpl.png | Bin 0 -> 2986 bytes subsonic-site/src/main/webapp/inc/img/header.gif | Bin 0 -> 2251 bytes .../src/main/webapp/inc/img/home-rollover.gif | Bin 0 -> 1791 bytes .../src/main/webapp/inc/img/itemcontentborder.gif | Bin 0 -> 65 bytes .../src/main/webapp/inc/img/mac-appstore.jpg | Bin 0 -> 6717 bytes .../main/webapp/inc/img/mac-installer-small.png | Bin 0 -> 23561 bytes .../src/main/webapp/inc/img/mac-installer.png | Bin 0 -> 75268 bytes .../src/main/webapp/inc/img/merchandise.png | Bin 0 -> 20488 bytes .../src/main/webapp/inc/img/mpa-nominee.png | Bin 0 -> 10428 bytes subsonic-site/src/main/webapp/inc/img/paypal.gif | Bin 0 -> 2127 bytes .../src/main/webapp/inc/img/ripserver-small.png | Bin 0 -> 6830 bytes .../src/main/webapp/inc/img/ripserver.png | Bin 0 -> 18375 bytes .../main/webapp/inc/img/screenshots/screen01.png | Bin 0 -> 209029 bytes .../main/webapp/inc/img/screenshots/screen02.png | Bin 0 -> 352778 bytes .../main/webapp/inc/img/screenshots/screen03.png | Bin 0 -> 97498 bytes .../main/webapp/inc/img/screenshots/screen05.png | Bin 0 -> 743820 bytes .../main/webapp/inc/img/screenshots/screen06.png | Bin 0 -> 118009 bytes .../main/webapp/inc/img/screenshots/screen07.png | Bin 0 -> 194749 bytes .../main/webapp/inc/img/screenshots/screen08.png | Bin 0 -> 140362 bytes .../main/webapp/inc/img/screenshots/screen09.png | Bin 0 -> 140191 bytes .../main/webapp/inc/img/screenshots/screen10.png | Bin 0 -> 139752 bytes .../main/webapp/inc/img/screenshots/screen11.png | Bin 0 -> 196900 bytes .../main/webapp/inc/img/screenshots/screen12.png | Bin 0 -> 102123 bytes .../main/webapp/inc/img/screenshots/screen13.png | Bin 0 -> 178352 bytes .../main/webapp/inc/img/screenshots/screen14.png | Bin 0 -> 114613 bytes .../main/webapp/inc/img/screenshots/screen15.png | Bin 0 -> 115140 bytes .../main/webapp/inc/img/screenshots/screen16.png | Bin 0 -> 112808 bytes .../main/webapp/inc/img/screenshots/screen17.png | Bin 0 -> 482545 bytes .../main/webapp/inc/img/screenshots/screen18.png | Bin 0 -> 209911 bytes .../main/webapp/inc/img/screenshots/screen19.png | Bin 0 -> 352106 bytes .../main/webapp/inc/img/screenshots/screen20.png | Bin 0 -> 417249 bytes .../main/webapp/inc/img/screenshots/screen21.png | Bin 0 -> 338262 bytes .../main/webapp/inc/img/screenshots/screen22.png | Bin 0 -> 181565 bytes .../main/webapp/inc/img/screenshots/screen23.png | Bin 0 -> 115985 bytes .../main/webapp/inc/img/screenshots/screen24.png | Bin 0 -> 224079 bytes .../main/webapp/inc/img/screenshots/screen25.png | Bin 0 -> 119445 bytes .../main/webapp/inc/img/screenshots/screen26.png | Bin 0 -> 51974 bytes .../main/webapp/inc/img/screenshots/screen27.png | Bin 0 -> 180693 bytes .../main/webapp/inc/img/screenshots/screen28.png | Bin 0 -> 361945 bytes .../main/webapp/inc/img/screenshots/screen29.png | Bin 0 -> 30897 bytes .../main/webapp/inc/img/screenshots/screen30.png | Bin 0 -> 73600 bytes .../main/webapp/inc/img/screenshots/screen31.png | Bin 0 -> 100196 bytes .../main/webapp/inc/img/screenshots/screen32.png | Bin 0 -> 81977 bytes .../main/webapp/inc/img/screenshots/screen33.png | Bin 0 -> 37987 bytes .../main/webapp/inc/img/screenshots/screen34.png | Bin 0 -> 107142 bytes .../main/webapp/inc/img/screenshots/screen35.png | Bin 0 -> 218136 bytes .../main/webapp/inc/img/screenshots/screen36.png | Bin 0 -> 45077 bytes .../main/webapp/inc/img/screenshots/screen37.png | Bin 0 -> 266136 bytes .../main/webapp/inc/img/screenshots/screen38.png | Bin 0 -> 280620 bytes .../main/webapp/inc/img/screenshots/screen39.png | Bin 0 -> 66566 bytes .../main/webapp/inc/img/screenshots/screen40.png | Bin 0 -> 334178 bytes .../main/webapp/inc/img/screenshots/screen41.png | Bin 0 -> 26309 bytes .../main/webapp/inc/img/screenshots/screen42.png | Bin 0 -> 228047 bytes .../main/webapp/inc/img/screenshots/screen43.png | Bin 0 -> 34464 bytes .../main/webapp/inc/img/screenshots/screen44.png | Bin 0 -> 39845 bytes .../main/webapp/inc/img/screenshots/screen45.png | Bin 0 -> 29265 bytes .../main/webapp/inc/img/screenshots/thumb01.png | Bin 0 -> 39427 bytes .../main/webapp/inc/img/screenshots/thumb02.png | Bin 0 -> 52858 bytes .../main/webapp/inc/img/screenshots/thumb03.png | Bin 0 -> 23919 bytes .../main/webapp/inc/img/screenshots/thumb05.png | Bin 0 -> 83024 bytes .../main/webapp/inc/img/screenshots/thumb06.png | Bin 0 -> 30336 bytes .../main/webapp/inc/img/screenshots/thumb07.png | Bin 0 -> 28877 bytes .../main/webapp/inc/img/screenshots/thumb08.png | Bin 0 -> 39843 bytes .../main/webapp/inc/img/screenshots/thumb09.png | Bin 0 -> 40084 bytes .../main/webapp/inc/img/screenshots/thumb10.png | Bin 0 -> 38347 bytes .../main/webapp/inc/img/screenshots/thumb11.png | Bin 0 -> 43291 bytes .../main/webapp/inc/img/screenshots/thumb12.png | Bin 0 -> 26359 bytes .../main/webapp/inc/img/screenshots/thumb13.png | Bin 0 -> 40783 bytes .../main/webapp/inc/img/screenshots/thumb14.png | Bin 0 -> 28876 bytes .../main/webapp/inc/img/screenshots/thumb15.png | Bin 0 -> 29549 bytes .../main/webapp/inc/img/screenshots/thumb16.png | Bin 0 -> 32605 bytes .../main/webapp/inc/img/screenshots/thumb17.png | Bin 0 -> 44071 bytes .../main/webapp/inc/img/screenshots/thumb18.png | Bin 0 -> 42192 bytes .../main/webapp/inc/img/screenshots/thumb19.png | Bin 0 -> 42864 bytes .../main/webapp/inc/img/screenshots/thumb20.png | Bin 0 -> 41571 bytes .../main/webapp/inc/img/screenshots/thumb21.png | Bin 0 -> 37146 bytes .../main/webapp/inc/img/screenshots/thumb22.png | Bin 0 -> 28286 bytes .../main/webapp/inc/img/screenshots/thumb23.png | Bin 0 -> 24979 bytes .../main/webapp/inc/img/screenshots/thumb24.png | Bin 0 -> 36146 bytes .../main/webapp/inc/img/screenshots/thumb25.png | Bin 0 -> 27858 bytes .../main/webapp/inc/img/screenshots/thumb27.png | Bin 0 -> 52753 bytes .../main/webapp/inc/img/screenshots/thumb28.png | Bin 0 -> 87617 bytes .../main/webapp/inc/img/screenshots/thumb29.png | Bin 0 -> 11576 bytes .../main/webapp/inc/img/screenshots/thumb30.png | Bin 0 -> 25612 bytes .../main/webapp/inc/img/screenshots/thumb31.png | Bin 0 -> 30137 bytes .../main/webapp/inc/img/screenshots/thumb33.png | Bin 0 -> 39381 bytes .../main/webapp/inc/img/screenshots/thumb35.png | Bin 0 -> 89884 bytes .../main/webapp/inc/img/screenshots/thumb36.png | Bin 0 -> 61584 bytes .../main/webapp/inc/img/screenshots/thumb37.png | Bin 0 -> 48708 bytes .../main/webapp/inc/img/screenshots/thumb38.png | Bin 0 -> 135325 bytes .../main/webapp/inc/img/screenshots/thumb39.png | Bin 0 -> 26633 bytes .../main/webapp/inc/img/screenshots/thumb40.png | Bin 0 -> 86109 bytes .../main/webapp/inc/img/screenshots/thumb41.png | Bin 0 -> 7605 bytes .../main/webapp/inc/img/screenshots/thumb42.png | Bin 0 -> 62084 bytes .../main/webapp/inc/img/screenshots/thumb43.png | Bin 0 -> 42038 bytes .../main/webapp/inc/img/screenshots/thumb44.png | Bin 0 -> 30622 bytes .../main/webapp/inc/img/screenshots/thumb45.png | Bin 0 -> 24059 bytes subsonic-site/src/main/webapp/inc/img/search.png | Bin 0 -> 1267 bytes subsonic-site/src/main/webapp/inc/img/sindre.jpeg | Bin 0 -> 1978 bytes subsonic-site/src/main/webapp/inc/img/star.png | Bin 0 -> 547 bytes .../src/main/webapp/inc/img/subsonic-forum.png | Bin 0 -> 8506 bytes .../src/main/webapp/inc/img/subsonic-shop.jpeg | Bin 0 -> 18328 bytes .../src/main/webapp/inc/img/subsonic-tshirt.png | Bin 0 -> 119589 bytes subsonic-site/src/main/webapp/inc/img/subsonic.png | Bin 0 -> 14302 bytes subsonic-site/src/main/webapp/inc/img/top.gif | Bin 0 -> 68 bytes .../src/main/webapp/inc/img/topnav-div.gif | Bin 0 -> 263 bytes .../src/main/webapp/inc/img/topnav-hover.gif | Bin 0 -> 504 bytes subsonic-site/src/main/webapp/inc/img/topnav.gif | Bin 0 -> 5356 bytes subsonic-site/src/main/webapp/inc/img/ubuntu.png | Bin 0 -> 1262 bytes .../webapp/inc/img/windows-installer-small.png | Bin 0 -> 8516 bytes .../src/main/webapp/inc/img/windows-installer.png | Bin 0 -> 18267 bytes .../main/webapp/inc/img/windows-marketplace.png | Bin 0 -> 2676 bytes subsonic-site/src/main/webapp/inc/img/windows7.png | Bin 0 -> 1977 bytes .../src/main/webapp/inc/img/zazeen-ad.gif | Bin 0 -> 35430 bytes subsonic-site/src/main/webapp/inc/img/zazeen.gif | Bin 0 -> 3993 bytes subsonic-site/src/main/webapp/inc/js/FancyZoom.js | 761 +++++++++++++++ .../src/main/webapp/inc/js/FancyZoomHTML.js | 318 ++++++ .../src/main/webapp/inc/js/jquery-1.4.4.min.js | 167 ++++ .../src/main/webapp/inc/video/subsonic-medium.jpg | Bin 0 -> 60689 bytes subsonic-site/src/main/webapp/index.html | 10 + subsonic-site/src/main/webapp/index.jsp | 120 +++ subsonic-site/src/main/webapp/installation.jsp | 278 ++++++ subsonic-site/src/main/webapp/libraries.jsp | 48 + subsonic-site/src/main/webapp/menu.jsp | 32 + subsonic-site/src/main/webapp/merchandise.jsp | 7 + subsonic-site/src/main/webapp/paypal-landing.jsp | 36 + subsonic-site/src/main/webapp/quotes.jsp | 55 ++ subsonic-site/src/main/webapp/redirect-expired.jsp | 104 ++ subsonic-site/src/main/webapp/ripserver.jsp | 8 + subsonic-site/src/main/webapp/robots.txt | 2 + subsonic-site/src/main/webapp/screenshots.jsp | 67 ++ subsonic-site/src/main/webapp/search.jsp | 4 + subsonic-site/src/main/webapp/subsonic-ad.jsp | 51 + subsonic-site/src/main/webapp/tracking.jsp | 9 + subsonic-site/src/main/webapp/transcoding.jsp | 92 ++ .../src/main/webapp/translate-subsonic.jsp | 6 + subsonic-site/src/main/webapp/translate.jsp | 65 ++ subsonic-site/src/main/webapp/tutorial.jsp | 8 + subsonic-site/src/main/webapp/zazeen-ad.jsp | 12 + 305 files changed, 7606 insertions(+) create mode 100644 subsonic-site/src/main/webapp/WEB-INF/web.xml create mode 100644 subsonic-site/src/main/webapp/ad.jsp create mode 100644 subsonic-site/src/main/webapp/adwords-android.jsp create mode 100644 subsonic-site/src/main/webapp/android-donation.jsp create mode 100644 subsonic-site/src/main/webapp/api-addChatMessage.jsp create mode 100644 subsonic-site/src/main/webapp/api-changePassword.jsp create mode 100644 subsonic-site/src/main/webapp/api-createPlaylist.jsp create mode 100644 subsonic-site/src/main/webapp/api-createShare.jsp create mode 100644 subsonic-site/src/main/webapp/api-createUser.jsp create mode 100644 subsonic-site/src/main/webapp/api-deletePlaylist.jsp create mode 100644 subsonic-site/src/main/webapp/api-deleteShare.jsp create mode 100644 subsonic-site/src/main/webapp/api-deleteUser.jsp create mode 100644 subsonic-site/src/main/webapp/api-download.jsp create mode 100644 subsonic-site/src/main/webapp/api-getAlbum.jsp create mode 100644 subsonic-site/src/main/webapp/api-getAlbumList.jsp create mode 100644 subsonic-site/src/main/webapp/api-getAlbumList2.jsp create mode 100644 subsonic-site/src/main/webapp/api-getArtist.jsp create mode 100644 subsonic-site/src/main/webapp/api-getArtists.jsp create mode 100644 subsonic-site/src/main/webapp/api-getAvatar.jsp create mode 100644 subsonic-site/src/main/webapp/api-getChatMessages.jsp create mode 100644 subsonic-site/src/main/webapp/api-getCoverArt.jsp create mode 100644 subsonic-site/src/main/webapp/api-getIndexes.jsp create mode 100644 subsonic-site/src/main/webapp/api-getLicense.jsp create mode 100644 subsonic-site/src/main/webapp/api-getLyrics.jsp create mode 100644 subsonic-site/src/main/webapp/api-getMusicDirectory.jsp create mode 100644 subsonic-site/src/main/webapp/api-getMusicFolders.jsp create mode 100644 subsonic-site/src/main/webapp/api-getNowPlaying.jsp create mode 100644 subsonic-site/src/main/webapp/api-getPlaylist.jsp create mode 100644 subsonic-site/src/main/webapp/api-getPlaylists.jsp create mode 100644 subsonic-site/src/main/webapp/api-getPodcasts.jsp create mode 100644 subsonic-site/src/main/webapp/api-getRandomSongs.jsp create mode 100644 subsonic-site/src/main/webapp/api-getShares.jsp create mode 100644 subsonic-site/src/main/webapp/api-getSong.jsp create mode 100644 subsonic-site/src/main/webapp/api-getStarred.jsp create mode 100644 subsonic-site/src/main/webapp/api-getStarred2.jsp create mode 100644 subsonic-site/src/main/webapp/api-getUser.jsp create mode 100644 subsonic-site/src/main/webapp/api-getVideos.jsp create mode 100644 subsonic-site/src/main/webapp/api-jukeboxControl.jsp create mode 100644 subsonic-site/src/main/webapp/api-ping.jsp create mode 100644 subsonic-site/src/main/webapp/api-scrobble.jsp create mode 100644 subsonic-site/src/main/webapp/api-search.jsp create mode 100644 subsonic-site/src/main/webapp/api-search2.jsp create mode 100644 subsonic-site/src/main/webapp/api-search3.jsp create mode 100644 subsonic-site/src/main/webapp/api-setRating.jsp create mode 100644 subsonic-site/src/main/webapp/api-star.jsp create mode 100644 subsonic-site/src/main/webapp/api-stream.jsp create mode 100644 subsonic-site/src/main/webapp/api-unstar.jsp create mode 100644 subsonic-site/src/main/webapp/api-updatePlaylist.jsp create mode 100644 subsonic-site/src/main/webapp/api-updateShare.jsp create mode 100644 subsonic-site/src/main/webapp/api.jsp create mode 100644 subsonic-site/src/main/webapp/apps.jsp create mode 100644 subsonic-site/src/main/webapp/banner.jsp create mode 100644 subsonic-site/src/main/webapp/changelog.jsp create mode 100644 subsonic-site/src/main/webapp/demo.jsp create mode 100644 subsonic-site/src/main/webapp/documentation.jsp create mode 100644 subsonic-site/src/main/webapp/donate.jsp create mode 100644 subsonic-site/src/main/webapp/download-subsonic.jsp create mode 100644 subsonic-site/src/main/webapp/download.jsp create mode 100644 subsonic-site/src/main/webapp/download2.jsp create mode 100644 subsonic-site/src/main/webapp/faq.jsp create mode 100644 subsonic-site/src/main/webapp/favicon.ico create mode 100644 subsonic-site/src/main/webapp/features.jsp create mode 100644 subsonic-site/src/main/webapp/footer.jsp create mode 100644 subsonic-site/src/main/webapp/forum.jsp create mode 100644 subsonic-site/src/main/webapp/getting-started.jsp create mode 100644 subsonic-site/src/main/webapp/google-translate.jsp create mode 100644 subsonic-site/src/main/webapp/header.jsp create mode 100644 subsonic-site/src/main/webapp/hosting.jsp create mode 100644 subsonic-site/src/main/webapp/inc/css/banner.css create mode 100644 subsonic-site/src/main/webapp/inc/css/style.css create mode 100644 subsonic-site/src/main/webapp/inc/img/air.png create mode 100644 subsonic-site/src/main/webapp/inc/img/android.png create mode 100644 subsonic-site/src/main/webapp/inc/img/appstore.png create mode 100644 subsonic-site/src/main/webapp/inc/img/available_on_appstore.png create mode 100644 subsonic-site/src/main/webapp/inc/img/banner/android-video.png create mode 100644 subsonic-site/src/main/webapp/inc/img/banner/apps.png create mode 100644 subsonic-site/src/main/webapp/inc/img/banner/apps.xcf create mode 100644 subsonic-site/src/main/webapp/inc/img/banner/banner-01.jpg create mode 100644 subsonic-site/src/main/webapp/inc/img/banner/banner-bg.gif create mode 100644 subsonic-site/src/main/webapp/inc/img/banner/car.png create mode 100644 subsonic-site/src/main/webapp/inc/img/banner/iphone.png create mode 100644 subsonic-site/src/main/webapp/inc/img/banner/isub1.png create mode 100644 subsonic-site/src/main/webapp/inc/img/banner/next-hover.png create mode 100644 subsonic-site/src/main/webapp/inc/img/banner/next.png create mode 100644 subsonic-site/src/main/webapp/inc/img/banner/prev-hover.png create mode 100644 subsonic-site/src/main/webapp/inc/img/banner/prev.png create mode 100644 subsonic-site/src/main/webapp/inc/img/banner/screenshot.png create mode 100644 subsonic-site/src/main/webapp/inc/img/banner/video.png create mode 100644 subsonic-site/src/main/webapp/inc/img/banner/wp7.png create mode 100644 subsonic-site/src/main/webapp/inc/img/blackberry.png create mode 100644 subsonic-site/src/main/webapp/inc/img/body-bg.gif create mode 100644 subsonic-site/src/main/webapp/inc/img/button-download.png create mode 100644 subsonic-site/src/main/webapp/inc/img/change-password-small.png create mode 100644 subsonic-site/src/main/webapp/inc/img/change-password.png create mode 100644 subsonic-site/src/main/webapp/inc/img/chumby.png create mode 100644 subsonic-site/src/main/webapp/inc/img/content-bg.gif create mode 100644 subsonic-site/src/main/webapp/inc/img/donate.png create mode 100644 subsonic-site/src/main/webapp/inc/img/download-fedora.png create mode 100644 subsonic-site/src/main/webapp/inc/img/download-linux.png create mode 100644 subsonic-site/src/main/webapp/inc/img/download-mac.png create mode 100644 subsonic-site/src/main/webapp/inc/img/download-ubuntu.png create mode 100644 subsonic-site/src/main/webapp/inc/img/download-windows.png create mode 100644 subsonic-site/src/main/webapp/inc/img/download_small.gif create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/closebox.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/spacer.gif create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-fill.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-l.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-r.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow1.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow2.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow3.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow4.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow5.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow6.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow7.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow8.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-1.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-10.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-11.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-12.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-2.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-3.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-4.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-5.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-6.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-7.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-8.png create mode 100644 subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-9.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/amy-small.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/amy.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/avatar-small.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/avatar.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/bbc.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/extras.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/extras.xcf create mode 100644 subsonic-site/src/main/webapp/inc/img/features/flac.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/itunes.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/lame.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/lame.png.orig create mode 100644 subsonic-site/src/main/webapp/inc/img/features/last-fm.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/logon-small.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/logon.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/media-support.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/media-support.xcf create mode 100644 subsonic-site/src/main/webapp/inc/img/features/mp3.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/mp3.png.orig create mode 100644 subsonic-site/src/main/webapp/inc/img/features/nrk.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/personal-settings-small.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/personal-settings.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/podcast.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/shoutcast.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/shoutcast.png.orig create mode 100644 subsonic-site/src/main/webapp/inc/img/features/wap-small.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/wap.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/wikipedia.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/wikipedia.png.orig create mode 100644 subsonic-site/src/main/webapp/inc/img/features/winamp.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/winamp.png.orig create mode 100644 subsonic-site/src/main/webapp/inc/img/features/wmp.png create mode 100644 subsonic-site/src/main/webapp/inc/img/features/wmp.png.orig create mode 100644 subsonic-site/src/main/webapp/inc/img/footer.gif create mode 100644 subsonic-site/src/main/webapp/inc/img/gettingstarted/license.png create mode 100644 subsonic-site/src/main/webapp/inc/img/gettingstarted/license_thumb.png create mode 100644 subsonic-site/src/main/webapp/inc/img/gettingstarted/musicfolders.png create mode 100644 subsonic-site/src/main/webapp/inc/img/gettingstarted/musicfolders_thumb.png create mode 100644 subsonic-site/src/main/webapp/inc/img/gigapros.png create mode 100644 subsonic-site/src/main/webapp/inc/img/gpl.png create mode 100644 subsonic-site/src/main/webapp/inc/img/header.gif create mode 100644 subsonic-site/src/main/webapp/inc/img/home-rollover.gif create mode 100644 subsonic-site/src/main/webapp/inc/img/itemcontentborder.gif create mode 100644 subsonic-site/src/main/webapp/inc/img/mac-appstore.jpg create mode 100644 subsonic-site/src/main/webapp/inc/img/mac-installer-small.png create mode 100644 subsonic-site/src/main/webapp/inc/img/mac-installer.png create mode 100644 subsonic-site/src/main/webapp/inc/img/merchandise.png create mode 100644 subsonic-site/src/main/webapp/inc/img/mpa-nominee.png create mode 100644 subsonic-site/src/main/webapp/inc/img/paypal.gif create mode 100644 subsonic-site/src/main/webapp/inc/img/ripserver-small.png create mode 100644 subsonic-site/src/main/webapp/inc/img/ripserver.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen01.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen02.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen03.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen05.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen06.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen07.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen08.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen09.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen10.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen11.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen12.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen13.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen14.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen15.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen16.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen17.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen18.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen19.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen20.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen21.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen22.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen23.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen24.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen25.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen26.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen27.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen28.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen29.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen30.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen31.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen32.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen33.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen34.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen35.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen36.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen37.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen38.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen39.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen40.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen41.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen42.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen43.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen44.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/screen45.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb01.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb02.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb03.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb05.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb06.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb07.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb08.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb09.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb10.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb11.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb12.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb13.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb14.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb15.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb16.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb17.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb18.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb19.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb20.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb21.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb22.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb23.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb24.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb25.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb27.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb28.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb29.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb30.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb31.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb33.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb35.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb36.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb37.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb38.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb39.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb40.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb41.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb42.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb43.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb44.png create mode 100644 subsonic-site/src/main/webapp/inc/img/screenshots/thumb45.png create mode 100644 subsonic-site/src/main/webapp/inc/img/search.png create mode 100644 subsonic-site/src/main/webapp/inc/img/sindre.jpeg create mode 100644 subsonic-site/src/main/webapp/inc/img/star.png create mode 100644 subsonic-site/src/main/webapp/inc/img/subsonic-forum.png create mode 100644 subsonic-site/src/main/webapp/inc/img/subsonic-shop.jpeg create mode 100644 subsonic-site/src/main/webapp/inc/img/subsonic-tshirt.png create mode 100644 subsonic-site/src/main/webapp/inc/img/subsonic.png create mode 100644 subsonic-site/src/main/webapp/inc/img/top.gif create mode 100644 subsonic-site/src/main/webapp/inc/img/topnav-div.gif create mode 100644 subsonic-site/src/main/webapp/inc/img/topnav-hover.gif create mode 100644 subsonic-site/src/main/webapp/inc/img/topnav.gif create mode 100644 subsonic-site/src/main/webapp/inc/img/ubuntu.png create mode 100644 subsonic-site/src/main/webapp/inc/img/windows-installer-small.png create mode 100644 subsonic-site/src/main/webapp/inc/img/windows-installer.png create mode 100644 subsonic-site/src/main/webapp/inc/img/windows-marketplace.png create mode 100644 subsonic-site/src/main/webapp/inc/img/windows7.png create mode 100644 subsonic-site/src/main/webapp/inc/img/zazeen-ad.gif create mode 100644 subsonic-site/src/main/webapp/inc/img/zazeen.gif create mode 100644 subsonic-site/src/main/webapp/inc/js/FancyZoom.js create mode 100644 subsonic-site/src/main/webapp/inc/js/FancyZoomHTML.js create mode 100644 subsonic-site/src/main/webapp/inc/js/jquery-1.4.4.min.js create mode 100644 subsonic-site/src/main/webapp/inc/video/subsonic-medium.jpg create mode 100644 subsonic-site/src/main/webapp/index.html create mode 100644 subsonic-site/src/main/webapp/index.jsp create mode 100644 subsonic-site/src/main/webapp/installation.jsp create mode 100644 subsonic-site/src/main/webapp/libraries.jsp create mode 100644 subsonic-site/src/main/webapp/menu.jsp create mode 100644 subsonic-site/src/main/webapp/merchandise.jsp create mode 100644 subsonic-site/src/main/webapp/paypal-landing.jsp create mode 100644 subsonic-site/src/main/webapp/quotes.jsp create mode 100644 subsonic-site/src/main/webapp/redirect-expired.jsp create mode 100644 subsonic-site/src/main/webapp/ripserver.jsp create mode 100644 subsonic-site/src/main/webapp/robots.txt create mode 100644 subsonic-site/src/main/webapp/screenshots.jsp create mode 100644 subsonic-site/src/main/webapp/search.jsp create mode 100644 subsonic-site/src/main/webapp/subsonic-ad.jsp create mode 100644 subsonic-site/src/main/webapp/tracking.jsp create mode 100644 subsonic-site/src/main/webapp/transcoding.jsp create mode 100644 subsonic-site/src/main/webapp/translate-subsonic.jsp create mode 100644 subsonic-site/src/main/webapp/translate.jsp create mode 100644 subsonic-site/src/main/webapp/tutorial.jsp create mode 100644 subsonic-site/src/main/webapp/zazeen-ad.jsp (limited to 'subsonic-site/src/main') diff --git a/subsonic-site/src/main/webapp/WEB-INF/web.xml b/subsonic-site/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..7cd15a49 --- /dev/null +++ b/subsonic-site/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,13 @@ + + + + Subsonic Site + + + index.html + index.jsp + + + \ No newline at end of file diff --git a/subsonic-site/src/main/webapp/ad.jsp b/subsonic-site/src/main/webapp/ad.jsp new file mode 100644 index 00000000..e89a43ed --- /dev/null +++ b/subsonic-site/src/main/webapp/ad.jsp @@ -0,0 +1,6 @@ +
+ + + + +
diff --git a/subsonic-site/src/main/webapp/adwords-android.jsp b/subsonic-site/src/main/webapp/adwords-android.jsp new file mode 100644 index 00000000..795dc39e --- /dev/null +++ b/subsonic-site/src/main/webapp/adwords-android.jsp @@ -0,0 +1,45 @@ + + + + + Subsonic » Free Music Streamer + + + + + <%@ include file="tracking.jsp" %> + + + +

Subsonic Music Streamer

+

+ Stream and download music from your home computer to Android, iPhone and Windows Phone. + All your music - anywhere, anytime! Never sync again. + Supports most audio formats, including mp3, ogg, aac, flac, wma. +

+ +

+ Supports streaming, downloading, playlists, album art, searching and automatic conversion to lower bitrates. + For improved performance, music you have listened to is cached on the phone. + An offline mode is also available for when you are outside 3G/Wi-Fi coverage. +

+ +

+ Server software is available for Windows, Mac and Linux. +

+ +

+ For more information, visit subsonic.org, or download the Subsonic app from + Android Market or Apple App Store. The app is by default connected to a demo server so you can try it out without installing the + Subsonic server software on your home computer. +

+ + + + + + + + \ No newline at end of file diff --git a/subsonic-site/src/main/webapp/android-donation.jsp b/subsonic-site/src/main/webapp/android-donation.jsp new file mode 100644 index 00000000..831d7b5c --- /dev/null +++ b/subsonic-site/src/main/webapp/android-donation.jsp @@ -0,0 +1,88 @@ + + + + + Subsonic » Free Music Streamer + + + + + + + +

Love Subsonic?

+ +

+ Please support continued development and maintenance by giving a donation. +

+ +

+ As a donor you get the following benefits: +

+ + +

+ The suggested donation amount is €20, but you can give any amount you like. +

+ +

+ Click one of the buttons to go to PayPal where you can pay by credit card or by using your PayPal account. + Once the donation is processed, you will receive a license key by email. +

+ + + + + + + + +
+ + + + + + + +
€10
+
+ + + + + + + +
€20
+
+ + + + + + + +
€25
+
+ + + + + + + +
€30
+
+ +

+ For more information, please visit subsonic.org +

+ + diff --git a/subsonic-site/src/main/webapp/api-addChatMessage.jsp b/subsonic-site/src/main/webapp/api-addChatMessage.jsp new file mode 100644 index 00000000..1d9d01dc --- /dev/null +++ b/subsonic-site/src/main/webapp/api-addChatMessage.jsp @@ -0,0 +1,28 @@ +

addChatMessage

+ +

+ http://your-server/rest/addChatMessage.view +
Since 1.2.0 +

+ +

+ Adds a message to the chat log. +

+ + + + + + + + + + + + + +
ParameterRequiredDefaultComment
messageYesThe chat message.
+ +

+ Returns an empty <subsonic-response> element on success. +

diff --git a/subsonic-site/src/main/webapp/api-changePassword.jsp b/subsonic-site/src/main/webapp/api-changePassword.jsp new file mode 100644 index 00000000..a7fcb039 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-changePassword.jsp @@ -0,0 +1,35 @@ +

changePassword

+ +

+ http://your-server/rest/changePassword.view +
Since 1.1.0 +

+ +

+ Changes the password of an existing Subsonic user, using the following parameters. + You can only change your own password unless you have admin privileges. +

+ + + + + + + + + + + + + + + + + + + +
ParameterRequiredDefaultComment
usernameYesThe name of the user which should change its password.
passwordYesThe new password of the new user, either in clear text of hex-encoded (see above).
+ +

+ Returns an empty <subsonic-response> element on success. +

diff --git a/subsonic-site/src/main/webapp/api-createPlaylist.jsp b/subsonic-site/src/main/webapp/api-createPlaylist.jsp new file mode 100644 index 00000000..dd39f0cd --- /dev/null +++ b/subsonic-site/src/main/webapp/api-createPlaylist.jsp @@ -0,0 +1,39 @@ +

createPlaylist

+ +

+ http://your-server/rest/createPlaylist.view +
Since 1.2.0 +

+ +

+ Creates (or updates) a playlist. +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterRequiredDefaultComment
playlistIdYes (if updating)The playlist ID.
nameYes (if creating)The human-readable name of the playlist.
songIdYesID of a song in the playlist. Use one songId parameter for each song in the playlist.
+

+ Returns an empty <subsonic-response> element on success. +

diff --git a/subsonic-site/src/main/webapp/api-createShare.jsp b/subsonic-site/src/main/webapp/api-createShare.jsp new file mode 100644 index 00000000..bc9d4115 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-createShare.jsp @@ -0,0 +1,41 @@ +

createShare

+

+ http://your-server/rest/createShare.view +
Since 1.6.0 +

+

+ Creates a public URL that can be used by anyone to stream music or video from the Subsonic server. The URL is short and + suitable for posting on Facebook, Twitter etc. Note: The user must be authorized to share (see Settings > Users + > User is allowed to share files with anyone). +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterRequiredDefaultComment
idYesID of a song, album or video to share. Use one id parameter for each entry to share.
descriptionNoA user-defined description that will be displayed to people visiting the shared media.
expiresNoThe time at which the share expires. Given as milliseconds since 1970.
+

+ Returns a <subsonic-response> element with a nested <shares> + element on success, which in turns contains a single <share> element for the newly created share. + Example. +

diff --git a/subsonic-site/src/main/webapp/api-createUser.jsp b/subsonic-site/src/main/webapp/api-createUser.jsp new file mode 100644 index 00000000..331148b3 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-createUser.jsp @@ -0,0 +1,112 @@ +

createUser

+ +

+ http://your-server/rest/createUser.view +
Since 1.1.0 +

+ +

+ Creates a new Subsonic user, using the following parameters: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterRequiredDefaultComment
usernameYesThe name of the new user.
passwordYesThe password of the new user, either in clear text of hex-encoded (see above).
emailYesThe email address of the new user.
ldapAuthenticatedNofalseWhether the user is authenicated in LDAP.
adminRoleNofalseWhether the user is administrator.
settingsRoleNotrueWhether the user is allowed to change settings and password.
streamRoleNotrueWhether the user is allowed to play files.
jukeboxRoleNofalseWhether the user is allowed to play files in jukebox mode.
downloadRoleNofalseWhether the user is allowed to download files.
uploadRoleNofalseWhether the user is allowed to upload files.
playlistRoleNofalseWhether the user is allowed to create and delete playlists. Since 1.8.0, changing this role has no effect.
coverArtRoleNofalseWhether the user is allowed to change cover art and tags.
commentRoleNofalseWhether the user is allowed to create and edit comments and ratings.
podcastRoleNofalseWhether the user is allowed to administrate Podcasts.
shareRoleNofalse(Since 1.8.0)Whether the user is allowed to share files with anyone.
+ +

+ Returns an empty <subsonic-response> element on success. +

diff --git a/subsonic-site/src/main/webapp/api-deletePlaylist.jsp b/subsonic-site/src/main/webapp/api-deletePlaylist.jsp new file mode 100644 index 00000000..8a9cef6d --- /dev/null +++ b/subsonic-site/src/main/webapp/api-deletePlaylist.jsp @@ -0,0 +1,27 @@ +

deletePlaylist

+ +

+ http://your-server/rest/deletePlaylist.view +
Since 1.2.0 +

+ +

+ Deletes a saved playlist. +

+ + + + + + + + + + + + + +
ParameterRequiredDefaultComment
idyesID of the playlist to delete, as obtained by getPlaylists.
+

+ Returns an empty <subsonic-response> element on success. +

diff --git a/subsonic-site/src/main/webapp/api-deleteShare.jsp b/subsonic-site/src/main/webapp/api-deleteShare.jsp new file mode 100644 index 00000000..8c15f536 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-deleteShare.jsp @@ -0,0 +1,25 @@ +

deleteShare

+

+ http://your-server/rest/deleteShare.view +
Since 1.6.0 +

+

+ Deletes an existing share. +

+ + + + + + + + + + + + + +
ParameterRequiredDefaultComment
idYesID of the share to delete.
+

+ Returns an empty <subsonic-response> element on success. +

diff --git a/subsonic-site/src/main/webapp/api-deleteUser.jsp b/subsonic-site/src/main/webapp/api-deleteUser.jsp new file mode 100644 index 00000000..4fc94de8 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-deleteUser.jsp @@ -0,0 +1,28 @@ +

deleteUser

+ +

+ http://your-server/rest/deleteUser.view +
Since 1.3.0 +

+ +

+ Deletes an existing Subsonic user, using the following parameters: +

+ + + + + + + + + + + + + +
ParameterRequiredDefaultComment
usernameYesThe name of the user to delete.
+ +

+ Returns an empty <subsonic-response> element on success. +

diff --git a/subsonic-site/src/main/webapp/api-download.jsp b/subsonic-site/src/main/webapp/api-download.jsp new file mode 100644 index 00000000..63b55a00 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-download.jsp @@ -0,0 +1,28 @@ +

download

+ +

+ http://your-server/rest/download.view +
Since 1.0.0 +

+ +

+ Downloads a given media file. Similar to stream, but this method returns the original media data + without transcoding or downsampling. +

+ + + + + + + + + + + + + +
ParameterRequiredDefaultComment
idYesA string which uniquely identifies the file to download. Obtained by calls to getMusicDirectory.
+

+ Returns binary data on success, or an XML document on error (in which case the HTTP content type will start with "text/xml"). +

diff --git a/subsonic-site/src/main/webapp/api-getAlbum.jsp b/subsonic-site/src/main/webapp/api-getAlbum.jsp new file mode 100644 index 00000000..3980c740 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getAlbum.jsp @@ -0,0 +1,29 @@ +

getAlbum

+ +

+ http://your-server/rest/getAlbum.view +
Since 1.8.0 +

+ +

+ Returns details for an album, including a list of songs. This method organizes music according to ID3 tags. +

+ + + + + + + + + + + + + +
ParameterRequiredDefaultComment
idYesThe album ID.
+

+ Returns a <subsonic-response> element with a nested <album> + element on success. + Example. +

diff --git a/subsonic-site/src/main/webapp/api-getAlbumList.jsp b/subsonic-site/src/main/webapp/api-getAlbumList.jsp new file mode 100644 index 00000000..a5f2e0d3 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getAlbumList.jsp @@ -0,0 +1,44 @@ +

getAlbumList

+ +

+ http://your-server/rest/getAlbumList.view +
Since 1.2.0 +

+ +

+ Returns a list of random, newest, highest rated etc. albums. Similar to the album lists + on the home page of the Subsonic web interface. +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterRequiredDefaultComment
typeYesThe list type. Must be one of the following: random, newest, + highest, frequent, recent. Since 1.8.0 + you can also use alphabeticalByName or alphabeticalByArtist to page through all albums + alphabetically, and starred to retrieve starred albums.
sizeNo10The number of albums to return. Max 500.
offsetNo0The list offset. Useful if you for example want to page through the list of newest albums.
+

+ Returns a <subsonic-response> element with a nested <albumList> + element on success. Example. +

diff --git a/subsonic-site/src/main/webapp/api-getAlbumList2.jsp b/subsonic-site/src/main/webapp/api-getAlbumList2.jsp new file mode 100644 index 00000000..ee2c962f --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getAlbumList2.jsp @@ -0,0 +1,42 @@ +

getAlbumList2

+ +

+ http://your-server/rest/getAlbumList2.view +
Since 1.8.0 +

+ +

+ Similar to getAlbumList, but organizes music according to ID3 tags. +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterRequiredDefaultComment
typeYesThe list type. Must be one of the following: random, newest, + frequent, recent, starred, + alphabeticalByName or alphabeticalByArtist.
sizeNo10The number of albums to return. Max 500.
offsetNo0The list offset. Useful if you for example want to page through the list of newest albums.
+

+ Returns a <subsonic-response> element with a nested <albumList2> + element on success. Example. +

diff --git a/subsonic-site/src/main/webapp/api-getArtist.jsp b/subsonic-site/src/main/webapp/api-getArtist.jsp new file mode 100644 index 00000000..d649f5a6 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getArtist.jsp @@ -0,0 +1,29 @@ +

getArtist

+ +

+ http://your-server/rest/getArtist.view +
Since 1.8.0 +

+ +

+ Returns details for an artist, including a list of albums. This method organizes music according to ID3 tags. +

+ + + + + + + + + + + + + +
ParameterRequiredDefaultComment
idYesThe artist ID.
+

+ Returns a <subsonic-response> element with a nested <artist> + element on success. + Example. +

diff --git a/subsonic-site/src/main/webapp/api-getArtists.jsp b/subsonic-site/src/main/webapp/api-getArtists.jsp new file mode 100644 index 00000000..fdc4f5f7 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getArtists.jsp @@ -0,0 +1,15 @@ +

getArtists

+ +

+ http://your-server/rest/getArtists.view +
Since 1.8.0 +

+ +

+ Similar to getIndexes, but organizes music according to ID3 tags. +

+ +

+ Returns a <subsonic-response> element with a nested <artists> + element on success. Example. +

diff --git a/subsonic-site/src/main/webapp/api-getAvatar.jsp b/subsonic-site/src/main/webapp/api-getAvatar.jsp new file mode 100644 index 00000000..4201dd52 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getAvatar.jsp @@ -0,0 +1,27 @@ +

getAvatar

+ +

+ http://your-server/rest/getAvatar.view +
Since 1.8.0 +

+ +

+ Returns the avatar (personal image) for a user. +

+ + + + + + + + + + + + + +
ParameterRequiredDefaultComment
usernameYesThe user in question.
+

+ Returns the avatar image in binary form. +

diff --git a/subsonic-site/src/main/webapp/api-getChatMessages.jsp b/subsonic-site/src/main/webapp/api-getChatMessages.jsp new file mode 100644 index 00000000..e27aa640 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getChatMessages.jsp @@ -0,0 +1,28 @@ +

getChatMessages

+ +

+ http://your-server/rest/getChatMessages.view +
Since 1.2.0 +

+ +

+ Returns the current visible (non-expired) chat messages. +

+ + + + + + + + + + + + + +
ParameterRequiredDefaultComment
sinceNoOnly return messages newer than this time (in millis since Jan 1 1970).
+

+ Returns a <subsonic-response> element with a nested <chatMessages> + element on success. Example. +

diff --git a/subsonic-site/src/main/webapp/api-getCoverArt.jsp b/subsonic-site/src/main/webapp/api-getCoverArt.jsp new file mode 100644 index 00000000..23f9ad5b --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getCoverArt.jsp @@ -0,0 +1,34 @@ +

getCoverArt

+ +

+ http://your-server/rest/getCoverArt.view +
Since 1.0.0 +

+ +

+ Returns a cover art image. +

+ + + + + + + + + + + + + + + + + + + +
ParameterRequiredDefaultComment
idYesA string which uniquely identifies the cover art file to download. Obtained by calls to getMusicDirectory. +
sizeNoIf specified, scale image to this size.
+

+ Returns the cover art image in binary form. +

diff --git a/subsonic-site/src/main/webapp/api-getIndexes.jsp b/subsonic-site/src/main/webapp/api-getIndexes.jsp new file mode 100644 index 00000000..375f4a92 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getIndexes.jsp @@ -0,0 +1,35 @@ +

getIndexes

+ +

+ http://your-server/rest/getIndexes.view +
Since 1.0.0 +

+ +

+ Returns an indexed structure of all artists. +

+ + + + + + + + + + + + + + + + + + + +
ParameterRequiredDefaultComment
musicFolderIdNoIf specified, only return artists in the music folder with the given ID. See getMusicFolders. +
ifModifiedSinceNoIf specified, only return a result if the artist collection has changed since the given time.
+

+ Returns a <subsonic-response> element with a nested <indexes> + element on success. Example. +

diff --git a/subsonic-site/src/main/webapp/api-getLicense.jsp b/subsonic-site/src/main/webapp/api-getLicense.jsp new file mode 100644 index 00000000..32185d7b --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getLicense.jsp @@ -0,0 +1,17 @@ +

getLicense

+ +

+ http://your-server/rest/getLicense.view +
Since 1.0.0 +

+ +

+ Get details about the software license. Takes no extra parameters. Please note that access to the + REST API requires that the server has a valid license (after a 30-day trial period). To get a license key you can + give a donation to the Subsonic project. +

+ +

+ Returns a <subsonic-response> element with a nested <license> + element on success. Example. +

diff --git a/subsonic-site/src/main/webapp/api-getLyrics.jsp b/subsonic-site/src/main/webapp/api-getLyrics.jsp new file mode 100644 index 00000000..e9cfeb9d --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getLyrics.jsp @@ -0,0 +1,35 @@ +

getLyrics

+ +

+ http://your-server/rest/getLyrics.view +
Since 1.2.0 +

+ +

+ Searches for and returns lyrics for a given song. +

+ + + + + + + + + + + + + + + + + + + +
ParameterRequiredDefaultComment
artistNoThe artist name.
titleNoThe song title.
+

+ Returns a <subsonic-response> element with a nested <lyrics> + element on success. The <lyrics> element is empty if no matching lyrics was found. + Example. +

diff --git a/subsonic-site/src/main/webapp/api-getMusicDirectory.jsp b/subsonic-site/src/main/webapp/api-getMusicDirectory.jsp new file mode 100644 index 00000000..87e159a1 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getMusicDirectory.jsp @@ -0,0 +1,32 @@ +

getMusicDirectory

+ +

+ http://your-server/rest/getMusicDirectory.view +
Since 1.0.0 +

+ +

+ Returns a listing of all files in a music directory. Typically used to get list of albums for an artist, + or list of songs for an album. +

+ + + + + + + + + + + + + +
ParameterRequiredDefaultComment
idYesA string which uniquely identifies the music folder. Obtained by calls to getIndexes or getMusicDirectory. +
+

+ Returns a <subsonic-response> element with a nested <directory> + element on success. + Example 1. + Example 2. +

diff --git a/subsonic-site/src/main/webapp/api-getMusicFolders.jsp b/subsonic-site/src/main/webapp/api-getMusicFolders.jsp new file mode 100644 index 00000000..f7e5ac5c --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getMusicFolders.jsp @@ -0,0 +1,15 @@ +

getMusicFolders

+ +

+ http://your-server/rest/getMusicFolders.view +
Since 1.0.0 +

+ +

+ Returns all configured top-level music folders. Takes no extra parameters. +

+ +

+ Returns a <subsonic-response> element with a nested <musicFolders> + element on success. Example. +

diff --git a/subsonic-site/src/main/webapp/api-getNowPlaying.jsp b/subsonic-site/src/main/webapp/api-getNowPlaying.jsp new file mode 100644 index 00000000..597994d7 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getNowPlaying.jsp @@ -0,0 +1,15 @@ +

getNowPlaying

+ +

+ http://your-server/rest/getNowPlaying.view +
Since 1.0.0 +

+ +

+ Returns what is currently being played by all users. Takes no extra parameters. +

+ +

+ Returns a <subsonic-response> element with a nested <nowPlaying> + element on success. Example. +

diff --git a/subsonic-site/src/main/webapp/api-getPlaylist.jsp b/subsonic-site/src/main/webapp/api-getPlaylist.jsp new file mode 100644 index 00000000..0e795f8b --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getPlaylist.jsp @@ -0,0 +1,28 @@ +

getPlaylist

+ +

+ http://your-server/rest/getPlaylist.view +
Since 1.0.0 +

+ +

+ Returns a listing of files in a saved playlist. +

+ + + + + + + + + + + + + +
ParameterRequiredDefaultComment
idyesID of the playlist to return, as obtained by getPlaylists.
+

+ Returns a <subsonic-response> element with a nested <playlist> + element on success. Example. +

diff --git a/subsonic-site/src/main/webapp/api-getPlaylists.jsp b/subsonic-site/src/main/webapp/api-getPlaylists.jsp new file mode 100644 index 00000000..0bc87e23 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getPlaylists.jsp @@ -0,0 +1,29 @@ +

getPlaylists

+ +

+ http://your-server/rest/getPlaylists.view +
Since 1.0.0 +

+ +

+ Returns all playlists a user is allowed to play. +

+ + + + + + + + + + + + + +
ParameterRequiredDefaultComment
usernameno(Since 1.8.0) If specified, return playlists for this user rather than for the authenticated user. The authenticated user must + have admin role if this parameter is used.
+

+ Returns a <subsonic-response> element with a nested <playlists> + element on success. Example. +

diff --git a/subsonic-site/src/main/webapp/api-getPodcasts.jsp b/subsonic-site/src/main/webapp/api-getPodcasts.jsp new file mode 100644 index 00000000..a5a6b2d2 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getPodcasts.jsp @@ -0,0 +1,28 @@ +

getPodcasts

+ +

+ http://your-server/rest/getPodcasts.view +
Since 1.6.0 +

+ +

+ Returns all podcast channels the server subscribes to and their episodes. Takes no extra parameters. +

+ +

+ Returns a <subsonic-response> element with a nested <podcasts> + element on success. Example. +

+ +

getShares

+

+ http://your-server/rest/getShares.view +
Since 1.6.0 +

+

+ Returns information about shared media this user is allowed to manage. Takes no extra parameters. +

+

+ Returns a <subsonic-response> element with a nested <shares> + element on success. Example. +

diff --git a/subsonic-site/src/main/webapp/api-getRandomSongs.jsp b/subsonic-site/src/main/webapp/api-getRandomSongs.jsp new file mode 100644 index 00000000..bba4fccb --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getRandomSongs.jsp @@ -0,0 +1,52 @@ +

getRandomSongs

+ +

+ http://your-server/rest/getRandomSongs.view +
Since 1.2.0 +

+ +

+ Returns random songs matching the given criteria. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterRequiredDefaultComment
sizeNo10The maximum number of songs to return. Max 500.
genreNoOnly returns songs belonging to this genre.
fromYearNoOnly return songs published after or in this year.
toYearNoOnly return songs published before or in this year.
musicFolderIdNoOnly return songs in the music folder with the given ID. See getMusicFolders.
+

+ Returns a <subsonic-response> element with a nested <randomSongs> + element on success. Example. +

diff --git a/subsonic-site/src/main/webapp/api-getShares.jsp b/subsonic-site/src/main/webapp/api-getShares.jsp new file mode 100644 index 00000000..096d47d8 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getShares.jsp @@ -0,0 +1,14 @@ +

getShares

+

+ http://your-server/rest/getShares.view +
Since 1.6.0 +

+

+ Returns information about shared media this user is allowed to manage. Takes no extra parameters. +

+ +

+ Returns a <subsonic-response> element with a nested <shares> + element on success. + Example. +

diff --git a/subsonic-site/src/main/webapp/api-getSong.jsp b/subsonic-site/src/main/webapp/api-getSong.jsp new file mode 100644 index 00000000..3b799a3f --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getSong.jsp @@ -0,0 +1,29 @@ +

getSong

+ +

+ http://your-server/rest/getSong.view +
Since 1.8.0 +

+ +

+ Returns details for a song. +

+ + + + + + + + + + + + + +
ParameterRequiredDefaultComment
idYesThe song ID.
+

+ Returns a <subsonic-response> element with a nested <song> + element on success. + Example. +

diff --git a/subsonic-site/src/main/webapp/api-getStarred.jsp b/subsonic-site/src/main/webapp/api-getStarred.jsp new file mode 100644 index 00000000..a6e411fc --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getStarred.jsp @@ -0,0 +1,14 @@ +

getStarred

+ +

+ http://your-server/rest/getStarred.view +
Since 1.8.0 +

+ +

+ Returns starred songs, albums and artists. +

+

+ Returns a <subsonic-response> element with a nested <starred> + element on success. Example. +

diff --git a/subsonic-site/src/main/webapp/api-getStarred2.jsp b/subsonic-site/src/main/webapp/api-getStarred2.jsp new file mode 100644 index 00000000..c6e9232a --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getStarred2.jsp @@ -0,0 +1,14 @@ +

getStarred2

+ +

+ http://your-server/rest/getStarred2.view +
Since 1.8.0 +

+ +

+ Similar to getStarred, but organizes music according to ID3 tags. +

+

+ Returns a <subsonic-response> element with a nested <starred2> + element on success. Example. +

diff --git a/subsonic-site/src/main/webapp/api-getUser.jsp b/subsonic-site/src/main/webapp/api-getUser.jsp new file mode 100644 index 00000000..12615b7c --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getUser.jsp @@ -0,0 +1,29 @@ +

getUser

+ +

+ http://your-server/rest/getUser.view +
Since 1.3.0 +

+ +

+ Get details about a given user, including which authorization roles it has. + Can be used to enable/disable certain features in the client, such as jukebox control. +

+ + + + + + + + + + + + + +
ParameterRequiredDefaultComment
usernameYesThe name of the user to retrieve. You can only retrieve your own user unless you have admin privileges.
+

+ Returns a <subsonic-response> element with a nested <user> + element on success. Example. +

diff --git a/subsonic-site/src/main/webapp/api-getVideos.jsp b/subsonic-site/src/main/webapp/api-getVideos.jsp new file mode 100644 index 00000000..11fc7ed0 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-getVideos.jsp @@ -0,0 +1,15 @@ +

getVideos

+ +

+ http://your-server/rest/getVideos.view +
Since 1.8.0 +

+ +

+ Returns all video files. +

+ +

+ Returns a <subsonic-response> element with a nested <videos> + element on success. Example. +

diff --git a/subsonic-site/src/main/webapp/api-jukeboxControl.jsp b/subsonic-site/src/main/webapp/api-jukeboxControl.jsp new file mode 100644 index 00000000..ee87a9b2 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-jukeboxControl.jsp @@ -0,0 +1,60 @@ +

jukeboxControl

+ +

+ http://your-server/rest/jukeboxControl.view +
Since 1.2.0 +

+ +

+ Controls the jukebox, i.e., playback directly on the server's audio hardware. Note: The user must + be authorized to control the jukebox (see Settings > Users > User is allowed to play files in jukebox mode). +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterRequiredDefaultComment
actionYesThe operation to perform. Must be one of: get, status (since 1.7.0), set (since 1.7.0), + start, stop, skip, add, clear, remove, shuffle, setGain +
indexNoUsed by skip and remove. Zero-based index of the song to skip to or remove.
offsetNo(Since 1.7.0) Used by skip. Start playing this many seconds into the track.
idNoUsed by add and set. ID of song to add to the jukebox playlist. Use multiple id parameters + to add many songs in the same request. (set is similar to a clear followed by a add, but + will not change the currently playing track.) +
gainNoUsed by setGain to control the playback volume. A float value between 0.0 and 1.0.
+

+ Returns a <jukeboxStatus> element on success, unless the get + action is used, in which case a nested <jukeboxPlaylist> element is returned. + Example 1. + Example 2. +

diff --git a/subsonic-site/src/main/webapp/api-ping.jsp b/subsonic-site/src/main/webapp/api-ping.jsp new file mode 100644 index 00000000..af9568fa --- /dev/null +++ b/subsonic-site/src/main/webapp/api-ping.jsp @@ -0,0 +1,14 @@ +

ping

+ +

+ http://your-server/rest/ping.view +
Since 1.0.0 +

+ +

+ Used to test connectivity with the server. Takes no extra parameters. +

+ +

+ Returns an empty <subsonic-response> element on success. Example. +

diff --git a/subsonic-site/src/main/webapp/api-scrobble.jsp b/subsonic-site/src/main/webapp/api-scrobble.jsp new file mode 100644 index 00000000..9a01f49f --- /dev/null +++ b/subsonic-site/src/main/webapp/api-scrobble.jsp @@ -0,0 +1,34 @@ +

scrobble

+ +

+ http://your-server/rest/scrobble.view +
Since 1.5.0 +

+ +

+ "Scrobbles" a given music file on last.fm. Requires that the user has configured his/her last.fm + credentials on the Subsonic server (Settings > Personal). +

+ + + + + + + + + + + + + + + + + + + +
ParameterRequiredDefaultComment
idYesA string which uniquely identifies the file to scrobble.
submissionNoTrueWhether this is a "submission" or a "now playing" notification.
+

+ Returns an empty <subsonic-response> element on success. +

diff --git a/subsonic-site/src/main/webapp/api-search.jsp b/subsonic-site/src/main/webapp/api-search.jsp new file mode 100644 index 00000000..f74fba2e --- /dev/null +++ b/subsonic-site/src/main/webapp/api-search.jsp @@ -0,0 +1,65 @@ +

search

+ +

+ http://your-server/rest/search.view +
Since 1.0.0 +
Deprecated since 1.4.0, use search2 instead. +

+ +

+ Returns a listing of files matching the given search criteria. Supports paging through the result. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterRequiredDefaultComment
artistNoArtist to search for.
albumNoAlbum to searh for.
titleNoSong title to search for.
anyNoSearches all fields.
countNo20Maximum number of results to return.
offsetNo0Search result offset. Used for paging.
newerThanNoOnly return matches that are newer than this. Given as milliseconds since 1970.
+

+ Returns a <subsonic-response> element with a nested <searchResult> + element on success. Example. +

diff --git a/subsonic-site/src/main/webapp/api-search2.jsp b/subsonic-site/src/main/webapp/api-search2.jsp new file mode 100644 index 00000000..c1491f4d --- /dev/null +++ b/subsonic-site/src/main/webapp/api-search2.jsp @@ -0,0 +1,65 @@ +

search2

+ +

+ http://your-server/rest/search2.view +
Since 1.4.0 +

+ +

+ Returns albums, artists and songs matching the given search criteria. Supports paging through the result. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterRequiredDefaultComment
queryYesSearch query.
artistCountNo20Maximum number of artists to return.
artistOffsetNo0Search result offset for artists. Used for paging.
albumCountNo20Maximum number of albums to return.
albumOffsetNo0Search result offset for albums. Used for paging.
songCountNo20Maximum number of songs to return.
songOffsetNo0Search result offset for songs. Used for paging.
+

+ Returns a <subsonic-response> element with a nested <searchResult2> + element on success. Example. +

+ diff --git a/subsonic-site/src/main/webapp/api-search3.jsp b/subsonic-site/src/main/webapp/api-search3.jsp new file mode 100644 index 00000000..623a65a5 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-search3.jsp @@ -0,0 +1,65 @@ +

search3

+ +

+ http://your-server/rest/search3.view +
Since 1.8.0 +

+ +

+ Similar to search2, but organizes music according to ID3 tags. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterRequiredDefaultComment
queryYesSearch query.
artistCountNo20Maximum number of artists to return.
artistOffsetNo0Search result offset for artists. Used for paging.
albumCountNo20Maximum number of albums to return.
albumOffsetNo0Search result offset for albums. Used for paging.
songCountNo20Maximum number of songs to return.
songOffsetNo0Search result offset for songs. Used for paging.
+

+ Returns a <subsonic-response> element with a nested <searchResult3> + element on success. Example. +

+ diff --git a/subsonic-site/src/main/webapp/api-setRating.jsp b/subsonic-site/src/main/webapp/api-setRating.jsp new file mode 100644 index 00000000..c2fd34ae --- /dev/null +++ b/subsonic-site/src/main/webapp/api-setRating.jsp @@ -0,0 +1,33 @@ +

setRating

+ +

+ http://your-server/rest/setRating.view +
Since 1.6.0 +

+ +

+ Sets the rating for a music file. +

+ + + + + + + + + + + + + + + + + + + +
ParameterRequiredDefaultComment
idYesA string which uniquely identifies the file (song) or folder (album/artist) to rate.
ratingYesThe rating between 1 and 5 (inclusive), or 0 to remove the rating.
+

+ Returns an empty <subsonic-response> element on success. +

diff --git a/subsonic-site/src/main/webapp/api-star.jsp b/subsonic-site/src/main/webapp/api-star.jsp new file mode 100644 index 00000000..a18c9b68 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-star.jsp @@ -0,0 +1,41 @@ +

star

+ +

+ http://your-server/rest/star.view +
Since 1.8.0 +

+ +

+ Attaches a star to a song, album or artist. +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterRequiredDefaultComment
idNoThe ID of the file (song) or folder (album/artist) to star. Multiple parameters allowed.
albumIdNoThe ID of an album to star. Use this rather than id if the client accesses the media collection according to ID3 + tags rather than file structure. Multiple parameters allowed.
artistIdNoThe ID of an artist to star. Use this rather than id if the client accesses the media collection according to ID3 + tags rather than file structure. Multiple parameters allowed.
+

+ Returns an empty <subsonic-response> element on success. +

diff --git a/subsonic-site/src/main/webapp/api-stream.jsp b/subsonic-site/src/main/webapp/api-stream.jsp new file mode 100644 index 00000000..dba598c1 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-stream.jsp @@ -0,0 +1,59 @@ +

stream

+ +

+ http://your-server/rest/stream.view +
Since 1.0.0 +

+ +

+ Streams a given media file. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterRequiredDefaultComment
idYesA string which uniquely identifies the file to stream. Obtained by calls to getMusicDirectory.
maxBitRateNo(Since 1.2.0) If specified, the server will attempt to limit the bitrate + to this value, in kilobits per second. If set to zero, no limit is imposed.
formatNo(Since 1.6.0) Specifies the preferred target format (e.g., "mp3" or "flv") in case there are multiple applicable transcodings.
timeOffsetNoOnly applicable to video streaming. If specified, start streaming at the given offset (in seconds) into the video. + Typically used to implement video skipping.
sizeNo(Since 1.6.0) Only applicable to video streaming. Requested video size specified as WxH, for instance "640x480".
estimateContentLengthNofalse(Since 1.8.0). If set to "true", the Content-Length HTTP header will be set to an estimated value + for transcoded or downsampled media.
+

+ Returns binary data on success, or an XML document on error (in which case the HTTP content type will start with "text/xml"). +

diff --git a/subsonic-site/src/main/webapp/api-unstar.jsp b/subsonic-site/src/main/webapp/api-unstar.jsp new file mode 100644 index 00000000..9644f7b5 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-unstar.jsp @@ -0,0 +1,41 @@ +

unstar

+ +

+ http://your-server/rest/unstar.view +
Since 1.8.0 +

+ +

+ Removes the star from a song, album or artist. +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterRequiredDefaultComment
idNoThe ID of the file (song) or folder (album/artist) to unstar. Multiple parameters allowed.
albumIdNoThe ID of an album to unstar. Use this rather than id if the client accesses the media collection according to ID3 + tags rather than file structure. Multiple parameters allowed.
artistIdNoThe ID of an artist to unstar. Use this rather than id if the client accesses the media collection according to ID3 + tags rather than file structure. Multiple parameters allowed.
+

+ Returns an empty <subsonic-response> element on success. +

diff --git a/subsonic-site/src/main/webapp/api-updatePlaylist.jsp b/subsonic-site/src/main/webapp/api-updatePlaylist.jsp new file mode 100644 index 00000000..e10856b5 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-updatePlaylist.jsp @@ -0,0 +1,64 @@ +

updatePlaylist

+ +

+ http://your-server/rest/updatePlaylist.view +
Since 1.8.0 +

+ +

+ Updates a playlist. Only the owner of a playlist is allowed to update it. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + <%--TODO: Add later--%> + <%----%> + <%----%> + <%----%> + <%----%> + <%----%> + <%----%> + <%----%> + <%----%> + <%----%> + <%----%> + <%----%> + <%----%> + + + + + + + + + + + + +
ParameterRequiredDefaultComment
playlistIdYesThe playlist ID.
nameNoThe human-readable name of the playlist.
commentNoThe playlist comment.
usernameToAddNoAllow this user to listen to this playlist. Multiple parameters allowed.
usernameToRemoveNoDisallow this user to listen to this playlist. Multiple parameters allowed.
songIdToAddNoAdd this song with this ID to the playlist. Multiple parameters allowed.
songIndexToRemoveNoRemove the song at this position in the playlist. Multiple parameters allowed.
+

+ Returns an empty <subsonic-response> element on success. +

diff --git a/subsonic-site/src/main/webapp/api-updateShare.jsp b/subsonic-site/src/main/webapp/api-updateShare.jsp new file mode 100644 index 00000000..8523ef30 --- /dev/null +++ b/subsonic-site/src/main/webapp/api-updateShare.jsp @@ -0,0 +1,37 @@ +

updateShare

+

+ http://your-server/rest/updateShare.view +
Since 1.6.0 +

+

+ Updates the description and/or expiration date for an existing share. +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterRequiredDefaultComment
idYesID of the share to update.
descriptionNoA user-defined description that will be displayed to people visiting the shared media.
expiresNoThe time at which the share expires. Given as milliseconds since 1970, or zero to remove the expiration.
+

+ Returns an empty <subsonic-response> element on success. +

diff --git a/subsonic-site/src/main/webapp/api.jsp b/subsonic-site/src/main/webapp/api.jsp new file mode 100644 index 00000000..ffcbf0dd --- /dev/null +++ b/subsonic-site/src/main/webapp/api.jsp @@ -0,0 +1,425 @@ + + + +<%! String current = "api"; %> +<%@ include file="header.jsp" %> + + + + + +
+<%@ include file="menu.jsp" %> + +
+
+

Subsonic API

+ +

+ The Subsonic API allows anyone to build their own programs using Subsonic as the media server, whether they're + on the web, the desktop or on mobile devices. All the Subsonic apps are built using the + Subsonic API. +

+

+ Feel free to join the Subsonic App Developers group + for discussions, suggestions and questions. +

+ +

Introduction

+ +

+ The Subsonic API allows you to call methods that respond in REST style xml. + Individual methods are detailed below. +

+ +

+ Please note that all methods take the following parameters: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterRequiredDefaultComment
uYesThe username.
pYesThe password, either in clear text or hex-encoded with a "enc:" prefix.
vYesThe protocol version implemented by the client, i.e., the version of the + subsonic-rest-api.xsd schema used (see below).
cYesA unique string identifying the client application.
fNoxmlRequest data to be returned in this format. Supported values are "xml", "json" (since 1.4.0) + and "jsonp" (since 1.6.0). If using jsonp, specify name of javascript callback function using + a callback parameter.
+ +

+ For example: +

+ +

+ http://your-server/rest/getIndexes.view?u=joe&p=sesame&v=1.1.0&c=myapp, or
+ http://your-server/rest/getIndexes.view?u=joe&p=enc:736573616d65&v=1.1.0&c=myapp +

+ +

+ Starting with API version 1.2.0 it is no longer necessary to send the username and password as part of the URL. + Instead, HTTP Basic authentication could be + used. + (Only preemptive authentication is supported, meaning that the credentials should be supplied by the client + without being challenged for it.) +

+ +

+ Note that UTF-8 should be used when sending parameters to API methods. The XML returned + will also be encoded with UTF-8. +

+ +

+ All methods (except those that return binary data) returns XML documents conforming to the + subsonic-rest-api.xsd schema. This schema (as well as example XML documents) can be found + at http://your-server/xsd/ +

+ +

Error handling

+ +

+ If a method fails it will return an error code and message in an <error> element. + In addition, the status attribute of the <subsonic-response> root element + will be set to failed instead of ok. For example: +

+ +
+   <?xml version="1.0" encoding="UTF-8"?>
+   <subsonic-response xmlns="http://subsonic.org/restapi"
+                      status="failed" version="1.1.0">
+       <error code="40" message="Wrong username or password"/>
+   </subsonic-response>
+            
+ +

+ The following error codes are defined: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeDescription
0A generic error.
10Required parameter is missing.
20Incompatible Subsonic REST protocol version. Client must upgrade.
30Incompatible Subsonic REST protocol version. Server must upgrade.
40Wrong username or password.
50User is not authorized for the given operation.
60The trial period for the Subsonic server is over. Please donate to get a license key. Visit subsonic.org for details.
70The requested data was not found.
+ +

Versions

+ +

+ This table shows the REST API version implemented in different Subsonic versions: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Subsonic versionREST API version
4.71.8.0
4.61.7.0
4.51.6.0
4.3.11.5.0
4.21.4.0
4.11.3.0
4.01.2.0
3.91.1.1
3.81.0.0
+

+ Note that a Subsonic server is backward compatible with a REST client if and only if the major version is the same, + and the minor version of the client is less than or equal to the server's. For example, if the server has + REST API version 2.2, it supports client versions 2.0, 2.1 and 2.2, but not versions 1.x, 2.3+ or 3.x. The third + part of the version number is not used to determine compatibility. +

+ +

File structure vs ID3 tags

+ +

+ Starting with version 1.8.0, the API provides methods for accessing the media collection + organized according to ID3 tags, rather than file structure. +

+

+ For instance, browsing through the collection using ID3 tags should use the getArtists, getArtist + and getAlbum methods. + To browse using file structure you would use getIndexes and getMusicDirectory. +

+

+ Correspondingly, there are two sets of methods for searching, starring and album lists. Refer to the method + documentation for details. +

+ +

API method documentation

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
System + ping, + getLicense +
Browsing + getMusicFolders, + getIndexes, + getMusicDirectory, + getArtists, + getArtist, + getAlbum, + getSong, + getVideos +
Album/song lists + getAlbumList, + getAlbumList2, + getRandomSongs, + getNowPlaying, + getStarred, + getStarred2 +
Searching + search, + search2, + search3 +
Playlists + getPlaylists, + getPlaylist, + createPlaylist, + updatePlaylist, + deletePlaylist +
Media retrieval + stream, + download, + getCoverArt, + getLyrics, + getAvatar +
Media annotation + star, + unstar, + setRating, + scrobble +
Sharing + getShares, + createShare, + updateShare, + deleteShare +
Podcast + getPodcasts +
Jukebox + jukeboxControl +
Chat + getChatMessages, + addChatMessage +
User management + getUser, + createUser, + deleteUser, + changePassword +
+ +<%@ include file="api-ping.jsp" %> +<%@ include file="api-getLicense.jsp" %> + +<%@ include file="api-getMusicFolders.jsp" %> +<%@ include file="api-getIndexes.jsp" %> +<%@ include file="api-getMusicDirectory.jsp" %> +<%@ include file="api-getArtists.jsp" %> +<%@ include file="api-getArtist.jsp" %> +<%@ include file="api-getAlbum.jsp" %> +<%@ include file="api-getSong.jsp" %> +<%@ include file="api-getVideos.jsp" %> + +<%@ include file="api-getAlbumList.jsp" %> +<%@ include file="api-getAlbumList2.jsp" %> +<%@ include file="api-getRandomSongs.jsp" %> +<%@ include file="api-getNowPlaying.jsp" %> +<%@ include file="api-getStarred.jsp" %> +<%@ include file="api-getStarred2.jsp" %> + +<%@ include file="api-search.jsp" %> +<%@ include file="api-search2.jsp" %> +<%@ include file="api-search3.jsp" %> + +<%@ include file="api-getPlaylists.jsp" %> +<%@ include file="api-getPlaylist.jsp" %> +<%@ include file="api-createPlaylist.jsp" %> +<%@ include file="api-updatePlaylist.jsp" %> +<%@ include file="api-deletePlaylist.jsp" %> + +<%@ include file="api-stream.jsp" %> +<%@ include file="api-download.jsp" %> +<%@ include file="api-getCoverArt.jsp" %> +<%@ include file="api-getLyrics.jsp" %> +<%@ include file="api-getAvatar.jsp" %> + +<%@ include file="api-star.jsp" %> +<%@ include file="api-unstar.jsp" %> +<%@ include file="api-setRating.jsp" %> +<%@ include file="api-scrobble.jsp" %> + +<%@ include file="api-getShares.jsp" %> +<%@ include file="api-createShare.jsp" %> +<%@ include file="api-updateShare.jsp" %> +<%@ include file="api-deleteShare.jsp" %> + +<%@ include file="api-getPodcasts.jsp" %> + +<%@ include file="api-jukeboxControl.jsp" %> + +<%@ include file="api-getChatMessages.jsp" %> +<%@ include file="api-addChatMessage.jsp" %> + +<%@ include file="api-getUser.jsp" %> +<%@ include file="api-createUser.jsp" %> +<%@ include file="api-deleteUser.jsp" %> +<%@ include file="api-changePassword.jsp" %> + +
+ +
+ + <%@ include file="google-translate.jsp" %> + <%@ include file="donate.jsp" %> + <%@ include file="merchandise.jsp" %> + +
+ +
+
+
+
+<%@ include file="footer.jsp" %> +
+ + + + diff --git a/subsonic-site/src/main/webapp/apps.jsp b/subsonic-site/src/main/webapp/apps.jsp new file mode 100644 index 00000000..92f13119 --- /dev/null +++ b/subsonic-site/src/main/webapp/apps.jsp @@ -0,0 +1,650 @@ +<%@ page import="java.net.URL" %> + + + +<%! String current = "apps"; %> +<%@ include file="header.jsp" %> + + + + + +
+ <%@ include file="menu.jsp" %> + +
+
+

Subsonic Apps

+ +

Check out the steadily growing list of Subsonic apps. These provide fun and alternative ways to + enjoy your media collection - no matter where you are.

+ +

On your phone

+ +
+ + +
+ +

On your device

+ +
+ + +
+ +

On your desktop

+ +
+ + +
+ +

In your browser

+ +
+ +
+ +

+ Please note that most of the apps are made by third-party developers, and are not maintained by + the Subsonic project. Some apps are commercial, while some are available for free. +

+

Also note that after a 30-day trial period you need a license key to use the apps. + You get a license key by giving a donation to the Subsonic project. The license never expires and is + valid for all current and future apps. By donating you also get other benefits; see info box on the + right. +

+

+ Interested in making your own Subsonic app? Check out the API. +

+ +
+ + +
Subsonic for Android
+
+
+

+ Android + Stream music and video from your home computer to your phone. Never sync again! + All your media - anywhere, anytime! +

+

+ Songs are cached for offline playback. Supports mp3, ogg, aac, flac, wma. Most video formats supported too. +

+ +

+ You can also use this app as a remote control for music playing on your server. +

+

+ Features offline mode, adaptive bitrates, equalizer and visualizer. +

+

+ Developed and maintained by Sindre Mehus, the author of Subsonic. Available + on Android Market. +

+ + + + + + +
+
+
+ +
+ + +
iSub for iPhone/iPad
+
+
+

+ App Store + iSub is an iPhone/iPad app developed by Ben Baron, and is + available for purchase on the App Store. +

+ + + + +
    +
  • Full support for creating and managing on-the-go playlists.
  • +
  • Automatic full song caching for the best network performance with no music drop outs.
  • +
  • Manually cache songs (Wifi sync) to listen offline, like on an airplane.
  • +
  • Caching of all browsed directories for speedy browsing.
  • +
  • Retina display support for beautiful album art while browsing and in the player.
  • +
  • Skipping within tracks, even while they are streaming.
  • +
  • Resuming music when interrupted by a call or text or when closing the app using the home button while a song is playing.
  • +
  • Each music folder is a playlist automatically so when you select a track from an album it will continue to play the rest of the tracks in that album.
  • +
  • Shuffle, Repeat 1, and Repeat All when playing an album.
  • +
  • Detailed track information by tapping the cover art.
  • +
  • Jukebox mode to use your device as a remote control for Subsonic for listening to music around the house.
  • +
+

+ Support: support@isubapp.com +

+ + +
+
+
+ +
+ + +
Z-Subsonic for iPhone/iPad
+
+
+

+ App Store + Z-Subsonic is an iPhone/iPad app developed by Olusola Abiodun, and is + available for purchase on the App Store. +

+ + + + +
    +
  • Access your entire music library from anywhere on your iPhone or iPod regardless of the size of your music collection.
  • +
  • Play song formats that the iPhone/iPod will not normally play e.g. wma, flac, ogg.
  • +
  • Caches all queued songs as quickly as possible once Wi-fi connection is detected.
  • +
  • Browse and manage cached songs by artist/album. Delete entire artist/album from cache at once.
  • +
  • Delete or change song priority on the Now Playing list while songs are playing.
  • +
  • Double buffering: upcoming song starts to download before the currently playing song finishes.
  • +
  • Seeking for fully cached songs.
  • +
  • Load playlists stored on the Subsonic server.
  • +
  • Multiple server configuration.
  • +
  • Random playlist generation using entire song collection.
  • +
  • Repeat/shuffle/skip songs.
  • +
  • SSL support with prompt to authorize self-signed certificates.
  • +
  • Full caching. Z-Subsonic can be used fully disconnected with previously streamed music.
  • +
  • Favorites. +
+ +

+ See the video on YouTube. +

+ +

+ Support: helpdesk@z-subsonic.com – + Forum: http://z-subsonic.com/z-subsonic-forum +

+ + + +
+
+
+ +
+ + +
SubStream for iPhone/iPad
+
+
+

+ App Store + SubStream is an iPhone/iPad app developed by Figment Inc., and is + available free of charge on the App Store. +

+ + + + + + +
+
+
+ +
+ + +
Hypersonic for iPhone/iPad
+
+
+

+ App Store + Hypersonic is a media player built to stream music live from a Subsonic server. + With Last.fm scrobbling, high quality mode, and support to specify a local server, you can always keep your full music collection with you. +

+

+ Hypersonic is developed by Josh Betz and sells for $0.99 on App Store. +

+ + + + + + + +
+
+
+ +
+ + +
Subsonic for Windows Phone
+
+
+

+ Windows Marketplace + Subsonic Music Streamer is a Windows Phone 7 app developed by Anton Van Zuylen, and is + available for purchase in the Windows Marketplace. +

+ + + + +
    +
  • Always have access to your entire music collection without the need for any third party server or subscription.
  • +
  • Supports all popular formats (WMA, FLAC, MP3, AAC, OCG etc).
  • +
  • Keep listening when you have no cellular coverage due to full local storage including cover art, lyrics and info.
  • +
  • Manage your local stored music in a convenient way.
  • +
  • Control the quality of the music by controlling the streaming bit-rate.
  • +
  • Create playlists on the device which can contain songs from different servers simultaneously.
  • +
  • Add easily your newest music, your recently played albums, or your frequently played albums.
  • +
  • Add random albums.
  • +
  • Full search support.
  • +
  • Keep playing behind locked screen.
  • +
  • Full integration with the Music and Video hub.
  • +
  • Automatic storage management of local stored songs.
  • +
  • Allowing to lock specific local songs.
  • +
+ +

+ This application focuses on fast and easy handling with two main pages: + "Now playing" where you see and control all what is currently playing including cover art and lyrics; and + "Add to now playing" providing different methods for adding albums and songs to your playlist. + Start the application and the music is playing (just one click)! +

+

+ Support: anton@avzuylen.com +

+

Go get it on the Windows Phone Marketplace!

+ +
+
+
+ +
+ + +
SubAir
+
+
+

+ Adobe AIR + SubAir is a rich desktop application for Subsonic implemented with Adobe© AIR. + Works with Windows, Mac and Linux. +

+ +

+ Developed and maintained by Jim Resnowski, and + provided free or charge. +

+
+
+
+ +
+ + +
SonicAir
+
+
+

+ BlackBerry + SonicAir is a Subsonic app for the BlackBerry PlayBook. Play all sorts of video and audio, even high definition 720P MKV files. +

+ + + +
    +
  • Listen to music and watch videos.
  • +
  • Control bitrate.
  • +
  • Cache lists for offline use.
  • +
  • Create and play playlists.
  • +
  • Use quick list feature to create on-the-go playlists.
  • +
  • Download songs for offline use later.
  • +
+

+ Developed and maintained by Mir & Windsor Design, it's sold for $2.99 + on BlackBerry App World. +

+
+
+
+ + +
+ + +
Subsonos
+
+
+

+ Subsonos allows Subsonic users to enjoy their entire collection by streaming over a Sonos music system. +

+ + + +

+ Subsonos is a translation service (or proxy) that sits between your Sonos music system and your Subsonic streaming server. + Developed by NerdyHearn, Subsonos is currently in beta. +

+
+
+
+ +
+ + +
Subsonic for Chumby
+
+
+

+ Chumby + Introducing the Subsonic app for Chumby-powered devices. +

+ + + +
    +
  • Easy to use touchscreen tabletop experience for the Subsonic server.
  • +
  • Inviting home screen randomly cycles through your music collection.
  • +
  • Full alphabetical directory browsing and integrated soft keyboard for search.
  • +
  • Play "DJ" and add albums and songs to the internal playlist while listening.
  • +
  • Quick functions like "show 30 random albums", "play 50 random songs", etc.
  • +
  • Simple and responsive navigation system.
  • +
  • Runs on most Chumby-powered devices.
  • +
  • Long-term development road map.
  • +
+ +

+ Subsonic for Chumby is provided free of charge by develephant. +

+
+
+
+ +
+ + +
SubsonicTV
+
+
+

+ SubsonicTV for Roku is the perfect solution for enjoying your music & video collection on your TV. + No need to go through the hassle of uploading to the cloud and syncing your files. +

+ + + +

+ Developed by JNC Ventures and Musiclouds, it's available both as a free lite version and a paid premium version. +

+
+
+
+ +
+ + +
Subsonic Channel
+
+
+

+ Subsonic Channel is an open-source Roku frontend to Subsonic. +

+ + + +
    +
  • Browse your entire catalog.
  • +
  • Search for artists, albums, songs.
  • +
  • Full catalog shuffle playback.
  • +
  • Quick browse of Subsonic album lists (Random, Recent, Top Rated, etc.)
  • +
+ +

+ Subsonic Channel is developed by Michael Ihde and is donation-supported. +

+
+
+
+ +
+ + +
XO
+
+
+ + +

+ XO is a Subsonic app for webOS. +

+ +

+ Stream any music directly to your TouchPad, Pre, Pixi, or Veer. Built-in HTML5 streaming media support and player, with support for file download + and drag-and-drop playlists. XO makes streaming your music from home to wherever you are simple and fun! +

+ +

+ It is also available for BlackBerry PlayBook. +

+

+ XO is developed by Eric Blade. +

+
+
+
+ +
+ + +
Submariner
+
+
+

+ Submariner is a Subsonic desktop application for Mac. +

+ + +

+ It provides a clean user interface to manage your remote libraries and to listen your music with simplicity. + With the cache streaming and download features, you can also listen to your favorite tracks offline. +

+

+ Submariner +

+
+
+
+ +
+ + +
Thumper
+
+
+

+ Thumper is a native Subsonic client for Mac. +

+ + +
    +
  • A Native Mac Application - designed on the Mac, for the Mac.
  • +
  • Local Caching of Library Information, Audio, and Album Art - reduce bandwidth and get a more responsive experience.
  • +
  • Browse Artists, Albums, and Songs.
  • +
  • Quick Artist Filter - quickly narrow your results.
  • +
  • Playlists - play, create, and delete Subsonic playlists.
  • +
  • Search - find the song you're looking for quickly.
  • +
  • Current Playlist Persistence - pickup right where you left off, even after a reboot.
  • +
  • Mac Media Key Integration - previous, play/pause, and next key support.
  • +
  • Keyboard Shortcuts - control volume, repeat, shuffle, etc. through keyboard shortcuts.
  • +
  • Last.fm Integration - songs are scrobbled as they're played.
  • +
  • Playback via QuickTime - if QuickTime can play it, so can Thumper.
  • +
  • View Random, Newest, Highest Rated, Most Frequent, and Recently Played Albums.
  • +
  • Smart Playlist Creation - get random songs narrowed by genre or year.
  • +
  • Now Playing Support - See what other users are listening to.
  • +
  • Transcoding (including FLAC) support with Subsonic 4.6 or greater.
  • +
  • Video streaming (requires proper codec to be installed, see FAQ).
  • +
+

+ Requires Mac OS X 10.7 or greater. +

+

+ Thumper +

+
+
+
+ +
+ + +
SubGadget
+
+
+

+ Windows 7 + SubGadget is a Windows Sidebar Gadget for Subsonic. Works with Windows 7 and Vista. +

+ +

+ Developed and maintained by Scott Mark, and provided free or charge. +

+
+
+
+ +
+ + +
Periscope Player
+
+
+

+ Windows 7 + Periscope Player is a Windows desktop application for Subsonic. +

+ +

+ Developed and maintained by Matt Campanile. + Available as Lite and Pro versions. Lite is completely free and is a fully functional player. Pro adds some advanced features and is $4.99. +

+
+
+
+ +
+ + +
SubWiji
+
+
+

+ SubWiji is a Windows desktop application for Subsonic. +

+ + +

Supports docking, auto-hiding, keyboard shortcuts, now playing popup, album grid viewer and much more.

+

SubWiji is made by Paul O'Dell. Free of charge, but accepts donations.

+
+
+
+ +
+ + +
Subclient
+
+
+

+ Subclient is Java desktop client for Subsonic. +

+ + +
    +
  • MPlayer-based media playback.
  • +
  • Tray icon and media keys supported.
  • +
  • Multiple Subsonic servers can be used.
  • +
  • The playlist is saved between sessions.
  • +
  • Indexes, Podcasts and Playlists fetched from Subsonic server.
  • +
  • Cover arts stored locally to improve performance.
  • +
+

Subclient is made by Alejandro Celaya Alastrué and is free of charge.

+
+
+
+ +
+ + +
Perisonic
+
+
+

+ Perisonic is a simple + Chrome app for playing random music from Subsonic. +

+ +

+ Perisonic is developed by Robin Bakker and is + available free of charge. +

+
+
+
+ +
+ +
+ <%@ include file="google-translate.jsp" %> + <%@ include file="donate.jsp" %> +
+ +
+
+
+
+ <%@ include file="footer.jsp" %> +
+ + + diff --git a/subsonic-site/src/main/webapp/banner.jsp b/subsonic-site/src/main/webapp/banner.jsp new file mode 100644 index 00000000..bf371d93 --- /dev/null +++ b/subsonic-site/src/main/webapp/banner.jsp @@ -0,0 +1,103 @@ + + +
+ +
\ No newline at end of file diff --git a/subsonic-site/src/main/webapp/changelog.jsp b/subsonic-site/src/main/webapp/changelog.jsp new file mode 100644 index 00000000..af6d22ad --- /dev/null +++ b/subsonic-site/src/main/webapp/changelog.jsp @@ -0,0 +1,1011 @@ + + + +<%! String current = "changelog"; %> +<%@ include file="header.jsp" %> + + + + + +
+<%@ include file="menu.jsp" %> + +
+
+

Subsonic Change Log

+ +

Subsonic 4.7.beta2 - Jun 08, 2012

+
    +
  • New: Playlist import/export.
  • +
  • New: Sort albums by year.
  • +
  • New: Show album year.
  • +
  • New: Added Czech translation, courtesy of Robert Ilyk.
  • +
  • New: Better error message if file or playlist not found.
  • +
  • Bugfix: Handle media files without any tags.
  • +
  • Bugfix: Display directory name rather than album name.
  • +
  • Bugfix: Fixed genre search problem.
  • +
+ +

Subsonic 4.7.beta1 - May 12, 2012

+
    +
  • New: Major rewrite of the Subsonic core. It now uses less memory and is significantly faster.
  • +
  • New: "Star" support for managing your favorite artists, albums and songs.
  • +
  • New: Much improved playlist support: private/shared playlists, improved user interface.
  • +
  • New: Added option Settings > Media folders > Fast access mode which additionally improves performance for network disks.
  • +
  • New: Show media folder scanning status.
  • +
  • New: New albums lists: Starred and All.
  • +
  • New: Use ffmpeg rather than lame for downsampling.
  • +
  • New: Added Polish translation, courtesy of Michał Kotas
  • +
  • New: Added Catalan translation, courtesy of Josep Santaló.
  • +
  • New: Added Estonian translation, courtesy of Olav Mägi.
  • +
  • New: Updated Dutch translation, courtesy of W. van der Heijden.
  • +
  • New: Updated Swedish translation, courtesy of Fritte Jensen.
  • +
  • New: Updated Catalan translation, courtesy of Josep Santalo.
  • +
  • New: Added option to reset and email forgotten password or username.
  • +
  • New: Make it configurable to run as a different user than root in Linux RPM.
  • +
  • New: Display warning if running as root user.
  • +
  • New: Avoid false alarms from Windows virus scanners.
  • +
  • Bugfix: Fixed problem with players being associated to wrong users.
  • +
  • Bugfix: Serve generic cover art if failing to scale original.
  • +
  • REST: Full support for accessing the media collection organized according to ID3 tags, rather than file structure.
  • +
  • REST: Added starring and playlist management.
  • +
  • REST: Added disc number, creation date and media type.
  • +
  • REST: Suppress content length estimation by default. Added "estimateContentLength" parameter to stream method.
  • +
  • REST: Added getAvatar method.
  • +
  • REST: Added "shareRole" to createUser
  • +
  • REST: Fixed some JSON conversion problems ("JSON does not allow non-finite numbers")
  • +
  • REST: Fixed a problem with the "u" and "p" parameters sometimes not being used if the JSESSIONID cookie is present.
  • +
  • REST: Stream method now supports HEAD requests.
  • +
  • REST: Use shorter IDs.
  • +
  • Tech: Use port 4040 by default for new Windows installs.
  • +
+ +

Subsonic 4.6 - Dec 06, 2011

+
    +
  • New: Added option to resend license key.
  • +
  • New: Added AIFF support.
  • +
+ +

Subsonic 4.6.beta2 - Nov 17, 2011

+
    +
  • New: Added option in Settings > Transcoding: "Enable this transcoding for all existing and new players."
  • +
  • New: Updated Slovenian translation, courtesy of Jan Jamšek.
  • +
  • New: Added Google+ button.
  • +
  • New: Automatically delete obsolete players on startup.
  • +
  • Bugfix: Jukebox now support skipping when paused.
  • +
  • Bugfix: Fixed a case where guessing the title and track number failed.
  • +
  • Bugfix: Don't estimate content-length for web players.
  • +
  • Bugfix: Album search links missing if subdirectory exists.
  • +
  • Bugfix: Fixed broken Google search link.
  • +
  • Bugfix: Remove link to lyrics. chartlyrics.com no longer exists.
  • +
  • REST: Ensure that jukebox "set" method maintains correct current index.
  • +
  • REST: Added "scrobblingEnabled" to getUser.
  • +
  • Tech: Ensure Windows uninstaller only removes program files (in case user installs to c:\subsonic).
  • +
  • Tech: Subsonic Control Panel now prompts for elevated permissions when necessary.
  • +
+ +

Subsonic 4.6.beta1 - Nov 1, 2011

+
    +
  • New: Simplified and improved transcoding framework.
  • +
  • New: Improved video quality with H.264 encoding.
  • +
  • New: Reimplemented jukebox. More robust and new features.
  • +
  • New: Share on Google+.
  • +
  • New: Estimate content-length for transcoded audio.
  • +
  • New: Updated Dutch translation, courtesy of Muiz.
  • +
  • New: Updated German translation, courtesy of deejay.
  • +
  • New: Added BUUF theme, courtesy of Fractal Systems.
  • +
  • New: Added UK English translation, courtesy of Brian Aust.
  • +
  • New: Hide dock icon on Mac.
  • +
  • Bugfix: Menu broken in "Settings > Shared media" when logged in as admin.
  • +
  • Tech: Improved security in Linux packages.
  • +
  • Tech: Stronger license check.
  • +
  • Tech: Use UTF-8 when reading playlist files.
  • +
  • API: Include files in root folders.
  • +
  • API: New jukebox features.
  • +
+ +

Subsonic 4.5 - Aug 6, 2011

+
    +
  • New: Updated Korean translation, courtesy of Rhetor Choi.
  • +
  • New: Updated Danish translation, courtesy of Morten Hartvich.
  • +
  • Bugfix: Clear rating now works again.
  • +
  • Bugfix: Misc fixes to share settings page.
  • +
  • Bugfix: Revert back to running as root in Debian/Ubuntu.
  • +
  • API: JSONP support
  • +
+ +

Subsonic 4.5.beta2 - Jul 28, 2011

+
    +
  • New: Implemented management of shared media (expiration, removal, statistics, description).
  • +
  • New: Added more actions for selected songs in album view (Download, Add to playlist).
  • +
  • New: Added more actions for selected songs in playlist view (Share).
  • +
  • New: Subsonic service no longer running as root on Debian/Ubuntu
  • +
  • API: Added share management methods.
  • +
  • API: Added rating support.
  • +
  • Bugfix: Use guest user when streaming shared media.
  • +
  • Bugfix: Use UTF-8 in search index file.
  • +
+ +

Subsonic 4.5.beta1 - Jun 12, 2011

+
    +
  • New: Twitter/Facebook integration.
  • +
  • New: Share songs and videos by sending someone a link.
  • +
  • New: Support video in external player.
  • +
  • New: Support higher video bitrates, 3000 and 5000 kbps.
  • +
  • New: Added Bulgarian translation, courtesy of Ivan Achev.
  • +
  • New: Updated Norwegian translation, courtesy of Tommy Karlsen.
  • +
  • New: Updated German translation, courtesy of deejay2302.
  • +
  • New: Support http header "Content-Range" when streaming.
  • +
  • New: Ignore "@eaDir" folders on Synology devices.
  • +
  • API: Added REST method getPodcasts.
  • +
  • API: Added REST method getShareUrl.
  • +
  • API: Added user email to REST API.
  • +
  • API: Added example XMLs to API documentation.
  • +
  • API: Encoded passwords were not decoded correctly in REST methods createUser and changePassword.
  • +
  • API: Added "format" and "size" parameters to REST method stream.
  • +
  • Bugfix: Don't include podcasts when generating random songs.
  • +
  • Bugfix: Handle whitespace in podcast urls.
  • +
  • Bugfix: Updated expired ssl cert.
  • +
  • Bugfix: Mac installer: make transcode dir executable.
  • +
+ +

Subsonic 4.4 - Feb 06, 2011

+
    +
  • New: Updated Greek translation, courtesy of Constantine Samaklis.
  • +
  • New: Updated Slovenian translation, courtesy of Jan Jamšek and Marko Kastelic.
  • +
+ +

Subsonic 4.4.beta1 - Jan 20, 2011

+
    +
  • New: Added https support.
  • +
  • New: Added option to open video in resizable window.
  • +
  • New: Improved search with accented characters (e.g., searching for "bartok" will match "bartók").
  • +
  • New: Added REST API method for scrobbling to last.fm.
  • +
  • New: Added Greek translation, courtesy of Constantine Samaklis.
  • +
  • Bugfix: When converting videos, always use a width that is a multiple of two.
  • +
  • Bugfix: Handle invalid pixel aspect rates (PAR) reported by ffmpeg.
  • +
  • Bugfix: Don't scrobble videos to last.fm.
  • +
  • Bugfix: Remember port number and memory settings when reinstalling on Windows.
  • +
  • Bugfix: Accessing "Newest" album list from Android sometimes caused an error.
  • +
+ +

Subsonic 4.3 - Jan 7, 2011

+
    +
  • Bugfix: When switching bit rate, also jump to correct time offset.
  • +
  • Bugfix: Fixed problem with audio getting out-of-sync with video.
  • +
  • Bugfix: When converting videos, always use a width that is a multiple of two.
  • +
  • Bugfix: Fixed bug in REST method createPlaylist.
  • +
  • Bugfix: Use language settings in /etc/default/locale on Ubuntu/Debian.
  • +
+ +

Subsonic 4.3.beta1 - Dec 30, 2010

+
    +
  • New: Video support! Stream video to browsers and Android 2.2+ phones.
  • +
  • New: Added Korean translation, courtesy of Choi Jong-seok.
  • +
  • New: Updated French translation, courtesy of Yoann Spicher.
  • +
+ +

Subsonic 4.2 - Nov 21, 2010

+
    +
  • New: Added Portuguese translation, courtesy of Miguel Fonseca.
  • +
  • New: Updated Italian translation, courtesy of Luca Perri.
  • +
  • Bugfix: Improved searching.
  • +
  • Bugfix: Set ID3 tags when transcoding.
  • +
  • Bugfix: Fixed problem with transcoding/downsampling failing for files with non-Latin characters.
  • +
  • Bugfix: Handle transcoding/downsampling files with double quotes in filename.
  • +
  • Bugfix: Remove html markup from podcast descriptions.
  • +
  • Bugfix: Fix broken link to allmusic.
  • +
+ +

Subsonic 4.2.beta1 - Nov 4, 2010

+
    +
  • New: New & improved search engine based on Lucene.
  • +
  • New: New & improved cover art search based on Google Image Search.
  • +
  • New: Mac installer now includes transcoders, courtesy of einstein2x.
  • +
  • New: Updated German translation, courtesy of deejay2302.
  • +
  • New: Improved LAME integration (preserve ID3 tags, avoid skipping in Android client).
  • +
  • New: Added new REST API method for searching.
  • +
  • Bugfix: Fixed bug in startup script in standalone Subsonic (readlink).
  • +
+ +

Subsonic 4.1 - Sep 10, 2010

+
    +
  • New: Updated Danish translation, courtesy of Morten Hartvich.
  • +
  • Bugfix: Exclude dot files in cover art search.
  • +
+ +

Subsonic 4.1.beta1 - Aug 21, 2010

+
    +
  • New: Support automatic port forwarding on Airport Extreme/Express.
  • +
  • New: Improved tray/application/fav icons.
  • +
  • New: New and updated themes.
  • +
  • New: Improved Mac control panel.
  • +
  • New: Added REST API methods getUser and deleteUser.
  • +
  • New: Added Traditional Chinese translation, courtesy of Cheng Jen Li.
  • +
  • New: Updated French translation, courtesy of Christophe.
  • +
  • Bugfix: Fixed chat feature when deploying Subsonic on Tomcat.
  • +
  • Bugfix: Proper lookup of local IP on Linux.
  • +
  • Bugfix: Support html5 (return correct content type and length).
  • +
  • Performance: Faster coverart lookup.
  • +
  • Tech: Upgraded to LAME 3.98.4.
  • +
+ +

Subsonic 4.0.1 - May 13, 2010

+
    +
  • Bugfix: Fixed broken cover art download.
  • +
  • Bugfix: Fixed broken m4a transcoding.
  • +
  • Bugfix: Fixed broken quick links in artist frame for some new themes.
  • +
+ +

Subsonic 4.0 - May 12, 2010

+
    +
  • New: Added REST API method for deleting playlists.
  • +
  • Bugfix: Use UTF-8 encoding when creating M3U playlists.
  • +
  • Security: Network and cover art settings require admin role.
  • +
+ +

Subsonic 4.0.beta2 - May 05, 2010

+
    +
  • New: Added themes Slick, High Contrast, High Contrast (Inverted) and High-Tech, courtesy of Fisher Evans.
  • +
  • New: Added themes Simplify, PinkPanther and Denim, courtesy of Thomas Bruce Dyrud.
  • +
  • New: Updated Danish translation, courtesy of Morten Hartvich.
  • +
  • Bugfix: User statistics for streamed data was too high.
  • +
  • Bugfix: Proper ordering songs on multi-disc albums.
  • +
  • Bugfix: Read tags from AAC files.
  • +
  • Bugfix: Fixed errors with chat feature.
  • +
  • Bugfix: More robust tag parsing and editing.
  • +
  • Bugfix: Removed "Settings > General > Video mask" that was added by mistake.
  • +
+ +

Subsonic 4.0.beta1 - Apr 23, 2010

+
    +
  • New: New version of the Subsonic API with many new methods to be used by Subsonic apps.
  • +
  • New: New, simpler transcoder pack with ffmpeg and lame.
  • +
  • New: Improved usability of Settings > Network.
  • +
  • New: Added option to clear chat messages.
  • +
  • New: Added Monochrome themes, courtesy of David D.
  • +
  • New: Added Groove themes, courtesy of Thomas Bruce Dyrud.
  • +
  • New: Updated German translation, courtesy of deejay2302.
  • +
  • New: Updated Finnish translation, courtesy of Reijo Jäärni.
  • +
  • New: Updated Slovenian translation, courtesy of Andrej Žižmond.
  • +
  • New: Made user statistics graphs logarithmic.
  • +
  • New: Truncate long genre names in "More" page.
  • +
  • New: Improved year selection in "More" page.
  • +
  • New: Automatically exclude all hidden files and directories (those starting with ".")
  • +
  • Bugfix: Fixed native playback of AAC in Flash player.
  • +
  • Bugfix: Make Flash player work on Linux.
  • +
  • Bugfix: Fixed bug in coverart batch.
  • +
  • Bugfix: Fixed album link to last.fm.
  • +
  • Bugfix: Improved stability of lyrics lookup.
  • +
  • Tech: Replaced tag library with Jaudiotagger.
  • +
  • Tech: Compress html pages with gzip.
  • +
  • Tech: Changed default Java memory limit to 100 MB.
  • +
+ +

Subsonic 3.9 - Feb 12, 2010

+
    +
  • New: Added link to SubAir in "More" page.
  • +
  • New: Make yourname.subsonic.org addresses also work within LANs.
  • +
  • Bugfix: Don't look for UPnP routers if port forwarding is disabled.
  • +
+ +

Subsonic 3.9.beta1 - Jan 28, 2010

+
    +
  • New: Automatically configure port forwarding for compatible routers.
  • +
  • New: Access your server using an easy-to-remember address: yourname.subsonic.org
  • +
  • New: Added "Getting started" page for basic setup.
  • +
  • New: Cover art batch download, courtesy of Christian Nedregård.
  • +
  • New: Improved relevance for top hits in cover art search, courtesy of Christian Nedregård.
  • +
  • New: Added Polish translation, courtesy of Michał Kotas
  • +
  • New: Added Icelandic translation, courtesy of DJ Danni.
  • +
  • New: Updated Finnish translation, courtesy of Reijo Jäärni.
  • +
  • New: Updated Russian translation, courtesy of Anton Khoruzhy.
  • +
  • New: Reversed order of chat log, showing newest messages first.
  • +
  • New: Added API method to change password.
  • +
  • New: Discontinued Subsonic JME client.
  • +
  • Bugfix: Avoid setting incorrect content length when transcoding or downsampling.
  • +
  • Bugfix: Fixed lyrics lookup. Now uses chartlyrics.com which provides a stable API.
  • +
  • Bugfix: Fixed "Not in GZIP format" error in Discogs cover image search, courtesy of Christian Nedregård.
  • +
  • Bugfix: Sort list of saved playlists.
  • +
  • Bugfix: Home > Newest now sorts by creation date, not modification date.
  • +
  • Bugfix: Hide donate button when license is valid.
  • +
+ +

Subsonic 3.8 - Oct 23, 2009

+
    +
  • New: (Android) Downloaded songs can now be played directly from the Subsonic app.
  • +
  • New: (Android) New feature: Download + Play.
  • +
  • New: (Android) New feature: Search.
  • +
  • New: (Android) New feature: Load playlist.
  • +
  • New: (Android) New feature: Delete from phone.
  • +
  • New: (Android) New feature: Check for software update.
  • +
  • New: (Android) Nicer song listing.
  • +
  • New: (Android) More informative error message when not connected.
  • +
  • New: (Android) Show artist shortcuts.
  • +
  • New: Added option to disable chat messages.
  • +
  • New: Delete chat entries more than seven days old.
  • +
  • New: Documented error codes in REST API.
  • +
  • New: Updated Swedish translation, courtesy of Fritte.
  • +
  • New: Updated German translation, courtesy of deejay2302 and Radon.
  • +
  • Bugfix: Fixed wrong background color in More page.
  • +
+ +

Subsonic 3.8.beta1 - Oct 02, 2009

+
    +
  • New: Implemented Subsonic client for Android phones.
  • +
  • New: Added chat.
  • +
  • New: Added REST API for third party applications.
  • +
  • New: Support playlist repeat in web player.
  • +
  • New: Jukebox now support WAV format (including FLAC > WAV transcoding).
  • +
  • New: Updated to Last.fm submission protocol version 1.2.1, with support for "Now playing".
  • +
  • New: Updated Dutch translation, courtesy of Sander van der Grind and Jeremy Terpstra.
  • +
  • New: Updated Slovenian translation, courtesy of Andrej Žižmond
  • +
  • New: Improved French translation, courtesy of Raphaël Boulcourt.
  • +
  • New: Improved German translation, courtesy of 3R3.
  • +
  • New: Added Finnish translation, courtesy of Reijo Jäärni
  • +
  • Bugfix: Subsonic server doesn't require an internet connection during startup.
  • +
  • Bugfix: Avoid problems when upgrading stand-alone version.
  • +
  • Bugfix: Repeat now works properly in jukebox mode.
  • +
  • Bugfix: Looks nicer in Chrome.
  • +
  • Bugfix: Usernames can now contain white spaces and international characters.
  • +
  • Bugfix: Allow alternate date format in Podcast episodes.
  • +
  • Bugfix: Fixed broken Discogs image search.
  • +
  • Security: IP addresses are no longer displayed in the log or the status view.
  • +
+ +

Subsonic 3.7 - Jun 22, 2009

+
    +
  • New: Default search option is now to search both title, album and artist.
  • +
  • New: Customizable default music, playlist and podcast folders in support of Amahi Home Server.
  • +
  • New: Added configurable message in login page.
  • +
  • Bugfix: Fixed broken WAR version.
  • +
  • Bugfix: Fixed broken tag editor.
  • +
  • Bugfix: Fixed broken upload progress bar.
  • +
  • Bugfix: Automatically start web player when clicking play on artist, album or song.
  • +
  • Bugfix: Fixed problem with "Random album" page being initially empty.
  • +
  • Bugfix: Added some padding above player toolbar.
  • +
  • Bugfix: Playlist combobox option disabling broken in IE8.
  • +
  • Security: Don't show full file paths in "Status" and "Help" pages.
  • +
+ +

Subsonic 3.7.beta1 - May 08, 2009

+
    +
  • New: Jukebox support. Plays music directly on the server's audio hardware.
  • +
  • New: Improved search feature. (Paging, album/artist search fields.)
  • +
  • New: Added buttons for next/previous track in web player.
  • +
  • New: Support for artist-level comments.
  • +
  • New: Added new authorization role "User is allowed to change settings and password" in support for guest users.
  • +
  • New: Added theme "Cool and Clean", courtesy of Dan Eriksen.
  • +
  • New: Added theme "Midnight Fun", courtesy of Don Pearson.
  • +
  • New: Added Slovenian translation, courtesy of Andrej Žižmond.
  • +
  • New: Added Danish translation, courtesy of Morten Hartvich
  • +
  • New: Added Japanese translation, courtesy of Takahiro Suzuki.
  • +
  • New: Updated Norwegian translation, courtesy of jigsaw.
  • +
  • New: Updated Swedish translation, courtesy of Fredrik Leufkens.
  • +
  • New: Show online help as balloon tooltip.
  • +
  • New: Player is always visible in playlist, even when scrolling.
  • +
  • New: Removed frame borders.
  • +
  • New: Don't show player username or IP address in playlist.
  • +
  • New: Automatically trim text fields when entering email address and license key.
  • +
  • New: Added advanced option to bind Subsonic to a particular IP address. (More)
  • +
  • New: Improved subsonic.sh startup script.
  • +
  • New: Automatically add Windows Firewall exceptions during install. (More)
  • +
  • Performance: Improved browser and server caching of artist list. (More)
  • +
  • Performance: Only poll for service status if Subsonic Control Panel is opened. (More)
  • +
  • Bugfix: Web player now displays correct duration for transcoded tracks.
  • +
  • Bugfix: Sticky artist index now works in IE.
  • +
  • Bugfix: Discogs image retrieval now works again.
  • +
  • Bugfix: Now works behind SSL proxy. (More)
  • +
  • Bugfix: Missing album art for artists in multiple folders. (More)
  • +
  • Bugfix: Wrong player selected if different users access Subsonic from the same browser instance.
  • +
  • Bugfix: Wrong repeat state displayed in playlist.
  • +
  • Bugfix: Stop web player when playlist is cleared.
  • +
  • Bugfix: Lyrics lookup working again.
  • +
  • Bugfix: Support quotes in Podcast names. (More)
  • +
  • Bugfix: Fixed IE layout problem in top frame.
  • +
+ +

Subsonic 3.6 - Feb 01, 2009

+
    +
  • Security: For improved security, only transcoders installed in SUBSONIC_HOME/transcode are allowed to be executed. This includes LAME downsampling.
  • +
  • New: Added Swedish translation by Jörgen Sjöberg.
  • +
  • New: Added two new locales, "English (United States)" and "English (United Kingdom)". The only difference currently is the date format.
  • +
  • New: Change tray icon if Subsonic server isn't running.
  • +
  • Bugfix: Make new Flash player work if Subsonic is behind proxy.
  • +
  • Bugfix: Fixed problem where server in some cases came to a state where streaming is refused.
  • +
  • Bugfix: Support download and streaming of files larger than 2 GB.
  • +
  • Bugfix: Use UTF-8 when generating m3u playlist.
  • +
  • Bugfix: Main frame now correctly switches to the currently playing album.
  • +
  • Bugfix: Show currently playing icon for all player types.
  • +
+ +

Subsonic 3.6.beta2 - Jan 13, 2009

+
    +
  • New: Updated French translation. (Thanks to sheridan).
  • +
  • New: Improved subsonic.sh startup script.
  • +
  • Bugfix: New Flash player now works in Linux browsers. (Thanks to zeekay).
  • +
  • Bugfix: Fixed bug introduced in 3.6.beta1 causing streams to be killed repeatedly.
  • +
  • Bugfix: Show proper error message if user is not authorized to perform an operation.
  • +
  • Bugfix: Removing welcome title/subtitle/message doesn't work.
  • +
  • Bugfix: Welcome message too wide in IE.
  • +
  • Bugfix: Flash player doesn't work with Italian locale.
  • +
  • Bugfix: Disable "Play more random songs when end of playlist is reached" if Flash player.
  • +
  • Tech: Embedded player now requires Flash plugin 9.0.0 or later, not 9.0.115 or later.
  • +
+ +

Subsonic 3.6.beta1 - Jan 05, 2009

+
    +
  • New: Much improved embedded Flash player.
  • +
  • New: Playlist is now Ajax-enabled, for a smoother user experience.
  • +
  • New: Configurable Welcome title, subtitle and message in home page. Uses wiki notation.
  • +
  • New: Fade-in effect for cover art images.
  • +
  • New: Option to append selected tracks to previously saved playlist.
  • +
  • New: Random play on artist/album level.
  • +
  • New: New agent/service architecture. Tray icon should now (finally) work on Vista.
  • +
  • New: From the Subsonic Control Panel you can now see the Windows service status, and start/stop the Subsonic service.
  • +
  • New: Display "Now playing" for up to an hour, including idle time.
  • +
  • New: Enable transcoders on first-time Windows install (since they are now bundled).
  • +
  • New: Added Cancel buttons to all settings pages.
  • +
  • New: Created subsonic.bat
  • +
  • New: Changed license to GPLv3.
  • +
  • New: Hide music library statistics if unavailable.
  • +
  • Bugfix: Fixed broken lyrics lookup (again).
  • +
  • Bugfix: Avoid ugly line breaks in IE.
  • +
  • Tech: Java 6 or later is now required for Windows installer version.
  • +
+ +

Subsonic 3.5 - Nov 09, 2008

+
    +
  • New: New Subsonic logo (thanks to Concept211).
  • +
  • New: Added Italian translation (thanks to Michele Petrecca). +
  • New: Smooth scrolling in jump list.
  • +
  • New: Updated AAC decoder (faad.exe) in transcoder pack.
  • +
  • New: Added OS to about page.
  • +
  • New: Changed license to Creative Commons Noncommercial.
  • +
  • Bugfix: Added start menu item "Settings" as work-around for missing tray icon in Vista.
  • +
  • Bugfix: Fixed caching problem in Opera. (More)
  • +
  • Bugfix: Improved Windows installer. (More)
  • +
  • Bugfix: Fixed typos in several translations.
  • +
+ +

Subsonic 3.5.beta2 - Sep 23, 2008

+
    +
  • New: Fancy cover art zoom.
  • +
  • New: Remove artist name from album name.
  • +
  • New: Transcoding pack is now included in Windows installer.
  • +
  • New: Updated German translation (thanks to Jörg Frommann) and Norwegian translation + (thanks to jigsaw). +
  • +
  • New: Added French translation (thanks to JohnDillinger). +
  • New: Added Ripserver theme.
  • +
  • Bugfix: Streaming to mobile phones now works better.
  • +
  • Bugfix: Made tray icon work on Vista (requires Java 6 or later).
  • +
  • Bugfix: Disable random playlist functionality if user is not authorized to play + music. +
  • +
  • Tech: Build number is now identical to Subversion revision.
  • +
+ +

Subsonic 3.5.beta1 - Jul 10, 2008

+
    +
  • New: Implemented music player for Java-enabled mobile phones. + (More) +
  • +
  • New: Support for personal images (avatars).
  • +
  • New: Support "read-only" view. + (More) +
  • +
  • New: Simplified user interface in settings pages. Now only one "Save" button.
  • +
  • New: Improved usability of coverart search page. Now also searches discogs.com.
  • +
  • New: Merge artists with same name, but located in different music folders.
  • +
  • New: Added option "Let others see what I am playing"
  • +
  • New: Added option "Always use web player". + (More) +
  • +
  • New: Nicer controls in modern browsers (Opera 9.5, Firefox 3, IE 7).
  • +
  • Bugfix: Lots of extra players are no longer created.
  • +
  • Bugfix: Fix minor bug with letter appearing if only file (not directory) exists. + (More) +
  • +
  • Bugfix: Make standalone version work on Linux without X11 server.
  • +
  • Bugfix: Make lyrics work again. + (More) +
  • +
  • Bugfix: Proper sorting of "The" artists. + (More) +
  • +
  • Bugfix: Make source release build.
  • +
+ +

Subsonic 3.4 - Apr 27, 2008

+
    +
  • New: Added optional setting for LDAP bind DN and password.
  • +
  • New: Added quick links to Google, Wikipedia, allmusic and Last.fm.
  • +
  • New: Added standalone installation option.
  • +
  • Bugfix: Fixed layout problems in Podcast page.
  • +
  • Bugfix: Clean up partially downloaded Podcast episodes at start-up.
  • +
  • Bugfix: Old Podcast episodes were in some cases not deleted.
  • +
+ +

Subsonic 3.4.beta1 - Mar 28, 2008

+
    +
  • New: Added support for user authentication in LDAP, including Microsoft Active + Directory. +
  • +
  • New: Implemented "Party mode" with a simpler user interface.
  • +
  • New: Added option to specify music folder in "Random playlist".
  • +
  • New: Added option "Play more random songs when end of playlist is reached" in "Random + playlist". +
  • +
  • New: Implemented download option in WAP interface.
  • +
  • New: Implemented random playlist option in WAP interface.
  • +
  • New: Make index always visible (doesn't work in IE).
  • +
  • New: Added play/add/download buttons for songs in left frame.
  • +
  • New: Suggest track number in tag editor.
  • +
  • Bugfix: Fixed faulty layout in main frame.
  • +
  • Bugfix: Fixed caching bug of left frame (when changing theme etc).
  • +
  • Bugfix: "Highest rated" now also shows albums that have never been played.
  • +
  • Bugfix: Player selection in WAP interface now works.
  • +
  • Bugfix: Support quotes in search field and shortcut field.
  • +
  • Bugfix: Don't display track number zero.
  • +
  • Tech: Faster start-up on Windows. Extract war file to SUBSONIC_HOME/jetty instead of + temp directory. +
  • +
  • Tech: Made it possible to run the Jetty version on Linux and other platforms.
  • +
  • Tech: Allow up to one week of idle time in Jetty.
  • +
+ +

Subsonic 3.3 - Dec 23, 2007

+
    +
  • New: Added "HD-720" and "Barents Sea" themes.
  • +
  • New: Improved layout of left and main frame.
  • +
  • New: Sort genres in "Edit tags".
  • +
  • Bugfix: Make transcoding work when combined with client-side playlist.
  • +
  • Bugfix: Case-insensitive sorting of artists.
  • +
  • Bugfix: Made genre parsing more robust.
  • +
  • Tech: Upgraded to Acegi 1.0.5
  • +
  • Tech: Upgraded to Spring 2.5
  • +
  • Tech: Make it compile with Java 5.
  • +
+ +

Subsonic 3.3.beta1 - Nov 23, 2007

+
    +
  • New: Implemented client-side playlists, including random skipping within songs + (see Settings > Players > Playlist is managed by player). +
  • +
  • New: Support resumable downloads.
  • +
  • New: Rewrite stream URL if Subsonic is behind a proxy.
  • +
  • New: Added two new themes designed for large HD screens.
  • +
  • New: Added Russian translation by Iaroslav Andrusiak.
  • +
  • New: Made it possible to collapse/expand Podcast episodes. Improved layout and + usability. +
  • +
  • New: Added "Play on phone" option to wap interface.
  • +
  • New: Auto-focus on username field in login page.
  • +
  • New: Created new settings categories "Advanced" and "Personal".
  • +
  • New: Moved index from top to left frame.
  • +
  • Bugfix: Support Podcast folder that is located outside music folder.
  • +
  • Bugfix: Handle track number on the form "3/12"
  • +
  • Bugfix: Fixed concurrency bug when rendering wiki markup.
  • +
+ +

Subsonic 3.2 - Oct 09, 2007

+
    +
  • New: Added support for editing genre in ID3 tags.
  • +
  • New: Show miniature album images in "Now playing" sidebar.
  • +
  • Bugfix: Handle podcasts with colons in the name.
  • +
  • Bugfix: Handle podcasts without enclosures.
  • +
  • Bugfix: Handle song, album and artist names with special characters (<, > etc) +
  • +
+ +

Subsonic 3.2.beta1 - Sep 19, 2007

+
    +
  • New: Download Podcasts with the new integrated Podcast receiver.
  • +
  • New: One-click installation with the new Windows installer.
  • +
  • New: Fetch lyrics automatically from www.metrolyrics.com.
  • +
  • New: See what others are playing in the new "Now playing" sidebar.
  • +
  • New: Play music directly in the browser with the new integrated Flash-based player. +
  • +
  • New: New tag engine (entagged.sourceforge.net) supports tags in a lot of formats + (mp3, ogg, flac, wav, wma, + etc). +
  • +
  • New: Added confirmation dialog when deleting playlists.
  • +
  • New: Remember selected music folder (in left frame) across sessions.
  • +
  • Bugfix: Fixed bug with rendering multiple status charts concurrently.
  • +
  • Tech: Added db admin tool.
  • +
+ +

Subsonic 3.1 - Jul 30, 2007

+

(No changes since 3.1.beta2)

+ +

Subsonic 3.1.beta2 - Jul 23, 2007

+
    +
  • New: Optimized scanning of music folders. Dramatic improvement for network disks. +
  • +
  • Bugfix: Fixed minor concurrency bug in search index creation.
  • +
  • Bugfix: Make cache work if clocks on remote disks are out of sync.
  • +
  • Bugfix: Ensure that cover art images are ordered alphabetically.
  • +
  • Bugfix: Remove nag message for licensed users.
  • +
+ +

Subsonic 3.1.beta1 - Jun 30, 2007

+
    +
  • New: Added checkboxes to songs in playlist, with option to perform operations on all + selected songs. +
  • +
  • New: Now possible to specify genre and decade when generating random playlist.
  • +
  • New: Added menu option to sort playlist by track, album or artist.
  • +
  • New: Audioscrobbling is now more fault-tolerant. Will retry if Last.fm is down.
  • +
  • New: Replaced Google ads with a donation request message. Donors will not see the + message. +
  • +
  • New: Added new attribute "default" to transcodings. When "default" is true, the + transcoding is automatically activated for new players. +
  • +
  • New: Implemented support for browser caching of left frame (with artist list).
  • +
  • New: Made downsampling command configurable.
  • +
  • New: Switch to "Now playing" after 3 minutes of inactivity.
  • +
  • New: Album page now has link to artist.
  • +
  • Bugfix: Logically delete/undelete metadata for albums that disappear/reappear on + disk. +
  • +
  • Bugfix: Fixed ugly checkboxes in IE.
  • +
+ +

Subsonic 3.0 - Mar 22, 2007

+
    +
  • New: Added Google ads.
  • +
  • Tech: Upgraded jvorbiscomment + library. +
  • +
  • Bugfix: Artists from different music folders are now properly sorted.
  • +
+ +

Subsonic 3.0.beta2 - Feb 24, 2007

+
    +
  • New: Added per-user bitrate limit.
  • +
  • New: Show error message in browser if Subsonic home can't be created.
  • +
  • Bugfix: Fixed remaining bugs (hopefully) related to folders with non-latin + characters. +
  • +
  • Bugfix: Zooming of ID3 cover art now works.
  • +
  • Bugfix: last.fm password must no longer be entered every time.
  • +
+ +

Subsonic 3.0.beta1 - Feb 04, 2007

+
    +
  • New: Audioscrobbling support. Automatically register what you're playing on last.fm. +
  • +
  • New: Support display and editing of OGG Vorbis tags.
  • +
  • New: Display cover art embedded in ID3 tags.
  • +
  • New: Dutch translation by Ronald Knot.
  • +
  • New: Links to previous/next album by same artist.
  • +
  • New: Change tab order in login screen.
  • +
  • Bugfix: Support directory names with non-latin characters.
  • +
  • Bugfix: Fixed ampersand bug in wap interface.
  • +
  • Bugfix: Display hours for very long tracks.
  • +
  • Tech: Upgraded Spring and Acegi to latest versions.
  • +
+ +

Subsonic 2.9 - Nov 13, 2006

+
    +
  • New: Added German translation by Harald Weiss.
  • +
  • New: Show server version and memory usage in help page.
  • +
  • Bugfix: Don't hang if unable to resolve latest version number.
  • +
  • Bugfix: Avoid duplicates in random album page.
  • +
  • Bugfix: More robust ID3 parsing.
  • +
  • Bugfix: More robust thumbnail scaling.
  • +
  • Bugfix: Fixed bug which in some cases made it impossible to restart streams.
  • +
  • Bugfix: Improve track number removal from title.
  • +
+ +

Subsonic 2.9.beta1 - Oct 16, 2006

+
    +
  • Bugfix: Avoid excessive disk and memory usage when (re)scanning the music library + (bug introduced in 2.8). +
  • +
  • Bugfix: Avoid flickering PNG images in IE.
  • +
  • New: Improved thumbnail quality using step-wise bilinear resampling.
  • +
  • New: Thumbnails are now cached in SUBSONIC_HOME/thumbs. Expect significant speed-ups + (after a while), in particular for huge images. +
  • +
  • New: Improved search speed by a factor of two.
  • +
  • New: Miscellaneous other caching mechanisms for faster response times.
  • +
  • New: Support Wiki markup in album comments.
  • +
  • New: Added "Download" menu option to main album view.
  • +
  • New: Ratings are now per-user. Average rating is also displayed.
  • +
  • New: Now possible to delete rating (for current user).
  • +
  • New: Added Spanish translation by Jorge Bueno Magdalena. Gracias, Jorge!
  • +
  • New: New Subsonic logo.
  • +
  • New: Keep bitrate statistics even if player reconnects.
  • +
  • New: Support editing of track numbers in ID3 tags.
  • +
  • New: Show full file name as tool tip in ID3 tag editor.
  • +
  • New: Search results are now better sorted.
  • +
+ +

Subsonic 2.8 - Sep 07, 2006

+
    +
  • New: Added option for transcoders to obey the player max bitrate setting.
  • +
  • New: Sort songs by track number.
  • +
  • New: Added transcoding support for Shorten and WavPack.
  • +
  • New: Improved caching of cover art images in browser.
  • +
  • New: Scroller color in Sandstorm theme.
  • +
  • New: Updated Norwegian translation.
  • +
  • New: Added Simplified Chinese translation by Neil Gao (currently incomplete).
  • +
  • Bugfix: Fixed performance problem with "Home" page.
  • +
  • Bugfix: Fixed broken wap interface.
  • +
  • Bugfix: Fixed playlist autoscroll.
  • +
  • Bugfix: Proper rendering of directories with both files and sub-directories.
  • +
+ +

Subsonic 2.8.beta1 - Aug 13, 2006

+
    +
  • New: Transcoding plugin framework.
  • +
  • New: VBR (variable bitrate) detection and resampling.
  • +
  • New: Added form-based login with remember-me.
  • +
  • New: Added logout option.
  • +
  • New: Support per-user language and theme.
  • +
  • New: Show track number, genre, format, duration and file size.
  • +
  • New: Configurable level of song details.
  • +
  • New: Various artists detection.
  • +
  • New: Added option to stream over plain HTTP when using SSL.
  • +
  • New: Mouseover tooltip for truncated text and cover art images.
  • +
  • New: Optional notification of new final and beta releases.
  • +
  • New: Nicer error page.
  • +
  • New: Added "Back in black" and "Sandstorm" themes.
  • +
  • New: Exclude files and folders listed in "subsonic_exclude.txt"
  • +
  • Tech: New security implementation based on Acegi (http://acegisecurity.org/)
  • +
  • Tech: Springified WAP pages and servlets.
  • +
  • Tech: Springified DWR.
  • +
  • Tech: Springified DAO's and data source.
  • +
+ +

Subsonic 2.7 - Jun 12, 2006

+
    +
  • Tech: Subsonic was completely rewritten to use the Spring MVC framework.
  • +
  • New: Theme support. Now ships with two themes, "Subsonic Default" and "2 minutes to + midnight". Theme authors are encouraged to contribute. +
  • +
  • New: Ajax-based ID3 tag editor.
  • +
  • New: Cover art 3D effect and popup. (3D effect not available in Internet Explorer). +
  • +
  • New: Added options to limit bandwidth for downloads and uploads.
  • +
  • New: Added progress bar to upload page.
  • +
  • New: Show upload (as well as download and streaming) charts in status page.
  • +
  • New: Added option to configure shortcuts to certain folders.
  • +
  • New: Rating where you can see how much each user has uploaded/downloaded/streamed. +
  • +
  • New: Nicer layout and graphics.
  • +
  • New: Added option to download playlists, both current and previously saved ones.
  • +
  • New: Now logs to c:/subsonic/subsonic.log (Windows) or /var/subsonic/subsonic.log + (other platforms). +
  • +
  • New: Support symbolic links on Unix.
  • +
  • New: Support XSPF playlist format.
  • +
  • New: Create backup of old image file when changing cover art.
  • +
  • Bugfix: Avoid wrapped lines if browser window is small.
  • +
  • Bugfix: Use proper Y-range in bandwidth charts.
  • +
  • Bugfix: Integer overflow in search index creation interval.
  • +
  • Bugfix: Some Amazon search didn't show any results.
  • +
  • Bugfix: Now possible to change cover art even if original file is write protected + (Windows only). +
  • +
+ +

Subsonic 2.6 - Mar 10, 2006

+
    +
  • New: Nicer layout, colors and icons. Customizable welcome message. Option to limit + number of cover art images to display. +
  • +
  • New: You can now specify multiple media folders in the configuration. + This is useful, for example, if you have your music on multiple disks, or if you have one + directory with music, and another with movies. The index (on the left-hand side) can either show all + media folders (merged alphabetically), or you can select from a combo box which folder to display. +
  • +
  • New: Assign ratings (one to five stars) and comments to individual albums.
  • +
  • New: There is a new welcome page, displaying lists of random albums, newest albums, + highest rated albums, most often played albums and most recently played albums. +
  • +
  • New: You can configure a set of links to Internet TV and radio stations. These links + become available in the index on the left-hand side. Click on a link, and your player connects to the station. +
  • +
  • New: Saved playlists are now available as Podcasts (available from the "More" page). +
  • +
  • New: Improved player management. Support multiple players with the same IP address, + and players with dynamic IP addresses. Display player type (e.g., WinAmp) and last-seen date. +
  • +
  • New: Macedonian translation by Stefan Ivanovski.
  • +
  • New: Implemented support for non-Latin character encodings (for instance Japanese or + Cyrillic). +
  • +
  • New: Added option to load a previously saved playlist in the WAP interface.
  • +
  • New: "Album Info" now integrates with Google Music.
  • +
  • New: Avoid unnecessary reloading of the playlist window.
  • +
  • Bugfix: Fallback to file name if ID3 tags are present but empty.
  • +
  • Bugfix: LAME now works on Linux.
  • +
  • Bugfix: Solved problem with playlist autoscroll on rearrange.
  • +
  • Bugfix: Clicking index in top frame sometimes caused reloading of left frame.
  • +
+ +

Subsonic 2.5 - Nov 25, 2005

+
    +
  • New: Implemented user management. Users are easily created, deleted and assigned + different privileges. +
  • +
  • New: Faster song switching. Players react immediately to playlist changes.
  • +
  • New: Now possible to refine search for cover art and album info.
  • +
  • New: Better support for OGG, AAC and other formats. Added proper suffix to stream URL + as a hint to the player.
  • +
  • New: Display media library statistics.
  • +
  • New: New location for preferences, search index and database (c:\subsonic or + /var/subsonic). +
  • +
  • Bugfix: Improved parsing of MP3 tags. Avoid funny characters in artist, album and + song title. +
  • +
+ +

Subsonic 2.4 - Oct 10, 2005

+
    +
  • New: Download cover art and album info from Amazon web service.
  • +
  • New: Show selection of random albums on welcome page.
  • +
  • New: Display notice if LAME is not installed.
  • +
  • Bugfix: Allow max one stream per player.
  • +
  • Bugfix: Use user-wide (not system-wide) preferences on non-Windows platforms.
  • +
+ +

Subsonic 2.3 - May 28, 2005

+
    +
  • New: Full internationalization support.
  • +
  • New: Automatic update of search index at specified intervals.
  • +
  • New: Search is now more like Google.
  • +
  • New: Updating search index is now a lot faster (30 seconds for 18000 songs).
  • +
  • New: Unique playlist "undo" function.
  • +
  • New: "Now Playing" automatically refreshes when a new album is played.
  • +
  • New: Ongoing downloads are now displayed in the status page, with charts showing + download speed. +
  • +
  • New: Some improvements in zip functionality.
  • +
  • New: Significantly improved accuracy in charts.
  • +
  • New: Better support for non-ASCII characters in SHOUTcast.
  • +
  • New: No longer necessary to enter username and password in player.
  • +
  • New: Support for "ignored articles".
  • +
  • New: Show log in help page.
  • +
+ +

Subsonic 2.2 - March 17, 2005

+
    +
  • New: Implemented SHOUTcast support.
  • +
  • New: Added "Album info" which links to reviews etc at allmusic.com.
  • +
  • New: Support for uploading files from the browser to the Subsonic server. Zip-files + are automatically unpacked. +
  • +
  • New: Improved usability in search interface.
  • +
  • New: Option to specify http://yourhostname/stream/file.ogg etc.
  • +
  • Bugfix: Detect zero-terminated strings in ID3 tags.
  • +
  • Bugfix: Use ID3v2 tags instead of ID3v1, if both are present.
  • +
+ +

Subsonic 2.1 - March 8, 2005

+
    +
  • New: Added more search options.
  • +
  • New: Added support for downloading an entire directory structure as a zip file.
  • +
  • New: Subsonic now parses song titles, artists and albums from ID3 tags.
  • +
  • New: Settings for cover art size and max bitrate can now be set for individual + players. +
  • +
  • New: Search index is now generated in the background.
  • +
  • New: Keep position in playlist frame (e.g., always show the currently playing track). +
  • +
  • Bugfix: Some minor bug fixes.
  • +
+ +

Subsonic 2.0 - February 27, 2005

+
    +
  • New: Added WAP interface for controlling Subsonic from a mobile phone or PDA.
  • +
  • New: Added option to generate a random playlist.
  • +
  • New: Added option to download and save individual songs.
  • +
  • New: Subsonic now alerts users if a new version is available.
  • +
  • New: Improved documentation and usability.
  • +
  • New: ANT support.
  • +
+ +

Subsonic 1.0 - February 10, 2005

+
    +
  • New: Added chart for displaying bitrates last few minutes.
  • +
  • New: Implemented transcoding to lower bitrates.
  • +
  • New: Added online help.
  • +
  • New: Support PLS and M3U playlists.
  • +
+ +

Subsonic 0.1 - December 14, 2004

+
    +
  • Initial release.
  • +
+ +
+ + + +
+
+
+
+<%@ include file="footer.jsp" %> +
+ + + + diff --git a/subsonic-site/src/main/webapp/demo.jsp b/subsonic-site/src/main/webapp/demo.jsp new file mode 100644 index 00000000..d6ce9cc4 --- /dev/null +++ b/subsonic-site/src/main/webapp/demo.jsp @@ -0,0 +1,55 @@ +<%@ page import="java.util.Random" %> + + + +<%! String current = "demo"; %> +<%@ include file="header.jsp" %> + + + + + +
+ <%@ include file="menu.jsp" %> + +
+
+

Online Demo

+

+ Try the online demo to get a taste of what Subsonic is all about! +

+ +
+ + <% + Random random = new Random(System.currentTimeMillis()); + int userId = random.nextInt(5) + 1; + %> +

» Start demo

+
+ +
+ <%@ include file="google-translate.jsp" %> + <%@ include file="download-subsonic.jsp" %> + <%@ include file="donate.jsp" %> +
+ +
+
+
+
+ <%@ include file="footer.jsp" %> +
+ + + + diff --git a/subsonic-site/src/main/webapp/documentation.jsp b/subsonic-site/src/main/webapp/documentation.jsp new file mode 100644 index 00000000..5fa711f8 --- /dev/null +++ b/subsonic-site/src/main/webapp/documentation.jsp @@ -0,0 +1,66 @@ + + + +<%! String current = "documentation"; %> +<%@ include file="header.jsp" %> + + + + + +
+ <%@ include file="menu.jsp" %> + +
+
+

Documentation

+ +
    +
  • Installation
    + How to install Subsonic on Windows, Mac, Linux and other platforms. +
  • +
  • Getting started
    + How to set up music folders, remote access etc. +
  • +
  • FAQ
    + Frequently asked questions. +
  • +
  • A practical guide to installing and configuring Subsonic
    + By Shane R. Monroe, Monroeworld.com. +
  • +
  • Wiki
    + Wiki pages contributed by your fellow Subsonic users. +
  • +
  • Forum
    + Discuss and ask questions to fellow users. Roughly 30 new posts per day. +
  • +
  • Transcoding
    + Detailed documentation of how Subsonic automatically converts between music formats. +
  • +
  • Translation
    + How to translate Subsonic to a new language. +
  • +
  • API documentation
    + How to access Subsonic using the REST API. (For developers) +
  • + +
+ +
+ +
+ <%@ include file="google-translate.jsp" %> + <%@ include file="download-subsonic.jsp" %> +
+ +
+
+
+
+ <%@ include file="footer.jsp" %> +
+ + + + diff --git a/subsonic-site/src/main/webapp/donate.jsp b/subsonic-site/src/main/webapp/donate.jsp new file mode 100644 index 00000000..c0bf9805 --- /dev/null +++ b/subsonic-site/src/main/webapp/donate.jsp @@ -0,0 +1,26 @@ + \ No newline at end of file diff --git a/subsonic-site/src/main/webapp/download-subsonic.jsp b/subsonic-site/src/main/webapp/download-subsonic.jsp new file mode 100644 index 00000000..2dd3d8c4 --- /dev/null +++ b/subsonic-site/src/main/webapp/download-subsonic.jsp @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/subsonic-site/src/main/webapp/download.jsp b/subsonic-site/src/main/webapp/download.jsp new file mode 100644 index 00000000..997998a7 --- /dev/null +++ b/subsonic-site/src/main/webapp/download.jsp @@ -0,0 +1,165 @@ + + + +<%! + String current = "download"; + String stable = "4.6"; + String beta = "4.7.beta2"; // Set to null if no beta is available. +%> +<%@ include file="header.jsp" %> + + + + + +
+ <%@ include file="menu.jsp" %> + +
+ + +
+ <%@ include file="google-translate.jsp" %> + + + <%@ include file="merchandise.jsp" %> + +
+ +
+
+
+
+ <%@ include file="footer.jsp" %> +
+ + + + diff --git a/subsonic-site/src/main/webapp/download2.jsp b/subsonic-site/src/main/webapp/download2.jsp new file mode 100644 index 00000000..be6f6c70 --- /dev/null +++ b/subsonic-site/src/main/webapp/download2.jsp @@ -0,0 +1,45 @@ + + + + + Subsonic » Free Music Streamer + + + + + <%@ include file="tracking.jsp" %> + + + + + + + + +<%--Microsoft adCenter conversion--%> + + + + +

Please wait, contacting SourceForge download center...

+ + diff --git a/subsonic-site/src/main/webapp/faq.jsp b/subsonic-site/src/main/webapp/faq.jsp new file mode 100644 index 00000000..570c02f7 --- /dev/null +++ b/subsonic-site/src/main/webapp/faq.jsp @@ -0,0 +1,57 @@ + + + +<%! String current = "faq"; %> +<%@ include file="header.jsp" %> + + + + + +
+ <%@ include file="menu.jsp" %> + +
+
+

Frequently Asked Questions

+ +

Are there other payment options than PayPal?

+

Yes. You can make a payment to subsonic_donation@activeobjects.no on Moneybookers.

+ +

How long does it take to get the license after I have donated?

+

Normally no more than ten minutes. If it should take longer, please take contact, + but please check your spam filter first.

+ +

How do I install the license key I received by email?

+

Please follow the guide in the Getting Started documentation.

+ +

I can't access my Subsonic server from the internet or from my iPhone/Android phone.

+

Please follow the guide in the Getting Started documentation.

+ +

I forgot my Subsonic password. Can it be retrieved?

+

Yes. Please read this forum post.

+ +

I've lost my license key. Can I have it resent?

+

Yes. Please go here.

+ + <%--TODO: Network shares--%> +
+ +
+ <%@ include file="google-translate.jsp" %> + <%@ include file="download-subsonic.jsp" %> + <%@ include file="donate.jsp" %> + +
+ +
+
+
+
+ <%@ include file="footer.jsp" %> +
+ + + + diff --git a/subsonic-site/src/main/webapp/favicon.ico b/subsonic-site/src/main/webapp/favicon.ico new file mode 100644 index 00000000..d2c13383 Binary files /dev/null and b/subsonic-site/src/main/webapp/favicon.ico differ diff --git a/subsonic-site/src/main/webapp/features.jsp b/subsonic-site/src/main/webapp/features.jsp new file mode 100644 index 00000000..f43ba114 --- /dev/null +++ b/subsonic-site/src/main/webapp/features.jsp @@ -0,0 +1,226 @@ + + + +<%! String current = "features"; %> +<%@ include file="header.jsp" %> + + + + + +
+<%@ include file="menu.jsp" %> + +
+
+

Subsonic Features

+ +
+ + +
Easy to use Back To Top
+
+
+ +
+
+
    +
  • Listen to your music from anywhere – all you need is a browser.
  • +
  • The clean web interface is optimized for constrained bandwidth environments and efficient browsing through large music + collections (hundreds of gigabytes).
  • +
  • Free-text search helps you find your favorite tracks quickly.
  • +
  • Displays cover art, including images embedded in ID3 tags.
  • +
  • Assign ratings and comments to albums.
  • +
  • Common playlist features (add, remove, rearrange, repeat, shuffle, undo, save, load).
  • +
+
+
+
+ +
+ + +
Versatile Back To Top
+
+
+ +
+
+
    +
  • Stream or download music directly to your phone. Apps available for Android, + iPhone and Windows Phone
  • +
  • Use the AIR desktop application, SubAir.
  • +
  • Control Subsonic from any mobile phone or PDA, using the WAP interface.
  • +
  • Supports multiple simultaneous players. Manage any player from any location.
  • +
  • Upload and download files to/from Subsonic, with automatic zipping and unzipping.
  • +
+
+
+
+ +
+ + +
Supports most media formats Back To Top
+
+
+ +
+ +
+
    +
  • Supports MP3, OGG, AAC and any other audio or video format that streams over HTTP.
  • +
  • Transcoding engine allows for streaming of a variety of lossy and lossless formats by converting to MP3 on-the-fly.
  • +
  • Works with any network-enabled media player, such as Winamp, iTunes, XMMS, VLC, MusicMatch and Windows Media Player. Also includes an embedded Flash player.
  • +
  • Tag parsing and editing of MP3, AAC, OGG, FLAC, WMA and APE files, using the Jaudiotagger library.
  • +
  • Playlists can be saved and restored. M3U, PLS and XSPF formats are supported. Saved playlists are available as Podcasts.
  • +
  • On-the-fly resampling to lower bitrates using the high-quality LAME encoder. Handy if your bandwidth is limited.
  • +
  • Implements the SHOUTcast protocol. Players which support this (including Winamp, iTunes and XMMS) display the current artist and song, along + with other metadata.
  • +
+
+
+
+ +
+ +
Customizable user experience Back To Top
+
+
+ +

+ +

+
+
    +
  • Available in these languages:

    + + + + + + + + + + + + + + + + + + + + + + + +
    • English (by Sindre Mehus)
    • French (by JohnDillinger)
    • Spanish (by Jorge Bueno Magdalena)
    • Portuguese (by Miguel Fonseca)
    • German (by Harald Weiss and Jörg Frommann)
    • Italian (by Michele Petrecca)
    • Greek (by Constantine Samaklis)
    • Russian (by Iaroslav Andrusiak)
    • Slovenian (by Andrej Žižmond, Jan Jamsek and Marko Kastelic)
    • Macedonian (by Stefan Ivanovski)
    • Polish (by Michał Kotas)
    • Bulgarian (by Ivan Achev)
    • Chinese (by Neil Gao)
    • Japanese (by Takahiro Suzuki)
    • Korean (by Choi Jong-seok)
    • Dutch (by Ronald Knot)
    • Norwegian (by Sindre Mehus and jigsaw)
    • Swedish (by Jörgen Sjöberg)
    • Danish (by Morten Hartvich)
    • Finnish (by Reijo Jäärni)
    • Icelandic (by DJ Danny)
    +
  • +
  • Select from 24 different themes, including some that are optimized for HD screens.
  • +
  • Highly configurable user interface.
  • +
+
+
+
+ +
+ + +
Integrates with the best web services Back To Top
+
+
+ +

+ +

+
+
    +
  • Automatically register what you're playing on Last.fm, using the built-in Audioscrobbling support.
  • +
  • Find cover art and lyrics using web services from Google and Chartlyrics.
  • +
  • Read album reviews and more at Wikipedia, Google Music and allmusic.
  • +
+
+
+
+ +
+ + +
Secure and reliableBack To Top
+
+
+ +
+
+
    +
  • Users must log in with a username and password. Users are assigned different privileges.
  • +
  • Specify upload and download bandwidth limits.
  • +
  • Use HTTPS/SSL encryption for ultimate protection.
  • +
  • Supports authentication in LDAP and Active Directory.
  • +
  • Runs for months without crashing, hanging or leaking resources.
  • +
+
+
+
+ +
+ + +
Cool extra features Back To Top
+
+
+ +
+
+
    +
  • Download Podcasts with the integrated Podcast receiver.
  • +
  • Manage your internet TV and radio stations.
  • +
  • Play music directly on the server's audio hardware using the jukebox mode.
  • +
+
+
+
+ +
+ + +
+ <%@ include file="google-translate.jsp" %> + + + <%@ include file="download-subsonic.jsp" %> + <%@ include file="translate-subsonic.jsp" %> +
+ +
+
+
+
+<%@ include file="footer.jsp" %> +
+ + + + diff --git a/subsonic-site/src/main/webapp/footer.jsp b/subsonic-site/src/main/webapp/footer.jsp new file mode 100644 index 00000000..277ea27a --- /dev/null +++ b/subsonic-site/src/main/webapp/footer.jsp @@ -0,0 +1,11 @@ + + \ No newline at end of file diff --git a/subsonic-site/src/main/webapp/forum.jsp b/subsonic-site/src/main/webapp/forum.jsp new file mode 100644 index 00000000..9de0b47c --- /dev/null +++ b/subsonic-site/src/main/webapp/forum.jsp @@ -0,0 +1,3 @@ +<% + response.sendRedirect("http://forum.subsonic.org/forum"); +%> \ No newline at end of file diff --git a/subsonic-site/src/main/webapp/getting-started.jsp b/subsonic-site/src/main/webapp/getting-started.jsp new file mode 100644 index 00000000..cdf077d5 --- /dev/null +++ b/subsonic-site/src/main/webapp/getting-started.jsp @@ -0,0 +1,175 @@ + + + +<%! String current = "getting-started"; %> +<%@ include file="header.jsp" %> + + + + + +
+ <%@ include file="menu.jsp" %> + +
+
+

Getting Started

+ +

+ This guide assumes that you have successfully installed the Subsonic server on your computer. If not, + please refer to the installation instructions. +

+

+ After installing and starting Subsonic, open the Subsonic web page. The web address may differ depending + on your installation options, but is typically http://localhost + or http://localhost:4040. +

+ +

1 Setting up music folders

+ +

You must tell Subsonic where you keep your music. Select Settings > Music folders to add one or + more folders.

+ +

Note that if you add more than one music folder, a list will appear on the left side of the screen where you can + select the active folder.

+ + + +

Also note that Subsonic will organize your music according to how they are organized on your disk. + Unlike many other music applications, Subsonic does not organize the music according to the tag information + embedded in the files. (It does, however, also read the tags for presentation and search purposes.)

+ +

Consequently, it's recommended that the music folders you add to Subsonic are organized in an + "artist/album/song" manner. There are music managers, like + MediaMonkey, that can help you achieve this.

+ +

2 Setting up remote access

+

With Subsonic you can access your music anywhere on the internet or from your iPhone or Android phone. + However, in order to do that certain conditions must be met:

+ +
    +
  • Your router must have a public IP address and must be accessible from the internet. This is true for most home internet connections.
  • +
  • Your router must support the UPnP or NAT-PMP protocol so that Subsonic can setup the appropriate port forwarding. If your router doesn't support + this you will have to configure the port forwarding manually.
  • +
+ +

2.1 Automatic port forwarding

+

To enable automatic port forwarding in Subsonic, go to Settings > Network and enable the + "Automatically configure your router..." option. Click the Save button and pay close attention to the status message + that is displayed. If you get an error message, you should first try to configure your router to enable UPnP + (or NAT-PMP if you have an AirPort from Apple). + If it still fails, or your router doesn't support UPnP, follow the instructions below. + If it works, the Subsonic server will at regular intervals (every hour) contact the router and tell it to + forward incoming connections (from the internet) to the Subsonic server. +

+ +

2.2 Manual port forwarding

+

If the automatic option didn't work you can still set it up manually. Consult portforward.com + to get instructions specific to your router. Note that the instructions contain important steps on how to + configure a static IP address for your computer. You should follow these. Later in the process, you + will find that Subsonic is not on the list of applications, so select the "Default Guide" instead. +

+

+ When you get to the point where the router asks for private and public ports, enter the port number the + Subsonic server is using (normally 80 on Windows and 4040 on other operating systems) for both values. + If asked for a protocol, select TCP. +

+ +

If you are unsure what any of this means you will probably need to consult someone with network configuration + experience.

+ +

2.3 Setting up your personal subsonic.org address

+

Once you get the port forwarding set up correctly, the next step is to get yourself an easy-to-remember web address. + You will use this address to access your Subsonic server from the internet.

+ +

From Settings > Network you can register your address. (Remember to log on with admin rights). + Enable the "Access your server over the internet..." option, + and enter your preferred address, for instance http://joe.subsonic.org.

+ +

Click the Save button, and pay attention to the status message that is displayed. Note that Subsonic will also perform + a test to ensure that the web address works properly. If the test fails it might be an indication that the port + forwarding is not set up correctly.

+ +

If you don't want to use a subsonic.org address you can get similar services from dynamic DNS providers such as dyndns.com.

+ + +

2.4 Troubleshooting

+

This section describes some common network problems and how to fix them.

+
    +
  • Multiple routers. There might be more than one router on your network, for instance both an "inner" + wireless router and an "outer" (closest to the internet) cable/fiber modem with routing enabled. You must + make sure that incoming traffic received by the outermost router is forwarded to the inner router (which + in turn forwards the traffic on to your Subsonic server). You can do this by configuring port forwarding on the + outer router (forward traffic to the inner router), or setting it in bridge mode. Your ISP should + be able to help you if you have problems with this.
  • +
  • Port blocked by ISP. Many ISPs (Internet Service Providers) block incoming traffic on port 80, which is + used by most web servers. Subsonic uses port 80 by default on Windows. You can avoid this by configuring + Subsonic to use a different port. Open the Subsonic Control Panel by clicking on the Subsonic tray icon. + Change the port number to any random number between 1025 and 65,000. If you set up manual port forwarding + (see above), remember to update that as well.
  • +
  • Firewall. You might be running firewall software (on the Subsonic server) which blocks incoming traffic. + If this is the case, try first to turn the firewall off. If this helps, turn the firewall back on and configure it + to allow incoming traffic to Subsonic. Note: The Windows installer version of Subsonic will automatically + configure the built-in Windows Firewall.
  • +
+ +

3 Registering your license key

+

Most features in Subsonic are free, but some (like mobile phone streaming) require a license after the 30-day + free trial. You get the license key by donating €10 or more to the Subsonic project. After you receive the license key + by email, you must register it on your server as follows:

+ +
    +
  • Click the "Donate" link in the top right corner of the Subsonic web interface.
  • +
  • Enter the email address and license key you received by email.
  • +
+ + + +

4 Using https

+

For improved security you can turn on https encryption. On Windows, open the Subsonic Control Panel by clicking + on the Subsonic tray icon, then enable https on the specified port (default 443). +

+

On Linux, add --https-port=4443 (or any other port) to SUBSONIC_ARGS in + /etc/default/subsonic (Ubuntu/Debian) or /etc/sysconfig/subsonic (Fedora/RPM). +

+

+ Note that Subsonic uses a self-signed https certificate by default. This provides encryption but not + proper authentication. To use your own certificate you must put it in a Java keystore, then specify the + following Java system properties: subsonic.ssl.keystore – (Path to an alternate SSL keystore), and + subsonic.ssl.password – (Password of the alternate SSL keystore). On Windows, you can set these system + properties in C:\Program Files\Subsonic\subsonic-service.exe.vmoptions. +

+ +
+ + + +
+
+
+
+ <%@ include file="footer.jsp" %> +
+ + + + diff --git a/subsonic-site/src/main/webapp/google-translate.jsp b/subsonic-site/src/main/webapp/google-translate.jsp new file mode 100644 index 00000000..b2e9370e --- /dev/null +++ b/subsonic-site/src/main/webapp/google-translate.jsp @@ -0,0 +1,9 @@ +
+
+
\ No newline at end of file diff --git a/subsonic-site/src/main/webapp/header.jsp b/subsonic-site/src/main/webapp/header.jsp new file mode 100644 index 00000000..ed488809 --- /dev/null +++ b/subsonic-site/src/main/webapp/header.jsp @@ -0,0 +1,18 @@ + + + Subsonic » Free Music Streamer + + + + + + + + + + <%@ include file="tracking.jsp" %> + + + diff --git a/subsonic-site/src/main/webapp/hosting.jsp b/subsonic-site/src/main/webapp/hosting.jsp new file mode 100644 index 00000000..a2f498e4 --- /dev/null +++ b/subsonic-site/src/main/webapp/hosting.jsp @@ -0,0 +1,91 @@ + + + +<%! + String current = "hosting"; + String gigaProsUrl = "http://www.gigapros.com/affiliate/scripts/click.php?a_aid=subsonic&desturl=http://www.gigapros.com/portal/index.php/products-a-services/specialty-hosting/subsonic-server.html"; + String zazeenUrl = "https://www.zazeen.com/OnlinePC.html"; +%> +<%@ include file="header.jsp" %> + + + + + +
+ <%@ include file="menu.jsp" %> + +
+
+

Subsonic Hosting

+ +

+ An alternative to running the Subsonic on your own computer is to get a pre-installed Subsonic server from + one of our hosting partners. +

+ +
+
Zazeen
+
+
+ + Zazeen +

+ Zazeen's Online PC comes with Ubuntu and a full range of applications and services, including + a ready-to-use Subsonic server. +

+

+ Zazeen provides multiple 10Gbit fiber optic backbone and + peering arrangements to most ISPs in North America and Europe. +

+ +

+ Check out Zazeen's server plans and prices. +

+
+
+
+ +
+
GigaPros
+
+
+ + GigaPros +

+ GigaPros' Subsonic hosting servers are actually powerful Virtual Private Servers (VPS), which are highly optimized to run Subsonic. +

+

+ These VPS'es have fully functional pre-installed Subsonic server and they behave exactly like your own Dedicated Server + with full root access. +

+ + + + +

+ Check out GigaPros' server plans and prices. +

+ + +
+
+
+ +
+ +
+ <%@ include file="google-translate.jsp" %> +
+ +
+
+
+
+ <%@ include file="footer.jsp" %> +
+ + + + diff --git a/subsonic-site/src/main/webapp/inc/css/banner.css b/subsonic-site/src/main/webapp/inc/css/banner.css new file mode 100644 index 00000000..22f1d669 --- /dev/null +++ b/subsonic-site/src/main/webapp/inc/css/banner.css @@ -0,0 +1,104 @@ + +#banner-full { + width: 900px; + height: 299px; + background-color: #282828; + overflow: hidden; + position: relative; + border-top: 1px solid #5c5c5c; + border-bottom: 1px solid #4e4e4e; +} +#slide-prev { + position: absolute; + left: 815px; + top: 260px; + z-index: 200; + width:32px; + height:32px; + margin: 0; + padding: 0; + background: url('../img/banner/prev.png') no-repeat; +} +#slide-next { + position: absolute; + left: 860px; + top: 260px; + z-index: 200; + width:32px; + height:32px; + margin: 0; + padding: 0; + background: url('../img/banner/next.png') no-repeat; +} +#slide-prev:hover +{ + background: url('../img/banner/prev-hover.png') no-repeat; +} +#slide-next:hover +{ + background: url('../img/banner/next-hover.png') no-repeat; +} +#bannercontent { + position: absolute; + left: 0; + z-index: 100; +} +#banner-full .slide { + width: 900px; + height: 301px; + position: absolute; +} +#banner-full .slidecontent { + position: relative; + width: 900px; + height: 301px; +} +#banner-full .slide .screenshot { + position: absolute; + bottom: 0; + left: 0; +} +#banner-full .slide .title { + width: 380px; + height: 65px; + position: absolute; + top: 80px; + left: 515px; +} +#banner-full .slide1 .title { + top: 100px; + left: 530px; +} +#banner-full .slide4 .title { + left: 575px; +} +#banner-full .slide5 .title { + left: 575px; + width: 300px; +} +#banner-full .slide .title .large { + font-size: 24px; + font-weight: bold; + line-height: normal; + color: #fff; + margin-bottom:10px; +} +#banner-full .slide .title .small { + font-size: 16px; + font-style: normal; + color: #ddd; +} +#banner-full .slide .text { + position: absolute; + top: 185px; + left: 515px; + width: 380px; + line-height: 1.4em; + color: #aaa; +} + +#bannercontent .slide1 {left:0;} +#bannercontent .slide2 {left:900px;} +#bannercontent .slide3 {left:1800px;} +#bannercontent .slide4 {left:2700px;} +#bannercontent .slide5 {left:3600px;} diff --git a/subsonic-site/src/main/webapp/inc/css/style.css b/subsonic-site/src/main/webapp/inc/css/style.css new file mode 100644 index 00000000..ab5435ba --- /dev/null +++ b/subsonic-site/src/main/webapp/inc/css/style.css @@ -0,0 +1,345 @@ +*,h1,h2,h3,h4,h5,h6,p,div,body,html,ul,li,ol,img,a{margin:0;padding:0;} +body { + width: 100%; + margin: 0; + padding: 0 0 20px 0; + background: #fff url('../img/content-bg.gif') 0px 0px repeat-x; + font-size: 0.8em; + color: #444; + font-family: Arial, Helvetica, sans-serif; +} +.clear { clear: both; } +.hide { display: none; } +p { margin: 0.2em 0 1em 0; } +hr { display: none; } +a img { + border: none; +} +a { + color: #4275bc; + text-decoration: none; +} +a:hover { + color: #060c36; + text-decoration: underline; +} +.floatcontainer { + overflow: hidden; + width: 100%; +} +h1 { + font-size: 18px; + color: #060c36; + font-weight: bold; + padding: 0 0 6px 0; +} +h2 { + font-size: 14px; + color: #060c36; + font-weight: bold; + padding: 0 0 4px 0; +} +h2.div { + border-bottom: 1px solid #ccc; + margin-bottom: 10px; +} +h3 { + font-size: 13px; + color: #060c36; + font-weight: bold; + padding: 0 0 2px 0; +} +h4 { + font-size: 11px; + color: #060c36; + font-weight: normal; + text-transform: uppercase; +} +/* ---------- List Items ---------- */ +html>body #content ul.list { + list-style: none; + text-indent: -1em; +} +#content ul { + margin: 0 0 1em 0; + padding: 0 0 0 1em; +} +#content ul.list li { + padding: 4px 0 4px 0; + margin: 0 0 0 0.25em; +} +#content ul.list li:before { /* Show right angle quotes to cool browsers */ + content: "\00BB \0020"; +} +ol { + margin: 0 0 .8em 1em; + padding-left: 2em; +} +#content ol li { + margin-bottom: 1.6em; +} +#content ul.stars { + list-style: none; + margin: 0px; + padding: 0px; +} +#content ul.stars li { + background: url('../img/star.png') 0px 0px no-repeat; + padding: 0 10px 8px 20px; + margin: 0px; + list-style: none; +} +#content ul.stars li:before { + content: ""; +} +#container { + width: 900px; + margin: 0 auto; + padding-top: 106px; + position: relative; +} +#logo { + position: absolute; + left: -40px; + top: 0; + z-index: 99; +} +#content { + width: 898px; + background: #fff url('../img/content-bg.gif') 0px 0px repeat-x; + border: 1px solid #cbcedc; + line-height: 1.4em; +} +#main-col { + width: 600px; + padding: 15px 20px 15px 20px; + float: left; +} +#side-col { + margin: 20px 0 0 0; + width: 240px; + float: left; +} +#side-col .sidebox { + margin: 0 0 20px 0; + padding: 10px; + border: 1px solid #cbcedc; + background-color: #e6e7ee; +} +#wide-col { + padding: 15px 20px 15px 20px; +} +/* ---------- Nav ----------- */ +#nav { + background: url('../img/topnav.gif') top left no-repeat; + height: 39px; + width: 900px; + position: relative; + overflow: hidden; +} +#nav ul { + margin: 0; + padding: 0; + list-style-image: none; + list-style: none; +} +#nav li { + margin: 0; + padding: 0; + float: left; +} +#nav li a { + background: url('../img/topnav-hover.gif') 0px 99px repeat-x; + height: 39px; + color: #7281b3; + text-decoration: none; + display: block; + font-size: 14px; + overflow: hidden; + float: left; + cursor: pointer; +} +#nav li a span { + display: block; + float: left; + padding: 12px 11px 12px 11px; /* Change for narrower menu items. */ + background: url('../img/topnav-div.gif') right 1px no-repeat; +} +#nav li a:hover, #nav li a.active { + background: url('../img/topnav-hover.gif') 0px 1px repeat-x; + color: #a9b3d6; +} +#nav li#menu-home a:hover, #nav li#menu-home a.active { + background: url('../img/home-rollover.gif') 1px 1px no-repeat; + color: #a9b3d6; +} +/* ---------- Menu Visibility ---------- */ +#nav li a.open { + background: url('../img/topnav-hover.gif') 0px -49px repeat-x !important; + color: #ffffff !important; +} +#nav li#menu-home a.open { + background: url('../img/home-rollover.gif') 1px -49px no-repeat !important; + color: #ffffff !important; +} +/* ---------- Footer ----------- */ +#footer { + width: 900px; + background: url('../img/footer.gif') bottom left no-repeat; + border-top: 1px solid #383d5e; + color: #7281B3; + font-size: 11px; +} +#footer .footercontent { + padding: 10px; +} +#footer a { + text-decoration: none; + color: #9ea9ce; +} +#footer a:hover { + color: #fff; +} +/* ---------- Content Formatting ---------- */ +.column-left { + float: left; + width: 50%; +} +.column-right { + float: right; + width: 50%; +} +ul.column-right, ul.column-left { + margin: 0; + padding: 0; +} +/* ---------- Feature Table ----------- */ +tr.table-heading { + background: url('../img/header.gif') 0px 0px no-repeat; + color: #fff; + font-weight: bold; + line-height: normal; +} +tr.table-heading th { + padding: 6px 10px 6px 10px; +} +th.featurename { + text-align: left !important; +} +tr.table-altrow { + background: #f1f2f8; +} +table.featuretable td { + padding: 6px 10px 6px 10px; + text-align: center; +} +table.featuretable th a{ + color: #cccccc; +} +table.featuretable { + padding: 6px 4px; +} +table.featuretable td.meta { + padding: 0px; +} +td.featurename { + text-align: left !important; + width: 50%; +} +.important { + color: #911; + font-weight: bold; +} + +/* ---------- Transcoding Table ----------- */ +th.transcoding-heading { + text-align: left !important; + padding-right:2em; +} +td.transcoding { + white-space:nowrap; + padding-right:2em; +} + +/* ---------- API Parameter Table ----------- */ +th.param-heading { + font-size:11px; +} + +/* ---------- Feature Detail ----------- */ +.featureitem { + background: #f1f2f8; + margin-bottom: 20px; +} +.featureitem .heading { + background: url('../img/header.gif') 0px 0px no-repeat; + color: #fff; + font-weight: bold; + padding: 6px 10px 6px 10px; + position: relative; +} +.featureitem .content { + overflow: hidden; + width: 100%; + background: url('../img/itemcontentborder.gif') top left repeat-y; + border-bottom: 1px solid #CBCEDC; +} +.featureitem .content .description { + margin-right: 190px; + padding: 10px 0 10px 10px; +} +.featureitem .content .wide-description { + padding: 10px; +} +.featureitem .content .wide-content { + padding: 10px; +} +.featureitem .content .screenshot { + float: right; + padding: 10px 10px 10px 0px; +} + +.margin10-t { margin-top: 10px; } +.margin10-r { margin-right: 10px; } +.margin10-b { margin-bottom: 10px; } +.margin10-l { margin-left: 10px; } + +.margin20-t { margin-top: 20px; } +.margin20-r { margin-right: 20px; } +.margin20-b { margin-bottom: 20px; } +.margin20-l { margin-left: 20px; } + +/* ---------- Search form ---------- */ +#search { + position: absolute; + top: 55px; + right: 0; +} + +/* ---------- Content ---------- */ +.bugid, code, pre, td.transcoding { + font: 13px "Bitstream Vera Sans Mono", 'Courier New', Courier, Fixed, monospace; +} +.bugid { color: #09f; } +code, pre { color: #093; } +.bottomspace { + margin-bottom: 20px; +} +.backtotop { + position: absolute; + top: 8px; + right: 8px; +} +.img-right { + float: right; + margin-left: 10px; +} +.img-left { + float: left; + margin-right: 10px; +} +.img-center { + display:block; + margin-left:auto; + margin-right:auto; +} \ No newline at end of file diff --git a/subsonic-site/src/main/webapp/inc/img/air.png b/subsonic-site/src/main/webapp/inc/img/air.png new file mode 100644 index 00000000..ff1199a0 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/air.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/android.png b/subsonic-site/src/main/webapp/inc/img/android.png new file mode 100644 index 00000000..5180aeab Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/android.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/appstore.png b/subsonic-site/src/main/webapp/inc/img/appstore.png new file mode 100644 index 00000000..0cb660bc Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/appstore.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/available_on_appstore.png b/subsonic-site/src/main/webapp/inc/img/available_on_appstore.png new file mode 100644 index 00000000..c02b588d Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/available_on_appstore.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/banner/android-video.png b/subsonic-site/src/main/webapp/inc/img/banner/android-video.png new file mode 100644 index 00000000..a405faae Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/banner/android-video.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/banner/apps.png b/subsonic-site/src/main/webapp/inc/img/banner/apps.png new file mode 100644 index 00000000..513a9609 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/banner/apps.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/banner/apps.xcf b/subsonic-site/src/main/webapp/inc/img/banner/apps.xcf new file mode 100644 index 00000000..f4c47872 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/banner/apps.xcf differ diff --git a/subsonic-site/src/main/webapp/inc/img/banner/banner-01.jpg b/subsonic-site/src/main/webapp/inc/img/banner/banner-01.jpg new file mode 100644 index 00000000..95301745 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/banner/banner-01.jpg differ diff --git a/subsonic-site/src/main/webapp/inc/img/banner/banner-bg.gif b/subsonic-site/src/main/webapp/inc/img/banner/banner-bg.gif new file mode 100644 index 00000000..f62c250d Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/banner/banner-bg.gif differ diff --git a/subsonic-site/src/main/webapp/inc/img/banner/car.png b/subsonic-site/src/main/webapp/inc/img/banner/car.png new file mode 100644 index 00000000..ed516232 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/banner/car.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/banner/iphone.png b/subsonic-site/src/main/webapp/inc/img/banner/iphone.png new file mode 100644 index 00000000..508e46ae Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/banner/iphone.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/banner/isub1.png b/subsonic-site/src/main/webapp/inc/img/banner/isub1.png new file mode 100644 index 00000000..ac3bd21b Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/banner/isub1.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/banner/next-hover.png b/subsonic-site/src/main/webapp/inc/img/banner/next-hover.png new file mode 100644 index 00000000..461a158a Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/banner/next-hover.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/banner/next.png b/subsonic-site/src/main/webapp/inc/img/banner/next.png new file mode 100644 index 00000000..74319504 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/banner/next.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/banner/prev-hover.png b/subsonic-site/src/main/webapp/inc/img/banner/prev-hover.png new file mode 100644 index 00000000..ac3fd348 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/banner/prev-hover.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/banner/prev.png b/subsonic-site/src/main/webapp/inc/img/banner/prev.png new file mode 100644 index 00000000..46331b14 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/banner/prev.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/banner/screenshot.png b/subsonic-site/src/main/webapp/inc/img/banner/screenshot.png new file mode 100644 index 00000000..25dc44b4 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/banner/screenshot.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/banner/video.png b/subsonic-site/src/main/webapp/inc/img/banner/video.png new file mode 100644 index 00000000..52dd9dd3 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/banner/video.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/banner/wp7.png b/subsonic-site/src/main/webapp/inc/img/banner/wp7.png new file mode 100644 index 00000000..0312d4d7 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/banner/wp7.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/blackberry.png b/subsonic-site/src/main/webapp/inc/img/blackberry.png new file mode 100644 index 00000000..471d4dfe Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/blackberry.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/body-bg.gif b/subsonic-site/src/main/webapp/inc/img/body-bg.gif new file mode 100644 index 00000000..40a631a0 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/body-bg.gif differ diff --git a/subsonic-site/src/main/webapp/inc/img/button-download.png b/subsonic-site/src/main/webapp/inc/img/button-download.png new file mode 100644 index 00000000..dc990cf7 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/button-download.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/change-password-small.png b/subsonic-site/src/main/webapp/inc/img/change-password-small.png new file mode 100644 index 00000000..8b882cb1 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/change-password-small.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/change-password.png b/subsonic-site/src/main/webapp/inc/img/change-password.png new file mode 100644 index 00000000..01fd4679 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/change-password.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/chumby.png b/subsonic-site/src/main/webapp/inc/img/chumby.png new file mode 100644 index 00000000..8d0b683e Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/chumby.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/content-bg.gif b/subsonic-site/src/main/webapp/inc/img/content-bg.gif new file mode 100644 index 00000000..f253c508 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/content-bg.gif differ diff --git a/subsonic-site/src/main/webapp/inc/img/donate.png b/subsonic-site/src/main/webapp/inc/img/donate.png new file mode 100644 index 00000000..3b00577e Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/donate.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/download-fedora.png b/subsonic-site/src/main/webapp/inc/img/download-fedora.png new file mode 100644 index 00000000..4e57200e Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/download-fedora.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/download-linux.png b/subsonic-site/src/main/webapp/inc/img/download-linux.png new file mode 100644 index 00000000..872d802f Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/download-linux.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/download-mac.png b/subsonic-site/src/main/webapp/inc/img/download-mac.png new file mode 100644 index 00000000..509a50b2 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/download-mac.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/download-ubuntu.png b/subsonic-site/src/main/webapp/inc/img/download-ubuntu.png new file mode 100644 index 00000000..3a904dc7 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/download-ubuntu.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/download-windows.png b/subsonic-site/src/main/webapp/inc/img/download-windows.png new file mode 100644 index 00000000..d66f0be3 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/download-windows.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/download_small.gif b/subsonic-site/src/main/webapp/inc/img/download_small.gif new file mode 100644 index 00000000..fa56b595 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/download_small.gif differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/closebox.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/closebox.png new file mode 100644 index 00000000..4de4396d Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/closebox.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/spacer.gif b/subsonic-site/src/main/webapp/inc/img/fancyzoom/spacer.gif new file mode 100644 index 00000000..5bfd67a2 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/spacer.gif differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-fill.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-fill.png new file mode 100644 index 00000000..1e341533 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-fill.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-l.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-l.png new file mode 100644 index 00000000..a63ea481 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-l.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-r.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-r.png new file mode 100644 index 00000000..15980d58 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-caption-r.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow1.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow1.png new file mode 100644 index 00000000..8b48000b Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow1.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow2.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow2.png new file mode 100644 index 00000000..09209f37 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow2.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow3.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow3.png new file mode 100644 index 00000000..7636fec2 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow3.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow4.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow4.png new file mode 100644 index 00000000..c7f148d9 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow4.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow5.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow5.png new file mode 100644 index 00000000..2a75b82a Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow5.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow6.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow6.png new file mode 100644 index 00000000..65801aa0 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow6.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow7.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow7.png new file mode 100644 index 00000000..cb447608 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow7.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow8.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow8.png new file mode 100644 index 00000000..f1c6acdb Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-shadow8.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-1.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-1.png new file mode 100644 index 00000000..5615629c Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-1.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-10.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-10.png new file mode 100644 index 00000000..77595dbd Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-10.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-11.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-11.png new file mode 100644 index 00000000..c2147d56 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-11.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-12.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-12.png new file mode 100644 index 00000000..cf027248 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-12.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-2.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-2.png new file mode 100644 index 00000000..95eaae89 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-2.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-3.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-3.png new file mode 100644 index 00000000..9e2b9cb3 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-3.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-4.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-4.png new file mode 100644 index 00000000..a39c0fc0 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-4.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-5.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-5.png new file mode 100644 index 00000000..80bea63b Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-5.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-6.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-6.png new file mode 100644 index 00000000..b962e5f7 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-6.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-7.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-7.png new file mode 100644 index 00000000..9b6e489f Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-7.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-8.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-8.png new file mode 100644 index 00000000..fe147d5f Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-8.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-9.png b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-9.png new file mode 100644 index 00000000..b321b1c7 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/fancyzoom/zoom-spin-9.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/amy-small.png b/subsonic-site/src/main/webapp/inc/img/features/amy-small.png new file mode 100644 index 00000000..77765178 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/amy-small.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/amy.png b/subsonic-site/src/main/webapp/inc/img/features/amy.png new file mode 100644 index 00000000..9a0a5bbd Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/amy.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/avatar-small.png b/subsonic-site/src/main/webapp/inc/img/features/avatar-small.png new file mode 100644 index 00000000..66a95810 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/avatar-small.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/avatar.png b/subsonic-site/src/main/webapp/inc/img/features/avatar.png new file mode 100644 index 00000000..943c8ff6 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/avatar.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/bbc.png b/subsonic-site/src/main/webapp/inc/img/features/bbc.png new file mode 100644 index 00000000..906f5e27 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/bbc.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/extras.png b/subsonic-site/src/main/webapp/inc/img/features/extras.png new file mode 100644 index 00000000..40369ae9 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/extras.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/extras.xcf b/subsonic-site/src/main/webapp/inc/img/features/extras.xcf new file mode 100644 index 00000000..1e25fcc9 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/extras.xcf differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/flac.png b/subsonic-site/src/main/webapp/inc/img/features/flac.png new file mode 100644 index 00000000..f601d00a Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/flac.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/itunes.png b/subsonic-site/src/main/webapp/inc/img/features/itunes.png new file mode 100644 index 00000000..f0fc1aa8 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/itunes.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/lame.png b/subsonic-site/src/main/webapp/inc/img/features/lame.png new file mode 100644 index 00000000..0e2f79f4 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/lame.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/lame.png.orig b/subsonic-site/src/main/webapp/inc/img/features/lame.png.orig new file mode 100644 index 00000000..0e2f79f4 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/lame.png.orig differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/last-fm.png b/subsonic-site/src/main/webapp/inc/img/features/last-fm.png new file mode 100644 index 00000000..0c92ac2b Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/last-fm.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/logon-small.png b/subsonic-site/src/main/webapp/inc/img/features/logon-small.png new file mode 100644 index 00000000..015cda1c Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/logon-small.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/logon.png b/subsonic-site/src/main/webapp/inc/img/features/logon.png new file mode 100644 index 00000000..01514b8f Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/logon.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/media-support.png b/subsonic-site/src/main/webapp/inc/img/features/media-support.png new file mode 100644 index 00000000..1e15244e Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/media-support.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/media-support.xcf b/subsonic-site/src/main/webapp/inc/img/features/media-support.xcf new file mode 100644 index 00000000..d42e43e4 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/media-support.xcf differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/mp3.png b/subsonic-site/src/main/webapp/inc/img/features/mp3.png new file mode 100644 index 00000000..0ea7c8af Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/mp3.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/mp3.png.orig b/subsonic-site/src/main/webapp/inc/img/features/mp3.png.orig new file mode 100644 index 00000000..0ea7c8af Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/mp3.png.orig differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/nrk.png b/subsonic-site/src/main/webapp/inc/img/features/nrk.png new file mode 100644 index 00000000..cc6986cd Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/nrk.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/personal-settings-small.png b/subsonic-site/src/main/webapp/inc/img/features/personal-settings-small.png new file mode 100644 index 00000000..b1369be0 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/personal-settings-small.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/personal-settings.png b/subsonic-site/src/main/webapp/inc/img/features/personal-settings.png new file mode 100644 index 00000000..398ba2e9 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/personal-settings.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/podcast.png b/subsonic-site/src/main/webapp/inc/img/features/podcast.png new file mode 100644 index 00000000..01a98c64 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/podcast.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/shoutcast.png b/subsonic-site/src/main/webapp/inc/img/features/shoutcast.png new file mode 100644 index 00000000..7d8acd18 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/shoutcast.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/shoutcast.png.orig b/subsonic-site/src/main/webapp/inc/img/features/shoutcast.png.orig new file mode 100644 index 00000000..7d8acd18 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/shoutcast.png.orig differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/wap-small.png b/subsonic-site/src/main/webapp/inc/img/features/wap-small.png new file mode 100644 index 00000000..f41eb81b Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/wap-small.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/wap.png b/subsonic-site/src/main/webapp/inc/img/features/wap.png new file mode 100644 index 00000000..637e52f0 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/wap.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/wikipedia.png b/subsonic-site/src/main/webapp/inc/img/features/wikipedia.png new file mode 100644 index 00000000..39233e28 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/wikipedia.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/wikipedia.png.orig b/subsonic-site/src/main/webapp/inc/img/features/wikipedia.png.orig new file mode 100644 index 00000000..12d0e244 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/wikipedia.png.orig differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/winamp.png b/subsonic-site/src/main/webapp/inc/img/features/winamp.png new file mode 100644 index 00000000..cc35943b Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/winamp.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/winamp.png.orig b/subsonic-site/src/main/webapp/inc/img/features/winamp.png.orig new file mode 100644 index 00000000..cc35943b Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/winamp.png.orig differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/wmp.png b/subsonic-site/src/main/webapp/inc/img/features/wmp.png new file mode 100644 index 00000000..3449e18d Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/wmp.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/features/wmp.png.orig b/subsonic-site/src/main/webapp/inc/img/features/wmp.png.orig new file mode 100644 index 00000000..3449e18d Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/features/wmp.png.orig differ diff --git a/subsonic-site/src/main/webapp/inc/img/footer.gif b/subsonic-site/src/main/webapp/inc/img/footer.gif new file mode 100644 index 00000000..fa269e85 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/footer.gif differ diff --git a/subsonic-site/src/main/webapp/inc/img/gettingstarted/license.png b/subsonic-site/src/main/webapp/inc/img/gettingstarted/license.png new file mode 100644 index 00000000..9dbada3c Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/gettingstarted/license.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/gettingstarted/license_thumb.png b/subsonic-site/src/main/webapp/inc/img/gettingstarted/license_thumb.png new file mode 100644 index 00000000..1a951a91 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/gettingstarted/license_thumb.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/gettingstarted/musicfolders.png b/subsonic-site/src/main/webapp/inc/img/gettingstarted/musicfolders.png new file mode 100644 index 00000000..0b236083 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/gettingstarted/musicfolders.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/gettingstarted/musicfolders_thumb.png b/subsonic-site/src/main/webapp/inc/img/gettingstarted/musicfolders_thumb.png new file mode 100644 index 00000000..620c813c Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/gettingstarted/musicfolders_thumb.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/gigapros.png b/subsonic-site/src/main/webapp/inc/img/gigapros.png new file mode 100644 index 00000000..b5b1f2d3 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/gigapros.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/gpl.png b/subsonic-site/src/main/webapp/inc/img/gpl.png new file mode 100644 index 00000000..b06e0439 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/gpl.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/header.gif b/subsonic-site/src/main/webapp/inc/img/header.gif new file mode 100644 index 00000000..115a5738 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/header.gif differ diff --git a/subsonic-site/src/main/webapp/inc/img/home-rollover.gif b/subsonic-site/src/main/webapp/inc/img/home-rollover.gif new file mode 100644 index 00000000..1f9fc0db Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/home-rollover.gif differ diff --git a/subsonic-site/src/main/webapp/inc/img/itemcontentborder.gif b/subsonic-site/src/main/webapp/inc/img/itemcontentborder.gif new file mode 100644 index 00000000..7e3d252b Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/itemcontentborder.gif differ diff --git a/subsonic-site/src/main/webapp/inc/img/mac-appstore.jpg b/subsonic-site/src/main/webapp/inc/img/mac-appstore.jpg new file mode 100644 index 00000000..6531fd23 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/mac-appstore.jpg differ diff --git a/subsonic-site/src/main/webapp/inc/img/mac-installer-small.png b/subsonic-site/src/main/webapp/inc/img/mac-installer-small.png new file mode 100644 index 00000000..9f07bc9b Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/mac-installer-small.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/mac-installer.png b/subsonic-site/src/main/webapp/inc/img/mac-installer.png new file mode 100644 index 00000000..ca38de3e Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/mac-installer.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/merchandise.png b/subsonic-site/src/main/webapp/inc/img/merchandise.png new file mode 100644 index 00000000..11f94fa8 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/merchandise.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/mpa-nominee.png b/subsonic-site/src/main/webapp/inc/img/mpa-nominee.png new file mode 100644 index 00000000..657f7c88 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/mpa-nominee.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/paypal.gif b/subsonic-site/src/main/webapp/inc/img/paypal.gif new file mode 100644 index 00000000..d017250a Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/paypal.gif differ diff --git a/subsonic-site/src/main/webapp/inc/img/ripserver-small.png b/subsonic-site/src/main/webapp/inc/img/ripserver-small.png new file mode 100644 index 00000000..b220c40d Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/ripserver-small.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/ripserver.png b/subsonic-site/src/main/webapp/inc/img/ripserver.png new file mode 100644 index 00000000..00c58d85 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/ripserver.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen01.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen01.png new file mode 100644 index 00000000..53771adf Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen01.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen02.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen02.png new file mode 100644 index 00000000..e63fa2f4 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen02.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen03.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen03.png new file mode 100644 index 00000000..e4c7ee58 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen03.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen05.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen05.png new file mode 100644 index 00000000..aedc6874 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen05.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen06.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen06.png new file mode 100644 index 00000000..22794dab Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen06.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen07.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen07.png new file mode 100644 index 00000000..a81c3b10 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen07.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen08.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen08.png new file mode 100644 index 00000000..72283443 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen08.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen09.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen09.png new file mode 100644 index 00000000..e8770c62 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen09.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen10.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen10.png new file mode 100644 index 00000000..7595e82d Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen10.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen11.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen11.png new file mode 100644 index 00000000..80074d99 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen11.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen12.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen12.png new file mode 100644 index 00000000..cd979719 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen12.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen13.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen13.png new file mode 100644 index 00000000..f594532a Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen13.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen14.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen14.png new file mode 100644 index 00000000..d2adb422 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen14.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen15.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen15.png new file mode 100644 index 00000000..6bc3b296 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen15.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen16.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen16.png new file mode 100644 index 00000000..db292acb Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen16.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen17.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen17.png new file mode 100644 index 00000000..e42004ba Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen17.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen18.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen18.png new file mode 100644 index 00000000..827f1e8a Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen18.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen19.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen19.png new file mode 100644 index 00000000..1a4b90ad Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen19.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen20.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen20.png new file mode 100644 index 00000000..77f3c426 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen20.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen21.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen21.png new file mode 100644 index 00000000..ab2e645d Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen21.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen22.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen22.png new file mode 100644 index 00000000..8287d2ab Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen22.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen23.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen23.png new file mode 100644 index 00000000..fc5ea59b Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen23.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen24.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen24.png new file mode 100644 index 00000000..bff8ba81 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen24.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen25.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen25.png new file mode 100644 index 00000000..8f09b94c Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen25.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen26.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen26.png new file mode 100644 index 00000000..154c34b0 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen26.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen27.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen27.png new file mode 100644 index 00000000..4233d2f9 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen27.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen28.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen28.png new file mode 100644 index 00000000..1514347b Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen28.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen29.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen29.png new file mode 100644 index 00000000..97826ef6 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen29.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen30.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen30.png new file mode 100644 index 00000000..a1ef9428 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen30.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen31.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen31.png new file mode 100644 index 00000000..3d09bc69 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen31.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen32.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen32.png new file mode 100644 index 00000000..06a1d621 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen32.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen33.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen33.png new file mode 100644 index 00000000..25915c31 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen33.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen34.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen34.png new file mode 100644 index 00000000..6ba7cd35 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen34.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen35.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen35.png new file mode 100644 index 00000000..d4117ba1 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen35.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen36.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen36.png new file mode 100644 index 00000000..d2d06093 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen36.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen37.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen37.png new file mode 100644 index 00000000..607d75ab Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen37.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen38.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen38.png new file mode 100644 index 00000000..04beaca7 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen38.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen39.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen39.png new file mode 100644 index 00000000..64bfa7c2 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen39.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen40.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen40.png new file mode 100644 index 00000000..96023bdd Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen40.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen41.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen41.png new file mode 100644 index 00000000..077783eb Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen41.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen42.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen42.png new file mode 100644 index 00000000..9b1f31e2 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen42.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen43.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen43.png new file mode 100644 index 00000000..2493b601 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen43.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen44.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen44.png new file mode 100644 index 00000000..4ec7d197 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen44.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/screen45.png b/subsonic-site/src/main/webapp/inc/img/screenshots/screen45.png new file mode 100644 index 00000000..f384c93b Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/screen45.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb01.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb01.png new file mode 100644 index 00000000..605383d6 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb01.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb02.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb02.png new file mode 100644 index 00000000..23e9e9f8 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb02.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb03.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb03.png new file mode 100644 index 00000000..8378058d Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb03.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb05.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb05.png new file mode 100644 index 00000000..9c132083 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb05.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb06.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb06.png new file mode 100644 index 00000000..f454486c Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb06.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb07.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb07.png new file mode 100644 index 00000000..a0f4fe5c Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb07.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb08.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb08.png new file mode 100644 index 00000000..ba6b3d6b Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb08.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb09.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb09.png new file mode 100644 index 00000000..2115721e Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb09.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb10.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb10.png new file mode 100644 index 00000000..2a24588d Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb10.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb11.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb11.png new file mode 100644 index 00000000..8444f2ad Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb11.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb12.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb12.png new file mode 100644 index 00000000..fbf03231 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb12.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb13.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb13.png new file mode 100644 index 00000000..cb841be1 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb13.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb14.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb14.png new file mode 100644 index 00000000..529082f6 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb14.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb15.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb15.png new file mode 100644 index 00000000..03396f44 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb15.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb16.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb16.png new file mode 100644 index 00000000..a1b7d033 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb16.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb17.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb17.png new file mode 100644 index 00000000..58deaef7 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb17.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb18.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb18.png new file mode 100644 index 00000000..9fc3f4ec Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb18.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb19.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb19.png new file mode 100644 index 00000000..b06f3834 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb19.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb20.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb20.png new file mode 100644 index 00000000..d5dd2a59 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb20.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb21.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb21.png new file mode 100644 index 00000000..55289db9 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb21.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb22.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb22.png new file mode 100644 index 00000000..55b2f3b9 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb22.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb23.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb23.png new file mode 100644 index 00000000..8d499d53 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb23.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb24.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb24.png new file mode 100644 index 00000000..050d2d1b Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb24.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb25.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb25.png new file mode 100644 index 00000000..40f81c44 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb25.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb27.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb27.png new file mode 100644 index 00000000..ad674590 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb27.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb28.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb28.png new file mode 100644 index 00000000..fae6d77d Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb28.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb29.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb29.png new file mode 100644 index 00000000..249b5d15 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb29.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb30.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb30.png new file mode 100644 index 00000000..ac7610ed Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb30.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb31.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb31.png new file mode 100644 index 00000000..f2d34ebf Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb31.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb33.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb33.png new file mode 100644 index 00000000..944bcc2a Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb33.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb35.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb35.png new file mode 100644 index 00000000..0020c90d Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb35.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb36.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb36.png new file mode 100644 index 00000000..0c819962 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb36.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb37.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb37.png new file mode 100644 index 00000000..67e3142a Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb37.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb38.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb38.png new file mode 100644 index 00000000..b277ec15 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb38.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb39.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb39.png new file mode 100644 index 00000000..2c0c70a2 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb39.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb40.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb40.png new file mode 100644 index 00000000..d92cbf35 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb40.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb41.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb41.png new file mode 100644 index 00000000..7a5aceee Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb41.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb42.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb42.png new file mode 100644 index 00000000..a60200e9 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb42.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb43.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb43.png new file mode 100644 index 00000000..3591d0c0 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb43.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb44.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb44.png new file mode 100644 index 00000000..4ef3276a Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb44.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/screenshots/thumb45.png b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb45.png new file mode 100644 index 00000000..5c49c48d Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/screenshots/thumb45.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/search.png b/subsonic-site/src/main/webapp/inc/img/search.png new file mode 100644 index 00000000..4e522b23 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/search.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/sindre.jpeg b/subsonic-site/src/main/webapp/inc/img/sindre.jpeg new file mode 100644 index 00000000..b3656f39 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/sindre.jpeg differ diff --git a/subsonic-site/src/main/webapp/inc/img/star.png b/subsonic-site/src/main/webapp/inc/img/star.png new file mode 100644 index 00000000..cd2b8bb2 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/star.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/subsonic-forum.png b/subsonic-site/src/main/webapp/inc/img/subsonic-forum.png new file mode 100644 index 00000000..39ba6e6e Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/subsonic-forum.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/subsonic-shop.jpeg b/subsonic-site/src/main/webapp/inc/img/subsonic-shop.jpeg new file mode 100644 index 00000000..6a4dde6a Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/subsonic-shop.jpeg differ diff --git a/subsonic-site/src/main/webapp/inc/img/subsonic-tshirt.png b/subsonic-site/src/main/webapp/inc/img/subsonic-tshirt.png new file mode 100644 index 00000000..730f92cf Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/subsonic-tshirt.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/subsonic.png b/subsonic-site/src/main/webapp/inc/img/subsonic.png new file mode 100644 index 00000000..f2cb2a60 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/subsonic.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/top.gif b/subsonic-site/src/main/webapp/inc/img/top.gif new file mode 100644 index 00000000..a3a18784 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/top.gif differ diff --git a/subsonic-site/src/main/webapp/inc/img/topnav-div.gif b/subsonic-site/src/main/webapp/inc/img/topnav-div.gif new file mode 100644 index 00000000..3a4f7238 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/topnav-div.gif differ diff --git a/subsonic-site/src/main/webapp/inc/img/topnav-hover.gif b/subsonic-site/src/main/webapp/inc/img/topnav-hover.gif new file mode 100644 index 00000000..45547bb1 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/topnav-hover.gif differ diff --git a/subsonic-site/src/main/webapp/inc/img/topnav.gif b/subsonic-site/src/main/webapp/inc/img/topnav.gif new file mode 100644 index 00000000..e5fadeed Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/topnav.gif differ diff --git a/subsonic-site/src/main/webapp/inc/img/ubuntu.png b/subsonic-site/src/main/webapp/inc/img/ubuntu.png new file mode 100644 index 00000000..f707e260 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/ubuntu.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/windows-installer-small.png b/subsonic-site/src/main/webapp/inc/img/windows-installer-small.png new file mode 100644 index 00000000..d33639b4 Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/windows-installer-small.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/windows-installer.png b/subsonic-site/src/main/webapp/inc/img/windows-installer.png new file mode 100644 index 00000000..07bbcf5b Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/windows-installer.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/windows-marketplace.png b/subsonic-site/src/main/webapp/inc/img/windows-marketplace.png new file mode 100644 index 00000000..0d3c18ad Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/windows-marketplace.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/windows7.png b/subsonic-site/src/main/webapp/inc/img/windows7.png new file mode 100644 index 00000000..0559b26e Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/windows7.png differ diff --git a/subsonic-site/src/main/webapp/inc/img/zazeen-ad.gif b/subsonic-site/src/main/webapp/inc/img/zazeen-ad.gif new file mode 100644 index 00000000..45189efe Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/zazeen-ad.gif differ diff --git a/subsonic-site/src/main/webapp/inc/img/zazeen.gif b/subsonic-site/src/main/webapp/inc/img/zazeen.gif new file mode 100644 index 00000000..3fcd454e Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/img/zazeen.gif differ diff --git a/subsonic-site/src/main/webapp/inc/js/FancyZoom.js b/subsonic-site/src/main/webapp/inc/js/FancyZoom.js new file mode 100644 index 00000000..37df0b7b --- /dev/null +++ b/subsonic-site/src/main/webapp/inc/js/FancyZoom.js @@ -0,0 +1,761 @@ +// FancyZoom.js - v1.1 - http://www.fancyzoom.com +// +// Copyright (c) 2008 Cabel Sasser / Panic Inc +// All rights reserved. +// +// Requires: FancyZoomHTML.js +// Instructions: Include JS files in page, call setupZoom() in onLoad. That's it! +// Any links to images will be updated to zoom inline. +// Add rel="nozoom" to your to disable zooming for an image. +// +// Redistribution and use of this effect in source form, with or without modification, +// are permitted provided that the following conditions are met: +// +// * USE OF SOURCE ON COMMERCIAL (FOR-PROFIT) WEBSITE REQUIRES ONE-TIME LICENSE FEE PER DOMAIN. +// Reasonably priced! Visit www.fancyzoom.com for licensing instructions. Thanks! +// +// * Non-commercial (personal) website use is permitted without license/payment! +// +// * Redistribution of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution of source code and derived works cannot be sold without specific +// written prior permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +var includeCaption = true; // Turn on the "caption" feature, and write out the caption HTML +var zoomTime = 5; // Milliseconds between frames of zoom animation +var zoomSteps = 15; // Number of zoom animation frames +var includeFade = 1; // Set to 1 to fade the image in / out as it zooms +var minBorder = 90; // Amount of padding between large, scaled down images, and the window edges +var shadowSettings = '0px 5px 25px rgba(0, 0, 0, '; // Blur, radius, color of shadow for compatible browsers + +var zoomImagesURI = 'inc/img/fancyzoom/'; // Location of the zoom and shadow images + +// Init. Do not add anything below this line, unless it's something awesome. + +var myWidth = 0, myHeight = 0, myScroll = 0; myScrollWidth = 0; myScrollHeight = 0; +var zoomOpen = false, preloadFrame = 1, preloadActive = false, preloadTime = 0, imgPreload = new Image(); +var preloadAnimTimer = 0; + +var zoomActive = new Array(); var zoomTimer = new Array(); +var zoomOrigW = new Array(); var zoomOrigH = new Array(); +var zoomOrigX = new Array(); var zoomOrigY = new Array(); + +var zoomID = "ZoomBox"; +var theID = "ZoomImage"; +var zoomCaption = "ZoomCaption"; +var zoomCaptionDiv = "ZoomCapDiv"; + +if (navigator.userAgent.indexOf("MSIE") != -1) { + var browserIsIE = true; +} + +// Zoom: Setup The Page! Called in your 's onLoad handler. + +function setupZoom() { + prepZooms(); + insertZoomHTML(); + zoomdiv = document.getElementById(zoomID); + zoomimg = document.getElementById(theID); +} + +// Zoom: Inject Javascript functions into hrefs pointing to images, one by one! +// Skip any href that contains a rel="nozoom" tag. +// This is done at page load time via an onLoad() handler. + +function prepZooms() { + if (! document.getElementsByTagName) { + return; + } + var links = document.getElementsByTagName("a"); + for (i = 0; i < links.length; i++) { + if (links[i].getAttribute("href")) { + if (links[i].getAttribute("href").search(/(.*)\.(jpg|jpeg|gif|png|bmp|tif|tiff)/gi) != -1) { + if (links[i].getAttribute("rel") != "nozoom") { + links[i].onclick = function (event) { return zoomClick(this, event); }; + links[i].onmouseover = function () { zoomPreload(this); }; + } + } + } + } +} + +// Zoom: Load an image into an image object. When done loading, function sets preloadActive to false, +// so other bits know that they can proceed with the zoom. +// Preloaded image is stored in imgPreload and swapped out in the zoom function. + +function zoomPreload(from) { + + var theimage = from.getAttribute("href"); + + // Only preload if we have to, i.e. the image isn't this image already + + if (imgPreload.src.indexOf(from.getAttribute("href").substr(from.getAttribute("href").lastIndexOf("/"))) == -1) { + preloadActive = true; + imgPreload = new Image(); + + // Set a function to fire when the preload is complete, setting flags along the way. + + imgPreload.onload = function() { + preloadActive = false; + } + + // Load it! + imgPreload.src = theimage; + } +} + +// Zoom: Start the preloading animation cycle. + +function preloadAnimStart() { + preloadTime = new Date(); + document.getElementById("ZoomSpin").style.left = (myWidth / 2) + 'px'; + document.getElementById("ZoomSpin").style.top = ((myHeight / 2) + myScroll) + 'px'; + document.getElementById("ZoomSpin").style.visibility = "visible"; + preloadFrame = 1; + document.getElementById("SpinImage").src = zoomImagesURI+'zoom-spin-'+preloadFrame+'.png'; + preloadAnimTimer = setInterval("preloadAnim()", 100); +} + +// Zoom: Display and ANIMATE the jibber-jabber widget. Once preloadActive is false, bail and zoom it up! + +function preloadAnim(from) { + if (preloadActive != false) { + document.getElementById("SpinImage").src = zoomImagesURI+'zoom-spin-'+preloadFrame+'.png'; + preloadFrame++; + if (preloadFrame > 12) preloadFrame = 1; + } else { + document.getElementById("ZoomSpin").style.visibility = "hidden"; + clearInterval(preloadAnimTimer); + preloadAnimTimer = 0; + zoomIn(preloadFrom); + } +} + +// ZOOM CLICK: We got a click! Should we do the zoom? Or wait for the preload to complete? +// todo?: Double check that imgPreload src = clicked src + +function zoomClick(from, evt) { + + var shift = getShift(evt); + + // Check for Command / Alt key. If pressed, pass them through -- don't zoom! + if (! evt && window.event && (window.event.metaKey || window.event.altKey)) { + return true; + } else if (evt && (evt.metaKey|| evt.altKey)) { + return true; + } + + // Get browser dimensions + getSize(); + + // If preloading still, wait, and display the spinner. + if (preloadActive == true) { + // But only display the spinner if it's not already being displayed! + if (preloadAnimTimer == 0) { + preloadFrom = from; + preloadAnimStart(); + } + } else { + // Otherwise, we're loaded: do the zoom! + zoomIn(from, shift); + } + + return false; + +} + +// Zoom: Move an element in to endH endW, using zoomHost as a starting point. +// "from" is an object reference to the href that spawned the zoom. + +function zoomIn(from, shift) { + + zoomimg.src = from.getAttribute("href"); + + // Determine the zoom settings from where we came from, the element in the . + // If there's no element in the , or we can't get the width, make stuff up + + if (from.childNodes[0].width) { + startW = from.childNodes[0].width; + startH = from.childNodes[0].height; + startPos = findElementPos(from.childNodes[0]); + } else { + startW = 50; + startH = 12; + startPos = findElementPos(from); + } + + hostX = startPos[0]; + hostY = startPos[1]; + + // Make up for a scrolled containing div. + // TODO: This HAS to move into findElementPos. + + if (document.getElementById('scroller')) { + hostX = hostX - document.getElementById('scroller').scrollLeft; + } + + // Determine the target zoom settings from the preloaded image object + + endW = imgPreload.width; + endH = imgPreload.height; + + // Start! But only if we're not zooming already! + + if (zoomActive[theID] != true) { + + // Clear everything out just in case something is already open + + if (document.getElementById("ShadowBox")) { + document.getElementById("ShadowBox").style.visibility = "hidden"; + } else if (! browserIsIE) { + + // Wipe timer if shadow is fading in still + if (fadeActive["ZoomImage"]) { + clearInterval(fadeTimer["ZoomImage"]); + fadeActive["ZoomImage"] = false; + fadeTimer["ZoomImage"] = false; + } + + document.getElementById("ZoomImage").style.webkitBoxShadow = shadowSettings + '0.0)'; + } + + document.getElementById("ZoomClose").style.visibility = "hidden"; + + // Setup the CAPTION, if existing. Hide it first, set the text. + + if (includeCaption) { + document.getElementById(zoomCaptionDiv).style.visibility = "hidden"; + if (from.getAttribute('title') && includeCaption) { + // Yes, there's a caption, set it up + document.getElementById(zoomCaption).innerHTML = from.getAttribute('title'); + } else { + document.getElementById(zoomCaption).innerHTML = ""; + } + } + + // Store original position in an array for future zoomOut. + + zoomOrigW[theID] = startW; + zoomOrigH[theID] = startH; + zoomOrigX[theID] = hostX; + zoomOrigY[theID] = hostY; + + // Now set the starting dimensions + + zoomimg.style.width = startW + 'px'; + zoomimg.style.height = startH + 'px'; + zoomdiv.style.left = hostX + 'px'; + zoomdiv.style.top = hostY + 'px'; + + // Show the zooming image container, make it invisible + + if (includeFade == 1) { + setOpacity(0, zoomID); + } + zoomdiv.style.visibility = "visible"; + + // If it's too big to fit in the window, shrink the width and height to fit (with ratio). + + sizeRatio = endW / endH; + if (endW > myWidth - minBorder) { + endW = myWidth - minBorder; + endH = endW / sizeRatio; + } + if (endH > myHeight - minBorder) { + endH = myHeight - minBorder; + endW = endH * sizeRatio; + } + + zoomChangeX = ((myWidth / 2) - (endW / 2) - hostX); + zoomChangeY = (((myHeight / 2) - (endH / 2) - hostY) + myScroll); + zoomChangeW = (endW - startW); + zoomChangeH = (endH - startH); + + // Shift key? + + if (shift) { + tempSteps = zoomSteps * 7; + } else { + tempSteps = zoomSteps; + } + + // Setup Zoom + + zoomCurrent = 0; + + // Setup Fade with Zoom, If Requested + + if (includeFade == 1) { + fadeCurrent = 0; + fadeAmount = (0 - 100) / tempSteps; + } else { + fadeAmount = 0; + } + + // Do It! + + zoomTimer[theID] = setInterval("zoomElement('"+zoomID+"', '"+theID+"', "+zoomCurrent+", "+startW+", "+zoomChangeW+", "+startH+", "+zoomChangeH+", "+hostX+", "+zoomChangeX+", "+hostY+", "+zoomChangeY+", "+tempSteps+", "+includeFade+", "+fadeAmount+", 'zoomDoneIn(zoomID)')", zoomTime); + zoomActive[theID] = true; + } +} + +// Zoom it back out. + +function zoomOut(from, evt) { + + // Get shift key status. + // IE events don't seem to get passed through the function, so grab it from the window. + + if (getShift(evt)) { + tempSteps = zoomSteps * 7; + } else { + tempSteps = zoomSteps; + } + + // Check to see if something is happening/open + + if (zoomActive[theID] != true) { + + // First, get rid of the shadow if necessary. + + if (document.getElementById("ShadowBox")) { + document.getElementById("ShadowBox").style.visibility = "hidden"; + } else if (! browserIsIE) { + + // Wipe timer if shadow is fading in still + if (fadeActive["ZoomImage"]) { + clearInterval(fadeTimer["ZoomImage"]); + fadeActive["ZoomImage"] = false; + fadeTimer["ZoomImage"] = false; + } + + document.getElementById("ZoomImage").style.webkitBoxShadow = shadowSettings + '0.0)'; + } + + // ..and the close box... + + document.getElementById("ZoomClose").style.visibility = "hidden"; + + // ...and the caption if necessary! + + if (includeCaption && document.getElementById(zoomCaption).innerHTML != "") { + // fadeElementSetup(zoomCaptionDiv, 100, 0, 5, 1); + document.getElementById(zoomCaptionDiv).style.visibility = "hidden"; + } + + // Now, figure out where we came from, to get back there + + startX = parseInt(zoomdiv.style.left); + startY = parseInt(zoomdiv.style.top); + startW = zoomimg.width; + startH = zoomimg.height; + zoomChangeX = zoomOrigX[theID] - startX; + zoomChangeY = zoomOrigY[theID] - startY; + zoomChangeW = zoomOrigW[theID] - startW; + zoomChangeH = zoomOrigH[theID] - startH; + + // Setup Zoom + + zoomCurrent = 0; + + // Setup Fade with Zoom, If Requested + + if (includeFade == 1) { + fadeCurrent = 0; + fadeAmount = (100 - 0) / tempSteps; + } else { + fadeAmount = 0; + } + + // Do It! + + zoomTimer[theID] = setInterval("zoomElement('"+zoomID+"', '"+theID+"', "+zoomCurrent+", "+startW+", "+zoomChangeW+", "+startH+", "+zoomChangeH+", "+startX+", "+zoomChangeX+", "+startY+", "+zoomChangeY+", "+tempSteps+", "+includeFade+", "+fadeAmount+", 'zoomDone(zoomID, theID)')", zoomTime); + zoomActive[theID] = true; + } +} + +// Finished Zooming In + +function zoomDoneIn(zoomdiv, theID) { + + // Note that it's open + + zoomOpen = true; + zoomdiv = document.getElementById(zoomdiv); + + // Position the table shadow behind the zoomed in image, and display it + + if (document.getElementById("ShadowBox")) { + + setOpacity(0, "ShadowBox"); + shadowdiv = document.getElementById("ShadowBox"); + + shadowLeft = parseInt(zoomdiv.style.left) - 13; + shadowTop = parseInt(zoomdiv.style.top) - 8; + shadowWidth = zoomdiv.offsetWidth + 26; + shadowHeight = zoomdiv.offsetHeight + 26; + + shadowdiv.style.width = shadowWidth + 'px'; + shadowdiv.style.height = shadowHeight + 'px'; + shadowdiv.style.left = shadowLeft + 'px'; + shadowdiv.style.top = shadowTop + 'px'; + + document.getElementById("ShadowBox").style.visibility = "visible"; + fadeElementSetup("ShadowBox", 0, 100, 5); + + } else if (! browserIsIE) { + // Or, do a fade of the modern shadow + fadeElementSetup("ZoomImage", 0, .8, 5, 0, "shadow"); + } + + // Position and display the CAPTION, if existing + + if (includeCaption && document.getElementById(zoomCaption).innerHTML != "") { + // setOpacity(0, zoomCaptionDiv); + zoomcapd = document.getElementById(zoomCaptionDiv); + zoomcapd.style.top = parseInt(zoomdiv.style.top) + (zoomdiv.offsetHeight + 15) + 'px'; + zoomcapd.style.left = (myWidth / 2) - (zoomcapd.offsetWidth / 2) + 'px'; + zoomcapd.style.visibility = "visible"; + // fadeElementSetup(zoomCaptionDiv, 0, 100, 5); + } + + // Display Close Box (fade it if it's not IE) + + if (!browserIsIE) setOpacity(0, "ZoomClose"); + document.getElementById("ZoomClose").style.visibility = "visible"; + if (!browserIsIE) fadeElementSetup("ZoomClose", 0, 100, 5); + + // Get keypresses + document.onkeypress = getKey; + +} + +// Finished Zooming Out + +function zoomDone(zoomdiv, theID) { + + // No longer open + + zoomOpen = false; + + // Clear stuff out, clean up + + zoomOrigH[theID] = ""; + zoomOrigW[theID] = ""; + document.getElementById(zoomdiv).style.visibility = "hidden"; + zoomActive[theID] == false; + + // Stop getting keypresses + + document.onkeypress = null; + +} + +// Actually zoom the element + +function zoomElement(zoomdiv, theID, zoomCurrent, zoomStartW, zoomChangeW, zoomStartH, zoomChangeH, zoomStartX, zoomChangeX, zoomStartY, zoomChangeY, zoomSteps, includeFade, fadeAmount, execWhenDone) { + + // console.log("Zooming Step #"+zoomCurrent+ " of "+zoomSteps+" (zoom " + zoomStartW + "/" + zoomChangeW + ") (zoom " + zoomStartH + "/" + zoomChangeH + ") (zoom " + zoomStartX + "/" + zoomChangeX + ") (zoom " + zoomStartY + "/" + zoomChangeY + ") Fade: "+fadeAmount); + + // Test if we're done, or if we continue + + if (zoomCurrent == (zoomSteps + 1)) { + zoomActive[theID] = false; + clearInterval(zoomTimer[theID]); + + if (execWhenDone != "") { + eval(execWhenDone); + } + } else { + + // Do the Fade! + + if (includeFade == 1) { + if (fadeAmount < 0) { + setOpacity(Math.abs(zoomCurrent * fadeAmount), zoomdiv); + } else { + setOpacity(100 - (zoomCurrent * fadeAmount), zoomdiv); + } + } + + // Calculate this step's difference, and move it! + + moveW = cubicInOut(zoomCurrent, zoomStartW, zoomChangeW, zoomSteps); + moveH = cubicInOut(zoomCurrent, zoomStartH, zoomChangeH, zoomSteps); + moveX = cubicInOut(zoomCurrent, zoomStartX, zoomChangeX, zoomSteps); + moveY = cubicInOut(zoomCurrent, zoomStartY, zoomChangeY, zoomSteps); + + document.getElementById(zoomdiv).style.left = moveX + 'px'; + document.getElementById(zoomdiv).style.top = moveY + 'px'; + zoomimg.style.width = moveW + 'px'; + zoomimg.style.height = moveH + 'px'; + + zoomCurrent++; + + clearInterval(zoomTimer[theID]); + zoomTimer[theID] = setInterval("zoomElement('"+zoomdiv+"', '"+theID+"', "+zoomCurrent+", "+zoomStartW+", "+zoomChangeW+", "+zoomStartH+", "+zoomChangeH+", "+zoomStartX+", "+zoomChangeX+", "+zoomStartY+", "+zoomChangeY+", "+zoomSteps+", "+includeFade+", "+fadeAmount+", '"+execWhenDone+"')", zoomTime); + } +} + +// Zoom Utility: Get Key Press when image is open, and act accordingly + +function getKey(evt) { + if (! evt) { + theKey = event.keyCode; + } else { + theKey = evt.keyCode; + } + + if (theKey == 27) { // ESC + zoomOut(this, evt); + } +} + +//////////////////////////// +// +// FADE Functions +// + +function fadeOut(elem) { + if (elem.id) { + fadeElementSetup(elem.id, 100, 0, 10); + } +} + +function fadeIn(elem) { + if (elem.id) { + fadeElementSetup(elem.id, 0, 100, 10); + } +} + +// Fade: Initialize the fade function + +var fadeActive = new Array(); +var fadeQueue = new Array(); +var fadeTimer = new Array(); +var fadeClose = new Array(); +var fadeMode = new Array(); + +function fadeElementSetup(theID, fdStart, fdEnd, fdSteps, fdClose, fdMode) { + + // alert("Fading: "+theID+" Steps: "+fdSteps+" Mode: "+fdMode); + + if (fadeActive[theID] == true) { + // Already animating, queue up this command + fadeQueue[theID] = new Array(theID, fdStart, fdEnd, fdSteps); + } else { + fadeSteps = fdSteps; + fadeCurrent = 0; + fadeAmount = (fdStart - fdEnd) / fadeSteps; + fadeTimer[theID] = setInterval("fadeElement('"+theID+"', '"+fadeCurrent+"', '"+fadeAmount+"', '"+fadeSteps+"')", 15); + fadeActive[theID] = true; + fadeMode[theID] = fdMode; + + if (fdClose == 1) { + fadeClose[theID] = true; + } else { + fadeClose[theID] = false; + } + } +} + +// Fade: Do the fade. This function will call itself, modifying the parameters, so +// many instances can run concurrently. Can fade using opacity, or fade using a box-shadow. + +function fadeElement(theID, fadeCurrent, fadeAmount, fadeSteps) { + + if (fadeCurrent == fadeSteps) { + + // We're done, so clear. + + clearInterval(fadeTimer[theID]); + fadeActive[theID] = false; + fadeTimer[theID] = false; + + // Should we close it once the fade is complete? + + if (fadeClose[theID] == true) { + document.getElementById(theID).style.visibility = "hidden"; + } + + // Hang on.. did a command queue while we were working? If so, make it happen now + + if (fadeQueue[theID] && fadeQueue[theID] != false) { + fadeElementSetup(fadeQueue[theID][0], fadeQueue[theID][1], fadeQueue[theID][2], fadeQueue[theID][3]); + fadeQueue[theID] = false; + } + } else { + + fadeCurrent++; + + // Now actually do the fade adjustment. + + if (fadeMode[theID] == "shadow") { + + // Do a special fade on the webkit-box-shadow of the object + + if (fadeAmount < 0) { + document.getElementById(theID).style.webkitBoxShadow = shadowSettings + (Math.abs(fadeCurrent * fadeAmount)) + ')'; + } else { + document.getElementById(theID).style.webkitBoxShadow = shadowSettings + (100 - (fadeCurrent * fadeAmount)) + ')'; + } + + } else { + + // Set the opacity depending on if we're adding or subtracting (pos or neg) + + if (fadeAmount < 0) { + setOpacity(Math.abs(fadeCurrent * fadeAmount), theID); + } else { + setOpacity(100 - (fadeCurrent * fadeAmount), theID); + } + } + + // Keep going, and send myself the updated variables + clearInterval(fadeTimer[theID]); + fadeTimer[theID] = setInterval("fadeElement('"+theID+"', '"+fadeCurrent+"', '"+fadeAmount+"', '"+fadeSteps+"')", 15); + } +} + +//////////////////////////// +// +// UTILITY functions +// + +// Utility: Set the opacity, compatible with a number of browsers. Value from 0 to 100. + +function setOpacity(opacity, theID) { + + var object = document.getElementById(theID).style; + + // If it's 100, set it to 99 for Firefox. + + if (navigator.userAgent.indexOf("Firefox") != -1) { + if (opacity == 100) { opacity = 99.9999; } // This is majorly awkward + } + + // Multi-browser opacity setting + + object.filter = "alpha(opacity=" + opacity + ")"; // IE/Win + object.opacity = (opacity / 100); // Safari 1.2, Firefox+Mozilla + +} + +// Utility: Math functions for animation calucations - From http://www.robertpenner.com/easing/ +// +// t = time, b = begin, c = change, d = duration +// time = current frame, begin is fixed, change is basically finish - begin, duration is fixed (frames), + +function linear(t, b, c, d) +{ + return c*t/d + b; +} + +function sineInOut(t, b, c, d) +{ + return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; +} + +function cubicIn(t, b, c, d) { + return c*(t/=d)*t*t + b; +} + +function cubicOut(t, b, c, d) { + return c*((t=t/d-1)*t*t + 1) + b; +} + +function cubicInOut(t, b, c, d) +{ + if ((t/=d/2) < 1) return c/2*t*t*t + b; + return c/2*((t-=2)*t*t + 2) + b; +} + +function bounceOut(t, b, c, d) +{ + if ((t/=d) < (1/2.75)){ + return c*(7.5625*t*t) + b; + } else if (t < (2/2.75)){ + return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + } else if (t < (2.5/2.75)){ + return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + } else { + return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + } +} + + +// Utility: Get the size of the window, and set myWidth and myHeight +// Credit to quirksmode.org + +function getSize() { + + // Window Size + + if (self.innerHeight) { // Everyone but IE + myWidth = window.innerWidth; + myHeight = window.innerHeight; + myScroll = window.pageYOffset; + } else if (document.documentElement && document.documentElement.clientHeight) { // IE6 Strict + myWidth = document.documentElement.clientWidth; + myHeight = document.documentElement.clientHeight; + myScroll = document.documentElement.scrollTop; + } else if (document.body) { // Other IE, such as IE7 + myWidth = document.body.clientWidth; + myHeight = document.body.clientHeight; + myScroll = document.body.scrollTop; + } + + // Page size w/offscreen areas + + if (window.innerHeight && window.scrollMaxY) { + myScrollWidth = document.body.scrollWidth; + myScrollHeight = window.innerHeight + window.scrollMaxY; + } else if (document.body.scrollHeight > document.body.offsetHeight) { // All but Explorer Mac + myScrollWidth = document.body.scrollWidth; + myScrollHeight = document.body.scrollHeight; + } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari + myScrollWidth = document.body.offsetWidth; + myScrollHeight = document.body.offsetHeight; + } +} + +// Utility: Get Shift Key Status +// IE events don't seem to get passed through the function, so grab it from the window. + +function getShift(evt) { + var shift = false; + if (! evt && window.event) { + shift = window.event.shiftKey; + } else if (evt) { + shift = evt.shiftKey; + if (shift) evt.stopPropagation(); // Prevents Firefox from doing shifty things + } + return shift; +} + +// Utility: Find the Y position of an element on a page. Return Y and X as an array + +function findElementPos(elemFind) +{ + var elemX = 0; + var elemY = 0; + do { + elemX += elemFind.offsetLeft; + elemY += elemFind.offsetTop; + } while ( elemFind = elemFind.offsetParent ) + + return Array(elemX, elemY); +} \ No newline at end of file diff --git a/subsonic-site/src/main/webapp/inc/js/FancyZoomHTML.js b/subsonic-site/src/main/webapp/inc/js/FancyZoomHTML.js new file mode 100644 index 00000000..7644a9a8 --- /dev/null +++ b/subsonic-site/src/main/webapp/inc/js/FancyZoomHTML.js @@ -0,0 +1,318 @@ +// FancyZoomHTML.js - v1.0 +// Used to draw necessary HTML elements for FancyZoom +// +// Copyright (c) 2008 Cabel Sasser / Panic Inc +// All rights reserved. + +function insertZoomHTML() { + + // All of this junk creates the three
's used to hold the closebox, image, and zoom shadow. + + var inBody = document.getElementsByTagName("body").item(0); + + // WAIT SPINNER + + var inSpinbox = document.createElement("div"); + inSpinbox.setAttribute('id', 'ZoomSpin'); + inSpinbox.style.position = 'absolute'; + inSpinbox.style.left = '10px'; + inSpinbox.style.top = '10px'; + inSpinbox.style.visibility = 'hidden'; + inSpinbox.style.zIndex = '525'; + inBody.insertBefore(inSpinbox, inBody.firstChild); + + var inSpinImage = document.createElement("img"); + inSpinImage.setAttribute('id', 'SpinImage'); + inSpinImage.setAttribute('src', zoomImagesURI+'zoom-spin-1.png'); + inSpinbox.appendChild(inSpinImage); + + // ZOOM IMAGE + // + //
+ // + //
+ // + //
+ //
+ + var inZoombox = document.createElement("div"); + inZoombox.setAttribute('id', 'ZoomBox'); + + inZoombox.style.position = 'absolute'; + inZoombox.style.left = '10px'; + inZoombox.style.top = '10px'; + inZoombox.style.visibility = 'hidden'; + inZoombox.style.zIndex = '499'; + + inBody.insertBefore(inZoombox, inSpinbox.nextSibling); + + var inImage1 = document.createElement("img"); + inImage1.onclick = function (event) { zoomOut(this, event); return false; }; + inImage1.setAttribute('src',zoomImagesURI+'spacer.gif'); + inImage1.setAttribute('id','ZoomImage'); + inImage1.setAttribute('border', '0'); + // inImage1.setAttribute('onMouseOver', 'zoomMouseOver();') + // inImage1.setAttribute('onMouseOut', 'zoomMouseOut();') + + // This must be set first, so we can later test it using webkitBoxShadow. + inImage1.setAttribute('style', '-webkit-box-shadow: '+shadowSettings+'0.0)'); + inImage1.style.display = 'block'; + inImage1.style.width = '10px'; + inImage1.style.height = '10px'; + inImage1.style.cursor = 'pointer'; // -webkit-zoom-out? + inZoombox.appendChild(inImage1); + + var inClosebox = document.createElement("div"); + inClosebox.setAttribute('id', 'ZoomClose'); + inClosebox.style.position = 'absolute'; + + // In MSIE, we need to put the close box inside the image. + // It's 2008 and I'm having to do a browser detect? Sigh. + if (browserIsIE) { + inClosebox.style.left = '-1px'; + inClosebox.style.top = '0px'; + } else { + inClosebox.style.left = '-15px'; + inClosebox.style.top = '-15px'; + } + + inClosebox.style.visibility = 'hidden'; + inZoombox.appendChild(inClosebox); + + var inImage2 = document.createElement("img"); + inImage2.onclick = function (event) { zoomOut(this, event); return false; }; + inImage2.setAttribute('src',zoomImagesURI+'closebox.png'); + inImage2.setAttribute('width','30'); + inImage2.setAttribute('height','30'); + inImage2.setAttribute('border','0'); + inImage2.style.cursor = 'pointer'; + inClosebox.appendChild(inImage2); + + // SHADOW + // Only draw the table-based shadow if the programatic webkitBoxShadow fails! + // Also, don't draw it if we're IE -- it wouldn't look quite right anyway. + + if (! document.getElementById('ZoomImage').style.webkitBoxShadow && ! browserIsIE) { + + // SHADOW BASE + + var inFixedBox = document.createElement("div"); + inFixedBox.setAttribute('id', 'ShadowBox'); + inFixedBox.style.position = 'absolute'; + inFixedBox.style.left = '50px'; + inFixedBox.style.top = '50px'; + inFixedBox.style.width = '100px'; + inFixedBox.style.height = '100px'; + inFixedBox.style.visibility = 'hidden'; + inFixedBox.style.zIndex = '498'; + inBody.insertBefore(inFixedBox, inZoombox.nextSibling); + + // SHADOW + // Now, the shadow table. Skip if not compatible, or irrevelant with -box-shadow. + + //
X + // + // + // + // + // + + var inShadowTable = document.createElement("table"); + inShadowTable.setAttribute('border', '0'); + inShadowTable.setAttribute('width', '100%'); + inShadowTable.setAttribute('height', '100%'); + inShadowTable.setAttribute('cellpadding', '0'); + inShadowTable.setAttribute('cellspacing', '0'); + inFixedBox.appendChild(inShadowTable); + + var inShadowTbody = document.createElement("tbody"); // Needed for IE (for HTML4). + inShadowTable.appendChild(inShadowTbody); + + var inRow1 = document.createElement("tr"); + inRow1.style.height = '25px'; + inShadowTbody.appendChild(inRow1); + + var inCol1 = document.createElement("td"); + inCol1.style.width = '27px'; + inRow1.appendChild(inCol1); + var inShadowImg1 = document.createElement("img"); + inShadowImg1.setAttribute('src', zoomImagesURI+'zoom-shadow1.png'); + inShadowImg1.setAttribute('width', '27'); + inShadowImg1.setAttribute('height', '25'); + inShadowImg1.style.display = 'block'; + inCol1.appendChild(inShadowImg1); + + var inCol2 = document.createElement("td"); + inCol2.setAttribute('background', zoomImagesURI+'zoom-shadow2.png'); + inRow1.appendChild(inCol2); + // inCol2.innerHTML = ' + // + // + // + // + + inRow2 = document.createElement("tr"); + inShadowTbody.appendChild(inRow2); + + var inCol4 = document.createElement("td"); + inCol4.setAttribute('background', zoomImagesURI+'zoom-shadow4.png'); + inRow2.appendChild(inCol4); + // inCol4.innerHTML = ' '; + var inSpacer2 = document.createElement("img"); + inSpacer2.setAttribute('src',zoomImagesURI+'spacer.gif'); + inSpacer2.setAttribute('height', '1'); + inSpacer2.setAttribute('width', '1'); + inSpacer2.style.display = 'block'; + inCol4.appendChild(inSpacer2); + + var inCol5 = document.createElement("td"); + inCol5.setAttribute('bgcolor', '#ffffff'); + inRow2.appendChild(inCol5); + // inCol5.innerHTML = ' '; + var inSpacer3 = document.createElement("img"); + inSpacer3.setAttribute('src',zoomImagesURI+'spacer.gif'); + inSpacer3.setAttribute('height', '1'); + inSpacer3.setAttribute('width', '1'); + inSpacer3.style.display = 'block'; + inCol5.appendChild(inSpacer3); + + var inCol6 = document.createElement("td"); + inCol6.setAttribute('background', zoomImagesURI+'zoom-shadow5.png'); + inRow2.appendChild(inCol6); + // inCol6.innerHTML = ' '; + var inSpacer4 = document.createElement("img"); + inSpacer4.setAttribute('src',zoomImagesURI+'spacer.gif'); + inSpacer4.setAttribute('height', '1'); + inSpacer4.setAttribute('width', '1'); + inSpacer4.style.display = 'block'; + inCol6.appendChild(inSpacer4); + + // + // + // + // + //
 
   
+ //  
+ + var inRow3 = document.createElement("tr"); + inRow3.style.height = '26px'; + inShadowTbody.appendChild(inRow3); + + var inCol7 = document.createElement("td"); + inCol7.style.width = '27px'; + inRow3.appendChild(inCol7); + var inShadowImg7 = document.createElement("img"); + inShadowImg7.setAttribute('src', zoomImagesURI+'zoom-shadow6.png'); + inShadowImg7.setAttribute('width', '27'); + inShadowImg7.setAttribute('height', '26'); + inShadowImg7.style.display = 'block'; + inCol7.appendChild(inShadowImg7); + + var inCol8 = document.createElement("td"); + inCol8.setAttribute('background', zoomImagesURI+'zoom-shadow7.png'); + inRow3.appendChild(inCol8); + // inCol8.innerHTML = ' '; + var inSpacer5 = document.createElement("img"); + inSpacer5.setAttribute('src',zoomImagesURI+'spacer.gif'); + inSpacer5.setAttribute('height', '1'); + inSpacer5.setAttribute('width', '1'); + inSpacer5.style.display = 'block'; + inCol8.appendChild(inSpacer5); + + var inCol9 = document.createElement("td"); + inCol9.style.width = '27px'; + inRow3.appendChild(inCol9); + var inShadowImg9 = document.createElement("img"); + inShadowImg9.setAttribute('src', zoomImagesURI+'zoom-shadow8.png'); + inShadowImg9.setAttribute('width', '27'); + inShadowImg9.setAttribute('height', '26'); + inShadowImg9.style.display = 'block'; + inCol9.appendChild(inShadowImg9); + } + + if (includeCaption) { + + // CAPTION + // + //
+ // + // + // + // + // + // + //
+ //
+ + var inCapDiv = document.createElement("div"); + inCapDiv.setAttribute('id', 'ZoomCapDiv'); + inCapDiv.style.position = 'absolute'; + inCapDiv.style.visibility = 'hidden'; + inCapDiv.style.marginLeft = 'auto'; + inCapDiv.style.marginRight = 'auto'; + inCapDiv.style.zIndex = '501'; + + inBody.insertBefore(inCapDiv, inZoombox.nextSibling); + + var inCapTable = document.createElement("table"); + inCapTable.setAttribute('border', '0'); + inCapTable.setAttribute('cellPadding', '0'); // Wow. These honestly need to + inCapTable.setAttribute('cellSpacing', '0'); // be intercapped to work in IE. WTF? + inCapDiv.appendChild(inCapTable); + + var inTbody = document.createElement("tbody"); // Needed for IE (for HTML4). + inCapTable.appendChild(inTbody); + + var inCapRow1 = document.createElement("tr"); + inTbody.appendChild(inCapRow1); + + var inCapCol1 = document.createElement("td"); + inCapCol1.setAttribute('align', 'right'); + inCapRow1.appendChild(inCapCol1); + var inCapImg1 = document.createElement("img"); + inCapImg1.setAttribute('src', zoomImagesURI+'zoom-caption-l.png'); + inCapImg1.setAttribute('width', '13'); + inCapImg1.setAttribute('height', '26'); + inCapImg1.style.display = 'block'; + inCapCol1.appendChild(inCapImg1); + + var inCapCol2 = document.createElement("td"); + inCapCol2.setAttribute('background', zoomImagesURI+'zoom-caption-fill.png'); + inCapCol2.setAttribute('id', 'ZoomCaption'); + inCapCol2.setAttribute('valign', 'middle'); + inCapCol2.style.fontSize = '14px'; + inCapCol2.style.fontFamily = 'Helvetica'; + inCapCol2.style.fontWeight = 'bold'; + inCapCol2.style.color = '#ffffff'; + inCapCol2.style.textShadow = '0px 2px 4px #000000'; + inCapCol2.style.whiteSpace = 'nowrap'; + inCapRow1.appendChild(inCapCol2); + + var inCapCol3 = document.createElement("td"); + inCapRow1.appendChild(inCapCol3); + var inCapImg2 = document.createElement("img"); + inCapImg2.setAttribute('src', zoomImagesURI+'zoom-caption-r.png'); + inCapImg2.setAttribute('width', '13'); + inCapImg2.setAttribute('height', '26'); + inCapImg2.style.display = 'block'; + inCapCol3.appendChild(inCapImg2); + } +} \ No newline at end of file diff --git a/subsonic-site/src/main/webapp/inc/js/jquery-1.4.4.min.js b/subsonic-site/src/main/webapp/inc/js/jquery-1.4.4.min.js new file mode 100644 index 00000000..8f3ca2e2 --- /dev/null +++ b/subsonic-site/src/main/webapp/inc/js/jquery-1.4.4.min.js @@ -0,0 +1,167 @@ +/*! + * jQuery JavaScript Library v1.4.4 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Nov 11 19:04:53 2010 -0500 + */ +(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h= +h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;kd)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La, +"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this, +e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a, +"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+ +a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/, +C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j, +s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this, +j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length}, +toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j=== +-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false; +if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload", +b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&& +!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&& +l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H
a";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"), +k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false, +scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent= +false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom= +1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="
";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="
t
";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display= +"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h= +c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando); +else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one"; +if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true}, +attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&& +b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0}; +c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem, +arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid= +d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+ +c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType=== +8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k=== +"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+ +d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired= +B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type=== +"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]=== +0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}}); +(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3]; +break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr, +q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h= +l;g.sort(w);if(h)for(var i=1;i0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n, +m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled=== +true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"=== +g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return in[3]-0},nth:function(g,i,n){return n[3]- +0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()=== +i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]]; +if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m, +g);else if(typeof g.length==="number")for(var p=g.length;n";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g); +n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&& +function(){var g=k,i=t.createElement("div");i.innerHTML="

";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F|| +p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g= +t.createElement("div");g.innerHTML="
";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition? +function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n0)for(var h=d;h0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h= +h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context): +c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a, +2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a, +b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&& +e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/\s]+\/)>/g,P={option:[1, +""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div
","
"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= +c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, +wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, +prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, +this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); +return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null; +else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1>");try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append", +prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument|| +b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]===""&&!x?r.childNodes:[];for(o=k.length- +1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script")))); +d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i, +jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true, +zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b), +h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b); +if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f= +d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left; +e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/)<[^<]*)*<\/script>/gi, +ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b=== +"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("
").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&& +!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})}, +getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html", +script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data|| +!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache= +false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset; +A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type", +b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&& +c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d|| +c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]= +encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess", +[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"), +e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}}); +if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show", +3),a,b,d);else{d=0;for(var e=this.length;d=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b, +d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a* +Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)} +var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true; +this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide|| +this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a= +c.timers,b=0;b-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a, +e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&& +c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase(); +c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+ +b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window); diff --git a/subsonic-site/src/main/webapp/inc/video/subsonic-medium.jpg b/subsonic-site/src/main/webapp/inc/video/subsonic-medium.jpg new file mode 100644 index 00000000..799ba92a Binary files /dev/null and b/subsonic-site/src/main/webapp/inc/video/subsonic-medium.jpg differ diff --git a/subsonic-site/src/main/webapp/index.html b/subsonic-site/src/main/webapp/index.html new file mode 100644 index 00000000..372f74d1 --- /dev/null +++ b/subsonic-site/src/main/webapp/index.html @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/subsonic-site/src/main/webapp/index.jsp b/subsonic-site/src/main/webapp/index.jsp new file mode 100644 index 00000000..94ffd395 --- /dev/null +++ b/subsonic-site/src/main/webapp/index.jsp @@ -0,0 +1,120 @@ + + + +<%! String current = "home"; %> +<%@ include file="header.jsp" %> + + + + + +
+<%@ include file="menu.jsp" %> +<%@ include file="banner.jsp" %> + +
+
+

Welcome to Subsonic!

+ +
+ +
    +
  • Convert and stream lossless music on the fly.
  • +
  • Manage 100,000+ files in your music collection without hassle.
  • +
  • Download and listen to Podcasts.
  • +
  • Get cover art, lyrics, reviews and other album info from Google, Chartlyrics, + allmusic and Wikipedia.
  • +
  • Plus much more...
  • +
+
+ +
+
What is Subsonic?
+
+
+ +

+ Subsonic is a free, web-based media streamer, providing ubiquitous access to your music. + Use it to share your music with friends, or to listen to your own music while at work. You can + stream to multiple players simultaneously, for instance to one player in your kitchen and another in + your living room. +

+ + + +

+ Subsonic is designed to handle very large music collections (hundreds of gigabytes). + Although optimized for MP3 streaming, it works for any audio or video format that can stream over HTTP, + for instance AAC and OGG. By using transcoder plug-ins, Subsonic supports + on-the-fly conversion and streaming of virtually any audio format, including WMA, FLAC, APE, Musepack, + WavPack and Shorten. +

+ +

+ If you have constrained bandwidth, you may set an upper limit for the bitrate of the music streams. + Subsonic will then automatically resample the music to a suitable bitrate. +

+ +

+ In addition to being a streaming media server, Subsonic works very well as a local jukebox. The + intuitive web interface, as well as search and index facilities, are optimized for efficient browsing through large + media libraries. Subsonic also comes with an integrated Podcast receiver, with many of the same features + as you find in iTunes. +

+ +

+ Based on Java technology, Subsonic runs on most platforms, including Windows, Mac, Linux and Unix variants. +

+ + GPL + +

+ Subsonic is open-source software licensed under GPL. +

+ +
+
+
+ +
+
About
+
+
+

+ Sindre Mehus + Subsonic is developed by Sindre Mehus. + I live in Oslo, Norway and work as a Java software consultant. +

+

+ If you have any questions, comments or suggestions for improvements, please visit the Subsonic Forum. +

+
+
+
+
+ +
+ <%@ include file="google-translate.jsp" %> + <%@ include file="download-subsonic.jsp" %> + <%@ include file="quotes.jsp" %> + <%@ include file="donate.jsp" %> +
+ SourceForge.net +
+
+
+
+
+
+<%@ include file="footer.jsp" %> +
+ + + + diff --git a/subsonic-site/src/main/webapp/installation.jsp b/subsonic-site/src/main/webapp/installation.jsp new file mode 100644 index 00000000..9a477dc1 --- /dev/null +++ b/subsonic-site/src/main/webapp/installation.jsp @@ -0,0 +1,278 @@ + + + +<%! String current = "installation"; %> +<%@ include file="header.jsp" %> + + + + + +
+<%@ include file="menu.jsp" %> + +
+
+

Installing Subsonic

+

+ Subsonic features several flexible installation options. Select the one which suits you best: +

+ + + +Change password +

Important! + Immediately after installing Subsonic you should change the admin password to secure the server. + Point your browser to the Subsonic web page (see URL below), and log in with username admin and password + admin. Go to Settings > Users to change password and create new users. +

+ +
+ +
Windows installation
+
+
+

+ On Windows, the easiest way to install Subsonic is using the provided Windows Installer: subsonic-x.x-setup.exe. +

+ Windows Installer +

+ It installs Subsonic as a service, available in Control Panel > Administrative Tools > Services, that is started automatically when you log on to Windows. +

+

+ It also creates links in the Start Menu: Start > All Programs > Subsonic. From this menu you can start/stop the Subsonic service, open the Subsonic web page, or + change basic settings such as which port number Subsonic should use. You can also click on the little yellow submarine tray icon. +

+

+ If you're upgrading an existing Subsonic installation, you don't have to uninstall the old version first. In any case, the existing Subsonic settings are preserved. +

+

+ After installing and starting Subsonic, open the Subsonic web page on http://localhost. +

+
+
+
+ +
+ +
Mac installation
+
+
+ Mac Installer +

+ Download the installation package and run it. This installs Subsonic.app in Applications. Start it by opening Applications and + click the Subsonic icon. A small headset icon will appear in the menu bar. If you want Subsonic to start automatically when you log in, + open System Preferences > Accounts and add Subsonic to the list of Login Items. +

+

+ After installing and starting Subsonic, open the Subsonic web page on http://localhost:4040. +

+

Advanced configuration

+

+ To change the port number, Java memory settings or other startup parameters, edit /Applications/Subsonic.app/Contents/Info.plist. +

+

Troubleshooting

+

+ If Subsonic doesn't start properly you can troubleshoot it by starting it from the command line: + /Applications/Subsonic.app/Contents/MacOS/JavaApplicationStub. +

+

+ Also check the logs in /Library/Application Support/Subsonic. +

+ +
+
+
+ +
+ +
Debian/Ubuntu installation
+
+
+

+ This installation option applies to Debian Linux, including Ubuntu. +

+
    +
  • First, install Java: sudo apt-get install openjdk-6-jre
  • +
  • Download the Subsonic .deb package and install it: sudo dpkg -i subsonic-x.x.deb
  • +
+

+ Notice that the installer configures your system to start Subsonic automatically when booting. + After installing, open the Subsonic web page on http://localhost:4040. +

+ +

Change user

+

+ By default the Subsonic process is run as the root user. To improve security it is strongly advised that you run it as a + dedicated user with less powerful privileges. You can specify this user by setting the SUBSONIC_USER variable in + /etc/default/subsonic. +

+

+ Note that non-root users are by default not allowed to use ports below 1024. Also make sure to grant the user write permissions in + the music directories, otherwise changing album art and tags will fail. +

+ +

Advanced configuration

+

+ To change the port number, Java memory settings or other startup parameters, edit the SUBSONIC_ARGS variable in + /etc/default/subsonic. To restart Subsonic, do + sudo service subsonic restart +

+ +

Troubleshooting

+

+ Check the logs in /var/subsonic. +

+ +
+
+
+ +
+ +
Red Hat/Fedora installation
+
+
+

+ This installation option applies to Red Hat Linux, including Fedora. +

+
    +
  • First, install Java: sudo yum install java-1.6.0-openjdk
  • +
  • Download the Subsonic .rpm installation package and install it: sudo yum install --nogpgcheck subsonic-x.x.rpm
  • +
  • If nothing happens, try to remove the old version first (all settings will be retained): sudo yum remove subsonic
  • +
+

+ Notice that the installer configures your system to start Subsonic automatically when booting. + After installing, open the Subsonic web page on http://localhost:4040. +

+ +

Change user

+

+ By default the Subsonic process is run as the root user. To improve security it is strongly advised that you run it as a + dedicated user with less powerful privileges. You can specify this user by setting the SUBSONIC_USER variable in + /etc/sysconfig/subsonic. +

+

+ Note that non-root users are by default not allowed to use ports below 1024. Also make sure to grant the user write permissions in + the music directories, otherwise changing album art and tags will fail. +

+ +

Advanced configuration

+

+ To change the port number, Java memory settings or other startup parameters, edit the SUBSONIC_ARGS variable in + /etc/sysconfig/subsonic. To restart Subsonic, do + sudo service subsonic restart +

+ +

Troubleshooting

+

+ Check the logs in /var/subsonic. +

+ +
+
+
+ +
+ +
Stand-alone installation
+
+
+

Requirements: Sun Java 5 or later (Download)

+

+ This is Subsonic with an embedded Jetty server, and can be installed on any Windows, Linux, Unix, FreeNAS, unRAID etc operating system. +

+
    +
  • Unpack subsonic-x.x-standalone.tar.gz to SUBSONIC_HOME/standalone. + SUBSONIC_HOME is typically c:\subsonic on Windows, and /var/subsonic on Unix-based operating systems.
  • +
  • Optionally configure the startup script SUBSONIC_HOME/standalone/subsonic.sh
  • +
  • Execute the startup script. (Typically you will configure your operating system to execute the script automatically at start-up.)
  • +
  • Open the Subsonic web page. The default address is http://localhost:4040.
  • +
+
+
+
+ +
+ + +
WAR installation
+
+
+

Requirements: Java 5 or later (Download). A servlet container supporting Servlet 2.4 and JSP 2.0.

+ +

+ Use this option if you want to deploy Subsonic in an external server, such as Tomcat, Jetty, GlassFish or Geronimo. Subsonic comes + packaged as a standard Java web application, subsonic.war, which can be easily deployed in any compatible servlet container. + The most commonly used server is Tomcat, and the rest of this section describes how to install or upgrade Subsonic on a Tomcat server. + (Please note that Subsonic currently doesn't work with Tomcat 7.) +

+ +
    +
  • Stop Tomcat if it's running.
  • +
  • Remove these files and directories if they exist: +
      +
    • TOMCAT_HOME/webapps/subsonic.war
    • +
    • TOMCAT_HOME/webapps/subsonic
    • +
    • TOMCAT_HOME/work
    • +
    +
  • +
  • Copy the file subsonic.war to TOMCAT_HOME/webapps.
  • +
  • Start Tomcat.
  • +
  • Point your web browser to http://localhost/subsonic (or + http://localhost:8080/subsonic if you installed Tomcat on port 8080.)
  • +
+ +

Notes

+
    +
  • If you installed Tomcat as a Windows Service, you can start and stop it from the service manager: Control Panel > Administrative Tools > Services.
  • +
  • TOMCAT_HOME refers to the directory in which you installed Tomcat. On Windows this is normally C:\Program Files\Apache Software Foundation\Tomcat 5.5
  • +
  • On Linux, Subsonic keeps its files in /var/subsonic. Depending on your configuration, Tomcat may not be permitted to create this directory, in which case + you have to create it manually: mkdir /var/subsonic; chown tomcat:tomcat /var/subsonic
  • +
+ +

Troubleshooting

+

+ If you experience any problems, please make sure you follow the installation instructions above. Here's a list of suggestions of what to do if it still doesn't work: +

+
    +
  • Restart Tomcat.
  • +
  • Reinstall Subsonic.
  • +
  • Upgrade to the latest Tomcat version (at least if you're using Tomcat 5.0 or earlier).
  • +
  • Look for errors in the Subsonic log, c:\subsonic\subsonic.log or /var/subsonic/subsonic.log.
  • +
  • Look for errors in the Tomcat logs, TOMCAT_HOME/logs.
  • +
  • Post a message to the Subsonic forum. Please let us know what Subsonic version, Tomcat version and + operating system you're using. Also, please give a detailed description of the problem. This way, we'll be able to help you faster.
  • +
+
+
+
+ +
+ +
+ <%@ include file="google-translate.jsp" %> + <%@ include file="tutorial.jsp" %> + <%@ include file="donate.jsp" %> + <%@ include file="translate-subsonic.jsp" %> + +
+ +
+
+
+
+<%@ include file="footer.jsp" %> +
+ + + + diff --git a/subsonic-site/src/main/webapp/libraries.jsp b/subsonic-site/src/main/webapp/libraries.jsp new file mode 100644 index 00000000..b0991114 --- /dev/null +++ b/subsonic-site/src/main/webapp/libraries.jsp @@ -0,0 +1,48 @@ + + + +<%! String current = "libraries"; %> +<%@ include file="header.jsp" %> + + + + + + + + + diff --git a/subsonic-site/src/main/webapp/menu.jsp b/subsonic-site/src/main/webapp/menu.jsp new file mode 100644 index 00000000..b438c7ce --- /dev/null +++ b/subsonic-site/src/main/webapp/menu.jsp @@ -0,0 +1,32 @@ + + +
+
+ +
+ + + + +
Search
+
+ +
+ +
+ diff --git a/subsonic-site/src/main/webapp/merchandise.jsp b/subsonic-site/src/main/webapp/merchandise.jsp new file mode 100644 index 00000000..c650c1d3 --- /dev/null +++ b/subsonic-site/src/main/webapp/merchandise.jsp @@ -0,0 +1,7 @@ + diff --git a/subsonic-site/src/main/webapp/paypal-landing.jsp b/subsonic-site/src/main/webapp/paypal-landing.jsp new file mode 100644 index 00000000..9f91cbb7 --- /dev/null +++ b/subsonic-site/src/main/webapp/paypal-landing.jsp @@ -0,0 +1,36 @@ + + + + + Subsonic » Free Music Streamer + + + + + <%@ include file="tracking.jsp" %> + + + +

Thank you!

+ +

+ Thanks for supporting Subsonic - your license key will be emailed to you shortly. +

+ +

+ If you haven't received the email within an hour, remember to check your spam folder. Feel free to + take contact if you have any questions or issues + regarding the payment or the Subsonic license key. +

+ +

+ To install the license, click the "Donate" link in the top right corner of the Subsonic web interface + (more info). +

+ +

+ For more information, please visit subsonic.org +

+ + + diff --git a/subsonic-site/src/main/webapp/quotes.jsp b/subsonic-site/src/main/webapp/quotes.jsp new file mode 100644 index 00000000..8ac97fb3 --- /dev/null +++ b/subsonic-site/src/main/webapp/quotes.jsp @@ -0,0 +1,55 @@ + + + diff --git a/subsonic-site/src/main/webapp/redirect-expired.jsp b/subsonic-site/src/main/webapp/redirect-expired.jsp new file mode 100644 index 00000000..5b63eacf --- /dev/null +++ b/subsonic-site/src/main/webapp/redirect-expired.jsp @@ -0,0 +1,104 @@ + + + + + Subsonic » Free Music Streamer + + + + + + + +

Trial period expired

+ +

+ Sorry, the trial period for the web address <%= request.getParameter("redirectFrom")%>.subsonic.org has expired. +

+ +

+ But don't worry; to get permanent ownership of the address you can give a one-time donation to the Subsonic project. +

+ +

+ As a donor you get the following benefits: +

+ + +

+ The suggested donation amount is + €20, + but you can give any amount you like. +

+ +

+ Click one of the buttons to go to PayPal where you can pay by credit card or by using your PayPal account. + Once the donation is processed, you will receive a license key by email. +

+ + + + + + + + + +
+ + + + + + + +
€10
+
+ + + + + + + +
€15
+
+ + + + + + + +
€20
+
+ + + + + + + +
€25
+
+ + + + + + + +
€30
+
+ +

+ For more information, please visit subsonic.org +

+ + diff --git a/subsonic-site/src/main/webapp/ripserver.jsp b/subsonic-site/src/main/webapp/ripserver.jsp new file mode 100644 index 00000000..1dc0b2ec --- /dev/null +++ b/subsonic-site/src/main/webapp/ripserver.jsp @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/subsonic-site/src/main/webapp/robots.txt b/subsonic-site/src/main/webapp/robots.txt new file mode 100644 index 00000000..8093c87b --- /dev/null +++ b/subsonic-site/src/main/webapp/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: \ No newline at end of file diff --git a/subsonic-site/src/main/webapp/screenshots.jsp b/subsonic-site/src/main/webapp/screenshots.jsp new file mode 100644 index 00000000..be20ad46 --- /dev/null +++ b/subsonic-site/src/main/webapp/screenshots.jsp @@ -0,0 +1,67 @@ +<%@ page import="java.net.URL" %> + + +<%! String current = "screenshots"; %> +<%@ include file="header.jsp" %> + + + + + +
+ <%@ include file="menu.jsp" %> + +
+
+ + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+ +
+ +
+ +
+ + +
+ <%@ include file="google-translate.jsp" %> + <%@ include file="download-subsonic.jsp" %> + <%@ include file="donate.jsp" %> +
+ +
+
+
+
+ <%@ include file="footer.jsp" %> +
+ + + + diff --git a/subsonic-site/src/main/webapp/search.jsp b/subsonic-site/src/main/webapp/search.jsp new file mode 100644 index 00000000..cc5e24a6 --- /dev/null +++ b/subsonic-site/src/main/webapp/search.jsp @@ -0,0 +1,4 @@ +<% + String query = request.getParameter("query") + "+site:subsonic.org"; + response.sendRedirect("http://www.google.com/search?q=" + query); +%> diff --git a/subsonic-site/src/main/webapp/subsonic-ad.jsp b/subsonic-site/src/main/webapp/subsonic-ad.jsp new file mode 100644 index 00000000..082cdbb0 --- /dev/null +++ b/subsonic-site/src/main/webapp/subsonic-ad.jsp @@ -0,0 +1,51 @@ + + + + + Subsonic » Free Music Streamer + + + + + + +
+
+

  Love Subsonic?

+

+ Support us by giving a donation and enjoy premium features like: +

+
+
Apps for Android, iPhone, WP 7, PlayBook, Roku ++.
+
Video streaming.
+
Share on Facebook, Twitter, Google+
+
Your personal server address: you.subsonic.org
+
No ads.
+
+ +

+ The suggested donation amount is €20, but you can give any amount you like. +

+

+ €10, + €15, + €20, + €25, + €30 +

+

+ Donate +

+ +
+
+ + diff --git a/subsonic-site/src/main/webapp/tracking.jsp b/subsonic-site/src/main/webapp/tracking.jsp new file mode 100644 index 00000000..672e67e5 --- /dev/null +++ b/subsonic-site/src/main/webapp/tracking.jsp @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/subsonic-site/src/main/webapp/transcoding.jsp b/subsonic-site/src/main/webapp/transcoding.jsp new file mode 100644 index 00000000..c526f55c --- /dev/null +++ b/subsonic-site/src/main/webapp/transcoding.jsp @@ -0,0 +1,92 @@ + + +<%! String current = "transcoding"; %> +<%@ include file="header.jsp" %> + + + + + +
+ <%@ include file="menu.jsp" %> + +
+
+

Transcoding

+

+ Transcoding is the process of converting media from one format to another. Subsonic's transcoding engine allows for streaming of + media that would normally not be streamable, for instance lossless formats. The transcoding is performed on-the-fly and doesn't require any disk usage. +

+ +

+ The actual transcoding is done by third-party command line programs which are installed in: +

+

+ Windows  c:\subsonic\transcode
+ Mac  /Library/Application Support/Subsonic/transcode
+ Linux  /var/subsonic/transcode +

+ +

+ Note that two transcoders can be chained together. Subsonic comes pre-installed with ffmpeg which supports + a huge range of audio and video formats. +

+ +

Recommended configuration

+

+ The recommended settings for audio transcoding is: +

+

+ Step 1  ffmpeg -i %s -ab %bk -v 0 -f mp3 -
+

+ +

+ The recommended settings for video transcoding is: +

+

+ Step 1  ffmpeg -ss %o -i %s -async 1 -b %bk -s %wx%h -ar 44100 -ac 2 -v 0 -f flv -vcodec libx264 -preset superfast -threads 0 -
+

+ +

+ Note that "%s" is substituted with the path of the original file at run-time, and "%b" is substituted with + the max bitrate of the player. "%t", "%a" and "%l" are substituted with the song's title, artist and album. +

+ + +

Adding custom transcoders

+

+ You can add your own custom transcoder given that it fulfills the following requirements: +

+
    +
  • It must have a command line interface.
  • +
  • It must be able to send output to stdout.
  • +
  • If used in transcoding step 2 it must be able to read input from stdin.
  • +
+ +

Troubleshooting

+
    +
  • Is the transcoder installed in c:\subsonic\transcode (or /var/subsonic/transcode)?
  • +
  • Is the transcoder activated for your player (in Settings > Players)?
  • +
  • Is the proper file extension added to the list of recognized file types (in Settings > General)?
  • +
  • If it still doesn't work, please check the Subsonic log.
  • +
+ +
+ +
+ <%@ include file="google-translate.jsp" %> + <%@ include file="donate.jsp" %> + <%@ include file="merchandise.jsp" %> +
+ +
+
+
+
+ <%@ include file="footer.jsp" %> +
+ + + + diff --git a/subsonic-site/src/main/webapp/translate-subsonic.jsp b/subsonic-site/src/main/webapp/translate-subsonic.jsp new file mode 100644 index 00000000..668ea29e --- /dev/null +++ b/subsonic-site/src/main/webapp/translate-subsonic.jsp @@ -0,0 +1,6 @@ +
\ No newline at end of file diff --git a/subsonic-site/src/main/webapp/translate.jsp b/subsonic-site/src/main/webapp/translate.jsp new file mode 100644 index 00000000..ad371d3b --- /dev/null +++ b/subsonic-site/src/main/webapp/translate.jsp @@ -0,0 +1,65 @@ + + + +<%! String current = "translate"; %> +<%@ include file="header.jsp" %> + + + +
+<%@ include file="menu.jsp" %> + +
+
+

Translating Subsonic

+ +

+ Here's how to translate Subsonic to a new language. This description assumes that you're using the Windows installer + version of Subsonic. +

+ +

+ In the following, <ROOT> refers to the directory in which you installed Subsonic + – normally c:\Program Files\Subsonic. +

+
    +
  1. Stop the Subsonic service if it's running.
  2. +
  3. Rename <ROOT>\subsonic.war to <ROOT>\subsonic.zip.
  4. +
  5. Unzip the zip file into a new directory called <ROOT>\subsonic.war. +
  6. Find the two-letter ISO-639 code for your language – a list is available here. + For instance, Italian is assigned the code it.
  7. +
  8. Add the ISO-639 code to the file <ROOT>\subsonic.war\WEB_INF\classes\net\sourceforge\subsonic\i18n\locales.txt.
  9. +
  10. In the same directory is the file ResourceBundle_en.properties which is the English translation. Use this (or any other file) + as the basis for your translation. Better yet, use the latest version from the + SVN repository.
  11. +
  12. Create the new resource file, for instance ResourceBundle_it.properties.
  13. +
  14. Translate the text in the new file.
  15. +
  16. If you are using a non-Latin alphabet (e.g., Cyrillic or Japanese), you have to convert the property file to ASCII before using it. + Use the native2ascii tool which is included in the Java Development Kit. For instance, if you're writing a Macedonian translation + (using the Cyrillic alphabet) using UTF-16 character encoding, you must convert it as follows:

    + + native2ascii -encoding utf-16 c:\develop\ResourceBundle_mk.properties <ROOT>/subsonic.war/WEB_INF/classes/net/sourceforge/subsonic/i18n/ResourceBundle_mk.properties +
  17. +
  18. You have to restart Subsonic for the changes to have effect.
  19. +
  20. When you're done, send the new language file to sindre@activeobjects.no.
  21. +
+ +
+ +
+ <%@ include file="google-translate.jsp" %> + <%@ include file="donate.jsp" %> + <%@ include file="merchandise.jsp" %> +
+ +
+
+
+
+ <%@ include file="footer.jsp" %> +
+ + + + diff --git a/subsonic-site/src/main/webapp/tutorial.jsp b/subsonic-site/src/main/webapp/tutorial.jsp new file mode 100644 index 00000000..a26824f8 --- /dev/null +++ b/subsonic-site/src/main/webapp/tutorial.jsp @@ -0,0 +1,8 @@ + diff --git a/subsonic-site/src/main/webapp/zazeen-ad.jsp b/subsonic-site/src/main/webapp/zazeen-ad.jsp new file mode 100644 index 00000000..d83d8170 --- /dev/null +++ b/subsonic-site/src/main/webapp/zazeen-ad.jsp @@ -0,0 +1,12 @@ + + + + + + + + + + + -- cgit v1.2.3