Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@ android/proguard-project.txt
src/gui/qml/deploy.sh
.DS_Store
android/ant.properties
/.project
48 changes: 29 additions & 19 deletions src/gui/qml/HttpREModel/HttpREModel.qml
Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,35 @@ ListModel {
property int status: XmlListModel.Loading

Component.onCompleted: {
var doc = new XMLHttpRequest();
doc.onreadystatechange = function() {
if (doc.readyState == XMLHttpRequest.DONE) {
var re = new RegExp(regExp, "g");
//console.log(doc.responseText);
var l = doc.responseText.match(re);

for (var x=0; x<l.length; x++) {
var listItem = {};
for (var i=0; i<roles.length; i++) {
var subRe = new RegExp(roles[i].regExp);
listItem[roles[i].name] = roles[i].decode(subRe.exec(l[x])[1]);
}
list.append(listItem);
try {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
try {
if (xhr.readyState == XMLHttpRequest.DONE) {
var re = new RegExp(regExp, "g");
//list.append({text:xhr.responseText});
var l = xhr.responseText.match(re);

for (var x=0; x<l.length; x++) {
var listItem = {};
for (var i=0; i<roles.length; i++) {
var subRe = new RegExp(roles[i].regExp);
listItem[roles[i].name] = roles[i].decode(subRe.exec(l[x])[1]);
}
list.append(listItem);
}
list.status = XmlListModel.Ready;
}
} catch(ex) {
list.append({text:ex.toString()});
list.status = XmlListModel.Error;
}
list.status = XmlListModel.Ready;
}
}
doc.open("GET", source);
doc.send();
}
xhr.open("GET", source);
xhr.send();
} catch(ex) {
list.append({text:ex.toString()});
list.status = XmlListModel.Error;
}
}
}
108 changes: 62 additions & 46 deletions src/gui/qml/JSONListModel/JSONListModel.qml
Original file line number Diff line number Diff line change
@@ -1,51 +1,67 @@
/* JSONListModel - a QML ListModel with JSON and JSONPath support
*
* Copyright (c) 2012 Romain Pokrzywka (KDAB) (romain@kdab.com)
* Licensed under the MIT licence (http://opensource.org/licenses/mit-license.php)
*/

import QtQuick 1.1
import "jsonpath.js" as JSONPath

Item {
ListModel {
id: list

property string source: ""
property string json: ""
property string query: ""

property ListModel model : ListModel { id: jsonModel }
property alias count: jsonModel.count

onSourceChanged: {
var xhr = new XMLHttpRequest;
xhr.open("GET", source);
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE)
json = xhr.responseText;
}
xhr.send();
}

onJsonChanged: updateJSONModel()
onQueryChanged: updateJSONModel()

function updateJSONModel() {
jsonModel.clear();

if ( json === "" )
return;

var objectArray = parseJSONString(json, query);
for ( var key in objectArray ) {
var jo = objectArray[key];
jsonModel.append( jo );
}
}

function parseJSONString(jsonString, jsonPathQuery) {
var objectArray = JSON.parse(jsonString);
if ( jsonPathQuery !== "" )
objectArray = JSONPath.jsonPath(objectArray, jsonPathQuery);

return objectArray;
}
property string regExp: ""
property variant query: ""
property int status: XmlListModel.Loading

