1 Star 0 Fork 0

LiuZhong / listen1_chrome_extension

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
listen1.html 95.92 KB
一键复制 编辑 原始数据 按行查看 历史
Listen 1 提交于 2021-05-24 16:52 . bump v2.21.5
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034
<!DOCTYPE html>
<html lang="en" ng-app="listenone">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags-->
<meta name="description" content="" />
<meta name="author" content="" />
<title ng-bind="document_title">Listen 1</title>
<link href="css/notyf.min.css" rel="stylesheet" />
<link href="css/hotkeys.css" rel="stylesheet" />
<link href="css/icon.css" rel="stylesheet" />
<link href="css/origin.css" rel="stylesheet" id="theme" />
<link href="css/common.css" rel="stylesheet" />
<link href="images/logo_16.png" rel="shortcut icon" />
<link href="images/logo_16.png" rel="bookmark" />
<script>
if (typeof module === 'object') {
window.module = module;
module = undefined;
}
</script>
<script type="text/javascript" src="js/vendor/angular.min.js"></script>
<script src="js/vendor/i18next.min.js"></script>
<script src="js/vendor/i18nextHttpBackend.min.js"></script>
<script
type="text/javascript"
src="js/vendor/forge_listen1_fork.min.js"
></script>
<script type="text/javascript" src="js/vendor/axios.min.js"></script>
<script type="text/javascript" src="js/vendor/notyf.min.js"></script>
<script type="text/javascript" src="js/vendor/howler.core.min.js"></script>
<script type="text/javascript" src="js/vendor/hotkeys.min.js"></script>
<script type="text/javascript" src="js/vendor/async.min.js"></script>
<script type="text/javascript" src="js/vendor/lru-cache.min.js"></script>
<script type="text/javascript" src="js/lowebutil.js"></script>
<script type="text/javascript" src="js/github.js"></script>
<script type="text/javascript" src="js/lastfm.js"></script>
<script type="text/javascript" src="js/provider/xiami.js"></script>
<script type="text/javascript" src="js/provider/qq.js"></script>
<script type="text/javascript" src="js/provider/netease.js"></script>
<script type="text/javascript" src="js/provider/kugou.js"></script>
<script type="text/javascript" src="js/provider/kuwo.js"></script>
<script type="text/javascript" src="js/provider/bilibili.js"></script>
<script type="text/javascript" src="js/provider/migu.js"></script>
<script type="text/javascript" src="js/provider/taihe.js"></script>
<script type="text/javascript" src="js/provider/localmusic.js"></script>
<script type="text/javascript" src="js/bridge.js"></script>
<script type="text/javascript" src="js/player_thread.js"></script>
<script type="text/javascript" src="js/myplaylist.js"></script>
<script type="text/javascript" src="js/loweb.js"></script>
<script type="text/javascript" src="js/l1_player.js"></script>
<script type="text/javascript" src="js/app.js"></script>
<script type="text/javascript" src="js/controller/profile.js"></script>
<script type="text/javascript" src="js/controller/auth.js"></script>
<script type="text/javascript" src="js/controller/navigation.js"></script>
<script type="text/javascript" src="js/controller/my_playlist.js"></script>
<script type="text/javascript" src="js/controller/platform.js"></script>
<script type="text/javascript" src="js/controller/playlist.js"></script>
<script type="text/javascript" src="js/controller/play.js"></script>
<script
type="text/javascript"
src="js/controller/instant_search.js"
></script>
<script>
if (window.module) module = window.module;
</script>
</head>
<body>
<div
id="feather-container"
style="visibility: hidden; position: absolute; width: 0px; height: 0px"
></div>
<div
ng-controller="PlayController as playCtrl"
ng-init="loadLocalSettings()"
>
<div ng-controller="AuthController" ng-init="refreshAuthStatus()">
<div ng-controller="ProfileController" ng-init="initProfile()">
<div ng-controller="NavigationController">
<div class="wrap">
<!-- dialog-->
<div class="shadow" ng-hide="is_dialog_hidden==1"></div>
<div
class="dialog"
ng-hide="is_dialog_hidden==1"
ng-style="myStyle"
>
<div class="dialog-header">
<span>{{ dialog_title }}</span
><span class="dialog-close" ng-click="closeDialog()">×</span>
</div>
<div class="dialog-body">
<!-- choose playlist dialog-->
<ul class="dialog-playlist" ng-show="dialog_type==0">
<li class="detail-add" ng-click="newDialogOption(1)">
<img src="images/mycover.jpg" />
<h2>{{_CREATE_PLAYLIST}}</h2>
</li>
<li
ng-repeat="playlist in myplaylist track by $index"
ng-class-odd="'odd'"
ng-class-even="'even'"
ng-click="chooseDialogOption(playlist.info.id)"
>
<img ng-src="{{ playlist.info.cover_img_url }}" />
<h2>{{ playlist.info.title }}</h2>
</li>
</ul>
<!-- create new playlist dialog-->
<div class="dialog-newplaylist" ng-show="dialog_type==1">
<input
class="form-control"
type="text"
placeholder="{{_INPUT_NEW_PLAYLIST_TITLE}}"
ng-model="newlist_title"
/>
<div class="buttons">
<button
class="btn btn-primary confirm-button"
ng-click="createAndAddPlaylist()"
>
{{_CONFIRM}}
</button>
<button
class="btn btn-default"
ng-click="cancelNewDialog(0)"
>
{{_CANCEL}}
</button>
</div>
</div>
<!-- edit playlist dialog-->
<div class="dialog-editplaylist" ng-show="dialog_type==3">
<div class="form-group">
<label>{{_PLAYLIST_TITLE}}</label>
<input
class="form-control"
type="text"
placeholder="{{_INPUT_PLAYLIST_TITLE}}"
ng-model="dialog_playlist_title"
/>
</div>
<div class="form-group">
<label>{{_PLAYLIST_COVER_IMAGE_URL}}</label>
<input
class="form-control"
type="text"
placeholder="{{_INPUT_PLAYLIST_COVER_IMAGE_URL}}"
ng-model="dialog_cover_img_url"
/>
</div>
<div class="buttons">
<button
class="btn btn-primary confirm-button"
ng-click="editMyPlaylist(list_id)"
>
{{_CONFIRM}}
</button>
<button class="btn btn-default" ng-click="closeDialog()">
{{_CANCEL}}
</button>
</div>
<div class="dialog-footer">
<button
class="btn btn-danger remove-button"
ng-click="removeMyPlaylist(list_id)"
>
{{_REMOVE_PLAYLIST}}
</button>
</div>
</div>
<div class="dialog-connect-lastfm" ng-show="dialog_type==4">
<p>{{_OPENING_LASTFM_PAGE}}</p>
<p>{{_CONFIRM_NOTICE_LASTFM}}</p>
<div class="buttons">
<button
class="btn btn-primary confirm-button"
ng-click="lastfm.updateStatus();closeDialog();"
>
{{_AUTHORIZED_FINISHED}}
</button>
<button
class="btn btn-warning warning-button"
ng-click="lastfm.getAuth();"
>
{{_AUTHORIZED_REOPEN}}
</button>
</div>
</div>
<!-- open playlist dialog-->
<div class="dialog-open-url" ng-show="dialog_type==5">
<div class="form-group">
<label>{{_PLAYLIST_LINK}}</label>
<input
class="form-control"
type="text"
placeholder="{{_EXAMPLE}}https://www.xiami.com/collect/198267231"
ng-model="dialog_url"
/>
</div>
<div class="buttons">
<button
class="btn btn-primary confirm-button"
ng-click="openUrl(dialog_url);closeDialog();dialog_url='';"
>
{{_CONFIRM}}
</button>
<button class="btn btn-default" ng-click="closeDialog()">
{{_CANCEL}}
</button>
</div>
</div>
<ul class="dialog-merge-playlist" ng-show="dialog_type==6">
<li
ng-repeat="playlist in myplaylist track by $index"
ng-class-odd="'odd'"
ng-class-even="'even'"
ng-click="mergePlaylist(playlist.info.id)"
>
<img ng-src="{{ playlist.info.cover_img_url }}" />
<h2>{{ playlist.info.title }}</h2>
</li>
</ul>
<div class="dialog-connect-github" ng-show="dialog_type==7">
<p>{{_OPENING_GITHUB_PAGE}}</p>
<p>{{_CONFIRM_NOTICE_GITHUB}}</p>
<div class="buttons">
<button
class="btn btn-primary confirm-button"
ng-click="updateGithubStatus();closeDialog();"
>
{{_AUTHORIZED_FINISHED}}
</button>
<button
class="btn btn-warning warning-button"
ng-click="openGithubAuth();"
>
{{_AUTHORIZED_REOPEN}}
</button>
</div>
</div>
<ul class="dialog-backuplist" ng-show="dialog_type==8">
<li class="detail-add" ng-click="newDialogOption(9)">
<img src="images/mycover.jpg" />
<h2>{{_CREATE_PLAYLIST_BACKUP}}</h2>
</li>
<li
ng-repeat="backup in myBackup track by $index"
ng-class-odd="'odd'"
ng-class-even="'even'"
ng-click="backupMySettings2Gist(backup.id, backup.public); closeDialog();"
>
<img ng-src="images/mycover.jpg" />
<h2>
{{ backup.id }}<br />
{{backup.description}}
</h2>
</li>
</ul>
<!-- create new backup dialog-->
<div class="dialog-newbackup" ng-show="dialog_type==9">
<button
class="btn btn-primary confirm-button"
ng-click="backupMySettings2Gist(null, true);closeDialog();"
>
{{_CREATE_PUBLIC_BACKUP}}
</button>
<button
class="btn btn-primary confirm-button"
ng-click="backupMySettings2Gist(null, false);closeDialog();"
>
{{_CREATE_PRIVATE_BACKUP}}
</button>
<button
class="btn btn-default"
ng-click="cancelNewDialog(8)"
>
{{_CANCEL}}
</button>
</div>
<ul class="dialog-backuplist" ng-show="dialog_type==10">
<li
ng-repeat="backup in myBackup track by $index"
ng-class-odd="'odd'"
ng-class-even="'even'"
ng-click="importMySettingsFromGist(backup.id); closeDialog();"
>
<img ng-src="images/mycover.jpg" />
<h2>{{ backup.id }} {{backup.description}}</h2>
</li>
</ul>
<div class="dialog-open-login" ng-show="dialog_type==11">
<p>{{_LOGIN_DIALOG_NOTICE}}</p>
<div class="buttons">
<button
class="btn btn-primary confirm-button"
ng-click="closeDialog();refreshAuthStatus();"
>
{{_LOGIN_SUCCESS}}
</button>
<button
class="btn btn-warning warning-button"
ng-click="openLogin(dialog_data);"
>
{{_LOGIN_FAIL_RETRY}}
</button>
</div>
</div>
<div class="dialog-proxy" ng-show="dialog_type==12">
<select
ng-options="mode.displayText for mode in proxyModes"
ng-model="proxyModeInput"
ng-change="changeProxyMode(proxyModeInput)"
></select>
<div
ng-show="proxyModeInput.name=='custom'"
class="custom-proxy"
>
<div class="rule-input">
<div class="field-name">{{_PROTOCOL}}</div>
<select
ng-options="protocol for protocol in proxyProtocols"
ng-model="proxyProtocol"
ng-change="changeProxyProtocol(proxyProtocol)"
></select>
<div class="field-name">{{_HOST}}</div>
<input type="text" id="proxy-rules-host" />
<div class="field-name">{{_PORT}}</div>
<input type="text" id="proxy-rules-port" />
</div>
</div>
<div class="buttons">
<button
class="btn btn-primary confirm-button"
ng-click="setProxyConfig();closeDialog();"
>
{{_CONFIRM}}
</button>
<button
class="btn btn-warning warning-button"
ng-click="closeDialog();"
>
{{_CANCEL}}
</button>
</div>
</div>
</div>
</div>
<div class="main" ng-controller="MyPlayListController">
<div class="sidebar">
<div class="flex-scroll-wrapper">
<div class="menu-control"></div>
<div class="menu-title">
<div class="title">{{_PLATFORM_UNION}}</div>
</div>
<ul class="nav masthead-nav">
<li
ng-class="{ 'active':(current_tag==2) && (window_url_stack.length ==0) }"
ng-click="showTag(2)"
>
<div class="sidebar-block">
<span class="icon li-featured-list"></span
><a>{{_PLAYLISTS}}</a>
</div>
</li>
</ul>
<div
ng-if="!isChrome || is_login('netease') || is_login('qq')"
class="menu-title"
>
<div class="title">{{_MY_MUSIC}}</div>
</div>
<ul class="nav masthead-nav">
<li
ng-if="!isChrome"
ng-click="showPlaylist('lmplaylist_reserve')"
ng-class="{ 'active':window_type=='list' && ( '/playlist?list_id=lmplaylist_reserve' === getCurrentUrl() ) }"
>
<div class="sidebar-block">
<span class="icon li-featured-list"></span
><a>{{_LOCAL_MUSIC}}</a>
</div>
</li>
<li
ng-if="is_login('netease')"
ng-click="showTag(6, {platform:'netease', user: musicAuth.netease});"
ng-class="{ 'active':(current_tag==6 && tag_params.platform=='netease') && (window_url_stack.length ==0) }"
>
<div class="sidebar-block">
<svg class="feather">
<use href="#globe"></use>
</svg>
<a>{{_MY_NETEASE}}</a>
</div>
</li>
<li
ng-if="is_login('qq')"
ng-click="showTag(6, {platform:'qq', user: musicAuth.qq});"
ng-class="{ 'active':(current_tag==6 && tag_params.platform=='qq') && (window_url_stack.length ==0) }"
>
<div class="sidebar-block">
<svg class="feather">
<use href="#globe"></use>
</svg>
<a>{{_MY_QQ}}</a>
</div>
</li>
</ul>
<div class="menu-title" ng-init="loadMyPlaylist();">
<div class="title">{{_CREATED_PLAYLIST}}</div>
<svg class="feather icon" ng-click="showDialog(5)">
<use href="#plus-square"></use>
</svg>
</div>
<ul class="nav masthead-nav">
<li
ng-repeat="i in myplaylists track by $index"
ng-class="{ 'active':window_type=='list' && ( ('/playlist?list_id='+i.info.id) === getCurrentUrl() ) }"
ng-click="showPlaylist(i.info.id)"
drag-drop-zone
drag-zone-type="'application/listen1-myplaylist'"
drop-zone-ondrop="onSidebarPlaylistDrop('my', i.info.id, arg1, arg2, arg3)"
draggable="true"
sortable="true"
drag-zone-object="i"
drag-zone-title="i.info.title"
>
<div class="sidebar-block">
<svg class="feather">
<use href="#disc"></use>
</svg>
<a>{{i.info.title}}</a>
</div>
</li>
</ul>
<div class="menu-title" ng-init="loadFavoritePlaylist();">
<div class="title">{{_FAVORITED_PLAYLIST}}</div>
</div>
<ul class="nav masthead-nav">
<li
ng-repeat="i in favoriteplaylists track by $index"
ng-class="{ 'active':window_type=='list' && ( ('/playlist?list_id='+i.info.id) === getCurrentUrl() ) }"
ng-click="showPlaylist(i.info.id, {useCache: false})"
drag-drop-zone
drag-zone-type="'application/listen1-favoriteplaylist'"
drop-zone-ondrop="onSidebarPlaylistDrop('favorite', i.info.id, arg1, arg2, arg3)"
draggable="true"
sortable="true"
drag-zone-object="i"
drag-zone-title="i.info.title"
>
<div class="sidebar-block">
<svg class="feather">
<use href="#disc"></use>
</svg>
<a>{{i.info.title}}</a>
</div>
</li>
</ul>
</div>
</div>
<div class="content" ng-controller="InstantSearchController">
<div class="navigation">
<div class="backfront">
<span class="icon li-back" ng-click="popWindow()"></span>
<span
class="icon li-advance"
ng-click="forwardWindow()"
></span>
</div>
<div class="search">
<input
class="form-control search-input"
id="search-input"
type="text"
ng-model="keywords"
placeholder="{{_SEARCH_PLACEHOLDER}}"
ng-model-options="{debounce: 500}"
ng-keyup="enterEvent($event)"
/>
</div>
<div
ng-class="{ 'active': (current_tag==4) && (window_url_stack.length ==0)}"
ng-click="showTag(5)"
class="settings"
>
<span class="icon">
<svg class="feather">
<use href="#users"></use>
</svg>
</span>
</div>
<div
ng-class="{ 'active': (current_tag==4) && (window_url_stack.length ==0)}"
ng-click="showTag(4)"
class="settings"
>
<span class="icon li-setting"></span>
</div>
<div ng-if="!isChrome && !isMac" class="window-control">
<svg class="icon" window-control="window_min">
<use href="#minimize-2"></use>
</svg>
<svg class="icon" window-control="window_max">
<use href="#maximize"></use>
</svg>
<svg class="icon" window-control="window_close">
<use href="#x"></use>
</svg>
</div>
</div>
<div
class="browser flex-scroll-wrapper"
infinite-scroll="scrolling()"
content-selector="'#playlist-content'"
>
<!-- hot playlist window-->
<div
class="page page-hot-playlist"
ng-show="current_tag==2 && is_window_hidden==1"
ng-controller="PlayListController"
ng-init="loadPlaylist();"
>
<div class="source-list" ng-show="is_window_hidden==1">
<div
ng-repeat-start="source in ::sourceList"
class="source-button"
ng-class="{'active':tab === source.name}"
ng-click="changeTab(source.name)"
>
{{source.displayText}}
</div>
<div
ng-repeat-end
ng-if="!$last"
class="splitter"
></div>
</div>
<div class="playlist-filter">
<div
class="l1-button filter-item"
ng-repeat="filter in playlistFilters[tab] || []"
ng-click="changeFilter(filter.id)"
ng-class="{'active':filter.id === currentFilterId}"
>
{{filter.name}}
</div>
<div
class="l1-button filter-item"
ng-show="playlistFilters[tab] && playlistFilters[tab].length > 0"
ng-click="toggleMorePlaylists()"
>
更多...
</div>
</div>
<div class="all-playlist-filter" ng-show="showMore">
<div
ng-repeat="category in allPlaylistFilters[tab] || []"
class="category"
>
<div class="category-title">
{{category.category}}
</div>
<div class="category-filters">
<div
class="filter-item"
ng-repeat="filter in category.filters"
>
<span ng-click="changeFilter(filter.id)">
{{filter.name}}</span
>
</div>
</div>
</div>
</div>
<div class="site-wrapper-innerd" id="hotplaylist">
<div class="cover-container" id="playlist-content">
<ul class="playlist-covers">
<li ng-repeat="i in result ">
<div class="u-cover">
<img
ng-src="{{i.cover_img_url}}"
ng-click="showPlaylist(i.id)"
/>
<div
class="bottom"
ng-click="directplaylist(i.id)"
>
<svg class="feather">
<use href="#play-circle"></use>
</svg>
</div>
</div>
<div class="desc">
<span
class="title"
ng-click="showPlaylist(i.id)"
>{{i.title}}</span
>
</div>
</li>
<!-- <div class="loading_bottom">
<img src="images/loading-1.gif" height="40px" />
</div> -->
</ul>
</div>
</div>
</div>
<!-- my platform window-->
<div
class="page page-hot-playlist"
ng-show="current_tag==6 && is_window_hidden==1"
ng-controller="PlatformController"
>
<div class="source-list" ng-show="is_window_hidden==1">
<div
ng-repeat-start="source in ::platformSourceList"
class="source-button"
ng-class="{'active':tab === source.name}"
ng-click="changeTab(source.name)"
>
{{source.displayText}}
</div>
<div
ng-repeat-end
ng-if="!$last"
class="splitter"
></div>
</div>
<div class="site-wrapper-innerd" id="hotplaylist">
<div class="cover-container" id="playlist-content">
<ul class="playlist-covers">
<li ng-repeat="i in myPlatformPlaylists">
<div class="u-cover">
<img
ng-src="{{i.cover_img_url}}"
ng-click="showPlaylist(i.id)"
/>
<div
class="bottom"
ng-click="directplaylist(i.id)"
>
<svg class="feather">
<use href="#play-circle"></use>
</svg>
</div>
</div>
<div class="desc">
<span
class="title"
ng-click="showPlaylist(i.id)"
>{{i.title}}</span
>
</div>
</li>
</ul>
</div>
</div>
</div>
<!-- content page: 快速搜索 -->
<div
class="page"
ng-show="current_tag==3 && is_window_hidden==1"
>
<div class="site-wrapper-innerd">
<div class="cover-container">
<!-- Initialize a new AngularJS app and associate it with a module named "instantSearch"-->
<div class="searchbox">
<ul class="source-list">
<li
class="source-button"
ng-class="{'active':tab === 'allmusic'}"
ng-click="changeSourceTab('allmusic')"
>
<a>{{_ALL_MUSIC}}(Beta)</a>
</li>
<div class="splitter"></div>
<div
ng-repeat-start="source in ::sourceList"
class="source-button"
ng-class="{'active':tab === source.name}"
ng-click="changeSourceTab(source.name)"
>
{{source.displayText}}
</div>
<div
ng-repeat-end
ng-if="!$last"
class="splitter"
></div>
<svg
class="searchspinner"
ng-show="loading"
version="1.1"
id="loader-1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
x="0px"
y="0px"
width="40px"
height="40px"
viewBox="0 0 40 40"
enable-background="new 0 0 40 40"
xml:space="preserve"
>
<path
opacity="0.2"
fill="#000"
d="M20.201,5.169c-8.254,0-14.946,6.692-14.946,14.946c0,8.255,6.692,14.946,14.946,14.946 s14.946-6.691,14.946-14.946C35.146,11.861,28.455,5.169,20.201,5.169z M20.201,31.749c-6.425,0-11.634-5.208-11.634-11.634 c0-6.425,5.209-11.634,11.634-11.634c6.425,0,11.633,5.209,11.633,11.634C31.834,26.541,26.626,31.749,20.201,31.749z"
/>
<path
fill="#000"
d="M26.013,10.047l1.654-2.866c-2.198-1.272-4.743-2.012-7.466-2.012h0v3.312h0 C22.32,8.481,24.301,9.057,26.013,10.047z"
>
<animateTransform
attributeType="xml"
attributeName="transform"
type="rotate"
from="0 20 20"
to="360 20 20"
dur="0.6s"
repeatCount="indefinite"
/>
</path>
</svg>
<div class="search-type">
<li
class="source-button"
ng-class="{'active':isSearchType(0)}"
ng-click="changeSearchType(0)"
>
<a>单曲</a>
</li>
<div class="splitter"></div>
<li
class="source-button"
ng-class="{'active':isSearchType(1)}"
ng-click="changeSearchType(1)"
>
<a>歌单</a>
</li>
</div>
</ul>
<ul class="detail-songlist">
<li class="head" ng-if="searchType===0 ">
<div class="title"><a>{{_SONGS}}</a></div>
<div class="artist"><a>{{_ARTISTS}}</a></div>
<div class="album"><a>{{_ALBUMS}}</a></div>
<div class="tools">{{_OPERATION}}</div>
</li>
<li class="head" ng-if="searchType===1 ">
<div class="title">
<a>{{_PLAYLIST_TITLE}}</a>
</div>
<div class="artist">
<a>{{_PLAYLIST_AUTHOR}}</a>
</div>
<div class="album">
<a>{{_PLAYLIST_SONG_COUNT}}</a>
</div>
</li>
<li
ng-if="searchType===0"
ng-repeat="song in result"
ng-class-odd="'odd'"
ng-class-even="'even'"
ng-mouseenter="options=true"
ng-mouseleave="options=false"
>
<div class="title">
<!-- <a ng-if="song.disabled" class="disabled" ng-click="copyrightNotice()">{{ song.title |limitTo:30}}</a> -->
<a add-and-play="song"
><span
ng-if="isActiveTab('allmusic')"
class="source"
>{{song.sourceName}}</span
>{{ song.title |limitTo:30}}</a
>
</div>
<div class="artist">
<a ng-click="showPlaylist(song.artist_id)"
>{{ song.artist |limitTo:20}}</a
>
</div>
<div class="album">
<a ng-click="showPlaylist(song.album_id)"
>{{ song.album |limitTo:30}}</a
>
</div>
<div class="tools">
<a
title="{{_ADD_TO_QUEUE}}"
class="detail-add-button"
add-without-play="song"
ng-show="options"
><span class="icon li-add"></span
></a>
<a
title="{{_ADD_TO_PLAYLIST}}"
class="detail-fav-button"
ng-show="options"
ng-click="showDialog(0, song)"
><span class="icon li-songlist"></span
></a>
<a
title="{{_REMOVE_FROM_PLAYLIST}}"
class="detail-delete-button"
ng-click="removeSongFromPlaylist(song, list_id)"
ng-show="options && is_mine=='1' "
><span class="icon li-del"></span
></a>
<a
title="{{_ORIGIN_LINK}}"
class="source-button"
open-url="song.source_url"
ng-show="options"
><span class="icon li-link"></span
></a>
</div>
</li>
<li
ng-if="searchType===1"
ng-repeat="playlist in result"
ng-class-odd="'odd'"
ng-class-even="'even'"
class="playlist-result"
>
<div class="title">
<a ng-click="showPlaylist(playlist.id)">
<img
ng-src="{{ playlist.img_url }}"
err-src="https://y.gtimg.cn/mediastyle/global/img/playlist_300.png"
/>
<div>
{{ playlist.title |limitTo:30}}<span
ng-if="isActiveTab('allmusic')"
class="source playlist"
>{{playlist.sourceName}}</span
>
</div>
</a>
</div>
<div class="artist">
{{ playlist.author |limitTo:20}}
</div>
<div class="album">
{{ playlist.count |limitTo:30}}
</div>
</li>
</ul>
<div
class="search-pagination"
ng-show="totalpage>1"
pagination
></div>
</div>
</div>
</div>
</div>
<!-- content page: 设置 -->
<div
class="page"
ng-show="current_tag==4 && is_window_hidden==1"
ng-init="lastfm.updateStatus(); updateGithubStatus();"
>
<div class="site-wrapper-innerd">
<div class="cover-container">
<div class="settings-title">
<span>{{_LANGUAGE}}</span>
</div>
<div class="settings-content">
<div>
<button
class="language-button"
ng-click="setLang('zh-CN')"
>
简体中文
</button>
<button
class="language-button"
ng-click="setLang('zh-TC')"
>
繁体中文
</button>
<button
class="language-button"
ng-click="setLang('en-US')"
>
English
</button>
<button
class="language-button"
ng-click="setLang('fr-FR')"
>
French
</button>
</div>
</div>
<div class="settings-title">
<span>{{_THEME}}</span>
</div>
<div class="settings-content">
<div>
<button
class="theme-button"
ng-click="setTheme('white')"
>
{{_THEME_WHITE}}
</button>
<button
class="theme-button"
ng-click="setTheme('black')"
>
{{_THEME_BLACK}}
</button>
</div>
</div>
<div class="settings-title">
<span>{{_AUTO_CHOOSE_SOURCE}}</span>
</div>
<div class="settings-content">
<div
class="shortcut"
class="btn btn-primary confirm-button"
>
<svg
class="feather"
ng-show="!enableAutoChooseSource"
ng-click="setAutoChooseSource(true)"
>
<use href="#square"></use>
</svg>
<svg
class="feather"
ng-show="enableAutoChooseSource"
ng-click="setAutoChooseSource(true)"
>
<use href="#check-square"></use>
</svg>
{{_AUTO_CHOOSE_SOURCE_NOTICE}}
</div>
<div
class="search-description"
ng-show="enableAutoChooseSource"
>
{{_AUTO_CHOOSE_SOURCE_LIST}}
</div>
<div
class="search-source-list"
ng-show="enableAutoChooseSource"
>
<div
ng-repeat="item in sourceList"
class="search-source"
>
<svg
class="feather"
ng-show="autoChooseSourceList.indexOf(item.name) === -1"
ng-click="enableSource(item.name)"
>
<use href="#square"></use>
</svg>
<svg
class="feather"
ng-show="autoChooseSourceList.indexOf(item.name) > -1"
ng-click="disableSource(item.name)"
>
<use href="#check-square"></use>
</svg>
{{item.displayText}}
</div>
</div>
</div>
<div ng-if="isChrome" class="settings-title">
<span
>{{_CLOSE_TAB_ACTION}}({{_VALID_AFTER_RESTART}})</span
>
</div>
<div ng-if="isChrome" class="settings-content">
<div class="shortcut">
<svg
class="feather"
ng-show="!enableStopWhenClose"
ng-click="setStopWhenClose(true)"
>
<use href="#square"></use>
</svg>
<svg
class="feather"
ng-show="enableStopWhenClose"
ng-click="setStopWhenClose(false)"
>
<use href="#check-square"></use>
</svg>
<span style="margin-right: 20px"
>{{_QUIT_APPLICATION}}</span
>
<svg
class="feather"
ng-show="enableStopWhenClose"
ng-click="setStopWhenClose(false)"
>
<use href="#square"></use>
</svg>
<svg
class="feather"
ng-show="!enableStopWhenClose"
ng-click="setStopWhenClose(true)"
>
<use href="#check-square"></use>
</svg>
<span> {{_MINIMIZE_TO_BACKGROUND}}</span>
</div>
</div>
<div class="settings-title">
<span>{{_NOWPLAYING_DISPLAY}}</span>
</div>
<div class="settings-content">
<div class="shortcut">
<svg
class="feather"
ng-show="!enableNowplayingCoverBackground"
ng-click="setNowplayingCoverBackground(true)"
>
<use href="#square"></use>
</svg>
<svg
class="feather"
ng-show="enableNowplayingCoverBackground"
ng-click="setNowplayingCoverBackground(true)"
>
<use href="#check-square"></use>
</svg>
{{_NOWPLAYING_COVER_BACKGROUND_NOTICE}}
</div>
<div class="shortcut">
<svg
class="feather"
ng-show="!enableNowplayingBitrate"
ng-click="setNowplayingBitrate(true)"
>
<use href="#square"></use>
</svg>
<svg
class="feather"
ng-show="enableNowplayingBitrate"
ng-click="setNowplayingBitrate(true)"
>
<use href="#check-square"></use>
</svg>
{{_NOWPLAYING_BITRATE_NOTICE}}
</div>
<div class="shortcut">
<svg
class="feather"
ng-show="!enableNowplayingPlatform"
ng-click="setNowplayingPlatform(true)"
>
<use href="#square"></use>
</svg>
<svg
class="feather"
ng-show="enableNowplayingPlatform"
ng-click="setNowplayingPlatform(true)"
>
<use href="#check-square"></use>
</svg>
{{_NOWPLAYING_PLATFORM_NOTICE}}
</div>
</div>
<div class="settings-title">
<span>{{_LYRIC_DISPLAY}}</span>
</div>
<div class="settings-content">
<div class="shortcut" ng-if="!isChrome">
<svg
class="feather"
ng-show="!enableLyricFloatingWindow"
ng-click="openLyricFloatingWindow(true)"
>
<use href="#square"></use>
</svg>
<svg
class="feather"
ng-show="enableLyricFloatingWindow"
ng-click="openLyricFloatingWindow(true)"
>
<use href="#check-square"></use>
</svg>
<span ng-show="enableLyricFloatingWindow"></span
>{{_SHOW_DESKTOP_LYRIC}}
</div>
<div class="shortcut">
<svg
class="feather"
ng-show="!enableLyricTranslation"
ng-click="toggleLyricTranslation()"
>
<use href="#square"></use>
</svg>
<svg
class="feather"
ng-show="enableLyricTranslation"
ng-click="toggleLyricTranslation()"
>
<use href="#check-square"></use>
</svg>
<span ng-show="enableLyricTranslation"></span
>{{_SHOW_LYRIC_TRANSLATION}}
</div>
<div class="shortcut" ng-if="!isChrome">
<svg
class="feather"
ng-show="!enableLyricFloatingWindowTranslation"
ng-click="toggleLyricFloatingWindowTranslation()"
>
<use href="#square"></use>
</svg>
<svg
class="feather"
ng-show="enableLyricFloatingWindowTranslation"
ng-click="toggleLyricFloatingWindowTranslation()"
>
<use href="#check-square"></use>
</svg>
<span
ng-show="enableLyricFloatingWindowTranslation"
></span
>{{_SHOW_DESKTOP_LYRIC_TRANSLATION}}
</div>
</div>
<div class="settings-title">
<span>{{_BACKUP_PLAYLIST}}</span>
</div>
<div class="settings-content">
<p>{{_BACKUP_WARNING}}</p>
<div>
<button
class="btn btn-primary confirm-button"
ng-click="backupMySettings()"
>
{{_EXPORT_TO_LOCAL_FILE}}
</button>
<button
class="btn btn-primary confirm-button"
ng-show="githubStatus == 2"
ng-click="showDialog(8)"
>
{{_EXPORT_TO_GITHUB_GIST}}
</button>
</div>
</div>
<div class="settings-title">
<span>{{_RECOVER_PLAYLIST}}</span>
</div>
<div class="settings-content">
<p>{{_RECOVER_WARNING}}</p>
<label class="upload-button" for="my-file-selector">
<input
id="my-file-selector"
type="file"
style="display: none"
ng-model="myuploadfiles"
custom-on-change="importMySettings"
/>{{_RECOVER_FROM_LOCAL_FILE}}
</label>
<button
class="btn btn-warning confirm-button"
ng-show="githubStatus == 2"
ng-click="showDialog(10)"
>
{{_RECOVER_FROM_GITHUB_GIST}}
</button>
</div>
<div class="settings-title">
<span>{{_CONNECT_TO_GITHUB}}</span>
</div>
<div class="settings-content">
<div>
<p>{{_STATUS}}:{{ githubStatusText }}</p>
<button
class="btn btn-primary confirm-button"
ng-show="githubStatus == 0"
ng-click="openGithubAuth(); showDialog(7);"
>
{{_CONNECT_TO_GITHUB}}
</button>
<button
class="btn btn-warning confirm-button"
ng-show="githubStatus == 1"
ng-click="showDialog(7);"
>
{{_RECONNECT}}
</button>
<button
class="btn btn-primary confirm-button"
ng-show="githubStatus == 2"
ng-click="GithubLogout();"
>
{{_CANCEL_CONNECT}}
</button>
</div>
</div>
<div class="settings-title">
<span>{{_CONNECT_TO_LASTFM}}</span>
</div>
<div class="settings-content">
<div>
<p>{{_STATUS}}:{{ lastfm.getStatusText() }}</p>
<button
class="btn btn-primary confirm-button"
ng-show="!lastfm.isAuthRequested()"
ng-click="lastfm.getAuth(); showDialog(4);"
>
{{_CONNECT_TO_LASTFM}}
</button>
<button
class="btn btn-warning confirm-button"
ng-show="lastfm.isAuthRequested() && !lastfm.isAuthorized()"
ng-click="lastfm.getAuth(); showDialog(4);"
>
{{_RECONNECT}}
</button>
<button
class="btn btn-primary confirm-button"
ng-show="lastfm.isAuthRequested()"
ng-click="lastfm.cancelAuth();"
>
{{_CANCEL_CONNECT}}
</button>
</div>
</div>
<div class="settings-title">
<span>{{_SHORTCUTS}}</span>
</div>
<div class="settings-content">
<div class="shortcut_table">
<div class="shortcut_table-header">
<div class="shortcut_table-function">
{{_SHORTCUTS_FUNCTION}}
</div>
<div class="shortcut_table-key">
{{_SHORTCUTS}}
</div>
<div
ng-if="!isChrome"
class="shortcut_table-globalkey"
>
{{_GLOBAL_SHORTCUTS}}
</div>
</div>
<div class="shortcut_table-line">
<div class="shortcut_table-function">
{{_PLAY_OR_PAUSE}}
</div>
<div class="shortcut_table-key">p</div>
<div
ng-if="!isChrome"
class="shortcut_table-globalkey"
>
Ctrl(Cmd) + Alt + {{_KEYBOARD_SPACE}}
</div>
</div>
<div class="shortcut_table-line">
<div class="shortcut_table-function">
{{_PREVIOUS_TRACK}}
</div>
<div class="shortcut_table-key">[</div>
<div
ng-if="!isChrome"
class="shortcut_table-globalkey"
>
Ctrl(Cmd) + Alt + ←
</div>
</div>
<div class="shortcut_table-line">
<div class="shortcut_table-function">
{{_NEXT_TRACK}}
</div>
<div class="shortcut_table-key">]</div>
<div
ng-if="!isChrome"
class="shortcut_table-globalkey"
>
Ctrl(Cmd) + Alt + →
</div>
</div>
<div class="shortcut_table-line">
<div class="shortcut_table-function">
{{_VOLUME_UP}}
</div>
<div class="shortcut_table-key">u</div>
<div
ng-if="!isChrome"
class="shortcut_table-globalkey"
>
{{_SHORTCUTS_NOT_SET}}
</div>
</div>
<div class="shortcut_table-line">
<div class="shortcut_table-function">
{{_VOLUME_DOWN}}
</div>
<div class="shortcut_table-key">d</div>
<div
ng-if="!isChrome"
class="shortcut_table-globalkey"
>
{{_SHORTCUTS_NOT_SET}}
</div>
</div>
<!-- <div class="shortcut_table-line">
<div class="shortcut_table-function">
静音/取消静音
</div>
<div class="shortcut_table-key">m</div>
<div ng-if="!isChrome" class="shortcut_table-globalkey">
全局快捷键
</div>
</div> -->
<div class="shortcut_table-line">
<div class="shortcut_table-function">
{{_QUICK_SEARCH}}
</div>
<div class="shortcut_table-key">f</div>
<div
ng-if="!isChrome"
class="shortcut_table-globalkey"
>
{{_SHORTCUTS_NOT_SET}}
</div>
</div>
<!-- <div class="shortcut_table-line">
<div class="shortcut_table-function">
打开/关闭播放列表
</div>
<div class="shortcut_table-key">l</div>
<div ng-if="!isChrome" class="shortcut_table-globalkey">
全局快捷键
</div>
</div>
<div class="shortcut_table-line">
<div class="shortcut_table-function">
切换播放模式
</div>
<div class="shortcut_table-key">s</div>
<div ng-if="!isChrome" class="shortcut_table-globalkey">
全局快捷键
</div>
</div> -->
</div>
<div
class="shortcut"
ng-if="!isChrome"
class="btn btn-primary confirm-button"
>
<svg
class="feather"
ng-show="!enableGlobalShortCut"
ng-click="applyGlobalShortcut(true)"
>
<use href="#square"></use>
</svg>
<svg
class="feather"
ng-show="enableGlobalShortCut"
ng-click="applyGlobalShortcut(true)"
>
<use href="#check-square"></use>
</svg>
{{_GLOBAL_SHORTCUTS_NOTICE}}
</div>
</div>
<div class="settings-title" ng-if="!isChrome">
<span>{{_PROXY_CONFIG}}</span>
</div>
<div class="settings-content" ng-if="!isChrome">
<span>{{_PROXY_CONFIG}}:</span>
{{proxyMode.displayText}}
<span ng-show="proxyMode.name=='custom'"
>{{proxyRules}}</span
>
<button ng-click="showDialog(12)">
{{_MODIFY}}
</button>
</div>
<div class="settings-title">
<span>{{_ABOUT}}</span>
</div>
<div class="settings-content">
<p>
Listen 1 {{_HOMEPAGE}}:
<a
open-url="'https://listen1.github.io/listen1/'"
>
https://listen1.github.io/listen1/
</a>
</p>
<p>Listen 1 {{_EMAIL}}: githublisten1@gmail.com</p>
<p>
{{_FEEDBACK}}:
<a
ng-if="isChrome"
open-url="'https://github.com/listen1/listen1_chrome_extension/issues'"
>https://github.com/listen1/listen1_chrome_extension/issues</a
>
<a
ng-if="!isChrome"
open-url="'https://github.com/listen1/listen1_desktop/issues'"
>https://github.com/listen1/listen1_desktop/issues</a
>
</p>
<p>{{_DESIGNER}}: iparanoid</p>
<p>{{_VERSION}}: v2.21.5 {{_LICENSE_NOTICE}}</p>
<p ng-show='lastestVersion!=""'>
{{_LATEST_VERSION}}: {{lastestVersion}}
</p>
</div>
</div>
</div>
</div>
<!-- content page: 登录 -->
<div
class="page"
ng-show="current_tag==5 && is_window_hidden==1"
>
<div class="login">
<div ng-repeat="source in loginSourceList">
<div ng-show="is_login(source)">
<div class="usercard">
<img ng-src="{{musicAuth[source].avatar}}" />
<div class="usercard-title">
<div class="usercard-nickname">
{{musicAuth[source].nickname}}
</div>
<div class="usercard-info">{{source}}</div>
</div>
<button ng-click="logout(source)">
{{_LOGOUT}}
</button>
</div>
</div>
<div ng-show="!is_login(source)">
<div class="usercard">
<img src="images/placeholder.png" />
<div class="usercard-title">
<div class="usercard-nickname">
{{_NOT_LOGIN_NICKNAME}}
</div>
<div class="usercard-info">{{source}}</div>
</div>
<button
ng-click=" openLogin(source);showDialog(11, source);"
>
{{_LOGIN}}
</button>
</div>
</div>
</div>
</div>
</div>
<!-- track list window-->
<div class="page">
<div
class="playlist-detail"
ng-show="is_window_hidden!=1 && window_type=='list'"
>
<div class="detail-head">
<div class="detail-head-cover">
<img
ng-src="{{ cover_img_url }}"
err-src="https://y.gtimg.cn/mediastyle/global/img/singer_300.png"
/>
</div>
<div class="detail-head-title">
<h2>{{ playlist_title }}</h2>
<div class="playlist-button-list">
<div class="playlist-button playadd-button">
<div
class="play-list"
ng-click="playMylist(list_id)"
>
<span class="icon li-play-s"></span>
{{_PLAY_ALL}}
</div>
<div
class="add-list"
ng-click="addMylist(list_id)"
>
<span class="icon li-add"></span>
</div>
</div>
<div
class="playlist-button clone-button"
ng-show="is_local"
ng-click="addLocalMusic(list_id)"
>
<div class="play-list">
<span class="icon li-songlist"></span
><span>{{_ADD_LOCAL_SONGS}}</span>
</div>
</div>
<div
class="playlist-button clone-button"
ng-show="!is_mine && !is_local"
ng-click="clonePlaylist(list_id)"
>
<div class="play-list">
<span class="icon li-songlist"></span
><span>{{_ADD_TO_PLAYLIST}}</span>
</div>
</div>
<div
class="playlist-button edit-button"
ng-show="is_mine && !is_local"
ng-click="showDialog(3, {list_id: list_id, playlist_title: playlist_title, cover_img_url: cover_img_url})"
>
<div class="play-list">
<svg class="feather">
<use href="#edit"></use>
</svg>
<span>{{_EDIT}}</span>
</div>
</div>
<div
class="playlist-button fav-button"
ng-show="!is_mine && !is_local"
ng-click="favoritePlaylist(list_id)"
>
<div
class="play-list"
ng-class="{'favorited':is_favorite,'notfavorite':!is_favorite}"
>
<svg class="feather">
<use href="#star"></use>
</svg>
<span
>{{is_favorite?_FAVORITED:_FAVORITE}}</span
>
</div>
</div>
<div
class="playlist-button edit-button"
ng-show="isChrome && is_favorite && !is_local"
ng-click="closeWindow();showPlaylist(list_id)"
>
<div class="play-list">
<span class="icon li-loop"></span
><span>{{_REFRESH_PLAYLIST}}</span>
</div>
</div>
<div
class="playlist-button edit-button"
ng-show="!is_mine && !is_local"
open-url="playlist_source_url"
>
<div class="play-list">
<span class="icon li-link"></span
><span>{{_ORIGIN_LINK}}</span>
</div>
</div>
<div
class="playlist-button edit-button"
ng-show="is_mine && !is_local"
ng-click="showDialog(6)"
>
<div class="play-list">
<svg class="feather">
<use href="#git-merge"></use>
</svg>
<span>{{_IMPORT}}</span>
</div>
</div>
</div>
</div>
</div>
<ul class="detail-songlist">
<div class="playlist-search">
<svg class="feather playlist-search-icon">
<use href="#search"></use>
</svg>
<svg
class="feather playlist-clear-icon"
ng-show="playlistFilter.key!=''"
ng-click="clearFilter()"
>
<use href="#x"></use>
</svg>
<input
class="playlist-search-input"
type="text"
ng-model="playlistFilter.key"
placeholder="{{_SEARCH_PLAYLIST}}"
/>
</div>
<li class="head">
<div class="title">
<a>{{_SONGS + '(' + songs.length + ')'}}</a>
</div>
<div class="artist"><a>{{_ARTISTS}}</a></div>
<div class="album"><a>{{_ALBUMS}}</a></div>
<div class="tools">{{_OPERATION}}</div>
</li>
<li
ng-repeat="song in songs | filter: fieldFilter track by $index"
ng-class-odd="'odd'"
ng-class-even="'even'"
ng-mouseenter="options=true"
ng-mouseleave="options=false"
draggable="true"
drag-drop-zone
drag-zone-object="song"
drag-zone-title="song.title"
sortable="is_mine || is_local"
drag-zone-type="'application/listen1-song'"
drop-zone-ondrop="onPlaylistSongDrop(list_id, song, arg1, arg2, arg3)"
>
<div class="title">
<!-- <a class="disabled" ng-if="song.disabled" ng-click="copyrightNotice()">{{ song.title }}</a> -->
<a add-and-play="song">{{ song.title }}</a>
</div>
<div class="artist">
<a ng-click="showPlaylist(song.artist_id)"
>{{ song.artist }}</a
>
</div>
<div class="album">
<a ng-click="showPlaylist(song.album_id)"
>{{ song.album }}</a
>
</div>
<div class="tools">
<a
title="{{_ADD_TO_QUEUE}}"
class="detail-add-button"
add-without-play="song"
ng-show="options"
><span class="icon li-add"></span
></a>
<a
title="{{_ADD_TO_PLAYLIST}}"
class="detail-fav-button"
ng-show="options"
ng-click="showDialog(0, song)"
><span class="icon li-songlist"></span
></a>
<a
title="{{_REMOVE_FROM_PLAYLIST}}"
class="detail-delete-button"
ng-click="removeSongFromPlaylist(song, list_id)"
ng-show="options && (is_mine=='1'||is_local) "
><span class="icon li-del"></span
></a>
<a
title="{{_ORIGIN_LINK}}"
class="source-button"
open-url="song.source_url"
ng-show="options && !is_local"
><span class="icon li-link"></span
></a>
</div>
</li>
</ul>
</div>
<!-- now playing window-->
<div
class="songdetail-wrapper"
ng-class="{slidedown: window_type!=='track', coverbg: enableNowplayingCoverBackground}"
>
<div class="draggable-zone"></div>
<div
ng-if="enableNowplayingCoverBackground"
class="bg"
ng-style="{'background-image': 'url(' + currentPlaying.img_url + ')'}"
></div>
<div
class="translate-switch"
ng-click="toggleLyricTranslation()"
ng-class="{selected: enableLyricTranslation}"
>
</div>
<div
class="close"
ng-class="isMac? 'mac':'' "
ng-click="popWindow()"
>
<svg class="icon">
<use href="#chevron-down"></use>
</svg>
</div>
<div ng-if="!isChrome && !isMac" class="window-control">
<svg class="icon" window-control="window_min">
<use href="#minimize-2"></use>
</svg>
<svg class="icon" window-control="window_max">
<use href="#maximize"></use>
</svg>
<svg class="icon" window-control="window_close">
<use href="#x"></use>
</svg>
</div>
<div class="playsong-detail">
<div class="detail-head">
<div class="detail-head-cover">
<img
ng-src="{{ currentPlaying.img_url }}"
err-src="https://y.gtimg.cn/mediastyle/global/img/album_300.png"
/>
</div>
<div class="detail-head-title">
<!--<a title="加入收藏" class="clone" ng-click="showDialog(0, currentPlaying)">收藏</a>
<a open-url="currentPlaying.source_url" title="原始链接" class="link">原始链接</a>-->
</div>
</div>
<div class="detail-songinfo">
<div class="title">
<h2>{{ currentPlaying.title }}</h2>
<span
class="badge"
ng-if="enableNowplayingBitrate && currentPlaying.bitrate !== undefined"
>{{ currentPlaying.bitrate }}</span
>
<span
class="badge platform"
ng-if="enableNowplayingPlatform && currentPlaying.platform !== undefined"
>{{ currentPlaying.platformText }}</span
>
</div>
<div class="info">
<div class="singer">
<span>{{_ARTIST}}: </span
><a
ng-click="showPlaylist(currentPlaying.artist_id)"
title="{{currentPlaying.artist}}"
>{{ currentPlaying.artist }}</a
>
</div>
<div class="album">
<span>{{_ALBUM}}: </span
><a
ng-click="showPlaylist(currentPlaying.album_id)"
title="{{currentPlaying.album}}"
>{{ currentPlaying.album }}</a
>
</div>
</div>
<div class="lyric">
<div class="placeholder"></div>
<p
ng-repeat="line in lyricArray track by $index"
data-line="{{line.lineNumber}}"
ng-class="{ 'highlight': (line.lineNumber == lyricLineNumber) || (line.lineNumber == lyricLineNumberTrans) , hide: (line.translationFlag && !enableLyricTranslation), translate: line.translationFlag}"
>
{{ line.content }}
</p>
<div class="placeholder"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="footer">
<div class="left-control">
<span class="icon li-previous" prev-track=""></span>
<span
class="icon li-play play"
ng-class="isPlaying? 'li-pause': 'li-play'"
play-pause-toggle=""
></span>
<span class="icon li-next" next-track=""></span>
</div>
<div class="main-info">
<div class="logo-banner" ng-if="playlist.length == 0">
<svg
class="logo"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="#666666"
stroke="#666666"
stroke-width="1"
stroke-linecap="round"
stroke-linejoin="round"
>
<polygon
points="7 4 7 19 16 19 16 16 10 16 10 4"
></polygon>
<polygon points="13 4 13 13 16 13 16 4"></polygon>
</svg>
</div>
<div
class="cover"
class="cover"
ng-if="playlist.length > 0"
ng-click="toggleNowPlaying()"
>
<img
ng-src="{{ currentPlaying.img_url }}"
err-src="https://y.gtimg.cn/mediastyle/global/img/album_300.png"
/>
<div class="mask">
<svg class="feather">
<use href="#chevrons-up"></use>
</svg>
</div>
</div>
<div class="detail" ng-if="playlist.length > 0">
<div class="ctrl">
<a
ng-click="showDialog(0, currentPlaying)"
title="{{_ADD_TO_PLAYLIST}}"
>
<span class="icon li-songlist"></span>
</a>
<a
title="{{ settings.playmode | playmode_title }}(s)"
ng-click="changePlaymode()"
>
<span
ng-show="settings.playmode == 0"
class="icon li-loop"
></span>
<span
ng-show="settings.playmode == 1"
class="icon li-random-loop"
></span>
<span
ng-show="settings.playmode == 2"
class="icon li-single-cycle"
></span>
</a>
</div>
<div class="title">
<span
ng-if="currentPlaying.source === 'xiami'"
style="color: orange; font-size: medium"
>⚠️ </span
>{{ currentPlaying.title }}
</div>
<div class="more-info">
<div class="current">{{ currentPosition }}</div>
<div class="singer">
<a ng-click="showPlaylist(currentPlaying.artist_id)"
>{{ currentPlaying.artist }}</a
>
-
<a ng-click="showPlaylist(currentPlaying.album_id)"
>{{ currentPlaying.album }}</a
>
</div>
<div class="total">{{ currentDuration }}</div>
</div>
<div class="playbar">
<div
class="barbg"
id="progressbar"
mode="play"
draggable-bar=""
>
<div class="cur" ng-style="{width : myProgress + '%' }">
<span class="btn"><i></i></span>
</div>
</div>
</div>
</div>
</div>
<div class="right-control">
<div class="playlist-toggle">
<span
ng-click="togglePlaylist()"
class="icon li-list"
></span>
</div>
<div class="volume-ctrl" volume-wheel="">
<span
class="icon"
ng-class="mute? 'li-mute': 'li-volume'"
ng-click="toggleMuteStatus()"
></span>
<div class="m-pbar volume">
<div
class="barbg"
id="volumebar"
mode="volume"
draggable-bar=""
>
<div class="cur" ng-style="{width : volume + '%' }">
<span class="btn"><i></i></span>
</div>
</div>
</div>
</div>
<div ng-if="!isChrome" class="lyric-toggle">
<div
ng-click="openLyricFloatingWindow(true)"
class="lyric-icon"
ng-class="{'selected': enableLyricFloatingWindow}"
>
</div>
</div>
</div>
<div
class="menu-modal"
ng-class="{slideup: !menuHidden}"
ng-click="togglePlaylist()"
></div>
<div class="menu" ng-class="{slideup: !menuHidden}">
<div class="menu-header">
<span class="menu-title"
>{{_TOTAL_SONG_PREFIX}}{{playlist.length}}{{_TOTAL_SONG_POSTFIX}}</span
>
<a class="add-all" ng-click="showDialog(0, playlist)">
<span
class="icon li-songlist"
ng-click="togglePlaylist()"
></span>
<span>{{_ADD_TO_PLAYLIST}}</span></a
>
<a class="remove-all" clear-playlist=""
><span
class="icon li-del"
ng-click="togglePlaylist()"
></span
><span>{{_CLEAR_ALL}}</span></a
>
<a class="close" ng-click="togglePlaylist()"
><svg class="feather">
<use href="#x"></use>
</svg>
</a>
</div>
<ul class="menu-list">
<li
id="song{{ song.id }}"
ng-repeat="song in playlist track by $index"
ng-class="{ playing: currentPlaying.id == song.id }"
ng-mouseenter="playlist_highlight=true"
ng-mouseleave="playlist_highlight=false"
ng-class-odd="'odd'"
ng-class-even="'even'"
draggable="true"
drag-drop-zone
drag-zone-object="song"
drag-zone-title="song.title"
sortable="true"
drag-zone-type="'application/listen1-song'"
drop-zone-ondrop="onCurrentPlayingSongDrop(song, arg1, arg2, arg3)"
>
<div class="song-status-icon">
<svg
class="feather play"
ng-show="currentPlaying.id == song.id"
>
<use href="#play"></use>
</svg>
</div>
<div
class="song-title"
ng-class="song.disabled? 'disabled':'' "
>
<a play-from-playlist="song"
><span
ng-if="song.source === 'xiami'"
style="
color: orange;
border-radius: 12px;
border: solid 1px;
padding: 0 4px;
"
>⚠️ 🦐</span
>{{ song.title }}</a
>
</div>
<div class="song-singer">
<a
ng-click="showPlaylist(song.artist_id); togglePlaylist();"
>{{ song.artist }}</a
>
</div>
<div class="tools">
<span
remove-from-playlist="song"
data-index="{{$index}}"
ng-show="playlist_highlight"
class="icon li-del"
></span>
<span
open-url="song.source_url"
ng-show="playlist_highlight"
class="icon li-link"
></span>
</div>
<!-- <div class="song-time">00:00</div> -->
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
1
https://gitee.com/lz4it/listen1_chrome_extension.git
git@gitee.com:lz4it/listen1_chrome_extension.git
lz4it
listen1_chrome_extension
listen1_chrome_extension
master

搜索帮助