mirror of
https://github.com/rembo10/headphones.git
synced 2026-09-10 00:32:52 +01:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e67d32445f | ||
|
|
83280f3f99 | ||
|
|
1d7415b91d | ||
|
|
bc5a042dcc | ||
|
|
e5af0bdd52 | ||
|
|
dc2939a4f9 | ||
|
|
f52ec56a0f | ||
|
|
75b38df3d6 | ||
|
|
0f5aeea345 | ||
|
|
d80fc36b29 | ||
|
|
4ca42c9c11 | ||
|
|
6c760902d6 | ||
|
|
2a0fcc7566 | ||
|
|
b763ccdd08 | ||
|
|
e72a0d1141 | ||
|
|
295e5a1ccf | ||
|
|
497fafb555 | ||
|
|
585f556006 | ||
|
|
7b115126c9 | ||
|
|
1a9165a084 | ||
|
|
4a74d54cdc | ||
|
|
a0755d4b1c | ||
|
|
084181a9a5 | ||
|
|
5c381b9410 | ||
|
|
0be9500518 | ||
|
|
9c2da72dcc | ||
|
|
3f6145cd07 | ||
|
|
e155f19d0d | ||
|
|
0c7ea8a5a0 | ||
|
|
1f3474a154 | ||
|
|
c0c1f9cc61 | ||
|
|
e4382c23a3 | ||
|
|
29b5305ab4 | ||
|
|
758154e87e | ||
|
|
ea8b1815f6 | ||
|
|
ebc0b7205f | ||
|
|
06ee770184 | ||
|
|
900325186b | ||
|
|
3b9816f3b3 | ||
|
|
3e5779e5ce | ||
|
|
66d0cb4a1b | ||
|
|
54c85c7951 | ||
|
|
941da4be1c | ||
|
|
69c94baf18 | ||
|
|
90016f6eda | ||
|
|
06b647e30d | ||
|
|
84ebcb84f9 | ||
|
|
b11610face | ||
|
|
6e90419014 |
@@ -8,7 +8,7 @@
|
|||||||
<%def name="headerIncludes()">
|
<%def name="headerIncludes()">
|
||||||
<div id="subhead_container">
|
<div id="subhead_container">
|
||||||
<div id="subhead_menu">
|
<div id="subhead_menu">
|
||||||
<a id="menu_link_refresh" onclick="doAjaxCall('refreshArtist?ArtistID=${artist['ArtistID']}', $(this)),'table'" href="#" data-success="'${artist['ArtistName']}' is being refreshed"><i class="fa fa-refresh"></i> Refresh Artist</a>
|
<a id="menu_link_refresh" onclick="doSimpleAjaxCall('refreshArtist?ArtistID=${artist['ArtistID']}')" href="#"><i class="fa fa-refresh"></i> Refresh Artist</a>
|
||||||
<a id="menu_link_delete" href="deleteArtist?ArtistID=${artist['ArtistID']}"><i class="fa fa-trash-o"></i> Delete Artist</a>
|
<a id="menu_link_delete" href="deleteArtist?ArtistID=${artist['ArtistID']}"><i class="fa fa-trash-o"></i> Delete Artist</a>
|
||||||
%if artist['Status'] == 'Paused':
|
%if artist['Status'] == 'Paused':
|
||||||
<a id="menu_link_resume" href="#" onclick="doAjaxCall('resumeArtist?ArtistID=${artist['ArtistID']}',$(this),true)" data-success="${artist['ArtistName']} resumed"><i class="fa fa-play"></i> Resume Artist</a>
|
<a id="menu_link_resume" href="#" onclick="doAjaxCall('resumeArtist?ArtistID=${artist['ArtistID']}',$(this),true)" data-success="${artist['ArtistName']} resumed"><i class="fa fa-play"></i> Resume Artist</a>
|
||||||
@@ -42,14 +42,8 @@
|
|||||||
<div id="artistImg">
|
<div id="artistImg">
|
||||||
<img id="artistImage" class="albumArt" alt="" src="artwork/artist/${artist['ArtistID']}"/>
|
<img id="artistImage" class="albumArt" alt="" src="artwork/artist/${artist['ArtistID']}"/>
|
||||||
</div>
|
</div>
|
||||||
<h1>
|
<h1 id="artistname">
|
||||||
%if artist['Status'] == 'Loading':
|
<a href="http://musicbrainz.org/artist/${artist['ArtistID']}" id="artistnamelink">${artist['ArtistName']}</a>
|
||||||
<i class="fa fa-refresh fa-spin"></i>
|
|
||||||
%endif
|
|
||||||
<a href="http://musicbrainz.org/artist/${artist['ArtistID']}">${artist['ArtistName']}</a>
|
|
||||||
%if artist['Status'] == 'Loading':
|
|
||||||
<h3><i>(Album information for this artist is currently being loaded)</i></h3>
|
|
||||||
%endif
|
|
||||||
</h1>
|
</h1>
|
||||||
<div id="artistBio"></div>
|
<div id="artistBio"></div>
|
||||||
</div>
|
</div>
|
||||||
@@ -156,9 +150,6 @@
|
|||||||
|
|
||||||
<%def name="headIncludes()">
|
<%def name="headIncludes()">
|
||||||
<link rel="stylesheet" href="interfaces/default/css/data_table.css">
|
<link rel="stylesheet" href="interfaces/default/css/data_table.css">
|
||||||
%if artist['Status'] == 'Loading':
|
|
||||||
<meta http-equiv="refresh" content="5">
|
|
||||||
%endif
|
|
||||||
</%def>
|
</%def>
|
||||||
|
|
||||||
<%def name="javascriptIncludes()">
|
<%def name="javascriptIncludes()">
|
||||||
@@ -171,7 +162,6 @@
|
|||||||
getInfo(elem,id,'artist');
|
getInfo(elem,id,'artist');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
<%
|
<%
|
||||||
if headphones.SONGKICK_FILTER_ENABLED:
|
if headphones.SONGKICK_FILTER_ENABLED:
|
||||||
songkick_filter_enabled = "true"
|
songkick_filter_enabled = "true"
|
||||||
@@ -240,6 +230,40 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var loadingMessage = false;
|
||||||
|
var spinner_active = false;
|
||||||
|
var loadingtext_active = false;
|
||||||
|
|
||||||
|
function checkArtistStatus() {
|
||||||
|
$.getJSON("getArtistjson?ArtistID=${artist['ArtistID']}", function(data) {
|
||||||
|
if (data['Status'] == "Loading"){
|
||||||
|
refreshTable();
|
||||||
|
$('#artistnamelink').text(data["ArtistName"]);
|
||||||
|
if (loadingMessage == false){
|
||||||
|
showMsg("Getting artist information",true);
|
||||||
|
loadingMessage = true;
|
||||||
|
}
|
||||||
|
if (spinner_active == false){
|
||||||
|
$('#artistname').prepend('<i class="fa fa-refresh fa-spin" id="artistnamespinner"></i>')
|
||||||
|
spinner_active = true;
|
||||||
|
}
|
||||||
|
if (loadingtext_active == false){
|
||||||
|
$('#artistname').append('<h3 id="loadingtext"><i>(Album information for this artist is currently being loaded)</i></h3>')
|
||||||
|
loadingtext_active = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$('#artistnamespinner').remove()
|
||||||
|
$('#loadingtext').remove()
|
||||||
|
$('#ajaxMsg').empty()
|
||||||
|
$('#ajaxMsg').removeAttr('style')
|
||||||
|
spinner_active = false
|
||||||
|
loadingtext_active = false
|
||||||
|
loadingMessage = false
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function initThisPage() {
|
function initThisPage() {
|
||||||
$('#menu_link_getextra').click(function() {
|
$('#menu_link_getextra').click(function() {
|
||||||
$('#dialog').dialog();
|
$('#dialog').dialog();
|
||||||
@@ -248,10 +272,6 @@
|
|||||||
$('#menu_link_modifyextra').click(function() {
|
$('#menu_link_modifyextra').click(function() {
|
||||||
$('#dialog').dialog();
|
$('#dialog').dialog();
|
||||||
});
|
});
|
||||||
|
|
||||||
%if artist['Status'] == 'Loading':
|
|
||||||
showMsg("Getting artist information",true);
|
|
||||||
%endif
|
|
||||||
$('#album_table').dataTable({
|
$('#album_table').dataTable({
|
||||||
"bDestroy": true,
|
"bDestroy": true,
|
||||||
"aoColumns": [
|
"aoColumns": [
|
||||||
@@ -291,8 +311,12 @@
|
|||||||
initThisPage();
|
initThisPage();
|
||||||
getArtistBio();
|
getArtistBio();
|
||||||
if( ${songkick_enabled} ){
|
if( ${songkick_enabled} ){
|
||||||
getArtistsCalendar();
|
getArtistsCalendar();
|
||||||
}
|
}
|
||||||
|
checkArtistStatus();
|
||||||
|
setInterval(function(){
|
||||||
|
checkArtistStatus();
|
||||||
|
}, 1500);
|
||||||
});
|
});
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -124,7 +124,7 @@
|
|||||||
<td>
|
<td>
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>Usenet</legend>
|
<legend>Usenet</legend>
|
||||||
<input type="radio" name="nzb_downloader" id="nzb_downloader_sabnzbd" value="0" ${config['nzb_downloader_sabnzbd']}>Sabnzbd <input type="radio" name="nzb_downloader" id="nzb_downloader_nzbget" value="1" ${config['nzb_downloader_nzbget']}> NZBget <input type="radio" name="nzb_downloader" id="nzb_downloader_blackhole" value="2" ${config['nzb_downloader_blackhole']}>Black Hole
|
<input type="radio" name="nzb_downloader" id="nzb_downloader_sabnzbd" value="0" ${config['nzb_downloader_sabnzbd']}> Sabnzbd <input type="radio" name="nzb_downloader" id="nzb_downloader_nzbget" value="1" ${config['nzb_downloader_nzbget']}> NZBget <input type="radio" name="nzb_downloader" id="nzb_downloader_blackhole" value="2" ${config['nzb_downloader_blackhole']}> Black Hole
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<fieldset id="sabnzbd_options">
|
<fieldset id="sabnzbd_options">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@@ -192,7 +192,7 @@
|
|||||||
<td>
|
<td>
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>Torrents</legend>
|
<legend>Torrents</legend>
|
||||||
<input type="radio" name="torrent_downloader" id="torrent_downloader_blackhole" value="0" ${config['torrent_downloader_blackhole']}>Black Hole <input type="radio" name="torrent_downloader" id="torrent_downloader_transmission" value="1" ${config['torrent_downloader_transmission']}> Transmission <!-- <input type="radio" name="torrent_downloader" id="torrent_downloader_utorrent" value="2" ${config['torrent_downloader_utorrent']}> uTorrent -->
|
<input type="radio" name="torrent_downloader" id="torrent_downloader_blackhole" value="0" ${config['torrent_downloader_blackhole']}> Black Hole <input type="radio" name="torrent_downloader" id="torrent_downloader_transmission" value="1" ${config['torrent_downloader_transmission']}> Transmission <input type="radio" name="torrent_downloader" id="torrent_downloader_utorrent" value="2" ${config['torrent_downloader_utorrent']}> uTorrent (Beta)
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<fieldset id="torrent_blackhole_options">
|
<fieldset id="torrent_blackhole_options">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@@ -237,7 +237,11 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<label>uTorrent Password:</label>
|
<label>uTorrent Password:</label>
|
||||||
<input type="text" name="utorrent_password" value="${config['utorrent_pass']}" size="30">
|
<input type="password" name="utorrent_password" value="${config['utorrent_pass']}" size="30">
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<label>uTorrent Label:</label>
|
||||||
|
<input type="text" name="utorrent_label" value="${config['utorrent_label']}" size="30">
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<fieldset id="general_torrent_options">
|
<fieldset id="general_torrent_options">
|
||||||
@@ -293,7 +297,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>Newznab</legend>
|
<legend>Custom Newznab Providers</legend>
|
||||||
<div class="row checkbox">
|
<div class="row checkbox">
|
||||||
<input id="usenewznab" type="checkbox" name="newznab" onclick="initConfigCheckbox($(this));" value="1" ${config['use_newznab']} /><label>Use Newznab</label>
|
<input id="usenewznab" type="checkbox" name="newznab" onclick="initConfigCheckbox($(this));" value="1" ${config['use_newznab']} /><label>Use Newznab</label>
|
||||||
</div>
|
</div>
|
||||||
@@ -812,6 +816,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
|
<fieldset>
|
||||||
|
<h3>MPC</h3>
|
||||||
|
<div class="checkbox row">
|
||||||
|
<input type="checkbox" name="mpc_enabled" id="mpc" value="1" ${config['mpc_enabled']} /><label>Enable MPC Update</label>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
|
<fieldset>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -334,6 +334,10 @@ function doAjaxCall(url,elem,reload,form) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function doSimpleAjaxCall(url) {
|
||||||
|
$.ajax(url);
|
||||||
|
}
|
||||||
|
|
||||||
function resetFilters(text){
|
function resetFilters(text){
|
||||||
if ( $(".dataTables_filter").length > 0 ) {
|
if ( $(".dataTables_filter").length > 0 ) {
|
||||||
$(".dataTables_filter input").attr("placeholder","filter " + text + "");
|
$(".dataTables_filter input").attr("placeholder","filter " + text + "");
|
||||||
|
|||||||
@@ -154,6 +154,7 @@ TRANSMISSION_PASSWORD = None
|
|||||||
UTORRENT_HOST = None
|
UTORRENT_HOST = None
|
||||||
UTORRENT_USERNAME = None
|
UTORRENT_USERNAME = None
|
||||||
UTORRENT_PASSWORD = None
|
UTORRENT_PASSWORD = None
|
||||||
|
UTORRENT_LABEL = None
|
||||||
|
|
||||||
NEWZNAB = False
|
NEWZNAB = False
|
||||||
NEWZNAB_HOST = None
|
NEWZNAB_HOST = None
|
||||||
@@ -284,6 +285,7 @@ SONGKICK_ENABLED = False
|
|||||||
SONGKICK_APIKEY = None
|
SONGKICK_APIKEY = None
|
||||||
SONGKICK_LOCATION = None
|
SONGKICK_LOCATION = None
|
||||||
SONGKICK_FILTER_ENABLED = False
|
SONGKICK_FILTER_ENABLED = False
|
||||||
|
MPC_ENABLED = False
|
||||||
|
|
||||||
CACHE_SIZEMB = 32
|
CACHE_SIZEMB = 32
|
||||||
JOURNAL_MODE = None
|
JOURNAL_MODE = None
|
||||||
@@ -346,7 +348,7 @@ def initialize():
|
|||||||
RUTRACKER, RUTRACKER_USER, RUTRACKER_PASSWORD, WHATCD, WHATCD_USERNAME, WHATCD_PASSWORD, DOWNLOAD_TORRENT_DIR, \
|
RUTRACKER, RUTRACKER_USER, RUTRACKER_PASSWORD, WHATCD, WHATCD_USERNAME, WHATCD_PASSWORD, DOWNLOAD_TORRENT_DIR, \
|
||||||
LIBRARYSCAN, LIBRARYSCAN_INTERVAL, DOWNLOAD_SCAN_INTERVAL, UPDATE_DB_INTERVAL, MB_IGNORE_AGE, SAB_HOST, SAB_USERNAME, SAB_PASSWORD, SAB_APIKEY, SAB_CATEGORY, \
|
LIBRARYSCAN, LIBRARYSCAN_INTERVAL, DOWNLOAD_SCAN_INTERVAL, UPDATE_DB_INTERVAL, MB_IGNORE_AGE, SAB_HOST, SAB_USERNAME, SAB_PASSWORD, SAB_APIKEY, SAB_CATEGORY, \
|
||||||
NZBGET_USERNAME, NZBGET_PASSWORD, NZBGET_CATEGORY, NZBGET_HOST, HEADPHONES_INDEXER, NZBMATRIX, TRANSMISSION_HOST, TRANSMISSION_USERNAME, TRANSMISSION_PASSWORD, \
|
NZBGET_USERNAME, NZBGET_PASSWORD, NZBGET_CATEGORY, NZBGET_HOST, HEADPHONES_INDEXER, NZBMATRIX, TRANSMISSION_HOST, TRANSMISSION_USERNAME, TRANSMISSION_PASSWORD, \
|
||||||
UTORRENT_HOST, UTORRENT_USERNAME, UTORRENT_PASSWORD, NEWZNAB, NEWZNAB_HOST, NEWZNAB_APIKEY, NEWZNAB_ENABLED, EXTRA_NEWZNABS, \
|
UTORRENT_HOST, UTORRENT_USERNAME, UTORRENT_PASSWORD, UTORRENT_LABEL, NEWZNAB, NEWZNAB_HOST, NEWZNAB_APIKEY, NEWZNAB_ENABLED, EXTRA_NEWZNABS, \
|
||||||
NZBSORG, NZBSORG_UID, NZBSORG_HASH, NZBSRUS, NZBSRUS_UID, NZBSRUS_APIKEY, OMGWTFNZBS, OMGWTFNZBS_UID, OMGWTFNZBS_APIKEY, \
|
NZBSORG, NZBSORG_UID, NZBSORG_HASH, NZBSRUS, NZBSRUS_UID, NZBSRUS_APIKEY, OMGWTFNZBS, OMGWTFNZBS_UID, OMGWTFNZBS_APIKEY, \
|
||||||
NZB_DOWNLOADER, TORRENT_DOWNLOADER, PREFERRED_WORDS, REQUIRED_WORDS, IGNORED_WORDS, LASTFM_USERNAME, \
|
NZB_DOWNLOADER, TORRENT_DOWNLOADER, PREFERRED_WORDS, REQUIRED_WORDS, IGNORED_WORDS, LASTFM_USERNAME, \
|
||||||
INTERFACE, FOLDER_PERMISSIONS, FILE_PERMISSIONS, ENCODERFOLDER, ENCODER_PATH, ENCODER, XLDPROFILE, BITRATE, SAMPLINGFREQUENCY, \
|
INTERFACE, FOLDER_PERMISSIONS, FILE_PERMISSIONS, ENCODERFOLDER, ENCODER_PATH, ENCODER, XLDPROFILE, BITRATE, SAMPLINGFREQUENCY, \
|
||||||
@@ -511,6 +513,7 @@ def initialize():
|
|||||||
UTORRENT_HOST = check_setting_str(CFG, 'uTorrent', 'utorrent_host', '')
|
UTORRENT_HOST = check_setting_str(CFG, 'uTorrent', 'utorrent_host', '')
|
||||||
UTORRENT_USERNAME = check_setting_str(CFG, 'uTorrent', 'utorrent_username', '')
|
UTORRENT_USERNAME = check_setting_str(CFG, 'uTorrent', 'utorrent_username', '')
|
||||||
UTORRENT_PASSWORD = check_setting_str(CFG, 'uTorrent', 'utorrent_password', '')
|
UTORRENT_PASSWORD = check_setting_str(CFG, 'uTorrent', 'utorrent_password', '')
|
||||||
|
UTORRENT_LABEL = check_setting_str(CFG, 'uTorrent', 'utorrent_label', '')
|
||||||
|
|
||||||
NEWZNAB = bool(check_setting_int(CFG, 'Newznab', 'newznab', 0))
|
NEWZNAB = bool(check_setting_int(CFG, 'Newznab', 'newznab', 0))
|
||||||
NEWZNAB_HOST = check_setting_str(CFG, 'Newznab', 'newznab_host', '')
|
NEWZNAB_HOST = check_setting_str(CFG, 'Newznab', 'newznab_host', '')
|
||||||
@@ -941,6 +944,7 @@ def config_write():
|
|||||||
new_config['uTorrent']['utorrent_host'] = UTORRENT_HOST
|
new_config['uTorrent']['utorrent_host'] = UTORRENT_HOST
|
||||||
new_config['uTorrent']['utorrent_username'] = UTORRENT_USERNAME
|
new_config['uTorrent']['utorrent_username'] = UTORRENT_USERNAME
|
||||||
new_config['uTorrent']['utorrent_password'] = UTORRENT_PASSWORD
|
new_config['uTorrent']['utorrent_password'] = UTORRENT_PASSWORD
|
||||||
|
new_config['uTorrent']['utorrent_label'] = UTORRENT_LABEL
|
||||||
|
|
||||||
new_config['Newznab'] = {}
|
new_config['Newznab'] = {}
|
||||||
new_config['Newznab']['newznab'] = int(NEWZNAB)
|
new_config['Newznab']['newznab'] = int(NEWZNAB)
|
||||||
|
|||||||
+13
-14
@@ -227,14 +227,15 @@ def addArtisttoDB(artistid, extrasonly=False, forcefull=False):
|
|||||||
#Make a user configurable variable to skip update of albums with release dates older than this date (in days)
|
#Make a user configurable variable to skip update of albums with release dates older than this date (in days)
|
||||||
pause_delta = headphones.MB_IGNORE_AGE
|
pause_delta = headphones.MB_IGNORE_AGE
|
||||||
|
|
||||||
check_release_date = myDB.action("SELECT ReleaseDate, Status from albums WHERE ArtistID=? AND AlbumTitle=?", (artistid, al_title)).fetchone()
|
rg_exists = myDB.action("SELECT * from albums WHERE AlbumID=?", [rg['id']]).fetchone()
|
||||||
|
|
||||||
#Skip update if Status set
|
|
||||||
if check_release_date and check_release_date[1]:
|
|
||||||
logger.info("[%s] Not updating: %s (Status is %s, skipping)" % (artist['artist_name'], rg['title'], check_release_date[1]))
|
|
||||||
continue
|
|
||||||
|
|
||||||
if not forcefull:
|
if not forcefull:
|
||||||
|
|
||||||
|
try:
|
||||||
|
check_release_date = rg_exists['ReleaseDate']
|
||||||
|
except TypeError:
|
||||||
|
check_release_date = None
|
||||||
|
|
||||||
if check_release_date:
|
if check_release_date:
|
||||||
if check_release_date[0] is None:
|
if check_release_date[0] is None:
|
||||||
logger.info("[%s] Now updating: %s (No Release Date)" % (artist['artist_name'], rg['title']))
|
logger.info("[%s] Now updating: %s (No Release Date)" % (artist['artist_name'], rg['title']))
|
||||||
@@ -268,11 +269,6 @@ def addArtisttoDB(artistid, extrasonly=False, forcefull=False):
|
|||||||
logger.info("[%s] Now adding/updating: %s (Comprehensive Force)" % (artist['artist_name'], rg['title']))
|
logger.info("[%s] Now adding/updating: %s (Comprehensive Force)" % (artist['artist_name'], rg['title']))
|
||||||
new_releases = mb.get_new_releases(rgid,includeExtras,forcefull)
|
new_releases = mb.get_new_releases(rgid,includeExtras,forcefull)
|
||||||
|
|
||||||
#What this does is adds new releases per artist to the allalbums + alltracks databases
|
|
||||||
#new_releases = mb.get_new_releases(rgid,includeExtras)
|
|
||||||
#print al_title
|
|
||||||
#print new_releases
|
|
||||||
|
|
||||||
if new_releases != 0:
|
if new_releases != 0:
|
||||||
#Dump existing hybrid release since we're repackaging/replacing it
|
#Dump existing hybrid release since we're repackaging/replacing it
|
||||||
myDB.action("DELETE from albums WHERE ReleaseID=?", [rg['id']])
|
myDB.action("DELETE from albums WHERE ReleaseID=?", [rg['id']])
|
||||||
@@ -381,7 +377,7 @@ def addArtisttoDB(artistid, extrasonly=False, forcefull=False):
|
|||||||
# If there's no release in the main albums tables, add the default (hybrid)
|
# If there's no release in the main albums tables, add the default (hybrid)
|
||||||
# If there is a release, check the ReleaseID against the AlbumID to see if they differ (user updated)
|
# If there is a release, check the ReleaseID against the AlbumID to see if they differ (user updated)
|
||||||
# check if the album already exists
|
# check if the album already exists
|
||||||
rg_exists = myDB.action("SELECT * from albums WHERE AlbumID=?", [rg['id']]).fetchone()
|
|
||||||
if not rg_exists:
|
if not rg_exists:
|
||||||
releaseid = rg['id']
|
releaseid = rg['id']
|
||||||
else:
|
else:
|
||||||
@@ -402,11 +398,14 @@ def addArtisttoDB(artistid, extrasonly=False, forcefull=False):
|
|||||||
"ReleaseFormat": album['ReleaseFormat']
|
"ReleaseFormat": album['ReleaseFormat']
|
||||||
}
|
}
|
||||||
|
|
||||||
if not rg_exists:
|
if rg_exists:
|
||||||
|
newValueDict['DateAdded'] = rg_exists['DateAdded']
|
||||||
|
newValueDict['Status'] = rg_exists['Status']
|
||||||
|
|
||||||
|
else:
|
||||||
today = helpers.today()
|
today = helpers.today()
|
||||||
|
|
||||||
newValueDict['DateAdded']= today
|
newValueDict['DateAdded'] = today
|
||||||
|
|
||||||
if headphones.AUTOWANT_ALL:
|
if headphones.AUTOWANT_ALL:
|
||||||
newValueDict['Status'] = "Wanted"
|
newValueDict['Status'] = "Wanted"
|
||||||
|
|||||||
@@ -328,12 +328,12 @@ def libraryScan(dir=None, append=False, ArtistID=None, ArtistName=None, cron=Fal
|
|||||||
havetracks = len(myDB.select('SELECT TrackTitle from tracks WHERE ArtistID=? AND Location IS NOT NULL', [ArtistID])) + len(myDB.select('SELECT TrackTitle from have WHERE ArtistName like ? AND Matched = "Failed"', [ArtistName]))
|
havetracks = len(myDB.select('SELECT TrackTitle from tracks WHERE ArtistID=? AND Location IS NOT NULL', [ArtistID])) + len(myDB.select('SELECT TrackTitle from have WHERE ArtistName like ? AND Matched = "Failed"', [ArtistName]))
|
||||||
myDB.action('UPDATE artists SET HaveTracks=? WHERE ArtistID=?', [havetracks, ArtistID])
|
myDB.action('UPDATE artists SET HaveTracks=? WHERE ArtistID=?', [havetracks, ArtistID])
|
||||||
|
|
||||||
update_album_status()
|
|
||||||
if not append:
|
if not append:
|
||||||
|
update_album_status()
|
||||||
lastfm.getSimilar()
|
lastfm.getSimilar()
|
||||||
logger.info('Library scan complete')
|
logger.info('Library scan complete')
|
||||||
|
|
||||||
#ADDED THIS SECTION TO MARK ALBUMS AS DOWNLOADED IF ARTISTS ARE ADDED EN MASSE BEFORE LIBRARY IS SCANNED
|
#ADDED THIS SECTION TO MARK ALBUMS AS DOWNLOADED IF ARTISTS ARE ADDED EN MASSE BEFORE LIBRARY IS SCANNED
|
||||||
def update_album_status(AlbumID=None):
|
def update_album_status(AlbumID=None):
|
||||||
myDB = db.DBConnection()
|
myDB = db.DBConnection()
|
||||||
logger.info('Counting matched tracks to mark albums as skipped/downloaded')
|
logger.info('Counting matched tracks to mark albums as skipped/downloaded')
|
||||||
@@ -355,13 +355,21 @@ def update_album_status(AlbumID=None):
|
|||||||
album_completion = 0
|
album_completion = 0
|
||||||
logger.info('Album %s does not have any tracks in database' % album['AlbumTitle'])
|
logger.info('Album %s does not have any tracks in database' % album['AlbumTitle'])
|
||||||
|
|
||||||
if album_completion >= headphones.ALBUM_COMPLETION_PCT:
|
if album_completion >= headphones.ALBUM_COMPLETION_PCT and album['Status'] == 'Skipped':
|
||||||
new_album_status = "Downloaded"
|
new_album_status = "Downloaded"
|
||||||
|
|
||||||
|
# I don't think we want to change Downloaded->Skipped.....
|
||||||
|
# I think we can only automatically change Skipped->Downloaded when updating
|
||||||
|
# There was a bug report where this was causing infinite downloads if the album was
|
||||||
|
# recent, but matched to less than 80%. It would go Downloaded->Skipped->Wanted->Downloaded->Skipped->Wanted->etc....
|
||||||
|
#else:
|
||||||
|
# if album['Status'] == "Skipped" or album['Status'] == "Downloaded":
|
||||||
|
# new_album_status = "Skipped"
|
||||||
|
# else:
|
||||||
|
# new_album_status = album['Status']
|
||||||
else:
|
else:
|
||||||
if album['Status'] == "Skipped" or album['Status'] == "Downloaded":
|
new_album_status = album['Status']
|
||||||
new_album_status = "Skipped"
|
|
||||||
else:
|
|
||||||
new_album_status = album['Status']
|
|
||||||
myDB.upsert("albums", {'Status' : new_album_status}, {'AlbumID' : album['AlbumID']})
|
myDB.upsert("albums", {'Status' : new_album_status}, {'AlbumID' : album['AlbumID']})
|
||||||
if new_album_status != album['Status']:
|
if new_album_status != album['Status']:
|
||||||
logger.info('Album %s changed to %s' % (album['AlbumTitle'], new_album_status))
|
logger.info('Album %s changed to %s' % (album['AlbumTitle'], new_album_status))
|
||||||
|
|||||||
+13
-2
@@ -169,6 +169,17 @@ class PROWL:
|
|||||||
|
|
||||||
self.notify('ZOMG Lazors Pewpewpew!', 'Test Message')
|
self.notify('ZOMG Lazors Pewpewpew!', 'Test Message')
|
||||||
|
|
||||||
|
class MPC:
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
def notify( self ):
|
||||||
|
|
||||||
|
subprocess.call( ["mpc", "update"] )
|
||||||
|
|
||||||
|
|
||||||
class XBMC:
|
class XBMC:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -192,9 +203,9 @@ class XBMC:
|
|||||||
url = host + '/jsonrpc'
|
url = host + '/jsonrpc'
|
||||||
|
|
||||||
if self.password:
|
if self.password:
|
||||||
response = request.request_json(url, method="POST", data=simplejson.dumps(data), headers=headers, auth=(self.username, self.password))
|
response = request.request_json(url, method="post", data=simplejson.dumps(data), headers=headers, auth=(self.username, self.password))
|
||||||
else:
|
else:
|
||||||
response = request.request_json(url, method="POST", data=simplejson.dumps(data), headers=headers)
|
response = request.request_json(url, method="post", data=simplejson.dumps(data), headers=headers)
|
||||||
|
|
||||||
if response:
|
if response:
|
||||||
return response[0]['result']
|
return response[0]['result']
|
||||||
|
|||||||
+21
-25
@@ -42,30 +42,18 @@ def checkFolder():
|
|||||||
if album['FolderName']:
|
if album['FolderName']:
|
||||||
|
|
||||||
if album['Kind'] == 'nzb':
|
if album['Kind'] == 'nzb':
|
||||||
# We're now checking sab config options after sending to determine renaming - but we'll keep the
|
download_dir = headphones.DOWNLOAD_DIR
|
||||||
# iterations in just in case we can't read the config for some reason
|
else:
|
||||||
|
download_dir = headphones.DOWNLOAD_TORRENT_DIR
|
||||||
|
|
||||||
nzb_album_possibilities = [ album['FolderName'],
|
album_path = os.path.join(download_dir, album['FolderName']).encode(headphones.SYS_ENCODING,'replace')
|
||||||
helpers.sab_replace_dots(album['FolderName']),
|
logger.info("Checking if %s exists" % album_path)
|
||||||
helpers.sab_replace_spaces(album['FolderName']),
|
if os.path.exists(album_path):
|
||||||
helpers.sab_replace_spaces(sab_replace_dots(album['FolderName']))
|
logger.info('Found "' + album['FolderName'] + '" in ' + album['Kind'] + ' download folder. Verifying....')
|
||||||
]
|
verify(album['AlbumID'], album_path, album['Kind'])
|
||||||
|
|
||||||
for nzb_folder_name in nzb_album_possibilities:
|
else:
|
||||||
|
logger.info("No folder name found for " + album['Title'])
|
||||||
nzb_album_path = os.path.join(headphones.DOWNLOAD_DIR, nzb_folder_name).encode(headphones.SYS_ENCODING, 'replace')
|
|
||||||
|
|
||||||
if os.path.exists(nzb_album_path):
|
|
||||||
logger.debug('Found %s in NZB download folder. Verifying....' % album['FolderName'])
|
|
||||||
verify(album['AlbumID'], nzb_album_path, 'nzb')
|
|
||||||
|
|
||||||
if album['Kind'] == 'torrent':
|
|
||||||
|
|
||||||
torrent_album_path = os.path.join(headphones.DOWNLOAD_TORRENT_DIR, album['FolderName']).encode(headphones.SYS_ENCODING,'replace')
|
|
||||||
|
|
||||||
if os.path.exists(torrent_album_path):
|
|
||||||
logger.debug('Found %s in torrent download folder. Verifying....' % album['FolderName'])
|
|
||||||
verify(album['AlbumID'], torrent_album_path, 'torrent')
|
|
||||||
|
|
||||||
def verify(albumid, albumpath, Kind=None, forced=False):
|
def verify(albumid, albumpath, Kind=None, forced=False):
|
||||||
|
|
||||||
@@ -83,11 +71,11 @@ def verify(albumid, albumpath, Kind=None, forced=False):
|
|||||||
try:
|
try:
|
||||||
release_list = mb.getReleaseGroup(albumid)
|
release_list = mb.getReleaseGroup(albumid)
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
logger.info('Unable to get release information for manual album with rgid: %s. Error: %s' % (albumid, e))
|
logger.error('Unable to get release information for manual album with rgid: %s. Error: %s' % (albumid, e))
|
||||||
return
|
return
|
||||||
|
|
||||||
if not release_list:
|
if not release_list:
|
||||||
logger.info('Unable to get release information for manual album with rgid: %s' % albumid)
|
logger.error('Unable to get release information for manual album with rgid: %s' % albumid)
|
||||||
return
|
return
|
||||||
|
|
||||||
# Since we're just using this to create the bare minimum information to insert an artist/album combo, use the first release
|
# Since we're just using this to create the bare minimum information to insert an artist/album combo, use the first release
|
||||||
@@ -95,6 +83,10 @@ def verify(albumid, albumpath, Kind=None, forced=False):
|
|||||||
|
|
||||||
release_dict = mb.getRelease(releaseid)
|
release_dict = mb.getRelease(releaseid)
|
||||||
|
|
||||||
|
if not release_dict:
|
||||||
|
logger.error('Unable to get release information for manual album with rgid: %s. Cannot continue' % albumid)
|
||||||
|
return
|
||||||
|
|
||||||
logger.info(u"Now adding/updating artist: " + release_dict['artist_name'])
|
logger.info(u"Now adding/updating artist: " + release_dict['artist_name'])
|
||||||
|
|
||||||
if release_dict['artist_name'].startswith('The '):
|
if release_dict['artist_name'].startswith('The '):
|
||||||
@@ -364,7 +356,7 @@ def doPostProcessing(albumid, albumpath, release, tracks, downloaded_track_list,
|
|||||||
headphones.MOVE_FILES:
|
headphones.MOVE_FILES:
|
||||||
|
|
||||||
if not os.access(downloaded_track, os.W_OK):
|
if not os.access(downloaded_track, os.W_OK):
|
||||||
logger.error("Track file is not writeable, which is equired for some post processing steps: %s", downloaded_track.decode(headphones.SYS_ENCODING, 'replace'))
|
logger.error("Track file is not writeable, which is required for some post processing steps: %s", downloaded_track.decode(headphones.SYS_ENCODING, 'replace'))
|
||||||
return
|
return
|
||||||
|
|
||||||
#start encoding
|
#start encoding
|
||||||
@@ -502,6 +494,10 @@ def doPostProcessing(albumid, albumpath, release, tracks, downloaded_track_list,
|
|||||||
boxcar = notifiers.BOXCAR()
|
boxcar = notifiers.BOXCAR()
|
||||||
boxcar.notify('Headphones processed: ' + pushmessage, "Download and Postprocessing completed", release['AlbumID'])
|
boxcar.notify('Headphones processed: ' + pushmessage, "Download and Postprocessing completed", release['AlbumID'])
|
||||||
|
|
||||||
|
if headphones.MPC_ENABLED:
|
||||||
|
mpc = notifiers.MPC()
|
||||||
|
mpc.notify()
|
||||||
|
|
||||||
def embedAlbumArt(artwork, downloaded_track_list):
|
def embedAlbumArt(artwork, downloaded_track_list):
|
||||||
logger.info('Embedding album art')
|
logger.info('Embedding album art')
|
||||||
|
|
||||||
|
|||||||
+29
-3
@@ -31,7 +31,7 @@ import subprocess
|
|||||||
import headphones
|
import headphones
|
||||||
from headphones.common import USER_AGENT
|
from headphones.common import USER_AGENT
|
||||||
from headphones import logger, db, helpers, classes, sab, nzbget, request
|
from headphones import logger, db, helpers, classes, sab, nzbget, request
|
||||||
from headphones import transmission, notifiers
|
from headphones import utorrent, transmission, notifiers
|
||||||
|
|
||||||
import lib.bencode as bencode
|
import lib.bencode as bencode
|
||||||
|
|
||||||
@@ -307,13 +307,13 @@ def searchNZB(album, new=False, losslessOnly=False):
|
|||||||
params = {
|
params = {
|
||||||
"t": "search",
|
"t": "search",
|
||||||
"cat": categories,
|
"cat": categories,
|
||||||
"apikey": '89edf227c1de9b3de50383fff11466c6',
|
"apikey": '964d601959918a578a670984bdee9357',
|
||||||
"maxage": headphones.USENET_RETENTION,
|
"maxage": headphones.USENET_RETENTION,
|
||||||
"q": term
|
"q": term
|
||||||
}
|
}
|
||||||
|
|
||||||
data = request.request_feed(
|
data = request.request_feed(
|
||||||
url="http://headphones.codeshy.com/newznab/api",
|
url="http://indexer.codeshy.com/api",
|
||||||
params=params, headers=headers,
|
params=params, headers=headers,
|
||||||
auth=(headphones.HPUSER, headphones.HPPASS)
|
auth=(headphones.HPUSER, headphones.HPPASS)
|
||||||
)
|
)
|
||||||
@@ -696,6 +696,30 @@ def send_to_downloader(data, bestqual, album):
|
|||||||
except Exception, e:
|
except Exception, e:
|
||||||
logger.exception("Unhandled exception")
|
logger.exception("Unhandled exception")
|
||||||
|
|
||||||
|
else:
|
||||||
|
logger.info("Sending torrent to uTorrent")
|
||||||
|
|
||||||
|
# rutracker needs cookies to be set, pass the .torrent file instead of url
|
||||||
|
if bestqual[3] == 'rutracker.org':
|
||||||
|
file_or_url = rutracker.get_torrent(bestqual[2])
|
||||||
|
else:
|
||||||
|
file_or_url = bestqual[2]
|
||||||
|
|
||||||
|
folder_name = utorrent.addTorrent(file_or_url)
|
||||||
|
|
||||||
|
if folder_name:
|
||||||
|
logger.info('Torrent folder name: %s' % folder_name)
|
||||||
|
else:
|
||||||
|
logger.error('Torrent folder name could not be determined')
|
||||||
|
return
|
||||||
|
|
||||||
|
# remove temp .torrent file created above
|
||||||
|
if bestqual[3] == 'rutracker.org':
|
||||||
|
try:
|
||||||
|
shutil.rmtree(os.path.split(file_or_url)[0])
|
||||||
|
except Exception, e:
|
||||||
|
logger.exception("Unhandled exception")
|
||||||
|
|
||||||
myDB = db.DBConnection()
|
myDB = db.DBConnection()
|
||||||
myDB.action('UPDATE albums SET status = "Snatched" WHERE AlbumID=?', [album['AlbumID']])
|
myDB.action('UPDATE albums SET status = "Snatched" WHERE AlbumID=?', [album['AlbumID']])
|
||||||
myDB.action('INSERT INTO snatched VALUES( ?, ?, ?, ?, DATETIME("NOW", "localtime"), ?, ?, ?)', [album['AlbumID'], bestqual[0], bestqual[1], bestqual[2], "Snatched", folder_name, kind])
|
myDB.action('INSERT INTO snatched VALUES( ?, ?, ?, ?, DATETIME("NOW", "localtime"), ?, ?, ?)', [album['AlbumID'], bestqual[0], bestqual[1], bestqual[2], "Snatched", folder_name, kind])
|
||||||
@@ -1232,6 +1256,8 @@ def searchTorrent(album, new=False, losslessOnly=False):
|
|||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
url = item.findAll("a")[3]['href']
|
url = item.findAll("a")[3]['href']
|
||||||
|
if url.lower().startswith("//"):
|
||||||
|
url = "http:" + url
|
||||||
formatted_size = re.search('Size (.*),', unicode(item)).group(1).replace(u'\xa0', ' ')
|
formatted_size = re.search('Size (.*),', unicode(item)).group(1).replace(u'\xa0', ' ')
|
||||||
size = helpers.piratesize(formatted_size)
|
size = helpers.piratesize(formatted_size)
|
||||||
if size < maxsize and minimumseeders < seeds and url != None:
|
if size < maxsize and minimumseeders < seeds and url != None:
|
||||||
|
|||||||
@@ -12,3 +12,87 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with Headphones. If not, see <http://www.gnu.org/licenses/>.
|
# along with Headphones. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
import re
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
import base64
|
||||||
|
import headphones
|
||||||
|
|
||||||
|
import simplejson as json
|
||||||
|
|
||||||
|
from headphones import logger, notifiers, request
|
||||||
|
|
||||||
|
# This is just a simple script to send torrents to transmission. The
|
||||||
|
# intention is to turn this into a class where we can check the state
|
||||||
|
# of the download, set the download dir, etc.
|
||||||
|
# TODO: Store the session id so we don't need to make 2 calls
|
||||||
|
# Store torrent id so we can check up on it
|
||||||
|
|
||||||
|
|
||||||
|
def addTorrent(link):
|
||||||
|
|
||||||
|
host = headphones.UTORRENT_HOST
|
||||||
|
username = headphones.UTORRENT_USERNAME
|
||||||
|
password = headphones.UTORRENT_PASSWORD
|
||||||
|
label = headphones.UTORRENT_LABEL
|
||||||
|
token = ''
|
||||||
|
|
||||||
|
if not host.startswith('http'):
|
||||||
|
host = 'http://' + host
|
||||||
|
|
||||||
|
if host.endswith('/'):
|
||||||
|
host = host[:-1]
|
||||||
|
|
||||||
|
if host.endswith('/gui'):
|
||||||
|
host = host + '/'
|
||||||
|
else:
|
||||||
|
host = host + '/gui/'
|
||||||
|
|
||||||
|
# Retrieve session id
|
||||||
|
auth = (username, password) if username and password else None
|
||||||
|
token_request = request.request_response(host + 'token.html', auth=auth)
|
||||||
|
|
||||||
|
token = re.findall('<div.*?>(.*?)</', token_request.content)[0]
|
||||||
|
guid = token_request.cookies['GUID']
|
||||||
|
|
||||||
|
cookies = dict(GUID = guid)
|
||||||
|
|
||||||
|
if link.startswith("magnet") or link.startswith("http") or link.endswith(".torrent"):
|
||||||
|
params = {'action':'add-url', 's':link, 'token':token}
|
||||||
|
response = request.request_json(host, params=params, auth=auth, cookies=cookies)
|
||||||
|
else:
|
||||||
|
params = {'action':'add-file', 'token':token}
|
||||||
|
files = {'torrent_file':{'music.torrent' : link}}
|
||||||
|
response = request.request_json(host, method="post", params=params, files=files, auth=auth, cookies=cookies)
|
||||||
|
if not response:
|
||||||
|
logger.error("Error sending torrent to uTorrent")
|
||||||
|
return
|
||||||
|
|
||||||
|
if link.startswith('magnet'):
|
||||||
|
tor_hash = re.findall('urn:btih:([\w]{32,40})', link)[0]
|
||||||
|
if len(tor_hash) == 32:
|
||||||
|
tor_hash = b16encode(b32decode(tor_hash)).lower()
|
||||||
|
else:
|
||||||
|
info = bdecode(link.content)["info"]
|
||||||
|
tor_hash = sha1(bencode(info)).hexdigest()
|
||||||
|
|
||||||
|
params = {'action':'setprops', 'hash':tor_hash,'s':'label', 'v':label, 'token':token}
|
||||||
|
response = request.request_json(host, params=params, auth=auth, cookies=cookies)
|
||||||
|
if not response:
|
||||||
|
logger.error("Error setting torrent label in uTorrent")
|
||||||
|
return
|
||||||
|
|
||||||
|
# folder info can probably be cleaned up with getprops
|
||||||
|
folder = None
|
||||||
|
|
||||||
|
params = {'list':'1', 'token':token}
|
||||||
|
response = request.request_json(host, params=params, auth=auth, cookies=cookies)
|
||||||
|
if not response:
|
||||||
|
logger.error("Error getting torrent information from uTorrent")
|
||||||
|
return
|
||||||
|
|
||||||
|
for torrent in response['torrents']:
|
||||||
|
folder = os.path.basename(torrent[26])
|
||||||
|
|
||||||
|
return folder
|
||||||
@@ -76,7 +76,7 @@ def getVersion():
|
|||||||
logger.error('Couldn\'t find latest installed version.')
|
logger.error('Couldn\'t find latest installed version.')
|
||||||
cur_commit_hash = None
|
cur_commit_hash = None
|
||||||
|
|
||||||
cur_commit_hash = output
|
cur_commit_hash = str(output)
|
||||||
|
|
||||||
if not re.match('^[a-z0-9]+$', cur_commit_hash):
|
if not re.match('^[a-z0-9]+$', cur_commit_hash):
|
||||||
logger.error('Output doesn\'t look like a hash, not using it')
|
logger.error('Output doesn\'t look like a hash, not using it')
|
||||||
@@ -136,6 +136,10 @@ def checkGithub():
|
|||||||
logger.info('You are running an unknown version of Headphones. Run the updater to identify your version')
|
logger.info('You are running an unknown version of Headphones. Run the updater to identify your version')
|
||||||
return headphones.LATEST_VERSION
|
return headphones.LATEST_VERSION
|
||||||
|
|
||||||
|
if headphones.LATEST_VERSION == headphones.CURRENT_VERSION:
|
||||||
|
logger.info('Headphones is up to date')
|
||||||
|
return headphones.LATEST_VERSION
|
||||||
|
|
||||||
logger.info('Comparing currently installed version with latest GitHub version')
|
logger.info('Comparing currently installed version with latest GitHub version')
|
||||||
url = 'https://api.github.com/repos/%s/headphones/compare/%s...%s' % (headphones.GIT_USER, headphones.LATEST_VERSION, headphones.CURRENT_VERSION)
|
url = 'https://api.github.com/repos/%s/headphones/compare/%s...%s' % (headphones.GIT_USER, headphones.LATEST_VERSION, headphones.CURRENT_VERSION)
|
||||||
commits = request.request_json(url, timeout=20, whitelist_status_code=404, validator=lambda x: type(x) == dict)
|
commits = request.request_json(url, timeout=20, whitelist_status_code=404, validator=lambda x: type(x) == dict)
|
||||||
|
|||||||
+23
-4
@@ -269,7 +269,11 @@ class WebInterface(object):
|
|||||||
searcher.searchforalbum(mbid, new=True)
|
searcher.searchforalbum(mbid, new=True)
|
||||||
if action == 'WantedLossless':
|
if action == 'WantedLossless':
|
||||||
searcher.searchforalbum(mbid, lossless=True)
|
searcher.searchforalbum(mbid, lossless=True)
|
||||||
myDB.action('UPDATE artists SET TotalTracks=(SELECT COUNT(*) FROM tracks, artists WHERE tracks.ArtistName = artists.ArtistName AND AlbumTitle IN (SELECT AlbumTitle FROM albums WHERE Status != "Ignored")) WHERE ArtistID=(SELECT ArtistID FROM albums WHERE AlbumID=?)', [mbid])
|
if ArtistID:
|
||||||
|
ArtistIDT = ArtistID
|
||||||
|
else:
|
||||||
|
ArtistIDT = myDB.action('SELECT ArtistID FROM albums WHERE AlbumID=?', [mbid]).fetchone()[0]
|
||||||
|
myDB.action('UPDATE artists SET TotalTracks=(SELECT COUNT(*) FROM tracks WHERE ArtistID = ? AND AlbumTitle IN (SELECT AlbumTitle FROM albums WHERE Status != "Ignored")) WHERE ArtistID = ?', [ArtistIDT, ArtistIDT])
|
||||||
if ArtistID:
|
if ArtistID:
|
||||||
raise cherrypy.HTTPRedirect("artistPage?ArtistID=%s" % ArtistID)
|
raise cherrypy.HTTPRedirect("artistPage?ArtistID=%s" % ArtistID)
|
||||||
else:
|
else:
|
||||||
@@ -850,6 +854,16 @@ class WebInterface(object):
|
|||||||
return json_albums
|
return json_albums
|
||||||
getAlbumsByArtist_json.exposed=True
|
getAlbumsByArtist_json.exposed=True
|
||||||
|
|
||||||
|
def getArtistjson(self, ArtistID, **kwargs):
|
||||||
|
myDB = db.DBConnection()
|
||||||
|
artist = myDB.action('SELECT * FROM artists WHERE ArtistID=?', [ArtistID]).fetchone()
|
||||||
|
artist_json = json.dumps({
|
||||||
|
'ArtistName': artist['ArtistName'],
|
||||||
|
'Status': artist['Status']
|
||||||
|
})
|
||||||
|
return artist_json
|
||||||
|
getArtistjson.exposed=True
|
||||||
|
|
||||||
def clearhistory(self, type=None, date_added=None, title=None):
|
def clearhistory(self, type=None, date_added=None, title=None):
|
||||||
myDB = db.DBConnection()
|
myDB = db.DBConnection()
|
||||||
if type:
|
if type:
|
||||||
@@ -931,6 +945,7 @@ class WebInterface(object):
|
|||||||
"utorrent_host" : headphones.UTORRENT_HOST,
|
"utorrent_host" : headphones.UTORRENT_HOST,
|
||||||
"utorrent_user" : headphones.UTORRENT_USERNAME,
|
"utorrent_user" : headphones.UTORRENT_USERNAME,
|
||||||
"utorrent_pass" : headphones.UTORRENT_PASSWORD,
|
"utorrent_pass" : headphones.UTORRENT_PASSWORD,
|
||||||
|
"utorrent_label" : headphones.UTORRENT_LABEL,
|
||||||
"nzb_downloader_sabnzbd" : radio(headphones.NZB_DOWNLOADER, 0),
|
"nzb_downloader_sabnzbd" : radio(headphones.NZB_DOWNLOADER, 0),
|
||||||
"nzb_downloader_nzbget" : radio(headphones.NZB_DOWNLOADER, 1),
|
"nzb_downloader_nzbget" : radio(headphones.NZB_DOWNLOADER, 1),
|
||||||
"nzb_downloader_blackhole" : radio(headphones.NZB_DOWNLOADER, 2),
|
"nzb_downloader_blackhole" : radio(headphones.NZB_DOWNLOADER, 2),
|
||||||
@@ -1085,7 +1100,8 @@ class WebInterface(object):
|
|||||||
"songkick_filter_enabled": checked(headphones.SONGKICK_FILTER_ENABLED),
|
"songkick_filter_enabled": checked(headphones.SONGKICK_FILTER_ENABLED),
|
||||||
"cache_sizemb": headphones.CACHE_SIZEMB,
|
"cache_sizemb": headphones.CACHE_SIZEMB,
|
||||||
"file_permissions": headphones.FILE_PERMISSIONS,
|
"file_permissions": headphones.FILE_PERMISSIONS,
|
||||||
"folder_permissions": headphones.FOLDER_PERMISSIONS
|
"folder_permissions": headphones.FOLDER_PERMISSIONS,
|
||||||
|
"mpc_enabled": checked(headphones.MPC_ENABLED)
|
||||||
}
|
}
|
||||||
|
|
||||||
# Need to convert EXTRAS to a dictionary we can pass to the config: it'll come in as a string like 2,5,6,8
|
# Need to convert EXTRAS to a dictionary we can pass to the config: it'll come in as a string like 2,5,6,8
|
||||||
@@ -1108,7 +1124,7 @@ class WebInterface(object):
|
|||||||
def configUpdate(self, http_host='0.0.0.0', http_username=None, http_port=8181, http_password=None, launch_browser=0, api_enabled=0, api_key=None,
|
def configUpdate(self, http_host='0.0.0.0', http_username=None, http_port=8181, http_password=None, launch_browser=0, api_enabled=0, api_key=None,
|
||||||
download_scan_interval=None, update_db_interval=None, mb_ignore_age=None, nzb_search_interval=None, libraryscan_interval=None, sab_host=None, sab_username=None, sab_apikey=None, sab_password=None,
|
download_scan_interval=None, update_db_interval=None, mb_ignore_age=None, nzb_search_interval=None, libraryscan_interval=None, sab_host=None, sab_username=None, sab_apikey=None, sab_password=None,
|
||||||
sab_category=None, nzbget_host=None, nzbget_username=None, nzbget_password=None, nzbget_category=None, transmission_host=None, transmission_username=None, transmission_password=None,
|
sab_category=None, nzbget_host=None, nzbget_username=None, nzbget_password=None, nzbget_category=None, transmission_host=None, transmission_username=None, transmission_password=None,
|
||||||
utorrent_host=None, utorrent_username=None, utorrent_password=None, nzb_downloader=0, torrent_downloader=0, download_dir=None, blackhole_dir=None, usenet_retention=None,
|
utorrent_host=None, utorrent_username=None, utorrent_password=None, utorrent_label=None,nzb_downloader=0, torrent_downloader=0, download_dir=None, blackhole_dir=None, usenet_retention=None,
|
||||||
use_headphones_indexer=0, newznab=0, newznab_host=None, newznab_apikey=None, newznab_enabled=0, nzbsorg=0, nzbsorg_uid=None, nzbsorg_hash=None, nzbsrus=0, nzbsrus_uid=None, nzbsrus_apikey=None, omgwtfnzbs=0, omgwtfnzbs_uid=None, omgwtfnzbs_apikey=None,
|
use_headphones_indexer=0, newznab=0, newznab_host=None, newznab_apikey=None, newznab_enabled=0, nzbsorg=0, nzbsorg_uid=None, nzbsorg_hash=None, nzbsrus=0, nzbsrus_uid=None, nzbsrus_apikey=None, omgwtfnzbs=0, omgwtfnzbs_uid=None, omgwtfnzbs_apikey=None,
|
||||||
preferred_words=None, required_words=None, ignored_words=None, preferred_quality=0, preferred_bitrate=None, detect_bitrate=0, move_files=0, torrentblackhole_dir=None, download_torrent_dir=None,
|
preferred_words=None, required_words=None, ignored_words=None, preferred_quality=0, preferred_bitrate=None, detect_bitrate=0, move_files=0, torrentblackhole_dir=None, download_torrent_dir=None,
|
||||||
numberofseeders=None, use_piratebay=0, piratebay_proxy_url=None, use_isohunt=0, use_kat=0, use_mininova=0, waffles=0, waffles_uid=None, waffles_passkey=None, whatcd=0, whatcd_username=None, whatcd_password=None,
|
numberofseeders=None, use_piratebay=0, piratebay_proxy_url=None, use_isohunt=0, use_kat=0, use_mininova=0, waffles=0, waffles_uid=None, waffles_passkey=None, whatcd=0, whatcd_username=None, whatcd_password=None,
|
||||||
@@ -1122,7 +1138,7 @@ class WebInterface(object):
|
|||||||
osx_notify_enabled=0, osx_notify_onsnatch=0, osx_notify_app=None, boxcar_enabled=0, boxcar_onsnatch=0, boxcar_token=None, mirror=None, customhost=None, customport=None, customsleep=None, hpuser=None, hppass=None,
|
osx_notify_enabled=0, osx_notify_onsnatch=0, osx_notify_app=None, boxcar_enabled=0, boxcar_onsnatch=0, boxcar_token=None, mirror=None, customhost=None, customport=None, customsleep=None, hpuser=None, hppass=None,
|
||||||
preferred_bitrate_high_buffer=None, preferred_bitrate_low_buffer=None, preferred_bitrate_allow_lossless=0, cache_sizemb=None, enable_https=0, https_cert=None, https_key=None, file_permissions=None, folder_permissions=None,
|
preferred_bitrate_high_buffer=None, preferred_bitrate_low_buffer=None, preferred_bitrate_allow_lossless=0, cache_sizemb=None, enable_https=0, https_cert=None, https_key=None, file_permissions=None, folder_permissions=None,
|
||||||
plex_enabled=0, plex_server_host=None, plex_client_host=None, plex_username=None, plex_password=None, plex_update=0, plex_notify=0,
|
plex_enabled=0, plex_server_host=None, plex_client_host=None, plex_username=None, plex_password=None, plex_update=0, plex_notify=0,
|
||||||
songkick_enabled=0, songkick_apikey=None, songkick_location=None, songkick_filter_enabled=0, encoder_multicore=False, encoder_multicore_count=0, **kwargs):
|
songkick_enabled=0, songkick_apikey=None, songkick_location=None, songkick_filter_enabled=0, encoder_multicore=False, encoder_multicore_count=0, mpc_enabled=False, **kwargs ):
|
||||||
|
|
||||||
headphones.HTTP_HOST = http_host
|
headphones.HTTP_HOST = http_host
|
||||||
headphones.HTTP_PORT = http_port
|
headphones.HTTP_PORT = http_port
|
||||||
@@ -1154,6 +1170,7 @@ class WebInterface(object):
|
|||||||
headphones.UTORRENT_HOST = utorrent_host
|
headphones.UTORRENT_HOST = utorrent_host
|
||||||
headphones.UTORRENT_USERNAME = utorrent_username
|
headphones.UTORRENT_USERNAME = utorrent_username
|
||||||
headphones.UTORRENT_PASSWORD = utorrent_password
|
headphones.UTORRENT_PASSWORD = utorrent_password
|
||||||
|
headphones.UTORRENT_LABEL = utorrent_label
|
||||||
headphones.NZB_DOWNLOADER = int(nzb_downloader)
|
headphones.NZB_DOWNLOADER = int(nzb_downloader)
|
||||||
headphones.TORRENT_DOWNLOADER = int(torrent_downloader)
|
headphones.TORRENT_DOWNLOADER = int(torrent_downloader)
|
||||||
headphones.DOWNLOAD_DIR = download_dir
|
headphones.DOWNLOAD_DIR = download_dir
|
||||||
@@ -1291,6 +1308,8 @@ class WebInterface(object):
|
|||||||
headphones.BOXCAR_ONSNATCH = boxcar_onsnatch
|
headphones.BOXCAR_ONSNATCH = boxcar_onsnatch
|
||||||
headphones.BOXCAR_TOKEN = boxcar_token
|
headphones.BOXCAR_TOKEN = boxcar_token
|
||||||
|
|
||||||
|
headphones.MPC_ENABLED = mpc_enabled
|
||||||
|
|
||||||
headphones.MIRROR = mirror
|
headphones.MIRROR = mirror
|
||||||
headphones.CUSTOMHOST = customhost
|
headphones.CUSTOMHOST = customhost
|
||||||
headphones.CUSTOMPORT = customport
|
headphones.CUSTOMPORT = customport
|
||||||
|
|||||||
Reference in New Issue
Block a user