1+ /*
2+ @header ({
3+ searchable: 2,
4+ filterable: 1,
5+ quickSearch: 0,
6+ title: '360影视[官]',
7+ '类型': '影视',
8+ lang: 'ds'
9+ })
10+ */
11+
12+ var rule = {
13+ title : '360影视[官]' ,
14+ host : 'https://www.360kan.com' ,
15+ homeUrl : 'https://api.web.360kan.com/v1/rank?cat=2&size=9' ,
16+ detailUrl : 'https://api.web.360kan.com/v1/detail?cat=fyclass&id=fyid' ,
17+ searchUrl : 'https://api.so.360kan.com/index?force_v=1&kw=**&from=&pageno=fypage&v_ap=1&tab=all' ,
18+ url : 'https://api.web.360kan.com/v1/fyfilter&size=35&pageno=fypage&callback=' ,
19+ filterable : 1 ,
20+ filter_url : 'filter/list?catid=fyclass&rank={{fl.排序}}&cat={{fl.类型}}&year={{fl.年代}}&area={{fl.地区}}' ,
21+ filter : "H4sIAAAAAAAAA+2YS08jRxCA/4vPHGbMvrK3/IJcor1Eq4gDUqIlbLQhkVYrJINt1jYPA8vLa2MgYJtlMdhAiD1e4z8z3TP+Fxm7Xu0oGs2BQBRx81fVXV3V3VNV7XcxO/b8u3exV5NvY89jXrOjyouxsdj0xE+TJv82MfXr5HDgdCBW6eN+8nggDiA2O4bSrZLK1lCKQDov09TJNOoQeF7u2O2WaB4A6fTcqk5soQ6BbdbWVLtDNgHYZrYm6yHwvNy51z2heQA8r/JebCKwL5kd18mSLwCsmz/1ttZIB2DE5210JL4B8Lyt937WoXkA7Kdzorqb5CcA6dwv+/5ZA3UIbLO+5GfKZBOAfckf+Ye8LwCsW1lQ+QvSAbDNZE7PfySbAOJL1VtdYF+GwDbT126Hzg9h9uVACxdOlRpqyZELxxzpwi2kg/Fk/KjWL8jCbquuit1+taBb5zgCYXSEyjd0+4Y3ZAgc9GUjGEFBA/Dh3KyIDoF0/b1PokNgm9sVXTolmwCy3qa53qY5z19sig6B9+HmT9EhsG65oZwq6QAiH077yu0cGodDHOVw4lb8EcqGPw35uMjHTXlc5HFTbovcNuWWyC1Dbn/F8uCnIX8m8mem/KnIn5ryJyJ/Ysofi/yxKZd4bTNeW+K1zXhtidc247UlLtuMy5K4LDMuS+KyzLgsicuSuHTxSm9/Qs3UzPdvJyfejJy6XllXTl5OnXn01HUp4ffWvGRd7+yjtTcT069+eD0jSw2HuK3c6JCpiZnJX0ZGqfy2qnT985Qx6ufXP07PDBx7ORaL31aJ8o8TUhYQopSM0BQXUvbCykI/2VWtecoSAGxz7lol82QTIFIKXyi6ziLpADj2elUtUdlDiJL6Va6pettcvobAWbBS9s93KQsC8HqN5aBI0noAHPvuut6pUOxDMLdNnV0rp05LDmFEHdYwJNO6QBkfQQpj1b2hm4gQqZm4uyIGcFdFLKwYhRWxsOIXVqj0VkPl9tXuATc8xA9l56Hs/OfKzvitlZ1UU+UPvVqCPgtm/qJKe67jyAhh9ne17J1yKQHgbzWRlakIkrw+q2VuAAHYr7Oe38iQUwBmIk3tGYk0APZ2Y09fcbIE4HmFj+4XfikASE65dNurnFOGwL7MLakSvYQQjHzTPyRfECSHXasGrwfAulZLZ6iMIvC+NNZUqkf7AsBZtfvBn6dyiGC+ys7odYVgFBG9WZAiMgD5AC6Mlx5AlBebf/W716EYEHhes+t36WwRWLde1zkqsQj/j1dZ2AvqtBZcD9IB3EuSGeaPR7eVPwJP/ANODQBRGpdBaQ5uduXSKNXA/EXWN2Q2As/u5FW6RVMBojSFYV+WWljvF6gMIETJcHrlWBpwBNbNLXqZJukAWHfR0SnKcAjsS7ujk7Q1CDxv/0AVqQNFMNpPL8sxAMi1cKTpReCr7VyoOmU/BLaZ6gXfPdkE4AzQWw1WoQwAEOWBoRMn4icC60L+y/KKOV2gTIUQ0rjLvM8V4zEAILqyzvENBojSzntHN1JNEOQhtGg82AD+Vk+zdPTCUsP+UN2mMYKZRnzz4mtRI5Du2xeigt9Gj+ttnoz85zcikjfOktf5MPrfoCm6k3wclkv/scl/aNPvvU2XeG0z3n+3fQ9A4rXMeC2J1zLjtSReS+IdeQYg3FeBnv0LfL9z7fwYAAA=" ,
22+ filter_def : { } ,
23+ headers : {
24+ 'User-Agent' : 'MOBILE_UA'
25+ } ,
26+ timeout : 5000 ,
27+ class_name : '电视剧&电影&综艺&动漫' ,
28+ class_url : '2&1&3&4' ,
29+ limit : 5 ,
30+ multi : 1 ,
31+ searchable : 2 ,
32+ play_parse : true ,
33+ lazy : async function ( ) {
34+ let { input} = this ;
35+ if ( input . includes ( '?' ) && ! input . includes ( 'video?vid=' ) ) {
36+ input = input . split ( "?" ) [ 0 ] ;
37+ }
38+ return input
39+ } ,
40+ 推荐 : 'json:data;title;cover;comment;cat+ent_id;description' ,
41+ 一级 : 'json:data.movies;title;cover;pubdate;id;description' ,
42+ 二级 : async function ( ) {
43+ let { input, fetch_params} = this ;
44+ let html = JSON . parse ( await request ( input , fetch_params ) ) ;
45+ let data = html . data ;
46+ let title = data . title ;
47+ let img = data . cdncover ;
48+ let vod_type = data . moviecategory . join ( "," ) ;
49+ let area = data . area . join ( "," ) ;
50+ let director = data . director . join ( "," ) ;
51+ let actor = data . actor . join ( "," ) ;
52+ let content = data . description ;
53+ let base_vod = {
54+ vod_id : input ,
55+ vod_name : title ,
56+ type_name : vod_type ,
57+ vod_actor : actor ,
58+ vod_director : director ,
59+ vod_content : content ,
60+ vod_remarks : area ,
61+ vod_pic : urljoin ( input , img )
62+ } ;
63+ let delta = 50 ;
64+ let vod_play = { } ;
65+ let sites = data . playlink_sites ;
66+ for ( const site of sites ) {
67+ let playList = "" ;
68+ let vodItems = [ ] ;
69+ // print(data)
70+ if ( data . allupinfo ) {
71+ let total = parseInt ( data . allupinfo [ site ] ) ;
72+ // print(total)
73+ for ( let j = 1 ; j < total ; j += delta ) {
74+ let end = Math . min ( total , j + delta - 1 ) ;
75+ // print(end)
76+ let url2 = buildUrl ( input , { start : j , end : end , site : site } ) ;
77+ let vod_data = JSON . parse ( await request ( url2 ) , fetch_params ) . data ;
78+ if ( vod_data != null ) {
79+ if ( vod_data . allepidetail ) {
80+ vod_data = vod_data . allepidetail [ site ] ;
81+ vod_data . forEach ( function ( item , index ) {
82+ vodItems . push ( ( item . playlink_num || "" ) + "$" + urlDeal ( item . url || "" ) )
83+ } )
84+ } else {
85+ vod_data = vod_data . defaultepisode ;
86+ vod_data . forEach ( function ( item , index ) {
87+ vodItems . push ( ( item . period || "" ) + ( item . name || "" ) + "$" + urlDeal ( item . url ) || "" )
88+ } )
89+ }
90+ }
91+ }
92+ } else {
93+ let item = data . playlinksdetail [ site ] ;
94+ vodItems . push ( ( item . sort || "" ) + "$" + urlDeal ( item . default_url || "" ) )
95+ }
96+ if ( vodItems . length > 0 ) {
97+ playList = vodItems . join ( "#" )
98+ }
99+ if ( playList . length < 1 ) {
100+ continue ;
101+ }
102+ vod_play [ site ] = playList
103+ }
104+ let tabs = Object . keys ( vod_play ) ;
105+ let playUrls = [ ] ;
106+ for ( let id in tabs ) {
107+ // print("id:" + id);
108+ playUrls . push ( vod_play [ tabs [ id ] ] )
109+ }
110+ if ( tabs . length > 0 ) {
111+ let vod_play_from = tabs . join ( "$$$" ) ;
112+ let vod_play_url = playUrls . join ( "$$$" ) ;
113+ base_vod . vod_play_from = vod_play_from ;
114+ base_vod . vod_play_url = vod_play_url
115+ }
116+ return base_vod ;
117+ } ,
118+ 搜索 : 'json:data.longData.rows;titleTxt||titlealias;cover;cat_name;cat_id+en_id;description' ,
119+ }
0 commit comments