MasterPuppeteer

Initial commit.

package tv.puppetmaster.turkey
import org.json.JSONArray
import org.json.JSONObject
import org.jsoup.Jsoup
import tv.puppetmaster.data.BasePuppetIterator
import tv.puppetmaster.data.i.*
import tv.puppetmaster.data.i.Puppet.PuppetIterator
import java.util.regex.Matcher
class TRTTVPuppet implements InstallablePuppet {
static final CHANNELS = [
[
name: "World",
imageUrl: "https://pbs.twimg.com/profile_images/604916087180754945/1aMHMBIj.png",
url: "http://trtcanlitv-lh.akamaihd.net/i/TRTWORLD_1@321783/master.m3u8",
],
[
name: "1",
imageUrl: "https://pbs.twimg.com/profile_images/2237479342/___.jpg",
url: "http://trtcanlitv-lh.akamaihd.net/i/TRT1HD_1@181842/master.m3u8",
],
[
name: "Haber",
imageUrl: "https://pbs.twimg.com/profile_images/924896590569099264/ZE_tVm5k_400x400.jpg",
url: "http://trtcanlitv-lh.akamaihd.net/i/TRTHABERHD_1@181942/master.m3u8",
],
[
name: "Spor",
imageUrl: "https://pbs.twimg.com/profile_images/541877772537188353/Ue3YfaCk_400x400.jpeg",
url: "http://trtcanlitv-lh.akamaihd.net/i/TRTSPOR1_1@182042/master.m3u8",
],
[
name: "Belgesel",
imageUrl: "https://pbs.twimg.com/profile_images/584987956974354432/YRn3krDK_400x400.png",
url: "http://trtcanlitv-lh.akamaihd.net/i/TRTBELGESEL_1@182145/master.m3u8",
],
[
name: "Çocuk",
imageUrl: "https://pbs.twimg.com/profile_images/537907717327704064/Zgqw3MWt_400x400.jpeg",
url: "http://trtcanlitv-lh.akamaihd.net/i/TRTCOCUK_1@181844/master.m3u8",
],
[
name: "Avaz",
imageUrl: "https://pbs.twimg.com/profile_images/547393405450321921/gnrEXfb0_400x400.png",
url: "http://trtcanlitv-lh.akamaihd.net/i/TRTAVAZ_1@182244/master.m3u8",
],
[
name: "Müzik",
imageUrl: "https://pbs.twimg.com/profile_images/923597894078386176/19or-eyM_400x400.jpg",
url: "http://trtcanlitv-lh.akamaihd.net/i/TRTMUZIK_1@181845/master.m3u8",
],
[
name: "Türk",
imageUrl: "https://pbs.twimg.com/profile_images/602771077375234048/3z6En484_400x400.jpg",
url: "http://trtcanlitv-lh.akamaihd.net/i/TRTTURK_1@182144/master.m3u8",
],
[
name: "Diyanet",
imageUrl: "https://pbs.twimg.com/profile_images/484324982118305792/uhfQ0FyU_400x400.jpeg",
url: "http://trtcanlitv-lh.akamaihd.net/i/TRTDIYANET_1@182344/master.m3u8",
],
[
name: "Okul",
imageUrl: "https://pbs.twimg.com/profile_images/561395590047596545/wDuo5ckJ_400x400.jpeg",
url: "http://trtcanlitv-lh.akamaihd.net/i/TRTOKUL_1@182245/master.m3u8",
],
[
name: "Kurdî",
imageUrl: "https://pbs.twimg.com/profile_images/564783264842264577/tGtkQF21_400x400.png",
url: "http://trtcanlitv-lh.akamaihd.net/i/TRT6_1@181944/master.m3u8",
],
[
name: "El Arabia",
imageUrl: "https://pbs.twimg.com/profile_images/887674679078641665/pnUk7pR4_400x400.jpg",
url: "http://trtcanlitv-lh.akamaihd.net/i/TRTARAPCA_1@181945/master.m3u8",
],
[
name: "3 - TBMM TV",
imageUrl: "http://hub.tv-ark.org.uk/images/International/international_images/turkey_images/trt3/trt3_tbmm_240512a.jpg",
url: "http://mecliscanlitv-lh.akamaihd.net/i/MECLISTV_1@127503/master.m3u8",
],
]
static final int VERSION_CODE = 5
static final GENRES = [
[
name: "Diziler",
id: 2,
],
[
name: "Programlar",
id: 20149,
],
[
name: "Belgesel",
id: 20153,
],
[
name: "Çocuk",
id: 20157,
],
[
name: "Engelsiz",
id: 80296,
],
]
ParentPuppet mParent
boolean mIsTopLevel
String mName
String mDescription
String mImageUrl
String mBackgroundImageUrl
TRTTVPuppet() {
this(
null,
true,
"TRT.TV",
"TRT ekranındaki her şey, trt.tv’de Diziler, belgeseller, çizgi filmler, programlar, canlı yayınlar ve daha fazlası HD kalitesinde trt.tv’de.",
"https://pbs.twimg.com/profile_images/834728644887138304/JgUq4IXJ_400x400.jpg",
"https://pbs.twimg.com/profile_banners/804605049859145728/1504776562/1500x500"
)
}
TRTTVPuppet(ParentPuppet parent, boolean isTopLevel, String name, String description, String imageUrl, String backgroundImageUrl) {
mParent = parent
mIsTopLevel = isTopLevel
mName = name
mDescription = description
mImageUrl = imageUrl
mBackgroundImageUrl = backgroundImageUrl
}
static String postToURL(String url, String post) {
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection()
connection.setDoOutput(true)
connection.setRequestProperty('Content-type', 'application/x-www-form-urlencoded')
connection.outputStream.withWriter { writer ->
writer << post
}
String page = null
try {
connection.inputStream.with { reader ->
page = reader.text
}
} catch (ignore) {
connection.errorStream.with { reader ->
println reader.text
}
}
return page
}
@Override
PuppetIterator getChildren() {
PuppetIterator children = new BasePuppetIterator()
CHANNELS.each {
children.add(new TRTTVSourcesPuppet(
this,
it.name,
null,
it.imageUrl,
mBackgroundImageUrl,
-1,
it.url
))
}
GENRES.each {
children.add(new TRTTVCategoriesPuppet(
this,
it.name,
null,
mImageUrl,
mBackgroundImageUrl,
it.id,
0
))
}
return children
}
@Override
boolean isTopLevel() {
return mIsTopLevel
}
@Override
String getName() {
return mName
}
@Override
String getCategory() {
return "Türk"
}
@Override
String getShortDescription() {
return mDescription
}
@Override
String getImageUrl() {
return mImageUrl
}
@Override
String getBackgroundImageUrl() {
return mBackgroundImageUrl
}
@Override
boolean isUnavailableIn(String region) {
return false
}
@Override
String getPreferredRegion() {
return null
}
@Override
int getShieldLevel() {
return 0
}
@Override
ParentPuppet getParent() {
return mParent
}
@Override
PuppetIterator getRelated() {
return null
}
@Override
String toString() {
return mParent == null ? getName() : mParent.toString() + " < " + getName()
}
@Override
int getVersionCode() {
return VERSION_CODE
}
@Override
SearchesPuppet getSearchProvider() {
return null
}
@Override
SettingsPuppet getSettingsProvider() {
return null
}
@Override
int getFastlaneBackgroundColor() {
return 0xFF222222
}
@Override
int getSearchAffordanceBackgroundColor() {
return 0xFF1A82BC
}
@Override
int getSelectedBackgroundColor() {
return 0xFF1A82BC
}
@Override
int getPlayerBackgroundColor() {
return 0xFF222222
}
@Override
List<Map<String, String>> getLiveChannelsMetaData() {
def list = []
CHANNELS.each {
list << [
name : it.name,
genres : "ENTERTAINMENT",
logo : it.imageUrl,
preferredRegion : null,
url : it.url
]
}
return list
}
class TRTTVCategoriesPuppet extends TRTTVPuppet {
static final int MAX_ITEMS = 24
long mId
int mPageNumber
TRTTVCategoriesPuppet(ParentPuppet parent, String name, String description, String imageUrl, String backgroundImageUrl, long id, int pageNumber) {
super(parent, true, name, description, imageUrl, backgroundImageUrl)
mId = id
mPageNumber = pageNumber
}
@Override
PuppetIterator getChildren() {
PuppetIterator children = new BasePuppetIterator()
String page = postToURL(
'http://service.trt.erstream.com/api/GetCategoriesByTag',
"parentId%5B%5D=${mId}&tag=&sortOption=Order&sortDirection=ASC&count=${MAX_ITEMS}&pageIndex=${mPageNumber}&checkActive=true&mustHaveItem=true"
)
JSONArray items = new JSONArray(page)
for (int i = 0; i < items.length(); i++) {
JSONObject it = items.getJSONObject(i)
String description = Jsoup.parse(it.getString('Description')).text()
JSONArray images = it.getJSONArray('ImageList')
children.add(new TRTTVCategoryPuppet(
this,
it.getString('Name'),
description.contains('description_url') ? null : description,
"http://img.trt.tv/${images.getJSONObject(images.length() > 1 ? 1 : 0).getString('ImageUrl')}",
images.length() > 1 ? "http://img.trt.tv/${images.getJSONObject(0).getString('ImageUrl')}" : mBackgroundImageUrl,
it.getLong('Id'),
0
))
}
if (items.length() == MAX_ITEMS) {
children.add(new TRTTVCategoriesPuppet(
this,
'>>',
null,
mImageUrl,
mBackgroundImageUrl,
mId,
mPageNumber + 1
))
}
return children
}
}
class TRTTVCategoryPuppet extends TRTTVPuppet {
static final int MAX_ITEMS = 18
long mId
int mPageNumber
TRTTVCategoryPuppet(ParentPuppet parent, String name, String description, String imageUrl, String backgroundImageUrl, long id, int pageNumber) {
super(parent, false, name, description, imageUrl, backgroundImageUrl)
mId = id
mPageNumber = pageNumber
}
@Override
PuppetIterator getChildren() {
PuppetIterator children = new BasePuppetIterator()
String page = postToURL(
'http://service.trt.erstream.com/api/GetFilteredVideos',
"categories%5B%5D=${mId}&genres%5B%5D=1&direction=DESC&type=Custom&pageIndex=${mPageNumber}&count=${MAX_ITEMS}&customSortField=bolum_sirasi"
)
JSONArray items = new JSONObject(page).getJSONArray('Items')
for (int i = 0; i < items.length(); i++) {
JSONObject it = items.getJSONObject(i)
children.add(new TRTTVSourcesPuppet(
this,
it.getString('Name'),
Jsoup.parse(it.getString('Description')).text(),
it.has('ImageList') ? "http://img.trt.tv/${it.getJSONArray('ImageList').getJSONObject(0).getString('ImageUrl')}" : mImageUrl,
mBackgroundImageUrl,
it.getLong('Duration') * 1000,
"http://www.trt.tv/izle/${it.getLong('Id')}/${it.getString('EncodedURL')}"
))
}
if (items.length() == MAX_ITEMS) {
children.add(new TRTTVCategoryPuppet(
this,
'>>',
null,
mImageUrl,
mBackgroundImageUrl,
mId,
mPageNumber + 1
))
}
return children
}
}
class TRTTVSourcesPuppet implements SourcesPuppet {
ParentPuppet mParent
String mName
String mDescription
String mImageUrl
String mBackgroundImageUrl
long mDuration
String mUrl
TRTTVSourcesPuppet(ParentPuppet parent, String name, String description, String imageUrl, String backgroundImageUrl, long duration, String url) {
mParent = parent
mName = name
mDescription = description
mImageUrl = imageUrl
mBackgroundImageUrl = backgroundImageUrl
mDuration = duration
mUrl = url
}
@Override
String getName() {
return mName
}
@Override
String getCategory() {
return null
}
@Override
String getShortDescription() {
return mDescription
}
@Override
String getImageUrl() {
return mImageUrl
}
@Override
String getBackgroundImageUrl() {
return mBackgroundImageUrl
}
@Override
boolean isUnavailableIn(String region) {
String preferredRegion = getPreferredRegion()
return preferredRegion == null ? false : preferredRegion != region
}
@Override
String getPreferredRegion() {
return mUrl in ['http://trtcanlitv-lh.akamaihd.net/i/TRTBELGESEL_1@182145/master.m3u8'] ? 'tr' : null
}
@Override
int getShieldLevel() {
return 0
}
@Override
ParentPuppet getParent() {
return mParent
}
@Override
PuppetIterator getRelated() {
return null
}
@Override
String toString() {
return mParent == null ? getName() : mParent.toString() + " < " + getName()
}
@Override
String getPublicationDate() {
return null
}
@Override
long getDuration() {
return mDuration
}
@Override
SourcesPuppet.SourceIterator getSources() {
return new TRTTVSourceIterator()
}
@Override
boolean isLive() {
return mDuration < 0
}
@Override
List<SourcesPuppet.SubtitleDescription> getSubtitles() {
return null
}
class TRTTVSourceIterator implements SourcesPuppet.SourceIterator {
ArrayList<SourcesPuppet.SourceDescription> mSources = null
int mCurrentIndex = 0
@Override
boolean hasNext() {
if (mSources == null) {
mSources = new ArrayList<>()
if (mDuration < 0) {
SourcesPuppet.SourceDescription source = new SourcesPuppet.SourceDescription()
source.url = mUrl
mSources.add(source)
} else {
String html = new URL(mUrl).getText(requestProperties: [
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36',
]).replaceAll("\n", "")
Matcher matcher = html =~ /url: "(.+?);/
if (matcher.find()) {
SourcesPuppet.SourceDescription source = new SourcesPuppet.SourceDescription()
source.url = matcher.group(1)
mSources.add(source)
}
}
}
return mCurrentIndex < mSources.size()
}
@Override
SourcesPuppet.SourceDescription next() {
return mSources.get(mCurrentIndex++)
}
@Override
void remove() {
}
}
}
}
\ No newline at end of file