1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

update tuner setup

This commit is contained in:
Luke Pulverenti 2015-07-23 09:23:22 -04:00
parent 8ef120c759
commit 86dea1fa4c
14 changed files with 394 additions and 248 deletions

View file

@ -20,7 +20,6 @@
</div> </div>
<div data-role="controlgroup" data-type="horizontal" class="localnav livetvTabs" data-mini="true" style="display:none;"> <div data-role="controlgroup" data-type="horizontal" class="localnav livetvTabs" data-mini="true" style="display:none;">
<a href="livetvstatus.html" data-role="button">${TabTuners}</a> <a href="livetvstatus.html" data-role="button">${TabTuners}</a>
<a href="livetvguidesettings.html" data-role="button">${TabGuide}</a>
<a href="livetvsettings.html" data-role="button">${TabSettings}</a> <a href="livetvsettings.html" data-role="button">${TabSettings}</a>
<a href="#" data-role="button" class="ui-btn-active">${TabExternalServices}</a> <a href="#" data-role="button" class="ui-btn-active">${TabExternalServices}</a>
</div> </div>

View file

@ -20,7 +20,6 @@
<div data-role="controlgroup" data-type="horizontal" class="localnav" data-mini="true"> <div data-role="controlgroup" data-type="horizontal" class="localnav" data-mini="true">
<a href="livetvstatus.html" data-role="button">${TabTuners}</a> <a href="livetvstatus.html" data-role="button">${TabTuners}</a>
<a href="livetvguidesettings.html" data-role="button">${TabGuide}</a>
<a href="livetvsettings.html" data-role="button">${TabSettings}</a> <a href="livetvsettings.html" data-role="button">${TabSettings}</a>
<a href="#" data-role="button" class="ui-btn-active">${TabExternalServices}</a> <a href="#" data-role="button" class="ui-btn-active">${TabExternalServices}</a>
</div> </div>

View file

@ -237,11 +237,8 @@
<div class="detailSectionContent" style="padding:0 1em;"> <div class="detailSectionContent" style="padding:0 1em;">
<div class="tabDetails"> <div class="tabDetails">
<p id="players"></p> <p id="players"></p>
<p id="itemBudget"></p>
<p id="itemRevenue"></p>
<p class="itemExternalLinks"></p> <p class="itemExternalLinks"></p>
<p class="itemStudios"></p> <p class="itemStudios"></p>
<p class="itemKeywords"></p>
<p class="itemTags"></p> <p class="itemTags"></p>
</div> </div>
</div> </div>

View file

@ -0,0 +1,77 @@
<!DOCTYPE html>
<html>
<head>
<title>${TitleLiveTV}</title>
</head>
<body>
<div id="liveTvGuideProviderScdPage" data-role="page" class="page type-interior liveTvSettingsPage" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Live%20TV" data-require="scripts/livetvguideprovider-scd">
<div data-role="content">
<div class="content-primary">
<div data-role="controlgroup" data-type="horizontal" class="localnav" data-mini="true">
<a href="livetvstatus.html" data-role="button" class="ui-btn-active">${TabTuners}</a>
<a href="livetvsettings.html" data-role="button">${TabSettings}</a>
<a href="appservices.html?context=livetv" data-role="button">${TabExternalServices}</a>
</div>
<div class="readOnlyContent" style="margin-top: 2em;">
<h1>Schedules Direct</h1>
<div style="background-color:rgba(82,181,75,.8);color:#fff;padding:.7em 1em;font-size:16px;border-radius:4px;">
${GuideProviderLoginStep}
</div>
<form class="formLogin">
<div>
<div>
<br />
<label for="txtUser">${LabelUsername}</label>
<input type="text" id="txtUser" required="required" autocomplete="off" />
</div>
<div>
<br />
<label for="txtPass">${LabelPassword}</label>
<input type="password" id="txtPass" required="required" autocomplete="off" />
</div>
<div>
<button type="submit" data-role="none" class="clearButton">
<paper-button raised class="submit block"><iron-icon icon="check"></iron-icon><span>${ButtonSave}</span></paper-button>
</button>
</div>
</div>
</form>
<br />
<br />
<br />
<div style="background-color:rgba(82,181,75,.8);color:#fff;padding:.7em 1em;font-size:16px;border-radius:4px;">
${GuideProviderListingsStep}
</div>
<form class="formListings">
<div>
<div>
<br />
<label for="txtZipCode">${LabelZipCode}</label>
<input type="text" id="txtZipCode" required="required" />
</div>
<div>
<br />
<label for="selectListing">${LabelLineup}</label>
<select id="selectListing" data-mini="true" required="required"></select>
</div>
<div>
<button type="submit" data-role="none" class="clearButton">
<paper-button raised class="submit block"><iron-icon icon="check"></iron-icon><span>${ButtonSave}</span></paper-button>
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</body>
</html>

