From 6eeded49d0afd870d8caea050147b86d69465dac Mon Sep 17 00:00:00 2001 From: axfree Date: Mon, 26 Feb 2024 20:31:19 +0900 Subject: [PATCH] =?UTF-8?q?TV:=20MBC,=20SBS,=20KBS,=20EBS,=20=ED=8B=B0?= =?UTF-8?q?=EB=B9=99=20=EB=8B=A4=EC=8B=9C=EB=B3=B4=EA=B8=B0=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EC=82=AC=ED=95=AD=20=EC=A0=81=EC=9A=A9=20TV:=20?= =?UTF-8?q?=EB=B0=A9=EC=86=A1=EC=9D=BC=20=EA=B8=B0=EC=A4=80(YYYY-MM-DD)?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=EB=8F=84=20=EC=97=90=ED=94=BC=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EB=A7=A4=EC=B9=AD=20(=EC=8A=A4=ED=8E=98=EC=85=9C?= =?UTF-8?q?=20=EC=97=90=ED=94=BC=EC=86=8C=EB=93=9C)=20TV:=20=EC=97=90?= =?UTF-8?q?=ED=94=BC=EC=86=8C=EB=93=9C=20=EC=8D=B8=EB=84=A4=EC=9D=BC=20?= =?UTF-8?q?=EA=B0=80=EC=A0=B8=EC=98=A4=EA=B8=B0=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Contents/Code/__init__.py | 599 ++++++++++++++++++++++++------------- Contents/DefaultPrefs.json | 6 + 2 files changed, 401 insertions(+), 204 deletions(-) diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index 1321848..bbb2d29 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- # Daum Movie -import urllib, unicodedata, os, traceback +import urllib, unicodedata, os, time, traceback +from Framework.exceptions import RedirectError DAUM_MOVIE_SRCH = "https://search.daum.net/search?w=tot&q=%s&rtmaxcoll=EM1" # DAUM_MOVIE_SGST = "https://dapi.kakao.com/suggest-hub/v1/search.json?service=movie-v2&cate=movie&multiple=1&q=%s" @@ -76,7 +77,7 @@ def downloadImage(url, fetchContent=True): return result def originalImageUrlFromCdnUrl(url): - if 'daumcdn.net' in url: + if 'daumcdn.net' in url or 'kakaocdn.net' in url: url = urllib.unquote(Regex('fname=(.*)').search(url).group(1)) if url.startswith('//'): @@ -107,7 +108,7 @@ def searchDaumMovie(results, media, lang): Log.Debug("search: %s %s" %(media_name, media.year)) try: # https://search.daum.net/search?w=tot&q=서울의%20봄&rtmaxcoll=EM1 - html = HTML.ElementFromURL(DAUM_MOVIE_SRCH % urllib.quote(media_name.encode('utf8'))) + html = HTML.ElementFromURL(DAUM_MOVIE_SRCH % urllib.quote(media_name.encode('utf8')), sleep=0.5) for em1Coll in html.xpath('//div[@id="em1Coll"]'): ctitle = em1Coll.xpath('.//c-header-content/c-title')[0] try: @@ -255,13 +256,15 @@ def updateDaumMovie(metadata, media): # 장르 metadata.genres.clear() - for genre in card.xpath(u'./c-doc-content//dt[.="장르"]/following-sibling::dd[1]')[0].text.strip().split('/'): # 액션/어드벤처/SF - metadata.genres.add(genre) + for genres in card.xpath(u'./c-doc-content//dt[.="장르"]/following-sibling::dd[1]'): + for genre in genres.text.strip().split('/'): # 액션/어드벤처/SF + metadata.genres.add(genre) # 국가 metadata.countries.clear() - for country in card.xpath(u'./c-doc-content//dt[.="국가"]/following-sibling::dd[1]')[0].text.strip().split(', '): # 미국, 중국 - metadata.countries.add(country) + for countries in card.xpath(u'./c-doc-content//dt[.="국가"]/following-sibling::dd[1]'): + for country in countries.text.strip().split(', '): # 미국, 중국 + metadata.countries.add(country) # 줄거리 metadata.summary = card.xpath('./c-summary')[0].text.strip() @@ -270,7 +273,9 @@ def updateDaumMovie(metadata, media): for poster_url in card.xpath('./c-doc-content/c-thumb/@data-original-src'): poster_url = originalImageUrlFromCdnUrl(poster_url) if poster_url not in metadata.posters: - metadata.posters[poster_url] = Proxy.Preview(HTTP.Request(poster_url, cacheTime=0), sort_order = len(metadata.posters) + 1) + try: + metadata.posters[poster_url] = Proxy.Preview(HTTP.Request(poster_url, cacheTime=0), sort_order=len(metadata.posters) + 1) + except: pass # 개봉, 재개봉: 2016.08.24. for oaa in card.xpath(u'./c-doc-content//dt[.="개봉" or .="재개봉"]/following-sibling::dd[1]/span'): @@ -388,12 +393,15 @@ def updateDaumMovie(metadata, media): for src in card.xpath('.//c-masonry-item/c-thumb/@data-original-src'): art_url = originalImageUrlFromCdnUrl(src) if art_url not in metadata.art: - try: metadata.art[art_url] = Proxy.Preview(HTTP.Request(art_url, cacheTime=0), sort_order = len(metadata.art) + 1) - except Exception as e: Log.Debug(repr(e)) + try: + metadata.art[art_url] = Proxy.Preview(HTTP.Request(art_url, cacheTime=0, sleep=0.5), sort_order=len(metadata.art) + 1) + except: pass Log.Debug('Total %d posters, %d artworks' %(len(metadata.posters), len(metadata.art))) def updateDaumTV(metadata, media): + metadata_for = lambda s, e: metadata.seasons[s].episodes[e] if s in media.seasons and e in media.seasons[s].episodes else None + # (1) from detail page try: html = HTML.ElementFromURL(DAUM_TV_DETAIL % ('tv', urllib.quote(media.title.encode('utf8')), metadata.id)) @@ -421,7 +429,9 @@ def updateDaumTV(metadata, media): # poster_url = urllib.unquote(Regex('fname=(.*)').search(html.xpath('//div[@class="info_cont"]/div[@class="wrap_thumb"]/a/img/@src')[0]).group(1)) poster_url = originalImageUrlFromCdnUrl(html.xpath('//div[@class="info_cont"]/div[@class="wrap_thumb"]/a/img/@src')[0]) if poster_url not in metadata.posters: - metadata.posters[poster_url] = Proxy.Preview(HTTP.Request(poster_url, cacheTime=0), sort_order = len(metadata.posters) + 1) + try: + metadata.posters[poster_url] = Proxy.Preview(HTTP.Request(poster_url, cacheTime=0), sort_order=len(metadata.posters) + 1) + except: pass except Exception as e: Log.Debug(repr(e)) pass @@ -474,43 +484,6 @@ def updateDaumTV(metadata, media): if 'photo' in role: meta_role.photo = role['photo'] - # (4) from episode page - for a in html.xpath('//ul[@id="clipDateList"]/li/a'): - season_num = '1' - episode_num = a.xpath(u'substring-before(./span[@class="txt_episode"],"회")') - try: - episode_date = Datetime.ParseDate(a.xpath('./parent::li/@data-clip')[0], '%Y%m%d').date() - except: continue - if not episode_num: continue # 시청지도서 - date_based_season_num = episode_date.year - date_based_episode_num = episode_date.strftime('%Y-%m-%d') - if ((season_num in media.seasons and episode_num in media.seasons[season_num].episodes) or - (date_based_season_num in media.seasons and date_based_episode_num in media.seasons[date_based_season_num].episodes)): - page = HTML.ElementFromURL('https://search.daum.net/search' + a.get('href')) - episode = metadata.seasons[season_num].episodes[episode_num] - subtitle = page.xpath('//p[@class="episode_desc"]/strong/text()') - episode.summary = '\n'.join(txt.strip() for txt in page.xpath('//p[@class="episode_desc"]/text()')).strip() - episode.originally_available_at = episode_date - episode.title = subtitle[0] if subtitle else date_based_episode_num - episode.rating = None - - if directors: - episode.directors.clear() - for director in directors: - meta_director = episode.directors.new() - if 'name' in director: - meta_director.name = director['name'] - if 'photo' in director: - meta_director.photo = director['photo'] - if writers: - episode.writers.clear() - for writer in writers: - meta_writer = episode.writers.new() - if 'name' in writer: - meta_writer.name = writer['name'] - if 'photo' in writer: - meta_writer.photo = writer['photo'] - # TV검색 > TV정보 > 공식홈 home = html.xpath(u'//a[span[contains(.,"공식홈")]]/@href') if home: @@ -518,11 +491,17 @@ def updateDaumTV(metadata, media): page = HTML.ElementFromURL(home[0]) for prv in page.xpath('//div[@class="roll-ban-event"]/ul/li/img/@src'): if prv not in metadata.art: - try: metadata.art[prv] = Proxy.Preview(HTTP.Request(prv, cacheTime=0), sort_order = len(metadata.art) + 1) - except Exception as e: Log.Debug(repr(e)) + try: + metadata.art[prv] = Proxy.Preview(HTTP.Request(prv, cacheTime=0), sort_order=len(metadata.art) + 1) + except: pass + + # for s in media.seasons: + # Log('media S%s: %s' % ( s, ' '.join('E' + e for e in media.seasons[s].episodes ))) + # for s in metadata.seasons: + # Log('metadata S%s: %s' % ( s, ' '.join('E' + e for e in metadata.seasons[s].episodes ))) # TV검색 > TV정보 > 다시보기 - vod = html.xpath(u'//a[span[contains(.,"다시보기")]]/@href') + vod = html.xpath(u'//div[@class="wrap_btn"]/a[span[contains(.,"다시보기") or contains(.,"무료보기")]]/@href') if vod: replay_url = vod[0] else: @@ -535,94 +514,171 @@ def updateDaumTV(metadata, media): Log.Debug('No replay URL for [%s] %s' % (metadata.studio, metadata.title)) if replay_url: - if 'www.imbc.com' in replay_url: + # Log('%s: %s %s' % (metadata.studio, media.title, replay_url)) + if 'imbc.com' in replay_url: try: - prog_codes = [] - # http://www.imbc.com/broad/tv/ent/challenge/vod/index.html - page = HTML.ElementFromURL(replay_url) - prog_codes.append(Regex('var progCode = "(.*?)";').search(page.xpath('//script[contains(.,"var progCode = ")]/text()')[0]).group(1)) - # for season_vod in page.xpath('//map[@name="vod"]/area/@href'): - # # http://www.imbc.com/broad/tv/ent/challenge/vod1/ - # # http://www.imbc.com/broad/tv/ent/challenge/vod2/ - # page = HTML.ElementFromURL(season_vod) - # prog_codes.append(Regex('var progCode = "(.*?)";').search(page.xpath('//script[contains(.,"var progCode = ")]/text()')[0]).group(1)) - for prog_code in prog_codes: - page = HTTP.Request('http://vodmall.imbc.com/util/wwwUtil_sbox.aspx?kind=image&progCode=%s' % prog_code).content - years = Regex("