diff --git a/public/index.html b/public/index.html
index 7374805..a700eb5 100644
--- a/public/index.html
+++ b/public/index.html
@@ -257,7 +257,24 @@
Favorites
-
Link Analyzer
+
Link Analyzer
+
{{ title }}
+
{{ subtitle }}
+
+ ISRC | {{ data.isrc }} |
+ UPC | {{ data.upc }} |
+ Duration | {{ convertDuration(data.duration) }} |
+ Disk Number | {{ data.disk_number }} |
+ Track Number | {{ data.track_position }} |
+ Release Date | {{ data.release_date }} |
+ BPM | {{ data.bpm }} |
+ Label | {{ data.label }} |
+ Record Type | {{ data.record_type }} |
+ Genres | {{ data.genres.data.map(x => x.name).join("; ") }} |
+
+
+
{{ country[0] }} - {{ country[1] }}
+
diff --git a/public/js/modules/link-analyzer-tab.js b/public/js/modules/link-analyzer-tab.js
new file mode 100644
index 0000000..2139d31
--- /dev/null
+++ b/public/js/modules/link-analyzer-tab.js
@@ -0,0 +1,62 @@
+import { socket } from './socket.js'
+import { albumView } from './tabs.js'
+import Utils from './utils.js'
+
+const COUNTRIES = {"AF": "Afghanistan","AX": "\u00c5land Islands","AL": "Albania","DZ": "Algeria","AS": "American Samoa","AD": "Andorra","AO": "Angola","AI": "Anguilla","AQ": "Antarctica","AG": "Antigua and Barbuda","AR": "Argentina","AM": "Armenia","AW": "Aruba","AU": "Australia","AT": "Austria","AZ": "Azerbaijan","BS": "Bahamas","BH": "Bahrain","BD": "Bangladesh","BB": "Barbados","BY": "Belarus","BE": "Belgium","BZ": "Belize","BJ": "Benin","BM": "Bermuda","BT": "Bhutan","BO": "Bolivia, Plurinational State of","BQ": "Bonaire, Sint Eustatius and Saba","BA": "Bosnia and Herzegovina","BW": "Botswana","BV": "Bouvet Island","BR": "Brazil","IO": "British Indian Ocean Territory","BN": "Brunei Darussalam","BG": "Bulgaria","BF": "Burkina Faso","BI": "Burundi","KH": "Cambodia","CM": "Cameroon","CA": "Canada","CV": "Cape Verde","KY": "Cayman Islands","CF": "Central African Republic","TD": "Chad","CL": "Chile","CN": "China","CX": "Christmas Island","CC": "Cocos (Keeling) Islands","CO": "Colombia","KM": "Comoros","CG": "Congo","CD": "Congo, the Democratic Republic of the","CK": "Cook Islands","CR": "Costa Rica","CI": "C\u00f4te d'Ivoire","HR": "Croatia","CU": "Cuba","CW": "Cura\u00e7ao","CY": "Cyprus","CZ": "Czech Republic","DK": "Denmark","DJ": "Djibouti","DM": "Dominica","DO": "Dominican Republic","EC": "Ecuador","EG": "Egypt","SV": "El Salvador","GQ": "Equatorial Guinea","ER": "Eritrea","EE": "Estonia","ET": "Ethiopia","FK": "Falkland Islands (Malvinas)","FO": "Faroe Islands","FJ": "Fiji","FI": "Finland","FR": "France","GF": "French Guiana","PF": "French Polynesia","TF": "French Southern Territories","GA": "Gabon","GM": "Gambia","GE": "Georgia","DE": "Germany","GH": "Ghana","GI": "Gibraltar","GR": "Greece","GL": "Greenland","GD": "Grenada","GP": "Guadeloupe","GU": "Guam","GT": "Guatemala","GG": "Guernsey","GN": "Guinea","GW": "Guinea-Bissau","GY": "Guyana","HT": "Haiti","HM": "Heard Island and McDonald Islands","VA": "Holy See (Vatican City State)","HN": "Honduras","HK": "Hong Kong","HU": "Hungary","IS": "Iceland","IN": "India","ID": "Indonesia","IR": "Iran, Islamic Republic of","IQ": "Iraq","IE": "Ireland","IM": "Isle of Man","IL": "Israel","IT": "Italy","JM": "Jamaica","JP": "Japan","JE": "Jersey","JO": "Jordan","KZ": "Kazakhstan","KE": "Kenya","KI": "Kiribati","KP": "Korea, Democratic People's Republic of","KR": "Korea, Republic of","KW": "Kuwait","KG": "Kyrgyzstan","LA": "Lao People's Democratic Republic","LV": "Latvia","LB": "Lebanon","LS": "Lesotho","LR": "Liberia","LY": "Libya","LI": "Liechtenstein","LT": "Lithuania","LU": "Luxembourg","MO": "Macao","MK": "Macedonia, the Former Yugoslav Republic of","MG": "Madagascar","MW": "Malawi","MY": "Malaysia","MV": "Maldives","ML": "Mali","MT": "Malta","MH": "Marshall Islands","MQ": "Martinique","MR": "Mauritania","MU": "Mauritius","YT": "Mayotte","MX": "Mexico","FM": "Micronesia, Federated States of","MD": "Moldova, Republic of","MC": "Monaco","MN": "Mongolia","ME": "Montenegro","MS": "Montserrat","MA": "Morocco","MZ": "Mozambique","MM": "Myanmar","NA": "Namibia","NR": "Nauru","NP": "Nepal","NL": "Netherlands","NC": "New Caledonia","NZ": "New Zealand","NI": "Nicaragua","NE": "Niger","NG": "Nigeria","NU": "Niue","NF": "Norfolk Island","MP": "Northern Mariana Islands","NO": "Norway","OM": "Oman","PK": "Pakistan","PW": "Palau","PS": "Palestine, State of","PA": "Panama","PG": "Papua New Guinea","PY": "Paraguay","PE": "Peru","PH": "Philippines","PN": "Pitcairn","PL": "Poland","PT": "Portugal","PR": "Puerto Rico","QA": "Qatar","RE": "R\u00e9union","RO": "Romania","RU": "Russian Federation","RW": "Rwanda","BL": "Saint Barth\u00e9lemy","SH": "Saint Helena, Ascension and Tristan da Cunha","KN": "Saint Kitts and Nevis","LC": "Saint Lucia","MF": "Saint Martin (French part)","PM": "Saint Pierre and Miquelon","VC": "Saint Vincent and the Grenadines","WS": "Samoa","SM": "San Marino","ST": "Sao Tome and Principe","SA": "Saudi Arabia","SN": "Senegal","RS": "Serbia","SC": "Seychelles","SL": "Sierra Leone","SG": "Singapore","SX": "Sint Maarten (Dutch part)","SK": "Slovakia","SI": "Slovenia","SB": "Solomon Islands","SO": "Somalia","ZA": "South Africa","GS": "South Georgia and the South Sandwich Islands","SS": "South Sudan","ES": "Spain","LK": "Sri Lanka","SD": "Sudan","SR": "Suriname","SJ": "Svalbard and Jan Mayen","SZ": "Swaziland","SE": "Sweden","CH": "Switzerland","SY": "Syrian Arab Republic","TW": "Taiwan, Province of China","TJ": "Tajikistan","TZ": "Tanzania, United Republic of","TH": "Thailand","TL": "Timor-Leste","TG": "Togo","TK": "Tokelau","TO": "Tonga","TT": "Trinidad and Tobago","TN": "Tunisia","TR": "Turkey","TM": "Turkmenistan","TC": "Turks and Caicos Islands","TV": "Tuvalu","UG": "Uganda","UA": "Ukraine","AE": "United Arab Emirates","GB": "United Kingdom","US": "United States","UM": "United States Minor Outlying Islands","UY": "Uruguay","UZ": "Uzbekistan","VU": "Vanuatu","VE": "Venezuela, Bolivarian Republic of","VN": "Viet Nam","VG": "Virgin Islands, British","VI": "Virgin Islands, U.S.","WF": "Wallis and Futuna","EH": "Western Sahara","YE": "Yemen","ZM": "Zambia","ZW": "Zimbabwe"}
+
+const LinkAnalyzerTab = new Vue({
+ data() {
+ return {
+ title: '',
+ subtitle: '',
+ image: '',
+ data: {},
+ type: '',
+ link: '',
+ countries: []
+ }
+ },
+ methods: {
+ albumView,
+ convertDuration: Utils.convertDuration,
+ reset() {
+ this.title = 'Loading...'
+ this.subtitle = ''
+ this.image = ''
+ this.data = {}
+ this.type = ''
+ this.link = ''
+ this.countries = []
+ },
+ showTrack(data) {
+ this.title = data.title + (data.title_version && data.title.indexOf(data.title_version) == -1 ? ' '+data.title_version : '')
+ this.subtitle = `by ${data.artist.name}\nin ${data.album.title}`
+ this.image = data.album.cover_xl
+ this.type = 'track'
+ this.link = data.link
+ data.available_countries.forEach((cc)=>{
+ let temp = []
+ let chars = [...cc].map(c => c.charCodeAt() + 127397)
+ temp.push(String.fromCodePoint(...chars))
+ temp.push(COUNTRIES[cc])
+ this.countries.push(temp)
+ })
+ this.data = data
+ },
+ showAlbum(data) {
+ console.log(data)
+ this.title = data.title
+ this.subtitle = `by ${data.artist.name}\n${data.nb_tracks} tracks`
+ this.image = data.cover_xl
+ this.type = 'album'
+ this.link = data.link
+ this.data = data
+ }
+ },
+ mounted() {
+ socket.on('analyze_track', this.showTrack)
+ socket.on('analyze_album', this.showAlbum)
+ }
+}).$mount('#analyzer_tab')
+
+export default LinkAnalyzerTab
diff --git a/public/js/modules/main-search.js b/public/js/modules/main-search.js
index 648fa38..d7b0945 100644
--- a/public/js/modules/main-search.js
+++ b/public/js/modules/main-search.js
@@ -3,6 +3,7 @@ import { artistView, albumView, playlistView } from './tabs.js'
import Downloads from './downloads.js'
import QualityModal from './quality-modal.js'
import { playPausePreview, previewMouseEnter, previewMouseLeave } from './track-preview.js'
+import Utils from './utils.js'
const MainSearch = new Vue({
data: {
@@ -87,20 +88,8 @@ const MainSearch = new Vue({
e.preventDefault()
QualityModal.open(e.currentTarget.dataset.link)
},
- numberWithDots(x) {
- return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.')
- },
- convertDuration(duration) {
- //convert from seconds only to mm:ss format
- let mm, ss
- mm = Math.floor(duration / 60)
- ss = duration - mm * 60
- //add leading zero if ss < 0
- if (ss < 10) {
- ss = '0' + ss
- }
- return mm + ':' + ss
- },
+ numberWithDots: Utils.numberWithDots,
+ convertDuration: Utils.convertDuration,
search(type) {
socket.emit('search', {
term: this.results.query,
diff --git a/public/js/modules/search.js b/public/js/modules/search.js
index 1791a66..3c37334 100644
--- a/public/js/modules/search.js
+++ b/public/js/modules/search.js
@@ -3,6 +3,7 @@ import Utils from './utils.js'
import QualityModal from './quality-modal.js'
import Downloads from './downloads.js'
import { socket } from './socket.js'
+import { analyzeLink } from './tabs.js'
export default class Search {
static linkListeners() {
@@ -31,7 +32,11 @@ export default class Search {
if (e.ctrlKey) {
QualityModal.open(term)
} else {
- Downloads.sendAddToQueue(term)
+ if (window.main_selected == 'analyzer_tab'){
+ analyzeLink(term)
+ }else{
+ Downloads.sendAddToQueue(term)
+ }
}
} else {
if (term != MainSearch.query || main_selected == 'search_tab') {
diff --git a/public/js/modules/tabs.js b/public/js/modules/tabs.js
index 80fbf3d..39a3cdd 100644
--- a/public/js/modules/tabs.js
+++ b/public/js/modules/tabs.js
@@ -1,5 +1,6 @@
import ArtistTab from './artist-tab.js'
import TracklistTab from './tracklist-tab.js'
+import LinkAnalyzerTab from './link-analyzer-tab.js'
import { socket } from './socket.js'
import SettingsTab from './settings-tab.js'
import MainSearch from './main-search.js'
@@ -34,6 +35,12 @@ export function playlistView(ev) {
showTab('playlist', id)
}
+export function analyzeLink(link) {
+ console.log("Analyzing: "+link)
+ LinkAnalyzerTab.reset()
+ socket.emit('analyzeLink', link)
+}
+
export class Tabs {
static linkListeners() {
document.getElementById('search_tab').addEventListener('click', handleTabClick)
diff --git a/public/js/modules/utils.js b/public/js/modules/utils.js
index 2bb6ab2..c59c4ec 100644
--- a/public/js/modules/utils.js
+++ b/public/js/modules/utils.js
@@ -27,6 +27,10 @@ function convertDurationSeparated(duration) {
return [hh, mm, ss]
}
+function numberWithDots(x) {
+ return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.')
+}
+
// On scroll event, returns currentTarget = null
// Probably on other events too
function debounce(func, wait, immediate) {
@@ -49,5 +53,6 @@ export default {
isValidURL,
convertDuration,
convertDurationSeparated,
+ numberWithDots,
debounce
}