View file

@ -1,71 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>${TitleLiveTV}</title>
</head>
<body>
<div id="liveTvGuideSettingsPage" data-role="page" class="page type-interior liveTvSettingsPage" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Live%20TV" data-require="scripts/livetvguidesettings">
<div data-role="content">
<div class="content-primary">
<div data-role="controlgroup" data-type="horizontal" class="localnav" data-mini="true">
<a href="livetvstatus.html" data-role="button">${TabTuners}</a>
<a href="#" data-role="button" class="ui-btn-active">${TabGuide}</a>
<a href="livetvsettings.html" data-role="button">${TabSettings}</a>
<a href="appservices.html?context=livetv" data-role="button">${TabExternalServices}</a>
</div>
<div class="readOnlyContent" style="margin-top: 2em;">
<div class="liveTvStatusContent">
<h1>${HeaderGuideProviders}</h1>
<p>${AddGuideProviderHelp}</p>
<paper-button raised class="submit btnAddProvider block"><iron-icon icon="add"></iron-icon><span>${ButtonAdd}</span></paper-button>
<div class="providerList">
</div>
<paper-dialog class="dlgAddProvider" entry-animation="fade-in-animation" exit-animation="fade-out-animation" style="height:600px;width:300px;" with-backdrop>
<h2>${HeaderAddProvider}</h2>
<form class="formAddProvider">
<div>
<div>
<label for="selectType">${LabelType}</label>
<select id="selectType" data-mini="true">
<option value="Schedules Direct">Schedules Direct</option>
</select>
<div class="fieldDescription"><a href="http://www.schedulesdirect.org" target="_blank">Schedules Direct</a></div>
</div>
<div>
<br />
<label for="txtUser">${LabelUsername}</label>
<input type="text" id="txtUser" required="required" />
</div>
<div>
<br />
<label for="txtPass">${LabelPassword}</label>
<input type="text" id="txtPass" required="required" />
</div>
<div>
<br />
<label for="txtZipCode">${LabelZipCode}</label>
<input type="text" id="txtZipCode" required="required" />
</div>
</div>
<div class="buttons">
<paper-button dialog-dismiss>${ButtonCancel}</paper-button>
<button data-role="none" type="submit" class="clearButton"><paper-button><span>${ButtonOk}</span></paper-button></button>
</div>
</form>
</paper-dialog>
</div>
</div>
</div>
</div>
</div>
</body>
</html>

View file

