From 859758ced1fb360d8d3f410fc5586a235c72a13c Mon Sep 17 00:00:00 2001 From: Matthieu Lalonde Date: Thu, 1 Nov 2012 13:39:46 -0400 Subject: [PATCH] Hmmm yes a commit message... --- docs/nginx.conf | 51 +++ index.html | 301 ++++++++++++- resources/css/app.css | 426 ++++++++++++++++++ resources/css/datatables.css | 46 ++ resources/css/normalize.css | 375 +++++++++++++++ resources/css/player.css | 247 ++++++++++ resources/img/animation.gif | Bin 0 -> 2440 bytes resources/img/body_background.png | Bin 0 -> 2832 bytes resources/img/button_next.png | Bin 0 -> 7015 bytes resources/img/button_pause.png | Bin 0 -> 7943 bytes resources/img/button_play.png | Bin 0 -> 8223 bytes resources/img/button_prev.png | Bin 0 -> 7009 bytes resources/img/button_stop.png | Bin 0 -> 7706 bytes resources/img/grid3-hrow2.gif | Bin 0 -> 107 bytes resources/img/loading.png | Bin 0 -> 9572 bytes resources/img/player_background.png | Bin 0 -> 2918 bytes resources/img/playicon.png | Bin 0 -> 3006 bytes resources/img/playicon2.png | Bin 0 -> 3097 bytes resources/img/progessbar_fg.png | Bin 0 -> 2814 bytes resources/img/progressbar_bg.png | Bin 0 -> 2810 bytes resources/img/progressbar_fg.png | Bin 0 -> 2814 bytes resources/img/progressbar_indicator.png | Bin 0 -> 2868 bytes resources/img/viewport_background.png | Bin 0 -> 2880 bytes resources/img/volume_bg.png | Bin 0 -> 2806 bytes resources/img/volume_fg.png | Bin 0 -> 2813 bytes resources/img/volume_knob.png | Bin 0 -> 3018 bytes resources/img/volume_minus.png | Bin 0 -> 3017 bytes resources/img/volume_plus.png | Bin 0 -> 3142 bytes resources/js/app.js | 44 +- resources/js/collections/dmap.js | 47 +- resources/js/collections/server.js | 22 + resources/js/main.js | 14 +- resources/js/models/client.js | 315 +++++++++++-- resources/js/models/dmap-type.js | 261 +++++------ resources/js/models/dmap.js | 238 ++++++---- resources/js/models/dmap2 | 71 +++ resources/js/views/app.js | 59 +++ resources/js/views/apps.js | 0 resources/js/views/client.js | 32 ++ resources/js/views/footer.js | 14 + resources/js/views/main.js | 13 + resources/js/views/player.js | 13 + resources/js/views/sidebar.js | 13 + resources/js/views/siderbar.js | 0 .../vendors/backbone/localstorage/8651291560 | 1 + .../string/2.3.0/underscore.string.min.js | 1 + 46 files changed, 2280 insertions(+), 324 deletions(-) create mode 100644 docs/nginx.conf create mode 100644 resources/css/app.css create mode 100644 resources/css/datatables.css create mode 100644 resources/css/normalize.css create mode 100644 resources/css/player.css create mode 100644 resources/img/animation.gif create mode 100644 resources/img/body_background.png create mode 100644 resources/img/button_next.png create mode 100644 resources/img/button_pause.png create mode 100644 resources/img/button_play.png create mode 100644 resources/img/button_prev.png create mode 100644 resources/img/button_stop.png create mode 100644 resources/img/grid3-hrow2.gif create mode 100644 resources/img/loading.png create mode 100644 resources/img/player_background.png create mode 100644 resources/img/playicon.png create mode 100644 resources/img/playicon2.png create mode 100644 resources/img/progessbar_fg.png create mode 100644 resources/img/progressbar_bg.png create mode 100644 resources/img/progressbar_fg.png create mode 100644 resources/img/progressbar_indicator.png create mode 100644 resources/img/viewport_background.png create mode 100644 resources/img/volume_bg.png create mode 100644 resources/img/volume_fg.png create mode 100644 resources/img/volume_knob.png create mode 100644 resources/img/volume_minus.png create mode 100644 resources/img/volume_plus.png create mode 100644 resources/js/collections/server.js create mode 100644 resources/js/models/dmap2 create mode 100644 resources/js/views/app.js delete mode 100644 resources/js/views/apps.js create mode 100644 resources/js/views/client.js create mode 100644 resources/js/views/sidebar.js delete mode 100644 resources/js/views/siderbar.js create mode 160000 resources/vendors/backbone/localstorage/8651291560 create mode 100644 resources/vendors/lodash/string/2.3.0/underscore.string.min.js diff --git a/docs/nginx.conf b/docs/nginx.conf new file mode 100644 index 0000000..8b8a89a --- /dev/null +++ b/docs/nginx.conf @@ -0,0 +1,51 @@ +server { + listen localhost; + server_name daapr.localhost; + + root /home/www-data/daapr; + index index.html; + + location ~ ^/favicon.ico$ { + root /home/www-data/roundcube/web/skins/default/images; + log_not_found off; + access_log off; + expires max; + } + + location = /robots.txt { + allow all; + log_not_found off; + access_log off; + } + + # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac). + location ~ /(\.|temp|logs) { + deny all; + access_log off; + log_not_found off; + } +} + +server { + listen 80; + server_name daap.localhost; + + add_header Access-Control-Allow-Origin "*"; + + location / { + proxy_pass http://localhost:3689; + proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; + proxy_redirect off; + #proxy_buffering off; + proxy_buffering on; + #proxy_buffers 128k; + proxy_cache daap; + proxy_cache_valid 6d; + proxy_cache_valid 404 1m; + proxy_ignore_headers Cache-Control Expires DAAP-Server; + + #proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} diff --git a/index.html b/index.html index bb8e156..340cc4a 100644 --- a/index.html +++ b/index.html @@ -1,12 +1,293 @@ - - Backbone.js/Underscore.js via Require.js Learning Page - - - - -
Backbone.js/Underscore.js via Require.js Learning Page
-
- - \ No newline at end of file + + DAAPr + + + + + + + + + + +
+
+ + + +
+ + + +
+
+
+ +
+

DAAPr3

+
+
+ +
+
+
    +
  • + +  Servers + + +
      +
    • + +  Bigthug + + +
    • +
    • + +  WebDevTest + + +
    • +
    • + +  ReallyLongNameWithNoBreaks + + +
    • +
    • + +  Really Long Name Breaks + + +
    • +
    +
  • +
  •  Playlist
  • +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ + + +
+
+ 0 items +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/resources/css/app.css b/resources/css/app.css new file mode 100644 index 0000000..5815388 --- /dev/null +++ b/resources/css/app.css @@ -0,0 +1,426 @@ +body { + background: #909090 url('../img/body_background.png') repeat; + margin: 0; + padding: 0; + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 11px; +} + +.loading { + background-image: url(data:image/gif;base64,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); + background-attachment: fixed; + background-color: #909090; + background-position: center center; + background-repeat: no-repeat; +} +/* +body.loading > * { + display: none; +} + */ +/** + * JLayout + */ +.ui-layout-pane { /* all 'panes' */ + background: transparent; + border: none; + padding: 0; + margin: 0; + overflow: hidden; +} + +.ui-layout-resizer { + background: url('../img/viewport_background.png') repeat-x !important; + cursor: row-resize !important;; +} + +.ui-layout-toggler { + background-color: #BBB; +} + +.ui-layout-toggler:hover { + background-color: #4966B1;/* Old browsers */ + background: -moz-linear-gradient(top, #6086e5 0%, #6086e5 39%, #4966b1 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#6086e5), color-stop(39%,#6086e5), color-stop(100%,#4966b1)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #6086e5 0%,#6086e5 39%,#4966b1 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #6086e5 0%,#6086e5 39%,#4966b1 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #6086e5 0%,#6086e5 39%,#4966b1 100%); /* IE10+ */ + background: linear-gradient(to bottom, #6086e5 0%,#6086e5 39%,#4966b1 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6086e5', endColorstr='#4966b1',GradientType=0 ); /* IE6-9 */ +} + +/** + * Elements + */ +div#wrapperPlayer { + margin: 0; + padding: 0; + /*height: 75px;*/ + /*position: fixed; + top: 0; + left: 0; + bottom: 75px; + right: 0;*/ +} + + form#wrapperSearchWidget { + display: inline-block; + float: right; + clear: right; + padding: 0; + margin: 10px 10px 0 0; + z-index: 100; + } + + form#wrapperSearchWidget button { + height: 20px; + width: 25px; + line-height: 0px; + padding: 0; + } + + form#wrapperSearchWidget button [class*=" icon-"] { + margin-top: 0; + } + + form#wrapperSearchWidget input { + height: 18px; + padding: 0; + padding-left: 3px; + font-size: 12px; + line-height: 21px; + } + +body > .ui-layout-west #wrapperSideBar { + margin: 0; + padding: 0; + min-width: 100px; + max-width: 175px; + background: #fff; + overflow-y: scroll; + overflow-x: hidden; + height: 100%; +} + +body > .ui-layout-west > #wrapperSideBar ul, +body > .ui-layout-west > #wrapperSideBar ul li { + margin: 0; + padding: 0; + list-style: none; + list-style-type: none; +} + + body > .ui-layout-west > #wrapperSideBar ul li { + vertical-align: bottom; + margin-bottom: 5px; + } + + body > .ui-layout-west > #wrapperSideBar ul li > span { + display: block; + line-height: 16px; + height: 16px; + vertical-align: bottom; + padding-bottom: 2px; + padding-left: 5px; + } + + body > .ui-layout-west > #wrapperSideBar ul li > span > span { + overflow: hidden; + text-overflow: ellipsis; + height: 16px; + line-height: 16px; + max-height: 16px; + display: inline-block; + max-width: 70%; + vertical-align: middle; + } + + body > .ui-layout-west > #wrapperSideBar ul li > span:hover { + color: #FFF; + background-color: #4966B1;/* Old browsers */ + background: -moz-linear-gradient(top, #6086e5 0%, #6086e5 39%, #4966b1 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#6086e5), color-stop(39%,#6086e5), color-stop(100%,#4966b1)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #6086e5 0%,#6086e5 39%,#4966b1 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #6086e5 0%,#6086e5 39%,#4966b1 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #6086e5 0%,#6086e5 39%,#4966b1 100%); /* IE10+ */ + background: linear-gradient(to bottom, #6086e5 0%,#6086e5 39%,#4966b1 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6086e5', endColorstr='#4966b1',GradientType=0 ); /* IE6-9 */ + } + + body > .ui-layout-west > #wrapperSideBar ul li ul { + margin-left: 10px; + } + + body > .ui-layout-west > #wrapperSideBar ul li .sidebar-list-action { + display: none; + height: 14px; + } + + body > .ui-layout-west > #wrapperSideBar ul li > span:hover > .sidebar-list-action { + display: inline-block; + } + +div#wrapperBrowser { + margin: 0; + padding: 0; + background: #FFF url(../img/grid3-hrow2.gif) repeat-x; +} + div#wrapperBrowser > div.third { + width: 33.3333%; + float: left; + clear: none; + } + + div#wrapperBrowser > div.third:first-child { + clear: left; + } + + div#wrapperBrowser > div.third:last-child { + clear: right; + } + + div#wrapperBrowser > div.third > div.dataTables_wrapper, + div#wrapperBrowser > div.third > div.dataTables_wrapper { + border-left: 1px solid #C6C6C6; + } + + div#wrapperBrowser > div:first-child > div.dataTables_wrapper, + div#wrapperBrowser > div:first-child > div.dataTables_wrapper { + border-left: none; + padding-left: 1px; + } + + div#wrapperBrowser > div.third > div.dataTables_wrapper table td { + padding-left: 4px; + } + + div#wrapperBrowser table.dataTable tr td.sorting_1 { background-color: transparent; } + div#wrapperBrowser table.dataTable tr td.sorting_2 { background-color: transparent; } + div#wrapperBrowser table.dataTable tr td.sorting_3 { background-color: transparent; } + + +div#wrapperList { + margin: 0; + padding: 0; + width: 100%; + background: #FFF url(../img/grid3-hrow2.gif) repeat-x; +} + + div#wrapperList table#tableList { + margin: 0; + padding: 0; + width: 100%; + } + + div#listItemDetails table tr td:first-child { + width: 110px; + font-weight: bold; + padding-left: 10px; + } + + div#listItemDetails table tr:first-child td { + border-top: none; + } + + div#listItemDetails div.modal-body { + padding: 0; + } + +/* +div#wrapperList table#tableList tr td { + text-overflow: ellipsis; + max-width: 20%; + overflow: hidden; + white-space: nowrap; +} +*/ +div#wrapperFooter { + margin: 0; + padding: 0; + background: url('../img/viewport_background.png') repeat-x left bottom; + text-align: center; + height: 30px; + line-height: 25px; +} + div#wrapperFooter .btn-inverse { + line-height: 12px; + } + + div#wrapperFooter > div#wrapperFooterRight { + text-align: right; + padding-right: 10px; + padding-top: 3px; + } + + div#wrapperFooter > div#wrapperFooterRight div.btn-group { + height: 25px; + } + + div#wrapperFooter > div#wrapperFooterLeft { + text-align: left; + padding-left: 10px; + padding-top: 2px; + } + + +table.dataTable tbody tr { + display: table-row; + height: 17px; + margin: 0; + padding: 0; + background-color: #FFF; + border: none; +} + +table.dataTable tbody td { + display: table-cell; + margin: 0; + padding: 0 2px; + height: 16px; + background-color: #FFF; + border-bottom: 1px solid #EDEDED; +} + +table.dataTable div.dataTables_scrollHeadInner { + cursor: default; + display: block; + height: 22px; + border: none; +} + +table.dataTable tr td, +table.dataTable tr th { + overflow: hidden !important; + text-overflow: ellipsis !important; + -o-text-overflow: ellipsis !important; + -webkit-text-overflow: ellipsis !important; +} + +table.dataTable tbody tr { + height: 20px !important; + max-height: 20px !important; + overflow: hidden !important; + text-overflow: ellipsis !important; + -o-text-overflow: ellipsis !important; + -webkit-text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +div.dataTables_scrollHeadInner th { + -webkit-background-clip: border-box; + -webkit-background-origin: padding-box; + -webkit-background-size: auto; + font-size: 11px; + font-style: normal; + font-variant: normal; + font-weight: bold; + height: 22px; + line-height: 22px; + overflow-x: hidden; + overflow-y: hidden; + text-align: left; + text-overflow: clip; + white-space: nowrap; + color: #000; + border: none; +} + + div#wrapperBrowser div.dataTables_scrollHeadInner th { + padding-left: 4px; + } + +div.dataTables_scrollBody table tbody tr:last-child td { + border: none; +} + +div.dataTables_scrollHead table thead th.center, +div.dataTables_scrollBody table tbody td.center { + text-align: center; +} + +table.dataTable tbody tr.selected td, +table.dataTable tbody tr.selected td.sorting_1, +table.dataTable tbody tr.selected td.sorting_2, +table.dataTable tbody tr.selected td.sorting_3, +div#wrapperBrowser > div.third > div.dataTables_wrapper table tr.selected td, +div#wrapperBrowser > div.third > div.dataTables_wrapper table tr.selected td.sorting_1, +div#wrapperBrowser > div.third > div.dataTables_wrapper table tr.selected td.sorting_2, +div#wrapperBrowser > div.third > div.dataTables_wrapper table tr.selected td.sorting_3, +.dropdown-menu * a:hover, +.dropdown-menu * a:focus, +.dropdown-menu * li:hover, +.dropdown-menu * li:hover a, +.dropdown-menu * li:hover a:hover, +.dropdown-menu > ul > li:hover, +.dropdown-menu li:hover, +.dropdown-menu .active > a:hover { + color: #FFF; + background-color: #4966B1;/* Old browsers */ + background: -moz-linear-gradient(top, #6086e5 0%, #6086e5 39%, #4966b1 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#6086e5), color-stop(39%,#6086e5), color-stop(100%,#4966b1)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #6086e5 0%,#6086e5 39%,#4966b1 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #6086e5 0%,#6086e5 39%,#4966b1 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #6086e5 0%,#6086e5 39%,#4966b1 100%); /* IE10+ */ + background: linear-gradient(to bottom, #6086e5 0%,#6086e5 39%,#4966b1 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6086e5', endColorstr='#4966b1',GradientType=0 ); /* IE6-9 */ +} + +div#wrapperPlayer { + background: url('../img/viewport_background.png') repeat-x; + height: 50px; +} + +div#wrapperFooter, +table.dataTable tr td, +table.dataTable tr th { + -webkit-user-select: none; + -moz-user-select: none; + -khtml-user-select: none; + cursor: default; +} + +.clearfix { + float: none; + clear: both; + font-style: oblique; +} + +div.overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: #000; + opacity: 0.7; + z-index: 1000; + width: 100%; +} + +div.overlay > div { + z-index: 1001; +} + + +div#screen, +div#screen canvas#processcanvas { + width : 512px; + height : 512px; + top: 0; + margin: 0 auto; + position : absolute; + z-index : 2000; +} + +.icon-loading { + display: inline-block; + width: 14px; + height: 14px; + margin-top: 1px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-repeat: no-repeat; + background-position: 0 0; + background-image: url(data:image/gif;base64,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); +} \ No newline at end of file diff --git a/resources/css/datatables.css b/resources/css/datatables.css new file mode 100644 index 0000000..a40843a --- /dev/null +++ b/resources/css/datatables.css @@ -0,0 +1,46 @@ +/** + * DataTables + */ +table.dataTable { + margin: 0 auto; + clear: both; + width: 100%; +} + +table.dataTable thead th, +table.dataTable tbody td { + height: ; + padding: 0px 2px; +} + +table.dataTable thead th { + cursor: pointer; + *cursor: hand; +} + +table.dataTable td.center, +table.dataTable td.dataTables_empty { + text-align: center; +} + + +table.dataTable tr td.sorting_1 { background-color: #EBEBEB; } +table.dataTable tr td.sorting_2 { background-color: #EBEBEB; } +table.dataTable tr td.sorting_3 { background-color: #EBEBEB; } +/* +table.dataTable tr.odd { background-color: #E2E4FF; } +table.dataTable tr.even { background-color: white; } + +table.dataTable tr.odd td.sorting_1 { background-color: #D3D6FF; } +table.dataTable tr.odd td.sorting_2 { background-color: #DADCFF; } +table.dataTable tr.odd td.sorting_3 { background-color: #E0E2FF; } +table.dataTable tr.even td.sorting_1 { background-color: #EAEBFF; } +table.dataTable tr.even td.sorting_2 { background-color: #F2F3FF; } +table.dataTable tr.even td.sorting_3 { background-color: #F9F9FF; } +*/ +/*.sorting { background: url('../vendors/DataTables-1.9.4/media/images/sort_both.png') no-repeat center right; }*/ +.sorting_asc { background: url('../vendors/DataTables-1.9.4/media/images/sort_asc.png') no-repeat center right; } +.sorting_desc { background: url('../vendors/DataTables-1.9.4/media/images/sort_desc.png') no-repeat center right; } + +.sorting_asc_disabled { background: url('../vendors/DataTables-1.9.4/media/images/sort_asc_disabled.png') no-repeat center right; } +.sorting_desc_disabled { background: url('../vendors/DataTables-1.9.4/media/images/sort_desc_disabled.png') no-repeat center right; } diff --git a/resources/css/normalize.css b/resources/css/normalize.css new file mode 100644 index 0000000..73abb76 --- /dev/null +++ b/resources/css/normalize.css @@ -0,0 +1,375 @@ +/*! normalize.css v2.0.1 | MIT License | git.io/normalize */ + +/* ========================================================================== + HTML5 display definitions + ========================================================================== */ + +/* + * Corrects `block` display not defined in IE 8/9. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section, +summary { + display: block; +} + +/* + * Corrects `inline-block` display not defined in IE 8/9. + */ + +audio, +canvas, +video { + display: inline-block; +} + +/* + * Prevents modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/* + * Addresses styling for `hidden` attribute not present in IE 8/9. + */ + +[hidden] { + display: none; +} + +/* ========================================================================== + Base + ========================================================================== */ + +/* + * 1. Sets default font family to sans-serif. + * 2. Prevents iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-family: sans-serif; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -ms-text-size-adjust: 100%; /* 2 */ +} + +/* + * Removes default margin. + */ + +body { + margin: 0; +} + +/* ========================================================================== + Links + ========================================================================== */ + +/* + * Addresses `outline` inconsistency between Chrome and other browsers. + */ + +a:focus { + outline: thin dotted; +} + +/* + * Improves readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* ========================================================================== + Typography + ========================================================================== */ + +/* + * Addresses `h1` font sizes within `section` and `article` in Firefox 4+, + * Safari 5, and Chrome. + */ + +h1 { + font-size: 2em; +} + +/* + * Addresses styling not present in IE 8/9, Safari 5, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/* + * Addresses style set to `bolder` in Firefox 4+, Safari 5, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/* + * Addresses styling not present in Safari 5 and Chrome. + */ + +dfn { + font-style: italic; +} + +/* + * Addresses styling not present in IE 8/9. + */ + +mark { + background: #ff0; + color: #000; +} + + +/* + * Corrects font family set oddly in Safari 5 and Chrome. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, serif; + font-size: 1em; +} + +/* + * Improves readability of pre-formatted text in all browsers. + */ + +pre { + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; +} + +/* + * Sets consistent quote types. + */ + +q { + quotes: "\201C" "\201D" "\2018" "\2019"; +} + +/* + * Addresses inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/* + * Prevents `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* ========================================================================== + Embedded content + ========================================================================== */ + +/* + * Removes border when inside `a` element in IE 8/9. + */ + +img { + border: 0; +} + +/* + * Corrects overflow displayed oddly in IE 9. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* ========================================================================== + Figures + ========================================================================== */ + +/* + * Addresses margin not present in IE 8/9 and Safari 5. + */ + +figure { + margin: 0; +} + +/* ========================================================================== + Forms + ========================================================================== */ + +/* + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/* + * 1. Corrects color not being inherited in IE 8/9. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/* + * 1. Corrects font family not being inherited in all browsers. + * 2. Corrects font size not being inherited in all browsers. + * 3. Addresses margins set differently in Firefox 4+, Safari 5, and Chrome + */ + +button, +input, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 2 */ + margin: 0; /* 3 */ +} + +/* + * Addresses Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +button, +input { + line-height: normal; +} + +/* + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Corrects inability to style clickable `input` types in iOS. + * 3. Improves usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/* + * Re-set default cursor for disabled elements. + */ + +button[disabled], +input[disabled] { + cursor: default; +} + +/* + * 1. Addresses box sizing set to `content-box` in IE 8/9. + * 2. Removes excess padding in IE 8/9. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/* + * 1. Addresses `appearance` set to `searchfield` in Safari 5 and Chrome. + * 2. Addresses `box-sizing` set to `border-box` in Safari 5 and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/* + * Removes inner padding and search cancel button in Safari 5 and Chrome + * on OS X. + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* + * Removes inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/* + * 1. Removes default vertical scrollbar in IE 8/9. + * 2. Improves readability and alignment in all browsers. + */ + +textarea { + overflow: auto; /* 1 */ + vertical-align: top; /* 2 */ +} + +/* ========================================================================== + Tables + ========================================================================== */ + +/* + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff --git a/resources/css/player.css b/resources/css/player.css new file mode 100644 index 0000000..3642e45 --- /dev/null +++ b/resources/css/player.css @@ -0,0 +1,247 @@ + +div#wrapperPlayer #daaprPlayerViewport { + margin: 6px auto 0 auto; + background: transparent url('../img/player_background.png') repeat-x; + height: 40px; + width: 450px; + border: 1px solid #6B6D5E; + border-bottom-color: #DCDDDE; + border-left-color: #939885; + border-right-color: #939885; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + z-index: 10; +} + +div#wrapperPlayer #daaprPlayerViewport h1 { + color: #5F5F5F; + font-size: 2em; + font-style: oblique; + font-variant: small-caps; + font-weight: bold; + line-height: 40px; + text-align: center; + text-shadow: #ACACAC 2px 2px 2px; + margin: 0; + -webkit-gradient( + linear, + left top, + left bottom, + color-stop(0.3, rgb(0,0,0)), + color-stop(0.27, rgb(46,46,46)), + color-stop(0.83, rgb(0,0,0)) + ); + -moz-linear-gradient( + center top, + rgb(0,0,0) 30%, + rgb(46,46,46) 27%, + rgb(0,0,0) 83% + ); +} + +.daaprPlayerTitleIndicator, +.daaprPlayerInfoIndicator { + height: 12px; + line-height: 12px; + font-size: 0.7em; + text-align: center; + margin-bottom: 2px; +} + +.daaprPlayerTitleIndicator { + font-size: 0.7em; + font-weight: bold; +} + +#daaprProgressTimeRemain, +#daaprProgressTimeElapsed { + font-size: 0.7em; +} + +#daaprProgressTimeRemain { + vertical-align: top; + height: 7px; + line-height: 7px; + padding-right: 5px; +} + +#daaprProgressTimeElapsed { + vertical-align: top; + height: 7px; + line-height: 7px; + padding-left: 5px; +} + +.daaprProgressWrap { + width: auto; + text-align: center; + margin: 0 auto; + height: 9px; +} + +.daaprControlsWrap { + float: left; + clear: left; + margin-top: 8px; + margin-left: 25px; +} + +.daaprControlsWrap #buttonPlay { + float: left; + clear: none; + display: block; + width: 37px; + height: 38px; + margin-left: 4px; + margin-right: 4px; + background: transparent url('../img/button_play.png') no-repeat left top; +} +.daaprControlsWrap #buttonPlay.playing { + background-image: url('../img/button_pause.png'); +} + +.daaprControlsWrap #buttonPlay.stopped { + background-image: url('../img/button_stop.png'); +} + +.daaprControlsWrap #buttonVolume, +.daaprControlsWrap #buttonPrev, +.daaprControlsWrap #buttonNext { + float: left; + clear: none; + display: block; + width: 31px; + height: 32px; + margin-top: 3px; +} + +.daaprControlsWrap #buttonPrev { + background: url('../img/button_prev.png') no-repeat left top; +} + +.daaprControlsWrap #buttonNext { + background: url('../img/button_next.png') no-repeat left top; +} + +.daaprControlsWrap #buttonNext:active, +.daaprControlsWrap #buttonPrev:active, +.daaprControlsWrap #buttonPlay:active, +.daaprControlsWrap #buttonNext.disabled:active, +.daaprControlsWrap #buttonPrev.disabled:active, +.daaprControlsWrap #buttonPlay.disabled:active { + background-position: left bottom; +} + +progress, +progress::-webkit-progress-bar-value, +progress::-webkit-progress-value, +progress::-moz-progress-bar { + -webkit-appearance: progress-bar; + /*background-color: #BFBFBF;*/ +} + +progress#daaprPlayerProgress { + vertical-align: top; + /*-moz-border-radius: 7px; + -webkit-border-radius: 7px;*/ + display: inline-block; + /*height: 7px;*/ + margin-top: -3px; + padding: 0; + width: 350px; + /*border: 1px solid #393939;*/ +} +/* +progress#daaprPlayerProgress, progress#daaprPlayerProgress span { + -moz-border-radius: 7px; + -webkit-border-radius: 7px; +} +progress#daaprPlayerProgress span { + background: url('../img/progressbar_fg.png') repeat-x; + display: block; + height: 7px; + margin: 0; + padding: 0; +} +*/ +#volumeWrapper { + float: left; + clear: none; + margin-left: 25px; + margin-top: 16px; +} + +#volumeWrapper input#buttonVolume { + float: left; + clear: none; + vertical-align: bottom; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + /*background: url('../img/volume_bg.png') repeat-x;*/ + display: block; + height: 6px; + line-height: 6px; + padding: 0; + width: 74px; + border: 1px solid #393939; + border-top: none; + margin-left: 3px; + margin-right: 3px; + margin-top: 2px; +} + +#volumeWrapper input#buttonVolume, +#volumeWrapper input#buttonVolume span { + -moz-border-radius: 6px; + -webkit-border-radius: 6px; +} +/* +#volumeWrapper progress#buttonVolume span { + background: url('../img/volume_fg.png') repeat-x; + display: block; + height: 6px; + width: 0%; + margin: 0; + padding: 0; +} + +#volumeWrapper progress#buttonVolume span a { + display: none; +} +*/ + +#volumeWrapper a#buttonVolDown { + vertical-align: top; + display:block; + float: left; + clear: left; + height: 10px; + width: 9px; + background: transparent url('../img/volume_minus.png') no-repeat; +} + + +#volumeWrapper a#buttonVolUp { + vertical-align: top; + display:block; + float: left; + clear: right; + height: 10px; + width: 13px; + background: transparent url('../img/volume_plus.png') no-repeat; +} + +table tbody tr.itemplaying td:first-child span { + display: inline-block; + background-color: transparent; + background-image: url('../img/playicon2.png'); + background-repeat: no-repeat; + background-position: left bottom; + width: 12px; + height: 12px; + line-height: 14px; +} + +table tbody tr.itemplaying.itempaused td:first-child span { + background-image: url('../img/playicon.png'); +} diff --git a/resources/img/animation.gif b/resources/img/animation.gif new file mode 100644 index 0000000000000000000000000000000000000000..b3310ec4aa04e47e87db391f0241c2b424ecd5d9 GIT binary patch literal 2440 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 FV1i}&mlFU0 literal 0 HcmV?d00001 diff --git a/resources/img/button_pause.png b/resources/img/button_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..bf7114faf37d3e317e667077427289e466034104 GIT binary patch literal 7943 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 literal 0 HcmV?d00001 diff --git a/resources/img/button_play.png b/resources/img/button_play.png new file mode 100644 index 0000000000000000000000000000000000000000..cd997faa5eb7acf5fa91cfc2cea029ce30044e72 GIT binary patch literal 8223 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 R{+R#(002ovPDHLkV1oME#G(KI literal 0 HcmV?d00001 diff --git a/resources/img/button_prev.png b/resources/img/button_prev.png new file mode 100644 index 0000000000000000000000000000000000000000..cdb2fa5015cd254dc93a98ef97eb58a26df18e3d GIT binary patch literal 7009 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 literal 0 HcmV?d00001 diff --git a/resources/img/player_background.png b/resources/img/player_background.png new file mode 100644 index 0000000000000000000000000000000000000000..0985283b559f95911d42af77a67ba5131c36ffdf GIT binary patch literal 2918 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 Q4*&oF07*qoM6N<$f@a=dI{*Lx literal 0 HcmV?d00001 diff --git a/resources/img/playicon.png b/resources/img/playicon.png new file mode 100644 index 0000000000000000000000000000000000000000..0786ec98548b1ee59b0fc16a18432e362d5ab329 GIT binary patch literal 3006 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 AJOBUy literal 0 HcmV?d00001 diff --git a/resources/img/playicon2.png b/resources/img/playicon2.png new file mode 100644 index 0000000000000000000000000000000000000000..71c841fbdb04fbbac011f03897a60d7a395d7bf5 GIT binary patch literal 3097 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 Qo&W#<07*qoM6N<$f=!Y-Q2+n{ literal 0 HcmV?d00001 diff --git a/resources/img/progressbar_bg.png b/resources/img/progressbar_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..f4a6c3acc314ec79d97c5370bad737c1c536c0b8 GIT binary patch literal 2810 zcmVKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0000bNklKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0000fNklKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0001ANklK7!xoR%`9?_A>ywp?bAF SX2?1K0000KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0001MNklKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0000XNklFKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0000eNklKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0002>Nkl>K1IY#>7= zyEd6plQ>kH|2m|)e{jzEL{$L@o}TryC~1kZ)!ydx|jko$BalL|xaYDu^I}F@`V2P~J5rE$T06EKb>>;hz4*&oF M07*qoM6N<$f^##X2><{9 literal 0 HcmV?d00001 diff --git a/resources/img/volume_minus.png b/resources/img/volume_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d98f4f6b34efb0a4f417fb455f209a98c1b7206d GIT binary patch literal 3017 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 LNkvXXu0mjfVTqVR literal 0 HcmV?d00001 diff --git a/resources/img/volume_plus.png b/resources/img/volume_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..29717e8301ca455114404fbfd7a422115b4c910f GIT binary patch literal 3142 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 literal 0 HcmV?d00001 diff --git a/resources/js/app.js b/resources/js/app.js index 2a63ef8..aa4a654 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -7,17 +7,37 @@ // Filename: app.js define([ - "jquery" - , "underscore" - , "backbone" + "views/app" + , "views/footer" + , "views/sidebar" + , "views/player" + , "views/main" + , "models/client" + , "models/dmap" ], -function( $, _, Backbone, ClientModel ) { - "use strict"; +function( +AppView +, FooterView +, SideBarView +, PlayerView +, MainView + +, ClientModel +, DMAPModel +) { +"use strict"; - var init = function(){ + var init = function() { + console.log("app.js::init()"); - console.log( "app.js > init()" ); + this.Views = {}; + + this.Views.Footer = new FooterView(); + this.Views.SideBar = new SideBarView(); + this.Views.Player = new PlayerView(); + this.Views.Main = new MainView(); + this.Views.App = new AppView(); var client = new ClientModel({ hostname: "daap.localhost" @@ -25,19 +45,21 @@ function( $, _, Backbone, ClientModel ) { , port: 80 , password: "lawl" }); - console.log(client.attributes); client.on("unauthorized", function __client_unauthorized() { console.log(arguments); }); - client.on("inited", function () { + client.on("inited", function (collections) { console.log(client.url(), arguments); + + var item = collections.databases[collections.databasesInfo.get("dmap_listing").at(0).id].get("dmap_listing").get(107); + console.log(item, item.toJSON(), collections.databases[collections.databasesInfo.get("dmap_listing").at(0).id].get("dmap_listing").toJSON()); }); - console.log(client); + //client.init(); - client.init(); + return this; }; return { init: init }; diff --git a/resources/js/collections/dmap.js b/resources/js/collections/dmap.js index 2f145dd..2f2083c 100644 --- a/resources/js/collections/dmap.js +++ b/resources/js/collections/dmap.js @@ -1,26 +1,51 @@ +/*jslint laxbreak:true */ +/*jslint laxcomma:true */ +/*jslint loopfunc:true */ +/*jslint strict:true */ +/*jslint browser:true */ +/*jslint devel:true */ define([ - "backbone" + "underscore" + , "backbone" , "models/dmap" ] -, function (Backbone, DMAPModel) { +, function (_, Backbone, DMAPModel) { + "use strict"; + var that , Collection = Backbone.Collection.extend({ - model: DMAPModel - - , attributes: {} + attributes: {} + , model: DMAPModel , initialize: function (attributes, options) { - that = this; - - options.fetch && that.fetch = options.fetch && delete options.fetch; + that = this + ; + + if (!_.isObject(options)) { + options = {}; + } - _.extend({}, that.attributes, attributes); + if (_.isFunction(options.fetch)) { + that.fetch = options.fetch; + delete options.fetch; + } + + if (!_.isUndefined(options.model)) { + that.model = options.model; + delete options.model; + } + + Collection.__super__.initialize.call(that, [attributes, options]); - Model.__super__.set(that, [undefined, options]); - return that; } +/* + , toJSON: function(options) { + return this.map(function(model){ return model.toJSON(options); }); + } +*/ + , parse: function () {console.error("PARSE", arguments);} , fetch: function (options) { that.trigger("dmap.collection.fetch", this, arguments); diff --git a/resources/js/collections/server.js b/resources/js/collections/server.js new file mode 100644 index 0000000..9d11c00 --- /dev/null +++ b/resources/js/collections/server.js @@ -0,0 +1,22 @@ +/*jslint laxbreak:true */ +/*jslint laxcomma:true */ +/*jslint loopfunc:true */ +/*jslint strict:true */ +/*jslint browser:true */ +/*jslint devel:true */ +define([ + "underscore" + , "backbone" + , "backbone-localstorage" +] +, function (_, Backbone) { + "use strict"; + + return Backbone.Collection.extend({ + localStorage: new Backbone.LocalStorage("daap-servers") + + , initialize: function () { + return this.__super__.initialize.call(this, arguments); + } + }); +}); \ No newline at end of file diff --git a/resources/js/main.js b/resources/js/main.js index 2ed38db..f62db60 100644 --- a/resources/js/main.js +++ b/resources/js/main.js @@ -12,7 +12,7 @@ require.config({ , "bootstrap-contextmenu": ["bootstrap"] , "jquery": { - exports: "jQuery.fn" + exports: "$" } , "backbone": { @@ -26,6 +26,10 @@ require.config({ , exports: "Backbone" } + , "backbone-localstorage": { + deps: ["backbone"] + } + , "underscore": { exports: "_" } @@ -47,12 +51,13 @@ require.config({ , "jquery-layout": "../vendors/jquery/layout/1.2.0/jquery.layout.min" , "datatables": "../vendors/jquery/datatables/1.9.4/media/js/jquery.dataTables.min" - , "bootstrap": "../vendors/backbone/2.1.1/js/bootstrap.min" - , "bootstrap-contextmenu": "../vendors/backbone/contextmenu/59986df48f/js/bootstrap-contextmenu" + , "bootstrap": "../vendors/bootstrap/2.1.1/js/bootstrap.min" + , "bootstrap-contextmenu": "../vendors/bootstrap/contextmenu/59986df48f/js/bootstrap-contextmenu" , "underscore": "../vendors/lodash/0.9.0/lodash.underscore.min" , "backbone": "../vendors/backbone/0.9.2/backbone-min" + , "backbone-localstorage": "../vendors/backbone/localstorage/8651291560/backbone.localStorage-min" , "toolbox": "../vendors/backbone/toolbox/e0cac9f/toolbox" , "toolbox-extras": "../vendors/backbone/toolbox/e0cac9f/toolbox.extra" } @@ -70,6 +75,9 @@ require( , function ( App, $ ) { "use strict"; + // JQuery Backwords compatibility fix + $.curCSS = $.css; + $("body").ready(function(){ App.init(); }); diff --git a/resources/js/models/client.js b/resources/js/models/client.js index 6768a5f..c818c8b 100644 --- a/resources/js/models/client.js +++ b/resources/js/models/client.js @@ -30,26 +30,20 @@ define([ xhr.open("GET", url, true); xhr.responseType = responseType; + xhr.timeout = 2000; xhr.setRequestHeader("Content-type", contentType); + xhr.overrideMimeType("text/plain; charset=x-user-defined"); // Technically not need with v2 and responseType but for good measures - // TODO: Add this: - // xhr.timeout = 4000; - // xhr.ontimeout = function () { alert("Timed out!!!"); } - - console.log(that.attributes.password, that.attributes.username, window.btoa((that.attributes.username || "") + ":" + (that.attributes.password || ""))); - - if (!_.isEmpty(that.attributes.password) || !_.isEmpty(that.attributes.username)) { - var basicAuth = window.btoa((that.attributes.username || "") + ":" + (that.attributes.password || "")); - + if (!_.isEmpty(that.attributes.basicauth)) { xhr.withCredentials = true; - xhr.setRequestHeader("Authorization", "Basic " + basicAuth); + xhr.setRequestHeader("Authorization", "Basic " + that.attributes.basicauth); } - //xhr.overrideMimeType('text/plain; charset=x-user-defined'); try { - xhr.onerror = function() {console.log(arguments, this);}; - xhr.onabort = function() {console.log(arguments, this);}; - xhr.onload = function(e) { + xhr.onerror = function () {console.log("Error", arguments, this);}; + xhr.onabort = function () {console.log("Abort", arguments, this);}; + xhr.ontimeout = function () {console.log("Timeout", arguments, this);}; + xhr.onload = function (e) { if (this.status === 200) { callback(null, this.response); } else if (this.status === 401) { @@ -66,53 +60,172 @@ define([ } } - , fetchContentTypes = function (success, error) { - xhr(that.url("/content-codes?"), function (err, content) { + , fetchXHR = function (path, success, error) { + xhr(that.url(path), function __fetchXHRCallback(err, content) { if (err) { - error || (error = function (err) {throw [err, content]}()); + if (!_.isFunction(error)) { + error = function (err, cont) { + throw [err, cont]; + }; + } error(err, content); - } else { - that.collections.contentCodes = new DMAPModel([], { - buffer: content - }); - success && success(content); + success(content); } }); } + , fetchContentTypes = function (success, error) { + fetchXHR("/content-codes", function __fetchContentTypesCallback(content) { + that.collections.contentCodes = new DMAPModel(content); + if (_.isFunction(success)) { + success(content); + } + }, error); + } + , fetchServerInfo = function (success, error) { - xhr(that.url("/server-info?"), function (err, content) { - if (err) { - error || error = function (err) {throw [err, content]}(); + fetchXHR("/server-info", function __fetchServerInfoCallback(content) { + that.collections.serverInfo = new DMAPModel(content, { + contentCodes: that.collections.contentCodes + }); - error(err, content); + if (_.isFunction(success)) { + success(content); + } + }, error); + } - } else { - that.collections.serverInfo = new DMAPModel([], { - buffer: content - , contentCodes: that.collections.contentCodes - }); - success && success(content); + , fetchLogin = function (success, error) { + fetchXHR("/login", success, error); + } + + , fetchDatabases = function (success, error) { + fetchXHR("/databases", function __fetchDatabasesCallback(content) { + that.collections.databasesInfo = new DMAPModel(content, { + contentCodes: that.collections.contentCodes + }); + + if (_.isFunction(success)) { + success(content); } - }); + }, error); } - , fetchLogin = function () { + , fetchDatabase = function (success, error, dbId) { + if (_.isUndefined(dbId) || !_.isNumeric(dbId)) { + dbId = 1; + } + + fetchXHR("/databases/" + dbId + "/items", function __fetchDatabaseCallback(content) { + that.collections.databases[dbId] = new DMAPModel(content, { + contentCodes: that.collections.contentCodes + }); + + if (_.isFunction(success)) { + success(content); + } + }, error); + } + + , fetchPlaylists = function (success, error, dbId) { + if (_.isUndefined(dbId) || !_.isNumeric(dbId)) { + dbId = 1; + } + + fetchXHR("/databases/" + dbId + "/containers", function __fetchPlaylistsCallback(content) { + that.collections.playlistsInfo = new DMAPModel(content, { + contentCodes: that.collections.contentCodes + }); + + if (_.isFunction(success)) { + success(content); + } + }, error); + } + + , fetchPlaylist = function (success, error, playlistId, dbId) { + if (_.isUndefined(playlistId) || !_.isNumeric(playlistId)) { + playlistId = 1; + } + + if (_.isUndefined(dbId) || !_.isNumeric(dbId)) { + dbId = 1; + } + + var requestUri = "/databases/" + ; + + requestUri += dbId; + requestUri += "/containers/"; + requestUri += playlistId; + requestUri += "/items"; + requestUri += "?meta=dmap.itemid,dmap.persistentid,dmap.containeritemid"; + + fetchXHR(requestUri, function __fetchPlaylistCallback(content) { + if (!_.isArray(that.collections.playlists[dbId])) { + that.collections.playlists[dbId] = []; + } + + that.collections.playlists[dbId][playlistId] = new DMAPModel(content, { + contentCodes: that.collections.contentCodes + }); + + if (_.isFunction(success)) { + success(content); + } + }, error); + } + + , fetchBrowse = function (success, error, dbId, type) { + // TODO: We need to detect if the server supports browsing or not an implement our own otherwise. + if (_.isEmpty(type) || !_.isString(type) || !_.isArray(that.collections.browser[type])) { + throw new Error("INVALID_BROWSE_TYPE"); + } + + var requestUri = "/databases/" + ; + + requestUri += dbId; + requestUri += "/browse/"; + requestUri += type; + requestUri += "?meta=dmap.itemid,dmap.persistentid,dmap.containeritemid"; + + fetchXHR(requestUri, function __fetchBrowseCallback(content) { + that.collections.browser[type][dbId] = new DMAPModel(content, { + contentCodes: that.collections.contentCodes + }); + + if (_.isFunction(success)) { + success(content); + } + }, error); } - , fetchDatabases = function () { + , fetchGenres = function (success, error, dbId) { + if (_.isUndefined(dbId) || !_.isNumeric(dbId)) { + dbId = 1; + } + return fetchBrowse(success, error, dbId, "genres"); } - , fetchDatabase = function () { + , fetchArtists = function (success, error, dbId) { + if (_.isUndefined(dbId) || !_.isNumeric(dbId)) { + dbId = 1; + } + return fetchBrowse(success, error, dbId, "artists"); } - , fetchPlaylists = function () { + , fetchAlbums = function (success, error, dbId) { + if (_.isUndefined(dbId) || !_.isNumeric(dbId)) { + dbId = 1; + } + return fetchBrowse(success, error, dbId, "albums"); } , Client = Toolbox.Base.extend({ @@ -123,13 +236,60 @@ define([ _.extend(that, Client.defaults); _.extend(that.attributes, attributes); + that.setAuth(); + return this; } + , setAuth: function(username, password) { + if (!_.isUndefined(username)) { + that.attributes.username = username; + } + + if (!_.isUndefined(password)) { + that.attributes.password = password; + } + + if (!_.isEmpty(that.attributes.password) || !_.isEmpty(that.attributes.username)) { + that.attributes.basicauth = window.btoa((that.attributes.username || "") + ":" + (that.attributes.password || "")); + } + + } + , init: function () { + var that = this + ; + + that.console.debug("Fetching content types"); fetchContentTypes(function () { + that.console.debug("Fetching server info"); fetchServerInfo(function () { - that.trigger("inited", that.collections); + that.console.debug("Fetching login"); + fetchLogin(function () { + // TODO: Here we need to request /update for the database version + that.console.debug("Fetching databases info"); + fetchDatabases(function () { + //that.console.debug("Fetching database 1"); + //fetchDatabase(function () { + that.console.debug("Fetching playlists info"); + fetchPlaylists(function () { + //that.console.debug("Fetching playlist 1 of db 1"); + //fetchPlaylist(function () { + //that.console.debug("Fetching genres of db 1"); + //fetchGenres(function () { + //that.console.debug("Fetching artists of db 1"); + //fetchArtists(function () { + //that.console.debug("Fetching albums of db 1"); + //fetchAlbums(function () { + that.trigger("inited", that.collections); + //}); + //}); + //}); + //}); + }); + //}); + }); + }); }); }); @@ -138,6 +298,22 @@ define([ ,logout: function () { + } + + , buildRequestUid: function(path, fields, query) { + if (_.isEmpty(path) || !_.isString(path)) { + throw new Error("INVALID_TYPE_ERROR"); + } + + if (!_.isArray(fields)) { + fields = []; + } + + if (!_.isArray(query)) { + query = []; + } + + } ,url: function (request) { @@ -148,17 +324,58 @@ define([ uri = request; // Add leading slash here! } + if (_.isNumber(this.collections.session.id)) { + var prefix = "?"; + + if (uri.indexOf("?") >= 0) { + prefix = "&"; + } + + uri += prefix + "session-id=" + this.collections.session.id; + } + return this.attributes.protocol + "://" + this.attributes.hostname + ":" + this.attributes.port + uri; } + + , console: { + log: function() { + var args = arguments; + + if (_.isString(args[0])) { + args[0] = that.url() + " " + args[0]; + } + + console.log(args); + } + , debug: function() { + var args = arguments; + + if (_.isString(args[0])) { + args[0] = that.url() + " " + args[0]; + } + + console.debug(args); + } + } }, { defaults: { attributes: { protocol: window.location.protocol.replace(":", "") , hostname: window.location.hostname , port: 3689 - , path: "" - , username: "" - , password: "" + , path: "" + , username: "" + , password: "" + } + + , status: 0 + + , statusCodes: { + disconnected: 0 + , connecting: 1 + , timedout: 2 + , unauthorized: 3 + , connected: 4 } , collections: { @@ -172,20 +389,20 @@ define([ , databasesInfo:null - , databases: null + , databases: [] , playlistsInfo:null - , genres: null + , playlists: [] - , artists: null + , browser: { + genres: [] - , albums: null - } - } + , artists: [] - , lawl: function() { - console.info(arguments); + , albums: [] + } + } } }); diff --git a/resources/js/models/dmap-type.js b/resources/js/models/dmap-type.js index 407d33a..4edaaf1 100644 --- a/resources/js/models/dmap-type.js +++ b/resources/js/models/dmap-type.js @@ -11,157 +11,62 @@ define([ , function (_, Toolbox) { "use strict"; - var that - - , Types = Toolbox.Base.extend({ - constructor: function (code) { - this.code = code - , this.length = null - ; - - if (_.isNumber(code)) { - if (!_.isUndefined(Types.typeMap[code])) { - _.extend(this, Types.typeMap[code]); - } else { - - } - } - - return this; - } - - , code: null - , length: null - , unpack: null - - , getCode: function() { + var + Types = function(code) { + this.code = code; + this.length = null; + this.unpack = null; + this.typeMap = typeMap; + + this.getCode = function() { return this.code; - } + }; - , getByteLength: function() { + this.getByteLength = function() { return this.length; - } - - } - , { - - - typeMap: { - 1: { - length: 1 - , unpack: function (chunk) { - Types.getInt8(chunk); - } - } - - , 2: { - length: 1 - , unpack: function (chunk) { - Types.getUint8(chunk); - } - } - - , 3: { - length: 2 - , unpack: function (chunk) { - Types.getInt16(chunk); - } - } - - , 4: { - length: 2 - , unpack: function (chunk) { - Types.getUint16(chunk); - } - } - - , 5: { - length: 4 - , unpack: function (chunk) { - Types.getInt32(chunk); - } - } - - , 6: { - length: 4 - , unpack: function (chunk) { - Types.getUint32(chunk); - } - } - - , 7: { - length: 8 - , unpack: function (chunk) { - Types.getFloat64(chunk); - } - } - - // There is no unsigned 64bit integer in JS. - , 8: { - length: 8 - , unpack: function (chunk) { - Types.getFloat64(chunk); - } - } - - , 9: { - length: null - , unpack: function (chunk, length) { - Types.getUTFString(chunk, length); - } - } + }; - , 10: { - length: 4 - , unpack: function (chunk) { - Types.getDate(chunk); - } - } + if (_.isNumber(this.code)) { + if (!_.isUndefined(typeMap[this.code])) { + _.extend(this, typeMap[this.code]); + } else { - , 11: { - length: 2 - , unpack: function (chunk) { - Types.getVersion(chunk); - } - } - - , 12: { - length: null - , unpack: function (chunk, length) { - Types.getModel(chunk, length); - } } } - , getInt8: function (chunk) { - return new DataView(chunk.slice(0,Types.typeMap[1].length)).getInt8(0, false); + return this; + } + + , TypesPrototype = { + getInt8: function (chunk) { + return new DataView(chunk.slice(0,typeMap[1].length)).getInt8(0, false); } - , getUint8: function (chunk) { - return new DataView(chunk.slice(0,Types.typeMap[2].length)).getUint8(0, false); + , getUint8: function (chunk) { + return new DataView(chunk.slice(0,typeMap[2].length)).getUint8(0, false); } - , getInt16: function (chunk) { - return new DataView(chunk.slice(0,Types.typeMap[3].length)).getInt16(0, false); + , getInt16: function (chunk) { + return new DataView(chunk.slice(0,typeMap[3].length)).getInt16(0, false); } - , getUint16: function (chunk) { - return new DataView(chunk.slice(0,Types.typeMap[4].length)).getUint16(0, false); + , getUint16: function (chunk) { + return new DataView(chunk.slice(0,typeMap[4].length)).getUint16(0, false); } - , getInt32: function (chunk) { - return new DataView(chunk.slice(0,Types.typeMap[5].length)).getInt32(0, false); + , getInt32: function (chunk) { + return new DataView(chunk.slice(0,typeMap[5].length)).getInt32(0, false); } - , getUint32: function (chunk) { - return new DataView(chunk.slice(0,Types.typeMap[6].length)).getUint32(0, false); + , getUint32: function (chunk) { + return new DataView(chunk.slice(0,typeMap[6].length)).getUint32(0, false); } - , getFloat64: function (chunk) { - return new DataView(chunk.slice(0,Types.typeMap[7].length)).getFloat64(0, false); + , getFloat64: function (chunk) { + return new DataView(chunk.slice(0,typeMap[7].length)).getFloat64(0, false); } - , getString: function(chunk, length) { + , getString: function(chunk, length) { if (!_.isNumber(length) || length > chunk.byteLength) { length = chunk.byteLength; } @@ -170,7 +75,7 @@ define([ } // TODO: This might be optimizable - , getUTFString: function (chunk, length) { + , getUTFString: function (chunk, length) { var str = ''; if (!_.isNumber(length) || length > chunk.byteLength) { length = chunk.byteLength; @@ -189,36 +94,100 @@ define([ return decodeURIComponent(str); } - , getDate: function (chunk) { - return new Date(Types.getUint32(chunk)); + , getDate: function (chunk) { + return new Date(TypesPrototype.getUint32(chunk) * 1000); } - , getVersion: function (chunk) { - return Types.getInt8(chunk.slice(0,1)) + "." + Types.getInt8(chunk.slice(1,2)); + , getVersion: function (chunk) { + return TypesPrototype.getInt8(chunk.slice(0,1)) + "." + TypesPrototype.getInt8(chunk.slice(1,2)); } - , getModel: function (chunk) { + , getModel: function (chunk) { return chunk; } - , getUnknown: function (chunk) { + , getUnknown: function (chunk) { // Unimplemented throw "ERROR_UNIMPLEMENTED"; - /* - switch (chunk.byteLength) { - // We can tring a string - default: - break; - } - */ +// switch (chunk.byteLength) { +// // We can tring a string +// default: +// +// break; +// } + + } + + , getType: function (chunk) { + return TypesPrototype.getString(chunk.slice(0, 4)).toLowerCase(); + } + } + + , typeMap = { + 1: { + length: 1 + , unpack: TypesPrototype.getInt8 + } + + , 2: { + length: 1 + , unpack: TypesPrototype.getUint8 + } + + , 3: { + length: 2 + , unpack: TypesPrototype.getInt16 + } + + , 4: { + length: 2 + , unpack: TypesPrototype.getUint16 + } + + , 5: { + length: 4 + , unpack: TypesPrototype.getInt32 + } + + , 6: { + length: 4 + , unpack: TypesPrototype.getUint32 + } + + , 7: { + length: 8 + , unpack: TypesPrototype.getFloat64 + } + + // There is no unsigned 64bit integer in JS. + , 8: { + length: 8 + , unpack: TypesPrototype.getFloat64 + } + + , 9: { + length: null + , unpack: TypesPrototype.getUTFString + } + + , 10: { + length: 4 + , unpack: TypesPrototype.getDate + } + + , 11: { + length: 2 + , unpack: TypesPrototype.getVersion } - , getType: function (chunk) { - return Types.getString(chunk.slice(0, 4)).toLowerCase(); + , 12: { + length: null + , unpack: TypesPrototype.getModel } + }; - }); + Types.prototype = TypesPrototype; return Types; }); diff --git a/resources/js/models/dmap.js b/resources/js/models/dmap.js index 6e47cbf..eb25ba0 100644 --- a/resources/js/models/dmap.js +++ b/resources/js/models/dmap.js @@ -7,43 +7,61 @@ define([ "underscore" , "backbone" + , "toolbox" , "models/dmap-type" , "collections/dmap" ] -, function (_, Backbone, DMAPType, DMAPCollection) { +, function (_, Backbone, Toolbox, DMAPType, DMAPCollection) { "use strict"; var that + , browserTags = { + "abal": "abal" + , "abar": "abar" + , "abcp": "abcp" + , "abgn": "abgn" + , "abro": "abro" + } + , Model = Backbone.Model.extend({ idAttribute: "_id" , initialize: function (attributes, options) { that = this; - this.contentCodes = options && options.contentCodes || null; - console.log("Initial", options, this.contentCodes); + var contentCodes = options && options.contentCodes || null; - if (options.buffer instanceof ArrayBuffer) { - attributes = parseWrapper(options.buffer); - delete options.buffer; + if (attributes instanceof ArrayBuffer) {//(options.buffer instanceof ArrayBuffer) { + attributes = parseWrapper(attributes, contentCodes); + } - this.set(attributes); + if (attributes && attributes.byteLength) { + delete attributes.byteLength; } + attributes._id = that.getAttributesId(attributes); + + this.set(attributes); + return this; } -/* - , set: function (attributes, options) { - console.log(attributes, options); - - this._id = attributes["dmap.persistentid"] || attributes["dmap.itemid"] || attributes["dmap.containeritemid"]; - - Model.__super__.set(this, arguments); - - return this; + + , getAttributesId: function(attributes) { + return /*attributes["dmap_persistentid"] || */attributes["dmap_itemid"] || attributes["dmap_containeritemid"] || null; } -*/ + + , toJSON: function(options) { + var attrs = _.clone(this.attributes); + + if (!_.isUndefined(attrs._id)) { + attrs.id = attrs._id; + delete attrs._id; + } + + return attrs; + } + , update: function (attributes, options) { that.trigger("dmap.model.update", this, arguments); @@ -85,76 +103,98 @@ define([ } }) - , parseCodeDictionnary = function(dictChunk) { + , parseContentCode = function(dictChunk) { var codeElement = {}; - + while (dictChunk.byteLength > 8) { - var contentCode = DMAPType.getType(dictChunk); - var contentLength = DMAPType.getInt32(dictChunk.slice(4,8)); + var contentCode = DMAPType.prototype.getType(dictChunk); + var contentLength = DMAPType.prototype.getInt32(dictChunk.slice(4,8)); //console.log(contentLength); switch (contentCode) { case 'mcnm': - codeElement.code = DMAPType.getString(dictChunk.slice(8, 8+contentLength)); + codeElement.code = DMAPType.prototype.getString(dictChunk.slice(8, 8+contentLength)); break; - + case 'mcna': - var codeName = DMAPType.getString(dictChunk.slice(8, 8+contentLength)); + var codeName = DMAPType.prototype.getString(dictChunk.slice(8, 8+contentLength)); codeElement.name = codeName.replace(/\./g, '_'); - //console.log(codeElement.name); break; - + case 'mcty': - var typeData = DMAPType.getInt16(dictChunk.slice(8, 8+contentLength)); + var typeData = DMAPType.prototype.getInt16(dictChunk.slice(8, 8+contentLength)); codeElement.type = new DMAPType(typeData); break; } - + dictChunk = dictChunk.slice(8+contentLength); } - + return codeElement; } - , parseBinaryChunk = function (binaryChunk) { + , parseBinaryChunk = function (binaryChunk, contentCodes) { var entry = {}; - + while (binaryChunk.byteLength > 8) { - var tagName = DMAPType.getType(binaryChunk); - var tagLength = DMAPType.getInt32(binaryChunk.slice(4,8)); - //console.debug(codeInfo, tagName, tagLength); - - if (that.contentCodes === null) { - switch (tagName) { - case 'mdcl': - var contentCode = parseCodeDictionnary(binaryChunk.slice(8, 8+tagLength)); - var codeId = contentCode.code.toLowerCase(); - - entry[codeId] = _.extend({}, contentCode, contentCode.type); - break; - - case 'mstt': - // Nothing to do with the status, skip it - break; - } - } else { - var codeInfo = that.contentCodes.get(tagName); - - if (codeInfo) { - if (codeInfo.type === 12) { - if (typeof entry[codeInfo.name] === "undefined") { - // Here we might want to select different collection types depending on the tag - entry[codeInfo.name] = new DMAPCollection(); - } + var tagName = DMAPType.prototype.getType(binaryChunk); + var tagLength = DMAPType.prototype.getInt32(binaryChunk.slice(4,8)); + + if (tagName !== "mstt") { // Skip the status code, we really don't care for it. + if (tagName === "mdcl") { // Our contentCodes is probably empty as we found the content codes + var contentCode = parseContentCode(binaryChunk.slice(8, 8+tagLength)); + var codeId = contentCode.code.toLowerCase(); - entry[codeInfo.name].add(binaryChunk.slice(8, tagLength), {silent: true}); + entry[codeId] = _.extend({}, contentCode, contentCode.type); + } else { + var codeInfo = contentCodes.get(tagName); + + if (!_.isObject(codeInfo)) { + console.info("Unknow content code: " + tagName, tagLength); } else { - //console.log(codeInfo); - entry[codeInfo.name] = codeInfo.unpack(binaryChunk.slice(8), tagLength); + if (codeInfo.getCode() !== 12 ) { + entry[codeInfo.name] = codeInfo.unpack(binaryChunk.slice(8), tagLength); + } else if ((tagName in browserTags) === true) { + tagLength = binaryChunk.byteLength; // This is how fucked DAAP is, we overwrite the length because + // in this specific case 'mlit' which is reported as a container is in fact a string + var browserList = binaryChunk.slice(8); + entry[codeInfo.name] = []; + + while (browserList.byteLength > 8) { + var itemTag = DMAPType.prototype.getType(browserList); + var itemLength = DMAPType.prototype.getInt32(browserList.slice(4,8)); + + entry[codeInfo.name].push(DMAPType.prototype.getUTFString(browserList.slice(8), itemLength)); + + browserList = browserList.slice(8 + itemLength); + } + } else if (codeInfo.getCode() === 12) { + var result = parseBinaryChunk(binaryChunk.slice(8, tagLength), contentCodes); + + if (result) { + var keys = null; + + if (_.isString(result)) { + if ( !(entry[codeInfo.name] instanceof DMAPCollection) ) { + entry[codeInfo.name] = []; + } + + entry[codeInfo.name].push(result); + } else if (getItemId(result) !== null) { + if ( !(entry[codeInfo.name] instanceof DMAPCollection) ) { + entry[codeInfo.name] = new DMAPCollection(); + } + + entry[codeInfo.name].add(new Model(result)); + // Here we found a listing item and we are going to squash the single item array + } else if (_.isObject(result) && Object.keys(result).length === 1) { + entry[codeInfo.name] = result[Object.keys(result)[0]]; + } + } else { + // We could alternatively autodetect the type here + } + } } - } else { - // TODO: we should try to guess. - console.info("Unknown type: " + tagName + "(" + tagLength + ")"); } } @@ -164,39 +204,49 @@ define([ return entry; } - , parseWrapper = function(binaryData) { - var containerType = DMAPType.getType(binaryData); - //var binaryLength = DMAPType.getUint32(binaryData.slice(4,8)); - var contentData = binaryData.slice(8); - - switch (containerType) { - // Update - case "mupd": - // Unsupported - return; - break; - - default: - console.info("Unknown type: " + containerType/*, binaryLength*/, contentData); - // Content codes - case "mccr": - // Server Info - case "msrv": - // Login - case "mlog": - // Database - case "adbs": - // Database info - case "avdb": - // Playlist info - case "aply": - // List of songs - case "apso": - return parseBinaryChunk(contentData); - break; + , parseWrapper = function(binaryData, contentCodes) { + if (binaryData.byteLength <= 8) { + return parseBinaryChunk(binaryData, contentCodes); + } else { + var containerType = DMAPType.prototype.getType(binaryData); + //var binaryLength = DMAPType.prototype.getUint32(binaryData.slice(4,8)); + var contentData = binaryData.slice(8); + switch (containerType) { + // Update + //case "mupd": + // // Unsupported + // return; + //break; + // Browsing list + case "abro": + // Content codes + case "mccr": + // Server Info + case "msrv": + // Login + case "mlog": + // Item listing + case "mlit": + // Database + case "adbs": + // Database info + case "avdb": + // Playlist info + case "aply": + // List of songs + case "apso": + return parseBinaryChunk(contentData, contentCodes); + default: + console.info("Unknown type: " + containerType, contentData); + return parseBinaryChunk(binaryData, contentCodes); + } } } -; + + , getItemId = function (item) { + return item["dmap_persistentid"] || item["dmap_itemid"] || item["dmap_containeritemid"] || null; + } + ; return Model; }); \ No newline at end of file diff --git a/resources/js/models/dmap2 b/resources/js/models/dmap2 new file mode 100644 index 0000000..c12bc3f --- /dev/null +++ b/resources/js/models/dmap2 @@ -0,0 +1,71 @@ +/*jslint laxbreak:true */ +/*jslint laxcomma:true */ +/*jslint loopfunc:true */ +/*jslint strict:true */ +/*jslint browser:true */ +/*jslint devel:true */ +define([ + "underscore" + , "backbone" + , "toolbox" + , "models/dmap-type" +] +, function (_, Backbone, Toolbox, DMAPType) { + "use strict"; + + var that + + , set = function (attributes) { + + } + + , DMAP = Toolbox.Base.extend({ + id: null + , attributes: false + , collection: false + , parentid: null + , index: {} + , items: [] + + , constructor: function (buffer, parent, options) { + + } + + , set: function () { + + } + + , get: function () { + + } + + , getItem: function () { + + } + + , getItemByIndex: function () { + + } + + , parseBinary: function () { + + } + + , parseContentCode: function () { + + } + + , addItem: function (item) { + + } + + , remove: function (items) { + + } + }); + + _.extend(DMAP.prototype, Backbone.Events, {}); + + return DMAP; + +}); \ No newline at end of file diff --git a/resources/js/views/app.js b/resources/js/views/app.js new file mode 100644 index 0000000..1c46f73 --- /dev/null +++ b/resources/js/views/app.js @@ -0,0 +1,59 @@ +/*jslint laxbreak:true */ +/*jslint laxcomma:true */ +/*jslint loopfunc:true */ +/*jslint strict:true */ +/*jslint browser:true */ +/*jslint devel:true */ + +define([ + "jquery" + , "backbone" + , "jquery-layout" +] +, function ($, Backbone) { + "use strict"; + + return Backbone.View.extend({ + el: $("body") + + , layout: null + , layoutItems: null + + , events: { + } + + , initialize: function() { + //_.bindAll(this); + + var that = this; + + that.layout = that.$el.layout({ + //applyDefaultStyles: true + defaults: { + closable: false + , resizable: false + , slidable: false + , spacing_open: 0 + , spacing_closed: 0 + } + + , north: { + size: 52 + } + + , west: { + size: 150 + , closable: true + } + + , center: { + resizable: false + } + + , south: { + size: 30 + } + }); + } + }); +}); \ No newline at end of file diff --git a/resources/js/views/apps.js b/resources/js/views/apps.js deleted file mode 100644 index e69de29..0000000 diff --git a/resources/js/views/client.js b/resources/js/views/client.js new file mode 100644 index 0000000..be3337e --- /dev/null +++ b/resources/js/views/client.js @@ -0,0 +1,32 @@ +/* + +that.layoutItems = $(that.layout.panes.center).layout({ + defaults: { + closable: false + , resizable: true + , slidable: true + , spacing_open: 5 + , spacing_closed: 5 + } + + , north: { + minSize: 100 + , size: 200 + , closable: true + //, onresize: function (pane, $pane, state, options) { + // var viewportHeight = $pane.innerHeight() - App.BrowserView.$el.find(".dataTables_scrollHead").height(); + // App.BrowserView.$el.find(".dataTables_scrollBody").height(viewportHeight); + // //App.BrowserView.reDraw(); + // } + } + + , center: { + minSize: 200 + //, onresize: function (pane, $pane, state, options) { + // var viewportHeight = $pane.innerHeight() - App.ListView.$el.find(".dataTables_scrollHead").height(); + // App.ListView.$el.find(".dataTables_scrollBody").height(viewportHeight); + // //App.ListView.render(); + // } + } +}); + */ \ No newline at end of file diff --git a/resources/js/views/footer.js b/resources/js/views/footer.js index e69de29..0cefaf4 100644 --- a/resources/js/views/footer.js +++ b/resources/js/views/footer.js @@ -0,0 +1,14 @@ +/*jslint laxbreak:true */ +/*jslint laxcomma:true */ +/*jslint loopfunc:true */ +/*jslint strict:true */ +/*jslint browser:true */ +/*jslint devel:true */ +define([ + "bootstrap" +] +, function (Bootstrap) { + "use strict"; + + return function() {}; +}); \ No newline at end of file diff --git a/resources/js/views/main.js b/resources/js/views/main.js index e69de29..a9c4497 100644 --- a/resources/js/views/main.js +++ b/resources/js/views/main.js @@ -0,0 +1,13 @@ +/*jslint laxbreak:true */ +/*jslint laxcomma:true */ +/*jslint loopfunc:true */ +/*jslint strict:true */ +/*jslint browser:true */ +/*jslint devel:true */ +define([ +] +, function () { + "use strict"; + + return function() {}; +}); \ No newline at end of file diff --git a/resources/js/views/player.js b/resources/js/views/player.js index e69de29..a9c4497 100644 --- a/resources/js/views/player.js +++ b/resources/js/views/player.js @@ -0,0 +1,13 @@ +/*jslint laxbreak:true */ +/*jslint laxcomma:true */ +/*jslint loopfunc:true */ +/*jslint strict:true */ +/*jslint browser:true */ +/*jslint devel:true */ +define([ +] +, function () { + "use strict"; + + return function() {}; +}); \ No newline at end of file diff --git a/resources/js/views/sidebar.js b/resources/js/views/sidebar.js new file mode 100644 index 0000000..a9c4497 --- /dev/null +++ b/resources/js/views/sidebar.js @@ -0,0 +1,13 @@ +/*jslint laxbreak:true */ +/*jslint laxcomma:true */ +/*jslint loopfunc:true */ +/*jslint strict:true */ +/*jslint browser:true */ +/*jslint devel:true */ +define([ +] +, function () { + "use strict"; + + return function() {}; +}); \ No newline at end of file diff --git a/resources/js/views/siderbar.js b/resources/js/views/siderbar.js deleted file mode 100644 index e69de29..0000000 diff --git a/resources/vendors/backbone/localstorage/8651291560 b/resources/vendors/backbone/localstorage/8651291560 new file mode 160000 index 0000000..8651291 --- /dev/null +++ b/resources/vendors/backbone/localstorage/8651291560 @@ -0,0 +1 @@ +Subproject commit 8651291560d37403bf347466213bd8b900b0a501 diff --git a/resources/vendors/lodash/string/2.3.0/underscore.string.min.js b/resources/vendors/lodash/string/2.3.0/underscore.string.min.js new file mode 100644 index 0000000..8fc1e2d --- /dev/null +++ b/resources/vendors/lodash/string/2.3.0/underscore.string.min.js @@ -0,0 +1 @@ +!function(e,t){"use strict";var n=t.prototype.trim,r=t.prototype.trimRight,i=t.prototype.trimLeft,s=function(e){return e*1||0},o=function(e,t){if(t<1)return"";var n="";while(t>0)t&1&&(n+=e),t>>=1,e+=e;return n},u=[].slice,a=function(e){return e==null?"\\s":e.source?e.source:"["+p.escapeRegExp(e)+"]"},f={lt:"<",gt:">",quot:'"',apos:"'",amp:"&"},l={};for(var c in f)l[f[c]]=c;var h=function(){function e(e){return Object.prototype.toString.call(e).slice(8,-1).toLowerCase()}var n=o,r=function(){return r.cache.hasOwnProperty(arguments[0])||(r.cache[arguments[0]]=r.parse(arguments[0])),r.format.call(null,r.cache[arguments[0]],arguments)};return r.format=function(r,i){var s=1,o=r.length,u="",a,f=[],l,c,p,d,v,m;for(l=0;l=0?"+"+a:a,v=p[4]?p[4]=="0"?"0":p[4].charAt(1):" ",m=p[6]-t(a).length,d=p[6]?n(v,m):"",f.push(p[5]?a+d:d+a)}}return f.join("")},r.cache={},r.parse=function(e){var t=e,n=[],r=[],i=0;while(t){if((n=/^[^\x25]+/.exec(t))!==null)r.push(n[0]);else if((n=/^\x25{2}/.exec(t))!==null)r.push("%");else{if((n=/^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(t))===null)throw new Error("[_.sprintf] huh?");if(n[2]){i|=1;var s=[],o=n[2],u=[];if((u=/^([a-z_][a-z_\d]*)/i.exec(o))===null)throw new Error("[_.sprintf] huh?");s.push(u[1]);while((o=o.substring(u[0].length))!=="")if((u=/^\.([a-z_][a-z_\d]*)/i.exec(o))!==null)s.push(u[1]);else{if((u=/^\[(\d+)\]/.exec(o))===null)throw new Error("[_.sprintf] huh?");s.push(u[1])}n[2]=s}else i|=2;if(i===3)throw new Error("[_.sprintf] mixing positional and named placeholders is not (yet) supported");r.push(n)}t=t.substring(n[0].length)}return r},r}(),p={VERSION:"2.3.0",isBlank:function(e){return e==null&&(e=""),/^\s*$/.test(e)},stripTags:function(e){return e==null?"":t(e).replace(/<\/?[^>]+>/g,"")},capitalize:function(e){return e=e==null?"":t(e),e.charAt(0).toUpperCase()+e.slice(1)},chop:function(e,n){return e==null?[]:(e=t(e),n=~~n,n>0?e.match(new RegExp(".{1,"+n+"}","g")):[e])},clean:function(e){return p.strip(e).replace(/\s+/g," ")},count:function(e,n){return e==null||n==null?0:t(e).split(n).length-1},chars:function(e){return e==null?[]:t(e).split("")},swapCase:function(e){return e==null?"":t(e).replace(/\S/g,function(e){return e===e.toUpperCase()?e.toLowerCase():e.toUpperCase()})},escapeHTML:function(e){return e==null?"":t(e).replace(/[&<>"']/g,function(e){return"&"+l[e]+";"})},unescapeHTML:function(e){return e==null?"":t(e).replace(/\&([^;]+);/g,function(e,n){var r;return n in f?f[n]:(r=n.match(/^#x([\da-fA-F]+)$/))?t.fromCharCode(parseInt(r[1],16)):(r=n.match(/^#(\d+)$/))?t.fromCharCode(~~r[1]):e})},escapeRegExp:function(e){return e==null?"":t(e).replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")},splice:function(e,t,n,r){var i=p.chars(e);return i.splice(~~t,~~n,r),i.join("")},insert:function(e,t,n){return p.splice(e,t,0,n)},include:function(e,n){return n===""?!0:e==null?!1:t(e).indexOf(n)!==-1},join:function(){var e=u.call(arguments),t=e.shift();return t==null&&(t=""),e.join(t)},lines:function(e){return e==null?[]:t(e).split("\n")},reverse:function(e){return p.chars(e).reverse().join("")},startsWith:function(e,n){return n===""?!0:e==null||n==null?!1:(e=t(e),n=t(n),e.length>=n.length&&e.slice(0,n.length)===n)},endsWith:function(e,n){return n===""?!0:e==null||n==null?!1:(e=t(e),n=t(n),e.length>=n.length&&e.slice(e.length-n.length)===n)},succ:function(e){return e==null?"":(e=t(e),e.slice(0,-1)+t.fromCharCode(e.charCodeAt(e.length-1)+1))},titleize:function(e){return e==null?"":t(e).replace(/(?:^|\s)\S/g,function(e){return e.toUpperCase()})},camelize:function(e){return p.trim(e).replace(/[-_\s]+(.)?/g,function(e,t){return t.toUpperCase()})},underscored:function(e){return p.trim(e).replace(/([a-z\d])([A-Z]+)/g,"$1_$2").replace(/[-\s]+/g,"_").toLowerCase()},dasherize:function(e){return p.trim(e).replace(/([A-Z])/g,"-$1").replace(/[-_\s]+/g,"-").toLowerCase()},classify:function(e){return p.titleize(t(e).replace(/_/g," ")).replace(/\s/g,"")},humanize:function(e){return p.capitalize(p.underscored(e).replace(/_id$/,"").replace(/_/g," "))},trim:function(e,r){return e==null?"":!r&&n?n.call(e):(r=a(r),t(e).replace(new RegExp("^"+r+"+|"+r+"+$","g"),""))},ltrim:function(e,n){return e==null?"":!n&&i?i.call(e):(n=a(n),t(e).replace(new RegExp("^"+n+"+"),""))},rtrim:function(e,n){return e==null?"":!n&&r?r.call(e):(n=a(n),t(e).replace(new RegExp(n+"+$"),""))},truncate:function(e,n,r){return e==null?"":(e=t(e),r=r||"...",n=~~n,e.length>n?e.slice(0,n)+r:e)},prune:function(e,n,r){if(e==null)return"";e=t(e),n=~~n,r=r!=null?t(r):"...";if(e.length<=n)return e;var i=function(e){return e.toUpperCase()!==e.toLowerCase()?"A":" "},s=e.slice(0,n+1).replace(/.(?=\W*\w*$)/g,i);return s.slice(s.length-2).match(/\w\w/)?s=s.replace(/\s*\S+$/,""):s=p.rtrim(s.slice(0,s.length-1)),(s+r).length>e.length?e:e.slice(0,s.length)+r},words:function(e,t){return p.isBlank(e)?[]:p.trim(e,t).split(t||/\s+/)},pad:function(e,n,r,i){e=e==null?"":t(e),n=~~n;var s=0;r?r.length>1&&(r=r.charAt(0)):r=" ";switch(i){case"right":return s=n-e.length,e+o(r,s);case"both":return s=n-e.length,o(r,Math.ceil(s/2))+e+o(r,Math.floor(s/2));default:return s=n-e.length,o(r,s)+e}},lpad:function(e,t,n){return p.pad(e,t,n)},rpad:function(e,t,n){return p.pad(e,t,n,"right")},lrpad:function(e,t,n){return p.pad(e,t,n,"both")},sprintf:h,vsprintf:function(e,t){return t.unshift(e),h.apply(null,t)},toNumber:function(e,n){if(e==null||e=="")return 0;e=t(e);var r=s(s(e).toFixed(~~n));return r===0&&!e.match(/^0+$/)?Number.NaN:r},numberFormat:function(e,t,n,r){if(isNaN(e)||e==null)return"";e=e.toFixed(~~t),r=r||",";var i=e.split("."),s=i[0],o=i[1]?(n||".")+i[1]:"";return s.replace(/(\d)(?=(?:\d{3})+$)/g,"$1"+r)+o},strRight:function(e,n){if(e==null)return"";e=t(e),n=n!=null?t(n):n;var r=n?e.indexOf(n):-1;return~r?e.slice(r+n.length,e.length):e},strRightBack:function(e,n){if(e==null)return"";e=t(e),n=n!=null?t(n):n;var r=n?e.lastIndexOf(n):-1;return~r?e.slice(r+n.length,e.length):e},strLeft:function(e,n){if(e==null)return"";e=t(e),n=n!=null?t(n):n;var r=n?e.indexOf(n):-1;return~r?e.slice(0,r):e},strLeftBack:function(e,t){if(e==null)return"";e+="",t=t!=null?""+t:t;var n=e.lastIndexOf(t);return~n?e.slice(0,n):e},toSentence:function(e,t,n,r){t=t||", ",n=n||" and ";var i=e.slice(),s=i.pop();return e.length>2&&r&&(n=p.rtrim(t)+n),i.length?i.join(t)+n+s:s},toSentenceSerial:function(){var e=u.call(arguments);return e[3]=!0,p.toSentence.apply(p,e)},slugify:function(e){if(e==null)return"";var n="ąà áäâãåæćęèéëêìíïîłńòóöôõøùúüûñçżź",r="aaaaaaaaceeeeeiiiilnoooooouuuunczz",i=new RegExp(a(n),"g");return e=t(e).toLowerCase().replace(i,function(e){var t=n.indexOf(e);return r.charAt(t)||"-"}),p.dasherize(e.replace(/[^\w\s-]/g,""))},surround:function(e,t){return[t,e,t].join("")},quote:function(e){return p.surround(e,'"')},exports:function(){var e={};for(var t in this){if(!this.hasOwnProperty(t)||t.match(/^(?:include|contains|reverse)$/))continue;e[t]=this[t]}return e},repeat:function(e,n,r){if(e==null)return"";n=~~n;if(r==null)return o(t(e),n);for(var i=[];n>0;i[--n]=e);return i.join(r)},levenshtein:function(e,n){if(e==null&&n==null)return 0;if(e==null)return t(n).length;if(n==null)return t(e).length;e=t(e),n=t(n);var r=[],i,s;for(var o=0;o<=n.length;o++)for(var u=0;u<=e.length;u++)o&&u?e.charAt(u-1)===n.charAt(o-1)?s=i:s=Math.min(r[u],r[u-1],i)+1:s=o+u,i=r[u],r[u]=s;return r.pop()}};p.strip=p.trim,p.lstrip=p.ltrim,p.rstrip=p.rtrim,p.center=p.lrpad,p.rjust=p.lpad,p.ljust=p.rpad,p.contains=p.include,p.q=p.quote,typeof exports!="undefined"?(typeof module!="undefined"&&module.exports&&(module.exports=p),exports._s=p):typeof define=="function"&&define.amd?define("underscore.string",[],function(){return p}):(e._=e._||{},e._.string=e._.str=p)}(this,String); \ No newline at end of file