Component.onCompleted: {
try {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
try {
var json;
if (regExp != "") {
var re = new RegExp(regExp);
var m = xhr.responseText.match(re);
if (m.length == 0)
json = "";
else if (m.length == 1)
json = m[0];
else
json = m[1];
} else {
json = xhr.responseText;
}
if (json !== "") {
var objectArray = JSON.parse(json);
if (query != "") {
var queries;
if (typeof query == "string")
queries = [ query ];
else
queries = query;
for(var i=0; i<queries.length; i++) {
var q = queries[i];
var result = JSONPath.jsonPath(objectArray, q);
for(var key in result) {
var jo = result[key];
list.append(jo);
}
}
} else {
for(var key in objectArray) {
var jo = objectArray[key];
list.append(jo);
}
}
}
list.status = XmlListModel.Ready;
} catch(ex) {
list.append({name: ex.toString()});
list.status = XmlListModel.Error;
}
}
}
xhr.open("GET", source);
xhr.send();
} catch(ex) {
list.status = XmlListModel.Error;
}
}
}
17 changes: 13 additions & 4 deletions src/gui/qml/browser/menu.qml
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,14 @@ BarredListView {

model: ListModel {
ListElement {
title: "SvT-play"
url: "svt/initial.qml"
title: "SVT-play"
url: "svt/alfabetical.qml"
logo: "http://www.svtplay.se/public/2012.54/images/svt-play-2x.png"
}
/*
ListElement {
title: "SVT öppet arkiv"
url: "svt/open_a-z.qml"
logo: "http://www.svtplay.se/public/2012.54/images/svt-play-2x.png"
}
ListElement {
Expand All @@ -16,16 +22,18 @@ BarredListView {
logo: "http://urplay.se/design/ur_play/images/urplay-logo.png"
}
ListElement {
title: "TV3-play"
url: "mtg/a-z.qml"//"imports/Components/AzListView.qml"
title: "TV3/6/8/10-play"
url: "mtg/a-z.qml"
logo: "http://images2.wikia.nocookie.net/__cb20091126144517/logopedia/images/c/c6/TV3_logo_1990.png"
n: 3
}
*/
ListElement {
title: "TV4-play"
url: "tv4/a-z.qml"
logo: "http://images1.wikia.nocookie.net/__cb20100305140436/logopedia/images/3/31/TV4_Play.svg"
}
/*
ListElement {
title: "Kanal 5-play"
url: "kanal5/a-z.qml"
Expand Down Expand Up @@ -60,6 +68,7 @@ BarredListView {
url: "aftonbladet/a-z.qml"
logo: "http://www.tv14.net/wp-content/uploads/2010/10/Aftonbladet.jpg"
}
*/
}

delegate: ListDelegate {
Expand Down
7 changes: 3 additions & 4 deletions src/gui/qml/browser/mtg/a-z.qml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import "../../common.js" as Common

AzListView {
model: XmlListModel {
source: "tidy://www.tv" + /*ViewBrowser.currentView.args.n*/currentArgs.n + "play.se/program"
query: "//a[@class=\"list-item\"]"
source: "tidy://www.viafree.se/program"
query: '//a[@class="thumbnail-format format-title className"]'

XmlRole {
name: "text"
Expand All @@ -22,8 +22,7 @@ AzListView {

onClicked: {
go( Qt.resolvedUrl("program.qml"),
{ url: "tidy://www.tv" + currentArgs.n + "play.se" + model.link,
n: currentArgs.n,
{ url: "http://www.viafree.se" + model.link,
programName: model.text.slim() },
model.index);
}
Expand Down
23 changes: 9 additions & 14 deletions src/gui/qml/browser/mtg/program.qml
Original file line number Diff line number Diff line change
Expand Up @@ -7,37 +7,32 @@ BarredListView {
model: XmlListModel {
id: programModel

Component.onCompleted: source = currentArgs.url
source: currentArgs.url.replace("http://", "tidy://")

query: "//table[@class=\"clearfix clip-list video-tree\"]//tr[descendant::th[a]]"
namespaceDeclarations: "declare default element namespace 'http://www.w3.org/1999/xhtml';"
query: '//a[@class="info-link"]'

XmlRole {
name: "title"
query: "th[@class=\"col1\"]/a/string()"
}
XmlRole {
name: "epNo"
query: "td[@class=\"col2\"]/string()"
query: "div//span[not(*)]/string()"
}
XmlRole {
name: "time"
query: "td[@class=\"col4\"]/string()"
query: "div/div[@class=thumbnail-published-at]/string()"
}
XmlRole {
name: "link"
query: "th[@class=\"col1\"]/a/@href/string()"
query: "@href/string()"
}
}

delegate: ListDelegate {
text: model.title.slim() + " avsnitt <strong>" + model.epNo + "</strong><br/>" + model.time
text: "<strong>" + model.title.slim() + "</strong><br/>" + model.time

onClicked: {
go( Qt.resolvedUrl("../pirateplay.qml"),
{ url: "http://www.tv" + currentArgs.n + "play.se" + model.link,
programTitle: "avsnitt " + model.epNo,
programName: model.title.slim(),
{ url: "http://www.viafree.se" + model.link,
programName: currentArgs.programName,
programTitle: model.title.slim(),
programTime: model.time },
model.index);
}
Expand Down
57 changes: 20 additions & 37 deletions src/gui/qml/browser/pirateplay.qml
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,15 @@ import Components 1.0
Item {
anchors.fill: parent

// quality
/*
XmlListModel {
id: streams
source: ppBase() + "/api/get_streams.xml?url=" + currentArgs.url
query: "/streams/stream"
onStatusChanged: {
if (status === XmlListModel.Ready) {
var reqPlayer = get(0).requiredplayerVersion;
//reqPlayer = "1";
if (reqPlayer != "1")
streamSelect.sourceComponent = streamDialog;
else
streamSelect.sourceComponent = hdsError;
streamSelect.sourceComponent = streamDialog;
}
}

Expand All @@ -43,36 +40,19 @@ Item {
query: "@required-player-version/string()"
}
}

*/
Component {
id: streamDialog
// Window {
// width: 720; height: 480
// visible: true
StreamDialog { /*anchors.verticalCenter: parent.verticalCenter*/
programMetaInfo: { 'title': currentArgs.programTitle ? currentArgs.programTitle : "",
'name': currentArgs.programName ? currentArgs.programName : "",
'season': currentArgs.programSeason ? currentArgs.programSeason : "",
'time': currentArgs.programTime ? currentArgs.programTime : "",
'description': currentArgs.programDescription ? currentArgs.programDescription : "" }
}
//}
}

Component {
id: hdsError

Item {
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
width: childrenRect.width
height: childrenRect.height

Label {
text: "Pirateplayer kan inte ladda ner denna typ av strömmar.<br />En <a href=\"" + ppBase() + "/hds_guide.html\">guide</a> finns på Pirateplay.se till hur man laddar ner HDS-strömmar manuellt."
onLinkActivated: Qt.openUrlExternally(link)
}
}
StreamDialog {
programMetaInfo: {
'title': currentArgs.programTitle ? currentArgs.programTitle : "",
'name': currentArgs.programName ? currentArgs.programName : "",
'season': currentArgs.programSeason ? currentArgs.programSeason : "",
'time': currentArgs.programTime ? currentArgs.programTime : "",
'description': currentArgs.programDescription ? currentArgs.programDescription : ""
}
videoPageUrl: currentArgs.url
}
}

Component.onDestruction: root.focus = true
Expand All @@ -81,10 +61,13 @@ Item {
id: streamSelect

anchors.fill: parent
//focus: true

property variant streamsModel: streams
sourceComponent: streamDialog

// quality
// property variant streamsModel: streams
}

XmlListModelStatusMessage { target: streams }
// quality
// XmlListModelStatusMessage { target: streams }
}
Loading