@ -11,12 +11,11 @@
<div data-role="controlgroup" data-type="horizontal" class="localnav" data-mini="true"> <div data-role="controlgroup" data-type="horizontal" class="localnav" data-mini="true">
<a href="livetvstatus.html" data-role="button">${TabTuners}</a> <a href="livetvstatus.html" data-role="button">${TabTuners}</a>
<a href="livetvguidesettings.html" data-role="button">${TabGuide}</a>
<a href="#" data-role="button" class="ui-btn-active">${TabSettings}</a> <a href="#" data-role="button" class="ui-btn-active">${TabSettings}</a>
<a href="appservices.html?context=livetv" data-role="button">${TabExternalServices}</a> <a href="appservices.html?context=livetv" data-role="button">${TabExternalServices}</a>
</div> </div>
<form class="liveTvSettingsForm" style="display: none;"> <form class="liveTvSettingsForm">
<ul data-role="listview" class="ulForm"> <ul data-role="listview" class="ulForm">
<li> <li>
@ -61,13 +60,6 @@
</ul> </ul>
</form> </form>
<div class="noLiveTvServices" style="display: none;">
<div class="readOnlyContent" style="margin-top: 2em;">
<p>${LiveTvPluginRequired}</p>
<p><a href="plugincatalog.html">${LiveTvPluginRequiredHelp}</a></p>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -11,7 +11,6 @@
<div data-role="controlgroup" data-type="horizontal" class="localnav" data-mini="true"> <div data-role="controlgroup" data-type="horizontal" class="localnav" data-mini="true">
<a href="#" data-role="button" class="ui-btn-active">${TabTuners}</a> <a href="#" data-role="button" class="ui-btn-active">${TabTuners}</a>
<a href="livetvguidesettings.html" data-role="button">${TabGuide}</a>
<a href="livetvsettings.html" data-role="button">${TabSettings}</a> <a href="livetvsettings.html" data-role="button">${TabSettings}</a>
<a href="appservices.html?context=livetv" data-role="button">${TabExternalServices}</a> <a href="appservices.html?context=livetv" data-role="button">${TabExternalServices}</a>
</div> </div>
@ -21,11 +20,20 @@
<div class="liveTvStatusContent" style="display: none;"> <div class="liveTvStatusContent" style="display: none;">
<h1>${HeaderTunerDevices}</h1> <h1>${HeaderTunerDevices}</h1>
<paper-button raised class="submit btnAddDevice block"><iron-icon icon="add"></iron-icon><span>${ButtonAddDevice}</span></paper-button> <paper-button raised class="submit btnAddDevice block"><iron-icon icon="add"></iron-icon><span>${ButtonAdd}</span></paper-button>
<div class="devicesList"> <div class="devicesList">
</div> </div>
<br /> <div>
<br />
<h1>${HeaderGuideProviders}</h1>
<p>${AddGuideProviderHelp}</p>
<paper-button raised class="submit btnAddProvider block"><iron-icon icon="add"></iron-icon><span>${ButtonAdd}</span></paper-button>
<div class="providerList">
</div>
</div>
<br /> <br />
<h1>${HeaderTvTuners}</h1> <h1>${HeaderTvTuners}</h1>
@ -45,7 +53,6 @@
</div> </div>
<div class="servicesSection" style="display:none;"> <div class="servicesSection" style="display:none;">
<br />
<br /> <br />
<h1>${HeaderExternalServices}</h1> <h1>${HeaderExternalServices}</h1>
<div class="servicesList"> <div class="servicesList">

View file

