1
0
mirror of https://github.com/RSS-Bridge/rss-bridge.git synced 2025-08-17 22:02:09 +02:00

Compare commits

...

1352 Commits
v0.1 ... v0.2

Author SHA1 Message Date
LogMANOriginal
71fc854663 Update README.md 2016-11-06 14:03:28 +01:00
logmanoriginal
120612424c [CHANGELOG] Update changelog 2016-11-06 14:00:10 +01:00
LogMANOriginal
33ecaa0b7b Merge pull request #425 from mro/readme
PHP settings
2016-11-06 13:12:44 +01:00
Marcus Rohrmoser
7ce57aefbe PHP settings 2016-11-05 21:33:31 +01:00
logmanoriginal
72981032e4 [Arte7] Fix broken feed 2016-11-05 18:24:04 +01:00
logmanoriginal
d06006d681 Merge branch 'VersionChecks' of https://github.com/logmanoriginal/rss-bridge 2016-11-05 13:11:31 +01:00
logmanoriginal
d39c1ed63a [index] Add check for 'allow_url_fopen' 2016-11-05 13:09:20 +01:00
logmanoriginal
04a195361a [index] Add check for 'libxml' extension 2016-11-05 13:05:28 +01:00
logmanoriginal
3bcd98404b [index] Add check for correct PHP version 2016-11-05 13:02:48 +01:00
logmanoriginal
8924722b93 [Arte7] Fix content parsing
Elements are now put into separate JSON containers. As such
assignment changed from : to = and as only one container
is present in each element, the final , is omitted.
JSON data is html encoded and requires decoding before decoding
via json_decode.
2016-11-05 12:48:58 +01:00
logmanoriginal
5790ebc6ba [index] Initialize variable before using it 2016-10-20 22:12:54 +02:00
LogMANOriginal
38f197fb60 Update README.md 2016-10-20 22:11:04 +02:00
LogMANOriginal
6a6ccee3cd Merge pull request #422 from JeremyRand/duckduckgo-not-by-date
[DuckDuckGoBridge] Add ability to sort by relevance instead of date.
2016-10-20 22:09:30 +02:00
logmanoriginal
85149add61 [index] Fixes a bug where requests could result in same cache file names
Previously the cache file name was only build upon bridge
parameters. If two bridges don't make use of any parameter
this would result into equal file names.
2016-10-20 22:03:23 +02:00
JeremyRand
5258551a98 [DuckDuckGoBridge] Add ability to sort by relevance instead of date. 2016-10-18 22:40:34 +00:00
logmanoriginal
6c4d28c849 Merge branch 'FeedExpander' of https://github.com/logmanoriginal/rss-bridge 2016-10-16 13:09:32 +02:00
logmanoriginal
49281a2ed3 [FeedExpander] Remove orphan getDescription function 2016-10-16 12:47:37 +02:00
logmanoriginal
ffb584f7de Merge branch 'ImproveCaching' of https://github.com/logmanoriginal/rss-bridge 2016-10-16 11:17:12 +02:00
logmanoriginal
82ed2c5ffb [FileCache] Change output format to JSON
JSON format does not serialize object instances, which we don't
want anyways, and improves readability. The hashing algorithm
changed to md5 to prevent collisions with existing cache files
2016-10-16 11:15:11 +02:00
logmanoriginal
46ce0f85d7 Merge branch 'ImproveCaching' of https://github.com/logmanoriginal/rss-bridge 2016-10-08 16:36:19 +02:00
logmanoriginal
b6feda2377 [contents] Use FileCache for getSimpleHTMLDOMCached 2016-10-08 16:30:01 +02:00
logmanoriginal
8fb4db8914 [index] Introduce CACHE_DIR 2016-10-08 16:21:00 +02:00
logmanoriginal
5c309e93dc [cache] Specify cache duration for 'purgeCache' 2016-10-08 16:18:10 +02:00
logmanoriginal
2d56b717cf [FileCache] Add property to define cache folder 2016-10-08 16:03:08 +02:00
logmanoriginal
5639b158e7 [FileCache] Change parameters to lower-case
This prevents creating multiple cache files for the same request.
2016-10-08 15:34:19 +02:00
logmanoriginal
5de4a59d41 [index] Initialize cache before loading to bridge
Previously BridgeAbstract needed to know which exact implementation
of CacheInterface was used (since we only got one right now its
not a problem). Initializing the cache in index.php instead allows
to change cache types more easily.
2016-10-08 15:29:21 +02:00
logmanoriginal
d941fa41f6 [FileCache] Remove 'isPrepareCache'
There is no need to check the absense of the parameters in
all functions. Instead 'getCacheName' is the only function
actually using the parameters and thus should check the
availability.
2016-10-08 15:21:10 +02:00
logmanoriginal
ac0a9a90ad [FileCache] Build file name solely on given parameters
Previously the cache file name was build on the original request URI
which also included the parameters. This could result in different
file name for the same request (different format). Removing the format
from the request is already done in index.php and could lead to issues
in the future (if new parameters are introduced).
2016-10-08 15:17:08 +02:00
logmanoriginal
5ccde61a19 [FileCache] Rename 'prepare' to 'setParameters'
This is a cosmetic change to use the same naming convention for
all methods.
2016-10-08 15:04:14 +02:00
logmanoriginal
0998cbde9d [cache] Directly implement CacheInterface in FileCache
The function 'prepare' previously implemented in CacheAbstract
is specifically required for FileCache and thus belongs to FileCache.
Since this change removes all code from CacheAbstract, it can be
removed completely.
2016-10-08 14:52:03 +02:00
logmanoriginal
5f1c4e1c55 [FileCache] Implement recursive directory creation 2016-10-07 23:20:32 +02:00
logmanoriginal
ad825aa88a [FileCache] Assign same permission to group as others
It makes no sense for the group to get less access rights
than anyone else
2016-10-07 23:16:33 +02:00
logmanoriginal
45890d5969 [FileCache] Don't store folder creation status
The results of the function is_dir are already cached.
See http://php.net/manual/en/function.is-dir.php
2016-10-07 22:56:10 +02:00
logmanoriginal
5fdb3b2fd9 [FileCache] Build path using function instead of constant 2016-10-07 22:36:36 +02:00
logmanoriginal
9ac678aac5 [Cache] Move 'purge' function to implementations
The purge function is cache specific and thus belongs
to the specific implementation.
2016-10-07 22:33:45 +02:00
logmanoriginal
51ff8de346 [Cache] Remove orphan function utf8_encode_deep 2016-10-07 22:06:58 +02:00
logmanoriginal
0e9fb31986 Merge branch 'WebfailBridge' of https://github.com/logmanoriginal/rss-bridge 2016-10-06 22:45:28 +02:00
LogMANOriginal
3e82a82499 Update README.md 2016-10-06 22:43:17 +02:00
LogMANOriginal
381a452047 Merge pull request #420 from niawag/patch-2
Create ReadComicsBridge.php
2016-10-06 22:09:11 +02:00
logmanoriginal
aa2442602a [Webfail] Fix titles with single quotes 2016-10-06 22:04:38 +02:00
niawag
f8dafe6b10 Update ReadComicsBridge.php 2016-10-06 16:39:18 +02:00
niawag
952bde0425 Update ReadComicsBridge.php 2016-10-06 16:22:39 +02:00
niawag
41e85bd4a6 Create ReadComicsBridge.php
Hi, I created a Bridge for ReadComics.tv website, I put myself as "maintainer" but I'm not sure if this is the way you're doing it!
If there is a need to improve/change things, please tell me!
2016-10-06 15:43:04 +02:00
logmanoriginal
5662dff5cb [Webfail] Fix titles with umlauts 2016-10-05 18:56:54 +02:00
logmanoriginal
9e209608c8 [TheOatMeal] Remove bridge
RSS feeds are provided on the main page at http://theoatmeal.com/
2016-10-03 19:35:54 +02:00
logmanoriginal
c0df82c303 [TwitchApi] Remove bridge
Since August 6th, 2016 Twitch requires a client ID
(oauth token) to do API requests, which makes this
bridge useless for most people.

See also: https://blog.twitch.tv/client-id-required-for-kraken-api-calls-afbb8e95f843#.xrc1h2apk
2016-10-03 19:29:39 +02:00
logmanoriginal
95bd44e3fb Merge branch 'WebfailBridge' of https://github.com/logmanoriginal/rss-bridge 2016-10-03 11:49:35 +02:00
logmanoriginal
885198d8d2 [Webfail] Add new bridge 2016-10-03 11:47:27 +02:00
logmanoriginal
8b6ee19aba Merge branch 'VisualizeDebugMode' of https://github.com/logmanoriginal/rss-bridge 2016-10-02 18:45:45 +02:00
logmanoriginal
b61ea84950 [index] Show debug status on main page 2016-10-02 18:43:20 +02:00
logmanoriginal
ee7ddcf992 [FeedExpander] Fix SimplXMLElement serialization error
Previously FeedExpander stored SimpleXMLElement objects into
the items array. These objects cannot be serialized using the
serialize function.
2016-10-02 18:07:56 +02:00
logmanoriginal
f0f0ffb96a Merge branch 'DebugDisableCaching' of https://github.com/logmanoriginal/rss-bridge 2016-10-02 17:21:16 +02:00
logmanoriginal
b32cfd5dc3 [index] Explicitly define DEBUG with Boolean value 2016-10-02 17:16:21 +02:00
logmanoriginal
b0784e5a42 [BridgeAbstract] Don't load cache file in DEBUG mode 2016-10-02 17:00:53 +02:00
logmanoriginal
978e5cdbf5 [index] Define cache even in DEBUG mode 2016-10-02 16:43:08 +02:00
logmanoriginal
4b171f8f46 Merge branch 'fixIndividualBridges' of https://framagit.org/peetah/rss-bridge 2016-10-02 16:13:57 +02:00
logmanoriginal
970e216c1f Merge branch 'methods2functions' of https://framagit.org/peetah/rss-bridge 2016-10-02 16:05:58 +02:00
logmanoriginal
9020b09fc2 Merge branch 'sysadminstory-patch-AllocineFRBridge' of https://github.com/sysadminstory/rss-bridge 2016-10-02 15:57:24 +02:00
Mitsu
7bb464350c Merge pull request #413 from niawag/patch-1
Add category and uploader feed
2016-10-02 15:47:12 +02:00
logmanoriginal
177d3d1c5f Merge branch 'cacheConstant' of https://framagit.org/peetah/rss-bridge 2016-10-02 15:41:54 +02:00
niawag
a4db8dc495 Add user feed, category feed and search in category feed
I tested it and everything is working, I incorporated the changes suggested by mitsukarenai, thank a lot!
2016-10-02 15:09:51 +02:00
niawag
b50652e6ac Add category and uploader feed
I made some changes to returne category and uploader feed. I also changed the URI to the magnet link to be able to use the feed in a torrent client. As discussed here (https://github.com/RSS-Bridge/rss-bridge/issues/412), I'd rather use the <torrent:magnetURI> item but it's not possible with RSS-Bridge ATM.

If I find time to work on it I'll try to add combination possibilities: search term in a certain category or for a specific uploader

Hope my changes will be appreciated!
2016-09-30 11:07:43 +02:00
Pierre Mazière
3dcdaa1595 [CourrierInternationalBridge] fix content parsing
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-26 00:50:26 +02:00
Pierre Mazière
a1ef589ffe [core] extract BridgeAbstract methods to make them functions
Method validateData is now afunction in lib/validation.php
validateTextValue, validateNumberValue, validateCheckboxValue
and validateListValue are now anonymous functions
defined in validateData

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-26 00:09:29 +02:00
Pierre Mazière
747be13849 [core] extract HTMLUtils methods to make them functions
Methods displayBridgeCard, sanitize, defaultImageSrcTo are now
functions in lib/html.php
getHelperButtinsFormat and getFormHeader are now anonymous functions
defined in displayBridgeCard

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-25 23:58:52 +02:00
Pierre Mazière
f1fb95b257 [core] extract BridgeAbstract methods to make them functions
- returnError, returnServerError, returnClientError ,debugMessage are
  moved to lib/error.php

- getContents, getSimpleHTMLDOM, getSimpleHTMLDOMCached are moved to
  lib/contents.php

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-25 23:22:33 +02:00
Pierre Mazière
235c985901 [BridgeAbstract] replace getCacheDuration method by CACHE_TIMEOUT class constant
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-25 17:04:28 +02:00
sysadminstory
41540e24ef Update AllocineFRBridge.php 2016-09-25 12:31:58 +02:00
sysadminstory
69d30ad125 Fix URL & Change to the lastest Season
The leading slash was missing for the Bridge URL (URL where therefore malformed)
Changed the URL to get the lastest for 'Faux Raccord' and 'Top 5'
2016-09-25 12:28:01 +02:00
sysadminstory
c5831e384f Merge pull request #2 from RSS-Bridge/master
Update from base
2016-09-25 12:21:27 +02:00
LogMANOriginal
ad534444fa Merge pull request #407 from sysadminstory/leboncoin-toute-la-france
Allow "Toute la France" as a "Région"
2016-09-24 19:24:16 +02:00
logmanoriginal
43aeb61a7b Merge branch 'fixIndividualBridges' of https://framagit.org/peetah/rss-bridge 2016-09-23 19:44:06 +02:00
sysadminstory
47200752fb Merge pull request #1 from sysadminstory/leboncoin-toute-la-france
Allow "Toute la France" as a "Région"
2016-09-23 19:39:58 +02:00
sysadminstory
5547de1785 Allow "Toute la France" as a "Région"
The way Leboncoin.fr handles "Toute la France" is weird, but the value is "ile_de_france/occasions"
2016-09-23 19:38:36 +02:00
Pierre Mazière
b3a36a2697 [GithubIssueBridge] add issue events to the feed
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-23 14:15:07 +02:00
Pierre Mazière
957ae5d379 [GithubIssueBridge] fix comments page cache duration
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-21 18:17:58 +02:00
Pierre Mazière
0eeb511676 add LegifranceJOBridge
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-20 18:11:09 +02:00
Pierre Mazière
691d4ad0ee [SexActuBridge] remove useless code
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-20 18:00:00 +02:00
Pierre Mazière
120247256d [GithubIssueBridge] fix entities in titles
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-20 00:21:42 +02:00
Pierre Mazière
19a4880c86 [GithubIssueBridge] return comments for all issues
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-19 23:52:44 +02:00
logmanoriginal
ec3824e284 [bridges] Remove compatible WordPress bridges
The WordPressBridge should be used for all those sites
2016-09-17 20:57:33 +02:00
logmanoriginal
351eb00400 [FeedExpander] Align logical operators in next line
This is a cosmetic change to apply the same standard as
in HTMLUtils
2016-09-17 20:44:31 +02:00
logmanoriginal
2331c4fbab Merge branch 'bridges2feeds' of https://framagit.org/peetah/rss-bridge 2016-09-17 20:34:12 +02:00
logmanoriginal
ac3a2b8e6e [BridgeAbstract] Fix typos 2016-09-17 20:24:59 +02:00
logmanoriginal
3438b96197 [index] Fix another github URL 2016-09-17 20:21:48 +02:00
logmanoriginal
ce92edb0ba Merge branch 'core' of https://framagit.org/peetah/rss-bridge 2016-09-17 20:20:05 +02:00
logmanoriginal
c5e7a18c5e Merge branch 'fixIndividualBridges' of https://framagit.org/peetah/rss-bridge 2016-09-17 20:17:58 +02:00
logmanoriginal
e0407326c3 Merge branch 'FixPinterestBridge' of https://github.com/logmanoriginal/rss-bridge 2016-09-17 20:13:31 +02:00
logmanoriginal
c3a1cbe98a [Pinterest] Add implementation for user/board
The data is no longer provided in HTML upon request,
but rather encoded as JSON in a SCRIPT section and
decoded via Javascript on the client side. The bridge
now decodes the data and returns valid feeds again.
2016-09-17 20:10:00 +02:00
Pierre Mazière
7ae64fcd05 [ZoneTelechargementBridge] fix feed url
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-17 19:37:42 +02:00
Pierre Mazière
294d89bd36 [SexactuBridge] add Bridge suffix to class name
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-17 19:37:42 +02:00
Pierre Mazière
3fa965cf3c [FierPandaBridge] fix title extraction
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-17 19:37:42 +02:00
Pierre Mazière
70c490d6ef [BridgeAbstract] handle compressed data
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-17 19:37:41 +02:00
Pierre Mazière
2ca7129e22 [core] fix user agent url to rss-bridge github project
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-17 19:37:41 +02:00
Pierre Mazière
10ac808580 [WordPressBridge] remove useless code and fix description
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-17 19:37:39 +02:00
Pierre Mazière
3f64d2d65a [bridges] make them WordPressBridge derivatives
The specific content filtering used in these bridges will need to
be reintegrated later as part of the bridge or as part of the
WordPressBridge if they are considered generic enough filters,
such as the already existing WordPressBridge <script> removal filter.

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-17 19:37:39 +02:00
Pierre Mazière
43ac961284 [WordPressBridge] add another case of content extraction
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-17 19:37:39 +02:00
Pierre Mazière
b6245a90c8 [WordPressBridge] allow other bridges to use it as a parent class
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-17 19:37:39 +02:00
Pierre Mazière
ca0842ccf8 [FeedExpander] widen guid use as uri provider
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-17 19:37:39 +02:00
Pierre Mazière
4c3b80fca9 [WordPressBridge] fix fatal errors
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-17 19:37:39 +02:00
Pierre Mazière
b5358d6cea [WordPressBridge] make it FeedExpander
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-17 19:37:39 +02:00
Pierre Mazière
2744c13735 [FeedExpander] fix feeds using guid tag as item uri provider
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-17 19:37:39 +02:00
Pierre Mazière
8f58c9f86b [bridges] make them FeedExpander
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-17 19:37:39 +02:00
Pierre Mazière
244516f0a2 [GizmodoFRBridge => GizmodoBridge] rename and make it a FeedExpander
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-17 19:37:39 +02:00
Pierre Mazière
6f8b93fb46 [bridges] removed since they just parse the site feed
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-17 19:37:39 +02:00
logmanoriginal
f8e0a4afbc [Pinterest] Move all existing code into 'From search' section
'By username and board' requires a different search algorithm
2016-09-17 19:14:05 +02:00
logmanoriginal
c1cc4da8ef [Pinterest] Cleanup code 2016-09-17 19:09:33 +02:00
logmanoriginal
1819943451 [FeedExpander] Write debug message for custom build function 2016-09-17 18:19:26 +02:00
logmanoriginal
ffc9418620 [FeedExpander] Fix typos 2016-09-17 18:16:25 +02:00
logmanoriginal
a333226733 Merge branch 'autodetectFeedExpander' of https://framagit.org/peetah/rss-bridge 2016-09-17 18:09:05 +02:00
Mitsukarenai
ed423969ac [400Culs] Bridge dropped: no more necessary 2016-09-17 17:32:04 +02:00
Mitsukarenai
8ae9275ffd [ProjectMGameBridge] website closed (issue #397) 2016-09-13 23:05:51 +02:00
Pierre Mazière
3bacb407fe [bridges] use parent::parseItems() instead of feed type specific method
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-12 10:42:27 +02:00
Pierre Mazière
15c422c648 [FeedExpander] implement default parseItem() method
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-12 10:39:34 +02:00
Pierre Mazière
655b3d578d [FeedExpander] simplify feed type detection and store it
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-12 10:38:50 +02:00
logmanoriginal
6943abd9c2 [Bridge] Fix whitelist check 2016-09-11 14:02:02 +02:00
logmanoriginal
88919a43fd Merge branch 'ContinuousIntegration' of https://github.com/logmanoriginal/rss-bridge 2016-09-10 21:07:13 +02:00
logmanoriginal
e3392a738b [phpcs] Remove check for Zend OperatorSpacing
This check is not helping as code is quite readable
2016-09-10 21:05:29 +02:00
logmanoriginal
ab16af631e [core] Apply some fixes 2016-09-10 21:01:02 +02:00
logmanoriginal
62eec43980 [core] Apply common indentation
All files are now using tabs for indentation
2016-09-10 20:41:11 +02:00
logmanoriginal
32ce2b6541 [phpcs] Update checks
- Use tabs for indentation
2016-09-10 19:55:49 +02:00
logmanoriginal
d17998224e Merge branch 'ContinuousIntegration' of https://github.com/logmanoriginal/rss-bridge 2016-09-10 19:30:46 +02:00
logmanoriginal
3942b6b86f Merge branch 'ContinuousIntegration' of https://github.com/logmanoriginal/rss-bridge 2016-09-10 19:51:27 +02:00
logmanoriginal
ccc816eae8 [travis] Remove PHP 5.4 and 5.5
RSS-Bridge requires at least PHP 5.6
2016-09-10 19:50:41 +02:00
logmanoriginal
5ad2e38927 Merge branch 'HttpCachingBridgeAbstract' of https://github.com/logmanoriginal/rss-bridge 2016-09-10 19:16:04 +02:00
logmanoriginal
9be03f199b [core] Remove HttpCachingBridgeAbstract
BridgeAbstract implements all functions to cover the implementation
2016-09-10 19:13:01 +02:00
logmanoriginal
22cf562659 [travis] Allow build to finish as soon as possible
This will allow the entire build to fail if one case failed
without waiting for the remaining cases to finish their tests
2016-09-10 19:12:55 +02:00
logmanoriginal
2eec89ab27 [bridges] Change all bridges to use BridgeAbstract with getSimpleHTMLDOMCached 2016-09-10 19:11:09 +02:00
logmanoriginal
7b5e367678 [travis] Allow hhvm and nightly to fail 2016-09-10 19:10:42 +02:00
logmanoriginal
9f2dd48684 [BridgeAbstract] Add getSimpleHTMLDOMCached
This function is a copy of the get_cached function from
HttpCachingBridgeAbstract, adding all parameters of
getSimpleHTMLDOM in order to replace the need of
HttpCachingBridgeAbstract entirely
2016-09-10 19:04:01 +02:00
logmanoriginal
a726f73afe Merge branch 'fixIndividualBridges' of https://framagit.org/peetah/rss-bridge 2016-09-10 18:53:19 +02:00
Pierre Mazière
bf8214e3dd [GithubIssueBridge] add getURI() and getName()
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-10 11:44:55 +02:00
Pierre Mazière
73b4aea084 [GithubIssueBridge]: fix collecting issue comments
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-10 11:44:18 +02:00
logmanoriginal
33584b8423 [HttpCachingBridgeAbstract] General cleanup
- Remove buildCacheFilePath -> Single use, so no real purpose
- Simplify debug messages
- Cleanup documentation
2016-09-10 00:34:25 +02:00
logmanoriginal
3a94956915 [bridges] Remove calls to get_cached and remove_from_cache 2016-09-10 00:19:24 +02:00
logmanoriginal
3a92a1e04b [HttpCachingBridgeAbstract] Remove get_cached_time and remove_from_cache
Bridges no longer require to check cache file durations
manually as get_cached now supports the duration parameter
2016-09-10 00:09:10 +02:00
logmanoriginal
1a2a48e129 [HttpCachingBridgeAbstract] Use sha1 cache file names
Previously folder hierarchies were created based on the input URL
which could result in very deep folder structures. Using SHA1 file
names also allows to check for old files more effectively (via
fileatime)
2016-09-10 00:00:10 +02:00
logmanoriginal
ce00c6f869 [HttpCachingBridgeAbstract] Don't pass cache directory as parameter 2016-09-09 22:23:40 +02:00
logmanoriginal
84956c4daf [HttpCachingBridgeAbstract] Add duration parameter to 'get_cached'
This allows to specify the cache duration for a specific
url without the need to delete the cache file first.
Instead the cache file is automatically deleted if the
duration elapsed.
2016-09-09 22:23:15 +02:00
logmanoriginal
9711e87fc9 Merge branch 'fixIndividualBridges' of https://framagit.org/peetah/rss-bridge 2016-09-09 21:03:42 +02:00
Mitsu
8c71a35771 [README] fix the required PHP version
Code requirements have changed, see issue #390
2016-09-09 18:03:36 +02:00
Pierre Mazière
c383f8697a [InstagramBridge] fix item url
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-06 08:41:43 +02:00
logmanoriginal
579d13462f Merge branch 'FeedExpander' of https://github.com/logmanoriginal/rss-bridge 2016-09-05 20:27:45 +02:00
logmanoriginal
2861a855e4 [bridges] Define max items and clear caches 2016-09-05 20:26:45 +02:00
logmanoriginal
f1fb527607 [FeedExpander] Add optional parameter to specify max items
Allows caller of collectExpandableDatas to request a limited
amount of items
2016-09-05 20:17:00 +02:00
logmanoriginal
179e73fb80 [bridges] Change to extend from FeedExpander 2016-09-05 20:10:19 +02:00
logmanoriginal
11be7ccb60 Merge branch 'FileSplitting' of https://github.com/logmanoriginal/rss-bridge 2016-09-05 18:06:20 +02:00
logmanoriginal
298dc49c67 [lib] Split Bridge/Cache/Format into one file per class
The files have grown to a size where it is necessary to search
for a class in a file. This commit splits the content into one
file per class. RSS-Bridge will require implementations and
the implementations will require (once) the interfaces.
2016-09-05 18:05:19 +02:00
logmanoriginal
d98bb25de6 Merge branch 'fixIndividualBridges' of https://framagit.org/peetah/rss-bridge 2016-09-05 17:31:26 +02:00
Pierre Mazière
a0dfbe6efd [AcrimedBridge] reapply code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-04 14:58:25 +02:00
Pierre Mazière
3daeacc208 [VkBridge] use 'Group or user name' parameter instead of full URI
This breaks compatibility with previous versions of VkBridge (which
seems broken anyway).
Bridges should never use full URIs as inputs since their validation will
always be more complicated, hence prone to security issues,
than rebuilding a clean URI from simple validated inputs.
2016-09-04 14:43:10 +02:00
Pierre Mazière
0c139941d9 [NovelUpdatesBridge] use 'name' parameter instead of full URI
This breaks compatibility with previous versions of NoveUpdatesBridge.
Bridges should never use full URIs as inputs since their validation will
always be more complicated, hence prone to security issues,
than rebuilding a clean URI from simple validated inputs.

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-04 14:43:10 +02:00
Pierre Mazière
d60220769e [FourChanBridge] fix relative links
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-04 14:43:10 +02:00
Pierre Mazière
fec864e010 [FourchanBridge] use 'category' and 'thread' parameters instead of full URI
This breaks compatibility with previous versions of FourChanBridge.
Bridges should never use full URIs as inputs as their validation will
always be more complicated, hence prone to security issues,
than rebuilding a clean URI from simple validated inputs.

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-04 14:43:10 +02:00
logmanoriginal
671703cd37 Merge branch 'FeedExpander' of https://github.com/logmanoriginal/rss-bridge 2016-09-04 13:51:19 +02:00
logmanoriginal
15f24b3cf4 [Acrimed] Use internal RSS 2.0 parser 2016-09-04 13:47:13 +02:00
logmanoriginal
acde8a2cea [Bridge] Support 'dc:date' for RSS 2.0 parser 2016-09-04 13:46:57 +02:00
logmanoriginal
778bbd8d85 [Freenews] Use internal RSS 2.0 parser 2016-09-04 13:38:21 +02:00
logmanoriginal
78050972f4 [Les400Culs] Use internal RSS 2.0 parser 2016-09-04 13:32:58 +02:00
logmanoriginal
88f52196b8 [bridges] Fix bridges extending RssExpander to FeedExpander 2016-09-04 13:28:55 +02:00
logmanoriginal
546c0036df [Bridge] Rename class RssExpander to FeedExpander
This class no is not RSS only anymore
2016-09-04 13:28:12 +02:00
logmanoriginal
878db6f96e [bridges] Rename 'parseRSSItem' to 'parseItem' 2016-09-04 13:26:40 +02:00
logmanoriginal
39788485ea [Bridge] Rename 'parseRSSItem' to 'parseItem' 2016-09-04 13:26:17 +02:00
logmanoriginal
e30ce8aea0 Merge branch 'fixIndividualBridges' of https://framagit.org/peetah/rss-bridge 2016-09-04 13:22:35 +02:00
logmanoriginal
cd361f8fc0 Merge branch 'ooruFusion' of https://framagit.org/peetah/rss-bridge 2016-09-04 13:17:48 +02:00
logmanoriginal
1de148bf5d [TheOatMeal] Use core parser functions 2016-09-04 13:17:28 +02:00
logmanoriginal
0770ca1ad1 [FeedExpanderExample] Add bridge to test behavior 2016-09-04 13:16:34 +02:00
logmanoriginal
149b64879e [Bridge] Support 'dc' namespace for RSS 1.0 2016-09-04 13:05:17 +02:00
logmanoriginal
8fa0b9660f [Bridge] Fix ATOM feed uri detection 2016-09-04 12:40:42 +02:00
logmanoriginal
bf20a2f687 [Bridge] Remove uneccesary debug message 2016-09-04 12:34:56 +02:00
logmanoriginal
51a3a75aac [Bridge] Add RSS 1.0 and 2.0 parser 2016-09-04 12:32:56 +02:00
logmanoriginal
f781965825 [Bridge] Add RSS 0.91 parser 2016-09-04 11:45:14 +02:00
logmanoriginal
0e5775012f [Bridge] Rename parameter 'name' to 'url' 2016-09-04 11:01:13 +02:00
Pierre Mazière
e7f2bf19f3 [bridges] Shimmie v2 based imageboards derive from DanbooruBridge
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-04 01:27:58 +02:00
Pierre Mazière
fd6bcbbafe [Bridges] Moebooru and MyImouto based imageboards derive from MoebooruBridge
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-04 01:27:58 +02:00
Pierre Mazière
8ae05a0241 [bridges] Gelbooru based imageboards derive form DanbooruBridge
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-04 01:27:58 +02:00
Pierre Mazière
97926b839e [bridges] one bridge for technically different imageboard solutions
Danbooru serves HTML content while Moebooru send content in JSON format

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-04 01:27:58 +02:00
Pierre Mazière
147154f44c [AllocineFRBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-04 01:27:51 +02:00
Pierre Mazière
d8ebcc9376 [AcrimedBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-04 01:27:51 +02:00
Pierre Mazière
e5a375ab48 [ABCTabsBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-04 01:27:51 +02:00
logmanoriginal
2aa9b8f026 [Bridge] Extend RssExpander to load ATOM formats 2016-09-03 22:17:36 +02:00
logmanoriginal
c365f35e47 Merge branch 'MangareaderBridge' of https://github.com/logmanoriginal/rss-bridge 2016-09-03 20:39:40 +02:00
logmanoriginal
99f00e57b5 [Mangareader] Add functions to collect data 2016-09-03 20:35:49 +02:00
logmanoriginal
f9a8f16685 [Mangareader] Reduce line lengths 2016-09-03 20:23:18 +02:00
logmanoriginal
6c51eaa4d7 [Mangareader] Fix coding styles 2016-09-03 20:10:36 +02:00
logmanoriginal
4c96aab832 [Mangareader] Replace global constant with 'defaultValue' 2016-09-03 20:03:06 +02:00
logmanoriginal
013a4c0428 Merge branch 'CleanupBridgeCode' of https://github.com/logmanoriginal/rss-bridge 2016-09-02 20:10:09 +02:00
logmanoriginal
a8883523f4 [Bridge] Pass 'queriedContext' as parameter to 'setInputs'
This makes clear that 'setInputs' depends on the 'queriedContext'
2016-09-02 20:05:18 +02:00
logmanoriginal
d1ff23c7ba [Bridge] Fix incorrect switch variable 2016-09-02 19:53:59 +02:00
logmanoriginal
04bddd0758 [Bridge] Apply default value while setting inputs 2016-09-02 19:52:47 +02:00
logmanoriginal
5f3d60276a [Bridge] Use original input values to guess context 2016-09-02 19:46:58 +02:00
Teromene
cbea717e80 Removed GitlabCommitsBridge, as they are already providing a RSS feed. 2016-09-02 19:13:47 +02:00
logmanoriginal
4bc4e03d7b [Bridge] Change order of variable declaration 2016-09-02 19:03:51 +02:00
logmanoriginal
41d3aa0695 [Bridge] Change scope of member variable 'inputs' 2016-09-02 19:01:57 +02:00
logmanoriginal
48db1693a1 [Bridge] Use member variable instead of local variable 2016-09-02 18:59:55 +02:00
logmanoriginal
c2e411ba82 [Bridge] Add function to set inputs 2016-09-02 18:38:07 +02:00
logmanoriginal
37f269cf53 [Bridge] Remove unused variable 2016-09-02 18:12:37 +02:00
logmanoriginal
d520e82d9e [Bridge] Fix function names
is* implies Boolean return values, which is not true for
these functions
2016-09-02 18:11:02 +02:00
logmanoriginal
5ad1fa8242 Merge branch 'constantine' of https://framagit.org/peetah/rss-bridge 2016-09-02 17:36:51 +02:00
logmanoriginal
cc46cf58ba Merge branch 'core' of https://framagit.org/peetah/rss-bridge 2016-09-02 17:13:07 +02:00
logmanoriginal
c0c10836d6 Merge branch 'fixPHP54compat' of https://framagit.org/peetah/rss-bridge 2016-09-02 17:09:36 +02:00
Pierre Mazière
9a0da733ef [bridges] use constants instead of variable members
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-01 23:15:51 +02:00
Pierre Mazière
556b8a2452 [core] transform some BridgeAbstract members to class constants
This concerns $uri, $name, $maintainer, $parameters and $description

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-01 23:12:51 +02:00
Pierre Mazière
729cbadc77 [Bridge] fix input parameter value storage
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-01 23:12:30 +02:00
Pierre Mazière
948bd9ae31 [bridges] fix invalid use of empty() for php < 5.5
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-09-01 23:01:51 +02:00
logmanoriginal
c642fca0d0 Merge branch 'CleanupBridgeCode' of https://github.com/logmanoriginal/rss-bridge 2016-09-01 21:09:18 +02:00
logmanoriginal
1aa01a1f67 [Bridge] Fix invalid text value without pattern 2016-09-01 21:07:27 +02:00
logmanoriginal
47b6cb8937 [Bridge] Return name of the parameter that failed the check 2016-09-01 20:59:49 +02:00
logmanoriginal
7c36b51aa2 [Bridge] Move code into functions 2016-09-01 20:53:47 +02:00
logmanoriginal
cd9435b936 [Bridge] Simplify cache loading 2016-09-01 19:43:25 +02:00
logmanoriginal
85a025a82b Merge branch 'core' of https://framagit.org/peetah/rss-bridge 2016-09-01 19:13:26 +02:00
Pierre Mazière
9d7e64fac0 [WorldOfTanksBridge] fix getName()
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:31:59 +02:00
Pierre Mazière
abc4f047bf [ZDNnetBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
468aa28a67 [YandereBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
2cda7edcbd [XbooruBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
6e3f08e9d3 [WorldOfTanksBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
23bb5c5dfb [WhydBridge] fix getName() + code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
014d016a51 [WallpaperStopBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
ada5903d68 [VkBridge] remove getName() + code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
83fad77a08 [VineBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
55c406e1b4 [ViadeoCompanyBridge] add Bridge suffix to class name + code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
0262162bc3 [UnsplashBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
351e1e9a6a [TwitterBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
fa294e2b4c [TwitchApiBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
f79d699a59 [ThePirateBayBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
9b5177eb68 [TheOatMealBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
5093eadfca [TheCodingLoveBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
3212c33770 [TbibBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
0f2cfe06d3 [TagBoardBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
eae88cf2cf [T411Bridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
1f72a34b42 [SuperbWallpapersBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
0b482283cb [StripeAPIChangeLogBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
cf70e43f59 [SoundcloudBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
a88ad96ad9 [SiliconBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
82b150baa8 [SensCritiqueBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
aed7815f05 [ScoopitBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
b1d9d88772 [ScmBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
92e0bec925 [SakugabooruBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
1172bea2db [SafebooruBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
10d5bb630f [Rule34pahealBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
5704b6e3c4 [Rule34Bridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
927ae17d5c [ReporterreBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
75a6f8af8a [Releases3DSBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
9f82adc87b [RTBFBridge] add getURI() + code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
08158825d9 [ProjectMGameBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
662c1b6410 [PlanetLibreBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
75f312ea7b [PinterestBridge] add getURI() + code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
5f0b843453 [PickyWallpapersBridge] add getURI() + code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
0b4854ccbf [ParuVenduImmobilierBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
Pierre Mazière
41dfc57103 [OpenClassroomsBridge] add getURI() + code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-30 00:23:17 +02:00
logmanoriginal
370530b5ef Merge branch 'FixFormatDataHandling' of https://github.com/logmanoriginal/rss-bridge 2016-08-29 20:52:28 +02:00
logmanoriginal
8d050c233b [Format] Change scope of 'sanitizeHtml' to protected 2016-08-29 20:51:11 +02:00
logmanoriginal
f49fca516d [Format] Trim all items elements
This removes unnecessary whitespace in output data
2016-08-29 20:50:02 +02:00
logmanoriginal
e46a480c5d [MrssFormat] Add icon to feed 2016-08-29 20:06:36 +02:00
logmanoriginal
5d0ee926a5 [JsonFormat] Remove obsolete FIXME
We don't need to convert fields that are NULL, since
json_encode will correctly encode those fields.
2016-08-29 19:57:10 +02:00
logmanoriginal
cf146523be [formats] Rename variable 'data' to 'item'
This makes the intend of the variable more clear and is now
coherent with all Bridges
2016-08-29 19:47:21 +02:00
logmanoriginal
a84016bcb6 [core] Rename item getter/setter
getDatas -> getItems
setDatas -> setItems

Note: Bridge->setDatas actually sets data, where Bridge->getItems
only returns items (this is why Bridge->setDatas was not changed)
2016-08-29 19:42:58 +02:00
logmanoriginal
1e9b5c8611 [formats] Remove all unnecessary code comments 2016-08-29 19:24:31 +02:00
logmanoriginal
059b099436 [formats] Fix missing element conditions
This fixes download behavior when requesting Atom/Mrss formats,
which was caused by is_null attempting to expand missing array
elements.
2016-08-29 19:05:41 +02:00
logmanoriginal
3c1706aa47 Merge branch 'core' of https://framagit.org/peetah/rss-bridge 2016-08-29 18:38:02 +02:00
Pierre Mazière
7de22c3e9a [NovelUpdatesBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 14:10:00 +02:00
Pierre Mazière
57fd0255ff [NiceMatinBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 14:03:17 +02:00
Pierre Mazière
3fb8c5b916 [NextgovBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 13:57:02 +02:00
Pierre Mazière
03cbd756a6 [NextInpactBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 13:54:14 +02:00
Pierre Mazière
b547285b88 [NeuviemeArtBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 13:53:00 +02:00
Pierre Mazière
9c1c29ec74 [NasaApodBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 13:50:53 +02:00
Pierre Mazière
73dd97aa6b [Mspabooru] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 13:42:30 +02:00
Pierre Mazière
79c536c189 [MsnMondeBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 13:40:01 +02:00
Pierre Mazière
a52a5b881a [MondeDiplomatique] fix wrong variable name
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 13:36:30 +02:00
Pierre Mazière
75d429bcf3 [MilbooruBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 13:34:36 +02:00
Pierre Mazière
d2bbe3a1f4 [MangareaderBridge] code simplification + fix 'get manga updates'
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 13:29:17 +02:00
Pierre Mazière
b1a834801b [BridgeAbstract] fix empty parameter context
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 13:27:30 +02:00
Pierre Mazière
6fa2d18516 [LolibooruBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 13:04:21 +02:00
Pierre Mazière
c53210b434 [LinkedInCompanyBridge] add Bridge suffix to class name + code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 13:01:44 +02:00
Pierre Mazière
98ebed9bc0 [LichessBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 12:55:15 +02:00
Pierre Mazière
01e0f2f77a [LesJoiesDuCodeBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 12:50:49 +02:00
Pierre Mazière
820eb5377b [Les400CulsBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 12:49:00 +02:00
Pierre Mazière
30f4a3f0f9 [LeMondeInformatiqueBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 12:46:48 +02:00
Pierre Mazière
69f5c6fa75 [LeJournalDuGeekBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 12:45:11 +02:00
Pierre Mazière
0668f79704 [LeBonCoinBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 12:42:34 +02:00
Pierre Mazière
953faabb1a [LWNprevBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 12:28:27 +02:00
Pierre Mazière
453cacf490 [KununuBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 12:20:18 +02:00
Pierre Mazière
7c03437c57 [KonachanBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 11:59:48 +02:00
Pierre Mazière
df80500c51 [JapanExpoBridge] code simplification + use checkbox instead of list
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 11:52:13 +02:00
Pierre Mazière
f13f44a682 [IsoHuntBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 02:38:54 +02:00
Pierre Mazière
b5c432d66c [InstagramBridge] fix getName() + code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 01:02:44 +02:00
Pierre Mazière
39d980dd3d [IdenticaBridge] remove useless code
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 00:59:02 +02:00
Pierre Mazière
7d9d6f3d79 [HentaiHavenBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 00:58:04 +02:00
Pierre Mazière
86a6f68af4 [HDWallpapersBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 00:56:31 +02:00
Pierre Mazière
37d2e75d7d [GuruMedBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 00:43:03 +02:00
Pierre Mazière
8e3f6dbc73 [GoogleSearchBridge] fix line length + code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 00:41:47 +02:00
Pierre Mazière
2496f1374d [GooglePlusPostBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 00:36:07 +02:00
Pierre Mazière
88f5014a16 [GizmodoFRBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 00:22:54 +02:00
Pierre Mazière
9f6aff9699 [GitlabCommitsBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 00:20:21 +02:00
Pierre Mazière
0fea61a470 [GithubIssueBridge] fix comments number + code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-29 00:12:42 +02:00
Pierre Mazière
7c840093db [GiphyBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 23:51:32 +02:00
Pierre Mazière
dc358dea9b [GelbooruBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 23:50:56 +02:00
Pierre Mazière
05825cf6f7 [GVBAtempBridge] fix getName() and fetch_post_content()
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 23:50:23 +02:00
Pierre Mazière
2ca854cacf [GawkerBridge] Gawker.com was shutdown on 2016-08-22
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 23:50:23 +02:00
Pierre Mazière
836eb8c038 [FuturaSciencesBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 23:49:38 +02:00
Pierre Mazière
6ea946359c [FourChanBridge] fix + add pattern
the current url parameter must be modified to be validated
more easily

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 23:49:38 +02:00
Pierre Mazière
0d9be1f510 [FootitoBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 23:48:57 +02:00
Pierre Mazière
445f3336c0 [FlickrTagBridge] fix + code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 23:48:56 +02:00
Pierre Mazière
e139372255 [FlickrExploreBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 23:48:03 +02:00
Pierre Mazière
29b4f954c2 [FierPandaBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 23:48:03 +02:00
logmanoriginal
4f7fbae861 [bridges] Fix conditional checks on getInput
isset($this->getInput('')) does not work
2016-08-28 20:38:08 +02:00
logmanoriginal
8ed3b02899 Merge branch 'core' of http://framagit.org/peetah/rss-bridge 2016-08-28 20:33:27 +02:00
logmanoriginal
7e2129fa2a Merge branch 'Caching' of https://github.com/logmanoriginal/rss-bridge 2016-08-28 20:10:42 +02:00
logmanoriginal
78f6757622 [bridges] Use caching with applicable bridges 2016-08-28 20:07:56 +02:00
logmanoriginal
e4b314f78a [Bridge] Enable cache file deletion 2016-08-28 19:50:33 +02:00
logmanoriginal
7363acfa6b [Wikipedia] Use cache for full articles 2016-08-28 19:50:18 +02:00
logmanoriginal
a7b3519c35 [bridges] Fix all calls to get_cached 2016-08-28 19:38:34 +02:00
logmanoriginal
5f3d28f3a6 [Bridge] Return HTML DOM with get_cached 2016-08-28 19:37:32 +02:00
Pierre Mazière
8c7b53b883 [FacebookBridge] fix + code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 14:24:17 +02:00
Pierre Mazière
342de7744b [ElsevierBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 14:15:38 +02:00
Pierre Mazière
d4d635a7d2 [EliteDangerousGalnetBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 14:13:45 +02:00
Pierre Mazière
cee272ba6e [EZTVBridge] fix + code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 14:08:12 +02:00
Pierre Mazière
d0cfeed3cf [DuckDuckGoBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 14:05:39 +02:00
Pierre Mazière
3df0f299de [DollbooruBridge] fix + code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 14:04:19 +02:00
Pierre Mazière
b1e5c7870f [DeveloppezDotComBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 14:00:40 +02:00
Pierre Mazière
7cfc35d20c [DemoBridge] fix uris
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:58:43 +02:00
Pierre Mazière
c3086fa20b [DauphineLibereBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:57:40 +02:00
Pierre Mazière
c9d89aface [DansTonChatBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:50:46 +02:00
Pierre Mazière
ebe7084cc2 [DanbooruBridge] fix + code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:48:26 +02:00
Pierre Mazière
2238e8998a [DailymotionBridge] fix + code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:38:01 +02:00
Pierre Mazière
f1a3ed297e [CryptomeBridge] use https source + code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:28:50 +02:00
Pierre Mazière
a80246a2b3 [CpasbienBridge] fix and code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:17:28 +02:00
Pierre Mazière
963bbcc402 [CourrierInternationalBridge] fix uri value and code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:14:56 +02:00
Pierre Mazière
6f8a773260 [CopieDoubleBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:12:14 +02:00
logmanoriginal
4959334f9f Merge branch 'ImproveFileCaching' of https://github.com/logmanoriginal/rss-bridge 2016-08-28 13:10:35 +02:00
logmanoriginal
c2ea8d0ee9 [FileCache] Ignore 'format' when generating the file name
Previously for each requested format a new cache file was created,
though the data is the same. With this the file name no longer depends
on the requested output format.
2016-08-28 13:09:45 +02:00
Pierre Mazière
58f6a43574 [CollegeDeFranceBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
7710613e62 [Castorus] fix and code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
3d76ac5d17 [CNETBridge] fix getName() and code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
6b97ca2991 [BooruprojectBridge] implement getURI() and code simplifications
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
88521f188e [BlaguesDeMerdeBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
1068f31303 [BastaBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
efb6ad9ff2 [AskfmBridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
ff5ac1659f [Arte7bridge] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
fb05976fa6 [core] fix two-levels list default value support
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
e74f526c19 [AnimeUltimeBridge] remove useless code and fix getName()
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
74d876b585 [core] add explicit support for list default value
and implicit support for text and number parameters

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
806f38b42d [StripeAPIChangeLogBridge] fix unknown class Item
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
c37aee408d [AcrimedBridge] fix method calling
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
93634ada3a [core] really fix bridges without parameters
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
3fed12af1d [BandcampBridge] fix parameter 'tag' required status and fix the rest
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
e9ff7b32f1 [AskfmBridge] remove useless code and fix getName() and getURI()
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
16dc7fcb6f [core] fix bridges without parameters
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
fa7cd4a739 [AllocineFRBridge] fix and simplify code
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
1b3c8a8aeb [core + bridges] add BridgeAbstract::$inputs and BridgeAbstract::getInput()
Inputs are not stored in BridgeAbstract::$parameters anymore to separate
static data from dynamic data.
The getInput method allows for more readable code.

Also fix an "undefined index 'global'" notice

Probability of breaking bridges: high !

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
a4fd7b8b98 [GooglePlusPostBridge] fix uninitialized $param
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
2047955f06 [core] rename $param to $inputs
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
d1715f6efc [core] fix missing curly brackets
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
ea46d532dc [TwitterBridge] fix getURI() and simplify code
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
85625318b1 [core] variable renaming
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
ea1d53a24a [core] fix global parameter values propagatino
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
701aff420d [core] code simplification
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
de1b39c8e5 [core + bridges] get rid of loadMetadata
if a bridge needs to modify some of the data that were initialized
there, ::__construct() should be used instead.

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:05:03 +02:00
Pierre Mazière
2301a12cc6 [WordpPessBridge] implement getURI() and simplify code
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:00:55 +02:00
Pierre Mazière
792578aefb [WikipediaBridge] remove useless code
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:00:55 +02:00
Pierre Mazière
a24e6ea323 [WikipediaBridge] implement and use getURI() and getName()
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:00:55 +02:00
Pierre Mazière
0de4fce41d [WhydBridge] remove useless code
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:00:55 +02:00
Pierre Mazière
341ce2bf3e [VkBridge] remove useless $request member
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:00:55 +02:00
Pierre Mazière
720b7924c5 [TwitchApiBridge] Simplify parameters and remove useless code
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:00:55 +02:00
Pierre Mazière
7857325d9c [core] set checkboxes default value to false
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:00:55 +02:00
Pierre Mazière
72e3031d5c [TwitchApiBridge] remove useless code
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:00:55 +02:00
Pierre Mazière
05001f6b2e [SoundcloudBridge] remove useless code
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:00:55 +02:00
Pierre Mazière
292f0f85ad [ParuVenduImmoBridge] fix undefined $param variable
and remove useless member $request

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:00:55 +02:00
Pierre Mazière
614d425da4 [InstagramBridge] fix uri, remove useless code
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:00:55 +02:00
Pierre Mazière
760141a751 [InstagramBridge] fix parameter 'u' requirement status
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:00:55 +02:00
Pierre Mazière
d95fa6117a [IdenticaBridge] remove useless code and fix getURI()
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:00:55 +02:00
Pierre Mazière
c061057861 [GoogleSearchBridge] remove useless checks and useless member $request
still broken though

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:00:55 +02:00
Pierre Mazière
2f1fa81082 [GBAtempBridge] remove useless checks and simplify code
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:00:55 +02:00
Pierre Mazière
ed0fd12193 [DailymotionBridge] simplify code
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:00:55 +02:00
Pierre Mazière
0d36ca21df [CNETBridge] remove useless member $topicName
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:00:55 +02:00
Pierre Mazière
1de7fb748c [BandcampBridge] remove useless member $request
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:00:55 +02:00
Pierre Mazière
755d3e133f [ABCTabsBridge] remove useless member $request
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-28 13:00:55 +02:00
LogMANOriginal
a8797641fd Merge pull request #369 from Frenzie/master
Fix Esperanto
2016-08-28 11:56:35 +02:00
Frans de Jonge
84c45e459e Fix Esperanto 2016-08-28 11:48:27 +02:00
LogMANOriginal
5448edcd79 Merge pull request #368 from Frenzie/master 2016-08-28 11:44:55 +02:00
Frans de Jonge
0fcde196b9 WikipediaBridge: improved title detection
* improved title detection through changed AddTodaysFeaturedArticleGeneric function call
* added Dutch Wikipedia support
2016-08-28 11:42:54 +02:00
logmanoriginal
737942ae7a Merge branch 'core' of https://framagit.org/peetah/rss-bridge 2016-08-26 19:54:42 +02:00
logmanoriginal
accbe8c06f Merge branch 'ContinuousIntegration' of https://github.com/logmanoriginal/rss-bridge 2016-08-26 19:44:41 +02:00
logmanoriginal
449b2ca520 [.travis.yml][phpcs.xml] Introduce TravisCI + PHP_CodeSniffer 2016-08-26 19:01:11 +02:00
Pierre Mazière
3f36ca2a9b [core] unexpected input generates a fail
because paranoïa is the way to security !
Should this be optional ?

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-25 17:52:44 +02:00
Pierre Mazière
2670a0e400 [core] get parameters from $_GET rather than $_REQUEST
No need to play with parameters that RSS-Bridge did not ask for

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-25 17:28:47 +02:00
Pierre Mazière
b676eca0a2 [WikipediaBridge] fix 'fullarticle' feature
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-25 17:18:47 +02:00
Pierre Mazière
5e33a27f7c [KununuBridge] fix 'fullarticle' feature
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-25 17:18:26 +02:00
Pierre Mazière
23a7edebd6 [WorldOfTanksBridge] code factorization
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-25 17:15:52 +02:00
Pierre Mazière
b6fe424ddb [Gawker] fix parameter 'site' requirement status
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-25 17:12:54 +02:00
Pierre Mazière
3a0a2a9559 [FreenewsBridge] remove unused parameter 'id'
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-25 17:12:23 +02:00
Pierre Mazière
a67a219bf9 [core] remove '$param' argument from RssExpander::collectExpandableDatas
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-25 17:11:49 +02:00
Pierre Mazière
3bad5ec45c [TwitterBridge] fix 'nopic' feature
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-25 17:07:37 +02:00
Pierre Mazière
af1673d1c4 [WelLiveSecurity] fix proxy bypass
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-25 15:40:33 +02:00
Pierre Mazière
c34fdfa7fb [TwitterBridge] fix bridge name and bridge uri
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-25 01:49:30 +02:00
Pierre Mazière
117031bf0f [core] store parameters values in BridgeAbstract::parameters
This way, any BridgeAbstract method can now have access to these values,
no only collectData

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-25 01:24:53 +02:00
Pierre Mazière
dea37c8e34 [core] use BridgeAbstract::parameters to sanitize inputs
This should result in a lot of simplifications in the bridges
since data validation is now done upstream.

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-25 01:20:12 +02:00
Pierre Mazière
1bb94aecc6 [core] leave $_REQUEST alone
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-25 01:07:49 +02:00
Pierre Mazière
70a8b88b6f [IdenticaBridge] fix parameter 'u' requirement status
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-25 00:47:52 +02:00
Pierre Mazière
ca9879fac9 [GooglePlusPostBridge] fix parameter 'username' requirement status
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-25 00:45:20 +02:00
Pierre Mazière
946a0744ed [GiphyBridge] merge parameters context
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-25 00:33:25 +02:00
Pierre Mazière
6dd45eae57 [DailymotionBridge] fix parameters 'p' and 's' requirement status
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-25 00:19:41 +02:00
Pierre Mazière
b9207841cc [CpasbienBridge] fix unhandled case
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-25 00:12:33 +02:00
Pierre Mazière
d530415481 [CpasbienBridge] use SimpleHTMLDOM str_get_html function
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-25 00:11:24 +02:00
Pierre Mazière
5b32050a6e [AskfmBridge] fix parameter 'u' requirement status
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-24 23:41:33 +02:00
Pierre Mazière
fbf17beae8 [Arte7Bridge] extract nested function
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-24 23:40:47 +02:00
logmanoriginal
73ec10f9ca Merge branch 'ImproveBridgeLogic' of https://github.com/logmanoriginal/rss-bridge 2016-08-24 20:55:13 +02:00
logmanoriginal
99a416ebad Merge branch 'GithubIssuesBridge' of https://framagit.org/peetah/rss-bridge 2016-08-24 20:53:06 +02:00
logmanoriginal
1d0b8f20f3 [Bridge] Fix missing function scope 2016-08-24 20:50:32 +02:00
logmanoriginal
95404b8fc4 [Bridge] Move 'Bridge' class at top of the file 2016-08-24 20:48:12 +02:00
logmanoriginal
b9b2428f63 [Bridge] Add function to build chache file path 2016-08-24 20:44:21 +02:00
logmanoriginal
458d1fbfeb [Bridge] Rename to 2016-08-24 20:35:19 +02:00
logmanoriginal
56cb116ce6 [Bridge] Format unreadable lines longer than 80 chars 2016-08-24 20:31:39 +02:00
logmanoriginal
5a7bc9b0c3 [bridges] Fix all calls from 'message' to 'debugMessage' 2016-08-24 20:19:30 +02:00
logmanoriginal
8252387386 [Bridge] Rename 'message' to 'debugMessage' 2016-08-24 20:18:59 +02:00
logmanoriginal
9021a4b7cc [Bridge] Don't return object instance with 'setCache' 2016-08-24 20:17:26 +02:00
logmanoriginal
429126e18a [Bridge] Cleanup file
- Remove unnecessary documentation
- Update/Clarify documentation where necessary
- Remove empty lines
- Put 'else' between closing and opening curly braces
- Make sure curly braces start right after closing brace on functions '(){...'
- Start lines with '.' and use proper indentation when using multi-line string combinations
- Add spaces for function definitions/calls and assignments
- Add space before opening curly brace after class definition 'class xyz {'
2016-08-24 20:14:23 +02:00
logmanoriginal
a43703d32d [Bridge] Replace double quotes with single quotes
This harmonizes the usage throughout the file.
2016-08-24 19:33:38 +02:00
logmanoriginal
237a26e4ff [bridges] Rename bridges that are missing 'Bridges'
The word 'Bridge' is a requirement for the filename and class name.
Also documented here (now):
https://github.com/rss-bridge/rss-bridge/wiki/how-to-create-a-new-bridge
2016-08-24 19:06:07 +02:00
logmanoriginal
07f664b2fa [Bridge] Remove duplicate definition of member variables 2016-08-24 18:32:31 +02:00
logmanoriginal
1e9edf49de [bridges] Activate all calls to the 'message' function 2016-08-24 18:20:49 +02:00
logmanoriginal
c0c4759cde [Bridge] Enable all calls to message($)
The 'message' function will only execute in debug mode, so
no harm done if left active.
2016-08-24 18:19:44 +02:00
logmanoriginal
d80efed1f4 [Bridge] Use space indentation everywhere 2016-08-24 18:09:34 +02:00
Pierre Mazière
c051730f7c [GithubIssueBridge] fix comments number
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-23 21:20:21 +02:00
Pierre Mazière
c9822bffa7 [GithubIssueBriddge] list all issues when 'i' parameter is not provided
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-23 20:29:29 +02:00
logmanoriginal
7961f8081e [HtmlFormat] Revert use of filter_input to $_SERVER
https://bugs.php.net/bug.php?id=49184
indicates a verified (not solved) bug where filter_input returns
NULL when used with INPUT_SERVER
2016-08-23 19:46:41 +02:00
logmanoriginal
9173e7da54 [HtmlFormat] Fix format query replacements 2016-08-23 18:36:49 +02:00
logmanoriginal
c94cfce511 Merge branch 'core' of https://framagit.org/peetah/rss-bridge 2016-08-23 18:28:22 +02:00
logmanoriginal
a8b445724f Merge branch 'cleanerProxy' of https://framagit.org/peetah/rss-bridge 2016-08-23 18:13:08 +02:00
Pierre Mazière
b31b6667f6 [core] fix missing filter_input
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-23 17:22:51 +02:00
Pierre Mazière
3c089c1b11 [core] keep compatibility with nameBridge and nameFormat naming scheme
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-23 16:10:26 +02:00
Pierre Mazière
7e0ac1a6b6 [core] better use of filter_input
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-23 14:42:53 +02:00
Pierre Mazière
0a86d572c2 [core] simplify cache related code and remove misleading comment
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-23 14:41:41 +02:00
Pierre Mazière
581bff166c [core] makes 'bridge' and 'format' parameters value less verbose
remove the requirement for 'Format' and 'Bridge' suffixes:
https://example.com/?action=display&bridge=Twitter&format=Atom&u=user

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-23 14:34:07 +02:00
Pierre Mazière
eb3392db82 [core] simplify dynamic formats discovery
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-23 14:29:53 +02:00
Pierre Mazière
13285f080a [core] use filter_input() instead of direct access to $_REQUEST
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-23 14:22:02 +02:00
Pierre Mazière
b3af604cc1 [core] remove useless static methods
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-23 13:44:23 +02:00
Pierre Mazière
4a1f360d39 [bridges] use BridgeAbstract::getContents instead of file_get_contents
use of the proxy feature when enabled

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-22 23:39:40 +02:00
logmanoriginal
747e54d64a [IsoHuntBridge] Fix 'latest news' and 'latest hot topics' 2016-08-22 19:37:18 +02:00
logmanoriginal
8283a5a34f Merge branch 'RefactorItemClass' of https://github.com/logmanoriginal/rss-bridge 2016-08-22 19:14:02 +02:00
logmanoriginal
d9b6477ff6 [FileCache] Fix loading cached data
Previously cached data was translated into object data (Item),
this is no longer necessary.
2016-08-22 18:59:23 +02:00
logmanoriginal
d5db4f5859 [RssBridge] Remove require for Item.php 2016-08-22 18:58:22 +02:00
logmanoriginal
7b890da8f2 [Item] Remove file 2016-08-22 18:57:49 +02:00
logmanoriginal
bf0a9d754e [bridges] Change all occurrences of the Item object to array 2016-08-22 18:55:59 +02:00
logmanoriginal
1f3361c6b4 [formats] Change item to associative array
Previously the item class was used to dump literaly any data
into an object. The same can be archived by using an array
with named keys (associative array).

Technically it makes more sense to use an array as we want to
be able to store any parameter into our item.
2016-08-22 18:54:36 +02:00
logmanoriginal
6fd0bdd21e Merge branch 'JSON2array' of https://framagit.org/peetah/rss-bridge 2016-08-22 16:20:56 +02:00
Pierre Mazière
d5418b3d11 [LeBonCoinBridge] fix typo in values list
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-22 11:15:00 +02:00
Pierre Mazière
dc4f16fbe4 [core] remove JSON based paramter definition related code
bye bye JSON

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-22 01:33:14 +02:00
Pierre Mazière
f0e502ce37 [bridges] migrate all bridges to an array based definition of parameters
see github issue 356

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-22 01:25:56 +02:00
Pierre Mazière
2f09ae56ad [core] render two levels 'values' parameter property with optgroup
example:
$parameterSet=array(
  'feed'=>array(
     'name'=>'Feed',
     'type'=>'list',
     'values'=>array(
        'list A'=>array(
           'feed A1'=>'fA1',
           'feed A2'=>'fA2'
        ),
        'list B'=>array(
           'feed B1'=>'fB1',
           'feed B2'=>'fB2
        )
     )
  )
);

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-22 01:23:20 +02:00
Pierre Mazière
4717de9d08 [core] allow BridgeCard to be build from parameters stored in an array
The array structure is as follow:
$parameterSet=array(
 'identifier'=>array(
    'property'=>'property_value'
     …
 )
);

'values' property is stored as an associative array where
the key is the displayed string and the value is the value (sic)
attached to this string.


Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-22 01:16:06 +02:00
Pierre Mazière
ee2b9d65ee [WhydBridge] fix parameter 'u' requirement status
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-22 00:31:17 +02:00
Pierre Mazière
306d50582d [VkBridge] fix parameter 'u' requirement status
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-22 00:26:53 +02:00
Pierre Mazière
b5cc7b4ded [VkBridge] use BridgeAbstract::getSimpleHTMLDOM
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-22 00:26:14 +02:00
Pierre Mazière
4aaa921696 [ViadeoCompanyBridge] fix parameter 'c' requirement status
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-22 00:20:02 +02:00
Pierre Mazière
af747af534 [ViadeoCompanyBridge] fix missing quotes
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-22 00:19:32 +02:00
Pierre Mazière
bbf95662c2 [TwitchApiBridge] use BridgeAbstract::getSimpleHTMLDOM
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-22 00:04:15 +02:00
Pierre Mazière
c54462d2f0 [TwitchApiBridge] fix parameter channel requirement status
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-22 00:03:17 +02:00
Pierre Mazière
f9b5cac1b7 [TagBoardBridge] fix parameter 'u' requirement status
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-21 23:53:12 +02:00
Pierre Mazière
bdb1871474 [T411Bridge] fix parameter 'search' requirement status
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-21 23:50:15 +02:00
Pierre Mazière
8adcc7d26a [SoundCloudBridge] fix parameter 'u' requirement status
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-21 23:45:08 +02:00
Pierre Mazière
f29d51510b [ScoopItBridge] fix parameter 'u' requirement status
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-21 20:15:17 +02:00
Pierre Mazière
5e52f4d3e6 [bridges] fix typo in getSimpleHTMLDOM call
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-21 20:08:18 +02:00
Pierre Mazière
84238a998d [NovelUpdatesBridge] fix parameter 'n' requirement status
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-21 19:54:29 +02:00
logmanoriginal
4540645122 [CHANGELOG] Rewrite changelog for Alpha 0.2 (CDV) 2016-08-21 19:53:20 +02:00
Pierre Mazière
8e32142ce5 [bridges] fix typo in getSimpleHTMLDOM call
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-21 19:48:23 +02:00
Pierre Mazière
181be164e0 [LinkedInCompany] fix parameter 'c' requirement status
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-21 19:27:44 +02:00
Pierre Mazière
7641fb5266 [LinkedInCompany] fix missing quotes
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-21 19:25:23 +02:00
Pierre Mazière
b97317af2e [bridges] fix typo in getSimpleHTMLDOM call
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-21 19:23:35 +02:00
Pierre Mazière
09bc211cc6 [GitlabCommits] fix parameters requirement status and default values
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-21 18:07:42 +02:00
Pierre Mazière
be98ad161a [FuturaSciencesBridge] fix undefined $url variable
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-21 17:23:04 +02:00
Pierre Mazière
5410392968 [EZTVBridge] fix parameter 'i' requirement status
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-21 17:06:51 +02:00
Pierre Mazière
cd088776a8 [DuckDuckGoBridge] fix keyword required status
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-21 17:03:14 +02:00
Pierre Mazière
2466f109b8 [DuckDuckGOBridge] fix missing quotes
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-21 16:59:28 +02:00
Pierre Mazière
dd1474f154 [bridges] extract nested functions
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-21 11:46:23 +02:00
Pierre Mazière
fd5c8ea658 [AllocineFRBridge] fix typo in getSimpleHTMLDOM call
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-21 01:41:04 +02:00
Pierre Mazière
bba216073c [bridges] remove useless 'update' property from all bridges
That's the source code manager job to keep this information
consistent

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-21 00:21:41 +02:00
logmanoriginal
d0461f3643 Merge branch 'Twitter' of http://framagit.org/peetah/rss-bridge 2016-08-20 22:23:36 +02:00
Pierre Mazière
6e66c228f8 [TwitterBridge] rename 'pic' parameter to more consistent 'nopic'
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-20 12:32:05 +02:00
Pierre Mazière
71d8f4c465 [TwitterBridge] add 'Without replies' parameter
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-20 11:18:06 +02:00
logmanoriginal
7761d1b70a Merge branch 'ElsevierBridge' of https://framagit.org/peetah/rss-bridge 2016-08-19 19:12:57 +02:00
Pierre Mazière
490c5094f5 [ElsevierBridge] fix time extraction
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-19 18:50:50 +02:00
Pierre Mazière
9cc00cb212 [TwitterBridge] fix HTML entities decoding in title
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-19 17:20:49 +02:00
logmanoriginal
251d7646b7 [index] Fix loading of metadata
Re-introduces commit a1257126bc
2016-08-19 14:46:22 +02:00
logmanoriginal
6a912fba96 Merge branch 'cleanerProxy' of https://framagit.org/peetah/rss-bridge 2016-08-19 14:21:23 +02:00
Pierre Mazière
67d6802161 IsoHuntBridge: rename file_get_html to getSimpleHTMLDOM
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-19 11:06:20 +02:00
Pierre Mazière
be591d19e0 remove bridges already removed upstream
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-19 10:20:27 +02:00
Pierre Mazière
10cd3a61a9 check for PROXY_NAME definition before using it
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-19 10:20:27 +02:00
Pierre Mazière
e754ca52e9 bridges: rename file_get_html to getSimpleHTMLDOM
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-19 10:20:27 +02:00
Pierre Mazière
6e2c7ceaf4 bridges: rename file_get_html to getSimpleHTMLDOM
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-19 10:20:27 +02:00
Pierre Mazière
86515a1560 core: use proxy when defined in RssExpander
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-19 10:20:27 +02:00
Pierre Mazière
226484ba22 core: remove useless HttpCachingBridgeAbstract::download_remote()
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-19 10:20:27 +02:00
Pierre Mazière
fe58d23c17 core: use proxy when defined in HttpCachingBridgeAbstract
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-19 10:20:27 +02:00
Pierre Mazière
d74beb6c6a core: move message() method to parent class BridgeAbstract
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-19 10:20:27 +02:00
Pierre Mazière
3c0d13c1bb bridges: use BridgeAbstract::getSimpleHTMLDOM
instead of BridgeAbstract::file_get_html

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-19 10:20:27 +02:00
Pierre Mazière
f43bbda83e core: split and rename BridgeAbstract::file_get_html
We need to have one method to get the data, potentially
using the proxy if defined, and one method to get the Simple
DOM HTML object from these data, with a more informative name

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-19 10:19:56 +02:00
Pierre Mazière
d71674d2ba proxy settings must be the service provider decision
therefore, the provider decides if the service use a
proxy or not, and if users can have the possibility to
disable it on a bridge basis.

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-19 10:19:56 +02:00
Pierre Mazière
09d4e21bdc possibility to hide proxy address
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-19 10:19:56 +02:00
Pierre Mazière
3dd63ab6fd enable proxy usage for individual bridge
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-19 10:19:56 +02:00
logmanoriginal
b43e8ef689 Merge branch 'LWNprevBridge' of https://framagit.org/peetah/rss-bridge 2016-08-19 09:35:33 +02:00
Pierre Mazière
5986b9f786 follow up on site changes
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-18 10:21:58 +02:00
Pierre Mazière
1e953d3c3e use BridgeAbstract::file_get_html instead of SimpleHTMLDOM one
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-18 10:20:57 +02:00
Pierre Mazière
65c6b08aed fix DOMNode and DOMElement mess
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-08-17 16:19:51 +02:00
logmanoriginal
74f0572d91 bridges: Replace returnError function with more specific
Replacements depend on original error code:
400: returnClientError
404: returnServerError
500: returnServerError
501: returnServerError
2016-08-17 14:45:08 +02:00
logmanoriginal
73a1bcf3d6 [Bridge] Add specialized error handling functions 2016-08-17 13:58:55 +02:00
logmanoriginal
d3cebe9c65 [IsoHunt] Add new bridge 2016-08-16 01:34:25 +02:00
Mitsukarenai
5212b91cca [whitelist] trim content for wildcard (contrib: @Piokaz) 2016-08-16 00:00:33 +02:00
Mitsukarenai
eb419e2595 [README] Add instruction for wildcard in whitelist.txt 2016-08-15 23:40:29 +02:00
logmanoriginal
d3cbf38eb1 [Bridge] Allow '*' wildcard to whitelist all bridges
For this to work the whitelist.txt must only contain '*' (no \n)
2016-08-15 08:46:04 +02:00
logmanoriginal
646ae57326 [HTMLUtils] Change getHelperButtonsFormat to private scope 2016-08-15 08:13:40 +02:00
logmanoriginal
a6da16feb7 [HTMLUtils] Remove getHelperButtonFormat 2016-08-15 08:01:32 +02:00
logmanoriginal
5d66af7a29 [HTMLUtils] Add new attribute 'defaultValue'
Behavior depends on the type:

- text: Allows any text
- number: Allows any numeric
- list: 'defaultValue' must match either name or value of one element
- checkbox: 'defaultValue' must be checked to activate checkbox
2016-08-15 02:47:36 +02:00
logmanoriginal
3fd283e29f [HTMLUtils] Fix form input attribute assignment
- Don't assign attributes to all options of a selection
- Assign attributes to checkboxes
2016-08-15 02:32:36 +02:00
logmanoriginal
3ca2f030e7 [HTMLUtils] Add common function for form header 2016-08-15 02:21:07 +02:00
logmanoriginal
f853f62270 [HTMLUtils] Cleanup code
- Use single quote instead of double quotes
- Remove unnecessary empty lines
- Use common format for indentation and blocks
- Use HEREDOC for long strings
- Remove braces from single line if-statements
2016-08-15 02:08:59 +02:00
logmanoriginal
fa59a25229 bridges: Update bridges with 'required' attributes 2016-08-15 01:19:16 +02:00
logmanoriginal
c689180fef [HTMLUtils] Make 'required' attribute Boolean
The 'required' attribute can now be used for all parameters and
enabled/disabled using Boolean states true/false respectively:

"required" : true

or

"required" : false

This now complies to the Wiki:
https://github.com/RSS-Bridge/rss-bridge/wiki/BridgeAbstract
2016-08-15 01:14:00 +02:00
logmanoriginal
a70e143dc4 [HTMLUtils] Remove value from 'required' attribute
The 'required' attribute has no value, see
https://www.w3.org/TR/html5/forms.html#the-required-attribute
2016-08-15 01:00:51 +02:00
LogMANOriginal
43dce4b228 [README] Update authors 2016-08-14 12:56:52 +02:00
LogMANOriginal
a2ecf5d943 Merge pull request #348 from az5he6ch/master
[Askfm] Add new bridge
2016-08-14 12:52:01 +02:00
az5he6ch
ceb3e9a039 Merge branch 'master' of https://github.com/az5he6ch/rss-bridge 2016-08-14 20:16:27 +09:30
az5he6ch
a5c7179b0e [Askfm] Add new bridge 2016-08-14 20:16:16 +09:30
logmanoriginal
94404aad61 [README] Update links 2016-08-13 21:32:36 +02:00
logmanoriginal
890b48c56d [CREATE_BRIDGE] Remove file
The contents of this file are now part of the Wiki
2016-08-13 21:32:14 +02:00
LogMANOriginal
0e7f992e64 [README] Add license badge 2016-08-13 19:08:03 +02:00
logmanoriginal
eeb6c9681d [YoutubeBridge] Fix typo 2016-08-11 21:42:49 +02:00
LogMANOriginal
619f4898fa [README] Update with new screenshots & content 2016-08-11 21:21:43 +02:00
logmanoriginal
c9fd3979c1 [.gitignore] Ignore all Visual Studio Code settings 2016-08-11 20:18:44 +02:00
Mitsukarenai
69a590be79 i[README] small change :) 2016-08-11 13:23:51 +02:00
Mitsu
213241527d Merge pull request #342 from LogMANOriginal/KununuBridge
[KununuBridge] Add new bridge
2016-08-10 23:47:34 +02:00
logmanoriginal
2a04940fb8 [KununuBridge] Increase cache duration to 1 day 2016-08-10 23:27:48 +02:00
logmanoriginal
f0f2e8f847 [KununuBridge] Add new bridge 2016-08-10 23:18:35 +02:00
Mitsu
cd7eb1b8fe Merge pull request #341 from LogMANOriginal/CleanupBridges
Cleanup bridges
2016-08-10 12:05:34 +02:00
logmanoriginal
0c1ec44c49 bridges: Merge all Allocine* bridges into AllocineFRBridge 2016-08-10 11:41:35 +02:00
logmanoriginal
68d1c1f961 [TwitterBridgeExtended] -> [TwitterBridge] make this the only one 2016-08-10 11:00:40 +02:00
logmanoriginal
1ea38d521d bridges: Remove all Twitter bridges except TwitterBridgeExtended 2016-08-10 10:56:06 +02:00
logmanoriginal
5ef26343b3 [TwitterBridgeExtended] Complete definition of parameters 2016-08-10 10:55:06 +02:00
logmanoriginal
a628abd04c [TwitterBridgeExtended] Add option to show/hide profile pictures 2016-08-10 10:52:04 +02:00
logmanoriginal
89aad9f796 [TwitterBridgeExtended] Directly write content to ->title 2016-08-10 10:26:29 +02:00
logmanoriginal
6138031793 [TwitterBridgeExtended] Add border around profile picture 2016-08-10 10:08:03 +02:00
logmanoriginal
faacbda027 [TwitterBridgeExtended] Use inline-blocks to format HTML output 2016-08-09 22:05:42 +02:00
logmanoriginal
0683457eb3 [TwitterBridgeExtended] Reduce size of emojis in the tweet 2016-08-09 21:59:55 +02:00
logmanoriginal
13d9b8d462 [TwitterBridgeExtended] Use heredoc syntax to build ->content 2016-08-09 21:47:29 +02:00
logmanoriginal
1a572f6639 [TwitterBridgeExtended] Use username as alternative to the image 2016-08-09 21:36:45 +02:00
logmanoriginal
63bb7ef24d bridges: Remove unnecessary functions getName() and getURI() 2016-08-09 20:08:46 +02:00
Mitsu
9f3e7e1da7 Merge pull request #340 from LogMANOriginal/HarmonizeFormats
Harmonize formats
2016-08-09 17:55:59 +02:00
logmanoriginal
d79366f479 [HtmlFormat] Add button for MRSS feed 2016-08-09 17:18:16 +02:00
logmanoriginal
606e756bc1 formats: Use same general entity generation order 2016-08-09 17:12:28 +02:00
logmanoriginal
0d94f1fe0e [MrssFormat] Use XML encoding on data 2016-08-09 17:05:29 +02:00
logmanoriginal
8b468e94a8 [AtomFormat] Use XML encoding instead of CDATA section 2016-08-09 17:02:45 +02:00
logmanoriginal
ae716abf65 [MrssFormat] Remove unused and create default URI if non defined 2016-08-09 16:49:27 +02:00
logmanoriginal
368fc66fbf [AtomFormat] Use default feed URI if non defined 2016-08-09 16:45:33 +02:00
logmanoriginal
e3c578510b [AtomFormat] Change xml_encode($) to private scope 2016-08-09 16:36:31 +02:00
logmanoriginal
be487a6950 [MrssFormat] Link channel to rss-bridge host
This is the same behavior as in AtomFormat
2016-08-09 16:27:32 +02:00
logmanoriginal
42b6c82753 bridges: Cleanup occurrences of $item->thumbnailUri
This is a subsequent change to f3eefab
2016-08-09 15:50:55 +02:00
logmanoriginal
e329a4c1b6 bridges: Change ->name to ->author 2016-08-09 14:54:44 +02:00
logmanoriginal
4806092b9f [AtomFormat] Fix default value for author 2016-08-09 14:29:44 +02:00
logmanoriginal
8c21769078 [AtomFormat] Use $item->author for author name
$item->name was inteded as the author name and $item->author as the author
uri.

Bridges use $item->name and $item->author interchangably for author name,
so $item->name can be removed.

$item->author is now used for the author name!
2016-08-08 23:43:38 +02:00
logmanoriginal
f3eefab475 [MrssFormat] Remove media:title and media:content
Both items only make sense in combination with media:content.
This subsequently eradicates $item->thumbnailUri.
2016-08-08 23:28:50 +02:00
logmanoriginal
1af6008d65 [CREATE_BRIDGE] Fix typo 2016-08-08 22:57:43 +02:00
logmanoriginal
0663c9507f [AtomFormat] Remove enclosures
This feature was implemented for AtomFormat only and implemented by no
bridge other than DemoBridge.
2016-08-08 22:43:53 +02:00
Mitsu
bb49aef187 Merge pull request #339 from LogMANOriginal/ImproveNavigation
Improve navigation
2016-08-07 16:08:32 +02:00
logmanoriginal
c0b607c841 [index] Fix whitelist default array
WikipediaBridge recently replaced WikipediaENBridge,
WikipediaEOBridge and WikipediaFRBridge
2016-08-07 15:36:50 +02:00
logmanoriginal
82f06ad2c5 [HtmlFormat] Add anchor for bridge URI to title 2016-08-07 15:29:59 +02:00
logmanoriginal
3f83763ff9 [index] Don't render 'Show inactive bridges' if non inactive 2016-08-07 15:15:55 +02:00
logmanoriginal
75f7a32b99 [index] Allow hiding of inactive bridges when shown 2016-08-07 15:06:48 +02:00
logmanoriginal
d98a7d6644 [HtmlFormat] Return to bridge #id when pressing 'back to rss-bridge' 2016-08-07 14:55:58 +02:00
Mitsu
73dc0efac6 Merge pull request #338 from LogMANOriginal/WikipediaBridge
Wikipedia bridge
2016-08-07 13:29:12 +02:00
logmanoriginal
13d42746d7 [Wikipedia] Fix typo 2016-08-07 13:26:30 +02:00
logmanoriginal
1cfb8c02a0 [Wikipedia] Use entire entry as title for 'Did you know' 2016-08-07 13:02:10 +02:00
logmanoriginal
04b4dd1db9 [Wikipedia] Add support for 'Did you know?' articles 2016-08-07 12:51:09 +02:00
logmanoriginal
17c9d8fc37 [Wikipedia] Fix typo 2016-08-07 11:29:00 +02:00
logmanoriginal
0b923ab76a [Wikipedia] Improve title search algorithm 2016-08-07 11:26:45 +02:00
logmanoriginal
d4435e0b13 [Wikipedia] Remove other bridges
All previous bridges are now completely covered by the
new WikipediaBridge!
2016-08-07 00:07:37 +02:00
logmanoriginal
2c954a848d [Wikipedia] Create bridge for multiple languages 2016-08-07 00:06:14 +02:00
Mitsu
3d72ba8ed9 Merge pull request #337 from LogMANOriginal/CleanupBridges
Cleanup bridges
2016-08-06 21:51:30 +02:00
logmanoriginal
7d073b3e96 [lib/Bridge] Remove loadMetadatas from BridgeAbstract
This method MUST be implemented by the bridges.
2016-08-06 19:02:02 +02:00
logmanoriginal
62c77384ec [CREATE_BRIDGE] Fix typos 2016-08-06 18:54:36 +02:00
logmanoriginal
0ddf664d89 bridges: Remove obsolete getName() and getURI() 2016-08-06 18:45:02 +02:00
logmanoriginal
a1257126bc [index] Make sure metadata is loaded before requesting data
loadMetadatas must be executed before setDatas to load all
metadatas before using them in collectData (called by setDatas)
2016-08-06 18:38:42 +02:00
logmanoriginal
b59915f23b [lib/Bridge] Define default behavior for getName() and getURI()
Bridges no longer require implementation for getName() and getURI()
as they are now implemented with default behavior in BridgeAbstract.

This was previously implemented only for RSSExpander and is now part
of BridgeAbstract (automatically inherited).

Documentation is updated accordingly.
2016-08-06 18:21:43 +02:00
logmanoriginal
5432cabef5 bridges: Put name/uri directly in bridge metadata
Some bridges used getName() and getURI() to put information into the
metadatas. Instead the metadatas should be initialized with data and
(not yet done) returned by default via getName() and getURI().
2016-08-06 18:07:42 +02:00
logmanoriginal
5ad157d2fd bridges: Remove getCacheDuration if default
BridgeAbstract will return 3600 seconds by default, so the function
can be removed from any bridge implementing getCacheDuration
returning the same value.

Documentation updated accordingly.
2016-08-06 16:23:09 +02:00
logmanoriginal
1d53b70272 bridges: Remove unused functions and update scopes
Many bridges implemented getDescription() which is only applicable for
bridges extending RSSExpander.

Functions that are not part of the abstract class or interface should
be in private scope for better readability.
2016-08-06 16:00:56 +02:00
Mitsu
f99f4d23ac Merge pull request #336 from LogMANOriginal/ImproveDocs
Improve CREATE_BRIDGE.md
2016-08-05 21:04:02 +02:00
logmanoriginal
48711bd772 [CREATE_BRIDGE] Fix some typos 2016-08-05 19:56:08 +02:00
logmanoriginal
5b7a6300ec [CREATE_BRIDGE] Update documentation to reflect current status 2016-08-05 19:43:39 +02:00
Mitsu
67e2698211 Merge pull request #335 from LogMANOriginal/CastorusBridge
[Castorus] Allow filter via ZIP code or city name
2016-08-05 19:33:48 +02:00
logmanoriginal
a5120dde2c [Castorus] Allow filter via ZIP code or city name 2016-08-05 14:59:26 +02:00
Mitsu
db95a2afca Merge pull request #334 from LogMANOriginal/CastorusBridge
Castorus bridge
2016-08-05 14:09:48 +02:00
Mitsu
09309db86b Merge pull request #333 from LogMANOriginal/FixBridgeFileGetHtml
[lib/Bridge] Fix typo
2016-08-05 14:09:42 +02:00
logmanoriginal
e4a56e504e [Castorus] Reduce cache duration to 10 minutes 2016-08-05 13:19:36 +02:00
logmanoriginal
31bdf7390a [Castorus] Add new bridge 2016-08-05 13:16:00 +02:00
logmanoriginal
e6bd815bcc [lib/Bridge] Fix typo
This fixes "Notice: Undefined variable: defaultBRtext in
C:\xampp\htdocs\rss-bridge_dev\lib\Bridge.php on line 114"
2016-08-05 11:27:47 +02:00
Mitsu
da1e32267b Merge pull request #332 from LogMANOriginal/WordPressBridge
Improve WordPress bridge and remove LeMotDuJour + Raymond (test before merge!)
2016-08-05 01:59:16 +02:00
logmanoriginal
02e169584a [Raymond] remove bridge: supported by WordPress bridge 2016-08-04 22:00:51 +02:00
logmanoriginal
12abf9d455 [LeMotDuJour] remove Bridge: Supported by WordPress bridge
http://www.lemotdujour.com doesn't seem to be active for the last two
years (last entry is dated 17. oct 2014). WordPress will return the
headlines which seems to be sufficient for now.
2016-08-04 21:57:13 +02:00
logmanoriginal
7afee0e277 [WordPress] Fix site name on bridge content 2016-08-04 21:56:11 +02:00
logmanoriginal
870ef6f6fc [WordPress] Remove forms and improve script removal
Some sites contain scripts like these, that were not captured by the
previous implementation:

<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
2016-08-04 21:46:03 +02:00
logmanoriginal
2c41ed550d [WordPress] Fix content loading 2016-08-04 21:06:12 +02:00
logmanoriginal
d944558a3d [WordPress] Fix indentation and remove empty lines 2016-08-04 20:45:21 +02:00
logmanoriginal
455b98757c [WordPress] Don't attempt to load pages with missing .article
Some sites use WordPress but don't provide pages with articles.
Instead of throwing internal errors we just don't return any
content.
2016-08-04 20:40:38 +02:00
logmanoriginal
21523eb549 [WordPress] Change all nested functions to member functions 2016-08-04 20:15:28 +02:00
logmanoriginal
2672b96e11 [WordPress] Initialize item before assigning values
This solves warning: "Creating default object from empty value"
2016-08-04 20:12:51 +02:00
Mitsu
eb8ffe97a9 Merge pull request #331 from LogMANOriginal/style
Apply time style to author
2016-08-04 20:08:16 +02:00
logmanoriginal
0a008c4eb3 [WordPress] Support atom AND rss for feed replies
Some sites return RSS feeds instead of ATOM feeds even though ATOM
feeds were specifically requested (/feeds/atom)!

This bridge will now detect ATOM/RSS feeds and change behavior
accordingly.
2016-08-04 20:06:53 +02:00
logmanoriginal
905b0f2499 Apply time style to author
The author is mentioned right below the time so it makes sense to give
them the same style.
2016-08-04 14:29:30 +02:00
Mitsu
064f456be1 Merge pull request #330 from LogMANOriginal/ShanaprojectBridge
Add bridge ShanaprojectBridge
2016-08-04 13:49:38 +02:00
Mitsu
652d3eca3d Merge pull request #329 from LogMANOriginal/WikipediaEOBridge
[WikipediaEO] Fix search pattern
2016-08-04 13:49:33 +02:00
Mitsu
68be407564 Merge pull request #328 from LogMANOriginal/ReporterreBridge
Reporterre bridge
2016-08-04 13:49:28 +02:00
Mitsu
a53c458d5a Merge pull request #327 from LogMANOriginal/SegfaultMintBridge
[SegfaultMint] remove bridge: website supported by WordPress bridge
2016-08-04 13:49:23 +02:00
Mitsu
1cbc045703 Merge pull request #326 from LogMANOriginal/OpenTheoryBridge
[OpenTheory] remove bridge: website supported by WordPress bridge
2016-08-04 13:00:53 +02:00
Mitsu
737199404c Merge pull request #325 from LogMANOriginal/ScilogsBridge
[Scilogs] remove bridge: website supported by WordPress bridge
2016-08-04 13:00:43 +02:00
Mitsu
559471de8a Merge pull request #324 from LogMANOriginal/PlanetLibreBridge
Planet libre bridge
2016-08-04 13:00:38 +02:00
Mitsu
0db1c86db9 Merge pull request #323 from LogMANOriginal/TuxboardBridge
[Tuxboard] remove bridge: website supported by WordPress bridge
2016-08-04 13:00:32 +02:00
logmanoriginal
8cbca68b8a [WikipediaEO] Fix search pattern 2016-08-04 12:57:30 +02:00
logmanoriginal
628e133e96 [Tuxboard] remove bridge: website supported by WordPress bridge 2016-08-04 12:41:22 +02:00
logmanoriginal
f1f67f35d3 [SegfaultMint] remove bridge: website supported by WordPress bridge 2016-08-04 12:39:26 +02:00
logmanoriginal
c113b01f01 [Scilogs] remove bridge: website supported by WordPress bridge 2016-08-04 12:37:29 +02:00
logmanoriginal
6162164bd4 [Reporterre] Fix indentation and remove empty lines 2016-08-04 12:34:40 +02:00
logmanoriginal
d6ff40c527 [Reporterre] Replace relative image paths with absolute URL
Images from their own servers are linked relatively via 'local/...' we
must replace this for images to point to the correct destination.

Also use strip_tags to get rid of iframes
2016-08-04 12:34:19 +02:00
logmanoriginal
0cb66e2194 [Reporterre] Change nested function to member function
This fixes error "Using $this when not in object context"

Nested functions are not part of the object and therefore don't have
access to the object instance $this!
2016-08-04 12:11:10 +02:00
logmanoriginal
2913f86684 [PlanetLibre] Fix indentation and remove empty lines 2016-08-04 12:04:29 +02:00
logmanoriginal
77f326e377 [PlanetLibre] Change nested function to member function
This fixes error "Using $this when not in object context"

Nested functions are not part of the object and therefore don't have
access to the object instance $this!
2016-08-04 12:03:41 +02:00
logmanoriginal
e8473bf95e [OpenTheory] remove bridge: website supported by WordPress bridge 2016-08-04 11:59:44 +02:00
logmanoriginal
f8cb976e2c Add bridge ShanaprojectBridge
This bridge returns a list of anime from the current Season Anime List.
Automatically switches to the next season upon release!
2016-08-04 11:51:12 +02:00
Mitsu
6f248f5973 Merge pull request #322 from LogMANOriginal/NextInpactBridge
Next inpact bridge
2016-08-03 22:58:09 +02:00
Mitsu
9495e830e7 Merge pull request #321 from LogMANOriginal/NiceMatinBridge
Nice matin bridge
2016-08-03 22:58:03 +02:00
Mitsu
0737833c88 Merge pull request #320 from LogMANOriginal/MsnMondeBridge
Msn monde bridge
2016-08-03 22:57:58 +02:00
Mitsu
086dbd5002 Merge pull request #319 from LogMANOriginal/MondeDiploBridge
Monde diplo bridge
2016-08-03 22:57:53 +02:00
Mitsu
6c97b41899 Merge pull request #318 from LogMANOriginal/KoreusBridge
Koreus bridge
2016-08-03 22:57:47 +02:00
Mitsu
2044a34bae Merge pull request #317 from LogMANOriginal/LeJournalDuGeekBridge
Le journal du geek bridge
2016-08-03 22:57:39 +02:00
Mitsu
0241ddb0e8 Merge pull request #316 from LogMANOriginal/MemoLinuxBridge
[MemoLinux] remove bridge: website supported by WordPress bridge
2016-08-03 22:57:33 +02:00
logmanoriginal
ec5cb657aa Fix bridge to work with new layout 2016-08-03 22:39:03 +02:00
Mitsu
0a34fd5a7e Merge pull request #315 from teromene/new-style
Improved style for HtmlFormat.
2016-08-03 22:19:03 +02:00
Teromene
d6e7b75b42 Re-add rss feed link. 2016-08-03 22:01:44 +02:00
Teromene
6ee3165d6f Fix no cursor on show more/show less 2016-08-03 21:54:54 +02:00
logmanoriginal
b889b51a9e Fix indentation and remove empty lines 2016-08-03 21:26:53 +02:00
logmanoriginal
58322137d3 Fix author tag in source ('author' -> 'creator') 2016-08-03 21:26:00 +02:00
logmanoriginal
1afdf9cef7 Change all nested functions to member functions
This fixes error "Using $this when not in object context"

Nested functions are not part of the object and therefore don't have
access to the object instance $this!
2016-08-03 21:19:00 +02:00
logmanoriginal
924e123ba6 Fix indentation and remove empty lines 2016-08-03 21:14:46 +02:00
logmanoriginal
1d58809676 Change nested function MsnMondeExtractContent to member function
This fixes error "Using $this when not in object context"

Nested functions are not part of the object and therefore don't have
access to the object instance $this!
2016-08-03 21:12:43 +02:00
logmanoriginal
86fd1c92ea Fixed bridge to work with new layout 2016-08-03 21:08:35 +02:00
logmanoriginal
67f5fd0860 [MemoLinux] remove bridge: website supported by WordPress bridge 2016-08-03 20:48:34 +02:00
logmanoriginal
47f382ce3f Fix typo 2016-08-03 20:34:30 +02:00
logmanoriginal
da3127e31b Remove all script tags from content 2016-08-03 20:32:26 +02:00
logmanoriginal
83d7f138ed Fix indentation and remove empty lines 2016-08-03 20:14:59 +02:00
logmanoriginal
2a02023c8a Change all nested functions to member functions
This fixes error "Using $this when not in object context"

Nested functions are not part of the object and therefore don't have
access to the object instance $this!
2016-08-03 20:11:25 +02:00
Teromene
1b02330302 Improved style for HtmlFormat. 2016-08-03 20:07:49 +02:00
logmanoriginal
aae4d3efec Fix indentation and remove empty lines 2016-08-03 20:07:33 +02:00
logmanoriginal
a124d4eb43 Change all nested functions to member functions
This fixes error "Using $this when not in object context"

Nested functions are not part of the object and therefore don't have
access to the object instance $this!
2016-08-03 20:05:13 +02:00
Mitsu
6ff73d47bb Merge pull request #311 from LogMANOriginal/DeveloppezDotComBridge
Developpez dot com bridge
2016-08-03 15:37:39 +02:00
Mitsu
a43578c6c6 Merge pull request #312 from LogMANOriginal/FrandroidBridge
[Frandroid] remove bridge: website supported by WordPress bridge
2016-08-03 15:37:32 +02:00
Mitsu
91032bf4fa Merge pull request #314 from LogMANOriginal/GuruMedBridge
Guru med bridge
2016-08-03 15:37:16 +02:00
Mitsu
c36f76be7d Merge pull request #313 from LogMANOriginal/FuturaSciencesBridge
FuturaSciencesBridge
2016-08-03 15:37:09 +02:00
logmanoriginal
b344f50784 Fix indentation and remove empty lines 2016-08-03 14:00:24 +02:00
logmanoriginal
b0dce860f7 Return description from source feed not subsequent pages
Gurumed.org prevents download of pictures from external domains. For a
feed it is sufficient to see a short description of the article as
provided in the source rss.
2016-08-03 13:58:32 +02:00
logmanoriginal
a1a44cd1ff Change all nested functions to member functions
This fixes error "Using $this when not in object context"

Nested functions are not part of the object and therefore don't have
access to the object instance $this!
2016-08-03 13:30:38 +02:00
logmanoriginal
4f9e03f346 Create nested function to receive article or element author
This fixes an error that occurred by attempting to access an object that
did not exist (author).
2016-08-03 13:16:47 +02:00
logmanoriginal
7740dbfcc9 [Frandroid] remove bridge: website supported by WordPress bridge 2016-08-03 12:50:24 +02:00
logmanoriginal
58b3261fbb Fix indentation and remove empty lines 2016-08-03 12:42:57 +02:00
logmanoriginal
7ff901de08 Change all nested functions to member functions
This fixes error "Using $this when not in object context"

Nested functions are not part of the object and therefore don't have
access to the object instance $this!
2016-08-03 12:37:56 +02:00
Mitsu
d3e5711601 Merge pull request #310 from EtienneM/add_scalingo_oneclick
Add scalingo one click deploy
2016-08-03 01:09:12 +02:00
Étienne Michon
e7e2101889 Typo 2016-08-02 23:37:01 +02:00
Étienne Michon
173afb8314 Update readme: Add scalingo one click deploy 2016-08-02 23:32:30 +02:00
Étienne Michon
71d868fd90 Add scalingo.json 2016-08-02 23:26:00 +02:00
Mitsu
8ba8fea263 Merge pull request #309 from teromene/new-style
Further improvement of style
2016-08-02 22:38:51 +02:00
Mitsu
84847bf85f Merge pull request #308 from LogMANOriginal/ElsevierBridge
Elsevier bridge
2016-08-02 22:38:34 +02:00
Teromene
6b7b38db54 Improved new style. 2016-08-02 22:16:43 +02:00
logmanoriginal
a1c680f8e8 Fix indentation and improve code style
- Use tab instead of spaces
- Remove obsolete bridge description at start of the file
- Add spaces at the assignment operator ('=' -> ' = ')
- Remove unnecessary empty lines
2016-08-02 21:40:22 +02:00
logmanoriginal
f783969721 Create member functions to extract information from articles
The extractor function will handle many situations more specifically in
order to provide better results.
2016-08-02 21:35:13 +02:00
logmanoriginal
399fce06ce Require input field, add example value and title
Previously the bridge could be requested without any journal causing
error 403 due to broken URL.
2016-08-02 20:35:27 +02:00
logmanoriginal
8f76eebddb Fix parameters list
Fixes warning: "array_key_exists() expects parameter 2 to be array,
string given in /volume1/web/rss-bridge_dev/lib/HTMLUtils.php on line 59
Warning: Invalid argument supplied for foreach() in
/volume1/web/rss-bridge_dev/lib/HTMLUtils.php on line 64
2016-08-02 20:29:40 +02:00
Mitsu
d3d379bd81 Merge pull request #307 from teromene/new-style
New style for rss-bridge
2016-08-02 20:08:23 +02:00
Teromene
ab4e63b59c New style for rss-bridge 2016-08-02 18:56:12 +02:00
Mitsukarenai
72e457a5b7 [Coindesk] remove bridge: website supported by Wordpress bridge 2016-08-02 17:49:47 +02:00
Mitsukarenai
cd5f3e740a [Wordpress] Add a div class commonly used for post content 2016-08-02 17:48:57 +02:00
Mitsu
3a0675364f Merge pull request #305 from LogMANOriginal/GBAtempBridge
GBAtempBridge
2016-08-02 17:34:08 +02:00
Mitsu
0bb11db536 Merge pull request #304 from LogMANOriginal/DauphineLibereBridge
Dauphine libere bridge
2016-08-02 17:34:02 +02:00
logmanoriginal
f3d3582af1 Change all nested functions to member functions
This fixes error "Using $this when not in object context"

Nested functions are not part of the object and therefore don't have
access to the object instance $this!

This also fixes an error where calling collectData multiple times would
result in an attempt to redeclare all nested functions (which would
cause errors)
2016-08-02 16:20:43 +02:00
logmanoriginal
c8c3e9ef65 Add http-context to simulate Mozilla user-agent
This fixes "Warning: file_get_contents(http://www.ledauphine.com/rss):
failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden"
2016-08-02 15:57:01 +02:00
Mitsukarenai
3cc262443c [Maliki] Removed because uses WP now 2016-08-02 15:46:52 +02:00
Mitsukarenai
0f3ca30caa [WordPress] bridge rewrite 2016-08-02 15:46:21 +02:00
logmanoriginal
4420906a7a Fix indentation and remove unnecessary lines 2016-08-02 15:40:07 +02:00
logmanoriginal
0631e9d835 Make ExtractContent a member function
This fixes error "Using $this when not in object context"

Nested functions are not part of the object and therefore don't have
access to the object instance $this!
2016-08-02 15:32:22 +02:00
Mitsu
0052f25d2a Merge pull request #303 from LogMANOriginal/CommonDreamsBridge
CommonDreamsBridge
2016-08-02 15:16:43 +02:00
logmanoriginal
cb7d477310 Fix indentation and remove unnecessary lines 2016-08-02 14:43:59 +02:00
logmanoriginal
5fb27b2aa6 Make CommonDreamsExtractContent member function
This fixes error "Using $this when not in object context"

Nested functions are not part of the object and therefore don't have
access to the object instance $this!
2016-08-02 14:41:54 +02:00
Mitsukarenai
c75622135e [DailymotionBridge] fix 2016-08-02 14:24:54 +02:00
Mitsu
cb84635e2d Merge pull request #296 from kranack/dev-flickr
Update Flickr Bridge
2016-08-02 14:21:54 +02:00
Mitsu
9af011cee1 Merge pull request #298 from prysme01/master
very basic support of ArsTechnica
2016-08-02 14:21:35 +02:00
Mitsu
dfa6dc33aa Merge pull request #302 from LogMANOriginal/CADBridge
Cad bridge
2016-08-02 14:21:20 +02:00
Mitsu
b3a3328600 Merge pull request #301 from teromene/coindesk-fix
Fix CoinDeskBridge
2016-08-02 14:21:14 +02:00
logmanoriginal
a32044893a Replace if-statements with switch statement
The previous implementation would fail if $htmlpart[3] was neither 'cad'
nor 'sillies'. Now the default text will be returned.
2016-08-02 14:14:29 +02:00
Teromene
ea4586d8b3 Fix CoinDeskBridge 2016-08-02 14:11:28 +02:00
logmanoriginal
d0c932c149 Handle failing requests
Disabling https support results in a failed request which is now handled
as if there is no data at all.
2016-08-02 14:07:40 +02:00
Mitsu
099a421d8b Merge pull request #300 from teromene/gitlab-fix
Fix GitlabCommitsBridge.
2016-08-02 13:48:29 +02:00
Teromene
fa7a053c65 Fix GitlabCommitsBridge. 2016-08-02 13:45:12 +02:00
logmanoriginal
01bdda5e19 Fix indentation and remove unnecessary lines 2016-08-02 13:37:18 +02:00
logmanoriginal
1e33b7c2ec Make CADExtractContent a member function
This fixes error "Using $this when not in object context"

Nested functions are not part of the object and therefore don't have
access to the object instance $this!
2016-08-02 13:25:49 +02:00
Mitsu
a84f11aed8 Merge pull request #299 from LogMANOriginal/BastaBridge
Basta bridge
2016-08-02 12:40:17 +02:00
logmanoriginal
4a001f3594 Replace relative image paths with absolute URL
Images from their own servers are linked relatively via 'local/...' we
must replace this for images to point to the correct destination.
2016-08-02 12:27:44 +02:00
logmanoriginal
5189741c7b Fix tag name for timestamp 2016-08-02 11:31:17 +02:00
logmanoriginal
371a52e2b9 Fix indentation and remove unnecessary lines 2016-08-02 11:28:11 +02:00
logmanoriginal
9d41c83c02 Remove nested function BastaExtractContent
This fixes error "Using $this when not in object context"

The nested function BastaExtractContent was attempting to access $this
even though the function is declared as nested function within a class
function and not as a class function itself. Thus BastaExtractContent
had no access to the object instance $this.
2016-08-02 11:24:24 +02:00
prysme01
e3cf486ac5 Better tag handling 2016-08-01 16:16:18 +02:00
prysme01
b37877bc74 very basic support of ArsTechnica 2016-08-01 15:18:32 +02:00
Mitsukarenai
fb595484b5 Remove duplicate: FuturaSciencesw 2016-08-01 02:06:59 +02:00
Mitsu
81b6238ee4 Merge pull request #295 from kranack/dev-sc
Add Sens Critique Bridge
2016-08-01 01:02:43 +02:00
Damien Calesse
d60a822bc2 Update Flickr Bridge
Fix the bridge (Flickr update?)

I get the pictures titles with the API (slowing down the bridge). If you
have any suggestions to replace them, feel free to change it.
2016-07-30 19:24:06 +02:00
Damien Calesse
9b579c7cd4 Change Cache Duration
Up to 6 hours
2016-07-30 18:19:36 +02:00
Damien Calesse
74b6dd37f9 Add Sens Critique Bridge
Get the movies, series, video games, books and musics news.
2016-07-30 16:16:02 +02:00
Mitsu
a5b8c8d422 Merge pull request #294 from Frenzie/master
RTBFBridge: exclude "À voir aussi"
2016-07-29 12:49:53 +02:00
Frans de Jonge
f72cde7fa1 RTBFBridge: exclude "À voir aussi" 2016-07-29 08:23:03 +02:00
Mitsu
8831ad068e Merge pull request #293 from ORelio/master
Add Nextgov & TheHackerNews, ZDNet insert img in article.
2016-07-26 22:07:34 +02:00
ORelio
48883a9cc4 [TheHackerNews] New bridge. Security news. 2016-07-26 21:20:43 +02:00
ORelio
dfc4e8aaac [Nextgov] New bridge. USA tech news. 2016-07-26 21:20:13 +02:00
ORelio
80651273b3 [ZDNet] Auto-insert image 2016-07-26 21:19:39 +02:00
Mitsu
400305f9d3 Merge pull request #291 from teromene/pmaziere-GithubIssuesBridge
[GithubIssueBridge] fix parameters
2016-07-25 13:29:30 +02:00
Pierre Mazière
94289511e1 [GithubIssueBridge] fix parameters
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-07-25 12:40:43 +02:00
Mitsu
a9e6f5514e Merge pull request #290 from ORelio/master
[Numerama] Fix the fix by inlining subfunction
2016-07-19 20:50:06 +02:00
ORelio
3a69573b27 [Numerama] Fix the fix by inlinig subfunction
Tested, this time ^^"
+ change errcodes from 404 to 500
2016-07-19 20:12:06 +02:00
Mitsu
0454fcc780 Merge pull request #289 from ORelio/master
Numerama fixes & add 2 bridges
2016-07-19 20:00:35 +02:00
ORelio
c6190514c4 [ZDNet] New bridge, Tech News. 2016-07-19 19:38:42 +02:00
ORelio
d5eb53ecd2 [WeLiveSecurity] New bridge, Security News. 2016-07-19 19:38:02 +02:00
ORelio
2f3bddb291 [Numerama] Use proxied file_get_html 2016-07-19 19:37:06 +02:00
ORelio
0e27a6ebab [Numerama] Coding style: reindent code 2016-07-19 19:35:43 +02:00
Mitsukarenai
95acb218b4 NumeramaBridge: uncaught error fix issue #287 2016-07-18 20:57:27 +02:00
Mitsu
b0892fdb70 Merge pull request #286 from ORelio/master
Improve 411, Add EstCeQuonMetEnProd
2016-07-17 15:36:49 +02:00
ORelio
6abca16f06 [EstCeQuonMetEnProd] Add EstCeQuonMetEnProd Bridge
Should we put a website in production today?
2016-07-17 14:40:10 +02:00
ORelio
5353697e67 [T411] Cleanup advertisments 2016-07-17 14:39:14 +02:00
Mitsu
980075c8f9 Merge pull request #285 from teromene/pmaziere-TwitterBridgeFix
TwitterBridge*: fix HTML entities in title
2016-07-14 20:40:20 +02:00
Pierre Mazière
f05bd15393 TwitterBridge*: fix HTML entities in title
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-07-08 16:11:57 +02:00
Mitsu
4b179144c1 Merge pull request #278 from teromene/peetah-LWNprevBridge
Pull request from pmaziere - LWNprevBridge
2016-06-26 16:31:37 +02:00
Mitsu
5a60f892eb Merge pull request #279 from teromene/pmaziere-GithubIssuesBridge
Pull request from pmaziere - GithubIssuesBridge
2016-06-26 16:31:30 +02:00
Mitsu
9519cc24ab Merge pull request #280 from teromene/pmaziere-GitlabCommitsBridge
Pull request from pmaziere - GitlabCommitsBridge
2016-06-26 16:31:24 +02:00
Mitsu
90ae96efe9 Merge pull request #281 from teromene/pmaziere-ElsevierBridge
Pull request from pmaziere - ElsevierBridge
2016-06-26 16:31:18 +02:00
Mitsu
b013845a5d Merge pull request #282 from teromene/pmaziere-StripeAPIChangeLogBridge
Pull request from pmaziere - StripeAPIChangeLogBridge
2016-06-26 16:31:12 +02:00
Mitsu
66c79e4b67 Merge pull request #283 from teromene/pmaziere-YoutubeBridgeFix
Pull request from pmaziere - Fix encoding in YoutubeBridge.
2016-06-26 16:31:06 +02:00
Mitsu
f6cbb5c7ce Merge pull request #284 from teromene/pmaziere-cleanerProxy
Pull request from pmaziere - Cleaner proxying system
2016-06-26 16:30:58 +02:00
Pierre Mazière
26a9ffa5eb fix copy/paste
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-06-26 12:23:13 +02:00
Pierre Mazière
ca44ab943a simplify commits detection
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-06-26 12:23:13 +02:00
Pierre Mazière
615df56b19 fix inconsistent use of simple and double quotes
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-06-26 12:23:13 +02:00
Pierre Mazière
c929010f6e new bridge GitlabCommits
some gitlab instances do not enable RSS feed for project commits

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-06-26 12:23:13 +02:00
Pierre Mazière
e03a7de15f fix missing quotes
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-06-26 11:53:44 +02:00
Pierre Mazière
d45c6be3c5 add new bridge: Elsevier journals recent articles
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-06-26 11:52:54 +02:00
Pierre Mazière
aa96c6b1d2 fix malformed JSON
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-06-26 11:28:41 +02:00
Pierre Mazière
d73bfbab63 do not use advanced_file_get_contents
as it should not exist in the first place

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-06-26 11:18:23 +02:00
Pierre Mazière
78b4500ba4 fix indentation
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-06-26 11:17:12 +02:00
Pierre Mazière
3922b9534c new bridge: Github Issue
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-06-26 00:33:27 +02:00
Pierre Mazière
1f85a2294d remove empty brackets from title
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-06-25 23:22:17 +02:00
Pierre Mazière
dc6928316b add bridge for LWN Free Weekly Edition
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-06-25 23:22:11 +02:00
Pierre Mazière
06f8b61f62 fix encoding issues
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-06-25 23:19:22 +02:00
Pierre Mazière
955eecc299 use BridgeAbstract::file_get_html in all bridges
instead of simple_html_dom function file_get_html

Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-06-25 23:17:42 +02:00
Pierre Mazière
36d39d3f59 implement proxy feature without modifying simple_html_dom code
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-06-25 23:14:27 +02:00
Pierre Mazière
fdd8d0cd04 new bridge: StripeAPIChangeLog
Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
2016-06-25 23:11:58 +02:00
Mitsu
040f4da73d Merge pull request #274 from teromene/rue89
Fix Rue89Bridge
2016-06-25 13:27:37 +02:00
Mitsu
d27929668f Merge pull request #276 from ORelio/master
[JapanExpo] Allow fetching full content
2016-06-25 13:27:29 +02:00
ORelio
b707a29b7e [JapanExpo] Allow fetching full content
Current bridge only allows titles.
Add a setting for fetching full content.
2016-06-25 12:14:37 +02:00
Teromene
7c62bf070b Fix Rue89Bridge 2016-06-21 22:33:51 +01:00
Mitsu
d624d0de92 Merge pull request #270 from ORelio/master
Update Facebook, add Debug whitelist ability
2016-06-18 14:08:25 +02:00
Mitsu
c0e82017bd Merge pull request #268 from Frenzie/master
WikipediaFRBridge: also support .AdQ lire la suite link
2016-06-18 14:08:03 +02:00
ORelio
a63773178a [Core] Allow IP whitelisting for debug mode
...Because we are never cautious enough
while debugging a live rss-bridge instance.
2016-06-12 22:12:49 +02:00
ORelio
96de64af63 [Facebook] Update field retrieval
Due to changes on their side.
Related issue: #253
2016-06-12 22:10:59 +02:00
Frans de Jonge
83adf25c56 WikipediaFRBridge: also support .AdQ lire la suite link 2016-06-10 15:32:58 +02:00
Mitsu
feb34c9eb1 Merge pull request #263 from ORelio/master
[Dilbert] Update field retrieval
2016-06-04 22:23:33 +02:00
Mitsu
973f0ba8d8 Merge pull request #267 from Frenzie/master
Use "Lire la suite" link for extracting link and title
2016-06-04 22:23:26 +02:00
Frans de Jonge
f64664a83c Use "Lire la suite" link for extracting link and title
This makes detection more dependable, because if there's no illustrating image there may not be a first paragraph.
2016-06-04 09:05:13 +02:00
Mitsu
ce6f7478f0 Merge pull request #265 from Albirew/patch-1
Added Bridge for Novel Updates
2016-05-21 19:13:51 +02:00
Albirew
0a35003237 Added Bridge for Novel Updates
contain dirty fix to bypass simpledom bug, see issue #259 for details
2016-05-21 18:27:30 +02:00
Mitsu
8461c66582 Merge pull request #264 from Frenzie/master
YoutubeBridge: fix playlist mode and titles
2016-05-21 13:25:12 +02:00
Frans de Jonge
24a312a158 YoutubeBridge: fix playlist mode and titles 2016-05-21 11:45:09 +02:00
ORelio
8a00c9d407 [Dilbert] Update field retrieval 2016-05-20 21:34:47 +02:00
Mitsu
a04d7ba8eb Merge pull request #262 from Frenzie/master
CollegeDeFranceBridge: fix typo in date fallback
2016-05-20 17:43:20 +02:00
Frans de Jonge
ba400d561e CollegeDeFranceBridge: fix typo in date fallback 2016-05-20 11:38:59 +02:00
Mitsu
f72d78d84b Merge pull request #258 from Albirew/patch-1
Added Bridge for Hentai Haven (NSFW)
2016-05-17 20:03:58 +02:00
Albirew
f5a1af4a85 Added Bridge for Hentai Haven (NSFW)
Well, you know... For these times of "need"...
2016-05-17 19:06:15 +02:00
Mitsu
269e6494ed Merge pull request #256 from Frenzie/master
Fixed ColledgeDeFrance timezone and a small time parsing issue
2016-05-16 19:34:44 +02:00
Mitsu
5a2fbd94b2 Merge pull request #257 from Albirew/patch-1
changed TLD .se -> .org
2016-05-16 19:34:11 +02:00
Albirew
a6e403f48d changed TLD .se -> .org
http://betanews.com/2016/05/15/pirate-bay-domains-seized/
And the game of the cat and the mouse continue...
2016-05-16 15:53:54 +02:00
Frans de Jonge
ac675acf50 Fixed ColledgeDeFrance timezone and a small time parsing issue 2016-05-14 22:02:33 +02:00
Mitsu
f9389cf7be Merge pull request #255 from Frenzie/master
Added RTBF bridge
2016-05-10 13:59:19 +02:00
Frans de Jonge
02bdc1dfbe Added RTBF bridge 2016-05-10 13:23:43 +02:00
Mitsu
346a741424 Merge pull request #254 from ORelio/master
YouTube rewrite, Add NakedSecurity
2016-05-04 08:43:03 +02:00
ORelio
ca04246eb0 [YouTube] Code refactoring, add XML API support
- Factorize common code into functions
 - Add support for XML API for user an channel
 - HTML parser is kept as fallback when XML does not work
 - XML API works even if IP is blocked, partially fixes #193
2016-05-03 23:45:32 +02:00
ORelio
5d87f1f8ef [NakedSecurity] Add Naked Security Bridge
Security news blog by Sophos.
2016-05-03 23:42:38 +02:00
Mitsu
6a768b4dfc Merge pull request #252 from wtuuju/master
categories added + fixed html entities
2016-05-02 12:40:34 +02:00
wtuuju
796c14758f categories added + fixed html entities 2016-05-02 10:30:13 +02:00
wtuuju
642e4173d1 categories added 2016-05-02 00:55:22 +02:00
Mitsu
832c503278 Merge pull request #250 from teromene/youtube-fix
Fix the doubled HTTPS.
2016-05-01 20:59:12 +02:00
Mitsu
b1cb8e9b6e Merge pull request #249 from teromene/master
LeBonCoinBridge fixed.
2016-05-01 20:58:52 +02:00
Mitsu
bfaade37ab Merge pull request #248 from Frenzie/master
Fix up CollegeDeFranceBridge
2016-05-01 20:58:41 +02:00
Teromene
cd5d8b8953 Another HTTPS in double removed. 2016-05-01 17:26:43 +01:00
Teromene
382ef28abe Fix the doubled HTTPS. 2016-05-01 17:24:24 +01:00
Teromene
88a78b5666 LeBonCoinBridge fixed. 2016-05-01 16:57:40 +01:00
Frans de Jonge
de4952d31f Fix up CollegeDeFranceBridge
The site changed.
2016-05-01 12:39:48 +02:00
Mitsu
99b7d2e6b4 Merge pull request #241 from LogMANOriginal/FacebookBridge
[Facebook] Select page content one level further down
2016-04-14 08:26:58 +02:00
Mitsu
75a6a8ee5c Merge pull request #242 from corenting/master
Added bridge for Elite: Dangerous Galnet
2016-04-14 08:26:43 +02:00
Mitsu
2c08c92dfe Merge pull request #243 from Riduidel/Les400Culs_2
Les400 culs 2
2016-04-14 08:26:17 +02:00
unknown
3d4e3679ad Once again, SimpleXMLElement strikes and makes sure the feed can't be used. So I fix it ... again 2016-04-13 21:22:09 +02:00
corenting
421c47d9ed Added bridge for Elite: Dangerous Galnet 2016-04-06 15:13:09 +01:00
logmanoriginal
3288328ff7 [Facebook] Update date in loadMetadatas 2016-03-31 11:45:35 +02:00
logmanoriginal
e62c6af62e [Facebook] Select page content one level further down
This fixes loading issues where feeds appeared empty.
2016-03-31 11:33:38 +02:00
unknown
ff63a5ad95 Merge branch 'master' of github.com:sebsauvage/rss-bridge into live 2016-03-29 08:42:55 +02:00
Mitsu
d2d0f94e18 Merge pull request #237 from AmauryCarrade/feature-lichess-bridge
Lichess blog bridge
2016-03-28 22:48:08 +02:00
Mitsu
dca001dffc Merge pull request #240 from Riduidel/Freenews_v_2.0
Encore ce fameux problème de SimpleXMLElement
2016-03-28 22:47:51 +02:00
Mitsu
3bf8e98e3c Merge pull request #239 from Riduidel/TheOatMeal_v_2.0
Fix pour TheOatMeal qui a changé l'organisation des pages
2016-03-28 22:47:41 +02:00
unknown
8e7dd0f4da Merge branch 'Freenews_v_2.0' into live 2016-03-28 20:10:32 +02:00
unknown
a46ce5070e Encore ce fameux problème de SimpleXMLElement 2016-03-28 20:10:18 +02:00
unknown
7235704a2b Fix pour TheOatMeal qui a changé l'organisation des pages 2016-03-28 18:54:27 +02:00
Amaury Carrade
df39c8c18f Added Lichess blog bridge 2016-03-22 22:51:55 +01:00
Mitsukarenai
3318e66cbc Add info about debug mode in README 2016-03-20 16:54:05 +01:00
Mitsu
599e36a9ac Merge pull request #235 from ORelio/master
Add 2 bridges, Update t411, CNET
2016-03-20 16:45:40 +01:00
Mitsu
7f65085b84 Merge pull request #236 from ckiw/master
Add Vine.co bridge :)
2016-03-20 16:45:19 +01:00
Mitsu
b2f42144f8 Merge pull request #233 from teromene/master
Added an URL option to activate debug :
2016-03-20 16:44:12 +01:00
ORelio
0ff3cf0e0b [FS] Add FuturaSciences
RSS expander for all the feeds provided by Futura-Sciences.
2016-03-20 15:59:32 +01:00
ORelio
e11123775a [ZT] Add ZoneTelechargement
This is merely a proxy for fetching existing feeds.
(Some feed readers weren't able to fetch their RSS feeds)
2016-03-20 15:57:40 +01:00
Teromene
d7f079e66b Modified the debug system to use a file as a trigger instead of a URL parameter.
Modified the gitignore accordingly.
2016-03-17 14:36:33 +00:00
ORelio
c2769c8999 [CNET] Fix content extraction 2016-03-16 19:51:54 +01:00
alexis
c13dd8c18a Add Vine.co bridge :) 2016-03-12 16:50:45 +01:00
ORelio
9df5913d6b [T411] Use torrent id as permalink
This way links are not broken if the torrent is renamed.
2016-03-06 19:03:43 +01:00
teromene@teromene.fr
3e8a7624e1 Added an URL option to activate debug : debug activates all messages, and disables the cache. 2016-03-03 15:26:07 +00:00
Mitsu
084eb4c9f4 Merge pull request #231 from teromene/master
Corrected CourrierInternationalBridge
2016-03-02 13:20:58 +01:00
Mitsu
333d8d0c30 Merge pull request #232 from kranack/master
Fix BandCamp image display
2016-03-02 13:20:37 +01:00
Damien Calesse
386f0ca379 Fix BandCamp image display 2016-03-02 13:14:22 +01:00
teromene@teromene.fr
05c2e2aa20 Corrected CourrierInternationalBridge 2016-03-02 11:49:27 +00:00
Mitsu
9553505bdd Merge pull request #229 from Ahiles3005/master
new bridge fix bug
2016-03-01 19:16:28 +01:00
ahiles3005
54e912805e add: Bridge for Russian popular social network.Vkontakte or simply VK 2016-03-01 21:10:46 +04:00
ahiles3005
5f35988a18 Revert "add: Bridge for Russian popular social network.Vkontakte or simply VK"
This reverts commit ffa1ea8f0f.
2016-03-01 21:08:33 +04:00
ahiles3005
ffa1ea8f0f add: Bridge for Russian popular social network.Vkontakte or simply VK 2016-03-01 21:06:08 +04:00
ahiles3005
1d44dafdef Merge origin/master 2016-03-01 20:48:51 +04:00
ahiles3005
4fac0e382c bug fix: After adding a new bridge, it is not loaded because it was removed from the list of action 2016-03-01 20:39:09 +04:00
Mitsu
d18055720a Merge pull request #227 from Albirew/patch-1
Alternative for g.etfv.co favicon services
2016-02-28 11:50:33 +01:00
Albirew
b0c15c3377 Alternative for g.etfv.co favicon services
g.etfv.co favicon services seems to be down since some time
I replaced it with another open source project: besticon
sauce: https://github.com/mat/besticon
2016-02-28 11:25:56 +01:00
ORelio
641d5880c7 [T411] Domain name change
T411 changeid their domain name to t411.ch
2016-02-27 12:56:48 +01:00
Mitsu
937ef6b979 Merge pull request #226 from aledeg/youtube-bridge
Update youtube bridge
2016-02-27 09:17:41 +01:00
Alexis Degrugillier
d0defc6283 Update youtube bridge
Before, the channel id was supposed to be a number. But Youtube changed how they store a
channel id. It's no longer a number, it's a string.
Now, user can enter a text string instead of a number.

See the example with this channel id: UC9fGq2-6FaftcegcIadLf6A
2016-02-27 08:36:14 +01:00
Mitsu
21ed355343 Merge pull request #224 from teromene/master
AcrimedBridge update
2016-02-26 19:50:35 +01:00
Teromene
d92dc71fae Fixed cache time. 2016-02-26 18:42:52 +00:00
Teromene
e064b5fe28 Corrected no content in AcrimedBridge, modified to make it use RSS-Expander. 2016-02-26 18:41:35 +00:00
Mitsu
ef46bddbc9 Merge pull request #223 from teromene/master
Modified HTMLUtils, corrected few bugs.
2016-02-26 19:39:11 +01:00
Teromene
1c1bcc20ff Changed the antiselector to be less likely to happen. 2016-02-26 18:31:53 +00:00
Teromene
036ea43e4f Modified HTMLUtils, corrected few bugs. 2016-02-26 18:17:48 +00:00
Mitsu
8f6b5f5731 Merge pull request #222 from teromene/master
Correct PinterestBrige search
2016-02-26 19:12:29 +01:00
Teromene
04ec53010c Corrected cache time. 2016-02-26 15:10:26 +00:00
Teromene
f09dedf16b Corrected PinterestBridge. 2016-02-26 14:58:03 +00:00
Mitsu
ca2951df30 Merge pull request #220 from Ahiles3005/master
update for issue #192
2016-02-21 13:22:05 +01:00
ahiles3005
4c241a1319 update for issue #192 2016-02-21 14:23:58 +04:00
ahiles3005
ab2492f292 update for issue #192 2016-02-21 14:17:45 +04:00
Mitsu
36735e7c5a Merge pull request #214 from kranack/master
Update SoundCloud Bridge - Display username in title
2016-02-21 01:13:38 +01:00
Mitsu
2a621f1506 Merge pull request #218 from teromene/master
Pretty-printing the output of JsonFormat.
2016-02-21 01:13:20 +01:00
Mitsu
11336bc109 Merge pull request #219 from ORelio/master
Improve Dilbert, Add GBAtemp
2016-02-21 01:08:00 +01:00
ORelio
0071a9fe2c Merge remote-tracking branch 'upstream/master' 2016-02-20 14:58:19 +01:00
ORelio
84356487e9 [GBAtemp] Add GBAtemp Bridge 2016-02-20 14:56:17 +01:00
teromene@teromene.fr
26e02ef3b6 Pretty-printing the output of JsonFormat. 2016-02-19 16:15:06 +00:00
Damien Calesse
834f959b76 Update SoundCloud Bridge - Display username in title 2016-02-16 12:33:35 +01:00
ORelio
dd0be3f4db [Dilbert] Improve metadata extraction 2016-02-14 13:43:58 +01:00
Mitsu
9153071a0e Merge pull request #210 from teromene/master
Add the possibility to have global parameters
2016-02-13 15:15:00 +01:00
Mitsu
b7fa3188ac Merge pull request #212 from ORelio/master
Update T411, CNET, LeMondeInformatique, Add 9èmeArt
2016-02-13 15:14:35 +01:00
ORelio
54812d626e Merge remote-tracking branch 'upstream/master' 2016-02-13 14:15:10 +01:00
ORelio
4ccd1b84e5 [AnimeUltime] Simple tab/space fix in source file
Don't have anything against tabs but let's keep concistent at least
on a per-file scope - this simlply replaces tabs with spaces as
this file is using spaces for code indentation.
2016-02-13 14:03:32 +01:00
ORelio
91fe6c4acc [t411] Increase item limit
On searches for popular keywords, a feed reader not reading the feed often
enough can miss items (ie more than 5 items were added since last fetch)
so this change increases the limit from 5 items to 10 items, and retrieves
pages faster to compensate (500ms seems enough for not spamming t411).
2016-02-13 14:01:24 +01:00
ORelio
bba6a0b5c2 [9emeArt] Add NeuviemeArtBridge 2016-02-13 13:52:28 +01:00
ORelio
a9c40e98c4 [CNET] Improve script removal 2016-02-13 13:52:07 +01:00
teromene@teromene.fr
705b266c28 Updated the documentation. 2016-02-11 15:30:10 +00:00
teromene@teromene.fr
f8b9470622 Added the possibility to use a global array parameter, that is going to be displayed for every parameter count. 2016-02-11 15:24:40 +00:00
ORelio
e1b7ffdc81 [T411] Change encoding to UTF-8
- Stop encoding to UTF-8, their website is now natively in UTF-8
 - More error handling
2016-02-03 20:37:14 +01:00
ORelio
47dd6c3b03 [LeMondeInformatique] fix title stripping
Title wasn't properly stripped due to changes on their website.
2016-02-03 20:36:20 +01:00
Mitsu
541ba9116a Merge pull request #207 from mxmehl/master
Add another improved Twitter Bridge
2016-01-30 16:17:46 +01:00
Mitsu
4bd04a1023 Merge pull request #208 from regisenguehard/master
Ajout LinkedIn & Viadeo
2016-01-30 01:32:37 +01:00
Régis Enguehard
a58cc65957 Merge remote-tracking branch 'origin/master' 2016-01-29 11:28:10 +01:00
Régis Enguehard
65a9c2b0bc maj LinkedIn & Viadeo 2016-01-29 11:23:42 +01:00
Régis Enguehard
f837032afb Ajout d'un pont vers Viadeo et LinkedLn 2016-01-29 11:23:41 +01:00
mxmehl
651f5ac94f add another improved Twitter Bridge 2016-01-27 11:44:28 +01:00
Mitsu
abce3186d4 Merge pull request #205 from ORelio/master
Facebook captcha proxy & fix CNET bridge
2016-01-26 21:19:51 +01:00
Mitsu
787de0360c Merge pull request #199 from Ginko-Aloe/patch-1
urlencode keyword parameter
2016-01-26 21:17:47 +01:00
Mitsu
57de433553 Merge pull request #206 from lagaisse/CpasbienBridge
Change url again & constant factorization
2016-01-26 21:08:36 +01:00
Kevin Lagaisse
445568db27 Change url again & constant factorization 2016-01-26 18:39:05 +01:00
ORelio
d16d514736 [Facebook] Capcha retrieval and response submit
This does not solve the captcha issue but allows the viewer to manually
solve the captcha by displaying a form and using the response from the
viewer. Maybe a first step to automated captcha solving?

This process relies on the use of a PHP session for storing captcha
details so that the user cannot submit anything else than the response
to the captcha. Response is filtered before being forwarded, also. Once
captcha is solved we get a page ready to be parsed, as usual.

Combined to some kind of OCR, this could automatically solve the
captcha, but currently if only automates the process of retrieving the
challenge and submitting the response.
2016-01-23 21:53:25 +01:00
ORelio
1e998ab6dd [CNET] Update HTML parsing to reflect changes
HTML parsing wasn't working anymore due to changes on CNET's website.
2016-01-23 21:45:22 +01:00
Mitsu
c375384fba Merge pull request #204 from LogMANOriginal/MangareaderBridge
New Bridge: MangareaderBridge
2016-01-22 22:37:41 +01:00
logmanoriginal
e2043574f2 Remove content duplication 2016-01-22 20:14:03 +01:00
logmanoriginal
d1fe87651d Add items in reverse order (add to front) for correct ordering 2016-01-22 19:34:19 +01:00
logmanoriginal
182dcbec60 Encode special chars for feeds to work properly 2016-01-22 19:30:45 +01:00
logmanoriginal
621c7af6b7 Add title to inputs and improve descriptions 2016-01-21 21:49:23 +01:00
logmanoriginal
b5c7566b7a Merge branch 'master' into MangareaderBridge 2016-01-21 21:20:17 +01:00
Mitsu
4ffe329089 Merge pull request #203 from polo2ro/fixencoding
Fix notices and broken encoding in rss output from cache
2016-01-21 21:10:19 +01:00
Paul de Rosanbo
e59bf64c42 Fix cache bug, the content of the cache was encoded in utf8 before
converting to json and saved, resulting in double-encoded caracters in
output
2016-01-21 14:33:58 +01:00
Paul de Rosanbo
f22b4b33df Fix notice about undefined variable 2016-01-21 14:33:49 +01:00
logmanoriginal
4422024cfd Add new option to get popular updates 2016-01-20 22:01:45 +01:00
Mitsu
cfac9e72f2 Merge pull request #202 from LogMANOriginal/InputTooltip
Customizable tooltip for input parameter
2016-01-20 21:59:17 +01:00
logmanoriginal
a73807130a Reduce parameter name to bare minimum 2016-01-20 20:56:09 +01:00
logmanoriginal
170818a625 Return entire chapter name as item title 2016-01-20 20:53:32 +01:00
logmanoriginal
58e828e69a Add optional parameter 'title' to the readme 2016-01-20 19:41:40 +01:00
logmanoriginal
8db5dde69d Add new parameter 'title' to guide the user
The 'title' attribute will render as tooltip in the browser which is
useful to provide guidance to the operator.
2016-01-20 19:41:39 +01:00
Mitsu
48b53b7c03 Merge pull request #200 from Ginko-Aloe/master
Create JapanExpoBridge.php
2016-01-19 21:54:28 +01:00
logmanoriginal
0e1b84263e Return items starting at the end, not the beginning when working with limits 2016-01-19 21:41:14 +01:00
logmanoriginal
2e4e0077a8 Move date information into a time tag 2016-01-19 21:36:41 +01:00
Ginko-Aloe
195ba94115 Create JapanExpoBridge.php 2016-01-19 19:20:21 +01:00
Ginko-Aloe
438a389286 urlencode keyword parameter
in order to handle non-trivial request keywords
2016-01-19 18:04:35 +01:00
Mitsu
33c6495333 Merge pull request #194 from Albirew/patch-1
TPB changed domain (again)
2016-01-19 13:48:35 +01:00
Mitsu
79a610ea69 Merge pull request #195 from LogMANOriginal/TwitchApiBridge
Clarify meaning of Broadcasts option in TwitchApiBridge
2016-01-19 13:48:30 +01:00
Mitsu
31177912e0 Merge pull request #198 from teromene/rss-bridge-enclosures
Rss bridge enclosures
2016-01-19 13:45:23 +01:00
Mitsu
2458e369c4 Merge pull request #197 from teromene/new-attribute-system
Re-encode datas before saving
2016-01-19 13:44:14 +01:00
Teromene
4deefdfd7d Add enclosures support, see example in DemoBridge. 2016-01-19 12:34:38 +00:00
Teromene
e7595391cd Ignore emacs save files. 2016-01-19 12:34:21 +00:00
Teromene
259e5ef9de Casting to UTF-8 before converting to JSON. 2016-01-19 12:18:54 +00:00
Teromene
5f01b7fe7d Added a function to re-encode everything to UTF-8 2016-01-19 12:17:27 +00:00
Teromene
379c89045b Quoted the "r" and "k" in the parameters 2016-01-19 12:15:16 +00:00
logmanoriginal
e6f388d6e4 Add new option to receive chapter updates for one specific manga 2016-01-16 16:30:29 +01:00
Albirew
6deebb56a5 changed TLD .ms -> .se
On continue le jeu du chat et de la souris =)
2016-01-15 18:20:30 +01:00
logmanoriginal
ff9c60f53c Use '/latest' instead of the main page to reduce loading time 2016-01-10 09:46:35 +01:00
logmanoriginal
2aba815b55 Implement new Bridge to mangareader.net
This Bridge returns information about the last updates on mangareader.net
2016-01-10 00:00:16 +01:00
logmanoriginal
29481c73c1 Clarify meaning of Broadcasts option
Twitch returns Broadcasts when set to true, highlights otherwise. See also:
https://github.com/justintv/Twitch-API/blob/master/v3_resources/videos.md#get-channelschannelvideos
2016-01-09 21:00:30 +01:00
Albirew
7e91186c6c TPB changed domain (again)
TPB added .ms TLD and on the fly, .vg got down.
PS: .se TLD still exist.
2016-01-09 10:23:19 +01:00
Mitsu
15021ebd78 Merge pull request #190 from ORelio/master
[T411] Use search instead of RSS
2015-12-24 02:17:44 +01:00
Mitsu
ac284f3ea4 Merge pull request #191 from Polopollo/arte-desactivate-links
Desactivate auto play for Arte's links
2015-12-24 02:17:21 +01:00
Paul Vayssiere
d885897c40 Desactivate auto play for Arte's links
No need to use my bandwidth and processor if I just want to look at
more description
2015-12-23 13:33:50 -08:00
Régis Enguehard
e4d31c3294 maj LinkedIn & Viadeo 2015-12-23 16:42:27 +01:00
Régis Enguehard
5ada7afcd1 Ajout d'un pont vers Viadeo et LinkedLn 2015-12-22 18:03:46 +01:00
ORelio
47a79f821a [T411] Use search instead of RSS
Search isn't as severely rate limited as RSS
Search can enforce sorting to most recent entries
Bonus: Use a lower cache duration (1h instead of 3h)
2015-12-17 22:31:12 +01:00
Mitsu
6a2c92a389 Merge pull request #186 from snroki/FierPandaBridge
Added a bridge for fier-panda.fr
2015-12-11 13:30:58 +01:00
nkania
7d03d72708 Added a bridge for fier-panda.fr 2015-12-11 11:51:35 +01:00
Mitsukarenai
9c8f552a2a Remove duplicate cache purge - issue #183 2015-12-06 19:01:56 +01:00
Mitsu
e5f887ec1c Merge pull request #182 from teromene/new-attribute-system
Update HTMLUtills
2015-12-06 19:00:06 +01:00
Teromene
55d4c6e425 Merge https://github.com/sebsauvage/rss-bridge into new-attribute-system 2015-12-06 17:49:41 +00:00
Teromene
9090c2e470 Changed HTMLUtils to be usable with php < 5.6 2015-12-06 17:47:20 +00:00
Mitsukarenai
4c86f38306 disabling incompatibilities issue #181 2015-12-06 17:03:31 +01:00
Mitsukarenai
b8ec283458 fucked up merge >< 2015-12-06 16:40:13 +01:00
Mitsukarenai
e5c4e053ed update readme 2015-12-06 16:32:41 +01:00
Mitsukarenai
6866e508cb Merge branch 'experimental' of github.com:sebsauvage/rss-bridge 2015-12-06 16:01:30 +01:00
Teromene
1a4a428449 Correction de quelques problèmes avec RSSExpander suite à la migration dans lib/Bridge.
Correction de typos.
Ajout de la possibilité d'utiliser un proxy.
2015-12-06 15:56:39 +01:00
Teromene
e582c887fb Ajout du paramètre pattern pour les entrées de type texte, ajout du required côté HTML.
Correction de la page d'accueuil pour qu'elle soit conforme aux standards du W3C.
Correction de la regex de listage des fichiers pour qu'elle ignore les sauvegardes.
Ajout d'un nettoyeur HTML, par défaut.
2015-12-06 15:56:39 +01:00
teromene
38829e7739 Little refactoring to reduce logic on index.php.
Moved RssExpander as a core logic system to lib/Bridge.php

Signed-off-by: teromene <teromene@teromene.fr>
2015-12-06 15:56:39 +01:00
teromene
80008f01f8 Updating a few bridges.
Adding everybody to the contributors in README.md

Signed-off-by: teromene <teromene@teromene.fr>
2015-12-06 15:56:39 +01:00
teromene
78c9dcc705 Last batch of bridges, all implemented !
Signed-off-by: teromene <teromene@teromene.fr>
2015-12-06 15:56:39 +01:00
teromene
715ad3bf3f Checking if the parameter mode has a name, same for exampleValue.
Change the default bridge name.

Signed-off-by: teromene <teromene@teromene.fr>
2015-12-06 15:56:39 +01:00
teromene
53ac336111 Amélioration de la documentation sur la création de bridges.
Signed-off-by: teromene <teromene@teromene.fr>
2015-12-06 15:56:39 +01:00
teromene
b3733069d4 3rd batch of bridges.
Signed-off-by: teromene <teromene@teromene.fr>
2015-12-06 15:56:39 +01:00
teromene
2e4e89aff8 Correction of few bugs.
Warn if RSS-Bridge cannot write to disk.
Try/Catch the bridge RSS generation.

Signed-off-by: teromene <teromene@teromene.fr>
2015-12-06 15:56:39 +01:00
teromene
3cb652b812 Deuxième lot de bridges. 2015-12-06 15:56:39 +01:00
teromene
2d526f4e0a Correction de quelques bugs dans les bridges, qui apparaissent à cause du fait qu'ils sont tous instanciés lors du chargement de tout les bridges.
Ré-ajout et ré-utilisation de getName et getURI, qui permettent d'avoir des élements dynamiques.
Changement en public de certaines valeurs.
Changement du nom de certaines constantes, déja utilisés.

Signed-off-by: teromene <teromene@teromene.fr>
2015-12-06 15:56:39 +01:00
teromene
11ad75c7e6 Premier lot de bridges utilisant le premier système.
Signed-off-by: teromene <teromene@teromene.fr>
2015-12-06 15:56:39 +01:00
teromene
5d2e7ac83d Ajout d'options multiples pour les méta-données.
Ajout d'un bridge de démonstration, DemoBridge.
Ajout d'un début de documentation pour créer un bridge dans CREATE_BRIDGE.md
2015-12-06 15:56:39 +01:00
teromene
2deef45867 Première version du nouveau système de méta-données.
Voir exemple dans YoutubeBridge.
2015-12-06 15:56:39 +01:00
Mitsukarenai
e9e7a421ff (merge control) 2015-12-06 15:55:47 +01:00
Mitsu
a40bbbd2de Merge pull request #179 from teromene/new-attribute-system
Added the Cache cleaning system.
2015-12-04 10:50:36 +01:00
Teromene
f386fc4a10 Added the Cache cleaning system. 2015-12-04 09:19:05 +00:00
Mitsukarenai
c13c7a1d25 cache: check if cache folder exists 2015-12-03 22:09:18 +01:00
Mitsukarenai
40fdb17280 Implement basic cache purge (issue #178) 2015-11-30 10:47:16 +01:00
Mitsu
b2b0ea6a44 Merge pull request #177 from teromene/new-attribute-system
Et ça continue...
2015-11-27 17:50:28 +01:00
Teromene
a07839019e Correction de quelques problèmes avec RSSExpander suite à la migration dans lib/Bridge.
Correction de typos.
Ajout de la possibilité d'utiliser un proxy.
2015-11-27 14:20:33 +00:00
Mitsu
4c120cd831 Merge pull request #174 from teromene/new-attribute-system
Le travail continue...
2015-11-12 00:19:28 +01:00
Teromene
e1cdca6971 Ajout du paramètre pattern pour les entrées de type texte, ajout du required côté HTML.
Correction de la page d'accueuil pour qu'elle soit conforme aux standards du W3C.
Correction de la regex de listage des fichiers pour qu'elle ignore les sauvegardes.
Ajout d'un nettoyeur HTML, par défaut.
2015-11-11 21:45:24 +00:00
Mitsu
10c3dfa60e Merge pull request #173 from j0k3r/patch-1
.pw just changed to .io
2015-11-06 22:50:45 +01:00
Jeremy Benoist
b0305430c7 .pw just changed to .io 2015-11-06 22:49:40 +01:00
Mitsu
985ce7a35f Merge pull request #171 from teromene/new-attribute-system
Quelques changements.
2015-11-05 22:06:23 +01:00
teromene
d033bb51ac Little refactoring to reduce logic on index.php.
Moved RssExpander as a core logic system to lib/Bridge.php

Signed-off-by: teromene <teromene@teromene.fr>
2015-11-05 20:26:48 +00:00
teromene
4da956f365 Updating a few bridges.
Adding everybody to the contributors in README.md

Signed-off-by: teromene <teromene@teromene.fr>
2015-11-05 18:05:46 +00:00
Mitsu
600111efc4 Merge pull request #170 from teromene/new-attribute-system
All bridges implemented.
2015-11-05 18:31:15 +01:00
teromene
7268dbaae3 Last batch of bridges, all implemented !
Signed-off-by: teromene <teromene@teromene.fr>
2015-11-05 15:50:18 +00:00
teromene
2b54377148 Checking if the parameter mode has a name, same for exampleValue.
Change the default bridge name.

Signed-off-by: teromene <teromene@teromene.fr>
2015-11-05 15:49:55 +00:00
teromene
ca2f6f425d Amélioration de la documentation sur la création de bridges.
Signed-off-by: teromene <teromene@teromene.fr>
2015-11-05 13:28:32 +00:00
teromene
eaa8cf4173 3rd batch of bridges.
Signed-off-by: teromene <teromene@teromene.fr>
2015-11-05 11:20:11 +00:00
Mitsu
fe37f9711f Merge pull request #169 from teromene/new-attribute-system
Update 2 to the new attribute system.
2015-11-05 11:50:41 +01:00
teromene
6c420883f2 Updating from upstream 2015-11-05 10:16:19 +00:00
teromene
43f0fc93b7 Correction of few bugs.
Warn if RSS-Bridge cannot write to disk.
Try/Catch the bridge RSS generation.

Signed-off-by: teromene <teromene@teromene.fr>
2015-11-05 10:12:58 +00:00
Mitsu
d0c5d5f8ca Merge pull request #168 from cnlpete/WikipediaDEBridge
added WikipediaDEBridge
2015-11-04 21:19:39 +01:00
Hauke Schade
ffc01fa3bd added WikipediaDEBridge 2015-11-04 20:22:48 +01:00
teromene
1efaba5c7c Deuxième lot de bridges. 2015-11-04 09:47:21 +00:00
teromene
a5a959dced Correction de quelques bugs dans les bridges, qui apparaissent à cause du fait qu'ils sont tous instanciés lors du chargement de tout les bridges.
Ré-ajout et ré-utilisation de getName et getURI, qui permettent d'avoir des élements dynamiques.
Changement en public de certaines valeurs.
Changement du nom de certaines constantes, déja utilisés.

Signed-off-by: teromene <teromene@teromene.fr>
2015-11-03 23:05:10 +00:00
teromene
894eadbbda Premier lot de bridges utilisant le premier système.
Signed-off-by: teromene <teromene@teromene.fr>
2015-11-03 22:28:44 +00:00
Mitsu
98b2019831 Merge pull request #167 from teromene/new-attribute-system
New attribute system
2015-11-03 17:28:20 +01:00
teromene
1c869631d6 Ajout d'options multiples pour les méta-données.
Ajout d'un bridge de démonstration, DemoBridge.
Ajout d'un début de documentation pour créer un bridge dans CREATE_BRIDGE.md
2015-11-03 14:36:19 +00:00
teromene
c204b9d914 Première version du nouveau système de méta-données.
Voir exemple dans YoutubeBridge.
2015-11-01 11:17:36 +00:00
Mitsukarenai
ba161b0b12 [Arte+7] remove-merge bridges, 2 lists for language selection 2015-10-31 13:26:56 +01:00
Mitsukarenai
b339f157c1 [WordOfTanks] add language select list 2015-10-30 18:37:01 +01:00
Mitsukarenai
871efdd5ce [TwitchApi] broadcast select list 2015-10-30 18:30:58 +01:00
Mitsukarenai
42fc08b93d [OpenClassrooms] fixed, list selection 2015-10-30 18:27:49 +01:00
Mitsukarenai
0eb7731481 [AnimeUltime ] add list selection 2015-10-30 18:03:55 +01:00
Mitsukarenai
182be9b575 [LeBonCoin] -oops- forgot keyword type 2015-10-30 17:49:46 +01:00
Mitsukarenai
60a82b52b7 [LeBonCoin] add region selection list 2015-10-30 17:45:10 +01:00
Mitsukarenai
3115cd8e3a [Arte+7] dropdown list for category selection 2015-10-30 12:38:52 +01:00
Mitsu
fcc072170c Merge pull request #156 from teromene/master
Add support for list parameters
2015-10-30 12:26:29 +01:00
Mitsukarenai
e1dac3abb3 [Arte] update bridges (new website) - fix #165 2015-10-30 11:26:49 +01:00
Mitsu
d90b118671 Merge pull request #164 from ORelio/master
[Facebook] Convert textual emoticons to ASCII
2015-10-26 17:00:19 +01:00
ORelio
b592f8ebbf [Facebook] Convert textual emoticons to ASCII
Currently emoticons are retrived in textual form eg <i><u>smile
emoticon</u></i> which is not really visual... so let's convert them back
as ASCII emoticons eg ':)'. This works using a hardcoded table mapping
emoticon names to their visual representation, and the regular expression
match the two words because eg in french facebook will display
<i><u>émoticône smile</u></i> so we need to test both. Unknown emoticon
descriptions will be left as is.
2015-10-24 20:14:12 +02:00
Mitsu
23f0fa3ed8 Merge pull request #163 from polo2ro/master
Fix url for par vendu immo bridge
2015-10-23 17:37:30 +02:00
Paul de Rosanbo
52bdc39948 Fix url for par vendu, remove variable to fix the unread status of items
some rss clients (ex: liferea)
2015-10-23 16:38:37 +02:00
Mitsu
a1b4414da3 Merge pull request #162 from ORelio/master
FaceBook improvements, NextInpact notice fix
2015-10-23 14:49:21 +02:00
ORelio
c8ef31bac6 [NextInpact] Fix php notice message
For non-premium articles, a notice is generated because of trying to get
property from a non-object. Fixed that with a proper check using is_object
2015-10-23 12:19:12 +02:00
ORelio
300b8bba9b [Facebook] More cleaning and bypass link redirect
Remove a bunch of useless html node properties
Bypass all l.php facebook link redirections
Restore <u> and <i> basic formatting
2015-10-23 12:18:55 +02:00
Mitsu
3780eb58bd Merge pull request #161 from ORelio/master
Add AnimeUltime, CNET, LeMondeInformatique, Silicon, 3DSDB, T411
2015-10-22 17:36:24 +02:00
ORelio
0051615b82 Fix some HTTP error codes (404->500) 2015-10-22 15:20:42 +02:00
ORelio
5c987b74d5 Update T411 domain name 2015-10-22 15:01:16 +02:00
ORelio
ea7c8cc314 Add T411 bridge 2015-10-22 14:57:33 +02:00
ORelio
44edc7fc22 Add 3DS Scene Releases bridge 2015-10-22 14:55:11 +02:00
ORelio
f036bff6b4 Add Silicon News bridge 2015-10-22 14:52:34 +02:00
ORelio
e7966dd102 Add Le Monde Informatique bridge 2015-10-22 14:52:15 +02:00
ORelio
24f3bb84d8 Add CNET News bridge 2015-10-22 14:51:56 +02:00
ORelio
e261c9a594 Add Anime Ultime bridge 2015-10-22 14:51:39 +02:00
Mitsu
b39cac116d Merge pull request #160 from eMerzh/fix_lesjoiesducodes
[LesJoiesDuCode] Fix markup detection
2015-10-13 23:47:02 +02:00
Brice Maron
33dea43bcf [LesJoiesDuCode] decode html entities in title 2015-10-13 23:39:48 +02:00
Brice Maron
497d3fd7aa [LesJoiesDuCode] Fix markup detection 2015-10-13 23:28:38 +02:00
Mitsukarenai
372ddf2792 Core: add author to HTML output format 2015-10-13 18:04:45 +02:00
Mitsukarenai
85ebb70b74 [Numerama] Add author to feed output 2015-10-13 17:59:55 +02:00
Mitsukarenai
35ac1d76b2 [Numerama] fix undecoded entity on title 2015-10-13 00:37:55 +02:00
Mitsukarenai
c17fe0c898 [Numerama] change feed URL source 2015-10-12 20:47:53 +02:00
Mitsukarenai
01d6859f77 [Numerama] update bridge post extraction (issue #158) 2015-10-12 17:13:27 +02:00
Mitsukarenai
f11d6fc2ad [Facebook] Added to main bridges (#148) 2015-10-08 00:25:36 +02:00
Mitsu
36ba93eea3 Merge pull request #153 from ORelio/master
Improve FaceBook, NextInpact, Wordpress bridges
2015-09-20 17:03:15 +02:00
teromene
eb24487807 Ajout d'une option de compatibilité pour les bridges n'utilisant pas le nouveau format 2015-09-14 14:04:38 +01:00
teromene
81f89b1246 Ajout de la possibilité d'avoir une liste en paramètre, voir exemple d'utilisation dans DauphineLibereBridge. 2015-09-14 13:59:20 +01:00
Mitsukarenai
c030d011d2 BooruProject: tighter param control | WorldOfTanks: URL format update 2015-09-12 20:00:26 +02:00
Mitsu
f643617cac Merge pull request #154 from kranack/master
FIX Soundcloud Bridge
2015-09-10 00:24:05 +02:00
Damien Calesse
2c18ee2d53 Fix cache duration for soundcloudBridge 2015-09-10 00:00:29 +02:00
Damien Calesse
91b1415e3d Fix Soundcloud bridge (remove var_dump and reset cache duration) 2015-09-09 00:15:01 +02:00
Damien Calesse
8edddcd97f Fix Soundcloud bridge (change client key, URI now use HTTPS and change URI according with soundcloud API) 2015-09-09 00:13:56 +02:00
ORelio
5b2c8e91d0 Improve Wordpress Bridge
Retrieve post author
Retrieve post thumbnail
Retrieve title from <h2> if no <h1>
Minor code indentation fixes
2015-09-05 14:42:57 +02:00
ORelio
8b9c40534b NextInpactBridge: Add mention for premium articles
Add mention on article bottom (n% to discover)
Minor name fix: Nextinpact -> NextInpact
Further code indentation fixes
2015-09-05 14:42:55 +02:00
ORelio
d7436c2d0a Improve Facebook Bridge
Retrieve author display name from page title
Build short readable title using name and content
Convert relative links into absolute links
Remove attributes from </a> tags (may cause issues)
Remove onclick and onmouseover (javascript code)
Retrieve url of first image of post as thumnail
Use author avatar as thumnail if no first image
Use display name in feed name: name - Fb bridge
Minor code indent fixes and use simple quotes
2015-09-05 14:42:54 +02:00
Mitsu
762ad0291e Merge pull request #151 from ORelio/master
NextImpactBridge Improvements
2015-09-04 18:50:40 +02:00
ORelio
88bf15e46c Add Author into MrssFormat 2015-09-04 18:33:22 +02:00
ORelio
80fe041f32 NextImpactBridge Improvements
- Add subtitle
- Add news main image
- Add thumbnail rss field
- Add author rss field
- Minor code cleanup
2015-09-04 18:11:04 +02:00
Mitsu
063ee612cf Merge pull request #150 from teromene/master
Ajout du support des journaux de profils
2015-09-02 14:20:32 +02:00
teromene
ee4d4d9603 Ajout du support des journaux de profils 2015-09-02 13:49:36 +02:00
Mitsu
a9052b211e Merge pull request #149 from teromene/master
[Courrier International] added
2015-09-01 21:36:35 +02:00
teromene
7b9c180654 Ajout d'un bridge pour Courrier International. 2015-09-01 19:45:39 +02:00
Mitsu
b58a84537d Merge pull request #147 from teromene/master
[Facebook Bridge] added
2015-09-01 00:18:50 +02:00
teromene
9dfa1d6f25 Ajout d'une URI par post 2015-09-01 00:04:13 +02:00
teromene
7680b065b5 Modification de la durée du cache 2015-08-31 23:02:11 +02:00
teromene
221ac239e1 Ajout d'un bridge pour Facebook 2015-08-31 22:59:08 +02:00
Mitsu
f8d1322ee7 Merge pull request #144 from GregThib/patch-3
[rue89] Anti-hotlinking was apparently disabled
2015-08-07 17:22:34 +02:00
GregThib
9f93656bf4 Anti-hotlinking was apparently disabled
It seems that anti-hotlinking method (data-src + JS) was disabled on Rue89 site.
Because I'm not sure that modification is permanent, I put an "if" for testing it before replacement.
--> tested ok on my rssbridge instance. IMG are back.
2015-08-07 16:30:42 +02:00
Mitsu
d39336525d Merge pull request #128 from Nyutag/master
[new] ReporterreBridge
+ fixes [CADBridge] [CommonDreamsBridge]
2015-07-30 11:59:53 +02:00
Mitsukarenai
d95f4024f5 [TheOatMeal] fixes 2015-07-30 11:57:26 +02:00
Mitsu
ce89ed0fc5 Merge pull request #136 from Riduidel/TheOatmeal
[new] The oatmeal
2015-07-30 11:42:21 +02:00
Mitsu
1678378bab [TwitchApi] Fix homepage link 2015-07-30 11:29:25 +02:00
Mitsu
9bf493cf92 Merge pull request #140 from LogMANOriginal/TwitchApiBridge
[new] TwitchApiBridge
2015-07-30 11:28:27 +02:00
Mitsu
fde1dfa194 Merge pull request #141 from GregThib/patch-1
[Rue89] AuthorName in the output
2015-07-30 11:21:58 +02:00
GregThib
17e887631c AuthorName in the output (usefull for RSS readers)
Add the Author's name in the output fields.
2015-07-23 16:05:26 +02:00
logmanoriginal
1055fd4e8b Add TwitchApiBridge 2015-07-14 13:36:44 +02:00
Mitsukarenai
6456d145a0 [Youtube] fix search (issue #137) 2015-07-08 15:34:06 +02:00
Nicolas Delsaux
6003daff9d fixed a small bug regarding url processing 2015-07-05 15:51:17 +02:00
Nicolas Delsaux
7b99ad3650 I stupidly forgot to change cache duration ... 2015-07-05 15:27:39 +02:00
Nicolas Delsaux
94ffb22fb0 un bridge The Oatmeal qui marche ... principalement pour les comics locaux (et pas pour explodingkittens) 2015-07-05 15:24:06 +02:00
unknown
9712d052b4 Implementing TheOatMeal bridge fast with RSSExpander 2015-07-03 18:43:15 +02:00
Mitsu
95af72349b Merge pull request #135 from polo2ro/master
[instagram] Fix instagram bridge JSON format
2015-06-29 13:44:28 +02:00
Paul de Rosanbo
9ce826f78e Fix instagram bridge, json data format has been modified on
instagram.com
2015-06-29 11:47:54 +02:00
Mitsu
d9b2f267c5 Merge pull request #134 from Strubbl/fix-googleplus-item-uri
add Google+ base URL in front of item entry URI
2015-06-28 02:30:14 +02:00
Sven Fischer
b18990872e add Google+ base URL in front of item entry URI
this fixes the Atom feed entry URL from
https://example.com/rss-bridge/+Perspn/posts/N6fgHam5e2ik to point to
https://plus.google.com/+Perspn/posts/N6fgHam5e2ik. Otherwise the URL
count not be found.
2015-06-27 23:58:06 +02:00
Mitsukarenai
7a40584864 [TwitterBridge*] update query URL for live feed 2015-06-26 11:55:11 +02:00
Mitsukarenai
1374b7f563 Updating minimal PHP version to 5.4 (issue #133) 2015-06-26 11:10:25 +02:00
Mitsukarenai
c16747757d (some cleanup) 2015-06-04 17:06:14 +02:00
Mitsukarenai
54c5e9f5ea [Youtube] Use metatag for publishdate (fix issue #132) 2015-05-31 00:16:42 +02:00
Mitsu
75585e7b52 Merge pull request #130 from lagaisse/CpasbienBridge
Cpasbien : Ajout de la date de publication en utilisant la date du cache
2015-05-21 18:38:57 +02:00
Kevin Lagaisse
de16ba234e Ajout de la date de publication en utilisant la date de dernière modification du cache 2015-05-20 21:47:58 +02:00
Mitsu
5b71d587e2 Merge pull request #129 from lagaisse/CpasbienBridge
Create CpasbienBridge.php
2015-05-18 12:30:40 +02:00
Kevin Lagaisse
22f0017dc7 Create CpasbienBridge.php 2015-05-18 12:01:13 +02:00
root
222073248d Fixing issue with sillies 2015-05-06 09:53:21 +02:00
root
ca9cc12b0c Fixing cache issue causing memory leak 2015-05-05 20:30:26 +02:00
root
5a2a6fbdba Add ReporterreBridge.php 2015-05-05 20:18:12 +02:00
Mitsukarenai
4ca9339e03 [removed] HumbleStore bridge 2015-05-02 12:21:17 +02:00
Mitsu
d1c4847d88 Merge pull request #127 from Nyutag/master
Add CADBridge
2015-05-02 12:11:51 +02:00
root
a8656ac459 Merge branch 'master' of https://github.com/Nyutag/rss-bridge 2015-04-28 19:43:18 +02:00
root
4524feeebc Add CADBridge 2015-04-28 19:40:58 +02:00
root
7a5b51b8cf Add CADBridge 2015-04-28 19:28:49 +02:00
Mitsu
5c37fd4dcf Merge pull request #125 from Nyutag/master
Add CommonDreamsBridge.php
2015-04-27 11:53:15 +02:00
Mitsukarenai
2a80794d09 Artefr: fix URI 2015-04-27 11:52:30 +02:00
Mitsu
472b7f7255 Merge pull request #126 from mro/master
arte.de: urls form json are already absolute.
2015-04-27 11:51:36 +02:00
Marcus Rohrmoser
d80b11f0fa arte.de: urls form json are already absolute. 2015-04-27 11:46:35 +02:00
root
3506a18a39 Add CommonDreamsBridge.php 2015-04-26 19:22:20 +02:00
Mitsu
76907287f0 Merge pull request #115 from nel50n/media-rss
Media RSS
2015-04-24 17:32:02 +02:00
Mitsu
f1d74a4a27 Merge pull request #121 from Riduidel/master
Création du RssExpander et utilisation dans Gawker et Sexactu
2015-04-24 17:30:39 +02:00
Mitsu
4e95599d8d Merge pull request #124 from mro/fix/atom_xml_escape
properly escape atom xml
2015-04-24 17:24:54 +02:00
Marcus Rohrmoser
0890b52b4c properly escape atom xml. Refs https://github.com/sebsauvage/rss-bridge/issues/123 2015-04-24 17:14:17 +02:00
Mitsu
7be284407a Merge pull request #122 from Glandos/patch-1
Handle missing items in LeBonCoinBridge
2015-04-15 21:56:59 +02:00
Glandos
ef0329b09c Handle missing items in LeBonCoinBridge
Ignore missing items instead of doing 500 errors.
2015-04-15 21:55:24 +02:00
nel50n
466a139ce3 New Bridge : SuperbWallpapers 2015-04-08 14:25:14 +02:00
nel50n
42c94566d1 New Bridge : HDWallpapers 2015-04-08 14:25:00 +02:00
unknown
0f6fdb0c5b Merge branch 'live' 2015-04-06 14:54:54 +02:00
unknown
a5f52b8789 Merge remote-tracking branch 'upstream/master'
Conflicts:
	bridges/Sexactu.php
2015-04-06 14:52:04 +02:00
nel50n
a1ccad3d5f New Bridge : PickyWallpapers 2015-03-31 10:47:17 +02:00
nel50n
2633516df8 Merge branch 'master' into media-rss 2015-03-31 09:35:52 +02:00
Mitsukarenai
1530738a19 [TwitterBridgeClean] minor fixes 2015-03-21 02:08:47 +01:00
Mitsu
47cdb21c6d Merge pull request #118 from vinzv/master
[new bridge] TwitterClean
2015-03-21 02:06:46 +01:00
Mitsu
d35dd8b0ce Merge pull request #100 from kraoc/master
[new bridge] Giphy.com + Tweaked Twitter bridge
2015-03-21 01:40:50 +01:00
Mitsu
38ba4cd44f Merge pull request #111 from polo2ro/master
[new bridge] Paru Vendu
2015-03-21 01:38:50 +01:00
Mitsukarenai
410d0a6d88 [new bridge] Lolibooru 2015-03-21 01:19:44 +01:00
Nicolas Delsaux
ce28cfad22 Rewritten those bridge to use a new mechanism ! RSS expander will get data from the RSS feed and expand the truncated entries to their full values. 2015-03-18 17:42:55 +01:00
Mitsu
9861bc0230 Merge pull request #117 from Daiyousei/master
Frandroid bridge
2015-03-06 10:41:52 +01:00
Enzo PALMA
ddf7c33b4e modification update date in metadatas 2015-03-05 18:28:45 +01:00
Enzo PALMA
aa9e5332a2 Fixing metadatas 2015-03-05 18:25:40 +01:00
Enzo PALMA
14af7d93ba fixing indentation on FrandroidBridge 2015-03-05 15:01:45 +01:00
Enzo PALMA
401663aac0 Adding Frandroid bridge since they truncate their RSS 2015-03-05 14:42:25 +01:00
nel50n
08a349890d New Bridge : Unsplash 2015-03-02 22:42:54 +01:00
nel50n
91737f3a97 New Bridge : WallPaperStop 2015-03-02 22:42:16 +01:00
nel50n
c8dccf76a6 New Format : Media RSS 2015-03-02 22:35:02 +01:00
Mitsu
ea5f91f394 Merge pull request #114 from clempar/lesjoiesducode
[Lesjoiesducode] fix jpg→gif
2015-02-09 16:41:59 +01:00
Clément Parisot
25bc285083 LesJoiesDuCode/TheCodingLove: Fix author format 2015-02-07 22:56:38 +01:00
Clément Parisot
8e44a01b2a Fix LesJoiesDuCode / TheCodingLove bridges
Retrieve the .gif instead of the static .jpg that is now in the HTML source
2015-02-07 22:56:38 +01:00
Mitsu
a2bacd09eb Merge pull request #113 from aledeg/zataz
Add support for Zataz website.
2015-02-07 20:34:03 +01:00
Alexis Degrugillier
5144c83c95 Add support for Zataz website.
It gets the last 5 articles available. The feed is missing images since hot-linking is impossible from host.
We might need a way to grab and store that content as well.
2015-02-07 14:25:38 -05:00
Paul de Rosanbo
9171be9c50 More descriptions 2015-02-02 22:37:18 +01:00
Mitsukarenai
ade723f6a6 4chan: newer first 2015-02-02 13:00:15 +01:00
Paul de Rosanbo
1a673766ec Add flat 2015-02-01 19:20:13 +01:00
Paul de Rosanbo
4b04a77b00 Remove empty entries 2015-02-01 18:03:15 +01:00
Mitsukarenai
3b69c71197 [4chan] new bridge 2015-02-01 16:46:59 +01:00
Paul de Rosanbo
9cd174ceab Set name 2015-02-01 15:15:30 +01:00
Paul de Rosanbo
e1b5c9cda3 Set cache duration to 3 hours 2015-02-01 15:04:59 +01:00
Paul de Rosanbo
c44c569aa5 Add paru vendu immo bridge 2015-02-01 15:03:39 +01:00
Mitsukarenai
091bf7872e Rue89: fixes, optim, clean, meta 2015-01-30 19:56:55 +01:00
Mitsu
a71bb5bc00 Merge pull request #58 from pit-fgfjiudghdf/patch-12
Create Rue89Bridge.php
2015-01-30 19:54:37 +01:00
Mitsu
fcda5403c1 Merge pull request #110 from kranack/master
Update DilbertBridge
2015-01-30 18:54:45 +01:00
Damien Calesse
f7a7acfde4 Update MemoLinux 2015-01-30 18:32:06 +01:00
Damien Calesse
1a64a21d50 Et voila 2015-01-30 18:20:19 +01:00
Damien Calesse
a3d5a1efea Update DilbertBridge Date 2015-01-30 18:14:53 +01:00
Damien Calesse
05216d9c39 Update DilbertBridge 2015-01-30 18:12:28 +01:00
Mitsukarenai
180e74d572 MsnMonde: change maintainer, update date 2015-01-30 17:18:40 +01:00
Mitsu
c1fab7971c Merge pull request #109 from kranack/master
Update MsnMonde
2015-01-30 17:15:20 +01:00
Damien Calesse
cd1740bd56 Update MsnMonde 2015-01-30 16:05:28 +01:00
Mitsukarenai
4c48e85e12 Fixing, removing bridges 2015-01-20 19:06:51 +01:00
Mitsu
bb2c04bbf8 Merge pull request #106 from alexAubin/master
Adding bridge for EZTV
2015-01-20 18:21:32 +01:00
Alexandre Aubin
d8bed9aa75 Adding bridge for EZTV 2015-01-20 17:40:30 +01:00
Mitsu
92cb904374 Merge pull request #104 from polo2ro/master
Fix some errors in the pinterest bridge
2015-01-05 13:25:42 +01:00
pauder
284e103326 Fix format for pinterest board page, fix a warning 2015-01-05 12:16:50 +01:00
pauder
368b73f5d7 Merge remote-tracking branch 'upstream/master' 2015-01-05 11:56:38 +01:00
Mitsukarenai
041a57db1c HumbleBundle: ... I said "ATOM_FORMAT" 2014-12-12 22:14:50 +01:00
Mitsukarenai
7b789bf802 HumbleBundle: (let's use ATOM format after all..) 2014-12-12 22:13:52 +01:00
Mitsukarenai
840209908e HumbleBundle: add sale end to content 2014-12-12 22:12:36 +01:00
Mitsukarenai
47c22e94aa HumbleBundle: hack a timestamp into it 2014-12-12 22:06:04 +01:00
Mitsukarenai
768a8a29d7 undefault ThePirateBay... issue #103 2014-12-11 11:57:19 +01:00
Mitsu
355ed8a1db Merge pull request #102 from 16mhz/patch-1
Correction for issue #99
2014-12-10 17:59:09 +01:00
16mhz
c51fc40d17 Correction for issue #99
HumbleStoreDiscountBridge is now working, I changed the link to request Json data.
2014-12-10 13:09:08 +01:00
Mitsu
11aeb8088a Merge pull request #101 from alexAubin/master
ThePirateBayBridge : parsing timestamp correctly + possibility to have several list separated by ';'
2014-12-08 21:23:33 +01:00
Alexandre Aubin
ab3582e2b4 Adding possibility to have several list separated by ';', + code to parse date correctly. 2014-12-08 19:39:57 +01:00
Olivier
ff4ccf985f Resolve content links
Use some code to resolve content links to bypass shorteners...
2014-12-08 16:53:58 +01:00
Olivier
30f339e3b2 Add title cleaning
Try to remove all links from title's entry.
2014-12-08 16:31:16 +01:00
Olivier
0d9df394dd Update TwitterBridgeTweaked.php 2014-12-05 13:20:17 +01:00
Olivier
068557ed08 Update GiphyBridge.php 2014-12-05 13:19:20 +01:00
Olivier
5922e37bc0 Create GiphyBridge.php
Add bridge for Giphy.com
2014-12-05 13:18:37 +01:00
Mitsu
d77eea7f09 Adding TPB to readme 2014-12-04 19:16:57 +01:00
Mitsukarenai
529c1817f5 TPB: (oops wrong td) 2014-12-04 19:13:17 +01:00
Mitsukarenai
f566981470 TPB: add seeders-leechers count 2014-12-04 19:11:14 +01:00
Mitsukarenai
950b3297e0 TPB: add to main bridges (incoming censorship in FR) 2014-12-04 18:45:09 +01:00
Mitsukarenai
bb9d8023ac TwitterXT: get using HTTPS 2014-11-27 17:39:59 +01:00
Mitsukarenai
e4b2a0b29c Twitter doesn't seem to exclude anymore... 2014-11-27 17:15:39 +01:00
Mitsukarenai
2e2cf98eb6 new bridge: Dailymotion 2014-11-18 20:02:04 +01:00
vinz
4e9a0df1bd cloned TwitterBridge for stripping out links etc. for clean sharing to
GNU Social
2014-11-06 23:56:37 +01:00
Mitsukarenai
119c30b999 fix AtomFormat elements escaping 2014-10-27 15:16:39 +01:00
Mitsu
5f64a2531d Merge pull request #96 from jdesgats/master
Fixed HTML escaping for Atom items
2014-10-21 21:41:38 +02:00
Julien Desgats
a8c5c05d37 Fixed HTML escaping for Atom items 2014-10-21 14:55:18 -04:00
Mitsu
fdfd1b293c Merge pull request #95 from GregThib/patch-1
[Allocine]  MàJ pour saison 6
2014-10-19 20:41:45 +02:00
GregThib
18637a42d9 MàJ pour saison 6
URL change chaque saison
2014-10-19 20:35:22 +02:00
Mitsu
345469c620 Merge pull request #94 from pitchoule/patch-6
Update and rename TagBoardBridge to TagBoardBridge.php
2014-09-11 10:51:19 +02:00
pitchoule
8b01b9c1c1 Update and rename TagBoardBridge to TagBoardBridge.php 2014-09-11 09:14:05 +02:00
Mitsu
100acd416f Merge pull request #93 from pitchoule/patch-5
Create TagBoardBridge
2014-09-10 16:06:44 +02:00
pitchoule
31d5b5878b Update TagBoardBridge 2014-09-10 15:54:22 +02:00
pitchoule
8c74d1de1c Create TagBoardBridge
Si vous avez des améliorations n'hésitez pas :)
2014-09-10 15:53:25 +02:00
Mitsu
f45c1aa644 Merge pull request #92 from corenting/master
Add NasaApod bridge (fix #17)
2014-09-08 18:16:16 +02:00
corenting
87526650a6 Add NasaApod bridge (fix #17) 2014-09-08 17:33:27 +02:00
Mitsu
6d977f411c Merge pull request #91 from corenting/master
Project M game Bridge
2014-08-27 22:01:01 +02:00
corenting
9b86dfdb39 Minor things 2014-08-27 18:23:43 +02:00
corenting
485a0dc279 Add bridge for Project M 2014-08-27 17:37:38 +02:00
Mitsukarenai
67338051e7 [Youtube] Add channel support (issue #90) 2014-08-19 21:35:56 +02:00
Mitsukarenai
2ed0da8cf0 merge pull #88 2014-08-02 13:55:49 +02:00
Olivier
096c318d4e Create TwitterBridgeTweaked.php
Extends TwitterBridgeExtended to provide access to more public fields.
2014-08-01 11:13:57 +02:00
Mitsu
a0084b1060 Merge pull request #87 from kranack/master
Add Soundcloud Bridge & Icon for Atom Format
2014-07-24 19:18:31 +02:00
Damien Calesse
8ff7d9460f MondeDiplo Conflict 2014-07-24 13:58:38 +02:00
Damien Calesse
ca1314c4ac Merge branch 'master' of https://github.com/kranack/rss-bridge
Conflicts:
	bridges/MondeDiploBridge.php
2014-07-24 13:53:24 +02:00
Damien Calesse
c06343128a SoundcloudBridge & Add icon to Atom Format 2014-07-24 13:51:42 +02:00
Mitsukarenai
bf2303ead8 [ pull request #86 ] 2014-07-23 13:11:55 +02:00
Damien Calesse
4b0ac11b82 Create ABCTabsBridge.php 2014-07-23 12:53:02 +02:00
Mitsu
4f61ac06af Merge pull request #85 from pitchoule/patch-4
Update ScoopItBridge
2014-07-23 12:06:08 +02:00
Damien Calesse
a73d1cfc0c Ni 2014-07-23 11:17:53 +02:00
pitchoule
a7ed30e2cc Update ScoopItBridge
Le "title" était en innertext et non en plaintext.
2014-07-23 10:59:12 +02:00
Damien Calesse
1c38a91d41 Improve LeMondeDiploBridge.php 2014-07-22 20:02:40 +02:00
Damien Calesse
6d284ad5af Change WhyBridge.php 2014-07-22 20:00:32 +02:00
Mitsu
9287e47163 Merge pull request #83 from 16mhz/master
LeBonCoin and Humble Store Discount bridges
2014-07-22 18:09:50 +02:00
Mitsu
03bbf2f040 Merge pull request #82 from pitchoule/patch-3
Create ScoopItBridge.php
2014-07-22 18:09:36 +02:00
Mitsu
34db6017e4 Merge pull request #81 from pitchoule/patch-2
Create MondeDiplo.php
2014-07-22 18:09:24 +02:00
16mhz
5714892115 Add: New bridge for LeBonCoin with region filter 2014-07-22 17:20:43 +02:00
16mhz
b0ce5bdc81 Humble Store bridge now with thumbnail 2014-07-22 17:18:31 +02:00
pitchoule
7ae85226f7 Create ScoopItBridge.php
Bridge permettant de collecter les informations sur la page Scoop.It
Bonne lecture
2014-07-22 14:59:55 +02:00
pitchoule
0a75549663 Create MondeDiplo.php
Pour répondre au post : (Le monde diplo #62)[https://github.com/sebsauvage/rss-bridge/issues/62]
Voici le bridge
2014-07-22 14:55:22 +02:00
Mitsu
e62db154a4 GooglePlus to main (README) + contrib 2014-07-20 17:48:03 +02:00
Mitsukarenai
3e6bd3ecc5 Add GooglePlus to main bridges 2014-07-20 17:43:29 +02:00
Mitsu
625b59b17b Merge pull request #79 from Grummfy/listMyBridges
List my bridges
2014-07-20 17:41:20 +02:00
Mitsu
01f4cb4c6c Merge pull request #78 from Grummfy/master
Bridge : google plus post
2014-07-20 17:41:11 +02:00
Grummfy
a6289150c1 Display the list of bridges 2014-07-20 17:18:49 +02:00
Grummfy
82749229a7 Display the lsit of bridges 2014-07-20 17:11:11 +02:00
Grummfy
fd574ce102 Display number of brige 2014-07-20 16:51:16 +02:00
Grummfy
c297869a3c - 2014-07-20 16:49:53 +02:00
Grummfy
42f6ee09e5 oups 2014-07-20 16:48:30 +02:00
Grummfy
785cf75d60 a bit of cleaning for reading 2014-07-20 16:47:02 +02:00
Grummfy
2ed55b143e remove useless 2014-07-20 16:32:45 +02:00
Grummfy
0113c61911 bridge with google plus 2014-07-20 16:28:51 +02:00
jvb
c02e4cae7c try to debug stuff 2014-07-20 12:38:45 +02:00
jvb
4568ef238b ... 2014-07-20 11:59:46 +02:00
Grummfy
f570a9cc83 google plus bridge 2014-07-20 10:40:00 +02:00
Grummfy
aba7caf3d8 ignore some ide 2014-07-20 01:41:44 +02:00
Mitsukarenai
035dfbeed8 Ça m'apprendra à coder à 3h40.. 2014-07-19 03:41:34 +02:00
Mitsukarenai
bafe448914 Merge branch 'master' of github.com:sebsauvage/rss-bridge 2014-07-19 03:35:29 +02:00
Mitsukarenai
d22e2c1105 TwitterExtended [beta] results filtering 2014-07-19 03:34:35 +02:00
Mitsu
3bbfa428ea Merge pull request #75 from Polopollo/master
The developper.com bridge was too short on items
2014-07-18 21:35:19 +02:00
Paul Vayssiere
92f1d58026 oops, it was a bit too short... 2014-07-18 12:52:55 -05:00
Mitsu
629e061049 Merge pull request #74 from 16mhz/master
Add Humble Store Discount Bridge
2014-07-18 18:43:33 +02:00
16mhz
9156552f91 Add Humble Store Discount Bridge 2014-07-18 18:21:07 +02:00
Mitsu
957d6373eb Merge pull request #73 from kranack/master
Improve WhydBridge.php
2014-07-18 15:42:31 +02:00
Mitsukarenai
efca378117 Whyd: take pull #73 2014-07-18 15:41:33 +02:00
Damien Calesse
ce9a5e2489 Change WhydBridge.php 2014-07-18 15:10:18 +02:00
Damien Calesse
98d551f0b2 Change WhydBridge.php 2014-07-18 15:07:51 +02:00
Mitsukarenai
3668475526 Whyd: tightening input, use username if provided 2014-07-18 14:06:39 +02:00
Mitsu
6b4da4a04b Merge pull request #72 from kranack/master
Create WhydBridge.php
2014-07-18 13:43:51 +02:00
Damien Calesse
d5ae737319 WhydBridge.php 2014-07-18 13:33:54 +02:00
Damien Calesse
ecd81dfed0 Change WhydBridge.php 2014-07-18 13:31:40 +02:00
Damien Calesse
fd7b39eaea Create WhydBridge.php 2014-07-18 13:19:02 +02:00
Mitsukarenai
136be273ce Numerama: add lists to output 2014-07-16 18:06:15 +02:00
Mitsukarenai
b80764282a JournalDuGeek: restrict to 5 posts 2014-07-16 17:09:11 +02:00
Mitsu
9844fee8c5 Merge pull request #70 from Polopollo/master
Add of GizmodoFR+Developpez.com+a small feature for NextImpact
2014-07-16 17:04:48 +02:00
Mitsukarenai
aab11fbd94 Youtube: fix issue #71 2014-07-16 16:32:44 +02:00
Paul Vayssiere
2dd8f789fc microsoft quotes and UTF8 encoding fixed for
Developpez.com
2014-07-15 19:31:54 -05:00
Paul Vayssiere
94a6b42a2b Add the funny text that completes the title 2014-07-14 13:39:41 -05:00
Paul Vayssiere
ee45f0a829 Le Journal du Geek Bridge 2014-07-14 13:12:52 -05:00
Paul Vayssiere
9da81ee290 Developpez.com (FR) Bridge 2014-07-14 12:41:09 -05:00
Paul Vayssiere
c38c7dd2a1 add a Gizmodo.fr bridge to get the content
And link to youtube videos
2014-07-14 12:12:01 -05:00
Mitsu
ede0046d4f README: add bridge guidelines 2014-07-08 17:36:44 +02:00
Mitsukarenai
d4de199501 fix issue #64 2014-07-08 17:06:49 +02:00
Mitsukarenai
b6602fc8e3 MemoLinux SegFaultMint fixes 2014-07-08 16:39:57 +02:00
Mitsu
206bcdf712 Merge pull request #68 from qwertygc/master
Add MemoLinuxBridge
2014-07-08 16:18:44 +02:00
Mitsukarenai
75773f62f8 fix Numerama: afterscript text 2014-07-08 16:17:50 +02:00
Qwerty
365b440697 Create MemoLinuxBridge.php 2014-07-07 11:07:17 +02:00
Qwerty
f9168cac71 Create SegfaultMintBridge.php 2014-07-05 13:41:58 +02:00
mitsukarenai
42d655f0f2 Merge pull request #66 from qwertygc/master
Create LeMotDuJourBridge.php
2014-06-30 19:46:06 +02:00
Qwerty
59c931d16f Create LeMotDuJourBridge.php 2014-06-30 19:08:59 +02:00
Mitsukarenai
29aa605c44 missing bracket 😭 2014-06-20 17:04:27 +02:00
Mitsukarenai
dcf554d8d8 Youtube: fix, indent, limits 2014-06-20 17:00:36 +02:00
Mitsukarenai
2f4b325a7d [beta] extract timestamp from Youtube API 2014-06-20 16:41:51 +02:00
Mitsukarenai
4cd5b0aec3 fix readme 2014-06-07 20:32:17 +02:00
mitsukarenai
335ff55dd4 Merge pull request #61 from qwertygc/patch-1
Create DauphineLibereBridge.php
2014-05-31 19:26:16 +02:00
Qwerty
cd6e00b326 Create DauphineLibereBridge.php 2014-05-31 18:58:56 +02:00
pit-fgfjiudghdf
7f46cc3e91 Create Rue89Bridge.php
Voici le code. Mon serveur est en vrac, je ne peux pas valider qu il fonctionne tjs mais, il y a une semaine je n'avais pas de soucis.
2014-05-31 12:39:35 +02:00
Mitsukarenai
6b2742b067 fix PlanetLibre 2014-05-31 11:46:54 +02:00
Mitsukarenai
237886feb6 Add CoinDesk, update Maliki 2014-05-30 17:53:48 +02:00
Mitsukarenai
e816b2aa80 Fix post limit for FS, GuruMed, OpenTheory 2014-05-30 14:07:34 +02:00
mitsukarenai
913a2ffc2d Merge pull request #56 from qwertygc/master
Add bridges: GuruMed, Futurascience, OpenTheory
2014-05-30 14:06:04 +02:00
Qwerty
ee19e5c6b5 Create OpenTheoryBridge.php 2014-05-30 12:11:02 +02:00
Qwerty
ced94c88d9 Create FSBridge.php 2014-05-30 12:09:56 +02:00
Qwerty
cc6b0bcfd3 Create GuruMedBridge.php 2014-05-30 12:09:00 +02:00
Mitsukarenai
1132c90674 catchphrase 2014-05-28 17:46:56 +02:00
Mitsukarenai
ab744aad8f Bridgecount and prepare for catchphrase 2014-05-28 17:34:50 +02:00
Mitsukarenai
0c7729e783 [TwitterBridge] clean links 2014-05-28 17:10:49 +02:00
Mitsukarenai
0874e13824 Improve HTML output 2014-05-28 16:57:30 +02:00
Mitsukarenai
c4929d51e1 unset curl ext until required 2014-05-28 15:49:11 +02:00
mitsukarenai
3c363da883 Merge pull request #53 from aledeg/wordpress
[WordpressBridge] Fix posts discovery for PHP 5.5-
2014-05-28 09:47:30 +02:00
Alexis Degrugillier
e7c00914dd Fix posts discovery.
For PHP before 5.5, the bridge is not working. It returns the following error: "Can't use method return value in write context".
See the following message for explanations: http://stackoverflow.com/questions/1075534/cant-use-method-return-value-in-write-context/4328049#4328049
2014-05-27 21:28:36 -04:00
Mitsukarenai
f5690edc3c Add check for "openssl" and "curl" extensions ( issue #49 ) 2014-05-28 00:30:12 +02:00
Mitsukarenai
c07eacfd6a Add extra bridges, second batch (TPB inside) 2014-05-26 19:45:10 +02:00
Mitsukarenai
a23dd1d1e5 add whitelist notice to readme 2014-05-26 00:47:33 +02:00
Mitsukarenai
3b558e1c2a Add extra bridges, first batch (So feed, Many RSS) 2014-05-26 00:30:46 +02:00
Mitsukarenai
96b9476d5a update README 2014-05-25 23:31:24 +02:00
Mitsukarenai
8d476a0644 add homepage + date to main bridges 2014-05-25 23:27:14 +02:00
Mitsukarenai
614cde79a0 quick fix; prepare homepage param 2014-05-25 23:23:52 +02:00
Mitsukarenai
99b3168452 whitelist: check with/without ext 2014-05-25 21:10:16 +02:00
Mitsukarenai
169e2d7762 new: bridge whitelisting 2014-05-25 19:56:59 +02:00
Mitsukarenai
63f3357384 ignore whitelist 2014-05-25 19:53:18 +02:00
Mitsukarenai
30b07077be let's unlicense ! 2014-05-21 20:11:01 +02:00
Mitsukarenai
996b70320e fix readme; add license 2014-05-21 20:07:15 +02:00
Mitsukarenai
2a8e4034e3 add original maintainers 2014-05-21 19:44:14 +02:00
Mitsukarenai
c0ace1e6fb Merge branch 'master' of github.com:sebsauvage/rss-bridge 2014-05-21 19:18:50 +02:00
Mitsukarenai
7d24be9653 update bridges with maintainer 2014-05-21 19:18:07 +02:00
Mitsukarenai
a4fd1e62aa update bridges with @maintainer 2014-05-21 19:15:52 +02:00
Mitsukarenai
6956468b64 Add bridge info: maintainer 2014-05-21 19:09:37 +02:00
Mitsukarenai
7bee777362 add simple_html_dom 2014-05-21 17:25:59 +02:00
Mitsukarenai
e504573fea updt readme 2014-05-21 17:21:53 +02:00
Mitsukarenai
13da0112f2 [pull/beta] UA spoofing 2014-05-14 21:34:07 +02:00
Mitsukarenai
1e40d6f492 [pull] Fix Youtube, Twitter 2014-05-14 14:34:06 +02:00
Mitsukarenai
e81a19a04b [pull] date fallback for ATOM format 2014-05-14 14:27:57 +02:00
Sébastien SAUVAGE
e9902e2391 Updated from Mitsukarenai 2014-05-14 12:39:12 +02:00
Nicolas Delsaux
fd71ceae82 Adding a meta-bridge for all Gawker publications (lifehacker, kotaku, you name it, ...) 2014-04-02 10:55:42 +01:00
Nicolas Delsaux
1a12f48e2e Working WorldOfTanks official news bridge, complete with images and categories 2014-03-26 16:22:31 +01:00
Nicolas Delsaux
0fa32c7cf9 added a simple method to allow all subclasses to easily relocate image links 2014-03-26 16:04:10 +01:00
Nicolas Delsaux
e564559bda Fixes #42 by adding a working bridge, complete with section specific feeds 2014-03-26 11:22:53 +01:00
Nicolas Delsaux
954bc4dde0 Improved caching behaviour and allowed subclasses to easily use logging 'infrastructure' 2014-03-26 11:20:24 +01:00
Nicolas Delsaux
fda3e9886e Allowed cache disabling to be performed on a per-query basis (very useful to add bridges to an existing and running installation of rss-bridge) 2014-03-26 11:16:31 +01:00
pauder
45f147ec24 Use the full size image in feed instead of the small sized version 2014-03-11 11:17:57 +01:00
Riduidel
f2f82c7d03 Prepared Gawker bridge by extracting file cache from initial Liberation bridge 2014-03-03 14:12:24 +01:00
Nicolas Delsaux
62a5265433 updated description 2014-02-20 12:00:50 +01:00
Nicolas Delsaux
ef0ce7d669 Strangely, those bridges didn't seems to work exactly as expected 2014-02-20 08:43:55 +01:00
Nicolas Delsaux
79e4e9fdea added a bridge for one Liberation blog that could easily be extended for others 2014-02-20 08:43:14 +01:00
Nicolas Delsaux
f7976419ae fixed title formatting 2014-02-20 08:42:40 +01:00
Nicolas Delsaux
5f150d3ae5 Outputting path to expected bridge should help newcomers feeling welcomed, no ? 2014-02-18 11:58:29 +01:00
Nicolas Delsaux
1644a855ee Finally, a working Seactu bridge (I ahve however a bug with trailing whitespaces 2014-02-18 11:55:47 +01:00
Sebastien SAUVAGE
9c8a9d1d1d Updated README.md 2014-02-09 15:59:16 +01:00
Sebastien SAUVAGE
589f1dbbad Small update on README.md 2014-02-09 15:37:16 +01:00
Sebastien SAUVAGE
a5591d9f54 Added Bandcamp
Merged manually from https://github.com/sebsauvage/rss-bridge/pull/24
2014-02-09 15:33:02 +01:00
Sebastien SAUVAGE
b4b3c4b0ac Added parameters checks for PinterestBridge 2014-02-09 15:20:52 +01:00
Sebastien SAUVAGE
a1152aee96 Added parameter check of OpenClassRooms. 2014-02-09 15:15:15 +01:00
Sebastien SAUVAGE
7c5118959d Removed non-working bridges 2014-02-09 15:08:03 +01:00
Sebastien SAUVAGE
531dddecdc Changed default number of article from 90 to 20 in CryptomeBridge. 2014-02-09 10:23:50 +01:00
Sebastien SAUVAGE
50a96a3f21 Corrected default number of articles in CryptomeBridge.
The bridge was outputting a single entry when parameter n was empty.
2014-02-08 18:18:09 +01:00
Sebastien SAUVAGE
a9d6fd3e46 Default to http for DDG bridge
Because some hosts do not support https.
2014-02-08 18:12:49 +01:00
Nicolas Delsaux
dbe9ae44df Correctiond e quelques boulettes, mais ca ne marche toujours pas 2014-02-05 10:16:45 +01:00
Nicolas Delsaux
4f1d4137d4 premire modification qui ne marche pas 2014-02-04 18:00:11 +01:00
Nicolas Delsaux
1323226677 ajout du script pour Sexactu 2014-02-04 17:54:18 +01:00
Nicolas Delsaux
4857cdbedc ajout des scriptsd e Superbaillot 2014-02-04 17:53:59 +01:00
Sébastien SAUVAGE
6b9074da2a Update README.md 2014-02-01 14:15:49 +01:00
Sébastien SAUVAGE
b51030d003 Merge pull request #25 from gsurrel/master
Added bridges for Wikipedia FR, EN and EO
2014-02-01 05:05:44 -08:00
Sébastien SAUVAGE
6c88a9f19f Merge pull request #26 from polo2ro/master
Add instagram bridge to rss-bridge
2014-02-01 05:04:34 -08:00
Sébastien SAUVAGE
5b02adf114 Merge pull request #23 from Astalaseven/bridges
[new] Bridges for DTC, SDZ and DDG
2014-02-01 05:04:00 -08:00
Sébastien SAUVAGE
b378396d38 Merge pull request #19 from qwertygc/master
Add the Futura Sciences Feed
2014-02-01 05:02:47 -08:00
pauder
4a63fed224 search query 2014-01-30 15:25:25 +01:00
pauder
19f806acd5 Add a pinterest bridge 2014-01-30 14:55:35 +01:00
pauder
e3d5027681 cache 2014-01-30 12:02:56 +01:00
pauder
d6693f4346 Fix bug because of a modification of instagram source page json
content
2014-01-30 11:55:39 +01:00
gsurrel
07d27e0421 Added Wikipedia Esperanto bridge 2014-01-02 11:58:10 +01:00
gsurrel
02c7b2be87 Corrected mistake in Wikipedia FR bridge if using absolute links 2014-01-02 11:43:21 +01:00
gsurrel
d7e2d65ff7 Added Wikipedia EN bridge (Today's featured article) 2014-01-02 11:42:39 +01:00
gsurrel
5288756d04 Corrected mistake in Wikipedia FR bridge 2014-01-02 11:42:02 +01:00
gsurrel
f01bc29f57 Added Wikipedia FR bridge 2014-01-02 11:26:15 +01:00
Astalaseven
25185cff4e [new] Scmb Bridge 2013-12-16 17:51:49 +01:00
Astalaseven
fb44d4d90d [new] DuckDuckGo Bridge 2013-12-16 15:29:33 +01:00
Astalaseven
33cf5a1cd5 [enh] Remove old comment 2013-12-16 09:11:33 +01:00
Astalaseven
4f59e2441c [new] Bridges for DTC and SDZ 2013-12-16 09:07:48 +01:00
pauder
3822e77561 more informations with a json parser 2013-10-29 15:59:22 +01:00
pauder
40f6e51b06 add date 2013-10-29 10:40:31 +01:00
pauder
c6ec5c45d1 Add Instagram bridge 2013-10-29 09:26:48 +01:00
Qwerty
aa9a0de6b9 Update README.md
Add gurumed.org
2013-09-02 11:53:47 +02:00
Qwerty
365033ac6a Create GuruMedBridge.php
The bridge for gurumed.org
2013-09-02 11:52:49 +02:00
Qwerty
05e480e6d2 Update README.md 2013-09-02 11:37:03 +02:00
Qwerty
9e3ef4869e Create FSBridge.php
I add the RSS feed of www.futura-sciences.com
2013-09-02 11:35:10 +02:00
Sébastien SAUVAGE
b866fb74c0 Merge pull request #12 from Djuuu/git-ignore-cache
Ignore cache directory
2013-08-19 05:15:01 -07:00
Djuuu
4bd89ffbbd Ignore cache directory 2013-08-19 10:51:38 +02:00
Sébastien SAUVAGE
f3dd80d73f Update TwitterBridge.php 2013-08-15 16:19:43 +02:00
Sébastien SAUVAGE
0d57d97772 Update README.md 2013-08-15 15:29:23 +02:00
Sébastien SAUVAGE
9b6e94d453 Update README.md 2013-08-15 15:27:57 +02:00
Sébastien SAUVAGE
f91ec300b0 Merge pull request #10 from ArthurHoaro/master
Ajouter la requête dans le titre des bridges
2013-08-15 06:23:14 -07:00
ArthurHoaro
dcf22f34bb Remove error debug 2013-08-15 14:00:11 +02:00
ArthurHoaro
bea563dab9 Bridge titles more accurate (and YoutubeBridge secured) 2013-08-15 13:58:58 +02:00
Sébastien SAUVAGE
8d73dd6cd7 Update README.md 2013-08-15 13:31:30 +02:00
Sébastien SAUVAGE
87276357ce Merge pull request #9 from mitsukarenai/master
Add IdenticaBridge: get major user activity
2013-08-15 04:25:37 -07:00
Mitsukarenai
dfd2110776 Add: Youtube Bridge 2013-08-15 12:05:58 +02:00
Mitsukarenai
bad913c806 Add IdenticaBridge: get major user activity 2013-08-15 11:02:43 +02:00
Sébastien SAUVAGE
2e480340de Update README.md
Added description for Cryptome bridge.
Updated screenshot.
2013-08-14 16:32:44 +02:00
Sébastien SAUVAGE
411b3280d1 Update CryptomeBridge.php
Use direct (non-HTTPs) cryptome.org URI.
2013-08-14 14:37:57 +02:00
Sébastien SAUVAGE
a1e360522c Merge pull request #8 from BoboTiG/master
Add CryptomeBridge
2013-08-14 05:36:12 -07:00
BoboTiG
a08289d78c Add CryptomeBridge: returns the N most recent documents. 2013-08-14 01:27:46 +02:00
Sebastien SAUVAGE
1cce03de28 Updated README. 2013-08-12 23:20:48 +02:00
Sebastien SAUVAGE
2066533467 Small corrections. 2013-08-12 22:54:09 +02:00
Sebastien SAUVAGE
5d492fad9b Added screenshot in README 2013-08-12 22:46:16 +02:00
Sebastien SAUVAGE
5a3f2bcfb9 Typo correction. 2013-08-12 22:43:22 +02:00
Sebastien SAUVAGE
4bf90735ef Corrections
* Corrected GoogleBridge (URI extraction was incorrect)
* Corrected ATOM format:
* mime-type was incorrect
* Hyperlinks were not clickable.
* non-UTF8 characters are now properly filtered.
* Corrected HTML format output:
* Hyperlinks were not clickable.
* Corrected error message when SimpleHtmlDom library is not installed.
* Added changelog.
2013-08-12 22:37:19 +02:00
155 changed files with 12561 additions and 1062 deletions

18
.gitignore vendored
View File

@@ -166,6 +166,12 @@ UpgradeLog*.htm
App_Data/*.mdf
App_Data/*.ldf
#################
## Other ide stuff
#################
.idea/*
[#]*[#]
#############
## Windows detritus
#############
@@ -214,3 +220,15 @@ pip-log.txt
#Mr Developer
.mr.developer.cfg
##############
## RSS-Bridge
##############
/cache
/whitelist.txt
DEBUG
######################
## VisualStudioCode ##
######################
.vscode/*

19
.travis.yml Normal file
View File

@@ -0,0 +1,19 @@
language: php
php:
- '5.6'
- '7.0'
- hhvm
- nightly
install:
- pear install PHP_CodeSniffer
script:
- phpenv rehash
- phpcs . --standard=phpcs.xml --warning-severity=0 --extensions=php -p
matrix:
fast_finish: true
allow_failures:
- php: hhvm
- php: nightly

163
CHANGELOG.md Normal file
View File

@@ -0,0 +1,163 @@
rss-bridge Changelog
===
Alpha 0.1
===
* First tagged version.
* Includes refactoring.
* Unstable.
Alpha 0.2
===
## Important changes
* RSS-Bridge has been [UNLICENSED](UNLICENSE)
* RSS-Bridge is now a community-managed project on [GitHub](https://github.com/rss-bridge/rss-bridge)
* RSS-Bridge now has a [Wiki](https://github.com/rss-bridge/rss-bridge/wiki)
* RSS-Bridge now supports [Travis-CI](https://travis-ci.org)
## General changes
* Added [CHANGELOG](CHANGELOG.md) (this file)
* Added [PHP Simple HTML DOM Parser](http://simplehtmldom.sourceforge.net) to [vendor](vendor/simplehtmldom/)
* Added cache purging function (cache will be force-purged after 24 hours or as defined by bridge)
* Added new format [MrssFormat](formats/MrssFormat.php)
* Added parameter `author` - for display of the feed author name - to all formats
* Added new abstraction of the BridgeInterface:
- [FeedExpander](https://github.com/RSS-Bridge/rss-bridge/wiki/Bridge-API)
* Added optional support for proxy usage on each individual bridge
* Added support for [custom bridge parameter](https://github.com/RSS-Bridge/rss-bridge/wiki/BridgeAbstract#format-specifications) (text, number, list, checkbox)
* Changed design of the welcome screen
* Changed design of HtmlFormat
* Changed behavior of debug mode:
- Enable debug mode by placing a file called "DEBUG" in the root folder
- Debug mode automatically disables cache file loading
* Changed implementation of bridges - see [Wiki](https://github.com/rss-bridge/rss-bridge/wiki)
- Changed comment-style metadata to constants
- Added support for multiple utilizations per bridge
- Changed the parameter loading algorithm to be loaded by RSS-Bridge core
* Improved checks for PHP version, configuration and extensions
* Many bug fixes
## Modified Bridges
* FlickrExploreBridge
* GoogleSearchBridge
* TwitterBridge
## New Bridges
* ABCTabsBridge
* AcrimedBridge
* AllocineFRBridge
* AnimeUltimeBridge
* Arte7Bridge
* AskfmBridge
* BandcampBridge
* BastaBridge
* BlaguesDeMerdeBridge
* BooruprojectBridge
* CADBridge
* CNETBridge
* CastorusBridge
* CollegeDeFranceBridge
* CommonDreamsBridge
* CopieDoubleBridge
* CourrierInternationalBridge
* CpasbienBridge
* CryptomeBridge
* DailymotionBridge
* DanbooruBridge
* DansTonChatBridge
* DauphineLibereBridge
* DemoBridge
* DeveloppezDotComBridge
* DilbertBridge
* DollbooruBridge
* DuckDuckGoBridge
* EZTVBridge
* EliteDangerousGalnetBridge
* ElsevierBridge
* EstCeQuonMetEnProdBridge
* FacebookBridge
* FierPandaBridge
* FlickrTagBridge
* FootitoBridge
* FourchanBridge
* FuturaSciencesBridge
* GBAtempBridge
* GelbooruBridge
* GiphyBridge
* GithubIssueBridge
* GizmodoBridge
* GooglePlusPostBridge
* HDWallpapersBridge
* HentaiHavenBridge
* IdenticaBridge
* InstagramBridge
* IsoHuntBridge
* JapanExpoBridge
* KonachanBridge
* KoreusBridge
* KununuBridge
* LWNprevBridge
* LeBonCoinBridge
* LegifranceJOBridge
* LeMondeInformatiqueBridge
* LesJoiesDuCodeBridge
* LichessBridge
* LinkedInCompanyBridge
* LolibooruBridge
* MangareaderBridge
* MilbooruBridge
* MoebooruBridge
* MondeDiploBridge
* MsnMondeBridge
* MspabooruBridge
* NasaApodBridge
* NeuviemeArtBridge
* NextInpactBridge
* NextgovBridge
* NiceMatinBridge
* NovelUpdatesBridge
* OpenClassroomsBridge
* ParuVenduImmoBridge
* PickyWallpapersBridge
* PinterestBridge
* PlanetLibreBridge
* RTBFBridge
* ReadComicsBridge
* Releases3DSBridge
* ReporterreBridge
* Rue89Bridge
* Rule34Bridge
* Rule34pahealBridge
* SafebooruBridge
* SakugabooruBridge
* ScmbBridge
* ScoopItBridge
* SensCritiqueBridge
* SexactuBridge
* ShanaprojectBridge
* Shimmie2Bridge
* SoundcloudBridge
* StripeAPIChangeLogBridge
* SuperbWallpapersBridge
* T411Bridge
* TagBoardBridge
* TbibBridge
* TheCodingLoveBridge
* TheHackerNewsBridge
* ThePirateBayBridge
* UnsplashBridge
* ViadeoCompanyBridge
* VineBridge
* VkBridge
* WallpaperStopBridge
* WebfailBridge
* WeLiveSecurityBridge
* WhydBridge
* WikipediaBridge
* WordPressBridge
* WorldOfTanksBridge
* XbooruBridge
* YandereBridge
* YoutubeBridge
* ZDNetBridge

136
README.md
View File

@@ -1,74 +1,142 @@
rss-bridge
===
[![LICENSE](https://img.shields.io/badge/license-UNLICENSE-blue.svg)](UNLICENSE)
Version alpha 0.1
rss-bridge is a PHP project capable of generating ATOM feeds for websites which don't have one.
rss-bridge is a collection of independant php scripts capable of generating ATOM feed for specific pages which don't have one.
Supported sites/pages
Supported sites/pages (main)
===
* `FlickrExplore` : [Latest interesting images](http://www.flickr.com/explore) from Flickr.
* `GoogleSearch` : Most recent results from Google Search. Parameters:
* q=keyword : Keyword search.
* `Twitter` : Twitter. Parameters:
* q=keyword : Keyword search.
* u=username : Get user timeline.
* `FlickrExplore` : [Latest interesting images](http://www.flickr.com/explore) from Flickr
* `GoogleSearch` : Most recent results from Google Search
* `GooglePlus` : Most recent posts of user timeline
* `Twitter` : Return keyword/hashtag search or user timeline
* `Identi.ca` : Identica user timeline (Should be compatible with other Pump.io instances)
* `YouTube` : YouTube user channel, playlist or search
* `Cryptome` : Returns the most recent documents from [Cryptome.org](http://cryptome.org/)
* `DansTonChat`: Most recent quotes from [danstonchat.com](http://danstonchat.com/)
* `DuckDuckGo`: Most recent results from [DuckDuckGo.com](https://duckduckgo.com/)
* `Instagram`: Most recent photos from an Instagram user
* `OpenClassrooms`: Lastest tutorials from [fr.openclassrooms.com](http://fr.openclassrooms.com/)
* `Pinterest`: Most recent photos from user or search
* `ScmbBridge`: Newest stories from [secouchermoinsbete.fr](http://secouchermoinsbete.fr/)
* `Wikipedia`: highlighted articles from [Wikipedia](https://wikipedia.org/) in English, German, French or Esperanto
* `Bandcamp` : Returns last release from [bandcamp](https://bandcamp.com/) for a tag
* `ThePirateBay` : Returns the newest indexed torrents from [The Pirate Bay](https://thepiratebay.se/) with keywords
* `Facebook` : Returns the latest posts on a page or profile on [Facebook](https://facebook.com/)
Easy new bridge system (detail below) !
Plus [many other bridges](bridges/) to enable, thanks to the community
Output format
===
Output format can be used in any rss-bridge:
Output format can take several forms:
* `Atom` : ATOM Feed.
* `Json` : Json
* `Html` : html page
* `Atom` : ATOM Feed, for use in RSS/Feed readers
* `Mrss` : MRSS Feed, for use in RSS/Feed readers
* `Json` : Json, for consumption by other applications.
* `Html` : Simple html page.
* `Plaintext` : raw text (php object, as returned by print_r)
Screenshot
===
![Screenshot](http://sebsauvage.net/galerie/photos/Bordel/rss-bridge-screenshot-1.png)
Welcome screen:
![Screenshot](https://github.com/RSS-Bridge/rss-bridge/wiki/images/screenshot_rss-bridge_welcome.png)
RSS-Bridge hashtag (#rss-bridge) search on Twitter, in ATOM format (as displayed by Firefox):
![Screenshot](https://github.com/RSS-Bridge/rss-bridge/wiki/images/screenshot_twitterbridge_atom.png)
Requirements
===
* php 5.3
* [PHP Simple HTML DOM Parser](http://simplehtmldom.sourceforge.net). (Put `simple_html_dom.php` in `vendor/simplehtmldom`).
* Ssl lib activated in PHP config
* PHP 5.6, e.g. `AddHandler application/x-httpd-php56 .php` in `.htaccess`
* `openssl` extension enabled in PHP config (`php.ini`)
* `allow_url_fopen=1` in `php.ini`
Author
Enabling/Disabling bridges
===
I'm sebsauvage, webmaster of [sebsauvage.net](http://sebsauvage.net), author of [Shaarli](http://sebsauvage.net/wiki/doku.php?id=php:shaarli) and [ZeroBin](http://sebsauvage.net/wiki/doku.php?id=php:zerobin).
Thanks to [Mitsukarenai](https://github.com/Mitsukarenai) for the inspiration.
By default, the script creates `whitelist.txt` and adds the main bridges (see above). `whitelist.txt` is ignored by git, you can edit it:
* to enable extra bridges (one bridge per line)
* to disable main bridges (remove the line)
* to enable all bridges (just one wildcard `*` as file content)
Patch :
- Yves ASTIER (Draeli) : PHP optimizations, fixes, dynamic brigde/format list with all stuff behind and extend cache system. Mail : contact@yves-astier.com
New bridges are disabled by default, so make sure to check regularly what's new and whitelist what you want!
Licence
Deploy
===
Code is public domain.
[![Deploy on Scalingo](https://cdn.scalingo.com/deploy/button.svg)](https://my.scalingo.com/deploy?source=https://github.com/sebsauvage/rss-bridge)
Authors
===
We are RSS Bridge Community, a group of developers continuing the project initiated by sebsauvage, webmaster of [sebsauvage.net](http://sebsauvage.net), author of [Shaarli](http://sebsauvage.net/wiki/doku.php?id=php:shaarli) and [ZeroBin](http://sebsauvage.net/wiki/doku.php?id=php:zerobin).
Patch/contributors :
* Yves ASTIER ([Draeli](https://github.com/Draeli)) : PHP optimizations, fixes, dynamic brigde/format list with all stuff behind and extend cache system. Mail : contact /at\ yves-astier.com
* [Mitsukarenai](https://github.com/Mitsukarenai) : Initial inspiration, collaborator
* [ArthurHoaro](https://github.com/ArthurHoaro)
* [BoboTiG](https://github.com/BoboTiG)
* [Astalaseven](https://github.com/Astalaseven)
* [qwertygc](https://github.com/qwertygc)
* [Djuuu](https://github.com/Djuuu)
* [Anadrark](https://github.com/Anadrark])
* [Grummfy](https://github.com/Grummfy)
* [Polopollo](https://github.com/Polopollo)
* [16mhz](https://github.com/16mhz)
* [kranack](https://github.com/kranack)
* [logmanoriginal](https://github.com/logmanoriginal)
* [polo2ro](https://github.com/polo2ro)
* [Riduidel](https://github.com/Riduidel)
* [superbaillot.net](http://superbaillot.net/)
* [vinzv](https://github.com/vinzv)
* [teromene](https://github.com/teromene)
* [nel50n](https://github.com/nel50n)
* [nyutag](https://github.com/nyutag)
* [ORelio](https://github.com/ORelio)
* [Pitchoule](https://github.com/Pitchoule)
* [pit-fgfjiudghdf](https://github.com/pit-fgfjiudghdf)
* [aledeg](https://github.com/aledeg)
* [alexAubin](https://github.com/alexAubin)
* [cnlpete](https://github.com/cnlpete)
* [corenting](https://github.com/corenting)
* [Daiyousei](https://github.com/Daiyousei)
* [erwang](https://github.com/erwang)
* [gsurrel](https://github.com/gsurrel)
* [kraoc](https://github.com/kraoc)
* [lagaisse](https://github.com/lagaisse)
* [az5he6ch](https://github.com/az5he6ch)
* [niawag](https://github.com/niawag)
* [JeremyRand](https://github.com/JeremyRand)
* [mro](https://github.com/mro)
Licenses
===
Code is [Public Domain](UNLICENSE).
Including `PHP Simple HTML DOM Parser` under the [MIT License](http://opensource.org/licenses/MIT)
Technical notes
===
* There is a cache so that source services won't ban you even if you hammer the rss-bridge with requests. Each bridge has a different duration for the cache. The `cache` subdirectory will be automatically created. You can purge it whenever you want.
* To implement a new rss-bridge, create a new class in `bridges` directory and extends with `BridgeAbstract`. Look at existing bridges for examples. For items you generate in `$this->items`, only `uri` and `title` are mandatory in each item. `timestamp` and `content` are optional but recommended. Any additional key will be ignored by ATOM feed (but outputed to jSon). If you want your new bridge appear in `index.php`, don't forget add annotation.
* There is a cache so that source services won't ban you even if you hammer the rss-bridge with requests. Each bridge can have a different duration for the cache. The `cache` subdirectory will be automatically created and cached objects older than 24 hours get purged.
* To implement a new Bridge, [follow the specifications](https://github.com/RSS-Bridge/rss-bridge/wiki/Bridge-API) and take a look at existing Bridges for examples.
* To enable debug mode (disabling cache and enabling error reporting), create an empty file named `DEBUG` in the root directory (next to `index.php`).
* For more information refer to the [Wiki](https://github.com/RSS-Bridge/rss-bridge/wiki)
Rant
===
*Dear so-called "social" websites.*
Your catchword is <EFBFBD>share<EFBFBD>, but you don't want us to share. You want to keep us within your walled gardens. That's why you've been removing RSS links from webpages, hiding them deep on your website, or removed RSS entirely, replacing it with crippled or demented proprietary API. **FUCK YOU.**
Your catchword is "share", but you don't want us to share. You want to keep us within your walled gardens. That's why you've been removing RSS links from webpages, hiding them deep on your website, or removed feeds entirely, replacing it with crippled or demented proprietary API. **FUCK YOU.**
You're not social when you hamper sharing by removing RSS. You're happy to have customers create content for your ecosystem, but you don't want this content out - a content you do not even own. Google Takeout is just a gimmick. We want our data to flow, we want RSS.
You're not social when you hamper sharing by removing feeds. You're happy to have customers creating content for your ecosystem, but you don't want this content out - a content you do not even own. Google Takeout is just a gimmick. We want our data to flow, we want RSS or ATOM feeds.
We want to share with friends, using open protocols: RSS, XMPP, whatever. Because no one wants to have *your* service with *your* applications using *your* API forced-feeded to them. Friends must be free to choose whatever software and service they want.
We want to share with friends, using open protocols: RSS, ATOM, XMPP, whatever. Because no one wants to have *your* service with *your* applications using *your* API force-feeding them. Friends must be free to choose whatever software and service they want.
We are rebuilding bridges your have wilfully destroyed.
We are rebuilding bridges you have wilfully destroyed.
Get your shit together: Put RSS back in.
Get your shit together: Put RSS/ATOM back in.

25
UNLICENSE Normal file
View File

@@ -0,0 +1,25 @@
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.
In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to <http://unlicense.org>

25
bridges/ABCTabsBridge.php Normal file
View File

@@ -0,0 +1,25 @@
<?php
class ABCTabsBridge extends BridgeAbstract{
const MAINTAINER = "kranack";
const NAME = "ABC Tabs Bridge";
const URI = "http://www.abc-tabs.com/";
const DESCRIPTION = "Returns 22 newest tabs";
public function collectData(){
$html = '';
$html = getSimpleHTMLDOM(static::URI.'tablatures/nouveautes.html') or returnClientError('No results for this query.');
$table = $html->find('table#myTable', 0)->children(1);
foreach ($table->find('tr') as $tab)
{
$item = array();
$item['author'] = $tab->find('td', 1)->plaintext . ' - ' . $tab->find('td', 2)->plaintext;
$item['title'] = $tab->find('td', 1)->plaintext . ' - ' . $tab->find('td', 2)->plaintext;
$item['content'] = 'Le ' . $tab->find('td', 0)->plaintext . '<br> Par: ' . $tab->find('td', 5)->plaintext . '<br> Type: ' . $tab->find('td', 3)->plaintext;
$item['id'] = static::URI . $tab->find('td', 2)->find('a', 0)->getAttribute('href');
$item['uri'] = static::URI . $tab->find('td', 2)->find('a', 0)->getAttribute('href');
$this->items[] = $item;
}
}
}

25
bridges/AcrimedBridge.php Normal file
View File

@@ -0,0 +1,25 @@
<?php
class AcrimedBridge extends FeedExpander {
const MAINTAINER = "qwertygc";
const NAME = "Acrimed Bridge";
const URI = "http://www.acrimed.org/";
const CACHE_TIMEOUT = 4800; //2hours
const DESCRIPTION = "Returns the newest articles.";
public function collectData(){
$this->collectExpandableDatas(static::URI.'spip.php?page=backend');
}
protected function parseItem($newsItem){
$item = parent::parseItem($newsItem);
$articlePage = getSimpleHTMLDOM($newsItem->link);
$article = sanitize($articlePage->find('article.article1', 0)->innertext);
$article = defaultImageSrcTo($article, static::URI);
$item['content'] = $article;
return $item;
}
}

View File

@@ -0,0 +1,82 @@
<?php
class AllocineFRBridge extends BridgeAbstract{
const MAINTAINER = "superbaillot.net";
const NAME = "Allo Cine Bridge";
const CACHE_TIMEOUT = 25200; // 7h
const URI = "http://www.allocine.fr/";
const DESCRIPTION = "Bridge for allocine.fr";
const PARAMETERS = array( array(
'category'=>array(
'name'=>'category',
'type'=>'list',
'required'=>true,
'exampleValue'=>'Faux Raccord',
'title'=>'Select your category',
'values'=>array(
'Faux Raccord'=>'faux-raccord',
'Top 5'=>'top-5',
'Tueurs en Séries'=>'tueurs-en-serie'
)
)
));
public function getURI(){
switch($this->getInput('category')){
case 'faux-raccord':
$uri = static::URI.'video/programme-12284/saison-27129/';
break;
case 'top-5':
$uri = static::URI.'video/programme-12299/saison-29561/';
break;
case 'tueurs-en-serie':
$uri = static::URI.'video/programme-12286/saison-22938/';
break;
}
return $uri;
}
public function getName(){
return self::NAME.' : '
.array_search(
$this->getInput('category'),
self::PARAMETERS[$this->queriedContext]['category']['values']
);
}
public function collectData(){
$html = getSimpleHTMLDOM($this->getURI())
or returnServerError("Could not request ".$this->getURI()." !");
$category=array_search(
$this->getInput('category'),
self::PARAMETERS[$this->queriedContext]['category']['values']
);
foreach($html->find('figure.media-meta-fig') as $element)
{
$item = array();
$title = $element->find('div.titlebar h3.title a', 0);
$content = trim($element->innertext);
$figCaption = strpos($content, $category);
if($figCaption !== false)
{
$content = str_replace('src="/', 'src="'.static::URI, $content);
$content = str_replace('href="/', 'href="'.static::URI, $content);
$content = str_replace('src=\'/', 'src=\''.static::URI, $content);
$content = str_replace('href=\'/', 'href=\''.static::URI, $content);
$item['content'] = $content;
$item['title'] = trim($title->innertext);
$item['uri'] = static::URI . $title->href;
$this->items[] = $item;
}
}
}
}

View File

@@ -0,0 +1,119 @@
<?php
class AnimeUltimeBridge extends BridgeAbstract {
const MAINTAINER = 'ORelio';
const NAME = 'Anime-Ultime';
const URI = 'http://www.anime-ultime.net/';
const CACHE_TIMEOUT = 10800; // 3h
const DESCRIPTION = 'Returns the 10 newest releases posted on Anime-Ultime';
const PARAMETERS = array( array(
'type'=>array(
'name'=>'Type',
'type'=>'list',
'values'=>array(
'Everything'=>'',
'Anime'=>'A',
'Drama'=>'D',
'Tokusatsu'=>'T'
)
)
));
private $filter = 'Releases';
public function collectData(){
//Add type filter if provided
$typeFilter = array_search(
$this->getInput('type'),
self::PARAMETERS[$this->queriedContext]['type']['values']
);
//Build date and filters for making requests
$thismonth = date('mY').$typeFilter;
$lastmonth = date('mY', mktime(0, 0, 0, date('n') - 1, 1, date('Y'))).$typeFilter;
//Process each HTML page until having 10 releases
$processedOK = 0;
foreach (array($thismonth, $lastmonth) as $requestFilter) {
//Retrive page contents
$url = self::URI.'history-0-1/'.$requestFilter;
$html = getSimpleHTMLDOM($url)
or returnServerError('Could not request Anime-Ultime: '.$url);
//Relases are sorted by day : process each day individually
foreach ($html->find('div.history', 0)->find('h3') as $daySection) {
//Retrieve day and build date information
$dateString = $daySection->plaintext;
$day = intval(substr($dateString, strpos($dateString, ' ') + 1, 2));
$item_date = strtotime(str_pad($day, 2, '0', STR_PAD_LEFT).'-'
.substr($requestFilter, 0, 2).'-'
.substr($requestFilter, 2, 4));
$release = $daySection->next_sibling()->next_sibling()->first_child(); //<h3>day</h3><br /><table><tr> <-- useful data in table rows
//Process each release of that day, ignoring first table row: contains table headers
while (!is_null($release = $release->next_sibling())) {
if (count($release->find('td')) > 0) {
//Retrieve metadata from table columns
$item_link_element = $release->find('td', 0)->find('a', 0);
$item_uri = self::URI.$item_link_element->href;
$item_name = html_entity_decode($item_link_element->plaintext);
$item_episode = html_entity_decode(str_pad($release->find('td', 1)->plaintext, 2, '0', STR_PAD_LEFT));
$item_fansub = $release->find('td', 2)->plaintext;
$item_type = $release->find('td', 4)->plaintext;
if (!empty($item_uri)) {
//Retrieve description from description page and convert relative image src info absolute image src
$html_item = getContents($item_uri)
or returnServerError('Could not request Anime-Ultime: '.$item_uri);
$item_description = substr(
$html_item,
strpos($html_item, 'class="principal_contain" align="center">')
+ 41
);
$item_description = substr($item_description,
0,
strpos($item_description, '<div id="table">')
);
$item_description = str_replace(
'src="images', 'src="'.self::URI.'images',
$item_description
);
$item_description = str_replace("\r", '', $item_description);
$item_description = str_replace("\n", '', $item_description);
$item_description = utf8_encode($item_description);
//Build and add final item
$item = array();
$item['uri'] = $item_uri;
$item['title'] = $item_name.' '.$item_type.' '.$item_episode;
$item['author'] = $item_fansub;
$item['timestamp'] = $item_date;
$item['content'] = $item_description;
$this->items[] = $item;
$processedOK++;
//Stop processing once limit is reached
if ($processedOK >= 10)
return;
}
}
}
}
}
}
public function getName() {
$typeFilter = array_search(
$this->getInput('type'),
self::PARAMETERS[$this->queriedContext]['type']['values']
);
return 'Latest '.$typeFilter.' - Anime-Ultime Bridge';
}
}

91
bridges/Arte7Bridge.php Normal file
View File

@@ -0,0 +1,91 @@
<?php
class Arte7Bridge extends BridgeAbstract{
const MAINTAINER = "mitsukarenai";
const NAME = "Arte +7";
const URI = "http://www.arte.tv/";
const CACHE_TIMEOUT = 1800; // 30min
const DESCRIPTION = "Returns newest videos from ARTE +7";
const PARAMETERS = array(
'Catégorie (Français)' => array(
'catfr'=>array(
'type'=>'list',
'name'=>'Catégorie',
'values'=>array(
'Toutes les vidéos (français)'=>'toutes-les-videos',
'Actu & société'=>'actu-société',
'Séries & fiction'=>'séries-fiction',
'Cinéma'=>'cinéma',
'Arts & spectacles classiques'=>'arts-spectacles-classiques',
'Culture pop'=>'culture-pop',
'Découverte'=>'découverte',
'Histoire'=>'histoire',
'Junior'=>'junior'
)
)
),
'Catégorie (Allemand)' => array(
'catde'=>array(
'type'=>'list',
'name'=>'Catégorie',
'values'=>array(
'Alle Videos (deutsch)'=>'alle-videos',
'Aktuelles & Gesellschaft'=>'aktuelles-gesellschaft',
'Fernsehfilme & Serien'=>'fernsehfilme-serien',
'Kino'=>'kino',
'Kunst & Kultur'=>'kunst-kultur',
'Popkultur & Alternativ'=>'popkultur-alternativ',
'Entdeckung'=>'entdeckung',
'Geschichte'=>'geschichte',
'Junior'=>'junior'
)
)
)
);
public function collectData(){
switch($this->queriedContext){
case 'Catégorie (Français)':
$category=$this->getInput('catfr');
$lang='fr';
break;
case 'Catégorie (Allemand)':
$category=$this->getInput('catde');
$lang='de';
break;
}
$url = self::URI.'guide/'.$lang.'/plus7/'.$category;
$input = getContents($url) or die('Could not request ARTE.');
if(strpos($input, 'categoryVideoSet') !== FALSE){
$input = explode('categoryVideoSet="', $input);
$input = explode('}}', $input[1]);
$input = $input[0].'}}';
}else{
$input = explode('videoSet="', $input);
$input = explode('}]}', $input[1]);
$input = $input[0].'}]}';
}
$input_json = json_decode(html_entity_decode($input, ENT_QUOTES), TRUE);
foreach($input_json['videos'] as $element) {
$item = array();
$item['uri'] = str_replace("autoplay=1", "", $element['url']);
$item['id'] = $element['id'];
$hack_broadcast_time = $element['rights_end'];
$hack_broadcast_time = strtok($hack_broadcast_time, 'T');
$hack_broadcast_time = strtok('T');
$item['timestamp'] = strtotime($element['scheduled_on'].'T'.$hack_broadcast_time);
$item['title'] = $element['title'];
if (!empty($element['subtitle']))
$item['title'] = $element['title'].' | '.$element['subtitle'];
$item['duration'] = round((int)$element['duration']/60);
$item['content'] = $element['teaser'].'<br><br>'.$item['duration'].'min<br><a href="'.$item['uri'].'"><img src="' . $element['thumbnail_url'] . '" /></a>';
$this->items[] = $item;
}
}
}

52
bridges/AskfmBridge.php Normal file
View File

@@ -0,0 +1,52 @@
<?php
class AskfmBridge extends BridgeAbstract{
const MAINTAINER = "az5he6ch";
const NAME = "Ask.fm Answers";
const URI = "http://ask.fm/";
const CACHE_TIMEOUT = 300; //5 min
const DESCRIPTION = "Returns answers from an Ask.fm user";
const PARAMETERS = array(
'Ask.fm username'=>array(
'u'=>array(
'name'=>'Username',
'required'=>true
)
)
);
public function collectData(){
$html = getSimpleHTMLDOM($this->getURI())
or returnServerError('Requested username can\'t be found.');
foreach($html->find('div.streamItem-answer') as $element) {
$item = array();
$item['uri'] = self::URI.$element->find('a.streamItemsAge',0)->href;
$question = trim($element->find('h1.streamItemContent-question',0)->innertext);
$item['title'] = trim(htmlspecialchars_decode($element->find('h1.streamItemContent-question',0)->plaintext, ENT_QUOTES));
$answer = trim($element->find('p.streamItemContent-answer',0)->innertext);
#$item['update'] = $element->find('a.streamitemsage',0)->data-hint; // Doesn't work, DOM parser doesn't seem to like data-hint, dunno why
$visual = $element->find('div.streamItemContent-visual',0)->innertext; // This probably should be cleaned up, especially for YouTube embeds
//Fix tracking links, also doesn't work
foreach($element->find('a') as $link) {
if (strpos($link->href, 'l.ask.fm') !== false) {
#$link->href = str_replace('#_=_', '', get_headers($link->href, 1)['Location']); // Too slow
$link->href = $link->plaintext;
}
}
$content = '<p>' . $question . '</p><p>' . $answer . '</p><p>' . $visual . '</p>';
// Fix relative links without breaking // scheme used by YouTube stuff
$content = preg_replace('#href="\/(?!\/)#', 'href="'.self::URI,$content);
$item['content'] = $content;
$this->items[] = $item;
}
}
public function getName(){
return self::NAME.' : '.$this->getInput('u');
}
public function getURI(){
return self::URI.urlencode($this->getInput('u')).'/answers/more?page=0';
}
}

View File

@@ -0,0 +1,43 @@
<?php
class BandcampBridge extends BridgeAbstract{
const MAINTAINER = "sebsauvage";
const NAME = "Bandcamp Tag";
const URI = "http://bandcamp.com/";
const CACHE_TIMEOUT = 600; // 10min
const DESCRIPTION = "New bandcamp release by tag";
const PARAMETERS = array( array(
'tag'=>array(
'name'=>'tag',
'type'=>'text',
'required'=>true
)
));
public function collectData(){
$html = getSimpleHTMLDOM($this->getURI())
or returnServerError('No results for this query.');
foreach($html->find('li.item') as $release) {
$script = $release->find('div.art', 0)->getAttribute('onclick');
$uri = ltrim($script, "return 'url(");
$uri = rtrim($uri, "')");
$item = array();
$item['author'] = $release->find('div.itemsubtext',0)->plaintext . ' - ' . $release->find('div.itemtext',0)->plaintext;
$item['title'] = $release->find('div.itemsubtext',0)->plaintext . ' - ' . $release->find('div.itemtext',0)->plaintext;
$item['content'] = '<img src="' . $uri . '"/><br/>' . $release->find('div.itemsubtext',0)->plaintext . ' - ' . $release->find('div.itemtext',0)->plaintext;
$item['id'] = $release->find('a',0)->getAttribute('href');
$item['uri'] = $release->find('a',0)->getAttribute('href');
$this->items[] = $item;
}
}
public function getURI(){
return self::URI.'tag/'.urlencode($this->getInput('tag')).'?sort_field=date';
}
public function getName(){
return $this->getInput('tag') .' - '.'Bandcamp Tag';
}
}

32
bridges/BastaBridge.php Normal file
View File

@@ -0,0 +1,32 @@
<?php
class BastaBridge extends BridgeAbstract{
const MAINTAINER = "qwertygc";
const NAME = "Bastamag Bridge";
const URI = "http://www.bastamag.net/";
const CACHE_TIMEOUT = 7200; // 2h
const DESCRIPTION = "Returns the newest articles.";
public function collectData(){
// Replaces all relative image URLs by absolute URLs. Relative URLs always start with 'local/'!
function ReplaceImageUrl($content){
return preg_replace('/src=["\']{1}([^"\']+)/ims', 'src=\''.self::URI.'$1\'', $content);
}
$html = getSimpleHTMLDOM(self::URI.'spip.php?page=backend')
or returnServerError('Could not request Bastamag.');
$limit = 0;
foreach($html->find('item') as $element) {
if($limit < 10) {
$item = array();
$item['title'] = $element->find('title', 0)->innertext;
$item['uri'] = $element->find('guid', 0)->plaintext;
$item['timestamp'] = strtotime($element->find('dc:date', 0)->plaintext);
$item['content'] = ReplaceImageUrl(getSimpleHTMLDOM($item['uri'])->find('div.texte', 0)->innertext);
$this->items[] = $item;
$limit++;
}
}
}
}
?>

View File

@@ -0,0 +1,33 @@
<?php
class BlaguesDeMerdeBridge extends BridgeAbstract{
const MAINTAINER = "superbaillot.net";
const NAME = "Blagues De Merde";
const URI = "http://www.blaguesdemerde.fr/";
const CACHE_TIMEOUT = 7200; // 2h
const DESCRIPTION = "Blagues De Merde";
public function collectData(){
$html = getSimpleHTMLDOM(self::URI)
or returnServerError('Could not request BDM.');
foreach($html->find('article.joke_contener') as $element) {
$item = array();
$temp = $element->find('a');
if(isset($temp[2]))
{
$item['content'] = trim($element->find('div.joke_text_contener', 0)->innertext);
$uri = $temp[2]->href;
$item['uri'] = $uri;
$item['title'] = substr($uri, (strrpos($uri, "/") + 1));
$date = $element->find("li.bdm_date",0)->innertext;
$time = mktime(0, 0, 0, substr($date, 3, 2), substr($date, 0, 2), substr($date, 6, 4));
$item['timestamp'] = $time;
$item['author'] = $element->find("li.bdm_pseudo",0)->innertext;;
$this->items[] = $item;
}
}
}
}
?>

View File

@@ -0,0 +1,36 @@
<?php
require_once('GelbooruBridge.php');
class BooruprojectBridge extends GelbooruBridge{
const MAINTAINER = "mitsukarenai";
const NAME = "Booruproject";
const URI = "http://booru.org/";
const DESCRIPTION = "Returns images from given page of booruproject";
const PARAMETERS = array(
'global'=>array(
'p'=>array(
'name'=>'page',
'type'=>'number'
),
't'=>array('name'=>'tags')
),
'Booru subdomain (subdomain.booru.org)'=>array(
'i'=>array(
'name'=>'Subdomain',
'required'=>true
)
)
);
const PIDBYPAGE=20;
public function getURI(){
return 'http://'.$this->getInput('i').'.booru.org/';
}
public function getName(){
return static::NAME . ' ' . $this->getInput('i');
}
}

46
bridges/CADBridge.php Normal file
View File

@@ -0,0 +1,46 @@
<?php
class CADBridge extends FeedExpander {
const MAINTAINER = "nyutag";
const NAME = "CAD Bridge";
const URI = "http://www.cad-comic.com/";
const CACHE_TIMEOUT = 7200; //2h
const DESCRIPTION = "Returns the newest articles.";
public function collectData(){
$this->collectExpandableDatas('http://cdn2.cad-comic.com/rss.xml', 10);
}
protected function parseItem($newsItem){
$item = parent::parseItem($newsItem);
$item['content'] = $this->CADExtractContent($item['uri']);
return $item;
}
private function CADExtractContent($url) {
$html3 = getSimpleHTMLDOMCached($url);
// The request might fail due to missing https support or wrong URL
if($html3 == false)
return 'Daily comic not released yet';
$htmlpart = explode("/", $url);
switch ($htmlpart[3]){
case 'cad':
preg_match_all("/http:\/\/cdn2\.cad-comic\.com\/comics\/cad-\S*png/", $html3, $url2);
break;
case 'sillies':
preg_match_all("/http:\/\/cdn2\.cad-comic\.com\/comics\/sillies-\S*gif/", $html3, $url2);
break;
default:
return 'Daily comic not released yet';
}
$img = implode ($url2[0]);
$html3->clear();
unset ($html3);
if ($img == '')
return 'Daily comic not released yet';
return '<img src="'.$img.'"/>';
}
}
?>

76
bridges/CNETBridge.php Normal file
View File

@@ -0,0 +1,76 @@
<?php
class CNETBridge extends BridgeAbstract {
const MAINTAINER = 'ORelio';
const NAME = 'CNET News';
const URI = 'http://www.cnet.com/';
const CACHE_TIMEOUT = 1800; // 30min
const DESCRIPTION = 'Returns the newest articles. <br /> You may specify a topic found in some section URLs, else all topics are selected.';
const PARAMETERS = array( array(
'topic'=>array('name'=>'Topic name')
));
public function collectData(){
function ExtractFromDelimiters($string, $start, $end) {
if (strpos($string, $start) !== false) {
$section_retrieved = substr($string, strpos($string, $start) + strlen($start));
$section_retrieved = substr($section_retrieved, 0, strpos($section_retrieved, $end));
return $section_retrieved;
} return false;
}
function StripWithDelimiters($string, $start, $end) {
while (strpos($string, $start) !== false) {
$section_to_remove = substr($string, strpos($string, $start));
$section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end));
$string = str_replace($section_to_remove, '', $string);
} return $string;
}
function CleanArticle($article_html) {
$article_html = '<p>'.substr($article_html, strpos($article_html, '<p>') + 3);
$article_html = StripWithDelimiters($article_html, '<span class="credit">', '</span>');
$article_html = StripWithDelimiters($article_html, '<script', '</script>');
$article_html = StripWithDelimiters($article_html, '<div class="shortcode related-links', '</div>');
$article_html = StripWithDelimiters($article_html, '<a class="clickToEnlarge">', '</a>');
return $article_html;
}
$pageUrl = self::URI.(empty($this->getInput('topic')) ? '' : 'topics/'.$this->getInput('topic').'/');
$html = getSimpleHTMLDOM($pageUrl) or returnServerError('Could not request CNET: '.$pageUrl);
$limit = 0;
foreach($html->find('div.assetBody') as $element) {
if ($limit < 8) {
$article_title = trim($element->find('h2', 0)->plaintext);
$article_uri = self::URI.($element->find('a', 0)->href);
$article_timestamp = strtotime($element->find('time.assetTime', 0)->plaintext);
$article_author = trim($element->find('a[rel=author]', 0)->plaintext);
if (!empty($article_title) && !empty($article_uri) && strpos($article_uri, '/news/') !== false) {
$article_html = getSimpleHTMLDOM($article_uri) or returnServerError('Could not request CNET: '.$article_uri);
$article_content = trim(CleanArticle(ExtractFromDelimiters($article_html, '<div class="articleContent', '<footer>')));
$item = array();
$item['uri'] = $article_uri;
$item['title'] = $article_title;
$item['author'] = $article_author;
$item['timestamp'] = $article_timestamp;
$item['content'] = $article_content;
$this->items[] = $item;
$limit++;
}
}
}
}
public function getName() {
$topic=$this->getInput('topic');
return 'CNET News Bridge'.(empty($topic) ? '' : ' - '.$topic);
}
}

111
bridges/CastorusBridge.php Normal file
View File

@@ -0,0 +1,111 @@
<?php
class CastorusBridge extends BridgeAbstract {
const MAINTAINER = "logmanoriginal";
const NAME = "Castorus Bridge";
const URI = 'http://www.castorus.com';
const CACHE_TIMEOUT = 600; // 10min
const DESCRIPTION = "Returns the latest changes";
const PARAMETERS = array(
'Get latest changes' => array(),
'Get latest changes via ZIP code' => array(
'zip'=>array(
'name'=>'ZIP code',
'type'=>'text',
'required'=>true,
'exampleValue'=>'74910, 74',
'title'=>'Insert ZIP code (complete or partial)'
)
),
'Get latest changes via city name' => array(
'city'=>array(
'name'=>'City name',
'type'=>'text',
'required'=>true,
'exampleValue'=>'Seyssel, Seys',
'title'=>'Insert city name (complete or partial)'
)
)
);
// Extracts the tile from an actitiy
private function ExtractActivityTitle($activity){
$title = $activity->find('a', 0);
if(!$title)
returnServerError('Cannot find title!');
return htmlspecialchars(trim($title->plaintext));
}
// Extracts the url from an actitiy
private function ExtractActivityUrl($activity){
$url = $activity->find('a', 0);
if(!$url)
returnServerError('Cannot find url!');
return self::URI . $url->href;
}
// Extracts the time from an activity
private function ExtractActivityTime($activity){
// Unfortunately the time is part of the parent node,
// so we have to clear all child nodes first
$nodes = $activity->find('*');
if(!$nodes)
returnServerError('Cannot find nodes!');
foreach($nodes as $node){
$node->outertext = '';
}
return strtotime($activity->innertext);
}
// Extracts the price change
private function ExtractActivityPrice($activity){
$price = $activity->find('span', 1);
if(!$price)
returnServerError('Cannot find price!');
return $price->innertext;
}
public function collectData(){
$zip_filter = trim($this->getInput('zip'));
$city_filter = trim($this->getInput('city'));
$html = getSimpleHTMLDOM(self::URI);
if(!$html)
returnServerError('Could not load data from ' . self::URI . '!');
$activities = $html->find('div#activite/li');
if(!$activities)
returnServerError('Failed to find activities!');
foreach($activities as $activity){
$item = array();
$item['title'] = $this->ExtractActivityTitle($activity);
$item['uri'] = $this->ExtractActivityUrl($activity);
$item['timestamp'] = $this->ExtractActivityTime($activity);
$item['content'] = '<a href="' . $item['uri'] . '">' . $item['title'] . '</a><br><p>'
. $this->ExtractActivityPrice($activity) . '</p>';
if(isset($zip_filter) && !(substr($item['title'], 0, strlen($zip_filter)) === $zip_filter)){
continue; // Skip this item
}
if(isset($city_filter) && !(substr($item['title'], strpos($item['title'], ' ') + 1, strlen($city_filter)) === $city_filter)){
continue; // Skip this item
}
$this->items[] = $item;
}
}
}

View File

@@ -0,0 +1,70 @@
<?php
class CollegeDeFranceBridge extends BridgeAbstract{
const MAINTAINER = "pit-fgfjiudghdf";
const NAME = "CollegeDeFrance";
const URI = "http://www.college-de-france.fr/";
const CACHE_TIMEOUT = 10800; // 3h
const DESCRIPTION = "Returns the latest audio and video from CollegeDeFrance";
public function collectData(){
$months = array(
'01' => 'janv.',
'02' => 'févr.',
'03' => 'mars',
'04' => 'avr.',
'05' => 'mai',
'06' => 'juin',
'07' => 'juil.',
'08' => 'août',
'09' => 'sept.',
'10' => 'oct.',
'11' => 'nov.',
'12' => 'déc.'
);
// The "API" used by the site returns a list of partial HTML in this form
/* <li>
* <a href="/site/thomas-romer/guestlecturer-2016-04-15-14h30.htm" data-target="after">
* <span class="date"><span class="list-icon list-icon-video"></span><span class="list-icon list-icon-audio"></span>15 avr. 2016</span>
* <span class="lecturer">Christopher Hays</span>
* <span class='title'>Imagery of Divine Suckling in the Hebrew Bible and the Ancient Near East</span>
* </a>
* </li>
*/
$html = getSimpleHTMLDOM(self::URI.'components/search-audiovideo.jsp?fulltext=&siteid=1156951719600&lang=FR&type=all')
or returnServerError('Could not request CollegeDeFrance.');
foreach($html->find('a[data-target]') as $element) {
$item = array();
$item['title'] = $element->find('.title', 0)->plaintext;
// Most relative URLs contains an hour in addition to the date, so let's use it
// <a href="/site/yann-lecun/course-2016-04-08-11h00.htm" data-target="after">
//
// Sometimes there's an __1, perhaps it signifies an update "/site/patrick-boucheron/seminar-2016-05-03-18h00__1.htm"
//
// But unfortunately some don't have any hours info
// <a href="/site/institut-physique/The-Mysteries-of-Decoherence-Sebastien-Gleyzes-[Video-3-35].htm" data-target="after">
$timezone = new DateTimeZone('Europe/Paris');
// strpos($element->href, '201') will break in 2020 but it'll probably break prior to then due to site changes anyway
$d = DateTime::createFromFormat(
'!Y-m-d-H\hi',
substr($element->href, strpos($element->href, '201'), 16),
$timezone
);
if(!$d){
$d=DateTime::createFromFormat(
'!d m Y',
trim(str_replace(
array_values($months),
array_keys($months),
$element->find('.date', 0)->plaintext
)),
$timezone
);
}
$item['timestamp'] = $d->format('U');
$item['content'] = $element->find('.lecturer', 0)->innertext . ' - ' . $element->find('.title', 0)->innertext;
$item['uri'] = self::URI . $element->href;
$this->items[] = $item;
}
}
}

View File

@@ -0,0 +1,26 @@
<?php
class CommonDreamsBridge extends FeedExpander {
const MAINTAINER = "nyutag";
const NAME = "CommonDreams Bridge";
const URI = "http://www.commondreams.org/";
const DESCRIPTION = "Returns the newest articles.";
public function collectData(){
$this->collectExpandableDatas('http://www.commondreams.org/rss.xml', 10);
}
protected function parseItem($newsItem){
$item = parent::parseItem($newsItem);
$item['content'] = $this->CommonDreamsExtractContent($item['uri']);
return $item;
}
private function CommonDreamsExtractContent($url) {
$html3 = getSimpleHTMLDOMCached($url);
$text = $html3->find('div[class=field--type-text-with-summary]', 0)->innertext;
$html3->clear();
unset ($html3);
return $text;
}
}

View File

@@ -0,0 +1,39 @@
<?php
class CopieDoubleBridge extends BridgeAbstract{
const MAINTAINER = "superbaillot.net";
const NAME = "CopieDouble";
const URI = "http://www.copie-double.com/";
const CACHE_TIMEOUT = 14400; // 4h
const DESCRIPTION = "CopieDouble";
public function collectData(){
$html = getSimpleHTMLDOM(self::URI)
or returnServerError('Could not request CopieDouble.');
$table = $html->find('table table', 2);
foreach($table->find('tr') as $element)
{
$td = $element->find('td', 0);
if($td->class == "couleur_1")
{
$item = array();
$title = $td->innertext;
$pos = strpos($title, "<a");
$title = substr($title, 0, $pos);
$item['title'] = $title;
}
elseif(strpos($element->innertext, "/images/suivant.gif") === false)
{
$a=$element->find("a", 0);
$item['uri'] = self::URI . $a->href;
$content = str_replace('src="/', 'src="/'.self::URI,$element->find("td", 0)->innertext);
$content = str_replace('href="/', 'href="'.self::URI,$content);
$item['content'] = $content;
$this->items[] = $item;
}
}
}
}

View File

@@ -0,0 +1,61 @@
<?php
class CourrierInternationalBridge extends BridgeAbstract{
const MAINTAINER = "teromene";
const NAME = "Courrier International Bridge";
const URI = "http://CourrierInternational.com/";
const CACHE_TIMEOUT = 300; // 5 min
const DESCRIPTION = "Courrier International bridge";
public function collectData(){
$html = getSimpleHTMLDOM(self::URI)
or returnServerError('Error.');
$element = $html->find("article");
$article_count = 1;
foreach($element as $article) {
$item = array();
$item['uri'] = $article->parent->getAttribute("href");
if(strpos($item['uri'], "http") === FALSE) {
$item['uri'] = self::URI.$item['uri'];
}
$page = getSimpleHTMLDOMCached($item['uri']);
$content = $page->find('.article-text',0);
if(!$content){
$content = $page->find('.depeche-text',0);
}
$item['content'] = sanitize($content);
$item['title'] = strip_tags($article->find(".title",0));
$dateTime = date_parse($page->find("time",0));
$item['timestamp'] = mktime(
$dateTime['hour'],
$dateTime['minute'],
$dateTime['second'],
$dateTime['month'],
$dateTime['day'],
$dateTime['year']
);
$this->items[] = $item;
$article_count ++;
if($article_count > 5) break;
}
}
}
?>

View File

@@ -0,0 +1,53 @@
<?php
class CpasbienBridge extends BridgeAbstract {
const MAINTAINER = "lagaisse";
const NAME = "Cpasbien Bridge";
const URI = "http://www.cpasbien.io";
const CACHE_TIMEOUT = 86400; // 24h
const DESCRIPTION = "Returns latest torrents from a request query";
const PARAMETERS = array( array(
'q'=>array(
'name'=>'Search',
'required'=>true,
'title'=>'Type your search'
)
));
public function collectData(){
$request = str_replace(" ","-",trim($this->getInput('q')));
$html = getSimpleHTMLDOM(self::URI.'/recherche/'.urlencode($request).'.html')
or returnServerError('No results for this query.');
foreach ($html->find('#gauche',0)->find('div') as $episode) {
if ($episode->getAttribute('class')=='ligne0' ||
$episode->getAttribute('class')=='ligne1')
{
$htmlepisode=getSimpleHTMLDOMCached($episode->find('a', 0)->getAttribute('href'));
$item = array();
$item['author'] = $episode->find('a', 0)->text();
$item['title'] = $episode->find('a', 0)->text();
$textefiche=$htmlepisode->find('#textefiche', 0)->find('p',1);
if (isset($textefiche)) {
$item['content'] = $textefiche->text();
} else {
$p=$htmlepisode->find('#textefiche',0)->find('p');
if(!empty($p)){
$item['content'] = $htmlepisode->find('#textefiche', 0)->find('p',0)->text();
}
}
$item['id'] = $episode->find('a', 0)->getAttribute('href');
$item['uri'] = self::URI . $htmlepisode->find('#telecharger',0)->getAttribute('href');
$this->items[] = $item;
}
}
}
public function getName(){
return $this->getInput('q').' : '.self::NAME;
}
}

View File

@@ -0,0 +1,39 @@
<?php
class CryptomeBridge extends BridgeAbstract{
const MAINTAINER = "BoboTiG";
const NAME = "Cryptome";
const URI = "https://cryptome.org/";
const CACHE_TIMEOUT = 21600; //6h
const DESCRIPTION = "Returns the N most recent documents.";
const PARAMETERS = array( array(
'n'=>array(
'name'=>'number of elements',
'type'=>'number',
'defaultValue'=>20,
'exampleValue'=>10
)
));
public function collectData(){
$html = getSimpleHTMLDOM(self::URI)
or returnServerError('Could not request Cryptome.');
$number=$this->getInput('n');
if (!empty($number)) { /* number of documents */
$num = min($number, 20);
}
foreach($html->find('pre') as $element) {
for ( $i = 0; $i < $num; ++$i ) {
$item = array();
$item['uri'] = self::URI.substr($element->find('a', $i)->href, 20);
$item['title'] = substr($element->find('b', $i)->plaintext, 22);
$item['content'] = preg_replace('#http://cryptome.org/#', self::URI, $element->find('b', $i)->innertext);
$this->items[] = $item;
}
break;
}
}
}

View File

@@ -0,0 +1,114 @@
<?php
class DailymotionBridge extends BridgeAbstract{
const MAINTAINER = "mitsukarenai";
const NAME = "Dailymotion Bridge";
const URI = "https://www.dailymotion.com/";
const CACHE_TIMEOUT = 10800; // 3h
const DESCRIPTION = "Returns the 5 newest videos by username/playlist or search";
const PARAMETERS = array (
'By username' => array(
'u'=>array(
'name'=>'username',
'required'=>true
)
),
'By playlist id' => array(
'p'=>array(
'name'=>'playlist id',
'required'=>true
)
),
'From search results' => array(
's'=>array(
'name'=>'Search keyword',
'required'=>true
),
'pa'=>array(
'name'=>'Page',
'type'=>'number'
)
)
);
function getMetadata($id) {
$metadata=array();
$html2 = getSimpleHTMLDOM(self::URI.'video/'.$id);
if(!$html2){
return $metadata;
}
$metadata['title'] = $html2->find('meta[property=og:title]', 0)->getAttribute('content');
$metadata['timestamp'] = strtotime($html2->find('meta[property=video:release_date]', 0)->getAttribute('content') );
$metadata['thumbnailUri'] = $html2->find('meta[property=og:image]', 0)->getAttribute('content');
$metadata['uri'] = $html2->find('meta[property=og:url]', 0)->getAttribute('content');
return $metadata;
}
public function collectData(){
$html = '';
$limit = 5;
$count = 0;
$html = getSimpleHTMLDOM($this->getURI())
or returnServerError('Could not request Dailymotion.');
foreach($html->find('div.media a.preview_link') as $element) {
if($count < $limit) {
$item = array();
$item['id'] = str_replace('/video/', '', strtok($element->href, '_'));
$metadata = $this->getMetadata($item['id']);
if(empty($metadata)){
continue;
}
$item['uri'] = $metadata['uri'];
$item['title'] = $metadata['title'];
$item['timestamp'] = $metadata['timestamp'];
$item['content'] = '<a href="' . $item['uri'] . '"><img src="' . $metadata['thumbnailUri'] . '" /></a><br><a href="' . $item['uri'] . '">' . $item['title'] . '</a>';
$this->items[] = $item;
$count++;
}
}
}
public function getName(){
switch($this->queriedContext){
case 'By username':
$specific=$this->getInput('u');
break;
case 'By playlist id':
$specific=strtok($this->getInput('p'), '_');
break;
case 'From search results':
$specific=$this->getInput('s');
break;
}
return $specific.' : Dailymotion Bridge';
}
public function getURI(){
$uri=self::URI;
switch($this->queriedContext){
case 'By username':
$uri.='user/'
.urlencode($this->getInput('u')).'/1';
break;
case 'By playlist id':
$uri.='playlist/'
.urlencode(strtok($this->getInput('p'), '_'));
break;
case 'From search results':
$uri.='search/'
.urlencode($this->getInput('s'));
if($this->getInput('pa')){
$uri.='/'.$this->getInput('pa');
}
break;
}
return $uri;
}
}

View File

@@ -0,0 +1,51 @@
<?php
class DanbooruBridge extends BridgeAbstract{
const MAINTAINER = "mitsukarenai";
const NAME = "Danbooru";
const URI = "http://donmai.us/";
const CACHE_TIMEOUT = 1800; // 30min
const DESCRIPTION = "Returns images from given page";
const PARAMETERS = array(
'global'=>array(
'p'=>array(
'name'=>'page',
'defaultValue'=>1,
'type'=>'number'
),
't'=>array('name'=>'tags')
),
0=>array()
);
const PATHTODATA='article';
const IDATTRIBUTE='data-id';
protected function getFullURI(){
return $this->getURI().'posts?'
.'&page='.$this->getInput('p')
.'&tags='.urlencode($this->getInput('t'));
}
protected function getItemFromElement($element){
$item = array();
$item['uri'] = $this->getURI().$element->find('a', 0)->href;
$item['postid'] = (int)preg_replace("/[^0-9]/",'', $element->getAttribute(static::IDATTRIBUTE));
$item['timestamp'] = time();
$thumbnailUri = $this->getURI().$element->find('img', 0)->src;
$item['tags'] = $element->find('img', 0)->getAttribute('alt');
$item['title'] = $this->getName().' | '.$item['postid'];
$item['content'] = '<a href="' . $item['uri'] . '"><img src="' . $thumbnailUri . '" /></a><br>Tags: '.$item['tags'];
return $item;
}
public function collectData(){
$html = getSimpleHTMLDOM($this->getFullURI())
or returnServerError('Could not request '.$this->getName());
foreach($html->find(static::PATHTODATA) as $element) {
$this->items[] = $this->getItemFromElement($element);
}
}
}

View File

@@ -0,0 +1,23 @@
<?php
class DansTonChatBridge extends BridgeAbstract{
const MAINTAINER = "Astalaseven";
const NAME = "DansTonChat Bridge";
const URI = "http://danstonchat.com/";
const CACHE_TIMEOUT = 21600; //6h
const DESCRIPTION = "Returns latest quotes from DansTonChat.";
public function collectData(){
$html = getSimpleHTMLDOM(self::URI.'latest.html')
or returnServerError('Could not request DansTonChat.');
foreach($html->find('div.item') as $element) {
$item = array();
$item['uri'] = $element->find('a', 0)->href;
$item['title'] = 'DansTonChat '.$element->find('a', 1)->plaintext;
$item['content'] = $element->find('a', 0)->innertext;
$this->items[] = $item;
}
}
}

View File

@@ -0,0 +1,57 @@
<?php
class DauphineLibereBridge extends FeedExpander {
const MAINTAINER = "qwertygc";
const NAME = "Dauphine Bridge";
const URI = "http://www.ledauphine.com/";
const CACHE_TIMEOUT = 7200; // 2h
const DESCRIPTION = "Returns the newest articles.";
const PARAMETERS = array( array(
'u'=>array(
'name'=>'Catégorie de l\'article',
'type'=>'list',
'values'=>array(
'À la une'=>'',
'France Monde'=>'france-monde',
'Faits Divers'=>'faits-divers',
'Économie et Finance'=>'economie-et-finance',
'Politique'=>'politique',
'Sport'=>'sport',
'Ain'=>'ain',
'Alpes-de-Haute-Provence'=>'haute-provence',
'Hautes-Alpes'=>'hautes-alpes',
'Ardèche'=>'ardeche',
'Drôme'=>'drome',
'Isère Sud'=>'isere-sud',
'Savoie'=>'savoie',
'Haute-Savoie'=>'haute-savoie',
'Vaucluse'=>'vaucluse'
)
)
));
public function collectData(){
$url = self::URI . 'rss';
if (empty($this->getInput('u'))) {
$url = self::URI . $this->getInput('u') . '/rss';
}
$this->collectExpandableDatas($url, 10);
}
protected function parseItem($newsItem){
$item = parent::parseItem($newsItem);
$item['content'] = $this->ExtractContent($item['uri']);
return $item;
}
private function ExtractContent($url) {
$html2 = getSimpleHTMLDOMCached($url);
$text = $html2->find('div.column', 0)->innertext;
$text = preg_replace('@<script[^>]*?>.*?</script>@si', '', $text);
return $text;
}
}
?>

49
bridges/DemoBridge.php Normal file
View File

@@ -0,0 +1,49 @@
<?php
class DemoBridge extends BridgeAbstract{
const MAINTAINER = "teromene";
const NAME = "DemoBridge";
const URI = "http://github.com/rss-bridge/rss-bridge";
const DESCRIPTION = "Bridge used for demos";
const PARAMETERS = array(
'testCheckbox' => array(
'testCheckbox'=>array(
'type'=>'checkbox',
'name'=>'test des checkbox'
)
),
'testList' => array(
'testList'=>array(
'type'=>'list',
'name'=>'test des listes',
'values'=>array(
'Test'=>'test',
'Test 2'=>'test2'
)
)
),
'testNumber' => array(
'testNumber'=>array(
'type'=>'number',
'name'=>'test des numéros',
'exampleValue'=>'1515632'
)
)
);
public function collectData(){
$item = array();
$item['author'] = "Me!";
$item['title'] = "Test";
$item['content'] = "Awesome content !";
$item['id'] = "Lalala";
$item['uri'] = "http://example.com/test";
$this->items[] = $item;
}
}

View File

@@ -0,0 +1,51 @@
<?php
class DeveloppezDotComBridge extends FeedExpander {
const MAINTAINER = "polopollo";
const NAME = "Developpez.com Actus (FR)";
const URI = "http://www.developpez.com/";
const CACHE_TIMEOUT = 1800; // 30min
const DESCRIPTION = "Returns the 15 newest posts from DeveloppezDotCom (full text).";
public function collectData(){
$this->collectExpandableDatas(self::URI . 'index/rss', 15);
}
protected function parseItem($newsItem){
$item = parent::parseItem($newsItem);
$item['content'] = $this->DeveloppezDotComExtractContent($item['uri']);
return $item;
}
private function DeveloppezDotComStripCDATA($string) {
$string = str_replace('<![CDATA[', '', $string);
$string = str_replace(']]>', '', $string);
return $string;
}
// F***ing quotes from Microsoft Word badly encoded, here was the trick:
// http://stackoverflow.com/questions/1262038/how-to-replace-microsoft-encoded-quotes-in-php
private function convert_smart_quotes($string)
{
$search = array(chr(145),
chr(146),
chr(147),
chr(148),
chr(151));
$replace = array("'",
"'",
'"',
'"',
'-');
return str_replace($search, $replace, $string);
}
private function DeveloppezDotComExtractContent($url) {
$articleHTMLContent = getSimpleHTMLDOMCached($url);
$text = $this->convert_smart_quotes($articleHTMLContent->find('div.content', 0)->innertext);
$text = utf8_encode($text);
return trim($text);
}
}

36
bridges/DilbertBridge.php Normal file
View File

@@ -0,0 +1,36 @@
<?php
class DilbertBridge extends BridgeAbstract {
const MAINTAINER = 'kranack';
const NAME = 'Dilbert Daily Strip';
const URI = 'http://dilbert.com';
const CACHE_TIMEOUT = 21600; // 6h
const DESCRIPTION = 'The Unofficial Dilbert Daily Comic Strip';
public function collectData(){
$html = getSimpleHTMLDOM($this->getURI()) or returnServerError('Could not request Dilbert: '.$this->getURI());
foreach ($html->find('section.comic-item') as $element) {
$img = $element->find('img', 0);
$link = $element->find('a', 0);
$comic = $img->src;
$title = $link->alt;
$url = $link->href;
$date = substr($url, 25);
if (empty($title))
$title = 'Dilbert Comic Strip on '.$date;
$date = strtotime($date);
$item = array();
$item['uri'] = $url;
$item['title'] = $title;
$item['author'] = 'Scott Adams';
$item['timestamp'] = $date;
$item['content'] = '<img src="'.$comic.'" alt="'.$img->alt.'" />';
$this->items[] = $item;
}
}
}
?>

View File

@@ -0,0 +1,11 @@
<?php
require_once('Shimmie2Bridge.php');
class DollbooruBridge extends Shimmie2Bridge{
const MAINTAINER = "mitsukarenai";
const NAME = "Dollbooru";
const URI = "http://dollbooru.org/";
const DESCRIPTION = "Returns images from given page";
}

View File

@@ -0,0 +1,41 @@
<?php
class DuckDuckGoBridge extends BridgeAbstract{
const MAINTAINER = "Astalaseven";
const NAME = "DuckDuckGo";
const URI = "https://duckduckgo.com/";
const CACHE_TIMEOUT = 21600; // 6h
const DESCRIPTION = "Returns results from DuckDuckGo.";
const SORT_DATE = '+sort:date';
const SORT_RELEVANCE = '';
const PARAMETERS = array( array(
'u'=>array(
'name'=>'keyword',
'required'=>true),
'sort'=>array(
'name'=>'sort by',
'type'=>'list',
'required'=>false,
'values'=>array(
'date'=>self::SORT_DATE,
'relevance'=>self::SORT_RELEVANCE
),
'defaultValue'=>self::SORT_DATE
)
));
public function collectData(){
$html = getSimpleHTMLDOM(self::URI.'html/?q='.$this->getInput('u').$this->getInput('sort'))
or returnServerError('Could not request DuckDuckGo.');
foreach($html->find('div.results_links') as $element) {
$item = array();
$item['uri'] = $element->find('a', 0)->href;
$item['title'] = $element->find('a', 1)->innertext;
$item['content'] = $element->find('div.snippet', 0)->plaintext;
$this->items[] = $item;
}
}
}

66
bridges/EZTVBridge.php Normal file
View File

@@ -0,0 +1,66 @@
<?php
class EZTVBridge extends BridgeAbstract{
const MAINTAINER = "alexAubin";
const NAME = "EZTV";
const URI = "https://eztv.ch/";
const DESCRIPTION = "Returns list of *recent* torrents for a specific show on EZTV. Get showID from URLs in https://eztv.ch/shows/showID/show-full-name.";
const PARAMETERS = array( array(
'i'=>array(
'name'=>'Show ids',
'exampleValue'=>'showID1,showID2,…',
'required'=>true
)
));
public function collectData(){
// Make timestamp from relative released time in table
function makeTimestamp($relativeReleaseTime){
$relativeDays = 0;
$relativeHours = 0;
foreach (explode(" ",$relativeReleaseTime) as $relativeTimeElement) {
if (substr($relativeTimeElement,-1) == "d") $relativeDays = substr($relativeTimeElement,0,-1);
if (substr($relativeTimeElement,-1) == "h") $relativeHours = substr($relativeTimeElement,0,-1);
}
return mktime(date('h')-$relativeHours,0,0,date('m'),date('d')-$relativeDays,date('Y'));
}
// Loop on show ids
$showList = explode(",",$this->getInput('i'));
foreach($showList as $showID){
// Get show page
$html = getSimpleHTMLDOM(self::URI.'shows/'.rawurlencode($showID).'/')
or returnServerError('Could not request EZTV for id "'.$showID.'"');
// Loop on each element that look like an episode entry...
foreach($html->find('.forum_header_border') as $element) {
// Filter entries that are not episode entries
$ep = $element->find('td',1);
if (empty($ep)) continue;
$epinfo = $ep->find('.epinfo',0);
$released = $element->find('td',3);
if (empty($epinfo)) continue;
if (empty($released->plaintext)) continue;
// Filter entries that are older than 1 week
if ($released->plaintext == '&gt;1 week') continue;
// Fill item
$item = array();
$item['uri'] = self::URI.$epinfo->href;
$item['id'] = $item['uri'];
$item['timestamp'] = makeTimestamp($released->plaintext);
$item['title'] = $epinfo->plaintext;
$item['content'] = $epinfo->alt;
if(isset($item['title']))
$this->items[] = $item;
}
}
}
}

View File

@@ -0,0 +1,35 @@
<?php
class EliteDangerousGalnetBridge extends BridgeAbstract
{
const MAINTAINER = "corenting";
const NAME = "Elite: Dangerous Galnet";
const URI = "https://community.elitedangerous.com/galnet/";
const CACHE_TIMEOUT = 7200; // 2h
const DESCRIPTION = "Returns the latest page of news from Galnet";
public function collectData()
{
$html = getSimpleHTMLDOM(self::URI)
or returnServerError('Error while downloading the website content');
foreach($html->find('div.article') as $element) {
$item = array();
$uri = $element->find('h3 a', 0)->href;
$uri = self::URI . substr($uri,strlen('/galnet/'));
$item['uri'] = $uri;
$title = $element->find('h3 a', 0)->plaintext;
$item['title'] = substr($title, 1); //remove the space between icon and title
$content = $element->find('p', -1)->innertext;
$item['content'] = $content;
$date = $element->find('p.small', 0)->innertext;
$article_year = substr($date, -4) - 1286; //Convert E:D date to actual date
$date = substr($date, 0, -4) . $article_year;
$item['timestamp'] = strtotime($date);
$this->items[] = $item;
}
}
}

View File

@@ -0,0 +1,74 @@
<?php
class ElsevierBridge extends BridgeAbstract{
const MAINTAINER = 'Pierre Mazière';
const NAME = 'Elsevier journals recent articles';
const URI = 'http://www.journals.elsevier.com/';
const CACHE_TIMEOUT = 43200; //12h
const DESCRIPTION = 'Returns the recent articles published in Elsevier journals';
const PARAMETERS = array( array(
'j'=>array(
'name'=>'Journal name',
'required'=>true,
'exampleValue'=>'academic-pediactrics',
'title'=>'Insert html-part of your journal'
)
));
// Extracts the list of names from an article as string
private function ExtractArticleName ($article){
$names = $article->find('small', 0);
if($names)
return trim($names->plaintext);
return '';
}
// Extracts the timestamp from an article
private function ExtractArticleTimestamp ($article){
$time = $article->find('.article-info', 0);
if($time){
$timestring = trim($time->plaintext);
/*
The format depends on the age of an article:
- Available online 29 July 2016
- July 2016
- MayJune 2016
*/
if(preg_match('/\S*(\d+\s\S+\s\d{4})/ims', $timestring, $matches)){
return strtotime($matches[0]);
} elseif (preg_match('/[A-Za-z]+\-([A-Za-z]+\s\d{4})/ims', $timestring, $matches)){
return strtotime($matches[0]);
} elseif (preg_match('/([A-Za-z]+\s\d{4})/ims', $timestring, $matches)){
return strtotime($matches[0]);
} else {
return 0;
}
}
return 0;
}
// Extracts the content from an article
private function ExtractArticleContent ($article){
$content = $article->find('.article-content', 0);
if($content){
return trim($content->plaintext);
}
return '';
}
public function collectData(){
$uri = self::URI . $this->getInput('j') . '/recent-articles/';
$html = getSimpleHTMLDOM($uri) or returnServerError('No results for Elsevier journal '.$this->getInput('j'));
foreach($html->find('.pod-listing') as $article){
$item = array();
$item['uri'] = $article->find('.pod-listing-header>a',0)->getAttribute('href').'?np=y';
$item['title'] = $article->find('.pod-listing-header>a',0)->plaintext;
$item['author'] = $this->ExtractArticleName($article);
$item['timestamp'] = $this->ExtractArticleTimestamp($article);
$item['content'] = $this->ExtractArticleContent($article);
$this->items[] = $item;
}
}
}
?>

View File

@@ -0,0 +1,30 @@
<?php
class EstCeQuonMetEnProdBridge extends BridgeAbstract {
const MAINTAINER = 'ORelio';
const NAME = 'Est-ce qu\'on met en prod aujourd\'hui ?';
const URI = 'https://www.estcequonmetenprodaujourdhui.info/';
const CACHE_TIMEOUT = 21600; // 6h
const DESCRIPTION = 'Should we put a website in production today? (French)';
public function collectData(){
function ExtractFromDelimiters($string, $start, $end) {
if (strpos($string, $start) !== false) {
$section_retrieved = substr($string, strpos($string, $start) + strlen($start));
$section_retrieved = substr($section_retrieved, 0, strpos($section_retrieved, $end));
return $section_retrieved;
} return false;
}
$html = getSimpleHTMLDOM($this->getURI()) or returnServerError('Could not request EstCeQuonMetEnProd: '.$this->getURI());
$item = array();
$item['uri'] = $this->getURI().'#'.date('Y-m-d');
$item['title'] = $this->getName();
$item['author'] = 'Nicolas Hoffmann';
$item['timestamp'] = strtotime('today midnight');
$item['content'] = str_replace('src="/', 'src="'.$this->getURI(), trim(ExtractFromDelimiters($html->outertext, '<body role="document">', '<br /><br />')));
$this->items[] = $item;
}
}
?>

210
bridges/FacebookBridge.php Normal file
View File

@@ -0,0 +1,210 @@
<?php
class FacebookBridge extends BridgeAbstract{
const MAINTAINER = "teromene";
const NAME = "Facebook";
const URI = "https://www.facebook.com/";
const CACHE_TIMEOUT = 300; // 5min
const DESCRIPTION = "Input a page title or a profile log. For a profile log, please insert the parameter as follow : myExamplePage/132621766841117";
const PARAMETERS =array( array(
'u'=>array(
'name'=>'Username',
'required'=>true
)
));
private $authorName='';
public function collectData(){
//Extract a string using start and end delimiters
function ExtractFromDelimiters($string, $start, $end) {
if (strpos($string, $start) !== false) {
$section_retrieved = substr($string, strpos($string, $start) + strlen($start));
$section_retrieved = substr($section_retrieved, 0, strpos($section_retrieved, $end));
return $section_retrieved;
} return false;
}
//Utility function for cleaning a Facebook link
$unescape_fb_link = function ($matches) {
if (is_array($matches) && count($matches) > 1) {
$link = $matches[1];
if (strpos($link, '/') === 0)
$link = self::URI.$link.'"';
if (strpos($link, 'facebook.com/l.php?u=') !== false)
$link = urldecode(ExtractFromDelimiters($link, 'facebook.com/l.php?u=', '&'));
return ' href="'.$link.'"';
}
};
//Utility function for converting facebook emoticons
$unescape_fb_emote = function ($matches) {
static $facebook_emoticons = array(
'smile' => ':)',
'frown' => ':(',
'tongue' => ':P',
'grin' => ':D',
'gasp' => ':O',
'wink' => ';)',
'pacman' => ':<',
'grumpy' => '>_<',
'unsure' => ':/',
'cry' => ':\'(',
'kiki' => '^_^',
'glasses' => '8-)',
'sunglasses' => 'B-)',
'heart' => '<3',
'devil' => ']:D',
'angel' => '0:)',
'squint' => '-_-',
'confused' => 'o_O',
'upset' => 'xD',
'colonthree' => ':3',
'like' => '&#x1F44D;');
$len = count($matches);
if ($len > 1)
for ($i = 1; $i < $len; $i++)
foreach ($facebook_emoticons as $name => $emote)
if ($matches[$i] === $name)
return $emote;
return $matches[0];
};
$html = null;
//Handle captcha response sent by the viewer
if (isset($_POST['captcha_response']))
{
if (session_status() == PHP_SESSION_NONE)
session_start();
if (isset($_SESSION['captcha_fields'], $_SESSION['captcha_action']))
{
$captcha_action = $_SESSION['captcha_action'];
$captcha_fields = $_SESSION['captcha_fields'];
$captcha_fields['captcha_response'] = preg_replace("/[^a-zA-Z0-9]+/", "", $_POST['captcha_response']);
$http_options = array(
'http' => array(
'method' => 'POST',
'user_agent'=> ini_get('user_agent'),
'header'=>array("Content-type: application/x-www-form-urlencoded\r\nReferer: $captcha_action\r\nCookie: noscript=1\r\n"),
'content' => http_build_query($captcha_fields),
),
);
$context = stream_context_create($http_options);
$html = getContents($captcha_action, false, $context);
if ($html === FALSE) { returnServerError('Failed to submit captcha response back to Facebook'); }
unset($_SESSION['captcha_fields']);
$html = str_get_html($html);
}
unset($_SESSION['captcha_fields']);
unset($_SESSION['captcha_action']);
}
//Retrieve page contents
if (is_null($html)) {
if (!strpos($this->getInput('u'), "/")) {
$html = getSimpleHTMLDOM(self::URI.urlencode($this->getInput('u')).'?_fb_noscript=1')
or returnServerError('No results for this query.');
} else {
$html = getSimpleHTMLDOM(self::URI.'pages/'.$this->getInput('u').'?_fb_noscript=1')
or returnServerError('No results for this query.');
}
}
//Handle captcha form?
$captcha = $html->find('div.captcha_interstitial', 0);
if (!is_null($captcha))
{
//Save form for submitting after getting captcha response
if (session_status() == PHP_SESSION_NONE)
session_start();
$captcha_fields = array();
foreach ($captcha->find('input, button') as $input)
$captcha_fields[$input->name] = $input->value;
$_SESSION['captcha_fields'] = $captcha_fields;
$_SESSION['captcha_action'] = self::URI.$captcha->find('form', 0)->action;
//Show captcha filling form to the viewer, proxying the captcha image
$img = base64_encode(getContents($captcha->find('img', 0)->src));
header('HTTP/1.1 500 '.Http::getMessageForCode(500));
header('Content-Type: text/html');
die('<form method="post" action="?'.$_SERVER['QUERY_STRING'].'">'
.'<h2>Facebook captcha challenge</h2>'
.'<p>Unfortunately, rss-bridge cannot fetch the requested page.<br />'
.'Facebook wants rss-bridge to resolve the following captcha:</p>'
.'<p><img src="data:image/png;base64,'.$img.'" /></p>'
.'<p><b>Response:</b> <input name="captcha_response" placeholder="please fill in" />'
.'<input type="submit" value="Submit!" /></p>'
.'</form>');
}
//No captcha? We can carry on retrieving page contents :)
$element = $html->find('#pagelet_timeline_main_column')[0]->children(0)->children(0)->children(0)->next_sibling()->children(0);
if(isset($element)) {
$author = str_replace(' | Facebook', '', $html->find('title#pageTitle', 0)->innertext);
$profilePic = 'https://graph.facebook.com/'.$this->getInput('u').'/picture?width=200&amp;height=200';
$this->authorName = $author;
foreach($element->children() as $post) {
$item = array();
if (count($post->find('abbr')) > 0) {
//Retrieve post contents
$content = preg_replace('/(?i)><div class=\"clearfix([^>]+)>(.+?)div\ class=\"userContent\"/i', '', $post);
$content = preg_replace('/(?i)><div class=\"_59tj([^>]+)>(.+?)<\/div><\/div><a/i', '', $content);
$content = preg_replace('/(?i)><div class=\"_3dp([^>]+)>(.+?)div\ class=\"[^u]+userContent\"/i', '', $content);
$content = preg_replace('/(?i)><div class=\"_4l5([^>]+)>(.+?)<\/div>/i', '', $content);
//Remove html nodes, keep only img, links, basic formatting
$content = strip_tags($content,'<a><img><i><u>');
//Adapt link hrefs: convert relative links into absolute links and bypass external link redirection
$content = preg_replace_callback('/ href=\"([^"]+)\"/i', $unescape_fb_link, $content);
//Clean useless html tag properties and fix link closing tags
foreach (array('onmouseover', 'onclick', 'target', 'ajaxify', 'tabindex',
'class', 'style', 'data-[^=]*', 'aria-[^=]*', 'role', 'rel', 'id') as $property_name)
$content = preg_replace('/ '.$property_name.'=\"[^"]*\"/i', '', $content);
$content = preg_replace('/<\/a [^>]+>/i', '</a>', $content);
//Convert textual representation of emoticons eg "<i><u>smile emoticon</u></i>" back to ASCII emoticons eg ":)"
$content = preg_replace_callback('/<i><u>([^ <>]+) ([^<>]+)<\/u><\/i>/i', $unescape_fb_emote, $content);
//Retrieve date of the post
$date = $post->find("abbr")[0];
if(isset($date) && $date->hasAttribute('data-utime')) {
$date = $date->getAttribute('data-utime');
} else {
$date = 0;
}
//Build title from username and content
$title = $author;
if (strlen($title) > 24)
$title = substr($title, 0, strpos(wordwrap($title, 24), "\n")).'...';
$title = $title.' | '.strip_tags($content);
if (strlen($title) > 64)
$title = substr($title, 0, strpos(wordwrap($title, 64), "\n")).'...';
//Build and add final item
$item['uri'] = self::URI.$post->find('abbr')[0]->parent()->getAttribute('href');
$item['content'] = $content;
$item['title'] = $title;
$item['author'] = $author;
$item['timestamp'] = $date;
$this->items[] = $item;
}
}
}
}
public function getName() {
return (isset($this->authorName) ? $this->authorName.' - ' : '').'Facebook Bridge';
}
}

View File

@@ -0,0 +1,62 @@
<?php
class FeedExpanderExampleBridge extends FeedExpander {
const MAINTAINER = 'logmanoriginal';
const NAME = 'FeedExpander Example';
const URI = '#';
const DESCRIPTION = 'Example bridge to test FeedExpander';
const PARAMETERS = array(
'Feed' => array(
'version' => array(
'name' => 'Version',
'type' => 'list',
'required' => true,
'title' => 'Select your feed format/version',
'defaultValue' => 'RSS 2.0',
'values' => array(
'RSS 0.91' => 'rss_0_9_1',
'RSS 1.0' => 'rss_1_0',
'RSS 2.0' => 'rss_2_0',
'ATOM 1.0' => 'atom_1_0'
)
)
)
);
public function collectData(){
switch($this->getInput('version')){
case 'rss_0_9_1':
parent::collectExpandableDatas('http://static.userland.com/gems/backend/sampleRss.xml');
break;
case 'rss_1_0':
parent::collectExpandableDatas('http://feeds.nature.com/nature/rss/current?format=xml');
break;
case 'rss_2_0':
parent::collectExpandableDatas('http://feeds.rssboard.org/rssboard?format=xml');
break;
case 'atom_1_0':
parent::collectExpandableDatas('http://segfault.linuxmint.com/feed/atom/');
break;
default: returnClientError('Unknown version ' . $this->getInput('version') . '!');
}
}
protected function parseItem($newsItem) {
switch($this->getInput('version')){
case 'rss_0_9_1':
return $this->parseRSS_0_9_1_Item($newsItem);
break;
case 'rss_1_0':
return $this->parseRSS_1_0_Item($newsItem);
break;
case 'rss_2_0':
return $this->parseRSS_2_0_Item($newsItem);
break;
case 'atom_1_0':
return $this->parseATOMItem($newsItem);
break;
default: returnClientError('Unknown version ' . $this->getInput('version') . '!');
}
}
}

View File

@@ -0,0 +1,23 @@
<?php
class FierPandaBridge extends BridgeAbstract {
const MAINTAINER = "snroki";
const NAME = "Fier Panda Bridge";
const URI = "http://www.fier-panda.fr/";
const CACHE_TIMEOUT = 21600; // 6h
const DESCRIPTION = "Returns latest articles from Fier Panda.";
public function collectData(){
$html = getSimpleHTMLDOM(self::URI) or returnServerError('Could not request Fier Panda.');
foreach($html->find('div.container-content article') as $element) {
$item = array();
$item['uri'] = $this->getURI().$element->find('a', 0)->href;
$item['title'] = trim($element->find('h1 a', 0)->innertext);
// Remove the link at the end of the article
$element->find('p a', 0)->outertext = '';
$item['content'] = $element->find('p', 0)->innertext;
$this->items[] = $item;
}
}
}

View File

@@ -1,35 +1,42 @@
<?php
/**
* RssBridgeFlickrExplore
* Returns the newest interesting images from http://www.flickr.com/explore
*
* @name Flickr Explore
* @description Returns the latest interesting images from Flickr
*/
class FlickrExploreBridge extends BridgeAbstract{
public function collectData(array $param){
$html = file_get_html('http://www.flickr.com/explore') or $this->returnError('Could not request Flickr.', 404);
const MAINTAINER = "sebsauvage";
const NAME = "Flickr Explore";
const URI = "https://www.flickr.com/";
const CACHE_TIMEOUT = 21600; // 6
const DESCRIPTION = "Returns the latest interesting images from Flickr";
foreach($html->find('span.photo_container') as $element) {
$item = new \Item();
$item->uri = 'http://flickr.com'.$element->find('a',0)->href;
$item->thumbnailUri = $element->find('img',0)->getAttribute('data-defer-src');
$item->content = '<a href="' . $item->uri . '"><img src="' . $item->thumbnailUri . '" /></a>'; // FIXME: Filter javascript ?
$item->title = $element->find('a',0)->title;
public function collectData(){
$html = getSimpleHTMLDOM(self::URI.'explore')
or returnServerError('Could not request Flickr.');
foreach($html->find('.photo-list-photo-view') as $element) {
// Get the styles
$style = explode(';', $element->style);
// Get the background-image style
$backgroundImage = explode(':', end($style));
// URI type : url(//cX.staticflickr.com/X/XXXXX/XXXXXXXXX.jpg)
$imageURI = trim(str_replace(['url(', ')'], '', end($backgroundImage)));
// Get the image ID
$imageURIs = explode('_', basename($imageURI));
$imageID = reset($imageURIs);
// Get the image JSON via Flickr API
$imageJSON = json_decode(getContents(
'https://api.flickr.com/services/rest/?'
.'method=flickr.photos.getInfo&'
.'api_key=103b574d49bd51f0e18bfe907da44a0f&'
.'photo_id='.$imageID.'&'
.'format=json&'
.'nojsoncallback=1'
)) or returnServerError('Could not request Flickr.'); // FIXME: Request time too long...
$item = array();
$item['uri'] = self::URI.'photo.gne?id='.$imageID;
$item['content'] = '<a href="' . $item['uri'] . '"><img src="' . $imageURI . '" /></a>'; // FIXME: Filter javascript ?
$item['title'] = $imageJSON->photo->title->_content;
$this->items[] = $item;
}
}
public function getName(){
return 'Flickr Explore';
}
public function getURI(){
return 'http://www.flickr.com/explore';
}
public function getCacheDuration(){
return 21600; // 6 hours
}
}

View File

@@ -0,0 +1,48 @@
<?php
class FlickrTagBridge extends BridgeAbstract{
const MAINTAINER = "erwang";
const NAME = "Flickr TagUser";
const URI = "http://www.flickr.com/";
const CACHE_TIMEOUT = 21600; //6h
const DESCRIPTION = "Returns the tagged or user images from Flickr";
const PARAMETERS = array(
'By keyword' => array(
'q'=>array(
'name'=>'keyword',
'required'=>true
)
),
'By username' => array(
'u'=>array(
'name'=>'Username',
'required'=>true
)
),
);
public function collectData(){
switch($this->queriedContext){
case 'By keyword':
$html = getSimpleHTMLDOM(self::URI.'search/?q='.urlencode($this->getInput('q')).'&s=rec')
or returnServerError('No results for this query.');
break;
case 'by username':
$html = getSimpleHTMLDOM(self::URI.'photos/'.urlencode($this->getInput('u')).'/')
or returnServerError('Requested username can\'t be found.');
break;
}
foreach($html->find('span.photo_container') as $element) {
$item = array();
$item['uri'] = self::URI.$element->find('a',0)->href;
$thumbnailUri = $element->find('img',0)->getAttribute('data-defer-src');
$item['content'] = '<a href="' . $item['uri'] . '"><img src="' . $thumbnailUri . '" /></a>'; // FIXME: Filter javascript ?
$item['title'] = $element->find('a',0)->title;
$this->items[] = $item;
}
}
}

40
bridges/FootitoBridge.php Normal file
View File

@@ -0,0 +1,40 @@
<?php
class FootitoBridge extends BridgeAbstract{
const MAINTAINER = "superbaillot.net";
const NAME = "Footito";
const URI = "http://www.footito.fr/";
const DESCRIPTION = "Footito";
public function collectData(){
$html = getSimpleHTMLDOM(self::URI)
or returnServerError('Could not request Footito.');
foreach($html->find('div.post') as $element) {
$item = array();
$content = trim($element->innertext);
$content = str_replace("<img", "<img style='float : left;'", $content );
$content = str_replace("class=\"logo\"", "style='float : left;'", $content );
$content = str_replace("class=\"contenu\"", "style='margin-left : 60px;'", $content );
$content = str_replace("class=\"responsive-comment\"", "style='border-top : 1px #DDD solid; background-color : white; padding : 10px;'", $content );
$content = str_replace("class=\"jaime\"", "style='display : none;'", $content );
$content = str_replace("class=\"auteur-event responsive\"", "style='display : none;'", $content );
$content = str_replace("class=\"report-abuse-button\"", "style='display : none;'", $content );
$content = str_replace("class=\"reaction clearfix\"", "style='margin : 10px 0px; padding : 5px; border-bottom : 1px #DDD solid;'", $content );
$content = str_replace("class=\"infos\"", "style='font-size : 0.7em;'", $content );
$item['content'] = $content;
$title = $element->find('.contenu .texte ', 0)->plaintext;
$item['title'] = $title;
$info = $element->find('div.infos', 0);
$item['timestamp'] = strtotime($info->find('time', 0)->datetime);
$item['author'] = $info->find('a.auteur', 0)->plaintext;
$this->items[] = $item;
}
}
}

View File

@@ -0,0 +1,68 @@
<?php
class FourchanBridge extends BridgeAbstract{
const MAINTAINER = "mitsukarenai";
const NAME = "4chan";
const URI = "https://boards.4chan.org/";
const CACHE_TIMEOUT = 300; // 5min
const DESCRIPTION = "Returns posts from the specified thread";
const PARAMETERS = array( array(
'c'=>array(
'name'=>'Thread category',
'required'=>true
),
't'=>array(
'name'=>'Thread number',
'type'=>'number',
'required'=>true
)
));
public function getURI(){
return static::URI.$this->getInput('c').'/thread/'.$this->getInput('t');
}
public function collectData(){
$html = getSimpleHTMLDOM($this->getURI())
or returnServerError("Could not request 4chan, thread not found");
foreach($html->find('div.postContainer') as $element) {
$item = array();
$item['id'] = $element->find('.post', 0)->getAttribute('id');
$item['uri'] = $this->getURI().'#'.$item['id'];
$item['timestamp'] = $element->find('span.dateTime', 0)->getAttribute('data-utc');
$item['author'] = $element->find('span.name', 0)->plaintext;
$file=$element->find('.file', 0);
if(!empty($file) ) {
$item['image'] = $element->find('.file a', 0)->href;
$item['imageThumb'] = $element->find('.file img', 0)->src;
if(!isset($item['imageThumb']) and strpos($item['image'], '.swf') !== FALSE)
$item['imageThumb'] = 'http://i.imgur.com/eO0cxf9.jpg';
}
if(!empty($element->find('span.subject', 0)->innertext )) {
$item['subject'] = $element->find('span.subject', 0)->innertext;
}
$item['title'] = 'reply '.$item['id'].' | '.$item['author'];
if(isset($item['subject'])){
$item['title'] = $item['subject'].' - '.$item['title'];
}
$content = $element->find('.postMessage', 0)->innertext;
$content = str_replace('href="#p','href="'.$this->getURI().'#p',$content);
$item['content'] = '<span id="'.$item['id'].'">'.$content.'</span>';
if(isset($item['image'])){
$item['content'] = '<a href="'.$item['image'].'">'
.'<img alt="'.$item['id'].'" src="'.$item['imageThumb'].'" />'
.'</a><br>'
.$item['content'];
}
$this->items[] = $item;
}
$this->items = array_reverse($this->items);
}
}

View File

@@ -0,0 +1,166 @@
<?php
class FuturaSciencesBridge extends FeedExpander {
const MAINTAINER = 'ORelio';
const NAME = 'Futura-Sciences Bridge';
const URI = 'http://www.futura-sciences.com/';
const DESCRIPTION = 'Returns the newest articles.';
const PARAMETERS = array( array(
'feed'=> array(
'name'=>'Feed',
'type'=>'list',
'values'=>array(
'Les flux multi-magazines'=>array(
'Les dernières actualités de Futura-Sciences'=>'actualites',
'Les dernières définitions de Futura-Sciences'=>'definitions',
'Les dernières photos de Futura-Sciences'=>'photos',
'Les dernières questions - réponses de Futura-Sciences'=>'questions-reponses',
'Les derniers dossiers de Futura-Sciences'=>'dossiers'
),
'Les flux Services'=> array(
'Les cartes virtuelles de Futura-Sciences'=>'services/cartes-virtuelles',
'Les fonds d\'écran de Futura-Sciences'=>'services/fonds-ecran'
),
'Les flux Santé'=>array(
'Les dernières actualités de Futura-Santé'=>'sante/actualites',
'Les dernières définitions de Futura-Santé'=>'sante/definitions',
'Les dernières questions-réponses de Futura-Santé'=>'sante/question-reponses',
'Les derniers dossiers de Futura-Santé'=>'sante/dossiers'
),
'Les flux High-Tech'=>array(
'Les dernières actualités de Futura-High-Tech'=>'high-tech/actualites',
'Les dernières astuces de Futura-High-Tech'=>'high-tech/question-reponses',
'Les dernières définitions de Futura-High-Tech'=>'high-tech/definitions',
'Les derniers dossiers de Futura-High-Tech'=>'high-tech/dossiers'
),
'Les flux Espace'=>array(
'Les dernières actualités de Futura-Espace'=>'espace/actualites',
'Les dernières définitions de Futura-Espace'=>'espace/definitions',
'Les dernières questions-réponses de Futura-Espace'=>'espace/question-reponses',
'Les derniers dossiers de Futura-Espace'=>'espace/dossiers'
),
'Les flux Environnement'=>array(
'Les dernières actualités de Futura-Environnement'=>'environnement/actualites',
'Les dernières définitions de Futura-Environnement'=>'environnement/definitions',
'Les dernières questions-réponses de Futura-Environnement'=>'environnement/question-reponses',
'Les derniers dossiers de Futura-Environnement'=>'environnement/dossiers'
),
'Les flux Maison'=>array(
'Les dernières actualités de Futura-Maison'=>'maison/actualites',
'Les dernières astuces de Futura-Maison'=>'maison/question-reponses',
'Les dernières définitions de Futura-Maison'=>'maison/definitions',
'Les derniers dossiers de Futura-Maison'=>'maison/dossiers'
),
'Les flux Nature'=>array(
'Les dernières actualités de Futura-Nature'=>'nature/actualites',
'Les dernières définitions de Futura-Nature'=>'nature/definitions',
'Les dernières questions-réponses de Futura-Nature'=>'nature/question-reponses',
'Les derniers dossiers de Futura-Nature'=>'nature/dossiers'
),
'Les flux Terre'=>array(
'Les dernières actualités de Futura-Terre'=>'terre/actualites',
'Les dernières définitions de Futura-Terre'=>'terre/definitions',
'Les dernières questions-réponses de Futura-Terre'=>'terre/question-reponses',
'Les derniers dossiers de Futura-Terre'=>'terre/dossiers'
),
'Les flux Matière'=>array(
'Les dernières actualités de Futura-Matière'=>'matiere/actualites',
'Les dernières définitions de Futura-Matière'=>'matiere/definitions',
'Les dernières questions-réponses de Futura-Matière'=>'matiere/question-reponses',
'Les derniers dossiers de Futura-Matière'=>'matiere/dossiers'
),
'Les flux Mathématiques'=>array(
'Les dernières actualités de Futura-Mathématiques'=>'mathematiques/actualites',
'Les derniers dossiers de Futura-Mathématiques'=>'mathematiques/dossiers'
)
)
)
));
public function collectData(){
$url = self::URI . 'rss/' . $this->getInput('feed') . '.xml';
$this->collectExpandableDatas($url, 10);
}
protected function parseItem($newsItem){
$item = parent::parseItem($newsItem);
$item['uri'] = str_replace('#xtor=RSS-8', '', $item['uri']);
$article = getSimpleHTMLDOMCached($item['uri'])
or returnServerError('Could not request Futura-Sciences: ' . $item['uri']);
$item['content'] = $this->ExtractArticleContent($article);
$item['author'] = empty($this->ExtractAuthor($article)) ? $item['author'] : $this->ExtractAuthor($article);
return $item;
}
function StripWithDelimiters($string, $start, $end) {
while (strpos($string, $start) !== false) {
$section_to_remove = substr($string, strpos($string, $start));
$section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end));
$string = str_replace($section_to_remove, '', $string);
} return $string;
}
function StripRecursiveHTMLSection($string, $tag_name, $tag_start) {
$open_tag = '<'.$tag_name;
$close_tag = '</'.$tag_name.'>';
$close_tag_length = strlen($close_tag);
if (strpos($tag_start, $open_tag) === 0) {
while (strpos($string, $tag_start) !== false) {
$max_recursion = 100;
$section_to_remove = null;
$section_start = strpos($string, $tag_start);
$search_offset = $section_start;
do {
$max_recursion--;
$section_end = strpos($string, $close_tag, $search_offset);
$search_offset = $section_end + $close_tag_length;
$section_to_remove = substr($string, $section_start, $section_end - $section_start + $close_tag_length);
$open_tag_count = substr_count($section_to_remove, $open_tag);
$close_tag_count = substr_count($section_to_remove, $close_tag);
} while ($open_tag_count > $close_tag_count && $max_recursion > 0);
$string = str_replace($section_to_remove, '', $string);
}
}
return $string;
}
function ExtractArticleContent($article){
$contents = $article->find('div.content', 0)->innertext;
foreach (array(
'<div class="clear',
'<div class="sharebar2',
'<div class="diaporamafullscreen"',
'<div style="margin-bottom:10px;" class="noprint"',
'<div class="ficheprevnext',
'<div class="bar noprint',
'<div class="toolbar noprint',
'<div class="addthis_toolbox',
'<div class="noprint',
'<div class="bg bglight border border-full noprint',
'<div class="httplogbar-wrapper noprint',
'<div id="forumcomments'
) as $div_start) {
$contents = $this->StripRecursiveHTMLSection($contents , 'div', $div_start);
}
$contents = $this->StripWithDelimiters($contents, '<hr ', '/>');
$contents = $this->StripWithDelimiters($contents, '<p class="content-date', '</p>');
$contents = $this->StripWithDelimiters($contents, '<h1 class="content-title', '</h1>');
$contents = $this->StripWithDelimiters($contents, 'fs:definition="', '"');
$contents = $this->StripWithDelimiters($contents, 'fs:xt:clicktype="', '"');
$contents = $this->StripWithDelimiters($contents, 'fs:xt:clickname="', '"');
return $contents;
}
// Extracts the author from an article or element
function ExtractAuthor($article){
$article_author = $article->find('span.author', 0);
if($article_author){
return trim(str_replace(', Futura-Sciences', '', $article_author->plaintext));
}
return '';
}
}

124
bridges/GBAtempBridge.php Normal file
View File

@@ -0,0 +1,124 @@
<?php
class GBAtempBridge extends BridgeAbstract {
const MAINTAINER = 'ORelio';
const NAME = 'GBAtemp';
const URI = 'http://gbatemp.net/';
const DESCRIPTION = 'GBAtemp is a user friendly underground video game community.';
const PARAMETERS = array( array(
'type'=>array(
'name'=>'Type',
'type'=>'list',
'required'=>true,
'values'=>array(
'News'=>'N',
'Reviews'=>'R',
'Tutorials'=>'T',
'Forum'=>'F'
)
)
));
private function ExtractFromDelimiters($string, $start, $end) {
if (strpos($string, $start) !== false) {
$section_retrieved = substr($string, strpos($string, $start) + strlen($start));
$section_retrieved = substr($section_retrieved, 0, strpos($section_retrieved, $end));
return $section_retrieved;
} return false;
}
private function StripWithDelimiters($string, $start, $end) {
while (strpos($string, $start) !== false) {
$section_to_remove = substr($string, strpos($string, $start));
$section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end));
$string = str_replace($section_to_remove, '', $string);
} return $string;
}
private function build_item($uri, $title, $author, $timestamp, $content) {
$item = array();
$item['uri'] = $uri;
$item['title'] = $title;
$item['author'] = $author;
$item['timestamp'] = $timestamp;
$item['content'] = $content;
return $item;
}
private function cleanup_post_content($content, $site_url) {
$content = str_replace(':arrow:', '&#x27a4;', $content);
$content = str_replace('href="attachments/', 'href="'.$site_url.'attachments/', $content);
$content = $this->StripWithDelimiters($content, '<script', '</script>');
return $content;
}
private function fetch_post_content($uri, $site_url) {
$html = getSimpleHTMLDOM($uri);
if(!$html){
return 'Could not request GBAtemp '.$uri;
}
$content = $html->find('div.messageContent', 0)->innertext;
return $this->cleanup_post_content($content, $site_url);
}
public function collectData(){
$html = getSimpleHTMLDOM(self::URI)
or returnServerError('Could not request GBAtemp.');
switch($this->getInput('type')){
case 'N':
foreach ($html->find('li[class=news_item full]') as $newsItem) {
$url = self::URI.$newsItem->find('a', 0)->href;
$time = intval($this->ExtractFromDelimiters($newsItem->find('abbr.DateTime', 0)->outertext, 'data-time="', '"'));
$author = $newsItem->find('a.username', 0)->plaintext;
$title = $newsItem->find('a', 1)->plaintext;
$content = $this->fetch_post_content($url, self::URI);
$this->items[] = $this->build_item($url, $title, $author, $time, $content);
}
case 'R':
foreach ($html->find('li.portal_review') as $reviewItem) {
$url = self::URI.$reviewItem->find('a', 0)->href;
$title = $reviewItem->find('span.review_title', 0)->plaintext;
$content = getSimpleHTMLDOM($url) or returnServerError('Could not request GBAtemp: '.$uri);
$author = $content->find('a.username', 0)->plaintext;
$time = intval($this->ExtractFromDelimiters($content->find('abbr.DateTime', 0)->outertext, 'data-time="', '"'));
$intro = '<p><b>'.($content->find('div#review_intro', 0)->plaintext).'</b></p>';
$review = $content->find('div#review_main', 0)->innertext;
$subheader = '<p><b>'.$content->find('div.review_subheader', 0)->plaintext.'</b></p>';
$procons = $content->find('table.review_procons', 0)->outertext;
$scores = $content->find('table.reviewscores', 0)->outertext;
$content = $this->cleanup_post_content($intro.$review.$subheader.$procons.$scores, self::URI);
$this->items[] = $this->build_item($url, $title, $author, $time, $content);
}
case 'T':
foreach ($html->find('li.portal-tutorial') as $tutorialItem) {
$url = self::URI.$tutorialItem->find('a', 0)->href;
$title = $tutorialItem->find('a', 0)->plaintext;
$time = intval($this->ExtractFromDelimiters($tutorialItem->find('abbr.DateTime', 0)->outertext, 'data-time="', '"'));
$author = $tutorialItem->find('a.username', 0)->plaintext;
$content = $this->fetch_post_content($url, self::URI);
$this->items[] = $this->build_item($url, $title, $author, $time, $content);
}
case 'F':
foreach ($html->find('li.rc_item') as $postItem) {
$url = self::URI.$postItem->find('a', 1)->href;
$title = $postItem->find('a', 1)->plaintext;
$time = intval($this->ExtractFromDelimiters($postItem->find('abbr.DateTime', 0)->outertext, 'data-time="', '"'));
$author = $postItem->find('a.username', 0)->plaintext;
$content = $this->fetch_post_content($url, self::URI);
$this->items[] = $this->build_item($url, $title, $author, $time, $content);
}
}
}
public function getName() {
$type=array_search(
$this->getInput('type'),
self::PARAMETERS[$this->queriedContext]['type']['values']
);
return 'GBAtemp '.$type.' Bridge';
}
}

View File

@@ -0,0 +1,21 @@
<?php
require_once('DanbooruBridge.php');
class GelbooruBridge extends DanbooruBridge{
const MAINTAINER = "mitsukarenai";
const NAME = "Gelbooru";
const URI = "http://gelbooru.com/";
const DESCRIPTION = "Returns images from given page";
const PATHTODATA='.thumb';
const IDATTRIBUTE='id';
const PIDBYPAGE=63;
protected function getFullURI(){
return $this->getURI().'index.php?page=post&s=list&'
.'&pid='.($this->getInput('p')?($this->getInput('p') -1)*static::PIDBYPAGE:'')
.'&tags='.urlencode($this->getInput('t'));
}
}

71
bridges/GiphyBridge.php Normal file
View File

@@ -0,0 +1,71 @@
<?php
define('GIPHY_LIMIT', 10);
class GiphyBridge extends BridgeAbstract{
const MAINTAINER = "kraoc";
const NAME = "Giphy Bridge";
const URI = "http://giphy.com/";
const CACHE_TIMEOUT = 300; //5min
const DESCRIPTION = "Bridge for giphy.com";
const PARAMETERS = array( array(
's'=>array(
'name'=>'search tag',
'required'=>true
),
'n'=>array(
'name'=>'max number of returned items',
'type'=>'number'
)
));
public function collectData(){
$html = '';
$base_url = 'http://giphy.com';
$html = getSimpleHTMLDOM(self::URI.'/search/'.urlencode($this->getInput('s').'/'))
or returnServerError('No results for this query.');
$max = GIPHY_LIMIT;
if ($this->getInput('n')) {
$max = $this->getInput('n');
}
$limit = 0;
$kw = urlencode($this->getInput('s'));
foreach($html->find('div.hoverable-gif') as $entry) {
if($limit < $max) {
$node = $entry->first_child();
$href = $node->getAttribute('href');
$html2 = getSimpleHTMLDOM(self::URI . $href)
or returnServerError('No results for this query.');
$figure = $html2->getElementByTagName('figure');
$img = $figure->firstChild();
$caption = $figure->lastChild();
$item = array();
$item['id'] = $img->getAttribute('data-gif_id');
$item['uri'] = $img->getAttribute('data-bitly_gif_url');
$item['username'] = 'Giphy - '.ucfirst($kw);
$title = $caption->innertext();
$title = preg_replace('/\s+/', ' ',$title);
$title = str_replace('animated GIF', '', $title);
$title = str_replace($kw, '', $title);
$title = preg_replace('/\s+/', ' ',$title);
$title = trim($title);
if (strlen($title) <= 0) {
$title = $item['id'];
}
$item['title'] = trim($title);
$item['content'] =
'<a href="'.$item['uri'].'">'
.'<img src="'.$img->getAttribute('src').'" width="'.$img->getAttribute('data-original-width').'" height="'.$img->getAttribute('data-original-height').'" />'
.'</a>';
$this->items[] = $item;
$limit++;
}
}
}
}

View File

@@ -0,0 +1,190 @@
<?php
class GithubIssueBridge extends BridgeAbstract{
const MAINTAINER = 'Pierre Mazière';
const NAME = 'Github Issue';
const URI = 'https://github.com/';
const CACHE_TIMEOUT = 600; // 10min
const DESCRIPTION = 'Returns the issues or comments of an issue of a github project';
const PARAMETERS=array(
'global'=>array (
'u'=>array(
'name'=>'User name',
'required'=>true
),
'p'=>array(
'name'=>'Project name',
'required'=>true
)
),
'Project Issues'=>array(
'c'=>array(
'name'=>'Show Issues Comments',
'type'=>'checkbox'
)
),
'Issue comments'=>array(
'i'=>array(
'name'=>'Issue number',
'type'=>'number',
'required'=>'true'
)
)
);
public function getName(){
$name=$this->getInput('u').'/'.$this->getInput('p');
switch($this->queriedContext){
case 'Project Issues':
if($this->getInput('c')){
$prefix=static::NAME.'s comments for ';
}else{
$prefix=static::NAME.'s for ';
}
$name=$prefix.$name;
break;
case 'Issue comments':
$name=static::NAME.' '.$name.' #'.$this->getInput('i');
break;
}
return $name;
}
public function getURI(){
$uri = static::URI.$this->getInput('u').'/'.$this->getInput('p').'/issues';
if($this->queriedContext==='Issue comments'){
$uri.='/'.$this->getInput('i');
}else if($this->getInput('c')){
$uri.='?q=is%3Aissue+sort%3Aupdated-desc';
}
return $uri;
}
protected function extractIssueComment($issueNbr,$title,$comment){
$class=$comment->getAttribute('class');
$classes=explode(' ',$class);
$event=false;
if(in_array('discussion-item',$classes)){
$event=true;
}
$author='unknown';
if($comment->find('.author',0)){
$author=$comment->find('.author',0)->plaintext;
}
$uri=static::URI.$this->getInput('u').'/'.$this->getInput('p').'/issues/'
.$issueNbr;
$comment=$comment->firstChild();
if(!$event){
$comment=$comment->nextSibling();
}
if($event){
$title.=' / '.substr($class,strpos($class,'discussion-item-')+strlen('discussion-item-'));
if(!$comment->hasAttribute('id')){
$items=array();
$timestamp=strtotime($comment->find('relative-time',0)->getAttribute('datetime'));
$content=$comment->innertext;
while($comment=$comment->nextSibling()){
$item=array();
$item['author']=$author;
$item['title']=html_entity_decode($title,ENT_QUOTES,'UTF-8');
$item['timestamp']=$timestamp;
$item['content']=$content.'<p>'.$comment->children(1)->innertext.'</p>';
$item['uri']=$uri.'#'.$comment->children(1)->getAttribute('id');
$items[]=$item;
}
return $items;
}
$content=$comment->parent()->innertext;
}else{
$title.=' / '.trim($comment->firstChild()->plaintext);
$content="<pre>".$comment->find('.comment-body',0)->innertext."</pre>";
}
$item = array();
$item['author']=$author;
$item['uri']= $uri.'#'.$comment->getAttribute('id');
$item['title']=html_entity_decode($title,ENT_QUOTES,'UTF-8');
$item['timestamp']=strtotime($comment->find('relative-time',0)->getAttribute('datetime'));
$item['content']=$content;
return $item;
}
protected function extractIssueComments($issue){
$items=array();
$title=$issue->find('.gh-header-title',0)->plaintext;
$issueNbr=trim(substr($issue->find('.gh-header-number',0)->plaintext,1));
$comments=$issue->find('.js-discussion',0);
foreach($comments->children() as $comment){
$classes=explode(' ',$comment->getAttribute('class'));
if(in_array('discussion-item',$classes) ||
in_array('timeline-comment-wrapper',$classes)
){
$item=$this->extractIssueComment($issueNbr,$title,$comment);
if(array_keys($item)!==range(0,count($item)-1)){
$item=array($item);
}
$items=array_merge($items,$item);
}
}
return $items;
}
public function collectData(){
$html = getSimpleHTMLDOM($this->getURI())
or returnServerError('No results for Github Issue '.$this->getURI());
switch($this->queriedContext){
case 'Issue comments':
$this->items=$this->extractIssueComments($html);
break;
case 'Project Issues':
foreach($html->find('.js-active-navigation-container .js-navigation-item') as $issue){
$info=$issue->find('.opened-by',0);
$issueNbr=substr(trim($info->plaintext),1,strpos(trim($info->plaintext),' '));
$item=array();
$item['content']='';
if($this->getInput('c')){
$uri=static::URI.$this->getInput('u').'/'.$this->getInput('p').'/issues/'.$issueNbr;
$issue=getSimpleHTMLDOMCached($uri,static::CACHE_TIMEOUT);
if($issue){
$this->items=array_merge($this->items,$this->extractIssueComments($issue));
continue;
}
$item['content']='Can not extract comments from '.$uri;
}
$item['author']=$info->find('a',0)->plaintext;
$item['timestamp']=strtotime($info->find('relative-time',0)->getAttribute('datetime'));
$item['title']=html_entity_decode(
$issue->find('.js-navigation-open',0)->plaintext,
ENT_QUOTES,
'UTF-8'
);
$comments=$issue->find('.col-5',0)->plaintext;
$item['content'].="\n".'Comments: '.($comments?$comments:'0');
$item['uri']=self::URI.$issue->find('.js-navigation-open',0)->getAttribute('href');
$this->items[]=$item;
}
break;
}
array_walk($this->items, function(&$item){
$item['content']=preg_replace('/\s+/',' ',$item['content']);
$item['content']=str_replace('href="/','href="'.static::URI,$item['content']);
$item['content']=str_replace(
'href="#',
'href="'.substr($item['uri'],0,strpos($item['uri'],'#')+1),
$item['content']
);
$item['title']=preg_replace('/\s+/',' ',$item['title']);
});
}
}

32
bridges/GizmodoBridge.php Normal file
View File

@@ -0,0 +1,32 @@
<?php
class GizmodoBridge extends FeedExpander {
const MAINTAINER = "polopollo";
const NAME = "Gizmodo";
const URI = "http://gizmodo.com/";
const CACHE_TIMEOUT = 1800; // 30min
const DESCRIPTION = "Returns the newest posts from Gizmodo (full text).";
protected function parseItem($item){
$item = parent::parseItem($item);
$articleHTMLContent = getSimpleHTMLDOMCached($item['uri']);
if(!$articleHTMLContent){
$text = 'Could not load '.$item['uri'];
}else{
$text = $articleHTMLContent->find('div.entry-content', 0)->innertext;
foreach($articleHTMLContent->find('pagespeed_iframe') as $element) {
$text .= '<p>link to a iframe (could be a video): <a href="'.$element->src.'">'.$element->src.'</a></p><br>';
}
$text = strip_tags($text, '<p><b><a><blockquote><img><em>');
}
$item['content'] = $text;
return $item;
}
public function collectData(){
$this->collectExpandableDatas('http://feeds.gawker.com/gizmodo/full');
}
}

View File

@@ -0,0 +1,113 @@
<?php
class GooglePlusPostBridge extends BridgeAbstract
{
protected $_title;
protected $_url;
const MAINTAINER = "Grummfy";
const NAME = "Google Plus Post Bridge";
const URI = "https://plus.google.com/";
const CACHE_TIMEOUT = 600; //10min
const DESCRIPTION = "Returns user public post (without API).";
const PARAMETERS = array( array(
'username'=>array(
'name'=>'username or Id',
'required'=>true
)
));
public function collectData()
{
// get content parsed
// $html = getSimpleHTMLDOM(__DIR__ . '/../posts2.html'
$html = getSimpleHTMLDOM(self::URI . urlencode($this->getInput('username')) . '/posts'
// force language
, false, stream_context_create(array('http'=> array(
'header' => 'Accept-Language: fr,fr-be,fr-fr;q=0.8,en;q=0.4,en-us;q=0.2;*' . "\r\n"
)))
) OR returnServerError('No results for this query.');
// get title, url, ... there is a lot of intresting stuff in meta
$this->_title = $html->find('meta[property]', 0)->getAttribute('content');
$this->_url = $html->find('meta[itemprop=url]', 0)->getAttribute('content');
// foreach ($html->find('meta') as $e)
// {
// $item = array();
// $item['content'] = var_export($e->attr, true);
// $this->items[] = $item;
// }
// div[jsmodel=XNmfOc]
foreach($html->find('div.yt') as $post)
{
$item = array();
// $item['content'] = $post->find('div.Al', 0)->innertext;
$item['username'] = $item['fullname'] = $post->find('header.lea h3 a', 0)->innertext;
$item['id'] = $post->getAttribute('id');
// $item['title'] = $item['fullname'] = $post->find('header.lea', 0)->plaintext;
$item['avatar'] = $post->find('div.ys img', 0)->src;
// var_dump((($post->find('a.o-U-s', 0)->getAllAttributes())));
$item['uri'] = self::URI . $post->find('a.o-U-s', 0)->href;
$item['timestamp'] = strtotime($post->find('a.o-U-s', 0)->plaintext);
$this->items[] = $item;
// hashtag to treat : https://plus.google.com/explore/tag
$hashtags = array();
foreach($post->find('a.d-s') as $hashtag)
{
$hashtags[ trim($hashtag->plaintext) ] = self::URI . $hashtag->href;
}
$item['content'] = '';
// avatar display
$item['content'] .= '<div style="float:left; margin: 0 0.5em 0.5em 0;"><a href="' . self::URI . urlencode($this->getInput('username'));
$item['content'] .= '"><img align="top" alt="avatar" src="' . $item['avatar'].'" />' . $item['username'] . '</a></div>';
$content = $post->find('div.Al', 0);
// alter link
// $content = $content->innertext;
// $content = str_replace('href="./', 'href="' . self::URI, $content);
// $content = str_replace('href="photos', 'href="' . self::URI . 'photos', $content);
// XXX ugly but I don't have any idea how to do a better stuff, str_replace on link doesn't work as expected and ask too many checks
foreach($content->find('a') as $link)
{
$hasHttp = strpos($link->href, 'http');
$hasDoubleSlash = strpos($link->href, '//');
if ((!$hasHttp && !$hasDoubleSlash)
|| (false !== $hasHttp && strpos($link->href, 'http') != 0)
|| (false === $hasHttp && false !== $hasDoubleSlash && $hasDoubleSlash != 0))
{
// skipp bad link, for some hashtag or other stuff
if (strpos($link->href, '/') == 0)
{
$link->href = substr($link->href, 1);
}
$link->href = self::URI . $link->href;
}
}
$content = $content->innertext;
$item['content'] .= '<div style="margin-top: -1.5em">' . $content . '</div>';
// extract plaintext
$item['content_simple'] = $post->find('div.Al', 0)->plaintext;
}
// $html->save(__DIR__ . '/../posts2.html');
}
public function getName()
{
return $this->_title ?: 'Google Plus Post Bridge';
}
public function getURI()
{
return $this->_url ?: self::URI;
}
}

View File

@@ -1,51 +1,54 @@
<?php
/**
* RssBridgeGoogleMostRecent
* Search Google for most recent pages regarding a specific topic.
* Returns the 100 most recent links in results in past year, sorting by date (most recent first).
* Example:
* http://www.google.com/search?q=sebsauvage&num=100&complete=0&tbs=qdr:y,sbd:1
* complete=0&num=100 : get 100 results
* qdr:y : in past year
* sbd:1 : sort by date (will only work if qdr: is specified)
*
* @name Google search
* @description Returns most recent results from Google search.
* @use1(q="keyword")
*/
class GoogleSearchBridge extends BridgeAbstract{
public function collectData(array $param){
const MAINTAINER = "sebsauvage";
const NAME = "Google search";
const URI = "https://www.google.com/";
const CACHE_TIMEOUT = 1800; // 30min
const DESCRIPTION = "Returns most recent results from Google search.";
const PARAMETERS = array( array(
'q'=>array(
'name'=>"keyword",
'required'=>true
)
));
public function collectData(){
$html = '';
if (isset($param['q'])) { /* keyword search mode */
$html = file_get_html('http://www.google.com/search?q=' . urlencode($param['q']) . '&num=100&complete=0&tbs=qdr:y,sbd:1') or $this->returnError('No results for this query.', 404);
}
else{
$this->returnError('You must specify a keyword (?q=...).', 400);
}
$html = getSimpleHTMLDOM(self::URI
.'search?q=' . urlencode($this->getInput('q'))
.'&num=100&complete=0&tbs=qdr:y,sbd:1')
or returnServerError('No results for this query.');
$emIsRes = $html->find('div[id=ires]',0);
if( !is_null($emIsRes) ){
foreach($emIsRes->find('li[class=g]') as $element) {
$item = new \Item();
$item->uri = $element->find('a[href]',0)->href;
$item->title = $element->find('h3',0)->plaintext;
$item->content = $element->find('span[class=st]',0)->plaintext;
$item = array();
// Extract direct URL from google href (eg. /url?q=...)
$t = $element->find('a[href]',0)->href;
$item['uri'] = ''.$t;
parse_str(parse_url($t, PHP_URL_QUERY),$parameters);
if (isset($parameters['q'])) { $item['uri'] = $parameters['q']; }
$item['title'] = $element->find('h3',0)->plaintext;
$item['content'] = $element->find('span[class=st]',0)->plaintext;
$this->items[] = $item;
}
}
}
public function getName(){
return 'Google search';
}
public function getURI(){
return 'http://google.com';
}
public function getCacheDuration(){
return 1800; // 30 minutes
return $this->getInput('q') .' - Google search';
}
}

View File

@@ -0,0 +1,62 @@
<?php
class HDWallpapersBridge extends BridgeAbstract {
const MAINTAINER = "nel50n";
const NAME = "HD Wallpapers Bridge";
const URI = "http://www.hdwallpapers.in/";
const CACHE_TIMEOUT = 43200; //12h
const DESCRIPTION = "Returns the latests wallpapers from HDWallpapers";
const PARAMETERS = array( array(
'c'=>array(
'name'=>'category',
'defaultValue'=>'latest_wallpapers'
),
'm'=>array('name'=>'max number of wallpapers'),
'r'=>array(
'name'=>'resolution',
'defaultValue'=>'1920x1200',
'exampleValue'=>'1920x1200, 1680x1050,…'
)
));
public function collectData(){
$category = $this->category;
if (strrpos($category, 'wallpapers') !== strlen($category)-strlen('wallpapers')) {
$category .= '-desktop-wallpapers';
}
$num = 0;
$max = $this->getInput('m') ?: 14;
$lastpage = 1;
for ($page = 1; $page <= $lastpage; $page++) {
$link = self::URI.'/'.$category.'/page/'.$page;
$html = getSimpleHTMLDOM($link) or returnServerError('No results for this query.');
if ($page === 1) {
preg_match('/page\/(\d+)$/', $html->find('.pagination a', -2)->href, $matches);
$lastpage = min($matches[1], ceil($max/14));
}
foreach($html->find('.wallpapers .wall a') as $element) {
$thumbnail = $element->find('img', 0);
$item = array();
// http://www.hdwallpapers.in/download/yosemite_reflections-1680x1050.jpg
$item['uri'] = self::URI.'/download'.str_replace('wallpapers.html', $this->getInput('r').'.jpg', $element->href);
$item['timestamp'] = time();
$item['title'] = $element->find('p', 0)->text();
$item['content'] = $item['title'].'<br><a href="'.$item['uri'].'"><img src="'.self::URI.$thumbnail->src.'" /></a>';
$this->items[] = $item;
$num++;
if ($num >= $max)
break 2;
}
}
}
public function getName(){
return 'HDWallpapers - '.str_replace(['__', '_'], [' & ', ' '], $this->getInput('c')).' ['.$this->getInput('r').']';
}
}

View File

@@ -0,0 +1,23 @@
<?php
class HentaiHavenBridge extends BridgeAbstract{
const MAINTAINER = "albirew";
const NAME = "Hentai Haven";
const URI = "http://hentaihaven.org/";
const CACHE_TIMEOUT = 21600; // 6h
const DESCRIPTION = "Returns releases from Hentai Haven";
public function collectData(){
$html = getSimpleHTMLDOM(self::URI)
or returnServerError('Could not request Hentai Haven.');
foreach($html->find('div.zoe-grid') as $element) {
$item = array();
$item['uri'] = $element->find('div.brick-content h3 a', 0)->href;
$thumbnailUri = $element->find('a.thumbnail-image img', 0)->getAttribute('data-src');
$item['title'] = mb_convert_encoding(trim($element->find('div.brick-content h3 a', 0)->innertext), 'UTF-8', 'HTML-ENTITIES');
$item['tags'] = $element->find('div.oFlyout_bg div.oFlyout div.flyoutContent span.tags', 0)->plaintext;
$item['content'] = 'Tags: ' . $item['tags'].'<br><br><a href="' . $item['uri'] . '"><img width="300" height="169" src="' . $thumbnailUri . '" /></a><br>' . $element->find('div.oFlyout_bg div.oFlyout div.flyoutContent p.description', 0)->innertext;
$this->items[] = $item;
}
}
}

View File

@@ -0,0 +1,38 @@
<?php
class IdenticaBridge extends BridgeAbstract{
const MAINTAINER = "mitsukarenai";
const NAME = "Identica Bridge";
const URI = "https://identi.ca/";
const CACHE_TIMEOUT = 300; // 5min
const DESCRIPTION = "Returns user timelines";
const PARAMETERS = array( array(
'u'=>array(
'name'=>'username',
'required'=>true
)
));
public function collectData(){
$html = getSimpleHTMLDOM($this->getURI())
or returnServerError('Requested username can\'t be found.');
foreach($html->find('li.major') as $dent) {
$item = array();
$item['uri'] = html_entity_decode($dent->find('a', 0)->href); // get dent link
$item['timestamp'] = strtotime($dent->find('abbr.easydate', 0)->plaintext); // extract dent timestamp
$item['content'] = trim($dent->find('div.activity-content', 0)->innertext); // extract dent text
$item['title'] = $this->getInput('u') . ' | ' . $item['content'];
$this->items[] = $item;
}
}
public function getName(){
return $this->getInput('u') .' - Identica Bridge';
}
public function getURI(){
return self::URI.urlencode($this->getInput('u'));
}
}

View File

@@ -0,0 +1,71 @@
<?php
class InstagramBridge extends BridgeAbstract{
const MAINTAINER = "pauder";
const NAME = "Instagram Bridge";
const URI = "http://instagram.com/";
const DESCRIPTION = "Returns the newest images";
const PARAMETERS = array( array(
'u'=>array(
'name'=>'username',
'required'=>true
)
));
public function collectData(){
$html = getSimpleHTMLDOM($this->getURI())
or returnServerError('Could not request Instagram.');
$innertext = null;
foreach($html->find('script') as $script)
{
if ('' === $script->innertext) {
continue;
}
$pos = strpos(trim($script->innertext), 'window._sharedData');
if (0 !== $pos)
{
continue;
}
$innertext = $script->innertext;
break;
}
$json = trim(substr($innertext, $pos+18), ' =;');
$data = json_decode($json);
$userMedia = $data->entry_data->ProfilePage[0]->user->media->nodes;
foreach($userMedia as $media)
{
$item = array();
$item['uri'] = self::URI.'p/'.$media->code.'/';
$item['content'] = '<img src="' . htmlentities($media->display_src) . '" />';
if (isset($media->caption))
{
$item['title'] = $media->caption;
} else {
$item['title'] = basename($media->display_src);
}
$item['timestamp'] = $media->date;
$this->items[] = $item;
}
}
public function getName(){
return $this->getInput('u') .' - Instagram Bridge';
}
public function getURI(){
return self::URI.urlencode($this->getInput('u'));
}
}

468
bridges/IsoHuntBridge.php Normal file
View File

@@ -0,0 +1,468 @@
<?php
class IsoHuntBridge extends BridgeAbstract{
const MAINTAINER = 'logmanoriginal';
const NAME = 'isoHunt Bridge';
const URI = 'https://isohunt.to/';
const CACHE_TIMEOUT = 300; //5min
const DESCRIPTION = 'Returns the latest results by category or search result';
const PARAMETERS = array(
/*
* Get feeds for one of the "latest" categories
* Notice: The categories "News" and "Top Searches" are received from the main page
* Elements are sorted by name ascending!
*/
'By "Latest" category' => array(
'latest_category'=>array(
'name'=>'Latest category',
'type'=>'list',
'required'=>true,
'title'=>'Select your category',
'defaultValue'=>'news',
'values'=>array(
'Hot Torrents'=>'hot_torrents',
'News'=>'news',
'Releases'=>'releases',
'Torrents'=>'torrents'
)
)
),
/*
* Get feeds for one of the "torrent" categories
* Make sure to add new categories also to get_torrent_category_index($)!
* Elements are sorted by name ascending!
*/
'By "Torrent" category' => array(
'torrent_category'=>array(
'name'=>'Torrent category',
'type'=>'list',
'required'=>true,
'title'=>'Select your category',
'defaultValue'=>'anime',
'values'=>array(
'Adult'=>'adult',
'Anime'=>'anime',
'Books'=>'books',
'Games'=>'games',
'Movies'=>'movies',
'Music'=>'music',
'Other'=>'other',
'Series & TV'=>'series_tv',
'Software'=>'software'
)
),
'torrent_popularity'=>array(
'name'=>'Sort by popularity',
'type'=>'checkbox',
'title'=>'Activate to receive results by popularity'
)
),
/*
* Get feeds for a specific search request
*/
'Search torrent by name' => array(
'search_name'=>array(
'name'=>'Name',
'required'=>true,
'title'=>'Insert your search query',
'exampleValue'=>'Bridge'
),
'search_category'=>array(
'name'=>'Category',
'type'=>'list',
'title'=>'Select your category',
'defaultValue'=>'all',
'values'=>array(
'Adult'=>'adult',
'All'=>'all',
'Anime'=>'anime',
'Books'=>'books',
'Games'=>'games',
'Movies'=>'movies',
'Music'=>'music',
'Other'=>'other',
'Series & TV'=>'series_tv',
'Software'=>'software'
)
)
)
);
public function getURI(){
$uri=self::URI;
switch($this->queriedContext){
case 'By "Latest" category':
switch($this->getInput('latest_category')){
case 'hot_torrents':
$uri .= 'statistic/hot/torrents';
break;
case 'news':
break;
case 'releases':
$uri .= 'releases.php';
break;
case 'torrents':
$uri .= 'latest.php';
break;
}
break;
case 'By "Torrent" category':
$uri .= $this->build_category_uri(
$this->getInput('torrent_category'),
$this->getInput('torrent_popularity')
);
break;
case 'Search torrent by name':
$category=$this->getInput('search_category');
$uri .= $this->build_category_uri($category);
if($category!=='movies')
$uri .= '&ihq=' . urlencode($this->getInput('search_name'));
break;
}
return $uri;
}
public function getName(){
switch($this->queriedContext){
case 'By "Latest" category':
$categoryName =
array_search(
$this->getInput('latest_category'),
self::PARAMETERS['By "Latest" category']['latest_category']['values']
);
$name = 'Latest '.$categoryName.' - ' . self::NAME;
break;
case 'By "Torrent" category':
$categoryName =
array_search(
$this->getInput('torrent_category'),
self::PARAMETERS['By "Torrent" category']['torrent_category']['values']
);
$name = 'Category: ' . $categoryName . ' - ' . self::NAME;
break;
case 'Search torrent by name':
$categoryName =
array_search(
$this->getInput('search_category'),
self::PARAMETERS['Search torrent by name']['search_category']['values']
);
$name = 'Search: "' . $this->getInput('search_name') . '" in category: ' . $categoryName . ' - ' . self::NAME;
break;
}
return $name;
}
public function collectData(){
$html = $this->load_html($this->getURI());
switch($this->queriedContext){
case 'By "Latest" category':
switch($this->getInput('latest_category')){
case 'hot_torrents':
$this->get_latest_hot_torrents($html);
break;
case 'news':
$this->get_latest_news($html);
break;
case 'releases':
case 'torrents':
$this->get_latest_torrents($html);
break;
}
break;
case 'By "Torrent" category':
if($this->getInput('torrent_category') === 'movies'){
// This one is special (content wise)
$this->get_movie_torrents($html);
}else{
$this->get_latest_torrents($html);
}
break;
case 'Search torrent by name':
if( $this->getInput('search_category') === 'movies'){
// This one is special (content wise)
$this->get_movie_torrents($html);
} else {
$this->get_latest_torrents($html);
}
break;
}
}
#region Helper functions for "Movie Torrents"
private function get_movie_torrents($html){
$container = $html->find('div#w0', 0);
if(!$container)
returnServerError('Unable to find torrent container!');
$torrents = $container->find('article');
if(!$torrents)
returnServerError('Unable to find torrents!');
foreach($torrents as $torrent){
$anchor = $torrent->find('a', 0);
if(!$anchor)
returnServerError('Unable to find anchor!');
$date = $torrent->find('small', 0);
if(!$date)
returnServerError('Unable to find date!');
$item = array();
$item['uri'] = $this->fix_relative_uri($anchor->href);
$item['title'] = $anchor->title;
// $item['author'] =
$item['timestamp'] = strtotime($date->plaintext);
$item['content'] = $this->fix_relative_uri($torrent->innertext);
$this->items[] = $item;
}
}
#endregion
#region Helper functions for "Latest Hot Torrents"
private function get_latest_hot_torrents($html){
$container = $html->find('div#serps', 0);
if(!$container)
returnServerError('Unable to find torrent container!');
$torrents = $container->find('tr');
if(!$torrents)
returnServerError('Unable to find torrents!');
// Remove first element (header row)
$torrents = array_slice($torrents, 1);
foreach($torrents as $torrent){
$cell = $torrent->find('td', 0);
if(!$cell)
returnServerError('Unable to find cell!');
$element = $cell->find('a', 0);
if(!$element)
returnServerError('Unable to find element!');
$item = array();
$item['uri'] = $element->href;
$item['title'] = $element->plaintext;
// $item['author'] =
// $item['timestamp'] =
// $item['content'] =
$this->items[] = $item;
}
}
#endregion
#region Helper functions for "Latest News"
private function get_latest_news($html){
$container = $html->find('div#postcontainer', 0);
if(!$container)
returnServerError('Unable to find post container!');
$posts = $container->find('div.index-post');
if(!$posts)
returnServerError('Unable to find posts!');
foreach($posts as $post){
$item = array();
$item['uri'] = $this->latest_news_extract_uri($post);
$item['title'] = $this->latest_news_extract_title($post);
$item['author'] = $this->latest_news_extract_author($post);
$item['timestamp'] = $this->latest_news_extract_timestamp($post);
$item['content'] = $this->latest_news_extract_content($post);
$this->items[] = $item;
}
}
private function latest_news_extract_author($post){
$author = $post->find('small', 0);
if(!$author)
returnServerError('Unable to find author!');
// The author is hidden within a string like: 'Posted by {author} on {date}'
preg_match('/Posted\sby\s(.*)\son/i', $author->innertext, $matches);
return $matches[1];
}
private function latest_news_extract_timestamp($post){
$date = $post->find('small', 0);
if(!$date)
returnServerError('Unable to find date!');
// The date is hidden within a string like: 'Posted by {author} on {date}'
preg_match('/Posted\sby\s.*\son\s(.*)/i', $date->innertext, $matches);
$timestamp = strtotime($matches[1]);
// Make sure date is not in the future (dates are given like 'Nov. 20' without year)
if($timestamp > time()){
$timestamp = strtotime('-1 year', $timestamp);
}
return $timestamp;
}
private function latest_news_extract_title($post){
$title = $post->find('a', 0);
if(!$title)
returnServerError('Unable to find title!');
return $title->plaintext;
}
private function latest_news_extract_uri($post){
$uri = $post->find('a', 0);
if(!$uri)
returnServerError('Unable to find uri!');
return $uri->href;
}
private function latest_news_extract_content($post){
$content = $post->find('div', 0);
if(!$content)
returnServerError('Unable to find content!');
// Remove <h2>...</h2> (title)
foreach($content->find('h2') as $element){
$element->outertext = '';
}
// Remove <small>...</small> (author)
foreach($content->find('small') as $element){
$element->outertext = '';
}
return $content->innertext;
}
#endregion
#region Helper functions for "Latest Torrents", "Latest Releases" and "Torrent Category"
private function get_latest_torrents($html){
$container = $html->find('div#serps', 0);
if(!$container)
returnServerError('Unable to find torrent container!');
$torrents = $container->find('tr[data-key]');
if(!$torrents)
returnServerError('Unable to find torrents!');
foreach($torrents as $torrent){
$item = array();
$item['uri'] = $this->latest_torrents_extract_uri($torrent);
$item['title'] = $this->latest_torrents_extract_title($torrent);
$item['author'] = $this->latest_torrents_extract_author($torrent);
$item['timestamp'] = $this->latest_torrents_extract_timestamp($torrent);
$item['content'] = ''; // There is no valuable content
$this->items[] = $item;
}
}
private function latest_torrents_extract_title($torrent){
$cell = $torrent->find('td.title-row', 0);
if(!$cell)
returnServerError('Unable to find title cell!');
$title = $cell->find('span', 0);
if(!$title)
returnServerError('Unable to find title!');
return $title->plaintext;
}
private function latest_torrents_extract_uri($torrent){
$cell = $torrent->find('td.title-row', 0);
if(!$cell)
returnServerError('Unable to find title cell!');
$uri = $cell->find('a', 0);
if(!$uri)
returnServerError('Unable to find uri!');
return $this->fix_relative_uri($uri->href);
}
private function latest_torrents_extract_author($torrent){
$cell = $torrent->find('td.user-row', 0);
if(!$cell)
return; // No author
$user = $cell->find('a', 0);
if(!$user)
returnServerError('Unable to find user!');
return $user->plaintext;
}
private function latest_torrents_extract_timestamp($torrent){
$cell = $torrent->find('td.date-row', 0);
if(!$cell)
returnServerError('Unable to find date cell!');
return strtotime('-' . $cell->plaintext, time());
}
#endregion
#region Generic helper functions
private function load_html($uri){
$html = getSimpleHTMLDOM($uri);
if(!$html)
returnServerError('Unable to load ' . $uri . '!');
return $html;
}
private function fix_relative_uri($uri){
return preg_replace('/\//i', self::URI, $uri, 1);
}
private function build_category_uri($category, $order_popularity = false){
switch($category){
case 'anime': $index = 1; break;
case 'software' : $index = 2; break;
case 'games' : $index = 3; break;
case 'adult' : $index = 4; break;
case 'movies' : $index = 5; break;
case 'music' : $index = 6; break;
case 'other' : $index = 7; break;
case 'series_tv' : $index = 8; break;
case 'books': $index = 9; break;
case 'all':
default: $index = 0; break;
}
return 'torrents/?iht=' . $index . '&ihs=' . ($order_popularity ? 1 : 0) . '&age=0';
}
#endregion
}

View File

@@ -0,0 +1,89 @@
<?php
class JapanExpoBridge extends BridgeAbstract {
const MAINTAINER = 'Ginko';
const NAME = 'Japan Expo Actualités';
const URI = 'http://www.japan-expo-paris.com/fr/actualites';
const CACHE_TIMEOUT = 14400; // 4h
const DESCRIPTION = 'Returns most recent entries from Japan Expo actualités.';
const PARAMETERS = array( array(
'mode'=>array(
'name'=>'Show full contents',
'type'=>'checkbox',
)
));
public function collectData(){
function french_pubdate_to_timestamp($date_to_parse) {
return strtotime(
strtr(
strtolower(str_replace('Publié le ', '', $date_to_parse)),
array(
'janvier' => 'jan',
'février' => 'feb',
'mars' => 'march',
'avril' => 'apr',
'mai' => 'may',
'juin' => 'jun',
'juillet' => 'jul',
'août' => 'aug',
'septembre' => 'sep',
'octobre' => 'oct',
'novembre' => 'nov',
'décembre' => 'dec'
)
)
);
}
$convert_article_images = function ($matches) {
if (is_array($matches) && count($matches) > 1) {
return '<img src="'.$matches[1].'" />';
}
};
$html = getSimpleHTMLDOM(self::URI)
or returnServerError('Could not request JapanExpo: '.self::URI);
$fullcontent = $this->getInput('mode');
$count = 0;
foreach ($html->find('a._tile2') as $element) {
$url = $element->href;
$thumbnail = 'http://s.japan-expo.com/katana/images/JES049/paris.png';
preg_match('/url\(([^)]+)\)/', $element->find('img.rspvimgset', 0)->style, $img_search_result);
if (count($img_search_result) >= 2)
$thumbnail = trim($img_search_result[1], "'");
if ($fullcontent) {
if ($count >= 5) {
break;
}
$article_html = getSimpleHTMLDOMCached('Could not request JapanExpo: '.$url);
$header = $article_html->find('header.pageHeadBox', 0);
$timestamp = strtotime($header->find('time', 0)->datetime);
$title_html = $header->find('div.section', 0)->next_sibling();
$title = $title_html->plaintext;
$headings = $title_html->next_sibling()->outertext;
$article = $article_html->find('div.content', 0)->innertext;
$article = preg_replace_callback('/<img [^>]+ style="[^\(]+\(\'([^\']+)\'[^>]+>/i', $convert_article_images, $article);
$content = $headings.$article;
} else {
$date_text = $element->find('span.date', 0)->plaintext;
$timestamp = french_pubdate_to_timestamp($date_text);
$title = trim($element->find('span._title', 0)->plaintext);
$content = '<img src="'.$thumbnail.'"></img><br />'.$date_text.'<br /><a href="'.$url.'">Lire l\'article</a>';
}
$item = array();
$item['uri'] = $url;
$item['title'] = $title;
$item['timestamp'] = $timestamp;
$item['content'] = $content;
$this->items[] = $item;
$count++;
}
}
}

View File

@@ -0,0 +1,11 @@
<?php
require_once('MoebooruBridge.php');
class KonachanBridge extends MoebooruBridge {
const MAINTAINER = "mitsukarenai";
const NAME = "Konachan";
const URI = "http://konachan.com/";
const DESCRIPTION = "Returns images from given page";
}

22
bridges/KoreusBridge.php Normal file
View File

@@ -0,0 +1,22 @@
<?php
class KoreusBridge extends FeedExpander {
const MAINTAINER = "pit-fgfjiudghdf";
const NAME = "Koreus";
const URI = "http://www.koreus.com/";
const DESCRIPTION = "Returns the newest posts from Koreus (full text)";
protected function parseItem($item) {
$item = parent::parseItem($item);
$html = getSimpleHTMLDOMCached($item['uri']);
$text = $html->find('p.itemText', 0)->innertext;
$item['content'] = utf8_encode($text);
return $item;
}
public function collectData(){
$this->collectExpandableDatas('http://feeds.feedburner.com/Koreus-articles');
}
}

236
bridges/KununuBridge.php Normal file
View File

@@ -0,0 +1,236 @@
<?php
class KununuBridge extends BridgeAbstract {
const MAINTAINER = "logmanoriginal";
const NAME = "Kununu Bridge";
const URI = "https://www.kununu.com/";
const CACHE_TIMEOUT = 86400; // 24h
const DESCRIPTION = "Returns the latest reviews for a company and site of your choice.";
const PARAMETERS = array(
'global' => array(
'site'=>array(
'name'=>'Site',
'type'=>'list',
'required'=>true,
'title'=>'Select your site',
'values'=>array(
'Austria'=>'at',
'Germany'=>'de',
'Switzerland'=>'ch',
'United States'=>'us'
)
),
'full'=>array(
'name'=>'Load full article',
'type'=>'checkbox',
'required'=>false,
'exampleValue'=>'checked',
'title'=>'Activate to load full article'
)
),
array(
'company'=>array(
'name'=>'Company',
'required'=>true,
'exampleValue'=>'kununu-us',
'title'=>'Insert company name (i.e. Kununu US) or URI path (i.e. kununu-us)'
)
)
);
private $companyName='';
public function getURI(){
$company = $this->encode_umlauts(strtolower(str_replace(' ', '-', trim($this->getInput('company')))));
$site=$this->getInput('site');
$section = '';
switch($site){
case 'at':
case 'de':
case 'ch':
$section = 'kommentare';
break;
case 'us':
$section = 'reviews';
break;
}
return self::URI.$site.'/'.$company.'/'.$section;
}
function getName(){
$company = $this->encode_umlauts(strtolower(str_replace(' ', '-', trim($this->getInput('company')))));
return ($this->companyName?:$company).' - '.self::NAME;
}
public function collectData(){
$full = $this->getInput('full');
// Load page
$html = getSimpleHTMLDOM($this->getURI());
if(!$html)
returnServerError('Unable to receive data from ' . $this->getURI() . '!');
// Update name for this request
$this->companyName = $this->extract_company_name($html);
// Find the section with all the panels (reviews)
$section = $html->find('section.kununu-scroll-element', 0);
if($section === false)
returnServerError('Unable to find panel section!');
// Find all articles (within the panels)
$articles = $section->find('article');
if($articles === false || empty($articles))
returnServerError('Unable to find articles!');
// Go through all articles
foreach($articles as $article){
$item = array();
$item['author'] = $this->extract_article_author_position($article);
$item['timestamp'] = $this->extract_article_date($article);
$item['title'] = $this->extract_article_rating($article) . ' : ' . $this->extract_article_summary($article);
$item['uri'] = $this->extract_article_uri($article);
if($full)
$item['content'] = $this->extract_full_description($item['uri']);
else
$item['content'] = $this->extract_article_description($article);
$this->items[] = $item;
}
}
/**
* Fixes relative URLs in the given text
*/
private function fix_url($text){
return preg_replace('/href=(\'|\")\//i', 'href="'.self::URI, $text);
}
/**
* Encodes unmlauts in the given text
*/
private function encode_umlauts($text){
$umlauts = Array("/ä/","/ö/","/ü/","/Ä/","/Ö/","/Ü/","/ß/");
$replace = Array("ae","oe","ue","Ae","Oe","Ue","ss");
return preg_replace($umlauts, $replace, $text);
}
/**
* Returns the company name from the review html
*/
private function extract_company_name($html){
$panel = $html->find('div.panel', 0);
if($panel === false)
returnServerError('Cannot find panel for company name!');
$company_name = $panel->find('h1', 0);
if($company_name === false)
returnServerError('Cannot find company name!');
return $company_name->plaintext;
}
/**
* Returns the date from a given article
*/
private function extract_article_date($article){
// They conviniently provide a time attribute for us :)
$date = $article->find('time[itemprop=dtreviewed]', 0);
if($date === false)
returnServerError('Cannot find article date!');
return strtotime($date->datetime);
}
/**
* Returns the rating from a given article
*/
private function extract_article_rating($article){
$rating = $article->find('span.rating', 0);
if($rating === false)
returnServerError('Cannot find article rating!');
return $rating->getAttribute('aria-label');
}
/**
* Returns the summary from a given article
*/
private function extract_article_summary($article){
$summary = $article->find('[itemprop=summary]', 0);
if($summary === false)
returnServerError('Cannot find article summary!');
return strip_tags($summary->innertext);
}
/**
* Returns the URI from a given article
*/
private function extract_article_uri($article){
// Notice: This first part is the same as in extract_article_summary!
$summary = $article->find('[itemprop=summary]', 0);
if($summary === false)
returnServerError('Cannot find article summary!');
$anchor = $summary->find('a', 0);
if($anchor === false)
returnServerError('Cannot find article URI!');
return self::URI . $anchor->href;
}
/**
* Returns the position of the author from a given article
*/
private function extract_article_author_position($article){
// We need to parse the aside manually
$aside = $article->find('aside', 0);
if($aside === false)
returnServerError('Cannot find article author information!');
// Go through all h2 elements to find index of required span (I know... it's stupid)
$author_position = 'Unknown';
foreach($aside->find('h2') as $subject){
if(stristr(strtolower($subject->plaintext), 'position')){ /* This works for at, ch, de, us */
$author_position = $subject->next_sibling()->plaintext;
break;
}
}
return $author_position;
}
/**
* Returns the description from a given article
*/
private function extract_article_description($article){
$description = $article->find('div[itemprop=description]', 0);
if($description === false)
returnServerError('Cannot find article description!');
return $this->fix_url($description->innertext);
}
/**
* Returns the full description from a given uri
*/
private function extract_full_description($uri){
// Load full article
$html = getSimpleHTMLDOMCached($uri);
if($html === false)
returnServerError('Could not load full description!');
// Find the article
$article = $html->find('article', 0);
if($article === false)
returnServerError('Cannot find article!');
// Luckily they use the same layout for the review overview and full article pages :)
return $this->extract_article_description($article);
}
}

144
bridges/LWNprevBridge.php Normal file
View File

@@ -0,0 +1,144 @@
<?php
class LWNprevBridge extends BridgeAbstract{
const MAINTAINER = 'Pierre Mazière';
const NAME = 'LWN Free Weekly Edition';
const URI = 'https://lwn.net/';
const CACHE_TIMEOUT = 604800; // 1 week
const DESCRIPTION = 'LWN Free Weekly Edition available one week late';
function getURI(){
return self::URI.'free/bigpage';
}
private function jumpToNextTag(&$node){
while($node && $node->nodeType===XML_TEXT_NODE){
$nextNode=$node->nextSibling;
if(!$nextNode){
break;
}
$node=$nextNode;
}
}
private function jumpToPreviousTag(&$node){
while($node && $node->nodeType===XML_TEXT_NODE){
$previousNode=$node->previousSibling;
if(!$previousNode){
break;
}
$node=$previousNode;
}
}
public function collectData(){
// Because the LWN page is written in loose HTML and not XHTML,
// Simple HTML Dom is not accurate enough for the job
$content=getContents($this->getURI())
or returnServerError('No results for LWNprev');
libxml_use_internal_errors(true);
$html=new DOMDocument();
$html->loadHTML($content);
libxml_clear_errors();
$cat1='';
$cat2='';
foreach($html->getElementsByTagName('a') as $a){
if($a->textContent==='Multi-page format'){
break;
}
}
$realURI=self::URI.$a->getAttribute('href');
$URICounter=0;
$edition=$html->getElementsByTagName('h1')->item(0)->textContent;
$editionTimeStamp=strtotime(
substr($edition,strpos($edition,'for ')+strlen('for '))
);
foreach($html->getElementsByTagName('h2') as $h2){
if($h2->getAttribute('class')!=='SummaryHL'){
continue;
}
$item = array();
$h2NextSibling=$h2->nextSibling;
$this->jumpToNextTag($h2NextSibling);
switch($h2NextSibling->getAttribute('class')){
case 'FeatureByline':
$item['author']=$h2NextSibling->getElementsByTagName('b')->item(0)->textContent;
break;
case 'GAByline':
$text=$h2NextSibling->textContent;
$item['author']=substr($text,strpos($text,'by '));
break;
default:
$item['author']='LWN';
break;
};
$h2FirstChild=$h2->firstChild;
$this->jumpToNextTag($h2FirstChild);
if($h2FirstChild->nodeName==='a'){
$item['uri']=self::URI.$h2FirstChild->getAttribute('href');
}else{
$item['uri']=$realURI.'#'.$URICounter;
}
$URICounter++;
$item['timestamp']=$editionTimeStamp+$URICounter;
$h2PrevSibling=$h2->previousSibling;
$this->jumpToPreviousTag($h2PrevSibling);
switch($h2PrevSibling->getAttribute('class')){
case 'Cat2HL':
$cat2=$h2PrevSibling->textContent;
$h2PrevSibling=$h2PrevSibling->previousSibling;
$this->jumpToPreviousTag($h2PrevSibling);
if($h2PrevSibling->getAttribute('class')!=='Cat1HL'){
break;
}
$cat1=$h2PrevSibling->textContent;
break;
case 'Cat1HL':
$cat1=$h2PrevSibling->textContent;
$cat2='';
break;
default:
break;
}
$h2PrevSibling=null;
$item['title']='';
if(!empty($cat1)){
$item['title'].='['.$cat1.($cat2?'/'.$cat2:'').'] ';
}
$item['title'].=$h2->textContent;
$node=$h2;
$content='';
$contentEnd=false;
while(!$contentEnd){
$node=$node->nextSibling;
if(
!$node || (
$node->nodeType!==XML_TEXT_NODE && (
$node->nodeName==='h2' ||
(!is_null($node->attributes) && !is_null($class=$node->attributes->getNamedItem('class')) &&
in_array($class->nodeValue,array('Cat1HL','Cat2HL')))
)
)
){
$contentEnd=true;
}else{
$content.=$node->C14N();
}
}
$item['content']=$content;
$this->items[]=$item;
}
}
}

186
bridges/LeBonCoinBridge.php Executable file
View File

@@ -0,0 +1,186 @@
<?php
class LeBonCoinBridge extends BridgeAbstract{
const MAINTAINER = "16mhz";
const NAME = "LeBonCoin";
const URI = "http://www.leboncoin.fr/";
const DESCRIPTION = "Returns most recent results from LeBonCoin for a region, and optionally a category and a keyword .";
const PARAMETERS = array( array(
'k'=>array('name'=>'Mot Clé'),
'r'=>array(
'name'=>'Région',
'type'=>'list',
'values'=>array(
'Toute la France'=>'ile_de_france/occasions',
'Alsace'=>'alsace',
'Aquitaine'=>'aquitaine',
'Auvergne'=>'auvergne',
'Basse Normandie'=>'basse_normandie',
'Bourgogne'=>'bourgogne',
'Bretagne'=>'bretagne',
'Centre'=>'centre',
'Champagne Ardenne'=>'champagne_ardenne',
'Corse'=>'corse',
'Franche Comté'=>'franche_comte',
'Haute Normandie'=>'haute_normandie',
'Ile de France'=>'ile_de_france',
'Languedoc Roussillon'=>'languedoc_roussillon',
'Limousin'=>'limousin',
'Lorraine'=>'lorraine',
'Midi Pyrénées'=>'midi_pyrenees',
'Nord Pas De Calais'=>'nord_pas_de_calais',
'Pays de la Loire'=>'pays_de_la_loire',
'Picardie'=>'picardie',
'Poitou Charentes'=>'poitou_charentes',
'Provence Alpes Côte d\'Azur'=>'provence_alpes_cote_d_azur',
'Rhône-Alpes'=>'rhone_alpes',
'Guadeloupe'=>'guadeloupe',
'Martinique'=>'martinique',
'Guyane'=>'guyane',
'Réunion'=>'reunion'
)
),
'c'=>array(
'name'=>'Catégorie',
'type'=>'list',
'values'=>array(
'TOUS'=>'',
'EMPLOI'=>'_emploi_',
'VEHICULES'=>array(
'Tous'=>'_vehicules_',
'Voitures'=>'voitures',
'Motos'=>'motos',
'Caravaning'=>'caravaning',
'Utilitaires'=>'utilitaires',
'Équipement Auto'=>'equipement_auto',
'Équipement Moto'=>'equipement_moto',
'Équipement Caravaning'=>'equipement_caravaning',
'Nautisme'=>'nautisme',
'Équipement Nautisme'=>'equipement_nautisme'
),
'IMMOBILIER'=>array(
'Tous'=>'_immobilier_',
'Ventes immobilières'=>'ventes_immobilieres',
'Locations'=>'locations',
'Colocations'=>'colocations',
'Bureaux & Commerces'=>'bureaux_commerces'
),
'VACANCES'=>array(
'Tous'=>'_vacances_',
'Location gîtes'=>'locations_gites',
'Chambres d\'hôtes'=>'chambres_d_hotes',
'Campings'=>'campings',
'Hôtels'=>'hotels',
'Hébergements insolites'=>'hebergements_insolites'
),
'MULTIMEDIA'=>array(
'Tous'=>'_multimedia_',
'Informatique'=>'informatique',
'Consoles & Jeux vidéo'=>'consoles_jeux_video',
'Image & Son'=>'image_son',
'Téléphonie'=>'telephonie'
),
'LOISIRS'=>array(
'Tous'=>'_loisirs_',
'DVD / Films'=>'dvd_films',
'CD / Musique'=>'cd_musique',
'Livres'=>'livres',
'Animaux'=>'animaux',
'Vélos'=>'velos',
'Sports & Hobbies'=>'sports_hobbies',
'Instruments de musique'=>'instruments_de_musique',
'Collection'=>'collection',
'Jeux & Jouets'=>'jeux_jouets',
'Vins & Gastronomie'=>'vins_gastronomie'
),
'MATÉRIEL PROFESSIONNEL'=>array(
'Tous'=>'_materiel_professionnel_',
'Matériel Agricole'=>'mateiel_agricole',
'Transport - Manutention'=>'transport_manutention',
'BTP - Chantier - Gros-œuvre'=>'btp_chantier_gros_oeuvre',
'Outillage - Matériaux 2nd-œuvre'=>'outillage_materiaux_2nd_oeuvre',
'Équipements Industriels'=>'equipement_industriels',
'Restauration - Hôtellerie'=>'restauration_hotellerie',
'Fournitures de Bureau'=>'fournitures_de_bureau',
'Commerces & Marchés'=>'commerces_marches',
'Matériel médical'=>'materiel_medical'
),
'SERVICES'=>array(
'Tous'=>'_services_',
'Prestations de services'=>'prestations_de_services',
'Billetterie'=>'billetterie',
'Évènements'=>'evenements',
'Cours particuliers'=>'cours_particuliers',
'Covoiturage'=>'covoiturage'
),
'MAISON'=>array(
'Tous'=>'_maison_',
'Ameublement'=>'ameublement',
'Électroménager'=>'electromenager',
'Arts de la table'=>'arts_de_la_table',
'Décoration'=>'decoration',
'Linge de maison'=>'linge_de_maison',
'Bricolage'=>'bricolage',
'Jardinage'=>'jardinage',
'Vêtements'=>'vetements',
'Chaussures'=>'chaussures',
'Accessoires & Bagagerie'=>'accessoires_bagagerie',
'Montres & Bijoux'=>'montres_bijoux',
'Équipement bébé'=>'equipement_bebe',
'Vêtements bébé'=>'vetements_bebe'
),
'AUTRES'=>'autres'
)
)
)
);
public function collectData(){
$category=$this->getInput('c');
if (empty($category)){
$category='annonces';
}
$html = getSimpleHTMLDOM(
self::URI.$category.'/offres/' . $this->getInput('r') . '/?'
.'f=a&th=1&'
.'q=' . urlencode($this->getInput('k'))
) or returnServerError('Could not request LeBonCoin.');
$list = $html->find('.tabsContent', 0);
if($list === NULL) {
return;
}
$tags = $list->find('li');
foreach($tags as $element) {
$element = $element->find('a', 0);
$item = array();
$item['uri'] = $element->href;
$title = html_entity_decode($element->getAttribute('title'));
$content_image = $element->find('div.item_image', 0)->find('.lazyload', 0);
if($content_image !== NULL) {
$content = '<img src="' . $content_image->getAttribute('data-imgsrc') . '" alt="thumbnail">';
} else {
$content = "";
}
$date = $element->find('aside.item_absolute', 0)->find('p.item_sup', 0);
$detailsList = $element->find('section.item_infos', 0);
for($i = 0; $i <= 1; $i++) $content .= $detailsList->find('p.item_supp', $i)->plaintext;
$price = $detailsList->find('h3.item_price', 0);
$content .= $price === NULL ? '' : $price->plaintext;
$item['title'] = $title;
$item['content'] = $content . $date;
$this->items[] = $item;
}
}
}

View File

@@ -0,0 +1,42 @@
<?php
class LeMondeInformatiqueBridge extends FeedExpander {
const MAINTAINER = "ORelio";
const NAME = "Le Monde Informatique";
const URI = "http://www.lemondeinformatique.fr/";
const CACHE_TIMEOUT = 1800; // 30min
const DESCRIPTION = "Returns the newest articles.";
public function collectData(){
$this->collectExpandableDatas(self::URI . 'rss/rss.xml', 10);
}
protected function parseItem($newsItem){
$item = parent::parseItem($newsItem);
$article_html = getSimpleHTMLDOMCached($item['uri'])
or returnServerError('Could not request LeMondeInformatique: ' . $item['uri']);
$item['content'] = $this->CleanArticle($article_html->find('div#article', 0)->innertext);
$item['title'] = $article_html->find('h1.cleanprint-title', 0)->plaintext;
return $item;
}
function StripCDATA($string) {
$string = str_replace('<![CDATA[', '', $string);
$string = str_replace(']]>', '', $string);
return $string;
}
function StripWithDelimiters($string, $start, $end) {
while (strpos($string, $start) !== false) {
$section_to_remove = substr($string, strpos($string, $start));
$section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end));
$string = str_replace($section_to_remove, '', $string);
} return $string;
}
function CleanArticle($article_html) {
$article_html = $this->StripWithDelimiters($article_html, '<script', '</script>');
$article_html = $this->StripWithDelimiters($article_html, '<h1 class="cleanprint-title"', '</h1>');
return $article_html;
}
}

View File

@@ -0,0 +1,70 @@
<?php
class LegifranceJOBridge extends BridgeAbstract{
const MAINTAINER = 'Pierre Mazière';
const NAME = 'Journal Officiel de la République Française';
const URI = 'https://www.legifrance.gouv.fr/affichJO.do';
const DESCRIPTION = 'Returns the laws and decrees officially registered daily in France';
const PARAMETERS=array();
private $author;
private $timestamp;
private $uri;
private function extractItem($section,$subsection=null,$origin=null){
$item=array();
$item['author']=$this->author;
$item['timestamp']=$this->timestamp;
$item['uri']=$this->uri.'#'.count($this->items);
$item['title']=$section->plaintext;
if(!is_null($origin)){
$item['title']='[ '.$item['title'].' / '.$subsection->plaintext.' ] '.$origin->plaintext;
$data=$origin;
}elseif(!is_null($subsection)){
$item['title']='[ '.$item['title'].' ] '.$subsection->plaintext;
$data=$subsection;
}else{
$data=$section;
}
$item['content']='';
foreach($data->nextSibling()->find('a') as $content){
$text=$content->plaintext;
$href=$content->nextSibling()->getAttribute('resource');
$item['content'].='<p><a href="'.$href.'">'.$text.'</a></p>';
}
return $item;
}
public function collectData(){
$html=getSimpleHTMLDOM(self::URI)
or $this->returnServer('Unable to download '.self::URI);
$this->author=trim($html->find('h2.title',0)->plaintext);
$uri=$html->find('h2.titleELI',0)->plaintext;
$this->uri=trim(substr($uri,strpos($uri,'https')));
$this->timestamp=strtotime(substr($this->uri,strpos($this->uri,'eli/jo/')+strlen('eli/jo/')));
foreach($html->find('h3') as $section){
$subsections=$section->nextSibling()->find('h4');
foreach($subsections as $subsection){
$origins=$subsection->nextSibling()->find('h5');
foreach($origins as $origin){
$this->items[]=$this->extractItem($section,$subsection,$origin);
}
if(!empty($origins)){
continue;
}
$this->items[]=$this->extractItem($section,$subsection);
}
if(!empty($subsections)){
continue;
}
$this->items[]=$this->extractItem($section);
}
}
}

View File

@@ -0,0 +1,47 @@
<?php
class LesJoiesDuCodeBridge extends BridgeAbstract{
const MAINTAINER = "superbaillot.net";
const NAME = "Les Joies Du Code";
const URI = "http://lesjoiesducode.fr/";
const CACHE_TIMEOUT = 7200; // 2h
const DESCRIPTION = "LesJoiesDuCode";
public function collectData(){
$html = getSimpleHTMLDOM(self::URI)
or returnServerError('Could not request LesJoiesDuCode.');
foreach($html->find('div.blog-post') as $element) {
$item = array();
$temp = $element->find('h1 a', 0);
$titre = html_entity_decode($temp->innertext);
$url = $temp->href;
$temp = $element->find('div.blog-post-content', 0);
// retrieve .gif instead of static .jpg
$images = $temp->find('p img');
foreach($images as $image){
$img_src = str_replace(".jpg",".gif",$image->src);
$image->src = $img_src;
}
$content = $temp->innertext;
$auteur = $temp->find('i', 0);
$pos = strpos($auteur->innertext, "by");
if($pos > 0)
{
$auteur = trim(str_replace("*/", "", substr($auteur->innertext, ($pos + 2))));
$item['author'] = $auteur;
}
$item['content'] .= trim($content);
$item['uri'] = $url;
$item['title'] = trim($titre);
$this->items[] = $item;
}
}
}

31
bridges/LichessBridge.php Normal file
View File

@@ -0,0 +1,31 @@
<?php
class LichessBridge extends FeedExpander {
const MAINTAINER = 'AmauryCarrade';
const NAME = 'Lichess Blog';
const URI = 'http://fr.lichess.org/blog';
const DESCRIPTION = 'Returns the 5 newest posts from the Lichess blog (full text)';
public function collectData(){
$this->collectExpandableDatas(self::URI . '.atom', 5);
}
protected function parseItem($newsItem){
$item = parent::parseItem($newsItem);
$item['content'] = $this->retrieve_lichess_post($item['uri']);
return $item;
}
private function retrieve_lichess_post($blog_post_uri){
$blog_post_html = getSimpleHTMLDOMCached($blog_post_uri);
$blog_post_div = $blog_post_html->find('#lichess_blog', 0);
$post_chapo = $blog_post_div->find('.shortlede', 0)->innertext;
$post_content = $blog_post_div->find('.body', 0)->innertext;
$content = '<p><em>' . $post_chapo . '</em></p>';
$content .= '<div>' . $post_content . '</div>';
return $content;
}
}

View File

@@ -0,0 +1,36 @@
<?php
class LinkedInCompanyBridge extends BridgeAbstract{
const MAINTAINER = "regisenguehard";
const NAME = "LinkedIn Company";
const URI = "https://www.linkedin.com/";
const CACHE_TIMEOUT = 21600; //6
const DESCRIPTION = "Returns most recent actus from Company on LinkedIn. (https://www.linkedin.com/company/<strong style=\"font-weight:bold;\">apple</strong>)";
const PARAMETERS = array( array(
'c'=>array(
'name'=>'Company name',
'required'=>true
)
));
public function collectData(){
$html = '';
$link = self::URI.'company/'.$this->getInput('c');
$html = getSimpleHTMLDOM($link)
or returnServerError('Could not request LinkedIn.');
foreach($html->find('//*[@id="my-feed-post"]/li') as $element) {
$title = $element->find('span.share-body', 0)->innertext;
if ($title) {
$item = array();
$item['uri'] = $link;
$item['title'] = mb_substr(strip_tags($element->find('span.share-body', 0)->innertext), 0 ,100);
$item['content'] = strip_tags($element->find('span.share-body', 0)->innertext);
$this->items[] = $item;
$i++;
}
}
}
}

View File

@@ -0,0 +1,11 @@
<?php
require_once('MoebooruBridge.php');
class LolibooruBridge extends MoebooruBridge{
const MAINTAINER = "mitsukarenai";
const NAME = "Lolibooru";
const URI = "https://lolibooru.moe/";
const DESCRIPTION = "Returns images from given page and tags";
}

View File

@@ -0,0 +1,251 @@
<?php
class MangareaderBridge extends BridgeAbstract {
const MAINTAINER = "logmanoriginal";
const NAME = "Mangareader Bridge";
const URI = "http://www.mangareader.net/";
const CACHE_TIMEOUT = 10800; // 3h
const DESCRIPTION = "Returns the latest updates, popular mangas or manga updates (new chapters)";
const PARAMETERS = array(
'Get latest updates' => array(),
'Get popular mangas' => array(
'category' => array(
'name' => 'Category',
'type' => 'list',
'required' => true,
'values' => array(
'All' => 'all',
'Action' => 'action',
'Adventure' => 'adventure',
'Comedy' => 'comedy',
'Demons' => 'demons',
'Drama' => 'drama',
'Ecchi' => 'ecchi',
'Fantasy' => 'fantasy',
'Gender Bender' => 'gender-bender',
'Harem' => 'harem',
'Historical' => 'historical',
'Horror' => 'horror',
'Josei' => 'josei',
'Magic' => 'magic',
'Martial Arts' => 'martial-arts',
'Mature' => 'mature',
'Mecha' => 'mecha',
'Military' => 'military',
'Mystery' => 'mystery',
'One Shot' => 'one-shot',
'Psychological' => 'psychological',
'Romance' => 'romance',
'School Life' => 'school-life',
'Sci-Fi' => 'sci-fi',
'Seinen' => 'seinen',
'Shoujo' => 'shoujo',
'Shoujoai' => 'shoujoai',
'Shounen' => 'shounen',
'Shounenai' => 'shounenai',
'Slice of Life' => 'slice-of-life',
'Smut' => 'smut',
'Sports' => 'sports',
'Super Power' => 'super-power',
'Supernatural' => 'supernatural',
'Tragedy' => 'tragedy',
'Vampire' => 'vampire',
'Yaoi' => 'yaoi',
'Yuri' => 'yuri'
),
'exampleValue' => 'All',
'title' => 'Select your category'
)
),
'Get manga updates' => array(
'path' => array(
'name' => 'Path',
'required' => true,
'pattern' => '[a-zA-Z0-9-_]*',
'exampleValue' => 'bleach, umi-no-kishidan',
'title' => 'URL part of desired manga'
),
'limit' => array(
'name' => 'Limit',
'type' => 'number',
'defaultValue' => 10,
'title' => 'Number of items to return [-1 returns all]'
)
)
);
private $request = '';
public function collectData(){
// We'll use the DOM parser for this as it makes navigation easier
$html = getContents($this->getURI());
if(!$html){
returnClientError('Could not receive data for ' . $path . '!');
}
libxml_use_internal_errors(true);
$doc = new DomDocument;
@$doc->loadHTML($html);
libxml_clear_errors();
// Navigate via XPath
$xpath = new DomXPath($doc);
$this->request = '';
switch($this->queriedContext){
case 'Get latest updates':
$this->request = 'Latest updates';
$this->get_latest_updates($xpath);
break;
case 'Get popular mangas':
// Find manga name within "Popular mangas for ..."
$pagetitle = $xpath->query(".//*[@id='bodyalt']/h1")->item(0)->nodeValue;
$this->request = substr($pagetitle, 0, strrpos($pagetitle, " -"));
$this->get_popular_mangas($xpath);
break;
case 'Get manga updates':
$limit = $this->getInput('limit');
if(empty($limit)){
$limit = self::PARAMETERS[$this->queriedContext]['limit']['defaultValue'];
}
$this->request = $xpath->query(".//*[@id='mangaproperties']//*[@class='aname']")
->item(0)
->nodeValue;
$this->get_manga_updates($xpath, $limit);
break;
}
// Return some dummy-data if no content available
if(empty($this->items)){
$item = array();
$item['content'] = "<p>No updates available</p>";
$this->items[] = $item;
}
}
private function get_latest_updates($xpath){
// Query each item (consists of Manga + chapters)
$nodes = $xpath->query("//*[@id='latestchapters']/table//td");
foreach ($nodes as $node){
// Query the manga
$manga = $xpath->query("a[@class='chapter']", $node)->item(0);
// Collect the chapters for each Manga
$chapters = $xpath->query("a[@class='chaptersrec']", $node);
if (isset($manga) && $chapters->length >= 1){
$item = array();
$item['uri'] = self::URI . htmlspecialchars($manga->getAttribute('href'));
$item['title'] = htmlspecialchars($manga->nodeValue);
// Add each chapter to the feed
$item['content'] = "";
foreach ($chapters as $chapter){
if($item['content'] <> ""){
$item['content'] .= "<br>";
}
$item['content'] .=
"<a href='"
. self::URI
. htmlspecialchars($chapter->getAttribute('href'))
. "'>"
. htmlspecialchars($chapter->nodeValue)
. "</a>";
}
$this->items[] = $item;
}
}
}
private function get_popular_mangas($xpath){
// Query all mangas
$mangas = $xpath->query("//*[@id='mangaresults']/*[@class='mangaresultitem']");
foreach ($mangas as $manga){
// The thumbnail is encrypted in a css-style...
// format: "background-image:url('<the part which is actually interesting>')"
$mangaimgelement = $xpath->query(".//*[@class='imgsearchresults']", $manga)
->item(0)
->getAttribute('style');
$thumbnail = substr($mangaimgelement, 22, strlen($mangaimgelement) - 24);
$item = array();
$item['title'] = htmlspecialchars($xpath->query(".//*[@class='manga_name']//a", $manga)
->item(0)
->nodeValue);
$item['uri'] = self::URI . $xpath->query(".//*[@class='manga_name']//a", $manga)
->item(0)
->getAttribute('href');
$item['author'] = htmlspecialchars($xpath->query("//*[@class='author_name']", $manga)
->item(0)
->nodeValue);
$item['chaptercount'] = $xpath->query(".//*[@class='chapter_count']", $manga)
->item(0)
->nodeValue;
$item['genre'] = htmlspecialchars($xpath->query(".//*[@class='manga_genre']", $manga)
->item(0)
->nodeValue);
$item['content'] = <<<EOD
<a href="{$item['uri']}"><img src="{$thumbnail}" alt="{$item['title']}" /></a>
<p>{$item['genre']}</p>
<p>{$item['chaptercount']}</p>
EOD;
$this->items[] = $item;
}
}
private function get_manga_updates($xpath, $limit){
$query = "(.//*[@id='listing']//tr)[position() > 1]";
if($limit !== -1){
$query = "(.//*[@id='listing']//tr)[position() > 1][position() > last() - {$limit}]";
}
$chapters = $xpath->query($query);
foreach ($chapters as $chapter){
$item = array();
$item['title'] = htmlspecialchars($xpath->query("td[1]", $chapter)
->item(0)
->nodeValue);
$item['uri'] = self::URI . $xpath->query("td[1]/a", $chapter)
->item(0)
->getAttribute('href');
$item['timestamp'] = strtotime($xpath->query("td[2]", $chapter)
->item(0)
->nodeValue);
array_unshift($this->items, $item);
}
}
public function getURI(){
switch($this->queriedContext){
case 'Get latest updates':
$path = "latest";
break;
case 'Get popular mangas':
$path = "popular";
if($this->getInput('category') !== "all"){
$path .= "/" . $this->getInput('category');
}
break;
case 'Get manga updates':
$path = $this->getInput('path');
break;
}
return self::URI . $path;
}
public function getName(){
return (!empty($this->request) ? $this->request . ' - ' : '') . 'Mangareader Bridge';
}
}
?>

View File

@@ -0,0 +1,11 @@
<?php
require_once('Shimmie2Bridge.php');
class MilbooruBridge extends Shimmie2Bridge{
const MAINTAINER = "mitsukarenai";
const NAME = "Milbooru";
const URI = "http://sheslostcontrol.net/moe/shimmie/";
const DESCRIPTION = "Returns images from given page";
}

View File

@@ -0,0 +1,46 @@
<?php
class MoebooruBridge extends BridgeAbstract{
const NAME = "Moebooru";
const URI = "https://moe.dev.myconan.net/";
const CACHE_TIMEOUT = 1800; // 30min
const DESCRIPTION = "Returns images from given page";
const PARAMETERS = array( array(
'p'=>array(
'name'=>'page',
'defaultValue'=>1,
'type'=>'number'
),
't'=>array('name'=>'tags')
));
protected function getFullURI(){
return $this->getURI().'post?'
.'page='.$this->getInput('p')
.'&tags='.urlencode($this->getInput('t'));
}
public function collectData(){
$html = getSimpleHTMLDOM($this->getFullURI())
or returnServerError('Could not request '.$this->getName());
$input_json = explode('Post.register(', $html);
foreach($input_json as $element)
$data[] = preg_replace('/}\)(.*)/', '}', $element);
unset($data[0]);
foreach($data as $datai) {
$json = json_decode($datai, TRUE);
$item = array();
$item['uri'] = $this->getURI().'/post/show/'.$json['id'];
$item['postid'] = $json['id'];
$item['timestamp'] = $json['created_at'];
$item['imageUri'] = $json['file_url'];
$item['title'] = $this->getName().' | '.$json['id'];
$item['content'] = '<a href="' . $item['imageUri'] . '"><img src="' . $json['preview_url'] . '" /></a><br>Tags: '.$json['tags'];
$this->items[] = $item;
}
}
}

View File

@@ -0,0 +1,23 @@
<?php
class MondeDiploBridge extends BridgeAbstract{
const MAINTAINER = "Pitchoule";
const NAME = 'Monde Diplomatique';
const URI = 'http://www.monde-diplomatique.fr/';
const CACHE_TIMEOUT = 21600; //6h
const DESCRIPTION = "Returns most recent results from MondeDiplo.";
public function collectData(){
$html = getSimpleHTMLDOM(self::URI)
or returnServerError('Could not request MondeDiplo. for : ' . self::URI);
foreach($html->find('div.unarticle') as $article) {
$element = $article->parent();
$item = array();
$item['uri'] = self::URI . $element->href;
$item['title'] = $element->find('h3', 0)->plaintext;
$item['content'] = $element->find('div.dates_auteurs', 0)->plaintext . '<br>' . strstr($element->find('div', 0)->plaintext, $element->find('div.dates_auteurs', 0)->plaintext, true);
$this->items[] = $item;
}
}
}

View File

@@ -0,0 +1,33 @@
<?php
class MsnMondeBridge extends BridgeAbstract{
const MAINTAINER = "kranack";
const NAME = 'MSN Actu Monde';
const URI = 'http://www.msn.com/';
const DESCRIPTION = "Returns the 10 newest posts from MSN Actualités (full text)";
public function getURI(){
return self::URI.'fr-fr/actualite/monde';
}
private function MsnMondeExtractContent($url, &$item) {
$html2 = getSimpleHTMLDOM($url);
$item['content'] = $html2->find('#content', 0)->find('article', 0)->find('section', 0)->plaintext;
$item['timestamp'] = strtotime($html2->find('.authorinfo-txt', 0)->find('time', 0)->datetime);
}
public function collectData(){
$html = getSimpleHTMLDOM($this->getURI()) or returnServerError('Could not request MsnMonde.');
$limit = 0;
foreach($html->find('.smalla') as $article) {
if($limit < 10) {
$item = array();
$item['title'] = utf8_decode($article->find('h4', 0)->innertext);
$item['uri'] = self::URI . utf8_decode($article->find('a', 0)->href);
$this->MsnMondeExtractContent($item['uri'], $item);
$this->items[] = $item;
$limit++;
}
}
}
}

View File

@@ -0,0 +1,12 @@
<?php
require_once('GelbooruBridge.php');
class MspabooruBridge extends GelbooruBridge{
const MAINTAINER = "mitsukarenai";
const NAME = "Mspabooru";
const URI = "http://mspabooru.com/";
const DESCRIPTION = "Returns images from given page";
const PIDBYPAGE=50;
}

View File

@@ -0,0 +1,43 @@
<?php
class NasaApodBridge extends BridgeAbstract{
const MAINTAINER = "corenting";
const NAME = "NASA APOD Bridge";
const URI = "http://apod.nasa.gov/apod/";
const CACHE_TIMEOUT = 43200; // 12h
const DESCRIPTION = "Returns the 3 latest NASA APOD pictures and explanations";
public function collectData(){
$html = getSimpleHTMLDOM(self::URI.'archivepix.html') or returnServerError('Error while downloading the website content');
$list = explode("<br>", $html->find('b', 0)->innertext);
for($i = 0; $i < 3;$i++)
{
$line = $list[$i];
$item = array();
$uri_page = $html->find('a',$i + 3)->href;
$uri = self::URI.$uri_page;
$item['uri'] = $uri;
$picture_html = getSimpleHTMLDOM($uri);
$picture_html_string = $picture_html->innertext;
//Extract image and explanation
$media = $picture_html->find('p',1)->innertext;
$media = strstr($media, '<br>');
$media = preg_replace('/<br>/', '', $media, 1);
$explanation = $picture_html->find('p',2)->innertext;
//Extract date from the picture page
$date = explode(" ", $picture_html->find('p',1)->innertext);
$item['timestamp'] = strtotime($date[4].$date[3].$date[2]);
//Other informations
$item['content'] = $media.'<br />'.$explanation;
$item['title'] = $picture_html->find('b',0)->innertext;
$this->items[] = $item;
}
}
}

View File

@@ -0,0 +1,55 @@
<?php
class NeuviemeArtBridge extends FeedExpander {
const MAINTAINER = "ORelio";
const NAME = '9ème Art Bridge';
const URI = "http://www.9emeart.fr/";
const DESCRIPTION = "Returns the newest articles.";
private function StripWithDelimiters($string, $start, $end) {
while (strpos($string, $start) !== false) {
$section_to_remove = substr($string, strpos($string, $start));
$section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end));
$string = str_replace($section_to_remove, '', $string);
} return $string;
}
protected function parseItem($item){
$item = parent::parseItem($item);
$article_html = getSimpleHTMLDOMCached($item['uri']);
if(!$article_html){
$item['content'] = 'Could not request 9eme Art: '.$item['uri'];
return $item;
}
$article_image = '';
foreach ($article_html->find('img.img_full') as $img){
if ($img->alt == $item['title']){
$article_image = self::URI.$img->src;
break;
}
}
$article_content='';
if($article_image){
$article_content = '<p><img src="'.$article_image.'" /></p>';
}
$article_content .= str_replace(
'src="/', 'src="'.self::URI,
$article_html->find('div.newsGenerique_con', 0)->innertext
);
$article_content = $this->StripWithDelimiters($article_content, '<script', '</script>');
$article_content = $this->StripWithDelimiters($article_content, '<style', '</style>');
$article_content = $this->StripWithDelimiters($article_content, '<link', '>');
$item['content'] = $article_content;
return $item;
}
public function collectData(){
$feedUrl = self::URI.'9emeart.rss';
$this->collectExpandableDatas($feedUrl);
}
}

View File

@@ -0,0 +1,29 @@
<?php
class NextInpactBridge extends FeedExpander {
const MAINTAINER = "qwertygc";
const NAME = "NextInpact Bridge";
const URI = "http://www.nextinpact.com/";
const DESCRIPTION = "Returns the newest articles.";
public function collectData(){
$this->collectExpandableDatas(self::URI . 'rss/news.xml', 10);
}
protected function parseItem($newsItem){
$item = parent::parseItem($newsItem);
$item['content'] = $this->ExtractContent($item['uri']);
return $item;
}
private function ExtractContent($url) {
$html2 = getSimpleHTMLDOMCached($url);
$text = '<p><em>'.$html2->find('span.sub_title', 0)->innertext.'</em></p>'
.'<p><img src="'.$html2->find('div.container_main_image_article', 0)->find('img.dedicated',0)->src.'" alt="-" /></p>'
.'<div>'.$html2->find('div[itemprop=articleBody]', 0)->innertext.'</div>';
$premium_article = $html2->find('h2.title_reserve_article', 0);
if (is_object($premium_article))
$text = $text.'<p><em>'.$premium_article->innertext.'</em></p>';
return $text;
}
}

70
bridges/NextgovBridge.php Normal file
View File

@@ -0,0 +1,70 @@
<?php
class NextgovBridge extends FeedExpander {
const MAINTAINER = 'ORelio';
const NAME = 'Nextgov Bridge';
const URI = 'https://www.nextgov.com/';
const DESCRIPTION = 'USA Federal technology news, best practices, and web 2.0 tools.';
const PARAMETERS = array( array(
'category'=>array(
'name'=>'Category',
'type'=>'list',
'values'=>array(
'All'=>'all',
'Technology News'=>'technology-news',
'CIO Briefing'=>'cio-briefing',
'Emerging Tech'=>'emerging-tech',
'Cloud'=>'cloud-computing',
'Cybersecurity'=>'cybersecurity',
'Mobile'=>'mobile',
'Health'=>'health',
'Defense'=>'defense',
'Big Data'=>'big-data'
)
)
));
public function collectData(){
$this->collectExpandableDatas(self::URI . 'rss/' . $this->getInput('category') . '/', 10);
}
protected function parseItem($newsItem){
$item = parent::parseItem($newsItem);
$item['content'] = '';
$namespaces = $newsItem->getNamespaces(true);
if(isset($namespaces['media'])){
$media = $newsItem->children($namespaces['media']);
if(isset($media->content)){
$attributes = $media->content->attributes();
$item['content'] = '<img src="' . $attributes['url'] . '">';
}
}
$item['content'] .= $this->ExtractContent($item['uri']);
return $item;
}
private function StripWithDelimiters($string, $start, $end) {
while (strpos($string, $start) !== false) {
$section_to_remove = substr($string, strpos($string, $start));
$section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end));
$string = str_replace($section_to_remove, '', $string);
} return $string;
}
private function ExtractContent($url){
$article = getSimpleHTMLDOMCached($url)
or returnServerError('Could not request Nextgov: ' . $url);
$contents = $article->find('div.wysiwyg', 0)->innertext;
$contents = $this->StripWithDelimiters($contents, '<div class="ad-container">', '</div>');
$contents = $this->StripWithDelimiters($contents, '<div', '</div>'); //ad outer div
return $this->StripWithDelimiters($contents, '<script', '</script>');
$contents = ($article_thumbnail == '' ? '' : '<p><img src="'.$article_thumbnail.'" /></p>')
.'<p><b>'.$article_subtitle.'</b></p>'
.trim($contents);
}
}

View File

@@ -0,0 +1,32 @@
<?php
class NiceMatinBridge extends FeedExpander {
const MAINTAINER = "pit-fgfjiudghdf";
const NAME = "NiceMatin";
const URI = "http://www.nicematin.com/";
const DESCRIPTION = "Returns the 10 newest posts from NiceMatin (full text)";
public function collectData(){
$this->collectExpandableDatas(self::URI . 'derniere-minute/rss', 10);
}
protected function parseItem($newsItem){
$item = parent::parseItem($newsItem);
$item['content'] = $this->NiceMatinExtractContent($item['uri']);
return $item;
}
private function NiceMatinExtractContent($url) {
$html = getSimpleHTMLDOMCached($url);
if(!$html)
return 'Could not acquire content from url: ' . $url . '!';
$content = $html->find('article', 0);
if(!$content)
return 'Could not find \'section\'!';
$text = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $content->innertext);
$text = strip_tags($text, '<p><a><img>');
return $text;
}
}

View File

@@ -0,0 +1,52 @@
<?php
class NovelUpdatesBridge extends BridgeAbstract{
const MAINTAINER = "albirew";
const NAME = "Novel Updates";
const URI = "http://www.novelupdates.com/";
const CACHE_TIMEOUT = 21600; // 6h
const DESCRIPTION = "Returns releases from Novel Updates";
const PARAMETERS = array( array(
'n'=>array(
'name'=>'Novel name as found in the url',
'exampleValue'=>'spirit-realm',
'required'=>true
)
));
private $seriesTitle='';
public function getURI(){
return static::URI.'/series/'.$this->getInput('n').'/';
}
public function collectData(){
$fullhtml = getSimpleHTMLDOM($this->getURI())
or returnServerError('Could not request NovelUpdates, novel "'.$this->getInput('n').'" not found');
$this->seriesTitle = $fullhtml->find('h4.seriestitle', 0)->plaintext;
// dirty fix for nasty simpledom bug: https://github.com/sebsauvage/rss-bridge/issues/259
// forcefully removes tbody
$html = $fullhtml->find('table#myTable', 0)->innertext;
$html = stristr($html, '<tbody>'); //strip thead
$html = stristr($html, '<tr>'); //remove tbody
$html = str_get_html(stristr($html, '</tbody>', true)); //remove last tbody and get back as an array
foreach($html->find('tr') as $element){
$item = array();
$item['uri'] = $element->find('td', 2)->find('a', 0)->href;
$item['title'] = $element->find('td', 2)->find('a', 0)->plaintext;
$item['team'] = $element->find('td', 1)->innertext;
$item['timestamp'] = strtotime($element->find('td', 0)->plaintext);
$item['content'] =
'<a href="'.$item['uri'].'">'
.$this->seriesTitle.' - '.$item['title']
.'</a> by '.$item['team'].'<br>'
.'<a href="'.$item['uri'].'">'.$fullhtml->find('div.seriesimg', 0)->innertext.'</a>';
$this->items[] = $item;
}
}
public function getName(){
return $this->seriesTitle. ' - ' . static::NAME;
}
}

View File

@@ -0,0 +1,46 @@
<?php
class OpenClassroomsBridge extends BridgeAbstract{
const MAINTAINER = "sebsauvage";
const NAME = "OpenClassrooms Bridge";
const URI = "https://openclassrooms.com/";
const CACHE_TIMEOUT = 21600; // 6h
const DESCRIPTION = "Returns latest tutorials from OpenClassrooms.";
const PARAMETERS = array( array(
'u'=>array(
'name'=>'Catégorie',
'type'=>'list',
'required'=>true,
'values'=>array(
'Arts & Culture'=>'arts',
'Code'=>'code',
'Design'=>'design',
'Entreprise'=>'business',
'Numérique'=>'digital',
'Sciences'=>'sciences',
'Sciences Humaines'=>'humainities',
'Systèmes d\'information'=>'it',
'Autres'=>'others'
)
)
));
public function getURI(){
return self::URI.'/courses?categories='.$this->getInput('u').'&'
.'title=&sort=updatedAt+desc';
}
public function collectData(){
$html = getSimpleHTMLDOM($this->getURI())
or returnServerError('Could not request OpenClassrooms.');
foreach($html->find('.courseListItem') as $element) {
$item = array();
$item['uri'] = self::URI.$element->find('a', 0)->href;
$item['title'] = $element->find('h3', 0)->plaintext;
$item['content'] = $element->find('slidingItem__descriptionContent', 0)->plaintext;
$this->items[] = $item;
}
}
}

View File

@@ -0,0 +1,96 @@
<?php
class ParuVenduImmoBridge extends BridgeAbstract
{
const MAINTAINER = "polo2ro";
const NAME = "Paru Vendu Immobilier";
const URI = "http://www.paruvendu.fr";
const CACHE_TIMEOUT = 10800; // 3h
const DESCRIPTION = "Returns the ads from the first page of search result.";
const PARAMETERS = array( array(
'minarea'=>array(
'name'=>'Minimal surface m²',
'type'=>'number'
),
'maxprice'=>array(
'name'=>'Max price',
'type'=>'number'
),
'pa'=>array(
'name'=>'Country code',
'exampleValue'=>'FR'
),
'lo'=>array('name'=>'department numbers or postal codes, comma-separated')
));
public function collectData()
{
$html = getSimpleHTMLDOM($this->getURI())
or returnServerError('Could not request paruvendu.');
foreach($html->find('div.annonce a') as $element) {
if (!$element->title) {
continue;
}
$img ='';
foreach($element->find('span.img img') as $img) {
if ($img->original) {
$img = '<img src="'.$img->original.'" />';
}
}
$desc = $element->find('span.desc')[0]->innertext;
$desc = str_replace("voir l'annonce", '', $desc);
$price = $element->find('span.price')[0]->innertext;
list($href) = explode('#', $element->href);
$item = array();
$item['uri'] = self::URI.$href;
$item['title'] = $element->title;
$item['content'] = $img.$desc.$price;
$this->items[] = $item;
}
}
public function getURI(){
$appartment = '&tbApp=1&tbDup=1&tbChb=1&tbLof=1&tbAtl=1&tbPla=1';
$maison = '&tbMai=1&tbVil=1&tbCha=1&tbPro=1&tbHot=1&tbMou=1&tbFer=1';
$link = self::URI.'/immobilier/annonceimmofo/liste/listeAnnonces?tt=1'.$appartment.$maison;
if ($this->getInput('minarea')) {
$link .= '&sur0='.urlencode($this->getInput('minarea'));
}
if ($this->getInput('maxprice')) {
$link .= '&px1='.urlencode($this->getInput('maxprice'));
}
if ($this->getInput('pa')) {
$link .= '&pa='.urlencode($this->getInput('pa'));
}
if ($this->getInput('lo')) {
$link .= '&lo='.urlencode($this->getInput('lo'));
}
return $link;
}
public function getName(){
$request='';
$minarea=$this->getInput('minarea');
if(!empty($minarea)){
$request .= ' '.$minarea.' m2';
}
$location=$this->getInput('lo');
if(!empty($location)){
$request .= ' In: '.$location;
}
return 'Paru Vendu Immobilier'.$request;
}
}

View File

@@ -0,0 +1,73 @@
<?php
class PickyWallpapersBridge extends BridgeAbstract {
const MAINTAINER = "nel50n";
const NAME = "PickyWallpapers Bridge";
const URI = "http://www.pickywallpapers.com/";
const CACHE_TIMEOUT = 43200; // 12h
const DESCRIPTION = "Returns the latests wallpapers from PickyWallpapers";
const PARAMETERS = array( array(
'c'=>array(
'name'=>'category',
'required'=>true
),
's'=>array('name'=>'subcategory'),
'm'=>array(
'name'=>'Max number of wallpapers',
'defaultValue'=>12,
'type'=>'number'
),
'r'=>array(
'name'=>'resolution',
'exampleValue'=>'1920x1200, 1680x1050,…',
'defaultValue'=>'1920x1200',
'pattern'=>'[0-9]{3,4}x[0-9]{3,4}'
)
));
public function collectData(){
$lastpage = 1;
$num = 0;
$max = $this->getInput('m');
$resolution = $this->getInput('r'); // Wide wallpaper default
for ($page = 1; $page <= $lastpage; $page++) {
$html = getSimpleHTMLDOM($this->getURI().'/page-'.$page.'/')
or returnServerError('No results for this query.');
if ($page === 1) {
preg_match('/page-(\d+)\/$/', $html->find('.pages li a', -2)->href, $matches);
$lastpage = min($matches[1], ceil($max/12));
}
foreach($html->find('.items li img') as $element) {
$item = array();
$item['uri'] = str_replace('www', 'wallpaper', self::URI).'/'.$resolution.'/'.basename($element->src);
$item['timestamp'] = time();
$item['title'] = $element->alt;
$item['content'] = $item['title'].'<br><a href="'.$item['uri'].'">'.$element.'</a>';
$this->items[] = $item;
$num++;
if ($num >= $max)
break 2;
}
}
}
public function getURI(){
$subcategory = $this->getInput('s');
$link = self::URI.$this->getInput('r').'/'.$this->getInput('c').'/'.$subcategory;
return $link;
}
public function getName(){
$subcategory = $this->getInput('s');
return 'PickyWallpapers - '.$this->getInput('c')
.($subcategory? ' > '.$subcategory : '')
.' ['.$this->getInput('r').']';
}
}

121
bridges/PinterestBridge.php Normal file
View File

@@ -0,0 +1,121 @@
<?php
class PinterestBridge extends BridgeAbstract {
const MAINTAINER = "pauder";
const NAME = "Pinterest Bridge";
const URI = "http://www.pinterest.com/";
const DESCRIPTION = "Returns the newest images on a board";
const PARAMETERS = array(
'By username and board' => array(
'u' => array(
'name' => 'username',
'required' => true
),
'b' => array(
'name' => 'board',
'required' => true
)
),
'From search' => array(
'q' => array(
'name' => 'Keyword',
'required' => true
)
)
);
public function collectData(){
$html = getSimpleHTMLDOM($this->getURI());
if(!$html){
switch($this->queriedContext){
case 'By username and board':
returnServerError('Username and/or board not found');
case 'From search':
returnServerError('Could not request Pinterest.');
}
}
if($this->queriedContext === 'From search'){
foreach($html->find('div.pinWrapper') as $div){
$item = array();
$a = $div->find('a.pinImageWrapper', 0);
$img = $a->find('img', 0);
$item['uri'] = $this->getURI() . $a->getAttribute('href');
$item['content'] = '<img src="'
. htmlentities(str_replace('/236x/', '/736x/', $img->getAttribute('src')))
. '" alt="" />';
$avatar = $div->find('div.creditImg', 0)->find('img', 0);
$avatar = $avatar->getAttribute('data-src');
$avatar = str_replace("\\", "", $avatar);
$username = $div->find('div.creditName', 0);
$board = $div->find('div.creditTitle', 0);
$item['username'] = $username->innertext;
$item['fullname'] = $board->innertext;
$item['avatar'] = $avatar;
$item['content'] .= '<br /><img align="left" style="margin: 2px 4px;" src="'
. htmlentities($item['avatar'])
. '" /> <strong>'
. $item['username']
. '</strong>'
. '<br />'
. $item['fullname'];
$item['title'] = $img->getAttribute('alt');
$this->items[] = $item;
}
} elseif($this->queriedContext === 'By username and board'){
$container = $html->find('SCRIPT[type="application/ld+json"]', 0)
or returnServerError('Unable to find data container!');
$json = json_decode($container->innertext, true);
foreach($json['itemListElement'] as $element){
$item = array();
$item['uri'] = $element['item']['sharedContent']['author']['url'];
$item['title'] = $element['item']['name'];
$item['author'] = $element['item']['user']['name'];
$item['timestamp'] = strtotime($element['item']['datePublished']);
$item['content'] = <<<EOD
<a href="{$item['uri']}">
<img src="{$element['item']['image']}">
</a>
<p>{$element['item']['text']}</p>
EOD;
$this->items[] = $item;
}
}
}
public function getURI(){
switch($this->queriedContext){
case 'By username and board':
$uri = self::URI . urlencode($this->getInput('u')) . '/' . urlencode($this->getInput('b'));
break;
case 'From search':
$uri = self::URI . 'search/?q=' . urlencode($this->getInput('q'));
break;
}
return $uri;
}
public function getName(){
switch($this->queriedContext){
case 'By username and board':
$specific = $this->getInput('u') . '-' . $this->getInput('b');
break;
case 'From search':
$specific = $this->getInput('q');
break;
}
return $specific . ' - ' . self::NAME;
}
}

View File

@@ -0,0 +1,31 @@
<?php
class PlanetLibreBridge extends BridgeAbstract{
const MAINTAINER = "pit-fgfjiudghdf";
const NAME = "PlanetLibre";
const URI = "http://www.planet-libre.org";
const DESCRIPTION = "Returns the 5 newest posts from PlanetLibre (full text)";
private function PlanetLibreExtractContent($url){
$html2 = getSimpleHTMLDOM($url);
$text = $html2->find('div[class="post-text"]', 0)->innertext;
return $text;
}
public function collectData(){
$html = getSimpleHTMLDOM(self::URI)
or returnServerError('Could not request PlanetLibre.');
$limit = 0;
foreach($html->find('div.post') as $element) {
if($limit < 5) {
$item = array();
$item['title'] = $element->find('h1', 0)->plaintext;
$item['uri'] = $element->find('a', 0)->href;
$item['timestamp'] = strtotime(str_replace('/', '-', $element->find('div[class="post-date"]', 0)->plaintext));
$item['content'] = $this->PlanetLibreExtractContent($item['uri']);
$this->items[] = $item;
$limit++;
}
}
}
}

50
bridges/RTBFBridge.php Normal file
View File

@@ -0,0 +1,50 @@
<?php
class RTBFBridge extends BridgeAbstract {
const NAME = "RTBF Bridge";
const URI = "http://www.rtbf.be/auvio/emissions/";
const CACHE_TIMEOUT = 21600; //6h
const DESCRIPTION = "Returns the newest RTBF videos by series ID";
const MAINTAINER = "Frenzie";
const PARAMETERS = array( array(
'c'=>array(
'name'=>'series id',
'exampleValue'=>9500,
'required'=>true
)
));
public function collectData(){
$html = '';
$limit = 10;
$count = 0;
$html = getSimpleHTMLDOM($this->getURI())
or returnServerError('Could not request RTBF.');
foreach($html->find('section[id!=widget-ml-avoiraussi-] .rtbf-media-grid article') as $element) {
if($count >= $limit) {
break;
}
$item = array();
$item['id'] = $element->getAttribute('data-id');
$item['uri'] = self::URI.'detail?id='.$item['id'];
$thumbnailUriSrcSet = explode(',', $element->find('figure .www-img-16by9 img', 0)->getAttribute('data-srcset'));
$thumbnailUriLastSrc = end($thumbnailUriSrcSet);
$thumbnailUri = explode(' ', $thumbnailUriLastSrc)[0];
$item['title'] = trim($element->find('h3',0)->plaintext) . ' - ' . trim($element->find('h4',0)->plaintext);
$item['timestamp'] = strtotime($element->find('time', 0)->getAttribute('datetime'));
$item['content'] = '<a href="' . $item['uri'] . '"><img src="' . $thumbnailUri . '" /></a>';
$this->items[] = $item;
$count++;
}
}
public function getURI(){
return self::URI.'detail?id='.$this->getInput('c');
}
public function getName(){
return $this->getInput('c') .' - RTBF Bridge';
}
}

View File

@@ -0,0 +1,43 @@
<?php
class ReadComicsBridge extends BridgeAbstract{
const MAINTAINER = "niawag";
const NAME = "Read Comics";
const URI = "http://www.readcomics.tv/";
const DESCRIPTION = "Enter the comics as they appear in the website uri, separated by semicolons, ex: good-comic-1;good-comic-2; ...";
const PARAMETERS = array( array(
'q'=>array(
'name'=>'keywords, separated by semicolons',
'exampleValue'=>'first list;second list;...',
'required'=>true
),
));
public function collectData(){
function parseDateTimestamp($element){
$guessedDate = $element->find('span',0)->plaintext;
$guessedDate = strptime($guessedDate, '%m/%d/%Y');
$timestamp = mktime(0, 0, 0, $guessedDate['tm_mon'] + 1, $guessedDate['tm_mday'], date('Y'));
return $timestamp;
}
$keywordsList = explode(";",$this->getInput('q'));
foreach($keywordsList as $keywords){
$html = $this->getSimpleHTMLDOM(self::URI.'comic/'.rawurlencode($keywords))
or $this->returnServerError('Could not request readcomics.tv.');
foreach($html->find('li') as $element) {
$item = array();
$item['uri'] = $element->find('a.ch-name',0)->href;
$item['id'] = $item['uri'];
$item['timestamp'] = parseDateTimestamp($element);
$item['title'] = $element->find('a.ch-name',0)->plaintext;
if(isset($item['title']))
$this->items[] = $item;
}
}
}
}

View File

@@ -0,0 +1,120 @@
<?php
class Releases3DSBridge extends BridgeAbstract {
const MAINTAINER = "ORelio";
const NAME = "3DS Scene Releases";
const URI = "http://www.3dsdb.com/";
const CACHE_TIMEOUT = 10800; // 3h
const DESCRIPTION = "Returns the newest scene releases.";
public function collectData(){
function ExtractFromDelimiters($string, $start, $end) {
if (strpos($string, $start) !== false) {
$section_retrieved = substr($string, strpos($string, $start) + strlen($start));
$section_retrieved = substr($section_retrieved, 0, strpos($section_retrieved, $end));
return $section_retrieved;
} return false;
}
function TypeToString($type) {
switch ($type) {
case 1: return '3DS Game';
case 4: return 'eShop';
default: return '??? ('.$type.')';
}
}
function CardToString($card) {
switch ($card) {
case 1: return 'Regular (CARD1)';
case 2: return 'NAND (CARD2)';
default: return '??? ('.$card.')';
}
}
$dataUrl = self::URI.'xml.php';
$xml = getContents($dataUrl) or returnServerError('Could not request 3dsdb: '.$dataUrl);
$limit = 0;
foreach (array_reverse(explode('<release>', $xml)) as $element) {
if ($limit >= 5) {
break;
}
if (strpos($element, '</release>') === false) {
continue;
}
$releasename = ExtractFromDelimiters($element, '<releasename>', '</releasename>');
if (empty($releasename)) {
continue;
}
$id = ExtractFromDelimiters($element, '<id>', '</id>');
$name = ExtractFromDelimiters($element, '<name>', '</name>');
$publisher = ExtractFromDelimiters($element, '<publisher>', '</publisher>');
$region = ExtractFromDelimiters($element, '<region>', '</region>');
$group = ExtractFromDelimiters($element, '<group>', '</group>');
$imagesize = ExtractFromDelimiters($element, '<imagesize>', '</imagesize>');
$serial = ExtractFromDelimiters($element, '<serial>', '</serial>');
$titleid = ExtractFromDelimiters($element, '<titleid>', '</titleid>');
$imgcrc = ExtractFromDelimiters($element, '<imgcrc>', '</imgcrc>');
$filename = ExtractFromDelimiters($element, '<filename>', '</filename>');
$trimmedsize = ExtractFromDelimiters($element, '<trimmedsize>', '</trimmedsize>');
$firmware = ExtractFromDelimiters($element, '<firmware>', '</firmware>');
$type = ExtractFromDelimiters($element, '<type>', '</type>');
$card = ExtractFromDelimiters($element, '<card>', '</card>');
//Retrieve cover art and short desc from IGN?
$ignResult = false; $ignDescription = ''; $ignLink = ''; $ignDate = time(); $ignCoverArt = '';
$ignSearchUrl = 'http://www.ign.com/search?q='.urlencode($name);
if ($ignResult = getSimpleHTMLDOM($ignSearchUrl)) {
$ignCoverArt = $ignResult->find('div.search-item-media', 0)->find('img', 0)->src;
$ignDesc = $ignResult->find('div.search-item-description', 0)->plaintext;
$ignLink = $ignResult->find('div.search-item-sub-title', 0)->find('a', 1)->href;
$ignDate = strtotime(trim($ignResult->find('span.publish-date', 0)->plaintext));
$ignDescription = '<div><img src="'.$ignCoverArt.'" /></div><div>'.$ignDesc.' <a href="'.$ignLink.'">More at IGN</a></div>';
}
//Main section : Release description from 3DS database
$releaseDescription = '<h3>Release Details</h3>'
.'<b>Release ID: </b>'.$id.'<br />'
.'<b>Game Name: </b>'.$name.'<br />'
.'<b>Publisher: </b>'.$publisher.'<br />'
.'<b>Region: </b>'.$region.'<br />'
.'<b>Group: </b>'.$group.'<br />'
.'<b>Image size: </b>'.(intval($imagesize)/8).'MB<br />'
.'<b>Serial: </b>'.$serial.'<br />'
.'<b>Title ID: </b>'.$titleid.'<br />'
.'<b>Image CRC: </b>'.$imgcrc.'<br />'
.'<b>File Name: </b>'.$filename.'<br />'
.'<b>Release Name: </b>'.$releasename.'<br />'
.'<b>Trimmed size: </b>'.intval(intval($trimmedsize)/1048576).'MB<br />'
.'<b>Firmware: </b>'.$firmware.'<br />'
.'<b>Type: </b>'.TypeToString($type).'<br />'
.'<b>Card: </b>'.CardToString($card).'<br />';
//Build search links section to facilitate release search using search engines
$releaseNameEncoded = urlencode(str_replace(' ', '+', $releasename));
$searchLinkGoogle = 'https://google.com/?q='.$releaseNameEncoded;
$searchLinkDuckDuckGo = 'https://duckduckgo.com/?q='.$releaseNameEncoded;
$searchLinkQwant = 'https://lite.qwant.com/?q='.$releaseNameEncoded.'&t=web';
$releaseSearchLinks = '<h3>Search this release</h3><ul>'
.'<li><a href="'.$searchLinkGoogle.'">Search using Google</a></li>'
.'<li><a href="'.$searchLinkDuckDuckGo.'">Search using DuckDuckGo</a></li>'
.'<li><a href="'.$searchLinkQwant.'">Search using Qwant</a></li>'
.'</ul>';
//Build and add final item with the above three sections
$item = array();
$item['title'] = $name;
$item['author'] = $publisher;
$item['timestamp'] = $ignDate;
$item['uri'] = empty($ignLink) ? $searchLinkDuckDuckGo : $ignLink;
$item['content'] = $ignDescription.$releaseDescription.$releaseSearchLinks;
$this->items[] = $item;
$limit++;
}
}
}

View File

@@ -0,0 +1,42 @@
<?php
class ReporterreBridge extends BridgeAbstract{
const MAINTAINER = "nyutag";
const NAME = "Reporterre Bridge";
const URI = "http://www.reporterre.net/";
const DESCRIPTION = "Returns the newest articles.";
private function ExtractContentReporterre($url) {
$html2 = getSimpleHTMLDOM($url);
foreach($html2->find('div[style=text-align:justify]') as $e) {
$text = $e->outertext;
}
$html2->clear();
unset ($html2);
// Replace all relative urls with absolute ones
$text = preg_replace('/(href|src)(\=[\"\'])(?!http)([^"\']+)/ims', "$1$2" . self::URI . "$3", $text);
$text = strip_tags($text, '<p><br><a><img>');
return $text;
}
public function collectData(){
$html = getSimpleHTMLDOM(self::URI.'spip.php?page=backend') or returnServerError('Could not request Reporterre.');
$limit = 0;
foreach($html->find('item') as $element) {
if($limit < 5) {
$item = array();
$item['title'] = html_entity_decode($element->find('title', 0)->plaintext);
$item['timestamp'] = strtotime($element->find('dc:date', 0)->plaintext);
$item['uri'] = $element->find('guid', 0)->innertext;
$item['content'] = html_entity_decode($this->ExtractContentReporterre($item['uri']));
$this->items[] = $item;
$limit++;
}
}
}
}

22
bridges/Rue89Bridge.php Normal file
View File

@@ -0,0 +1,22 @@
<?php
class Rue89Bridge extends FeedExpander {
const MAINTAINER = "pit-fgfjiudghdf";
const NAME = "Rue89";
const URI = "http://rue89.nouvelobs.com/";
const DESCRIPTION = "Returns the 5 newest posts from Rue89 (full text)";
protected function parseItem($item){
$item = parent::parseItem($item);
$url = "http://api.rue89.nouvelobs.com/export/mobile2/node/" . str_replace(" ", "", substr($item['uri'], -8)) . "/full";
$datas = json_decode(getContents($url), true);
$item['content'] = $datas['node']['body'];
return $item;
}
public function collectData(){
$this->collectExpandableDatas('http://api.rue89.nouvelobs.com/feed');
}
}

12
bridges/Rule34Bridge.php Normal file
View File

@@ -0,0 +1,12 @@
<?php
require_once('GelbooruBridge.php');
class Rule34Bridge extends GelbooruBridge{
const MAINTAINER = "mitsukarenai";
const NAME = "Rule34";
const URI = "http://rule34.xxx/";
const DESCRIPTION = "Returns images from given page";
const PIDBYPAGE=50;
}

View File

@@ -0,0 +1,10 @@
<?php
require_once('Shimmie2Bridge.php');
class Rule34pahealBridge extends Shimmie2Bridge{
const MAINTAINER = "mitsukarenai";
const NAME = "Rule34paheal";
const URI = "http://rule34.paheal.net/";
const DESCRIPTION = "Returns images from given page";
}

View File

@@ -0,0 +1,12 @@
<?php
require_once('GelbooruBridge.php');
class SafebooruBridge extends GelbooruBridge{
const MAINTAINER = "mitsukarenai";
const NAME = "Safebooru";
const URI = "http://safebooru.org/";
const DESCRIPTION = "Returns images from given page";
const PIDBYPAGE=40;
}

View File

@@ -0,0 +1,11 @@
<?php
require_once('MoebooruBridge.php');
class SakugabooruBridge extends MoebooruBridge{
const MAINTAINER = "mitsukarenai";
const NAME = "Sakugabooru";
const URI = "http://sakuga.yshi.org/";
const DESCRIPTION = "Returns images from given page";
}

37
bridges/ScmbBridge.php Normal file
View File

@@ -0,0 +1,37 @@
<?php
class ScmbBridge extends BridgeAbstract{
const MAINTAINER = "Astalaseven";
const NAME = "Se Coucher Moins Bête Bridge";
const URI = "http://secouchermoinsbete.fr/";
const CACHE_TIMEOUT = 21600; // 6h
const DESCRIPTION = "Returns the newest anecdotes.";
public function collectData(){
$html = '';
$html = getSimpleHTMLDOM(self::URI)
or returnServerError('Could not request Se Coucher Moins Bete.');
foreach($html->find('article') as $article) {
$item = array();
$item['uri'] = self::URI.$article->find('p.summary a',0)->href;
$item['title'] = $article->find('header h1 a',0)->innertext;
$article->find('span.read-more',0)->outertext=''; // remove text "En savoir plus" from anecdote content
$content = $article->find('p.summary a',0)->innertext;
$content =substr($content,0,strlen($content)-17); // remove superfluous spaces at the end
// get publication date
$str_date = $article->find('time',0)->datetime;
list($date, $time) = explode(' ', $str_date);
list($y, $m, $d) = explode('-', $date);
list($h, $i) = explode(':', $time);
$timestamp = mktime($h,$i,0,$m,$d,$y);
$item['timestamp'] = $timestamp;
$item['content'] = $content;
$this->items[] = $item;
}
}
}

33
bridges/ScoopItBridge.php Normal file
View File

@@ -0,0 +1,33 @@
<?php
class ScoopItBridge extends BridgeAbstract{
const MAINTAINER = "Pitchoule";
const NAME = "ScoopIt";
const URI = "http://www.scoop.it/";
const CACHE_TIMEOUT = 21600; // 6h
const DESCRIPTION = "Returns most recent results from ScoopIt.";
const PARAMETERS = array( array(
'u'=>array(
'name'=>'keyword',
'required'=>true
)
));
public function collectData(){
$this->request = $this->getInput('u');
$link = self::URI.'search?q=' .urlencode($this->getInput('u'));
$html = getSimpleHTMLDOM($link)
or returnServerError('Could not request ScoopIt. for : ' . $link);
foreach($html->find('div.post-view') as $element) {
$item = array();
$item['uri'] = $element->find('a', 0)->href;
$item['title'] = preg_replace('~[[:cntrl:]]~', '', $element->find('div.tCustomization_post_title',0)->plaintext);
$item['content'] = preg_replace('~[[:cntrl:]]~', '', $element->find('div.tCustomization_post_description', 0)->plaintext);
$this->items[] = $item;
}
}
}

View File

@@ -0,0 +1,78 @@
<?php
class SensCritiqueBridge extends BridgeAbstract {
const MAINTAINER = "kranack";
const NAME = "Sens Critique";
const URI = "http://www.senscritique.com/";
const CACHE_TIMEOUT = 21600; // 6h
const DESCRIPTION = "Sens Critique news";
const PARAMETERS = array( array(
'm'=>array(
'name'=>'Movies',
'type'=>'checkbox'
),
's'=>array(
'name'=>'Series',
'type'=>'checkbox'
),
'g'=>array(
'name'=>'Video Games',
'type'=>'checkbox'
),
'b'=>array(
'name'=>'Books',
'type'=>'checkbox'
),
'bd'=>array(
'name'=>'BD',
'type'=>'checkbox'
),
'mu'=>array(
'name'=>'Music',
'type'=>'checkbox'
)
));
public function collectData(){
$categories=array();
foreach(self::PARAMETERS[$this->queriedContext] as $category=>$properties){
if($this->getInput($category)){
$uri=self::URI;
switch($category){
case 'm': $uri.='films/cette-semaine'; break;
case 's': $uri.='series/actualite'; break;
case 'g': $uri.='jeuxvideo/actualite'; break;
case 'b': $uri.='livres/actualite'; break;
case 'bd': $uri.='bd/actualite'; break;
case 'mu': $uri.='musique/actualite'; break;
}
$html = getSimpleHTMLDOM($uri)
or returnServerError('No results for this query.');
$list = $html->find('ul.elpr-list', 0);
$this->extractDataFromList($list);
}
}
}
private function extractDataFromList($list) {
if ($list === null) {
returnClientError('Cannot extract data from list');
}
foreach ($list->find('li') as $movie) {
$item = array();
$item['author'] = htmlspecialchars_decode($movie->find('.elco-title a', 0)->plaintext, ENT_QUOTES) . ' ' . $movie->find('.elco-date', 0)->plaintext;
$item['title'] = $movie->find('.elco-title a', 0)->plaintext . ' ' . $movie->find('.elco-date', 0)->plaintext;
$item['content'] = '<em>' . $movie->find('.elco-original-title', 0)->plaintext . '</em><br><br>' .
$movie->find('.elco-baseline', 0)->plaintext . '<br>' .
$movie->find('.elco-baseline', 1)->plaintext . '<br><br>' .
$movie->find('.elco-description', 0)->plaintext . '<br><br>' .
trim($movie->find('.erra-ratings .erra-global', 0)->plaintext) . ' / 10';
$item['id'] = $this->getURI() . $movie->find('.elco-title a', 0)->href;
$item['uri'] = $this->getURI() . $movie->find('.elco-title a', 0)->href;
$this->items[] = $item;
}
}
}

75
bridges/SexactuBridge.php Normal file
View File

@@ -0,0 +1,75 @@
<?php
class SexactuBridge extends BridgeAbstract{
const MAINTAINER = "Riduidel";
const NAME = "Sexactu";
const URI = "https://www.gqmagazine.fr";
const CACHE_TIMEOUT = 7200; // 2h
const DESCRIPTION = "Sexactu via rss-bridge";
public function collectData(){
$find = array('janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'novembre', 'décembre');
$replace = array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
$html = getSimpleHTMLDOM($this->getURI()) or returnServerError('Could not request '.$this->getURI());
foreach($html->find('.content-holder') as $contentHolder) {
// only use first list as second one only contains pages numbers
$articles = $contentHolder->find('ul', 0);
foreach($articles->find('li') as $element) {
// if you ask about that method_exists, there seems to be a bug in simple html dom
// see stackoverflow for more details : http://stackoverflow.com/a/10828479/15619
if(is_object($element)) {
$item = array();
// various metadata
$titleBlock = $element->find('.title-holder', 0);
if(is_object($titleBlock)) {
$titleDetails = $titleBlock->find('.article-title',0);
$titleData = $titleDetails->find('h2', 0)->find('a',0);
$titleTimestamp =$titleDetails->find('h4',0);
$item['title'] = $this->correctCase(trim($titleData->innertext));
$item['uri'] = self::URI.$titleData->href;
// Fugly date parsing due to the fact my DNS-323 doesn't support php intl extension
$dateText = $titleTimestamp->innertext;
$dateText = substr($dateText, strpos($dateText,',')+1);
$dateText = str_replace($find, $replace, strtolower($dateText));
$date = strtotime($dateText);
$item['timestamp'] = $date;
$item['author'] = "Maïa Mazaurette";
$elementText = $element->find('.text-container', 0);
// don't forget to replace images server url with gq one
foreach($elementText->find('img') as $image) {
$image->src = self::URI.$image->src;
}
$item['content'] = $elementText->innertext;
$this->items[] = $item;
}
}
}
}
}
public function getURI(){
return self::URI.'/sexactu';
}
private function correctCase($str) {
$sentences=explode('.', mb_strtolower($str, "UTF-8"));
$str="";
$sep="";
foreach ($sentences as $sentence)
{
//upper case first char
$sentence=ucfirst(trim($sentence));
//append sentence to output
$str=$str.$sep.$sentence;
$sep=". ";
}
return $str;
}
}

View File

@@ -0,0 +1,109 @@
<?php
class ShanaprojectBridge extends BridgeAbstract {
const MAINTAINER = 'logmanoriginal';
const NAME = 'Shanaproject Bridge';
const URI = 'http://www.shanaproject.com';
const DESCRIPTION = 'Returns a list of anime from the current Season Anime List';
// Returns an html object for the Season Anime List (latest season)
private function LoadSeasonAnimeList(){
// First we need to find the URI to the latest season from the 'seasons' page searching for 'Season Anime List'
$html = getSimpleHTMLDOM($this->getURI() . '/seasons');
if(!$html)
returnServerError('Could not load \'seasons\' page!');
$season = $html->find('div.follows_menu/a', 1);
if(!$season)
returnServerError('Could not find \'Season Anime List\'!');
$html = getSimpleHTMLDOM($this->getURI() . $season->href);
if(!$html)
returnServerError('Could not load \'Season Anime List\' from \'' . $season->innertext . '\'!');
return $html;
}
// Extracts the anime title
private function ExtractAnimeTitle($anime){
$title = $anime->find('a', 0);
if(!$title)
returnServerError('Could not find anime title!');
return trim($title->innertext);
}
// Extracts the anime URI
private function ExtractAnimeURI($anime){
$uri = $anime->find('a', 0);
if(!$uri)
returnServerError('Could not find anime URI!');
return $this->getURI() . $uri->href;
}
// Extracts the anime release date (timestamp)
private function ExtractAnimeTimestamp($anime){
$timestamp = $anime->find('span.header_info_block', 1);
if(!$timestamp)
returnServerError('Could not find anime timestamp!');
return strtotime($timestamp->innertext);
}
// Extracts the anime studio name (author)
private function ExtractAnimeAuthor($anime){
$author = $anime->find('span.header_info_block', 2);
if(!$author)
return; // Sometimes the studio is unknown, so leave empty
return trim($author->innertext);
}
// Extracts the episode information (x of y released)
private function ExtractAnimeEpisodeInformation($anime){
$episode = $anime->find('div.header_info_episode', 0);
if(!$episode)
returnServerError('Could not find anime episode information!');
return preg_replace('/\r|\n/', ' ', $episode->plaintext);
}
// Extracts the background image
private function ExtractAnimeBackgroundImage($anime){
// Getting the picture is a little bit tricky as it is part of the style.
// Luckily the style is part of the parent div :)
if(preg_match("/url\(\/\/([^\)]+)\)/i", $anime->parent->style, $matches))
return $matches[1];
returnServerError('Could not extract background image!');
}
// Builds an URI to search for a specific anime (subber is left empty)
private function BuildAnimeSearchURI($anime){
return $this->getURI() . '/search/?title=' . urlencode($this->ExtractAnimeTitle($anime)) . '&subber=';
}
// Builds the content string for a given anime
private function BuildAnimeContent($anime){
// We'll use a template string to place our contents
return '<a href="' . $this->ExtractAnimeURI($anime) . '">
<img src="http://' . $this->ExtractAnimeBackgroundImage($anime) . '" alt="' . htmlspecialchars($this->ExtractAnimeTitle($anime)) . '" style="border: 1px solid black">
</a><br>
<p>' . $this->ExtractAnimeEpisodeInformation($anime) . '</p><br>
<p><a href="' . $this->BuildAnimeSearchURI($anime) . '">Search episodes</a></p>';
}
public function collectData(){
$html = $this->LoadSeasonAnimeList();
$animes = $html->find('div.header_display_box_info');
if(!$animes)
returnServerError('Could not find anime headers!');
foreach($animes as $anime){
$item = array();
$item['title'] = $this->ExtractAnimeTitle($anime);
$item['author'] = $this->ExtractAnimeAuthor($anime);
$item['uri'] = $this->ExtractAnimeURI($anime);
$item['timestamp'] = $this->ExtractAnimeTimestamp($anime);
$item['content'] = $this->BuildAnimeContent($anime);
$this->items[] = $item;
}
}
}

Some files were not shown because too many files have changed in this diff Show More