';
var imgUrl;
+ var style = '';
if (job.PrimaryImageItemId) {
imgUrl = ApiClient.getScaledImageUrl(job.PrimaryImageItemId, {
@@ -31,18 +60,27 @@
width: 400,
tag: job.PrimaryImageTag
});
+ } else {
+ style = "background-color:#38c;background-position:center center;";
+ imgUrl = "css/images/items/detail/video.png";
}
- if (imgUrl) {
- html += '
';
+ html += '
';
+
+ if (job.Progress) {
+ html += '";
}
+ html += "
";
+
if (job.Status == 'Completed') {
html += '
';
}
else if (job.Status == 'Queued') {
- html += '
';
}
else if (job.Status == 'Transcoding' || job.Status == 'Transferring') {
html += '
';
@@ -51,7 +89,7 @@
html += '
';
}
else if (job.Status == 'TranscodingFailed') {
- html += '
';
+ html += '
';
}
// cardContent
@@ -80,37 +118,16 @@
textLines.push(' ');
}
+ html += '
';
+ html += '';
+ html += "
";
+
for (var i = 0, length = textLines.length; i < length; i++) {
- html += "
";
+ html += "
";
html += textLines[i];
html += "
";
}
- //if (!plugin.isExternal) {
- // html += "
";
- // html += plugin.price > 0 ? "$" + plugin.price.toFixed(2) : Globalize.translate('LabelFree');
- // html += RatingHelpers.getStoreRatingHtml(plugin.avgRating, plugin.id, plugin.name);
-
- // html += "";
- // html += " " + Globalize.translate('LabelNumberReviews').replace("{0}", plugin.totalRatings);
- // html += "";
-
- // html += "
";
- //}
-
- //var installedPlugin = plugin.isApp ? null : installedPlugins.filter(function (ip) {
- // return ip.Name == plugin.name;
- //})[0];
-
- //html += "
";
-
- //if (installedPlugin) {
- // html += Globalize.translate('LabelVersionInstalled').replace("{0}", installedPlugin.Version);
- //} else {
- // html += ' ';
- //}
- //html += "
";
-
// cardFooter
html += "
";
@@ -142,15 +159,49 @@
html += getSyncJobHtml(job);
}
- $('.syncActivity', page).html(html).trigger('create');
+ var elem = $('.syncActivity', page).html(html).trigger('create');
+
+ $('.btnJobMenu', elem).on('click', function () {
+ showJobMenu(this);
+ });
}
- $(document).on('pageshow', "#dashboardSyncPage", function () {
+ function showJobMenu(elem) {
+
+ var card = $(elem).parents('.card');
+ var page = $(elem).parents('.page');
+ var id = card.attr('data-id');
+
+ $('.jobMenu', page).popup("close").remove();
+
+ var html = '';
+
+ page.append(html);
+
+ var flyout = $('.jobMenu', page).popup({ positionTo: elem || "window" }).trigger('create').popup("open").on("popupafterclose", function () {
+
+ $(this).off("popupafterclose").remove();
+
+ });
+
+ $('.btnCancelJob', flyout).on('click', function () {
+ cancelJob(page, this.getAttribute('data-id'));
+ });
+ }
+
+ function reloadData(page) {
Dashboard.showLoadingMsg();
- var page = this;
-
var promise1 = ApiClient.getJSON(ApiClient.getUrl('Sync/Jobs'));
var promise2 = ApiClient.getJSON(ApiClient.getUrl('Sync/Targets'));
@@ -162,6 +213,13 @@
Dashboard.hideLoadingMsg();
});
+ }
+
+ $(document).on('pageshow', "#dashboardSyncPage", function () {
+
+ var page = this;
+
+ reloadData(page);
}).on('pageinit', "#dashboardSyncPage", function () {
diff --git a/dashboard-ui/scripts/devices.js b/dashboard-ui/scripts/devices.js
index fa150733be..b28ec6b402 100644
--- a/dashboard-ui/scripts/devices.js
+++ b/dashboard-ui/scripts/devices.js
@@ -77,7 +77,11 @@
function loadData(page) {
Dashboard.showLoadingMsg();
- ApiClient.getJSON(ApiClient.getUrl('Devices')).done(function (devices) {
+ ApiClient.getJSON(ApiClient.getUrl('Devices', {
+
+ SupportsDeviceId: true
+
+ })).done(function (devices) {
load(page, devices);
diff --git a/dashboard-ui/scripts/episodes.js b/dashboard-ui/scripts/episodes.js
index 33c1408549..b8b904aca6 100644
--- a/dashboard-ui/scripts/episodes.js
+++ b/dashboard-ui/scripts/episodes.js
@@ -9,7 +9,7 @@
SortOrder: "Ascending",
IncludeItemTypes: "Episode",
Recursive: true,
- Fields: "PrimaryImageAspectRatio,MediaSourceCount,IsUnidentified,UserData",
+ Fields: "PrimaryImageAspectRatio,MediaSourceCount,IsUnidentified,UserData,SyncInfo",
StartIndex: 0,
IsMissing: false,
IsVirtualUnaired: false,
diff --git a/dashboard-ui/scripts/favorites.js b/dashboard-ui/scripts/favorites.js
index 54d2fcd422..2ec6f7734e 100644
--- a/dashboard-ui/scripts/favorites.js
+++ b/dashboard-ui/scripts/favorites.js
@@ -24,7 +24,7 @@
Filters: "IsFavorite",
Limit: screenWidth >= 1920 ? 10 : (screenWidth >= 1440 ? 8 : 6),
Recursive: true,
- Fields: "PrimaryImageAspectRatio",
+ Fields: "PrimaryImageAspectRatio,SyncInfo",
CollapseBoxSetItems: false,
ExcludeLocationTypes: "Virtual"
};
diff --git a/dashboard-ui/scripts/indexpage.js b/dashboard-ui/scripts/indexpage.js
index bd51824469..601dedb1da 100644
--- a/dashboard-ui/scripts/indexpage.js
+++ b/dashboard-ui/scripts/indexpage.js
@@ -126,7 +126,7 @@
var options = {
Limit: 24,
- Fields: "PrimaryImageAspectRatio",
+ Fields: "PrimaryImageAspectRatio,SyncInfo",
IsPlayed: false
};
@@ -163,7 +163,7 @@
var options = {
Limit: screenWidth >= 2400 ? 10 : (screenWidth >= 1600 ? 10 : (screenWidth >= 1440 ? 8 : (screenWidth >= 800 ? 7 : 6))),
- Fields: "PrimaryImageAspectRatio",
+ Fields: "PrimaryImageAspectRatio,SyncInfo",
Filters: "IsUnplayed",
UserId: userId
};
@@ -279,7 +279,7 @@
Filters: "IsResumable",
Limit: screenWidth >= 1920 ? 10 : (screenWidth >= 1600 ? 8 : (screenWidth >= 1200 ? 9 : 6)),
Recursive: true,
- Fields: "PrimaryImageAspectRatio",
+ Fields: "PrimaryImageAspectRatio,SyncInfo",
CollapseBoxSetItems: false,
ExcludeLocationTypes: "Virtual"
};
@@ -355,7 +355,7 @@
var options = {
Limit: screenWidth >= 1600 ? 6 : (screenWidth >= 1440 ? 5 : (screenWidth >= 800 ? 6 : 6)),
- Fields: "PrimaryImageAspectRatio",
+ Fields: "PrimaryImageAspectRatio,SyncInfo",
Filters: "IsUnplayed",
UserId: Dashboard.getCurrentUserId(),
ChannelIds: channel.Id
diff --git a/dashboard-ui/scripts/itemdetailpage.js b/dashboard-ui/scripts/itemdetailpage.js
index 58812d192b..e8063e37ae 100644
--- a/dashboard-ui/scripts/itemdetailpage.js
+++ b/dashboard-ui/scripts/itemdetailpage.js
@@ -596,7 +596,7 @@
var options = {
userId: Dashboard.getCurrentUserId(),
limit: 5,
- fields: "PrimaryImageAspectRatio,UserData"
+ fields: "PrimaryImageAspectRatio,UserData,SyncInfo"
};
if (item.Type == "Movie") {
@@ -722,7 +722,7 @@
_childrenItemsQuery = null;
- var fields = "ItemCounts,AudioInfo,PrimaryImageAspectRatio";
+ var fields = "ItemCounts,AudioInfo,PrimaryImageAspectRatio,SyncInfo";
var query = {
ParentId: item.Id,
@@ -1069,7 +1069,7 @@
SortOrder: "Ascending",
IncludeItemTypes: "MusicVideo",
Recursive: true,
- Fields: "DateCreated",
+ Fields: "DateCreated,SyncInfo",
Albums: item.Name
}).done(function (result) {
diff --git a/dashboard-ui/scripts/itemlistpage.js b/dashboard-ui/scripts/itemlistpage.js
index 6b7c413011..8ec0fd9231 100644
--- a/dashboard-ui/scripts/itemlistpage.js
+++ b/dashboard-ui/scripts/itemlistpage.js
@@ -7,7 +7,7 @@
SortBy: "SortName",
SortOrder: "Ascending",
- Fields: "DateCreated,PrimaryImageAspectRatio,MediaSourceCount",
+ Fields: "DateCreated,PrimaryImageAspectRatio,MediaSourceCount,SyncInfo",
StartIndex: 0,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb"
diff --git a/dashboard-ui/scripts/librarybrowser.js b/dashboard-ui/scripts/librarybrowser.js
index 575b997332..a50018ef97 100644
--- a/dashboard-ui/scripts/librarybrowser.js
+++ b/dashboard-ui/scripts/librarybrowser.js
@@ -26,11 +26,7 @@
// Chrome seems to have virtualization built-in and can handle large lists easily
var isChrome = $.browser.chrome;
- if (getWindowUrl().toString().toLowerCase().indexOf('localhost') != -1) {
- return isChrome ? 200 : 100;
- }
-
- return isChrome ? 100 : 50;
+ return isChrome ? 200 : 100;
},
getDefaultItemsView: function (view, mobileView) {
@@ -345,6 +341,10 @@
commands.push('refresh');
+ if (SyncManager.isAvailable(item)) {
+ commands.push('sync');
+ }
+
return commands;
},
@@ -924,6 +924,10 @@
itemCommands.push('delete');
}
+ if (SyncManager.isAvailable(item)) {
+ itemCommands.push('sync');
+ }
+
return itemCommands;
},
diff --git a/dashboard-ui/scripts/librarylist.js b/dashboard-ui/scripts/librarylist.js
index 755df36b85..2e7e54c703 100644
--- a/dashboard-ui/scripts/librarylist.js
+++ b/dashboard-ui/scripts/librarylist.js
@@ -245,6 +245,20 @@
return false;
}
+ function onSyncButtonClick() {
+
+ var id = this.getAttribute('data-itemid');
+
+ closeContextMenu();
+
+ ApiClient.getItem(Dashboard.getCurrentUserId(), id).done(function (item) {
+
+ SyncManager.showMenu([item]);
+ });
+
+ return false;
+ }
+
function onExternalPlayerButtonClick() {
closeContextMenu();
@@ -409,6 +423,10 @@
html += '
' + Globalize.translate('ButtonRemoveFromPlaylist') + '';
}
+ if (commands.indexOf('sync') != -1) {
+ html += '
' + Globalize.translate('ButtonSync') + '';
+ }
+
if (commands.indexOf('delete') != -1) {
html += '
' + Globalize.translate('ButtonDelete') + '';
}
@@ -437,6 +455,7 @@
$('.btnQueueAllFromHere', elem).on('click', onQueueAllFromHereButtonClick);
$('.btnExternalPlayer', elem).on('click', onExternalPlayerButtonClick);
$('.btnDelete', elem).on('click', onDeleteButtonClick);
+ $('.btnSync', elem).on('click', onSyncButtonClick);
});
}
@@ -710,6 +729,38 @@
}).get();
}
+ function sync(page) {
+
+ var selection = getSelectedItems(page);
+
+ if (selection.length < 1) {
+
+ Dashboard.alert({
+ message: Globalize.translate('MessagePleaseSelectOneItem'),
+ title: Globalize.translate('HeaderError')
+ });
+
+ return;
+ }
+
+ ApiClient.getItems({
+
+ ids: selection.join(','),
+ fields: 'SyncInfo',
+ userId: Dashboard.getCurrentUserId()
+
+ }).done(function (result) {
+
+ SyncManager.showMenu(result.Items);
+
+ $(SyncManager).off('jobsubmit.librarylist').on('jobsubmit.librarylist', function () {
+
+ hideSelections(page);
+ });
+
+ });
+ }
+
function combineVersions(page) {
var selection = getSelectedItems(page);
@@ -850,6 +901,10 @@
combineVersions(page);
});
+ $('.btnSyncItems', page).on('click', function () {
+ sync(page);
+ });
+
$('.btnAddToCollection', page).on('click', function () {
addToCollection(page);
});
diff --git a/dashboard-ui/scripts/moviecollections.js b/dashboard-ui/scripts/moviecollections.js
index c3355bec5f..d36bec0fa2 100644
--- a/dashboard-ui/scripts/moviecollections.js
+++ b/dashboard-ui/scripts/moviecollections.js
@@ -9,7 +9,7 @@
SortOrder: "Ascending",
IncludeItemTypes: "BoxSet",
Recursive: true,
- Fields: "PrimaryImageAspectRatio,SortName",
+ Fields: "PrimaryImageAspectRatio,SortName,SyncInfo",
StartIndex: 0,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb"
diff --git a/dashboard-ui/scripts/moviegenres.js b/dashboard-ui/scripts/moviegenres.js
index afdb995319..4483766617 100644
--- a/dashboard-ui/scripts/moviegenres.js
+++ b/dashboard-ui/scripts/moviegenres.js
@@ -9,7 +9,7 @@
SortOrder: "Ascending",
IncludeItemTypes: "Movie",
Recursive: true,
- Fields: "DateCreated",
+ Fields: "DateCreated,SyncInfo",
StartIndex: 0
};
diff --git a/dashboard-ui/scripts/movies.js b/dashboard-ui/scripts/movies.js
index f8def57735..900ff54f3f 100644
--- a/dashboard-ui/scripts/movies.js
+++ b/dashboard-ui/scripts/movies.js
@@ -9,7 +9,7 @@
SortOrder: "Ascending",
IncludeItemTypes: "Movie",
Recursive: true,
- Fields: "PrimaryImageAspectRatio,SortName,MediaSourceCount,IsUnidentified",
+ Fields: "PrimaryImageAspectRatio,SortName,MediaSourceCount,IsUnidentified,SyncInfo",
StartIndex: 0,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb"
diff --git a/dashboard-ui/scripts/movieslatest.js b/dashboard-ui/scripts/movieslatest.js
index bd47c0c2ef..c20c53ae27 100644
--- a/dashboard-ui/scripts/movieslatest.js
+++ b/dashboard-ui/scripts/movieslatest.js
@@ -11,7 +11,7 @@
IncludeItemTypes: "Movie",
Limit: 30,
- Fields: "PrimaryImageAspectRatio,MediaSourceCount",
+ Fields: "PrimaryImageAspectRatio,MediaSourceCount,SyncInfo",
ParentId: parentId,
IsPlayed: false,
ImageTypeLimit: 1,
diff --git a/dashboard-ui/scripts/moviesrecommended.js b/dashboard-ui/scripts/moviesrecommended.js
index d2a8e033ad..b3ab5fa267 100644
--- a/dashboard-ui/scripts/moviesrecommended.js
+++ b/dashboard-ui/scripts/moviesrecommended.js
@@ -54,7 +54,7 @@
Filters: "IsResumable",
Limit: screenWidth >= 1920 ? 12 : (screenWidth >= 1600 ? 8 : (screenWidth >= 1200 ? 6 : 3)),
Recursive: true,
- Fields: "PrimaryImageAspectRatio,MediaSourceCount",
+ Fields: "PrimaryImageAspectRatio,MediaSourceCount,SyncInfo",
CollapseBoxSetItems: false,
ParentId: parentId,
ImageTypeLimit: 1,
@@ -86,7 +86,7 @@
userId: Dashboard.getCurrentUserId(),
categoryLimit: screenWidth >= 1200 ? 4 : 3,
ItemLimit: screenWidth >= 1920 ? 10 : (screenWidth >= 1600 ? 7 : (screenWidth >= 1200 ? 7 : 7)),
- Fields: "PrimaryImageAspectRatio,MediaSourceCount",
+ Fields: "PrimaryImageAspectRatio,MediaSourceCount,SyncInfo",
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb"
});
diff --git a/dashboard-ui/scripts/movietrailers.js b/dashboard-ui/scripts/movietrailers.js
index 399d29d2f2..d7d77a0109 100644
--- a/dashboard-ui/scripts/movietrailers.js
+++ b/dashboard-ui/scripts/movietrailers.js
@@ -8,7 +8,7 @@
SortBy: "SortName",
SortOrder: "Ascending",
Recursive: true,
- Fields: "PrimaryImageAspectRatio,SortName",
+ Fields: "PrimaryImageAspectRatio,SortName,SyncInfo",
StartIndex: 0,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb"
diff --git a/dashboard-ui/scripts/musicalbumartists.js b/dashboard-ui/scripts/musicalbumartists.js
index 949d121522..dee774e6bb 100644
--- a/dashboard-ui/scripts/musicalbumartists.js
+++ b/dashboard-ui/scripts/musicalbumartists.js
@@ -10,7 +10,7 @@
SortBy: "SortName",
SortOrder: "Ascending",
Recursive: true,
- Fields: "PrimaryImageAspectRatio,SortName,DateCreated",
+ Fields: "PrimaryImageAspectRatio,SortName,DateCreated,SyncInfo",
StartIndex: 0,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb"
diff --git a/dashboard-ui/scripts/musicalbums.js b/dashboard-ui/scripts/musicalbums.js
index 7c9735f7ae..be182c3218 100644
--- a/dashboard-ui/scripts/musicalbums.js
+++ b/dashboard-ui/scripts/musicalbums.js
@@ -9,7 +9,7 @@
SortOrder: "Ascending",
IncludeItemTypes: "MusicAlbum",
Recursive: true,
- Fields: "PrimaryImageAspectRatio,SortName",
+ Fields: "PrimaryImageAspectRatio,SortName,SyncInfo",
StartIndex: 0,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb"
diff --git a/dashboard-ui/scripts/musicartists.js b/dashboard-ui/scripts/musicartists.js
index 37268e32cc..c81ea99d44 100644
--- a/dashboard-ui/scripts/musicartists.js
+++ b/dashboard-ui/scripts/musicartists.js
@@ -10,7 +10,7 @@
SortBy: "SortName",
SortOrder: "Ascending",
Recursive: true,
- Fields: "PrimaryImageAspectRatio,SortName,DateCreated",
+ Fields: "PrimaryImageAspectRatio,SortName,DateCreated,SyncInfo",
StartIndex: 0,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb"
diff --git a/dashboard-ui/scripts/musicgenres.js b/dashboard-ui/scripts/musicgenres.js
index 823a38e254..7248ebf338 100644
--- a/dashboard-ui/scripts/musicgenres.js
+++ b/dashboard-ui/scripts/musicgenres.js
@@ -7,7 +7,7 @@
SortOrder: "Ascending",
IncludeItemTypes: "Audio,MusicVideo",
Recursive: true,
- Fields: "DateCreated",
+ Fields: "DateCreated,SyncInfo",
StartIndex: 0
};
diff --git a/dashboard-ui/scripts/musicrecommended.js b/dashboard-ui/scripts/musicrecommended.js
index ae5c9fb2a9..81b0cfd58b 100644
--- a/dashboard-ui/scripts/musicrecommended.js
+++ b/dashboard-ui/scripts/musicrecommended.js
@@ -12,7 +12,7 @@
var options = {
IncludeItemTypes: "Audio",
Limit: screenWidth >= 1920 ? 24 : (screenWidth >= 1600 ? 21 : (screenWidth >= 1200 ? 21 : 12)),
- Fields: "PrimaryImageAspectRatio",
+ Fields: "PrimaryImageAspectRatio,SyncInfo",
ParentId: parentId,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb"
@@ -38,7 +38,7 @@
IncludeItemTypes: "Audio",
Limit: screenWidth >= 1920 ? 8 : (screenWidth >= 1600 ? 7 : (screenWidth >= 1200 ? 7 : 6)),
Recursive: true,
- Fields: "PrimaryImageAspectRatio,AudioInfo",
+ Fields: "PrimaryImageAspectRatio,AudioInfo,SyncInfo",
Filters: "IsPlayed",
ParentId: parentId,
ImageTypeLimit: 1,
@@ -72,7 +72,7 @@
IncludeItemTypes: "Audio",
Limit: screenWidth >= 1920 ? 16 : (screenWidth >= 1600 ? 14 : (screenWidth >= 1200 ? 14 : 12)),
Recursive: true,
- Fields: "PrimaryImageAspectRatio,AudioInfo",
+ Fields: "PrimaryImageAspectRatio,AudioInfo,SyncInfo",
Filters: "IsPlayed",
ParentId: parentId,
ImageTypeLimit: 1,
diff --git a/dashboard-ui/scripts/musicvideos.js b/dashboard-ui/scripts/musicvideos.js
index 6bae74ad1e..d841112b42 100644
--- a/dashboard-ui/scripts/musicvideos.js
+++ b/dashboard-ui/scripts/musicvideos.js
@@ -7,7 +7,7 @@
SortOrder: "Ascending",
IncludeItemTypes: "MusicVideo",
Recursive: true,
- Fields: "DateCreated",
+ Fields: "DateCreated,SyncInfo",
StartIndex: 0
};
diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js
index db5cd3abbf..fa56e5b7e8 100644
--- a/dashboard-ui/scripts/site.js
+++ b/dashboard-ui/scripts/site.js
@@ -1257,7 +1257,8 @@ var Dashboard = {
var capabilities = {
PlayableMediaTypes: "Audio,Video",
- SupportedCommands: Dashboard.getSupportedRemoteCommands().join(',')
+ SupportedCommands: Dashboard.getSupportedRemoteCommands().join(','),
+ SupportsDeviceId: false
};
window.ConnectionManager = new MediaBrowser.ConnectionManager(credentialProvider, appName, appVersion, deviceName, deviceId, capabilities);
diff --git a/dashboard-ui/scripts/songs.js b/dashboard-ui/scripts/songs.js
index 8e98b3e543..c907a6fb4a 100644
--- a/dashboard-ui/scripts/songs.js
+++ b/dashboard-ui/scripts/songs.js
@@ -9,7 +9,7 @@
SortOrder: "Ascending",
IncludeItemTypes: "Audio",
Recursive: true,
- Fields: "AudioInfo,ParentId",
+ Fields: "AudioInfo,ParentId,SyncInfo",
Limit: 200,
StartIndex: 0,
ImageTypeLimit: 1,
diff --git a/dashboard-ui/scripts/sync.js b/dashboard-ui/scripts/sync.js
index 9ee5d3599a..b75e0fc69b 100644
--- a/dashboard-ui/scripts/sync.js
+++ b/dashboard-ui/scripts/sync.js
@@ -23,7 +23,9 @@
return i.Id;
}).join(','),
- Quality: $('.radioSyncQuality', form)[0].getAttribute('data-value')
+ Quality: $('.radioSyncQuality', form)[0].getAttribute('data-value'),
+
+ Name: $('#txtSyncJobName', form).val()
};
ApiClient.ajax({
@@ -35,6 +37,8 @@
}).done(function () {
+ $('.syncPanel').panel('close');
+ $(window.SyncManager).trigger('jobsubmit');
});
}
@@ -51,19 +55,32 @@
var html = '
';
html += '
';
- html += '
Sync Media
';
+ html += '
' + Globalize.translate('SyncMedia') + '
';
html += '