@ -383,8 +383,6 @@
$('.itemCommunityRating', page).html(LibraryBrowser.getRatingHtml(item)); $('.itemCommunityRating', page).html(LibraryBrowser.getRatingHtml(item));
LibraryBrowser.renderBudget($('#itemBudget', page), item);
LibraryBrowser.renderRevenue($('#itemRevenue', page), item);
LibraryBrowser.renderAwardSummary($('#awardSummary', page), item); LibraryBrowser.renderAwardSummary($('#awardSummary', page), item);
$('.itemMiscInfo', page).html(LibraryBrowser.getMiscInfoHtml(item)); $('.itemMiscInfo', page).html(LibraryBrowser.getMiscInfoHtml(item));
@ -405,7 +403,6 @@
} }
renderTags(page, item); renderTags(page, item);
renderKeywords(page, item);
renderSeriesAirTime(page, item, context); renderSeriesAirTime(page, item, context);
@ -712,25 +709,6 @@
} }
} }
function renderKeywords(page, item) {
if (item.Keywords && item.Keywords.length) {
var html = '';
html += '<p>' + Globalize.translate('HeaderPlotKeywords') + '</p>';
for (var i = 0, length = item.Keywords.length; i < length; i++) {
html += '<div class="itemTag">' + item.Keywords[i] + '</div>';
}
$('.itemKeywords', page).show().html(html);
} else {
$('.itemKeywords', page).hide();
}
}
function getEpisodesFunction(seriesId, query) { function getEpisodesFunction(seriesId, query) {
query = $.extend({}, query); query = $.extend({}, query);

View file

@ -0,0 +1,160 @@
(function ($, document, window) {
var providerId;
var listingsId;
function reload(page) {
ApiClient.getNamedConfiguration("livetv").done(function (config) {
var info = config.ListingProviders.filter(function (i) {
return i.Id == providerId;
})[0];
listingsId = info.ListingsId;
$('#selectListing', page).val(info.ListingsId || '').selectmenu('refresh');
$('#txtZipCode', page).val(info.ZipCode || '').trigger('change');
$('#txtUser', page).val(info.Username || '');
});
}
function submitLoginForm(page) {
Dashboard.showLoadingMsg();
var info = {
Type: 'SchedulesDirect',
Username: $('#txtUser', page).val(),
Password: CryptoJS.SHA1($('#txtPass', page).val()).toString()
};
var id = providerId;
if (id) {
info.Id = id;
}
ApiClient.ajax({
type: "POST",
url: ApiClient.getUrl('LiveTv/ListingProviders'),
data: JSON.stringify(info),
contentType: "application/json"
}).done(function (result) {
Dashboard.processServerConfigurationUpdateResult();
}).fail(function () {
Dashboard.alert({
message: Globalize.translate('ErrorSavingTvProvider')
});
});
}
function submitListingsForm(page) {
Dashboard.showLoadingMsg();
var id = providerId;
ApiClient.getNamedConfiguration("livetv").done(function (config) {
var info = config.ListingProviders.filter(function (i) {
return i.Id == id;
})[0];
info.ZipCode = $('#txtZipCode', page).val();
info.ListingsId = $('#selectListing', page).val();
ApiClient.ajax({
type: "POST",
url: ApiClient.getUrl('LiveTv/ListingProviders'),
data: JSON.stringify(info),
contentType: "application/json"
}).done(function (result) {
Dashboard.processServerConfigurationUpdateResult();
}).fail(function () {
Dashboard.alert({
message: Globalize.translate('ErrorSavingTvProvider')
});
});
});
}
function refreshListings(page, value) {
if (!value) {
$('#selectListing', page).html('').selectmenu('refresh');
return;
}
Dashboard.showModalLoadingMsg();
ApiClient.ajax({
type: "GET",
url: ApiClient.getUrl('LiveTv/ListingProviders/Lineups', {
Id: providerId,
Location: value
}),
dataType: 'json'
}).done(function (result) {
$('#selectListing', page).html(result.map(function (o) {
return '<option value="' + o.Id + '">' + o.name + '</option>';
})).selectmenu('refresh');
if (listingsId) {
$('#selectListing', page).val(listingsId).selectmenu('refresh');
}
Dashboard.hideModalLoadingMsg();
}).fail(function (result) {
//Dashboard.alert({
// message: Globalize.translate('ErrorGettingTvLineups')
//});
//refreshListings(page, '');
Dashboard.hideModalLoadingMsg();
});
}
$(document).on('pageinitdepends', "#liveTvGuideProviderScdPage", function () {
var page = this;
$('.formLogin', page).on('submit', function () {
submitLoginForm(page);
return false;
});
$('.formListings', page).on('submit', function () {
submitListingsForm(page);
return false;
});
$('#txtZipCode', page).on('change', function () {
refreshListings(page, this.value);
});
}).on('pageshowready', "#liveTvGuideProviderScdPage", function () {
providerId = getParameterByName('id');
var page = this;
reload(page);
});
})(jQuery, document, window);

View file

@ -1,111 +0,0 @@
(function ($, document, window) {
function loadPage(page) {
ApiClient.getNamedConfiguration("livetv").done(function (config) {
renderProviders(page, config.ListingProviders);
Dashboard.hideLoadingMsg();
});
}
function renderProviders(page, providers) {
var html = '';
html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
for (var i = 0, length = providers.length; i < length; i++) {
var provider = providers[i];
html += '<li>';
html += '<a href="#">';
html += '<h3>';
html += provider.Name;
html += '</h3>';
html += '</a>';
html += '<a href="#" class="btnDelete">';
html += '</a>';
html += '</li>';
}
html += '</ul>';
var elem = $('.providerList', page).html(html).trigger('create');
$('.btnDelete', elem).on('click', function () {
var id = this.getAttribute('data-id');
deleteProvider(page, id);
});
}
function deleteProvider(page, id) {
var message = Globalize.translate('MessageConfirmDeleteGuideProvider');
Dashboard.confirm(message, Globalize.translate('HeaderDeleteProvider'), function (confirmResult) {
if (confirmResult) {
Dashboard.showLoadingMsg();
ApiClient.ajax({
type: "DELETE",
url: ApiClient.getUrl('LiveTv/TunerHosts', {
Id: id
})
}).done(function () {
loadPage(page);
});
}
});
}
function submitAddProviderForm(page) {
page.querySelector('.dlgAddProvider').close();
Dashboard.showLoadingMsg();
ApiClient.ajax({
type: "POST",
url: ApiClient.getUrl('LiveTv/TunerHosts'),
data: JSON.stringify({
Type: $('#selectTunerDeviceType', page).val(),
Url: $('#txtDevicePath', page).val()
}),
contentType: "application/json"
}).done(function () {
loadPage(page);
});
}
$(document).on('pageinitdepends', "#liveTvGuideSettingsPage", function () {
var page = this;
$('.btnAddProvider', page).on('click', function () {
page.querySelector('.dlgAddProvider').open();
});
$('.formAddProvider', page).on('submit', function () {
submitAddProviderForm(page);
return false;
});
}).on('pageshowready', "#liveTvGuideSettingsPage", function () {
var page = this;
loadPage(page);
});
})(jQuery, document, window);

View file

@ -1,16 +1,9 @@
(function ($, document, window) { (function ($, document, window) {
function loadPage(page, config, liveTvInfo) { function loadPage(page, config) {
if (liveTvInfo.IsEnabled) { $('.liveTvSettingsForm', page).show();
$('.noLiveTvServices', page).hide();
$('.liveTvSettingsForm', page).show();
$('.noLiveTvServices', page).hide();
} else {
$('.liveTvSettingsForm', page).hide();
$('.noLiveTvServices', page).show();
}
$('#selectGuideDays', page).val(config.GuideDays || '').selectmenu('refresh'); $('#selectGuideDays', page).val(config.GuideDays || '').selectmenu('refresh');
@ -47,13 +40,9 @@
var page = this; var page = this;
var promise1 = ApiClient.getNamedConfiguration("livetv"); ApiClient.getNamedConfiguration("livetv").done(function (config) {
var promise2 = ApiClient.getLiveTvInfo(); loadPage(page, config);
$.when(promise1, promise2).done(function (response1, response2) {
loadPage(page, response1[0], response2[0]);
}); });

View file

@ -177,6 +177,7 @@
ApiClient.getNamedConfiguration("livetv").done(function (config) { ApiClient.getNamedConfiguration("livetv").done(function (config) {
renderDevices(page, config.TunerHosts); renderDevices(page, config.TunerHosts);
renderProviders(page, config.ListingProviders);
}); });
Dashboard.hideLoadingMsg(); Dashboard.hideLoadingMsg();
@ -210,7 +211,7 @@
html += '</p>'; html += '</p>';
html += '</a>'; html += '</a>';
html += '<a href="#" class="btnDeleteDevice">'; html += '<a href="#" class="btnDeleteDevice" data-id="' + device.Id + '">';
html += '</a>'; html += '</a>';
html += '</li>'; html += '</li>';
} }
@ -279,15 +280,128 @@
}).done(function () { }).done(function () {
reload(page); reload(page);
}).fail(function () {
Dashboard.alert({
message: Globalize.translate('ErrorAddingTunerDevice')
});
}); });
} }
function renderProviders(page, providers) {
var html = '';
html += '<ul data-role="listview" data-inset="true" data-split-icon="delete">';
for (var i = 0, length = providers.length; i < length; i++) {
var provider = providers[i];
html += '<li>';
html += '<a href="' + getProviderConfigurationUrl(provider.Type) + '?id=' + provider.Id + '">';
html += '<h3>';
html += getProviderName(provider.Type);
html += '</h3>';
html += '</a>';
html += '<a href="#" class="btnDelete" data-id="' + provider.Id + '">';
html += '</a>';
html += '</li>';
}
html += '</ul>';
var elem = $('.providerList', page).html(html).trigger('create');
$('.btnDelete', elem).on('click', function () {
var id = this.getAttribute('data-id');
deleteProvider(page, id);
});
}
function deleteProvider(page, id) {
var message = Globalize.translate('MessageConfirmDeleteGuideProvider');
Dashboard.confirm(message, Globalize.translate('HeaderDeleteProvider'), function (confirmResult) {
if (confirmResult) {
Dashboard.showLoadingMsg();
ApiClient.ajax({
type: "DELETE",
url: ApiClient.getUrl('LiveTv/ListingProviders', {
Id: id
})
}).always(function () {
reload(page);
});
}
});
}
function getProviderName(providerId) {
providerId = providerId.toLowerCase();
switch (providerId) {
case 'schedulesdirect':
return 'Schedules Direct';
default:
return 'Unknown';
}
}
function getProviderConfigurationUrl(providerId) {
providerId = providerId.toLowerCase();
switch (providerId) {
case 'schedulesdirect':
return 'livetvguideprovider-scd.html';
default:
break;
}
}
function addProvider(button) {
var menuItems = [];
menuItems.push({
name: 'Schedules Direct (USA / Canada)',
id: 'SchedulesDirect'
});
require(['actionsheet'], function () {
ActionSheetElement.show({
items: menuItems,
positionTo: button,
callback: function (id) {
Dashboard.navigate(getProviderConfigurationUrl(id));
}
});
});
}
$(document).on('pageinitdepends', "#liveTvStatusPage", function () { $(document).on('pageinitdepends', "#liveTvStatusPage", function () {
var page = this; var page = this;
$('.btnAddDevice', page).on('click', function () { $('.btnAddDevice', page).on('click', function () {
$('#txtDevicePath', page).val('');
page.querySelector('.dlgAddDevice').open(); page.querySelector('.dlgAddDevice').open();
}); });
@ -296,6 +410,10 @@
return false; return false;
}); });
$('.btnAddProvider', page).on('click', function () {
addProvider(this);
});
}).on('pageshowready', "#liveTvStatusPage", function () { }).on('pageshowready', "#liveTvStatusPage", function () {
var page = this; var page = this;

View file

@ -139,12 +139,15 @@
profile.MusicStreamingTranscodingBitrate = Math.min(bitrateSetting, 192000); profile.MusicStreamingTranscodingBitrate = Math.min(bitrateSetting, 192000);
profile.DirectPlayProfiles = []; profile.DirectPlayProfiles = [];
profile.DirectPlayProfiles.push({
Container: 'mp4,m4v', if (canPlayH264()) {
Type: 'Video', profile.DirectPlayProfiles.push({
VideoCodec: 'h264', Container: 'mp4,m4v',
AudioCodec: 'aac,mp3' Type: 'Video',
}); VideoCodec: 'h264',
AudioCodec: 'aac,mp3'
});
}
if ($.browser.chrome) { if ($.browser.chrome) {
profile.DirectPlayProfiles.push({ profile.DirectPlayProfiles.push({
@ -1717,11 +1720,20 @@
} }
} }
function canPlayH264() {
if (navigator.userAgent.toLowerCase().indexOf('firefox') != -1) {
return false;
}
return true;
}
self._canPlayWebm = null; self._canPlayWebm = null;
self.canPlayWebm = function () { self.canPlayWebm = function () {
if (self._canPlayWebm == null) { if (self._canPlayWebm == null) {
self._canPlayWebm = ($.browser.android && AppInfo.isNativeApp) || document.createElement('video').canPlayType('video/webm').replace(/no/, ''); self._canPlayWebm = document.createElement('video').canPlayType('video/webm').replace(/no/, '');
} }
return self._canPlayWebm; return self._canPlayWebm;
}; };

View file

@ -112,8 +112,8 @@ var Dashboard = {
} }
} }
return; return;
Dashboard.hideLoadingMsg();
} }
Dashboard.hideLoadingMsg();
}, },
getCurrentUser: function () { getCurrentUser: function () {
@ -518,8 +518,8 @@ var Dashboard = {
}, },
showModalLoadingMsg: function () { showModalLoadingMsg: function () {
Dashboard.showLoadingMsg();
Dashboard.getModalLoadingMsg().show(); Dashboard.getModalLoadingMsg().show();
Dashboard.showLoadingMsg();
}, },
hideModalLoadingMsg: function () { hideModalLoadingMsg: function () {