Compare commits

...

435 Commits

Author SHA1 Message Date
Diaoul e0788be5af Release 1.0.1 2015-07-23 00:44:56 +02:00
Diaoul 52709a3e25 Remove useless dash in cli message 2015-07-23 00:35:05 +02:00
Diaoul 25cf0ac996 Fix scaled score in cli 2015-07-23 00:33:58 +02:00
Diaoul 4c3d7d5b9d Improve CLI
- Convert paths to str
- Add logs
- Catch errors
- Colored output report
2015-07-23 00:11:29 +02:00
Diaoul b4cbfc0de2 Add CLI api doc 2015-07-23 00:05:47 +02:00
Diaoul 600393c12a Fix scan_videos docstring 2015-07-22 19:43:34 +02:00
Diaoul faeeeca39a Switch to dev version 2015-07-22 19:43:07 +02:00
Diaoul 537d33b66a Release 1.0 2015-07-22 01:45:23 +02:00
Diaoul 3933db4936 Add wheel dev dependency 2015-07-22 01:45:12 +02:00
Diaoul 86c6d2c253 Add minimum required version for dependencies 2015-07-21 23:54:00 +02:00
Diaoul 75ffe3767f Skip doctests for python 2 2015-07-21 21:31:10 +02:00
Diaoul 015b7547db Use a session fixture to configure cache region 2015-07-21 21:30:48 +02:00
Diaoul 2a6d861968 Check for files in mkv fixture 2015-07-21 21:29:58 +02:00
Diaoul 0f188e30b0 Update badges and urls 2015-07-21 21:22:52 +02:00
Diaoul 5faf8277f1 Remove pip logs from travis cache 2015-07-21 02:20:31 +02:00
Diaoul b86b4f1405 Add mkv test data to travis cache 2015-07-21 02:09:30 +02:00
Diaoul 98f903174a Merge branch 'master' of github.com:Diaoul/subliminal 2015-07-21 01:56:52 +02:00
Diaoul d8df8a4624 Fix region configuration in tests 2015-07-21 01:56:40 +02:00
Diaoul 0df19e300f Remove --doctest-modules 2015-07-21 01:56:31 +02:00
Antoine Bertin b26bf1c470 Add License badge to README 2015-07-20 23:16:32 +02:00
Diaoul 53cd3f6118 Update documentation and add doctests 2015-07-20 23:00:55 +02:00
Diaoul c23f955b6c Merge branch 'master' of github.com:Diaoul/subliminal 2015-07-20 22:59:04 +02:00
Diaoul 5c5b2656ec Add possible values for min-score in cli help 2015-07-20 22:58:56 +02:00
Diaoul c6278909ff Remove redundant documentation 2015-07-20 22:54:09 +02:00
Diaoul 64d599d6f7 Add compute_score to subliminal namespace 2015-07-20 22:53:40 +02:00
Diaoul 90d638e9c6 Replace DispatchExtensionManager with EnabledExtensionManager 2015-07-20 22:53:13 +02:00
Antoine Bertin 1dabbf78b2 Simplify example in README 2015-07-16 16:18:10 +02:00
Antoine Bertin 58b0b0c756 Improve README readability 2015-07-16 16:13:49 +02:00
Antoine Bertin 1426d9d62d Add more verbosity for travis 2015-07-16 15:58:56 +02:00
Antoine Bertin 85db6c7884 Merge pull request #463 from martinp/python2-fix
Fix for Python 2
2015-07-16 15:30:26 +02:00
Martin Polden 43d02c349f Fix for Python 2
Python 2 doesn't have the exist_ok parameter.
2015-07-16 13:26:55 +02:00
Diaoul c7af4573ca Add cache and sudo directives to travis 2015-07-16 01:41:45 +02:00
Diaoul 73a217eb1b Fix travis build 2015-07-16 01:14:33 +02:00
Diaoul b1854222a0 Merge branch 'master' of github.com:Diaoul/subliminal 2015-07-16 01:05:09 +02:00
Diaoul 7cb72b2bb2 Update to 1.0.dev0 2015-07-16 01:01:38 +02:00
Antoine Bertin 00245dd44d Merge pull request #451 from h3llrais3r/fix_podnapisi_provider
Fix podnapisi provider
2015-05-09 19:22:30 +02:00
h3llrais3r c1972ab26f Fix podnapisi provider
The download url is not longer a link on the page, but it's the
subtitle.page_link appended with '/download'.
2015-05-09 17:59:40 +02:00
Antoine Bertin b86254b0b8 Merge pull request #426 from oxan/addic7ed-codec
Also guess video codec from version in addic7ed provider
2015-01-31 17:51:59 +01:00
Oxan van Leeuwen 00157ee655 Also guess video codec from version in addic7ed provider 2014-12-27 21:17:22 +01:00
Antoine Bertin 6aaece1c44 Merge pull request #403 from h3llrais3r/opensubtitles-query-search
Implemented query search for opensubtitles
2014-09-17 20:27:45 +02:00
h3llrais3r 6445064836 Implemented query search for opensubtitles
Opensubtitles was only using the hash search functionality. For series,
it will now search on series name, season and episode.
2014-09-17 10:17:45 +02:00
Antoine Bertin 9d0c9d93a0 Merge pull request #396 from joseflavio/master
Adding support to proper decode Polish and Bulgarian
2014-08-17 20:09:31 +02:00
Jose Flavio Aguilar 01a06166ff Adding support to proper decode Polish and Bulgarian 2014-08-17 18:49:19 +02:00
Antoine Bertin f41fc2bceb Merge pull request #377 from goll/master
Update for python-guessit 0.7.1
2014-05-07 18:24:10 +02:00
Adrian Goll 5ffa344f1c Update for python-guessit 0.7.1
Latest guessit doesn't require 'autodetect' anymore. Here is a snippet from the usage:

-t TYPE, --type=TYPE  the suggested file type: movie, episode. If undefined, type will be guessed.
2014-05-07 14:18:14 +02:00
Antoine Bertin 31c2b21350 Merge pull request #362 from northerndrifter/p1
Fix hearing impaired flag for podnapisi
2014-03-26 10:36:13 +01:00
northerndrifter b2c6562c64 fixed hearing impaired flag for podnapisi 2014-03-25 21:01:13 +01:00
Antoine Bertin 02a36d9cad Merge pull request #336 from Nikoli/master
Use pysrt 1.0.1: first version migrated from charade to chardet
2014-02-17 10:32:05 +01:00
Nikoli 5dcb1916b2 Use pysrt 1.0.1: first version migrated from charade to chardet 2014-02-14 04:41:09 +04:00
Antoine Bertin c5623ec868 Merge pull request #327 from queeup/master
Fix wrong Turkish subtitle encoding detection #315
2014-02-12 14:58:07 +01:00
queeup 1c17c1987f Fix wrong Turkish subtitle encoding detection #315
Because of chardet Turkish encoding detect issue subliminal can't
recognize Turkish encoding and convert correctly to utf-8 #315
2014-02-12 01:28:57 +02:00
Antoine Bertin b6318bfae0 Update docs and HISTORY 2014-02-11 23:23:00 +01:00
Antoine Bertin 0e8489951d Use bytes for subtitle's content and refactor subtitle validation 2014-02-11 23:22:47 +01:00
Antoine Bertin 21d3a1c1bb Merge pull request #331 from h3llrais3r/master
Add a format to Video and use it for matching
2014-02-09 13:44:36 +01:00
h3llrais3r 9055021282 Added format to hash equation 2014-02-08 23:41:12 +01:00
h3llrais3r 10fcfd21b1 Ignore Pycharm ide files 2014-02-08 22:37:22 +01:00
h3llrais3r c142233ff9 Upgraded guessit to version 0.7 2014-02-08 20:28:30 +01:00
h3llrais3r e660e47265 Fixed unit tests related to format matching (2) 2014-02-07 23:22:36 +01:00
h3llrais3r 40c4c0aeec Fixed unit tests related to format matching 2014-02-07 22:36:44 +01:00
h3llrais3r 97c9a7b025 Updated methods for guess properties 2014-02-07 22:34:18 +01:00
h3llrais3r 9145f2530b Added format for matching on movie 2014-02-07 22:33:37 +01:00
h3llrais3r a1b073e5d6 Fixed guess properties for tvsubtitles 2014-02-07 22:32:03 +01:00
h3llrais3r 7425153760 Use guessit method for partial filenames
Use the correct guessit method when we don't have the complete filename.
We don't fake an episode filename anymore.
2014-02-05 22:37:07 +01:00
h3llrais3r c0836a94a9 Use guessit for matching 2014-01-30 23:11:29 +01:00
h3llrais3r 9dc24951a2 Use format for matching 2014-01-30 21:32:55 +01:00
Antoine Bertin f3eaad8d1c Close xmlrpc in terminate in opensubtitles 2014-01-29 00:17:22 +01:00
Antoine Bertin effde5014e Use little-endian for OpenSubtitles hash 2014-01-28 23:43:35 +01:00
Antoine Bertin 74c4c06a5c Fix cli with new ProviderManager 2014-01-28 21:52:11 +01:00
Antoine Bertin f10b7683c9 Rework provider loading and management
- Rename ProviderManager to ProviderPool
- Add a ProviderManager to manage the entry point
2014-01-27 22:17:00 +01:00
Antoine Bertin 5e26185c9f Fixes for babelfish 0.5.1 2014-01-27 20:58:31 +01:00
Antoine Bertin 2d350f5340 Merge branch 'master' of github.com:Diaoul/subliminal 2014-01-26 14:29:32 +01:00
Antoine Bertin f0519bbefb Update for babelfish 0.5.1 2014-01-26 14:29:20 +01:00
Antoine Bertin 7acfb3f027 More python3 compatibility 2014-01-26 14:27:54 +01:00
Antoine Bertin 24621e15e3 Merge pull request #317 from doron1/patch-1
Update subtitle.py
2014-01-21 13:45:34 -08:00
doron1 3474b2363f Update subtitle.py 2014-01-21 20:45:44 +02:00
Antoine Bertin 560dea3e3e More python3 compatibility 2014-01-19 18:48:50 +01:00
Antoine Bertin f6e5cf91ab Use pysrt 1.0.0 2014-01-19 14:55:19 +01:00
Antoine Bertin 57e8770fda Update HISTORY 2014-01-19 14:45:49 +01:00
Antoine Bertin 7e8f7e41b5 Update unittests 2014-01-19 14:36:37 +01:00
Antoine Bertin 84d890d7b0 Refactor exceptions, add a TimeoutTransport and fix line endings 2014-01-19 14:36:26 +01:00
Antoine Bertin e57c90b97e Respect xdg for cache file 2014-01-19 09:46:00 +01:00
Antoine Bertin 236c43b807 Improve version numbering in documentation 2013-12-13 14:29:58 +01:00
Antoine Bertin bb32c286d9 Fix podnapisi provider 2013-12-12 23:42:37 +01:00
Antoine Bertin f1d4975079 Fix a typo in documentation examples 2013-12-12 22:11:27 +01:00
Antoine Bertin 464b783477 Fix release detection in podnapisi 2013-12-05 20:23:41 +01:00
Antoine Bertin c4756030c7 Fix subtitle re download with single 2013-12-05 20:20:23 +01:00
Antoine Bertin bf538fee32 Add support for directory and encoding in cli 2013-12-03 21:41:20 +01:00
Antoine Bertin cc32c29930 Use debug level for language parsing error in subtitle track name 2013-12-03 21:41:04 +01:00
Antoine Bertin 27b8703949 Add asctime to log file in cli 2013-12-03 21:40:21 +01:00
Antoine Bertin 0d9bbff534 Rename folder_path to directory and add encoding in save_subtitles 2013-12-03 21:39:37 +01:00
Antoine Bertin cad60e73a6 Fix single subtitles saving in cli 2013-12-03 20:36:01 +01:00
Antoine Bertin 1d14d21684 Update addic7ed unittests 2013-12-02 21:10:56 +01:00
Antoine Bertin 0733ef7d32 Fix podnapisi download 2013-12-02 20:29:45 +01:00
Antoine Bertin 143f872166 Remove debug print statement in decode 2013-12-02 20:29:30 +01:00
Antoine Bertin 95abab3c18 Catch more video age detection errors 2013-12-02 20:23:31 +01:00
Antoine Bertin 2e5fb46ebc Fix example in documentation 2013-12-02 00:27:59 +01:00
Antoine Bertin 0d11092178 Improve encoding detection 2013-12-01 22:00:31 +01:00
Antoine Bertin 80589f325a Use lowercase comments 2013-12-01 21:57:02 +01:00
Antoine Bertin 0b6b3d0905 Fix relative links in addic7ed and tvsubtitles for page_link 2013-12-01 18:16:14 +01:00
Antoine Bertin bc97f772b8 Remove bierdopje from the docs 2013-12-01 18:15:30 +01:00
Antoine Bertin efe944a10c Remove extra end of line character in cli 2013-12-01 10:17:57 +01:00
Antoine Bertin 9d9aed2d4b Add a page_link attribute to Subtitle 2013-11-30 23:42:21 +01:00
Antoine Bertin 9cd8b7d593 Use print statement to write to stderr 2013-11-30 23:41:24 +01:00
Antoine Bertin abfd2361d4 Use Video.fromname in cli 2013-11-30 23:41:07 +01:00
Antoine Bertin b10e616ec2 Add traceback to enzyme parsing error log 2013-11-28 21:26:22 +01:00
Antoine Bertin 7dc2a90edc Catch video age detection errors 2013-11-28 21:22:54 +01:00
Antoine Bertin cb53199748 Update cli documentation 2013-11-28 20:48:49 +01:00
Antoine Bertin 7b2402c436 More explicit log messages in api 2013-11-28 20:21:37 +01:00
Antoine Bertin 0715437888 Add support for file logging in cli 2013-11-28 20:21:21 +01:00
Antoine Bertin bea95113e7 Update HISTORY 2013-11-28 00:47:57 +01:00
Antoine Bertin e73e969f58 Remove dead BierDopje provider 2013-11-28 00:47:47 +01:00
Antoine Bertin fd30cf7388 Add year in episode
Used to make a difference between two series with the same name
2013-11-28 00:46:37 +01:00
Antoine Bertin fa9792b280 Fix missing return statement for Video.fromname 2013-11-27 23:33:37 +01:00
Antoine Bertin e93530c7c7 Add a maximum expiration time to cached functions 2013-11-25 23:25:31 +01:00
Antoine Bertin 35d4c37d61 Update to new API
- Add some provider utilities
- Add a ProviderManager class to manage multiple providers
- Add a content attribute to the Subtitle class
- Dissociate download and save functions to give more control to the
user
- Add a fromname classmethod to Video, Episode and Movie classes
- Update unittests
- Update documentation
2013-11-25 22:26:11 +01:00
Antoine Bertin 4d61d3fc42 Switch to 0.8.0 2013-11-22 23:44:02 +01:00
Antoine Bertin a24388137e Remove sphinxcontrib-programoutput 2013-11-22 23:38:17 +01:00
Antoine Bertin 60c7666610 Update badges in README 2013-11-22 21:38:12 +01:00
Antoine Bertin e11f1c4b28 Fix unittests for addic7ed 2013-11-22 21:31:12 +01:00
Antoine Bertin e1b32f237c Merge branch 'develop' 2013-11-22 21:06:04 +01:00
Antoine Bertin fe76634d02 Release 0.7.3 2013-11-22 21:05:49 +01:00
Antoine Bertin b499540bed Sync README and documentation 2013-11-22 20:47:56 +01:00
Antoine Bertin 7b4a9c2060 Fix wrong error catched for babelfish 0.4.0 2013-11-21 23:52:06 +01:00
Antoine Bertin a84cc80a88 Ignore IDE error in cli 2013-11-21 23:51:25 +01:00
Antoine Bertin 241cea9729 Fix podnapisi tests 2013-11-21 23:31:43 +01:00
Antoine Bertin 4b83ddc63e Improve assertions in tests 2013-11-21 23:31:02 +01:00
Antoine Bertin 0b431fbb8d Add Podnapisi to the list of providers in documentation 2013-11-21 00:38:01 +01:00
Antoine Bertin 3736d921a1 Update dogpile.cache to 0.5.2 and use a MutexLock in cli 2013-11-21 00:12:53 +01:00
Antoine Bertin 380fb28d2e Update to babelfish 0.4.0 2013-11-20 22:40:06 +01:00
Antoine Bertin 64c0ee4ccf Add setuptools to dev-requirements.txt 2013-11-20 22:38:55 +01:00
Antoine Bertin 5977bf69fb Improve embedded subtitles language detection 2013-11-14 22:08:48 +01:00
CelestianX 179ae6a24e Updated README with proper information
Section relative to the library was invalid. Missing references and
arguments.
2013-11-14 21:55:24 +01:00
Antoine Bertin 16942ec4c7 Switch to 0.7.3 2013-11-14 21:53:36 +01:00
Antoine Bertin 6f5378ea40 Be more permissive in subtitle validation 2013-11-14 21:51:39 +01:00
Antoine Bertin 02ee2039f4 Skip empty language in addic7ed 2013-11-14 21:51:04 +01:00
Antoine Bertin e7f89c1a19 Release 0.7.2 2013-11-10 11:06:46 +01:00
Antoine Bertin be4f9d92eb Remove unused import 2013-11-10 11:03:37 +01:00
Antoine Bertin ca63b97e79 Parse IETF language format in cli 2013-11-10 10:25:00 +01:00
Antoine Bertin c1ed4a0232 Fix exception handling when validating subtitle 2013-11-10 10:24:23 +01:00
Antoine Bertin b826a0bf08 Use debug level for subtitle track detection 2013-11-10 10:23:41 +01:00
Antoine Bertin fd0d87d719 Use info level when skipping providers 2013-11-10 10:23:24 +01:00
Antoine Bertin 094373f3c1 Add podnapisi provider 2013-11-10 10:22:33 +01:00
Antoine Bertin 5dac623c9f Update to babelfish 0.3.0 2013-11-09 20:25:39 +01:00
Antoine Bertin 57d1e772ec Use more list comprehension 2013-11-09 18:09:19 +01:00
Antoine Bertin 983efbfd9b Reduce debug logging in opensubtitles 2013-11-09 18:06:52 +01:00
Antoine Bertin 1f11e293c1 Add missing docstring 2013-11-09 18:06:17 +01:00
Antoine Bertin bfd278ae1c Change Subtitle repr language format 2013-11-09 18:05:48 +01:00
Antoine Bertin dbe1b9d2af Update guessit requirement 2013-11-09 03:04:13 +01:00
Antoine Bertin d71bc4bf09 Set CLI default cache expiration time to 30 days 2013-11-07 00:33:38 +01:00
Antoine Bertin faf2e1dfa4 Add a CACHE_VERSION to force cache reloading on version change 2013-11-07 00:26:06 +01:00
Antoine Bertin 93360aa1bb Fix find_show_id in tvsubtitles for ambiguous series 2013-11-06 21:08:09 +01:00
Antoine Bertin 8df7780ef9 Switch to 0.7.2 2013-11-06 00:42:44 +01:00
Antoine Bertin c1fda7f44c Release 0.7.1 2013-11-06 00:32:33 +01:00
Antoine Bertin ce42201eee Improve exceptions in addic7ed terminate 2013-11-06 00:31:49 +01:00
Antoine Bertin f65131e5b0 Use the full path to guess in scan_video 2013-11-06 00:20:26 +01:00
Antoine Bertin 8d9efa5dc0 Catch exceptions during provider terminate in api 2013-11-06 00:19:45 +01:00
Antoine Bertin 1a54bfb732 Fix ProviderNotAvailable in list_subtitles 2013-11-06 00:03:53 +01:00
Antoine Bertin a15c1f05b2 Skip links and hidden files and folders in scan_video 2013-11-05 23:25:57 +01:00
Antoine Bertin ccfd341fe9 Fix enzyme track detection 2013-11-05 00:23:24 +01:00
Antoine Bertin aab8e0aa4d Fix spacing around operator 2013-11-04 23:14:25 +01:00
Antoine Bertin 9b669c8a3d Update opensubtitles unittests 2013-11-04 00:56:21 +01:00
Antoine Bertin 50960fed24 Fix single subtitles being always downloaded 2013-11-04 00:43:16 +01:00
Antoine Bertin ff61bc8d2d Add colors to debug log 2013-11-04 00:34:02 +01:00
Antoine Bertin e5d9c229ed Improve CLI 2013-11-04 00:08:20 +01:00
Antoine Bertin b0e38c7e2c Remove unnecessary personal information from addic7ed logging 2013-11-04 00:08:10 +01:00
Antoine Bertin c12dade5ea Add tests for scan_video 2013-11-03 11:53:29 -05:00
Antoine Bertin cb35dabf31 Remove lxml dependency 2013-11-03 11:52:39 -05:00
Antoine Bertin a66cf4b501 Require babelfish 0.2.1 2013-11-03 11:29:42 -05:00
Antoine Bertin c355d6a24a Fix hashes computation for small files 2013-11-03 11:26:34 -05:00
Antoine Bertin 60c1e93037 Scan for und languages and fix download for single 2013-11-01 08:38:24 +01:00
Antoine Bertin 708126aca3 Fix subtitle language filtering of videos 2013-10-31 23:24:49 +01:00
Antoine Bertin bf763a3ad7 Always log found embedded subtitles 2013-10-31 23:23:36 +01:00
Antoine Bertin bb0c3b91a2 Fix the download loop not breaking when done 2013-10-31 22:49:46 +01:00
Antoine Bertin a7c0cd0d19 Fix intersection of sets 2013-10-31 22:49:01 +01:00
Antoine Bertin f315ef9bd0 Fix subtitle language detection in api 2013-10-31 22:32:43 +01:00
Antoine Bertin b262a5491c Fix embedded subtitles always being scanned 2013-10-31 20:47:28 +01:00
Antoine Bertin d7b30336b6 Fix badly encoded subtitles 2013-10-31 20:46:19 +01:00
Antoine Bertin c834bac460 Use absolute paths in cli 2013-10-31 08:37:37 +01:00
Antoine Bertin 36da0a1204 Validate cache-file in cli 2013-10-31 08:37:28 +01:00
Antoine Bertin 6ece9271eb Require absolute paths in scan_video and scan_videos 2013-10-31 08:36:13 +01:00
Antoine Bertin a465058bb3 Catch enzyme and babelfish exceptions in scan_video 2013-10-30 22:47:13 +01:00
Antoine Bertin bad7dbb55c Explicitly use utf-8 for subtitle files encoding 2013-10-30 21:07:18 +01:00
Antoine Bertin 501aaf076e Handle download limit in Addic7ed 2013-10-30 21:05:48 +01:00
Antoine Bertin 49d27cc7e4 Add login support for Addic7ed 2013-10-30 08:40:03 +01:00
Antoine Bertin e3903f77e9 Use babelfish 0.2.0 2013-10-30 08:39:06 +01:00
Antoine Bertin b6ee9b5d7e Fix required language argument in cli 2013-10-30 08:30:11 +01:00
Antoine Bertin e3301cefd7 Fix language extensions loading
The alpha2 converter might not yet be loaded at this point.
When subliminal's converters are loaded, they import subliminal
which import the video module.
2013-10-30 08:29:43 +01:00
Antoine Bertin 74ac38329e Fix None not being a valid language for embedded subtitles 2013-10-30 08:24:15 +01:00
Antoine Bertin 50c39382e6 Improve error logging 2013-10-29 18:07:26 +01:00
Antoine Bertin 9a65708855 Add missing age implementation 2013-10-29 18:06:57 +01:00
Antoine Bertin 4ebcb2cc95 Fix video_types in some providers 2013-10-29 17:26:56 +01:00
Antoine Bertin 0c3c41fb4a Fix unsupported type for timedelta in cli 2013-10-29 17:26:29 +01:00
Antoine Bertin f44942f78e Switch to 0.7.1 2013-10-29 17:23:41 +01:00
Antoine Bertin d7f2211800 Update dev requirements for sphinx documentation upload in pypi 2013-10-29 12:59:50 +01:00
Antoine Bertin 60610e2032 Merge branch 'develop'
Conflicts:
	requirements.txt
	setup.py
	subliminal/infos.py
2013-10-29 12:43:20 +01:00
Antoine Bertin f11402c452 Complete rewrite of subliminal 2013-10-29 12:22:21 +01:00
Antoine Bertin 277b046b41 Fix requirements for enzyme 0.3 2013-05-19 15:44:49 +02:00
Antoine Bertin 7878fb2f92 Update unittests 2013-01-20 00:01:52 +01:00
Antoine Bertin f90c4634c2 Revamp TVsubtitles
- Use dogpile.cache
- Compute confidence based on votes
- Improved keywords detection
- Add docstrings
- Rename to TVsubtitles
- Add unittests
2013-01-19 23:26:40 +01:00
Antoine Bertin b52fbc8af5 Unset language_code in PodnapisiWeb 2013-01-19 21:42:34 +01:00
Antoine Bertin cde1175a7b Update default User-Agent 2013-01-19 21:42:06 +01:00
Antoine Bertin 30786743e3 Update TheSubDB and add unittests 2013-01-19 15:25:45 +01:00
Antoine Bertin c675bad95c Update Subtitulos and add unittests 2013-01-19 15:03:35 +01:00
Antoine Bertin 288b92d2ce Update SubsWiki and add unittests 2013-01-19 15:03:06 +01:00
Antoine Bertin f6e656117c Add unittests for PodnapisiWeb 2013-01-19 15:02:11 +01:00
Antoine Bertin 896baa6a04 Add unittests for Podnapisi 2013-01-18 20:54:37 +01:00
Antoine Bertin b8f820a9af Fix download method in Podnapisi 2013-01-18 20:52:52 +01:00
Antoine Bertin eb8b046dbd Use new is_valid_subtitle method
Thanks to byroot
2013-01-18 20:52:13 +01:00
Antoine Bertin ff9e0f3190 Fix Video path being empty even if forced in unittests 2013-01-18 20:51:27 +01:00
Antoine Bertin c823eda245 Update NEWS 2013-01-17 21:09:28 +01:00
Antoine Bertin 6340de0ddb Fix requirements due to requests 1.0 2013-01-17 20:49:41 +01:00
Antoine Bertin e4f10b9e77 Update addic7ed to use dogpile.cache 2013-01-13 21:25:13 +01:00
Antoine Bertin 5ca2623c13 Merge remote-tracking branch 'rik/requests-changes-172' into develop 2013-01-13 16:47:59 +01:00
Antoine Bertin e560823271 Update setup 2013-01-13 16:46:27 +01:00
Antoine Bertin 3f83b13a29 Use setuptools entry points 2013-01-13 16:46:20 +01:00
Antoine Bertin 507bf09466 Update version to 0.7-dev 2013-01-13 15:57:34 +01:00
Antoine Bertin 688a07dbe9 Update requirements 2013-01-13 15:55:36 +01:00
Antoine Bertin e7c4bc9fc3 Move tests under subliminal module 2013-01-13 15:53:24 +01:00
Anthony Ricaud 04c74afad6 Update to the latest requests API.
fix #172
2013-01-13 14:30:33 +01:00
Antoine Bertin e8a4521b7e Add query unittests for BierDopje and OpenSubtitles 2012-12-16 21:31:49 +01:00
Antoine Bertin 768b9d203c Update new unittests
- Do not expect the exact count of results in list tests
- Download tests
2012-12-16 10:33:32 +01:00
Antoine Bertin ba5e03342f Use key_mangler to fix the error in dbm backend in dogpile.cache 2012-12-15 13:33:25 +01:00
Antoine Bertin cb3ff0334d Add unittests for BierDopje 2012-12-15 13:32:38 +01:00
Antoine Bertin b96bf9b9a5 Finish list unittests for OpenSubtitles 2012-12-15 13:08:05 +01:00
Antoine Bertin 4bf673dfc6 Update new unittests 2012-12-11 14:55:01 +01:00
Antoine Bertin 223fe8025c Use dogpile.cache 2012-12-10 23:31:44 +01:00
Antoine Bertin cf47cf1512 Update requirements
- Add charade and pysrt as test_require
- Add dogpile.cache as install_require
2012-12-10 23:27:57 +01:00
Antoine Bertin 1bac0c3e8c New unittests for services using a yaml configuration file 2012-12-10 23:10:15 +01:00
Antoine Bertin 4634c353d8 Fix subswiki on some movies 2012-12-10 14:05:33 +01:00
Antoine Bertin 9ac2dde4e1 Shorten travis install part 2012-12-09 16:22:58 +01:00
Antoine Bertin 07a6db43e6 Fix test_videos by using unicode 2012-12-09 13:34:17 +01:00
Antoine Bertin c40f1f0cc2 Update unittests for PodnapisiWeb 2012-12-09 11:12:06 +01:00
Antoine Bertin c4ddc6d793 Fix subtitles validation
Subtitles are considered valid if their first 50 lines are
2012-12-09 11:11:48 +01:00
Antoine Bertin 8f58974a1a Remove keywords parameter in PodnapisiWeb as it is not supported 2012-12-09 10:48:07 +01:00
Antoine Bertin b17fbd6fc0 Ensure paths are unicode in get_defaults 2012-12-09 10:46:47 +01:00
Antoine Bertin 57d5d57c53 Fix subtitles validation 2012-12-09 01:14:13 +01:00
Antoine Bertin 5436512b1f Allow empty keywords in services
Applies to addic7ed, subswiki and subtitulos
2012-12-09 00:42:32 +01:00
Antoine Bertin 40e10ea72c Replace filesizes checks in unittests with subtitles validation
Use pysrt for subtitles validation
2012-12-09 00:38:34 +01:00
Antoine Bertin ea6aba4e92 Skip badly encoded paths and require unicode for api calls 2012-12-08 20:21:45 +01:00
Antoine Bertin e4817dd0d3 Update filesizes in unittests 2012-12-07 14:55:55 +01:00
Antoine Bertin 751a2d822a Fix PodnapisiWeb service
- Remove the sR parameter that does not accept multiple
  values and is case-sensitive
- Ensure the languageId is an integer
- Update filesizes in unittests
2012-12-07 14:55:43 +01:00
Antoine Bertin 38cc8422b6 Fix PodnapisiWeb and add unittests 2012-09-23 15:03:06 +02:00
Antoine Bertin 35f2e47195 Fix unittests for SubsWiki 2012-09-23 14:53:20 +02:00
Antoine Bertin ab3ad0fe70 Merge pull request #113 from abenea/podnapisi
Podnapisi
2012-09-22 06:37:13 -07:00
Antoine Bertin ccf26730a2 Fix repr of ServiceConfig when no cache_dir is given 2012-09-22 13:17:36 +02:00
Antoine Bertin c23868dfb1 Merge remote-tracking branch 'wackou/develop' into develop
- Move get_defaults to core
- Add new functions to __all__
- Fix download_subtitles in api
2012-09-22 12:43:03 +02:00
Antoine Bertin b24af17326 Add python 2.6 compatibility on download_zip_file 2012-09-22 11:53:37 +02:00
Antoine Bertin 45aff11bff Fix Subtitulos on incomplete subtitles and use bs4 syntax 2012-09-22 11:45:36 +02:00
Antoine Bertin 1ee700fa9d Merge branch 'develop' 2012-09-15 13:29:27 +02:00
Antoine Bertin 4f74dc9031 Bump version number 2012-09-15 13:28:11 +02:00
Antoine Bertin b53fd0bd61 Fix enzyme import in videos 2012-09-15 13:05:58 +02:00
Antoine Bertin 80e3514d56 Update copyright notice on Addic7ed 2012-09-15 13:05:35 +02:00
Antoine Bertin 3f1cac3ccc Add Galician and Catalan languages to Addic7ed 2012-09-15 13:05:21 +02:00
Antoine Bertin 261e4e8f67 Fix OpenSubtitles testcase 2012-09-15 11:58:20 +02:00
Antoine Bertin bec7ec1901 Fix SubsWiki 2012-09-15 11:29:45 +02:00
Antoine Bertin 69015293a4 Fix OpenSubtitles testcase 2012-09-15 11:28:58 +02:00
Antoine Bertin ca55e417ee Remove unused function in Addic7ed 2012-09-15 11:28:40 +02:00
Antoine Bertin ed37415ee2 Use relative imports in Subtitulos 2012-09-12 23:59:31 +02:00
Antoine Bertin 68dc99f7ab Fix Addic7ed 2012-09-12 23:51:17 +02:00
Antoine Bertin 4d9cac8941 Fix unittests for BierDopje 2012-09-12 21:52:59 +02:00
Antoine Bertin fbd6fe00d6 Add a user agent to BierDopje as requested by the service 2012-09-12 21:52:40 +02:00
Antoine Bertin e491680dff List supported services in CLI help message 2012-09-12 21:29:11 +02:00
Antoine Bertin ffc8474918 Test current directory if no folder is given while scanning 2012-09-12 21:28:43 +02:00
Antoine Bertin dd7f26e51e Update diaoul-sphinx-themes 2012-09-12 07:42:13 +02:00
Nicolas Wack 498460031e Fixed missing import 2012-07-30 00:25:57 +02:00
Nicolas Wack d977e3569f Fixed get_defaults() function call 2012-07-30 00:25:05 +02:00
Antoine Bertin f122e7e4ed Merge pull request #114 from abenea/ass
Add the .ass subtitle extension
2012-07-15 02:13:40 -07:00
Andrei Benea 3af3db3df6 Request XML search results. 2012-07-09 21:35:46 +03:00
Andrei Benea f4246de8a7 Add the .ass subtitle extension. 2012-07-07 11:20:54 +03:00
Andrei Benea 43b647ed28 Enable the PodnapisiWeb service. 2012-07-07 11:09:18 +03:00
Andrei Benea 04958f63de PodnapisiWeb service based on the simple web interface. 2012-07-07 05:03:43 +03:00
Nicolas Wack b15b2c0e7b Factored out consume_task_list() to avoid code duplication 2012-07-01 16:39:45 +02:00
Nicolas Wack 61909b68cc Factored out get_defaults() function to avoid code duplication 2012-07-01 16:37:03 +02:00
Antoine Bertin 71c91bed29 Control subtitles naming in unittest 2012-06-26 19:49:34 +02:00
Antoine Bertin a8aa57dcd6 Merge branch 'develop' 2012-06-24 22:56:03 +02:00
Antoine Bertin a7de8c81b4 Bump version 2012-06-24 22:55:47 +02:00
Antoine Bertin c2688fe81c Remove references to Podnapisi as it is not ready yet 2012-06-24 22:54:42 +02:00
Antoine Bertin 295474506b Update NEWS 2012-06-24 22:49:24 +02:00
Antoine Bertin c4a989dd3d Add the release name in the repr of ResultSubtitle if available 2012-06-24 21:48:18 +02:00
Antoine Bertin 7f6e192149 Add more logging in matching_confidence 2012-06-24 21:46:54 +02:00
Antoine Bertin 28b40e9174 Fix subtitle release name in BierDopje
Matching confidence could not be computed because of the
missing extension
2012-06-24 21:46:33 +02:00
Antoine Bertin f2d2da94a1 Add the path to the repr of a ResultSubtitle 2012-06-24 15:43:44 +02:00
Antoine Bertin 14d19ff090 Fix subtitles being downloaded multiple times
This happened with the multi option because subtitles were
grouped by languages and Language('en-US') is different from
Language('en'). Now we take into account user's languages
preferred order
2012-06-24 15:43:09 +02:00
Antoine Bertin a547464d1e Add Chineese exception to TvSubtitles 2012-06-24 14:49:46 +02:00
Antoine Bertin 23b9aba560 Fix unicode representation of Video when it does not exist 2012-06-24 14:20:10 +02:00
Antoine Bertin 347038c528 Add test_videos to the main test suite 2012-06-24 13:53:41 +02:00
Antoine Bertin 2fc26d910a Use positional arguments for required fields of ResultSubtitle 2012-06-24 13:53:03 +02:00
Antoine Bertin 4828730ea3 Fix some encoding issues 2012-06-24 13:52:28 +02:00
Antoine Bertin 7c4f539a44 Use None as default for keywords in ResultSubtitle constructor 2012-06-24 13:49:13 +02:00
Antoine Bertin 598ef91a30 Do not convert to absolute paths in scan 2012-06-24 13:47:40 +02:00
Antoine Bertin 4862f12619 Update NEWS 2012-06-23 12:35:26 +02:00
Antoine Bertin c96ac214bb Update unittests 2012-06-23 11:24:00 +02:00
Antoine Bertin 8fb9cf6a0b Add __repr__ to Subtitles 2012-06-23 11:22:56 +02:00
Antoine Bertin 4a177b6008 Fix single download subtitles without the force option 2012-06-23 00:23:50 +02:00
Antoine Bertin 58b59a3304 Improve the download_zip_file method 2012-06-20 21:42:51 +02:00
Antoine Bertin 83e84a24b1 Always return the subtitle in Service.download 2012-06-20 21:18:54 +02:00
Antoine Bertin 322e6c1f1c Add Spanish (Latin America) exception to Addic7ed 2012-06-20 21:17:47 +02:00
Antoine Bertin d1ca77d7db Improve Addic7ed subtitles validation 2012-06-20 08:19:19 +02:00
Antoine Bertin d885c78b9a Fix group_by_video when a list entry has None as subtitles 2012-06-20 08:18:37 +02:00
Antoine Bertin 6c8a8a53e7 Avoid some other Addic7ed errors 2012-06-19 23:24:16 +02:00
Antoine Bertin 21ec9335fc Add support for Galician language in Subtitulos 2012-06-19 08:12:31 +02:00
Antoine Bertin 4c40a463da Add an integrity check after subtitles download for Addic7ed 2012-06-19 08:11:54 +02:00
Antoine Bertin 169e97975d Improve logging for file downloads 2012-06-19 08:11:06 +02:00
Antoine Bertin e26c65d4f1 Add error handling for if not strict in Language 2012-06-19 08:10:25 +02:00
Antoine Bertin d1dd86c825 Add possible filesizes for OpenSubtitles in unittests 2012-06-17 19:50:29 +02:00
Antoine Bertin e8388a757b Fix TheSubDB hash method to return None if the file is too small 2012-06-17 18:17:11 +02:00
Antoine Bertin 51c7d46390 Update services unittests
- Remove useless import
- Do not set verbosity
2012-06-17 12:26:16 +02:00
Antoine Bertin 84688acf32 Replace guessit.Language in Video.scan 2012-06-17 11:30:16 +02:00
Antoine Bertin f16ecd220a Fix language detection of subtitles 2012-06-17 11:28:32 +02:00
Antoine Bertin a0f89e46a8 Remove extra skip in unittests 2012-06-17 11:26:07 +02:00
Antoine Bertin 6fce503814 Merge branch 'develop' 2012-06-16 08:07:20 +02:00
Antoine Bertin e873a2fbd2 Put release date in NEWS 2012-06-16 08:06:03 +02:00
Antoine Bertin 53e15969c1 Merge branch 'develop' 2012-06-16 08:02:57 +02:00
Antoine Bertin c11d83a204 Update README 2012-06-16 00:28:05 +02:00
Antoine Bertin 35d664d414 Update documentation 2012-06-16 00:25:55 +02:00
Antoine Bertin 11a33e5425 Use travis-ci sidebar in the documentation 2012-06-16 00:25:43 +02:00
Antoine Bertin 97bd82967e Update diaoul-sphinx-themes 2012-06-16 00:24:30 +02:00
Antoine Bertin ca89339042 Fix CLI 2012-06-15 23:54:25 +02:00
Antoine Bertin 07054c3f68 Fix some naming mistakes 2012-06-15 22:56:11 +02:00
Antoine Bertin 72405f5c0e Add notifications and fix installation in travis-ci 2012-06-15 22:44:41 +02:00
Antoine Bertin d5232b8a68 Add the build status in README 2012-06-15 22:43:39 +02:00
Antoine Bertin d44d032e93 Update requirements
- Add EOL in requirements.txt
- Add optional-requirements.txt for lxml
2012-06-15 22:42:32 +02:00
Antoine Bertin d7122a9c98 Clean up
- Remove blank lines
- Move the strict test in Language
- Update comments in thesubdb
- Order language_map with codes first
2012-06-15 22:40:56 +02:00
Antoine Bertin eb0b9f29f2 Avoid ValueError when a new code is found 2012-06-15 22:38:44 +02:00
Antoine Bertin a8b7763a13 Call parent __init__ in Tasks 2012-06-15 22:37:51 +02:00
Antoine Bertin 1e7fe9d216 Fix encoding issues 2012-06-15 22:37:20 +02:00
Antoine Bertin a0dbfe8c4b Refactor unittests 2012-06-15 21:00:49 +02:00
Antoine Bertin ef2571d626 Fix return type of consume_task for DownloadTasks 2012-06-15 21:00:03 +02:00
Antoine Bertin d3cde7bd05 Update travis-ci file 2012-06-15 18:40:13 +02:00
Antoine Bertin 01191d632b Update NEWS 2012-06-15 18:32:25 +02:00
Antoine Bertin 5c934766f5 Clean up
- Improve imports
- Remove unused exceptions
- Remove blank lines
- Add __all__ in modules
2012-06-15 18:31:56 +02:00
Antoine Bertin decd0e2510 Use the same return type between list_sutbitles and download_subtitles 2012-06-15 17:54:22 +02:00
Antoine Bertin cd46dad14b Add unittests for api 2012-06-15 17:47:15 +02:00
Antoine Bertin 69c5075ced Fix returned results of download_subtitles in api 2012-06-15 17:46:44 +02:00
Antoine Bertin 4da9b7080d Update services and unittests 2012-06-15 17:00:45 +02:00
Antoine Bertin be112bc091 Remove special languages from OpenSubtitles list (und, mis and mul) 2012-06-15 08:21:20 +02:00
Antoine Bertin 8389c86ce7 Rename test_set to test_set_contains in language unittests 2012-06-15 01:07:58 +02:00
Antoine Bertin fa55d32563 Update addic7ed, bierdopje and opensubtitles 2012-06-15 01:07:32 +02:00
Antoine Bertin 185cc9844c Update api, async, core and services to use the new language module 2012-06-15 01:06:31 +02:00
Antoine Bertin 705fb0d342 Init the session in the constructor of ServiceBase 2012-06-15 01:04:17 +02:00
Antoine Bertin 2ce9ac0862 Compact cache functions in ServiceBase 2012-06-15 01:03:40 +02:00
Antoine Bertin a237cd856d Use the NotImplementedError in ServiceBase 2012-06-15 01:02:34 +02:00
Antoine Bertin b1e685ffc2 Make the Video hashable 2012-06-15 01:01:39 +02:00
Antoine Bertin d19dde9843 Replace guessit.language in subtitles module 2012-06-15 01:01:01 +02:00
Antoine Bertin 74693bf747 Add language_list class and its unittests 2012-06-15 00:59:16 +02:00
Antoine Bertin 530bc7f5ff Update language module documentation and improve exception messages 2012-06-15 00:58:16 +02:00
Antoine Bertin 1b660d1e6d Fix language_set substraction operation and add a unittest 2012-06-15 00:56:31 +02:00
Antoine Bertin 34ce0d640c Fix language_set constructor with list of tuples 2012-06-15 00:53:20 +02:00
Antoine Bertin ae2c08bfbd Remove languages for special situations from the list 2012-06-15 00:51:53 +02:00
Antoine Bertin f517a683e3 Merge branch 'develop' of github.com:Diaoul/subliminal into develop 2012-06-12 23:36:02 +02:00
Antoine Bertin b512439d41 Remove some blank lines 2012-06-12 23:33:04 +02:00
Antoine Bertin c62a2a7672 Order documentation by source 2012-06-12 23:32:51 +02:00
Antoine Bertin bcd5c8f610 Add language stuff 2012-06-12 23:32:25 +02:00
Antoine Bertin a75aff65d6 Use skip in unittests 2012-06-09 23:46:36 +02:00
Antoine Bertin 9500f882d5 Replace required_parsers with required_features
Remove detection code and rely on beautifulsoup4 for that
2012-06-09 23:45:27 +02:00
Antoine Bertin 7fc5f2ef97 Update requirements 2012-06-09 19:33:54 +02:00
Antoine Bertin 5d0808a1f9 Merge branch 'develop' of git@github.com:Diaoul/subliminal.git into develop 2012-06-09 11:26:28 +02:00
Antoine Bertin 511fe7410b Update README 2012-06-08 10:57:45 +03:00
Antoine Bertin 7ed6819b03 Update unittests 2012-06-07 21:58:55 +02:00
Antoine Bertin 4709e26bd5 Update Podnapisi 2012-06-07 21:57:46 +02:00
Antoine Bertin 6e1fa561f0 Remove unused stuff in unittests 2012-06-07 18:11:09 +02:00
Antoine Bertin d7668d3573 Fix Podnapisi query method 2012-06-07 18:10:55 +02:00
Antoine Bertin 410295486a Update documentation 2012-06-07 18:09:30 +02:00
Antoine Bertin 0d63b47560 Clean up unused stuff in unittests 2012-06-03 22:05:41 +02:00
Antoine Bertin d3cb956061 Use the pythonic syntax for not in list 2012-06-03 22:04:54 +02:00
Antoine Bertin 2e00accfab Add Podnapisi service 2012-06-03 22:04:15 +02:00
Antoine Bertin c54a60097c Fix requirements 2012-06-03 15:02:23 +02:00
Antoine Bertin 58a54bce06 Merge pull request #84 from wackou/develop
Fixes for TvSubtitles and OpenSubtitles services
2012-06-03 05:15:32 -07:00
Antoine Bertin d00e6905e1 Fix python 2.6 compatibility
list.copy() is 2.7+
2012-06-03 14:10:36 +02:00
Nicolas Wack c7388c9247 Updated requirements for GuessIt 2012-05-12 17:30:30 +02:00
Nicolas Wack 5a2ab412b8 Fixed TvSubtitles download (we get back zip files, not srt ones) 2012-05-12 16:37:25 +02:00
Nicolas Wack 584acb0856 Updated OpenSubtitles' language support 2012-05-12 16:18:07 +02:00
Nicolas Wack 122f41507a Service.check_validity requires languages to be a set 2012-05-09 01:33:22 +02:00
Antoine Bertin 6a78564460 Add optional requirements to travis-ci configuration 2012-05-06 15:59:26 +02:00
Antoine Bertin 096cd5e09c Rename parser related variables. Clean up 2012-05-06 15:51:24 +02:00
Antoine Bertin cc3fa4b11a Update requirements 2012-05-06 12:08:34 +02:00
Antoine Bertin f050687487 Add automatic parser detection for BeautifulSoup 2012-05-06 11:40:12 +02:00
Antoine Bertin 4165ed0b9e Bump version to 0.6 in services 2012-05-06 11:39:23 +02:00
Antoine Bertin 3032590b8e Reorder imports 2012-05-06 11:38:36 +02:00
Antoine Bertin 113b504057 Use unicode in logging messages 2012-05-06 11:36:53 +02:00
Antoine Bertin 1a49f0b3ab Update documentation to remove references to subliminal.languages 2012-05-05 23:30:03 +02:00
Antoine Bertin a79143644b Fix import errors and be pep8 compliant 2012-05-05 23:12:02 +02:00
Antoine Bertin a2559d2d31 Add tests to setup.py and fix travis-ci support
Run tests with python setup.py test
2012-05-05 20:25:00 +02:00
Antoine Bertin 057933d737 Add support for travis-ci 2012-05-05 20:01:45 +02:00
Antoine Bertin bb16df5770 Change message when CLI does not download subtitles 2012-05-05 19:46:45 +02:00
Antoine Bertin b9c8ac23cc Fix requirements 2012-05-05 19:42:15 +02:00
Antoine Bertin bad6f77a01 Merge branch 'develop' of https://github.com/wackou/subliminal into develop 2012-05-05 19:42:07 +02:00
Nicolas Wack bb28945eba Optimized scanning for subtitles 2012-05-04 00:50:59 +02:00
Nicolas Wack 5a6ed82c5f Fixed possibly too greedy regexp 2012-05-03 23:10:21 +02:00
Nicolas Wack 055b2c7139 Fixed error message when no subtitles can be found in zipfile 2012-05-03 22:58:37 +02:00
Nicolas Wack e049eebeb0 Updated requirements for GuessIt 2012-04-28 20:56:33 +02:00
Nicolas Wack 0f3c68b7ef Removed bs4wrapper (requires BeautifulSoup>=4 now) 2012-04-28 20:23:39 +02:00
Nicolas Wack 607efff342 Merge remote-tracking branch 'olifozzy/develop' into languages_refactor 2012-04-25 02:14:14 +02:00
Nicolas Wack a88c05f7c3 Finished switching everything to guessit.Language; removed old language helper functions 2012-04-25 02:05:43 +02:00
Nicolas Wack 3aabbfde4c Subliminal now uses guessit.Language internally mostly everywhere 2012-04-24 22:25:21 +02:00
Nicolas Wack b447825a42 More flexilbe language handling 2012-04-22 03:28:12 +02:00
Nicolas Wack 2a1fb7bcb7 Unittests now clean up after themselves 2012-04-22 01:28:37 +02:00
Nicolas Wack fa7211c8b6 Added check on the size of the downloaded subtitle to make sure it is correct 2012-04-22 01:15:43 +02:00
Nicolas Wack bfa961a005 added unittests for the caching system 2012-04-21 21:43:08 +02:00
Nicolas Wack 4d9855d91c Refactored a bit unittests to use the generic EpisodeServiceTestCase 2012-04-21 20:09:04 +02:00
Nicolas Wack b09c069af8 Changed order of parameters for BierDopje.query() so that it follows the same order as the other services 2012-04-21 19:27:09 +02:00
Antoine Bertin 8fdb241a72 Update documentation 2012-04-15 23:25:14 +02:00
Nicolas Wack de781d0eec Refactored a bit the service unittests to avoid code duplication 2012-04-13 01:56:49 +02:00
Antoine Bertin 2959f52099 Fix CLI when --age is not given 2012-04-12 16:01:09 +03:00
Antoine Bertin 1e11c02006 Fix requirements for python 2.7
Add a requirement exception for previous versions of python
2012-04-11 22:24:37 +02:00
Antoine Bertin 12a58b0ca3 Bump version 2012-04-11 22:20:53 +02:00
Antoine Bertin 27f521d74e Update documentation 2012-04-11 21:15:02 +02:00
Antoine Bertin bbc3472873 Fix description for --age option in CLI 2012-04-11 20:35:47 +02:00
Antoine Bertin 680c699dfa Add --age option in CLI 2012-04-11 20:28:48 +02:00
Antoine Bertin b7ba6d51e2 Fix --workers option in CLI 2012-04-11 20:28:34 +02:00
Nicolas Wack 1f2128999f Correctly set config from a task to its cached service before consuming said task 2012-04-11 20:19:45 +02:00
olifozzy f03503b7f8 Change copyright 2012-04-11 09:53:00 +02:00
Antoine Bertin ae1b86173e Fix missing scan_filter option in async 2012-04-11 00:09:17 +02:00
Antoine Bertin e783c255b7 Add scan_filter option to filter out some paths 2012-04-10 23:48:49 +02:00
Nicolas Wack 0f86d7321f reworked caching system so that each ServiceConfig has its own Cache instance 2012-04-10 23:45:31 +02:00
Antoine Bertin f085b0fc8e Add argparse to the requirements (for python 2.6) 2012-04-10 22:07:57 +02:00
Nicolas Wack b4beba284d Caching system now has a separate cache and cache file for each service 2012-04-09 21:10:09 +02:00
Nicolas Wack c1e70e9e21 added TvSubtitles to the list of services in subliminal/core.py 2012-04-09 19:29:20 +02:00
olifozzy fca2c698fc Add unit tests 2012-04-06 15:09:35 +02:00
olifozzy 5d5b23f907 Change copyright author 2012-04-06 09:37:55 +02:00
olifozzy 2860e58830 Add Addic7ed service. 2012-04-06 01:06:26 +02:00
Antoine Bertin e8dec6c143 Merge branch 'develop' 2012-03-25 18:01:53 +02:00
Antoine Bertin 8b2b19de4b Update and fix NEWS 2012-03-25 17:58:42 +02:00
Antoine Bertin af162578c0 Merge branch 'develop' 2012-03-25 17:47:15 +02:00
Antoine Bertin c6ccfa4417 Bump version 2012-03-25 17:46:56 +02:00
Antoine Bertin 132001a1be Improve error handling of enzyme parsing 2012-03-25 17:46:10 +02:00
Nicolas Wack 014c3249b5 Much better TvSubtitles service; uses cache now too 2012-03-21 20:14:24 +01:00
Nicolas Wack 59920a5537 Enhanced caching system 2012-03-21 16:27:26 +01:00
Nicolas Wack 8e04de4d65 Better BeautifulSoup4 wrapper 2012-03-20 20:31:54 +01:00
Nicolas Wack 3ff8ebea7d fixed some python 2.6 issues
some objects can be used in 2.7 as context managers but not in 2.6
2012-03-15 22:33:35 +01:00
Nicolas Wack 29096d6700 Merge branch 'develop' of github.com:wackou/subliminal into develop 2012-03-14 23:48:25 +01:00
Nicolas Wack 1c59fc829f added first version of a TvSubtitles service 2012-03-14 23:42:43 +01:00
Nicolas Wack ca5c0427b8 allow services to download an extract zip files 2012-03-14 22:30:38 +01:00
Nicolas Wack f1dd77bdfd Compatibility for BeautifulSoup 3 and 4
BeautifulSoup4 is imported by default if present.
2012-03-13 01:54:33 +01:00
Nicolas Wack 4d06316d22 ported services to BeautifulSoup4 2012-03-05 22:02:31 +01:00
145 changed files with 211693 additions and 4206 deletions
+8
View File
@@ -0,0 +1,8 @@
[report]
exclude_lines =
pragma: no cover
raise NotImplementedError
def __repr__
if __name__ == .__main__.:
omit =
subliminal/cli.py
+51 -22
View File
@@ -1,35 +1,64 @@
*.py[co]
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# Packages
*.egg
*.egg-info
dist
build
eggs
parts
bin
var
sdist
develop-eggs
# C extensions
*.so
# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.tox
.coverage.*
.cache
nosetests.xml
coverage.xml
*,cover
#Translations
# Translations
*.mo
*.pot
#Mr Developer
.mr.developer.cfg
# Django stuff:
*.log
#Pydev
.project
.pydevproject
.settings
# Sphinx documentation
docs/_build/
#Sphinx
docs/_build
# PyBuilder
target/
# Pycharm
.idea
# Subliminal
tests/data/mkv/
-3
View File
@@ -1,3 +0,0 @@
[submodule "docs/_themes"]
path = docs/_themes
url = git://github.com/Diaoul/diaoul-sphinx-themes.git
+29
View File
@@ -0,0 +1,29 @@
sudo: false
language: python
python:
- 2.7
- 3.3
- 3.4
env:
- PARSER=native
- PARSER=lxml
cache:
directories:
- $HOME/.cache/pip
- tests/data/mkv
before_cache:
- rm -f $HOME/.cache/pip/log/debug.log
install:
- pip install -e .[test]
- if [ $PARSER = "lxml" ]; then pip install lxml; fi
- pip install coveralls
script: python setup.py test -a "--cov subliminal --verbose"
after_success: coveralls
-674
View File
@@ -1,674 +0,0 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
-165
View File
@@ -1,165 +0,0 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.
+211
View File
@@ -0,0 +1,211 @@
Changelog
---------
1.0.1
^^^^^
**release date:** 2015-07-23
* Fix unicode issues in CLI (python 2 only)
* Fix score scaling in CLI (python 2 only)
* Improve error handling in CLI
* Color collect report in CLI
1.0
^^^
**release date:** 2015-07-22
* Many changes and fixes
* New test suite
* New documentation
* New CLI
0.7.5
^^^^^
**release date:** 2015-03-04
* Update requirements
* Remove BierDopje provider
* Add pre-guessed video optional argument in scan_video
* Improve hearing impaired support
* Fix TVSubtitles and Podnapisi providers
0.7.4
^^^^^
**release date:** 2014-01-27
* Fix requirements for guessit and babelfish
0.7.3
^^^^^
**release date:** 2013-11-22
* Fix windows compatibility
* Improve subtitle validation
* Improve embedded subtitle languages detection
* Improve unittests
0.7.2
^^^^^
**release date:** 2013-11-10
* Fix TVSubtitles for ambiguous series
* Add a CACHE_VERSION to force cache reloading on version change
* Set CLI default cache expiration time to 30 days
* Add podnapisi provider
* Support script for languages e.g. Latn, Cyrl
* Improve logging levels
* Fix subtitle validation in some rare cases
0.7.1
^^^^^
**release date:** 2013-11-06
* Improve CLI
* Add login support for Addic7ed
* Remove lxml dependency
* Many fixes
0.7.0
^^^^^
**release date:** 2013-10-29
**WARNING:** Complete rewrite of subliminal with backward incompatible changes
* Use enzyme to parse metadata of videos
* Use babelfish to handle languages
* Use dogpile.cache for caching
* Use charade to detect subtitle encoding
* Use pysrt for subtitle validation
* Use entry points for subtitle providers
* New subtitle score computation
* Hearing impaired subtitles support
* Drop async support
* Drop a few providers
* And much more...
0.6.4
^^^^^
**release date:** 2013-05-19
* Fix requirements due to enzyme 0.3
0.6.3
^^^^^
**release date:** 2013-01-17
* Fix requirements due to requests 1.0
0.6.2
^^^^^
**release date:** 2012-09-15
* Fix BierDopje
* Fix Addic7ed
* Fix SubsWiki
* Fix missing enzyme import
* Add Catalan and Galician languages to Addic7ed
* Add possible services in help message of the CLI
* Allow existing filenames to be passed without the ./ prefix
0.6.1
^^^^^
**release date:** 2012-06-24
* Fix subtitle release name in BierDopje
* Fix subtitles being downloaded multiple times
* Add Chinese support to TvSubtitles
* Fix encoding issues
* Fix single download subtitles without the force option
* Add Spanish (Latin America) exception to Addic7ed
* Fix group_by_video when a list entry has None as subtitles
* Add support for Galician language in Subtitulos
* Add an integrity check after subtitles download for Addic7ed
* Add error handling for if not strict in Language
* Fix TheSubDB hash method to return None if the file is too small
* Fix guessit.Language in Video.scan
* Fix language detection of subtitles
0.6.0
^^^^^
**release date:** 2012-06-16
**WARNING:** Backward incompatible changes
* Fix --workers option in CLI
* Use a dedicated module for languages
* Use beautifulsoup4
* Improve return types
* Add scan_filter option
* Add --age option in CLI
* Add TvSubtitles service
* Add Addic7ed service
0.5.1
^^^^^
**release date:** 2012-03-25
* Improve error handling of enzyme parsing
0.5
^^^
**release date:** 2012-03-25
**WARNING:** Backward incompatible changes
* Use more unicode
* New list_subtitles and download_subtitles methods
* New Pool object for asynchronous work
* Improve sort algorithm
* Better error handling
* Make sorting customizable
* Remove class Subliminal
* Remove permissions handling
0.4
^^^
**release date:** 2011-11-11
* Many fixes
* Better error handling
0.3
^^^
**release date:** 2011-08-18
* Fix a bug when series is not guessed by guessit
* Fix dependencies failure when installing package
* Fix encoding issues with logging
* Add a script to ease subtitles download
* Add possibility to choose mode of created files
* Add more checks before adjusting permissions
0.2
^^^
**release date:** 2011-07-11
* Fix plugin configuration
* Fix some encoding issues
* Remove extra logging
0.1
^^^
**release date:** *private release*
* Initial release
+20
View File
@@ -0,0 +1,20 @@
The MIT License (MIT)
Copyright (c) 2015 Antoine Bertin
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
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 OR
COPYRIGHT HOLDERS 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.
+1 -1
View File
@@ -1 +1 @@
include COPYING COPYING.LESSER NEWS.rst README.rst
include LICENSE HISTORY.rst requirements.txt
-43
View File
@@ -1,43 +0,0 @@
News
====
0.5
---
**release date:** 2012-03-25
**WARNING:** Backward incompatible changes
* Use more unicode
* New list_subtitles and download_subtitles methods
* New Pool object for asynchronous work
* Improve sort algorithm
* Better error handling
* Make sorting customizable
* Remove class Subliminal
* Remove permissions handling
0.4
---
**release date:** 2011-11-11
* Many fixes
* Better error handling
0.3
---
**release date:** 2011-08-18
* Fix a bug when series is not guessed by guessit
* Fix dependencies failure when installing package
* Fix encoding issues with logging
* Add a script to ease subtitles download
* Add possibility to choose mode of created files
* Add more checks before adjusting permissions
0.2
---
**release date:** 2011-07-11
* Fix plugin configuration
* Fix some encoding issues
* Remove extra logging
0.1
---
**release date:** not released yet
* Initial release
+50 -30
View File
@@ -1,43 +1,63 @@
Subliminal
==========
Subliminal is a python library to search and download subtitles.
Subtitles, faster than your thoughts.
It uses video hashes and the powerful `guessit <http://guessit.readthedocs.org/>`_ library
that extracts informations from filenames or filepaths to ensure you have the best subtitles.
It also relies on `enzyme <https://github.com/Diaoul/enzyme>`_ to detect embedded subtitles
and avoid duplicates.
.. image:: https://img.shields.io/pypi/v/subliminal.svg
:target: https://pypi.python.org/pypi/subliminal
:alt: Latest Version
Features
--------
Multiple subtitles services are available:
.. image:: https://travis-ci.org/Diaoul/subliminal.svg?branch=master
:target: https://travis-ci.org/Diaoul/subliminal
:alt: Travis CI build status
* OpenSubtitles
* TheSubDB
* BierDopje
* SubsWiki
* Subtitulos
.. image:: https://readthedocs.org/projects/subliminal/badge/?version=latest
:target: https://subliminal.readthedocs.org/
:alt: Documentation Status
You can use main subliminal's functions with a **file path**, a **file name** or a **folder path**.
.. image:: https://coveralls.io/repos/Diaoul/subliminal/badge.svg?branch=master&service=github
:target: https://coveralls.io/github/Diaoul/subliminal?branch=master
:alt: Code coverage
.. image:: https://img.shields.io/github/license/Diaoul/subliminal.svg
:target: https://github.com/Diaoul/subliminal/blob/master/LICENSE
:alt: License
:Project page: https://github.com/Diaoul/subliminal
:Documentation: https://subliminal.readthedocs.org/
Usage
-----
CLI
^^^
Download english subtitles::
Download English subtitles::
$ subliminal -l en The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.mp4
**************************************************
Downloaded 1 subtitles
(Episode(u'The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.mp4'), ResultSubtitle(en, opensubtitles, 0.33, The.Big.Bang.Theory.S05E18.HDTV-LOL.srt))
**************************************************
$ subliminal download -l en The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.mp4
Collecting videos [####################################] 100%
1 video collected / 0 video ignored / 0 error
Downloading subtitles [####################################] 100%
Downloaded 1 subtitle
Module
^^^^^^
List english subtitles::
Library
^^^^^^^
Download best subtitles in French and English for videos less than two weeks old in a video folder:
>>> subliminal.list_subtitles('The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.mp4', ['en'])
.. code:: python
Multi-threaded use
^^^^^^^^^^^^^^^^^^
Use 4 workers to achieve the same result::
>>> with subliminal.Pool(4) as p:
... p.list_subtitles('The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.mp4', ['en'])
from datetime import timedelta
from babelfish import Language
from subliminal import download_best_subtitles, region, save_subtitles, scan_videos
# configure the cache
region.configure('dogpile.cache.dbm', arguments={'filename': 'cachefile.dbm'})
# scan for videos newer than 2 weeks and their existing subtitles in a folder
videos = [v for v in scan_videos('/video/folder') if v.age < timedelta(weeks=2)]
# download best subtitles
subtitles = download_best_subtitles(videos, {Language('eng'), Language('fra')})
# save them to disk, next to the video
save_subtitles(subtitles)
+42 -3
View File
@@ -2,11 +2,16 @@
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXOPTS = -n -W
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = _build
# User-friendly check for sphinx-build
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
endif
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
@@ -14,7 +19,7 @@ ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext
help:
@echo "Please use \`make <target>' where <target> is one of"
@@ -25,21 +30,26 @@ help:
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " applehelp to make an Apple Help Book"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " xml to make Docutils-native XML files"
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
@echo " coverage to run coverage check of the documentation (if enabled)"
clean:
-rm -rf $(BUILDDIR)/*
rm -rf $(BUILDDIR)/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@@ -81,6 +91,14 @@ qthelp:
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/subliminal.qhc"
applehelp:
$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
@echo
@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
@echo "N.B. You won't be able to view it unless you put it in" \
"~/Library/Documentation/Help or install it in your application" \
"bundle."
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@@ -108,6 +126,12 @@ latexpdf:
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
latexpdfja:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through platex and dvipdfmx..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@@ -151,3 +175,18 @@ doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
coverage:
$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
@echo "Testing of coverage in the sources finished, look at the " \
"results in $(BUILDDIR)/coverage/python.txt."
xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

-4
View File
@@ -1,4 +0,0 @@
<h3>About</h3>
<p>
Subliminal is a python library to search and download subtitles.
</p>
-6
View File
@@ -1,6 +0,0 @@
<h3>Useful Links</h3>
<ul>
<li><a href="http://pypi.python.org/pypi/subliminal">subliminal @ PyPI</a></li>
<li><a href="http://github.com/Diaoul/subliminal">subliminal @ GitHub</a></li>
<li><a href="http://github.com/Diaoul/subliminal/issues">Issue Tracker</a></li>
</ul>
-4
View File
@@ -1,4 +0,0 @@
<p>
<iframe src="http://markdotto.github.com/github-buttons/github-btn.html?user=Diaoul&repo=subliminal&type=watch&count=true&size=large"
allowtransparency="true" frameborder="0" scrolling="0" width="200px" height="35px"></iframe>
</p>
Submodule docs/_themes deleted from 643e653f25
+7
View File
@@ -0,0 +1,7 @@
API
===
.. automodule:: subliminal.api
.. data:: provider_manager
:class:`~stevedore.extension.ExtensionManager` based on the entry point ``subliminal.providers``
+21
View File
@@ -0,0 +1,21 @@
Cache
=====
.. module:: subliminal.cache
.. autodata:: CACHE_VERSION
:annotation:
.. autodata:: SHOW_EXPIRATION_TIME
:annotation:
.. autodata:: EPISODE_EXPIRATION_TIME
:annotation:
.. data:: region
:annotation:
The :class:`~dogpile.cache.region.CacheRegion`
Refer to dogpile.cache's `region configuration documentation
<http://dogpilecache.readthedocs.org/en/latest/usage.html#region-configuration>`_ to see how to configure the region
+3
View File
@@ -0,0 +1,3 @@
CLI
===
.. automodule:: subliminal.cli
+3
View File
@@ -0,0 +1,3 @@
Exceptions
==========
.. automodule:: subliminal.exceptions
+3
View File
@@ -0,0 +1,3 @@
Providers
=========
.. automodule:: subliminal.providers
+3
View File
@@ -0,0 +1,3 @@
Score
=====
.. automodule:: subliminal.score
+3
View File
@@ -0,0 +1,3 @@
Subtitle
========
.. automodule:: subliminal.subtitle
+10
View File
@@ -0,0 +1,10 @@
Video
=====
.. automodule:: subliminal.video
:exclude-members: VIDEO_EXTENSIONS, SUBTITLE_EXTENSIONS
.. autodata:: VIDEO_EXTENSIONS
:annotation:
.. autodata:: SUBTITLE_EXTENSIONS
:annotation:
+280
View File
@@ -0,0 +1,280 @@
interactions:
- request:
body: null
headers:
User-Agent: [Subliminal/1.0]
method: GET
uri: http://podnapisi.net/subtitles/search/old?sXML=1&sTS=5&sTE=18&sK=The+Big+Bang+Theory&sL=hu
response:
body: {string: "<html>\r\n<head><title>302 Found</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>302
Found</h1></center>\r\n<hr><center>nginx/1.8.0</center>\r\n</body>\r\n</html>\r\n"}
headers:
Connection: [keep-alive]
Content-Length: ['160']
Content-Type: [text/html]
Date: ['Mon, 20 Jul 2015 06:11:37 GMT']
Location: ['http://www.podnapisi.net/subtitles/search/old?sXML=1&sTS=5&sTE=18&sK=The+Big+Bang+Theory&sL=hu']
Server: [nginx/1.8.0]
status: {code: 302, message: Moved Temporarily}
- request:
body: null
headers:
User-Agent: [Subliminal/1.0]
method: GET
uri: http://www.podnapisi.net/subtitles/search/old?sXML=1&sTS=5&sTE=18&sK=The+Big+Bang+Theory&sL=hu
response:
body: {string: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n<!DOCTYPE
results [\n <!ELEMENT results (#PCDATA|pagination|subtitle)*>\n <!ELEMENT
pagination (current, count, results)>\n <!ELEMENT current (#PCDATA)>\n
\ <!ELEMENT count (#PCDATA)>\n <!ELEMENT subtitle (id, title, year,
movieId, url, uploaderId, uploaderName, release, languageId, languageName,
time, tvSeason, tvEpisode, tvSpecial, cds, format, fps, rating, flags, downloads)>\n
\ <!ELEMENT id (#PCDATA)>\n <!ELEMENT pid (#PCDATA)>\n <!ELEMENT
title (#PCDATA)>\n <!ELEMENT year (#PCDATA)>\n <!ELEMENT movieId
(#PCDATA)>\n <!ELEMENT url (#PCDATA)>\n <!ELEMENT uploaderId (#PCDATA)>\n
\ <!ELEMENT uploaderName (#PCDATA)>\n <!ELEMENT release (#PCDATA)>\n
\ <!ELEMENT languageId (#PCDATA)>\n <!ELEMENT languageName (#PCDATA)>\n
\ <!ELEMENT language (#PCDATA)>\n <!ELEMENT time (#PCDATA)>\n <!ELEMENT
tvSeason (#PCDATA)>\n <!ELEMENT tvEpisode (#PCDATA)>\n <!ELEMENT
tvSpecial (#PCDATA)>\n <!ELEMENT cds (#PCDATA)>\n <!ELEMENT format
(#PCDATA)>\n <!ELEMENT fps (#PCDATA)>\n <!ELEMENT rating (#PCDATA)>\n
\ <!ELEMENT flags (#PCDATA)>\n <!ELEMENT new_flags (#PCDATA)>\n <!ELEMENT
flag (#PCDATA)>\n <!ELEMENT downloads (#PCDATA)>\n <!ELEMENT exactHashes
(#PCDATA)>]> <results><pagination><current>1</current><count>1</count><results>2</results></pagination><subtitle><id>1495142</id><pid>ZtAW</pid><title>The
Big Bang Theory</title><year>2007</year><movieId>sY0G</movieId><url>http://www.podnapisi.net/subtitles/hu-the-big-bang-theory-2007-S05E18/ZtAW</url><uploaderId>40156</uploaderId><uploaderName>kvrle</uploaderName><release>The.Big.Bang.Theory.S05E18.HDTV-LOL
The.Big.Bang.Theory.S05E18.720p.HDTV.x264-DIMENSION</release><languageId>15</languageId><languageName>Hungarian</languageName><language>hu</language><time>1330213369</time><tvSeason>5</tvSeason><tvEpisode>18</tvEpisode><tvSpecial>0</tvSpecial><cds
/><format>N/A</format><fps>N/A</fps><rating>0.0</rating><flags>h</flags><new_flags><flag>high_definition</flag></new_flags><downloads>497</downloads><exactHashes
/></subtitle><subtitle><id>1495096</id><pid>ONAW</pid><title>The Big Bang
Theory</title><year>2007</year><movieId>sY0G</movieId><url>http://www.podnapisi.net/subtitles/hu-the-big-bang-theory-2007-S05E18/ONAW</url><uploaderId>1</uploaderId><uploaderName>Anonymous</uploaderName><release>The.Big.Bang.Theory.S05E18.HDTV.XviD-FQM</release><languageId>15</languageId><languageName>Hungarian</languageName><language>hu</language><time>1330134575</time><tvSeason>5</tvSeason><tvEpisode>18</tvEpisode><tvSpecial>0</tvSpecial><cds
/><format>N/A</format><fps>N/A</fps><rating>0.0</rating><flags /><new_flags
/><downloads>347</downloads><exactHashes /></subtitle></results>"}
headers:
Connection: [keep-alive]
Content-Length: ['2792']
Content-Type: [text/xml;charset=utf-8]
Date: ['Mon, 20 Jul 2015 06:11:37 GMT']
Server: [nginx/1.8.0]
status: {code: 200, message: OK}
- request:
body: null
headers:
User-Agent: [Subliminal/1.0]
method: GET
uri: http://podnapisi.net/subtitles/ZtAW/download?container=zip
response:
body: {string: "<html>\r\n<head><title>302 Found</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>302
Found</h1></center>\r\n<hr><center>nginx/1.8.0</center>\r\n</body>\r\n</html>\r\n"}
headers:
Connection: [keep-alive]
Content-Length: ['160']
Content-Type: [text/html]
Date: ['Mon, 20 Jul 2015 06:11:37 GMT']
Location: ['http://www.podnapisi.net/subtitles/ZtAW/download?container=zip']
Server: [nginx/1.8.0]
status: {code: 302, message: Moved Temporarily}
- request:
body: null
headers:
User-Agent: [Subliminal/1.0]
method: GET
uri: http://www.podnapisi.net/subtitles/ZtAW/download?container=zip
response:
body:
string: !!binary |
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
headers:
Accept-Ranges: [bytes]
Connection: [keep-alive]
Content-Disposition: [attachment; filename="e638ea178f406cb584f48051501e2cb4db4fce1d.zip"]
Content-Length: ['10541']
Content-Type: [application/octet-stream]
Date: ['Mon, 20 Jul 2015 06:11:37 GMT']
ETag: ['"4f497ffb-292d"']
Last-Modified: ['Sun, 26 Feb 2012 00:42:35 GMT']
Server: [nginx/1.8.0]
status: {code: 200, message: OK}
version: 1
+106 -37
View File
@@ -1,9 +1,11 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# subliminal documentation build configuration file, created by
# sphinx-quickstart on Tue Feb 28 16:33:06 2012.
# sphinx-quickstart on Sat Jul 11 00:40:28 2015.
#
# This file is execfile()d with the current directory set to its containing dir.
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
@@ -11,28 +13,38 @@
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys, os
from __future__ import unicode_literals
import sys
import os
import shlex
import sphinx_rtd_theme
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
sys.path.insert(0, os.path.abspath('..'))
sys.path.append(os.path.abspath('_themes'))
import subliminal.infos
import subliminal
# -- General configuration -----------------------------------------------------
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = ['sphinx.ext.autodoc']
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.intersphinx',
'sphinx.ext.viewcode',
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix of source filenames.
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
# The encoding of source files.
@@ -42,21 +54,25 @@ source_suffix = '.rst'
master_doc = 'index'
# General information about the project.
project = u'subliminal'
copyright = u'2012, Antoine Bertin'
project = subliminal.__title__
copyright = ' '.join(subliminal.__copyright__.split()[1:])
author = subliminal.__copyright__.split(', ')[1]
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = subliminal.infos.__version__
version = subliminal.__version__.split('-')[0]
# The full version, including alpha/beta/rc tags.
release = version
release = subliminal.__version__
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
@@ -68,7 +84,8 @@ release = version
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all documents.
# The reST default role (used for this markup: `text`) to use for all
# documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
@@ -88,20 +105,32 @@ pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
#keep_warnings = False
# -- Options for HTML output ---------------------------------------------------
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'flask'
html_theme = 'sphinx_rtd_theme'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
# html_theme_options = {
# 'github_user': 'Diaoul',
# 'github_repo': project,
# 'travis_button': True,
# 'gratipay_user': 'Diaoul'
# }
# Add any paths that contain custom themes here, relative to this directory.
html_theme_path = ['_themes']
html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
@@ -112,7 +141,7 @@ html_theme_path = ['_themes']
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
html_logo = '_static/subliminal-logo.png'
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
@@ -124,6 +153,11 @@ html_logo = '_static/subliminal-logo.png'
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#html_extra_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
@@ -133,10 +167,7 @@ html_static_path = ['_static']
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
html_sidebars = {
'index': ['sidebar-intro.html', 'sidebar-watch.html', 'localtoc.html', 'sidebar-links.html', 'searchbox.html'],
'**': ['localtoc.html', 'relations.html', 'sourcelink.html']
}
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
@@ -168,11 +199,24 @@ html_sidebars = {
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Language to be used for generating the HTML full-text search index.
# Sphinx supports the following languages:
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja'
# 'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr'
#html_search_language = 'en'
# A dictionary with options for the search language support, empty by default.
# Now only 'ja' uses this config value
#html_search_options = {'type': 'default'}
# The name of a javascript file (relative to the configuration directory) that
# implements a search results scorer. If empty, the default will be used.
#html_search_scorer = 'scorer.js'
# Output file base name for HTML help builder.
htmlhelp_basename = 'subliminaldoc'
htmlhelp_basename = project + 'doc'
# -- Options for LaTeX output --------------------------------------------------
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
@@ -183,13 +227,17 @@ latex_elements = {
# Additional stuff for the LaTeX preamble.
#'preamble': '',
# Latex figure (float) alignment
#'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
('index', 'subliminal.tex', u'subliminal Documentation',
u'Antoine Bertin', 'manual'),
(master_doc, project + '.tex', project + ' Documentation',
author, 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
@@ -213,28 +261,28 @@ latex_documents = [
#latex_domain_indices = True
# -- Options for manual page output --------------------------------------------
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
('index', 'subliminal', u'subliminal Documentation',
[u'Antoine Bertin'], 1)
(master_doc, project, project + ' Documentation',
[author], 1)
]
# If true, show URL addresses after external links.
#man_show_urls = False
# -- Options for Texinfo output ------------------------------------------------
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
('index', 'subliminal', u'subliminal Documentation',
u'Antoine Bertin', 'subliminal', 'One line description of project.',
'Miscellaneous'),
(master_doc, project, project + ' Documentation',
author, project, 'Subtitles, faster than your thoughts',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
@@ -245,3 +293,24 @@ texinfo_documents = [
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the "Top" node's menu.
#texinfo_no_detailmenu = False
# Example configuration for intersphinx: refer to the Python standard library.
intersphinx_mapping = {
'python': ('http://docs.python.org/3.4', None),
'guessit': ('http://guessit.readthedocs.org/en/latest', None),
'babelfish': ('http://babelfish.readthedocs.org/en/latest', None),
'dogpilecache': ('http://dogpilecache.readthedocs.org/en/latest', None),
'dogpilecore': ('http://dogpilecore.readthedocs.org/en/latest', None),
'stevedore': ('http://docs.openstack.org/developer/stevedore', None),
'click': ('http://click.pocoo.org/4', None)
}
# -- Options for autodoc -------------------------------------------------------
autodoc_member_order = 'bysource'
autodoc_default_flags = ['members']
+40
View File
@@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import os
import sys
import pytest
try:
from unittest.mock import Mock
except ImportError:
from mock import Mock
from vcr import VCR
from subliminal.cache import region
vcr = VCR(path_transformer=lambda path: path + '.yaml',
match_on=['method', 'scheme', 'host', 'port', 'path', 'query', 'body'],
cassette_library_dir=os.path.join('docs', 'cassettes'))
@pytest.fixture(autouse=True, scope='session')
def configure_region():
region.configure('dogpile.cache.null')
region.configure = Mock()
@pytest.fixture(autouse=True)
def chdir(tmpdir, monkeypatch):
monkeypatch.chdir(str(tmpdir))
@pytest.yield_fixture(autouse=True)
def use_cassette(request):
with vcr.use_cassette('test_' + request.fspath.purebasename):
yield
@pytest.fixture(autouse=True)
def skip_python_2():
if sys.version_info < (3, 0):
return pytest.skip('Requires python 3')
-87
View File
@@ -1,87 +0,0 @@
This guide is going to explain the main logic of subliminal and detail
every class or function.
Services
--------
Subliminal aims at downloading subtitles. Over the web, one can find subtitles
combining different websites but there is no guarantee of a perfect match.
Even if OpenSubtitles has a gigantic subtitles database, you may not be able to
find a subtitle on it but you will find it elsewhere, say BierDopje. Sometimes,
it just takes some time before it shows up on a website even if already available
on another, but you don't wanna wait to watch the latest Big Bang Theory, right?
Given this, to be reliable, subliminal has to use different :mod:`~subliminal.services`
and use a unified method to gather them all. The :class:`~subliminal.services.ServiceBase`
class will achieve this.
.. automodule:: subliminal.services
:members:
Languages
---------
To be able to support many languages, subliminal has a :mod:`~subliminal.languages`
module that contains utility functions and ISO languages code (639-1 and 639-2)
.. automodule:: subliminal.languages
:members:
Tasks
-----
Subliminal is IO bound: it mostly waits for IO operations (web requests) to complete.
Thus, subliminal is a good place for multi-threading. It works with atomic operations
represented by a :class:`~subliminal.tasks.Task` class which can be consumed with
:func:`~subliminal.core.consume_task` but we'll see that later.
.. automodule:: subliminal.tasks
:members:
Asynchronous
------------
To consume those tasks in an asynchronous way without flooding services with requests,
subliminal uses multiple instances of the :class:`~subliminal.async.Worker` class that
will consume the same task queue. Each worker will only create a single instance of each
:mod:`service <subliminal.services>` and this save some initialization time.
The :class:`~subliminal.async.Pool` is here to instantiate and manage multiple workers
at a time.
.. automodule:: subliminal.async
:members:
Core
----
The goal of subliminal's :mod:`~subliminal.core` module is to merge results from
consumed tasks. Merging has to be intelligent and take user preferences into account.
Core module is thus responsible for the computation of a :func:`matching confidence
<subliminal.core.matching_confidence>` so the user knows the chances that the
:class:`~subliminal.subtitles.ResultSubtitle` matches the :class:`~subliminal.videos.Video`
.. automodule:: subliminal.core
:members:
Other objects
-------------
Subliminal uses some other self-explanatory functions and classes listed below.
Video
^^^^^
.. automodule:: subliminal.videos
:members:
Subtitle
^^^^^^^^
.. automodule:: subliminal.subtitles
:members:
Utilities
^^^^^^^^^
.. automodule:: subliminal.utils
:members:
Exceptions
^^^^^^^^^^
.. automodule:: subliminal.exceptions
:members:
+35 -63
View File
@@ -1,77 +1,49 @@
.. subliminal documentation master file, created by
sphinx-quickstart on Tue Feb 28 16:33:06 2012.
sphinx-quickstart on Sat Jul 11 00:40:28 2015.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Subliminal
==========
Release v\ |version|
Welcome to subliminal!
======================
Subliminal is a python library to search and download subtitles.
It comes with an easy to use yet powerful :abbr:`CLI (command-line interface)` suitable for direct use or cron jobs.
It uses video hashes and the powerful `guessit <http://guessit.readthedocs.org/>`_ library
that extracts informations from filenames or filepaths to ensure you have the best subtitles.
It also relies on `enzyme <https://github.com/Diaoul/enzyme>`_ to detect embedded subtitles
and avoid duplicates.
Features
--------
Multiple subtitles services are available:
* OpenSubtitles
* TheSubDB
* BierDopje
* SubsWiki
* Subtitulos
You can use main subliminal's functions with a **file path**, a **file name** or a **folder path**.
CLI
^^^
Download english subtitles::
$ subliminal -l en The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.mp4
**************************************************
Downloaded 1 subtitles
(Episode(u'The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.mp4'), ResultSubtitle(en, opensubtitles, 0.33, The.Big.Bang.Theory.S05E18.HDTV-LOL.srt))
**************************************************
Module
^^^^^^
List english subtitles::
>>> subliminal.list_subtitles('The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.mp4', ['en'])
Multi-threaded use
^^^^^^^^^^^^^^^^^^
Use 4 workers to achieve the same result::
>>> with subliminal.Pool(4) as p:
... p.list_subtitles('The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.mp4', ['en'])
User Guide
----------
This part of the documentation details how to use subliminal for most common tasks
Documentation
-------------
.. toctree::
:maxdepth: 2
user
:maxdepth: 2
Developer Guide
---------------
This part of the documentation explains internal behavior of subliminal and its algorithms
.. toctree::
:maxdepth: 2
dev
user/usage
user/how_it_works
user/cli
user/provider_guide
API Documentation
-----------------
Most common subliminal features are listed here
If you are looking for information on a specific function, class or method, this part of the documentation is for you.
.. automodule:: subliminal
:members:
:noindex:
.. toctree::
:maxdepth: 1
api/api
api/video
api/subtitle
api/providers
api/cache
api/score
api/cli
api/exceptions
License
-------
MIT
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
+263
View File
@@ -0,0 +1,263 @@
@ECHO OFF
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set BUILDDIR=_build
set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
set I18NSPHINXOPTS=%SPHINXOPTS% .
if NOT "%PAPER%" == "" (
set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
)
if "%1" == "" goto help
if "%1" == "help" (
:help
echo.Please use `make ^<target^>` where ^<target^> is one of
echo. html to make standalone HTML files
echo. dirhtml to make HTML files named index.html in directories
echo. singlehtml to make a single large HTML file
echo. pickle to make pickle files
echo. json to make JSON files
echo. htmlhelp to make HTML files and a HTML help project
echo. qthelp to make HTML files and a qthelp project
echo. devhelp to make HTML files and a Devhelp project
echo. epub to make an epub
echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
echo. text to make text files
echo. man to make manual pages
echo. texinfo to make Texinfo files
echo. gettext to make PO message catalogs
echo. changes to make an overview over all changed/added/deprecated items
echo. xml to make Docutils-native XML files
echo. pseudoxml to make pseudoxml-XML files for display purposes
echo. linkcheck to check all external links for integrity
echo. doctest to run all doctests embedded in the documentation if enabled
echo. coverage to run coverage check of the documentation if enabled
goto end
)
if "%1" == "clean" (
for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
del /q /s %BUILDDIR%\*
goto end
)
REM Check if sphinx-build is available and fallback to Python version if any
%SPHINXBUILD% 2> nul
if errorlevel 9009 goto sphinx_python
goto sphinx_ok
:sphinx_python
set SPHINXBUILD=python -m sphinx.__init__
%SPHINXBUILD% 2> nul
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.http://sphinx-doc.org/
exit /b 1
)
:sphinx_ok
if "%1" == "html" (
%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/html.
goto end
)
if "%1" == "dirhtml" (
%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
goto end
)
if "%1" == "singlehtml" (
%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
goto end
)
if "%1" == "pickle" (
%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can process the pickle files.
goto end
)
if "%1" == "json" (
%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can process the JSON files.
goto end
)
if "%1" == "htmlhelp" (
%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can run HTML Help Workshop with the ^
.hhp project file in %BUILDDIR%/htmlhelp.
goto end
)
if "%1" == "qthelp" (
%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can run "qcollectiongenerator" with the ^
.qhcp project file in %BUILDDIR%/qthelp, like this:
echo.^> qcollectiongenerator %BUILDDIR%\qthelp\subliminal.qhcp
echo.To view the help file:
echo.^> assistant -collectionFile %BUILDDIR%\qthelp\subliminal.ghc
goto end
)
if "%1" == "devhelp" (
%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished.
goto end
)
if "%1" == "epub" (
%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The epub file is in %BUILDDIR%/epub.
goto end
)
if "%1" == "latex" (
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
if errorlevel 1 exit /b 1
echo.
echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
goto end
)
if "%1" == "latexpdf" (
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
cd %BUILDDIR%/latex
make all-pdf
cd %~dp0
echo.
echo.Build finished; the PDF files are in %BUILDDIR%/latex.
goto end
)
if "%1" == "latexpdfja" (
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
cd %BUILDDIR%/latex
make all-pdf-ja
cd %~dp0
echo.
echo.Build finished; the PDF files are in %BUILDDIR%/latex.
goto end
)
if "%1" == "text" (
%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The text files are in %BUILDDIR%/text.
goto end
)
if "%1" == "man" (
%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The manual pages are in %BUILDDIR%/man.
goto end
)
if "%1" == "texinfo" (
%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
goto end
)
if "%1" == "gettext" (
%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
goto end
)
if "%1" == "changes" (
%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
if errorlevel 1 exit /b 1
echo.
echo.The overview file is in %BUILDDIR%/changes.
goto end
)
if "%1" == "linkcheck" (
%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
if errorlevel 1 exit /b 1
echo.
echo.Link check complete; look for any errors in the above output ^
or in %BUILDDIR%/linkcheck/output.txt.
goto end
)
if "%1" == "doctest" (
%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
if errorlevel 1 exit /b 1
echo.
echo.Testing of doctests in the sources finished, look at the ^
results in %BUILDDIR%/doctest/output.txt.
goto end
)
if "%1" == "coverage" (
%SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage
if errorlevel 1 exit /b 1
echo.
echo.Testing of coverage in the sources finished, look at the ^
results in %BUILDDIR%/coverage/python.txt.
goto end
)
if "%1" == "xml" (
%SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The XML files are in %BUILDDIR%/xml.
goto end
)
if "%1" == "pseudoxml" (
%SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml.
goto end
)
:end
-113
View File
@@ -1,113 +0,0 @@
There are 4 different ways of using subliminal and each one
is described in a dedicated section below.
First, here are some basics
Basics
------
Services
^^^^^^^^
You can use subliminal with multiple services to get the best result.
Current available services are available in the :data:`subliminal.SERVICES` variable.
.. autodata:: subliminal.SERVICES
Languages
^^^^^^^^^
Subliminal supports multiple languages that are represented with their extended ISO 639-1 code.
The current extensions to the ISO 639-1 are:
* *po* for Brazilian Portuguese
Paths
^^^^^
All paths parameters in subliminal most commont functions can be either *a file path*,
*a file name* or a *folder path*
* File path (existing): hashes of the file will be computed and used during the search for services that supports
this functionnality.
* File name (or non-existing file path): the guessit python library will be used to guess informations and a text-based search will
be done with services.
* Folder path (containing video files): the given folder will be searched for video files using their :data:`~subliminal.videos.MIMETYPES`
and/or :data:`~subliminal.videos.EXTENSIONS`. The default maximum depth to scan is 3
CLI
---
Subliminal is shipped with a basic Command Line Interface that allows you to
download subtitles for one or more videos in a multi-threaded way.
You can have the documentation of the CLI using ``subliminal --help``::
usage: subliminal [-h] [-l LG] [-s NAME] [-m] [-f] [-w N] [-c] [-q | -v]
[--cache-dir DIR | --no-cache-dir] [--version]
PATH [PATH ...]
Subtitles, faster than your thoughts
positional arguments:
PATH path to video file or folder
optional arguments:
-h, --help show this help message and exit
-l LG, --language LG wanted language (ISO 639-1)
-s NAME, --service NAME
service to use
-m, --multi download multiple subtitle languages
-f, --force replace existing subtitle file
-w N, --workers N use N threads (default: 4)
-c, --compatibility try not to use unicode (use this if you have encoding
errors)
-q, --quiet disable output
-v, --verbose verbose output
--cache-dir DIR cache directory to use
--no-cache-dir do not use cache directory (some services may not
work)
--version show program's version number and exit
.. note::
The cache directory defaults to *~/.config/subliminal*. Even on Windows
Simple module use
-----------------
Subliminal comes with two basic functions to search and download subtitles. For example, you
can do::
>>> subliminal.list_subtitles('The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.mp4', ['en'])
.. autofunction:: subliminal.list_subtitles
Or even download missing subtitles for each episodes under the given folders in two different languages::
>>> subliminal.download_subtitles(['/mnt/videos/BBT/Season 05', '/mnt/videos/HIMYM/Season 07'],
... ['en', 'fr'], force=False, multi=True)
.. autofunction:: subliminal.download_subtitles
Multi-threaded module use
-------------------------
You can call the same functions on a :class:`subliminal.Pool` object previously
created with the appropriate number of workers.
.. autoclass:: subliminal.Pool
:members:
You have to call the :meth:`~subliminal.Pool.start` method before any actions and
:meth:`~subliminal.Pool.stop` before exiting your program::
>>> p = subliminal.Pool(4)
... p.start()
... p.list_subtitles('The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.mp4', ['en'])
... p.stop()
To make the use of :class:`~subliminal.Pool` easier, you can use the ``with`` statement
that takes care of that for you::
>>> with subliminal.Pool(4) as p:
... p.list_subtitles('The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.mp4', ['en'])
* from the command line
* basic functions :func:`~subliminal.list_subtitles` and :func:`~subliminal.download_subtitles`
* multi-threaded :class:`~subliminal.async.Pool` which implements the abovementioned functions
* using your own algorithm that produces and gather results of elementary :class:`~subliminal.tasks.Task`
+77
View File
@@ -0,0 +1,77 @@
.. _cli:
CLI
===
subliminal
----------
.. code-block:: none
$ subliminal --help
Usage: subliminal [OPTIONS] COMMAND [ARGS]...
Subtitles, faster than your thoughts.
Options:
--addic7ed USERNAME PASSWORD Addic7ed configuration.
--cache-dir DIRECTORY Path to the cache directory. [default:
~/.config/subliminal]
--debug Print useful information for debugging subliminal and for
reporting bugs.
--version Show the version and exit.
--help Show this message and exit.
Commands:
cache Cache management.
download Download best subtitles.
Suggestions and bug reports are greatly appreciated: https://github.com/Diaoul/subliminal/
subliminal download
-------------------
.. code-block:: none
$ subliminal download --help
Usage: subliminal download [OPTIONS] PATH...
Download best subtitles.
PATH can be an directory containing videos, a video file path or a video file name. It can be
used multiple times.
If an existing subtitle is detected (external or embedded) in the correct language, the
download is skipped for the associated video.
Options:
-l, --language LANGUAGE Language as IETF code, e.g. en, pt-BR (can be used multiple
times). [required]
-p, --provider [addic7ed|opensubtitles|podnapisi|thesubdb|tvsubtitles]
Provider to use (can be used multiple times).
-a, --age AGE Filter videos newer than AGE, e.g. 12h, 1w2d.
-d, --directory DIR Directory where to save subtitles, default is next to the video
file.
-e, --encoding ENC Subtitle file encoding, default is to preserve original
encoding.
-s, --single Save subtitle without language code in the file name, i.e. use
.srt extension.
-f, --force Force download even if a subtitle already exist.
-hi, --hearing-impaired Prefer hearing impaired subtitles.
-m, --min-score INTEGER RANGE Minimum score for a subtitle to be downloaded (0 to 100).
-v, --verbose Increase verbosity.
--help Show this message and exit.
subliminal cache
----------------
.. code-block:: none
$ subliminal cache --help
Usage: subliminal cache [OPTIONS]
Cache management.
Options:
--clear-subliminal Clear subliminal's cache. Use this ONLY if your cache is corrupted or if
you experience issues.
--help Show this message and exit.
+48
View File
@@ -0,0 +1,48 @@
How it works
============
Providers
---------
Subliminal uses multiple providers to give users a vast choice and have a better chance to find the best matching
subtitles. Current supported providers are:
* Addic7ed
* OpenSubtitles
* Podnapisi
* TheSubDB
* TvSubtitles
Providers all inherit the same :class:`~subliminal.providers.Provider` base class and thus share the same API.
They are registered on the ``subliminal.providers`` entry point and are exposed through the
:data:`~subliminal.api.provider_manager` for easy access.
To make working with multiple providers seamlessly, the :class:`~subliminal.api.ProviderPool` exposes the same API but
distributes it to its providers.
.. _scoring:
Scoring
-------
Rating subtitles and comparing them is probably the most difficult part and this is where subliminal excels with its
powerful scoring algorithm.
Using `guessit <http://guessit.readthedocs.org>`_ and `enzyme <http://enzyme.readthedocs.org>`_, subliminal extracts
properties of the video and match them with the properties of the subtitles found with the providers.
Equations in :mod:`subliminal.score` give a score to each property (called a match). The more matches the video and
the subtitle have the higher the score computed with :func:`~subliminal.subtitle.compute_score` gets.
Libraries
---------
Various libraries are used by subliminal and are key to its success:
* `guessit <http://guessit.readthedocs.org>`_ to guess informations from filenames
* `enzyme <http://enzyme.readthedocs.org>`_ to detect embedded subtitles in videos and read other video metadata
* `babelfish <http://babelfish.readthedocs.org>`_ to work with languages
* `requests <http://docs.python-requests.org>`_ to make human readable HTTP requests
* `BeautifulSoup <http://www.crummy.com/software/BeautifulSoup>`_ to parse HTML and XML
* `dogpile.cache <http://dogpilecache.readthedocs.org>`_ to cache intermediate search results
* `stevedore <http://docs.openstack.org/developer/stevedore/>`_ to manage the provider entry point
* `chardet <http://chardet.readthedocs.org>`_ to detect subtitles' encoding
* `pysrt <https://github.com/byroot/pysrt>`_ to validate downloaded subtitles
+102
View File
@@ -0,0 +1,102 @@
Provider Guide
==============
This guide is going to explain how to add a :class:`~subliminal.providers.Provider` to subliminal. You are encouraged
to take a look at the existing providers, it can be a nice base to start your own provider.
Requirements
------------
When starting a provider you should be able to answer to the following questions:
* What languages does my provider support?
* What are the language codes for the supported languages?
* Does my provider deliver subtitles for episodes? for movies?
* Does my provider require a video hash?
Each response of these questions will help you set the correct attributes for your
:class:`~subliminal.providers.Provider`.
Video Validation
----------------
Not all providers deliver subtitles for :class:`~subliminal.video.Episode`. Some may require a hash.
The :meth:`~subliminal.providers.Provider.check` method does validation against a :class:`~subliminal.video.Video`
object and will return `False` if the given :class:`~subliminal.video.Video` isn't suitable. If you're not happy
with the default implementation, you can override it.
Configuration
-------------
API keys must not be configurable by the user and must remain linked to subliminal. Hence they must be written
in the provider module.
Per-user authentication is allowed and must be configured at instantiation as keyword arguments. Configuration
will be done by the user through the `provider_configs` argument of the :func:`~subliminal.api.list_subtitles` and
:func:`~subliminal.api.download_best_subtitles` functions. No network operation must be done during instantiation,
only configuration. Any error in the configuration must raise a
:class:`~subliminal.exceptions.ConfigurationError`.
Beyond this point, if an error occurs, a generic :class:`~subliminal.exceptions.ProviderError` exception
must be raised. You can also use more explicit exception classes :class:`~subliminal.exceptions.AuthenticationError`
and :class:`~subliminal.exceptions.DownloadLimitExceeded`.
Initialization / Termination
----------------------------
Actual authentication operations must take place in the :meth:`~subliminal.providers.Provider.initialize` method.
If you need anything to be executed when the provider isn't used anymore like logout,
use :meth:`~subliminal.providers.Provider.terminate`.
Caching policy
--------------
To save bandwidth and improve querying time, intermediate data should be cached when possible. Typical use case is
when a query to retrieve show ids is required prior to the query to actually search for subtitles. In that case
the function that gets the show id from the show name must be cached.
Expiration time should be :data:`~subliminal.cache.SHOW_EXPIRATION_TIME` for shows and
:data:`~subliminal.cache.EPISODE_EXPIRATION_TIME` for episodes.
Language
--------
To be able to handle various language codes, subliminal makes use of `babelfish <http://babelfish.readthedocs.org>`_
Language and converters. You must set the attribute :attr:`~subliminal.providers.Provider.languages` with a set of
supported :class:`~babelfish.language.Language`.
If you cannot find a suitable converter for your provider, you can `make one of your own
<http://babelfish.readthedocs.org/en/latest/#custom-converters>`_.
Querying
--------
The :meth:`~subliminal.providers.Provider.query` method parameters must include all aspects of provider's querying with
primary types.
Subtitle
--------
A custom :class:`~subliminal.subtitle.Subtitle` subclass must be created to represent a subtitle from the provider.
It must have relevant attributes that can be used to compute the matches of the subtitle against a
:class:`~subliminal.video.Video` object.
Score computation
-----------------
To be able to compare subtitles coming from different providers between them, the
:meth:`~subliminal.subtitle.Subtitle.get_matches` method must be implemented.
If `guessit <http://guessit.readthedocs.org>`_ is used to extract data from the
:class:`~subliminal.subtitle.Subtitle` subclass, you can use :func:`~subliminal.subtitle.guess_matches`
as a helper to compute matches between the :class:`~subliminal.video.Video` and the :class:`~guessit.guess.Guess`.
Refer to the `scores` attribute of :class:`~subliminal.video.Episode` and :class:`~subliminal.video.Movie`
for a list of possible matches.
Unittesting
-----------
All possible uses of :meth:`~subliminal.providers.Provider.query`,
:meth:`~subliminal.providers.Provider.list_subtitles` and :meth:`~subliminal.providers.Provider.download_subtitle`
methods must have integration tests. Use `vcrpy <https://github.com/kevin1024/vcrpy>`_ for recording and playback
of network activity.
Other functions must be unittested. If necessary, you can use :mod:`unittest.mock` to mock some functions.
+144
View File
@@ -0,0 +1,144 @@
Usage
=====
CLI
---
Download English subtitles::
$ subliminal download -l en The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.mp4
Collecting videos [####################################] 100%
1 video collected / 0 video ignored
Downloading subtitles [####################################] 100%
Downloaded 1 subtitle
.. warning::
For cron usage, make sure to specify a maximum age (with ``--age``) so subtitles are searched for recent videos
only. Otherwise you will get banned from the providers for abuse due to too many requests. If subliminal didn't
find subtitles for an old video, it's unlikely it will find subtitles for that video ever anyway.
See :ref:`cli` for more details on the available commands and options.
High level API
--------------
You can call subliminal in many different ways depending on how much control you want over the process. For most use
cases, you can stick to the standard API.
Common
^^^^^^
Let's start by importing subliminal:
>>> from __future__ import unicode_literals
>>> import os
>>> from babelfish import *
>>> from subliminal import *
Before going further, there are a few things to know about subliminal.
Video
^^^^^
The :class:`~subliminal.video.Movie` and :class:`~subliminal.video.Episode` classes represent a video,
existing or not. You can create a video by name (or path) with :meth:`Video.fromname <subliminal.video.Video.fromname>`,
use :func:`~subliminal.video.scan_video` on an existing file path to get even more information about the video or
use :func:`~subliminal.video.scan_videos` on an existing directory path to scan a whole directory for videos.
>>> video = Video.fromname('The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.mp4')
>>> video
<Episode ['The Big Bang Theory', 5x18]>
Here video informations were guessed based on the name of the video, you can access some video attributes:
>>> video.video_codec
'h264'
>>> video.release_group
'LOL'
Configuration
^^^^^^^^^^^^^
Before proceeding to listing and downloading subtitles, you need to configure the cache. Subliminal uses a cache to
reduce repeated queries to providers and improve overall performance with no impact on search quality. For the sake
of this example, we're going to use a memory backend.
>>> my_region = region.configure('dogpile.cache.memory')
.. warning::
Choose a cache that fits your application and prefer persistant over volatile backends. The ``file`` backend is
usually a good choice.
See `dogpile.cache's documentation <http://dogpilecache.readthedocs.org>`_ for more details on backends.
Now that we're done with the basics, let's have some *real* fun.
Listing
^^^^^^^
To list subtitles, subliminal provides a :func:`~subliminal.api.list_subtitles` function that will return all found
subtitles:
>>> subtitles = list_subtitles([video], {Language('hun')}, providers=['podnapisi'])
>>> subtitles[video]
[<PodnapisiSubtitle 'ZtAW' [hu]>, <PodnapisiSubtitle 'ONAW' [hu]>]
.. note::
As you noticed, all parameters are iterables but only contain one item which means you can deal with a lot of
videos, languages and providers at the same time. For the sake of this example, we filter providers to use only one,
pass ``providers=None`` (default) to search on all providers.
Scoring
^^^^^^^
It's usual you have multiple candidates for subtitles. To help you chose which one to download, subliminal can compare
them to the video and tell you exactly what matches with :meth:`~subliminal.subtitle.Subtitle.get_matches`:
>>> for s in subtitles[video]:
... sorted(s.get_matches(video))
['episode', 'format', 'hearing_impaired', 'release_group', 'season', 'series', 'video_codec', 'year']
['episode', 'format', 'hearing_impaired', 'season', 'series', 'year']
And then compute a score with those matches with :func:`~subliminal.subtitle.compute_score`:
>>> for s in subtitles[video]:
... {s: compute_score(s.get_matches(video), video)}
{<PodnapisiSubtitle 'ZtAW' [hu]>: 132}
{<PodnapisiSubtitle 'ONAW' [hu]>: 117}
Now you should have a better idea about which one you should choose.
Downloading
^^^^^^^^^^^
We can settle on the first subtitle and download its content using :func:`~subliminal.api.download_subtitles`:
>>> subtitle = subtitles[video][0]
>>> subtitle.content is None
True
>>> download_subtitles([subtitle])
>>> subtitle.content.split(b'\n')[2]
b'Elszaladok a boltba'
If you want a string instead of bytes, you can access decoded content with the
:attr:`~subliminal.subtitle.Subtitle.text` property:
>>> subtitle.text.split('\n')[3]
'néhány apróságért.'
Downloading best subtitles
^^^^^^^^^^^^^^^^^^^^^^^^^^
Downloading best subtitles is what you want to do in almost all cases, as a shortcut for listing, scoring and
downloading you can use :func:`~subliminal.api.download_best_subtitles`:
>>> best_subtitles = download_best_subtitles([video], {Language('hun')}, providers=['podnapisi'])
>>> best_subtitles[video]
[<PodnapisiSubtitle 'ZtAW' [hu]>]
>>> best_subtitle = best_subtitles[video][0]
>>> best_subtitle.content.split(b'\n')[2]
b'Elszaladok a boltba'
We end up with the same subtitle but with one line of code. Neat.
Save
^^^^
We got ourselves a nice subtitle now we can save it on the file system using :func:`~subliminal.api.save_subtitles`:
>>> save_subtitles(video, [best_subtitle])
[<PodnapisiSubtitle 'ZtAW' [hu]>]
>>> os.listdir()
['The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.hu.srt']
+1 -4
View File
@@ -1,4 +1 @@
BeautifulSoup>=3.2.0
guessit>=0.2
requests
enzyme>=0.1
-e .
-79
View File
@@ -1,79 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright 2011-2012 Antoine Bertin <diaoulael@gmail.com>
#
# This file is part of subliminal.
#
# subliminal is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# subliminal is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with subliminal. If not, see <http://www.gnu.org/licenses/>.
import argparse
import subliminal
import logging
import os
import sys
def main():
parser = argparse.ArgumentParser(description='Subtitles, faster than your thoughts')
parser.add_argument('-l', '--language', action='append', dest='languages', help='wanted language (ISO 639-1)', metavar='LG')
parser.add_argument('-s', '--service', action='append', dest='services', help='service to use', metavar='NAME')
parser.add_argument('-m', '--multi', action='store_true', help='download multiple subtitle languages')
parser.add_argument('-f', '--force', action='store_true', help='replace existing subtitle file')
parser.add_argument('-w', '--workers', action='store', help='use N threads (default: %(default)s)', metavar='N', default=4)
parser.add_argument('-c', '--compatibility', action='store_true', help='try not to use unicode (use this if you have encoding errors)')
group_verbosity = parser.add_mutually_exclusive_group()
group_verbosity.add_argument('-q', '--quiet', action='store_true', help='disable output')
group_verbosity.add_argument('-v', '--verbose', action='store_true', help='verbose output')
group_cache = parser.add_mutually_exclusive_group()
group_cache.add_argument('--cache-dir', action='store', dest='cache_dir', help='cache directory to use', metavar='DIR', default=os.path.expanduser('~/.config/subliminal'))
group_cache.add_argument('--no-cache-dir', action='store_false', dest='cache_dir', help='do not use cache directory (some services may not work)')
parser.add_argument('--version', action='version', version=subliminal.__version__)
parser.add_argument('paths', nargs='+', help='path to video file or folder', metavar='PATH')
args = parser.parse_args()
# Set log verbosity
if args.verbose:
logging.basicConfig(level=logging.DEBUG, format='%(levelname)-8s %(asctime)s %(name)-24s %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
elif not args.quiet:
logging.basicConfig(level=logging.WARN, format='%(levelname)s: %(name)s %(message)s')
# Create cache directory
if not os.path.exists(args.cache_dir):
os.mkdir(args.cache_dir)
# Compatibility mode
if args.compatibility:
paths = args.paths
else:
paths = [unicode(x) for x in args.paths]
# Download subtitles
with subliminal.Pool(args.workers) as p:
subtitles = p.download_subtitles(paths, languages=args.languages,
services=args.services, cache_dir=args.cache_dir,
force=args.force, multi=args.multi)
if not subtitles:
if not args.quiet:
sys.stderr.write('No subtitles found\n')
exit(1)
if not args.quiet:
print '*' * 50
print 'Downloaded %d subtitles' % len(subtitles)
for subtitle in subtitles:
print subtitle
print '*' * 50
if __name__ == '__main__':
main()
+12
View File
@@ -5,3 +5,15 @@ all_files = 1
[upload_sphinx]
upload-dir = docs/_build/html
[pytest]
norecursedirs = build dist env .tox .eggs
addopts = --pep8 --flakes --doctest-glob='*.rst'
pep8maxlinelength = 120
pep8ignore =
docs/conf.py ALL
subliminal/__init__.py E402
flakes-ignore =
docs/conf.py ALL
subliminal/__init__.py UnusedImport
doctest_optionflags= NORMALIZE_WHITESPACE IGNORE_EXCEPTION_DETAIL
+95 -39
View File
@@ -1,46 +1,102 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright 2011-2012 Antoine Bertin <diaoulael@gmail.com>
#
# This file is part of subliminal.
#
# subliminal is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# subliminal is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with subliminal. If not, see <http://www.gnu.org/licenses/>.
import os.path
import io
import re
import sys
from setuptools import setup, find_packages
from setuptools.command.test import test as TestCommand
def read(fname):
return open(os.path.join(os.path.dirname(__file__), fname)).read()
class PyTest(TestCommand):
user_options = [('pytest-args=', 'a', 'Arguments to pass to py.test')]
def initialize_options(self):
TestCommand.initialize_options(self)
self.pytest_args = []
def finalize_options(self):
TestCommand.finalize_options(self)
self.test_args = []
self.test_suite = True
def run_tests(self):
# import here, cause outside the eggs aren't loaded
import pytest
errno = pytest.main(self.pytest_args)
sys.exit(errno)
# requirements
install_requirements = ['guessit>=0.9.1', 'babelfish>=0.5.2', 'enzyme>=0.4.1', 'beautifulsoup4>=4.2.0',
'requests>=2.0', 'click>=4.0', 'dogpile.cache>=0.5.4', 'stevedore>=1.0.0',
'chardet>=2.3.0', 'pysrt>=1.0.1', 'six>=1.9.0']
test_requirements = ['sympy', 'vcrpy>=1.6.1', 'pytest', 'pytest-pep8', 'pytest-flakes',
'pytest-cov']
if sys.version_info < (3, 3):
test_requirements.append('mock')
dev_requirements = ['tox', 'sphinx', 'wheel']
# package informations
with io.open('subliminal/__init__.py', 'r') as f:
version = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]$', f.read(),
re.MULTILINE).group(1)
if not version:
raise RuntimeError('Cannot find version information')
with io.open('README.rst', 'r', encoding='utf-8') as f:
readme = f.read()
with io.open('HISTORY.rst', 'r', encoding='utf-8') as f:
history = f.read()
execfile(os.path.join(os.path.dirname(__file__), 'subliminal', 'infos.py'))
setup(name='subliminal',
version=__version__,
license='LGPLv3',
description='Subtitles, faster than your thoughts',
long_description=read('README.rst') + '\n\n' + read('NEWS.rst'),
classifiers=['Development Status :: 4 - Beta',
'License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)',
'Intended Audience :: Developers',
'Operating System :: OS Independent',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
'Topic :: Software Development :: Libraries :: Python Modules',
'Topic :: Multimedia :: Video'],
keywords='subtitle subtitles video movie episode tv show',
author='Antoine Bertin',
author_email='diaoulael@gmail.com',
url='https://github.com/Diaoul/subliminal',
packages=find_packages(),
scripts=['scripts/subliminal'],
install_requires=['BeautifulSoup >= 3.2.0', 'guessit >= 0.2', 'requests', 'enzyme >= 0.1'])
version=version,
license='MIT',
description='Subtitles, faster than your thoughts',
long_description=readme + '\n\n' + history,
keywords='subtitle subtitles video movie episode tv show',
url='https://github.com/Diaoul/subliminal',
author='Antoine Bertin',
author_email='diaoulael@gmail.com',
packages=find_packages(),
classifiers=[
'Development Status :: 5 - Production/Stable',
'Intended Audience :: Developers',
'License :: OSI Approved :: MIT License',
'Operating System :: OS Independent',
'Programming Language :: Python',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4',
'Topic :: Software Development :: Libraries :: Python Modules',
'Topic :: Multimedia :: Video'
],
entry_points={
'subliminal.providers': [
'addic7ed = subliminal.providers.addic7ed:Addic7edProvider',
'opensubtitles = subliminal.providers.opensubtitles:OpenSubtitlesProvider',
'podnapisi = subliminal.providers.podnapisi:PodnapisiProvider',
'thesubdb = subliminal.providers.thesubdb:TheSubDBProvider',
'tvsubtitles = subliminal.providers.tvsubtitles:TVsubtitlesProvider'
],
'babelfish.language_converters': [
'addic7ed = subliminal.converters.addic7ed:Addic7edConverter',
'tvsubtitles = subliminal.converters.tvsubtitles:TVsubtitlesConverter'
],
'console_scripts': [
'subliminal = subliminal.cli:subliminal'
]
},
install_requires=install_requirements,
tests_require=test_requirements,
extras_require={
'test': test_requirements,
'dev': dev_requirements
},
cmdclass={'test': PyTest})
+14 -30
View File
@@ -1,34 +1,18 @@
# -*- coding: utf-8 -*-
# Copyright 2011-2012 Antoine Bertin <diaoulael@gmail.com>
#
# This file is part of subliminal.
#
# subliminal is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# subliminal is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with subliminal. If not, see <http://www.gnu.org/licenses/>.
from .api import list_subtitles, download_subtitles
from .async import Pool
from .core import (SERVICES, LANGUAGE_INDEX, SERVICE_INDEX, SERVICE_CONFIDENCE,
MATCHING_CONFIDENCE)
from .infos import __version__
__title__ = 'subliminal'
__version__ = '1.0.1'
__author__ = 'Antoine Bertin'
__license__ = 'MIT'
__copyright__ = 'Copyright 2015, Antoine Bertin'
import logging
try:
from logging import NullHandler
except ImportError:
class NullHandler(logging.Handler):
def emit(self, record):
pass
from .api import (ProviderPool, check_video, provider_manager, download_best_subtitles, download_subtitles,
list_subtitles, save_subtitles)
from .cache import region
from .exceptions import Error, ProviderError
from .providers import Provider
from .subtitle import Subtitle, compute_score
from .video import SUBTITLE_EXTENSIONS, VIDEO_EXTENSIONS, Episode, Movie, Video, scan_video, scan_videos
__all__ = ['SERVICES', 'LANGUAGE_INDEX', 'SERVICE_INDEX', 'SERVICE_CONFIDENCE',
'MATCHING_CONFIDENCE', 'list_subtitles', 'download_subtitles', 'Pool']
logging.getLogger(__name__).addHandler(NullHandler())
logging.getLogger(__name__).addHandler(logging.NullHandler())
+398 -83
View File
@@ -1,100 +1,415 @@
# -*- coding: utf-8 -*-
# Copyright 2011-2012 Antoine Bertin <diaoulael@gmail.com>
#
# This file is part of subliminal.
#
# subliminal is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# subliminal is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with subliminal. If not, see <http://www.gnu.org/licenses/>.
from .core import (SERVICES, LANGUAGE_INDEX, SERVICE_INDEX, SERVICE_CONFIDENCE,
MATCHING_CONFIDENCE, create_list_tasks, consume_task, create_download_tasks,
group_by_video, key_subtitles)
from .languages import list_languages
from __future__ import unicode_literals
from collections import defaultdict
import io
import logging
import operator
import os.path
import socket
from babelfish import Language
import requests
from stevedore import EnabledExtensionManager, ExtensionManager
from .subtitle import compute_score, get_subtitle_path
__all__ = ['list_subtitles', 'download_subtitles']
logger = logging.getLogger(__name__)
provider_manager = ExtensionManager('subliminal.providers')
def list_subtitles(paths, languages=None, services=None, force=True, multi=False, cache_dir=None, max_depth=3):
"""List subtitles in given paths according to the criteria
:param paths: path(s) to video file or folder
:type paths: string or list
:param list languages: languages to search for, in preferred order
:param list services: services to use for the search, in preferred order
:param bool force: force searching for subtitles even if some are detected
:param bool multi: search multiple languages for the same video
:param string cache_dir: path to the cache directory to use
:param int max_depth: maximum depth for scanning entries
:return: found subtitles
:rtype: dict of :class:`~subliminal.videos.Video` => [:class:`~subliminal.subtitles.ResultSubtitle`]
class ProviderPool(object):
"""A pool of providers with the same API as a single :class:`~subliminal.providers.Provider`.
It has a few extra features:
* Lazy loads providers when needed and supports the :keyword:`with` statement to :meth:`terminate`
the providers on exit.
* Automatically discard providers on failure.
:param providers: name of providers to use, if not all.
:type providers: list
:param dict provider_configs: provider configuration as keyword arguments per provider name to pass when
instanciating the :class:`~subliminal.providers.Provider`.
"""
services = services or SERVICES
languages = set(languages or list_languages(1))
if isinstance(paths, basestring):
paths = [paths]
if any([not isinstance(p, unicode) for p in paths]):
logger.warning(u'Not all entries are unicode')
results = []
service_instances = {}
tasks = create_list_tasks(paths, languages, services, force, multi, cache_dir, max_depth)
for task in tasks:
def __init__(self, providers=None, provider_configs=None):
#: Name of providers to use
self.providers = providers or provider_manager.names()
#: Provider configuration
self.provider_configs = provider_configs or {}
#: Initialized providers
self.initialized_providers = {}
#: Discarded providers
self.discarded_providers = set()
#: Dedicated :data:`provider_manager` as :class:`~stevedore.enabled.EnabledExtensionManager`
self.manager = EnabledExtensionManager(provider_manager.namespace, lambda e: e.name in self.providers)
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
self.terminate()
def __getitem__(self, name):
if name not in self.initialized_providers:
logger.info('Initializing provider %s', name)
provider = self.manager[name].plugin(**self.provider_configs.get(name, {}))
provider.initialize()
self.initialized_providers[name] = provider
return self.initialized_providers[name]
def __delitem__(self, name):
if name not in self.initialized_providers:
raise KeyError(name)
try:
result = consume_task(task, service_instances)
results.append((task.video, result))
logger.info('Terminating provider %s', name)
self.initialized_providers[name].terminate()
except (requests.Timeout, socket.timeout):
logger.error('Provider %r timed out, improperly terminated', name)
except:
logger.error(u'Error consuming task %r' % task, exc_info=True)
for service_instance in service_instances.itervalues():
service_instance.terminate()
return group_by_video(results)
logger.exception('Provider %r terminated unexpectedly', name)
del self.initialized_providers[name]
def __iter__(self):
return iter(self.initialized_providers)
def list_subtitles(self, video, languages):
"""List subtitles.
:param video: video to list subtitles for.
:type video: :class:`~subliminal.video.Video`
:param languages: languages to search for.
:type languages: set of :class:`~babelfish.language.Language`
:return: found subtitles.
:rtype: list of :class:`~subliminal.subtitle.Subtitle`
"""
subtitles = []
for name in self.providers:
# check discarded providers
if name in self.discarded_providers:
logger.debug('Skipping discarded provider %r', name)
continue
# check video validity
if not self.manager[name].plugin.check(video):
logger.info('Skipping provider %r: not a valid video', name)
continue
# check supported languages
provider_languages = self.manager[name].plugin.languages & languages
if not provider_languages:
logger.info('Skipping provider %r: no language to search for', name)
continue
# list subtitles
logger.info('Listing subtitles with provider %r and languages %r', name, provider_languages)
try:
provider_subtitles = self[name].list_subtitles(video, provider_languages)
except (requests.Timeout, socket.timeout):
logger.error('Provider %r timed out, discarding it', name)
self.discarded_providers.add(name)
continue
except:
logger.exception('Unexpected error in provider %r, discarding it', name)
self.discarded_providers.add(name)
continue
subtitles.extend(provider_subtitles)
return subtitles
def download_subtitle(self, subtitle):
"""Download `subtitle`'s :attr:`~subliminal.subtitle.Subtitle.content`.
:param subtitle: subtitle to download.
:type subtitle: :class:`~subliminal.subtitle.Subtitle`
:return: `True` if the subtitle has been successfully downloaded, `False` otherwise.
:rtype: bool
"""
# check discarded providers
if subtitle.provider_name in self.discarded_providers:
logger.warning('Provider %r is discarded', subtitle.provider_name)
return False
logger.info('Downloading subtitle %r', subtitle)
try:
self[subtitle.provider_name].download_subtitle(subtitle)
except (requests.Timeout, socket.timeout):
logger.error('Provider %r timed out, discarding it', subtitle.provider_name)
self.discarded_providers.add(subtitle.provider_name)
return False
except:
logger.exception('Unexpected error in provider %r, discarding it', subtitle.provider_name)
self.discarded_providers.add(subtitle.provider_name)
return False
# check subtitle validity
if not subtitle.is_valid():
logger.error('Invalid subtitle')
return False
return True
def download_best_subtitles(self, subtitles, video, languages, min_score=0, hearing_impaired=False, only_one=False,
scores=None):
"""Download the best matching subtitles.
:param subtitles: the subtitles to use.
:type subtitles: list of :class:`~subliminal.subtitle.Subtitle`
:param video: video to download subtitles for.
:type video: :class:`~subliminal.video.Video`
:param languages: languages to download.
:type languages: set of :class:`~babelfish.language.Language`
:param int min_score: minimum score for a subtitle to be downloaded.
:param bool hearing_impaired: hearing impaired preference.
:param bool only_one: download only one subtitle, not one per language.
:param dict scores: scores to use, if `None`, the :attr:`~subliminal.video.Video.scores` from the video are
used.
:return: downloaded subtitles.
:rtype: list of :class:`~subliminal.subtitle.Subtitle`
"""
# sort subtitles by score
scored_subtitles = sorted([(s, compute_score(s.get_matches(video, hearing_impaired=hearing_impaired), video,
scores=scores))
for s in subtitles], key=operator.itemgetter(1), reverse=True)
# download best subtitles, falling back on the next on error
downloaded_subtitles = []
for subtitle, score in scored_subtitles:
# check score
if score < min_score:
logger.info('Score %d is below min_score (%d)', (score, min_score))
break
# check downloaded languages
if subtitle.language in set(s.language for s in downloaded_subtitles):
logger.debug('Skipping subtitle: %r already downloaded', subtitle.language)
continue
# download
logger.info('Downloading subtitle %r with score %d', subtitle, score)
if self.download_subtitle(subtitle):
downloaded_subtitles.append(subtitle)
# stop when all languages are downloaded
if set(s.language for s in downloaded_subtitles) == languages:
logger.debug('All languages downloaded')
break
# stop if only one subtitle is requested
if only_one:
logger.debug('Only one subtitle downloaded')
break
return downloaded_subtitles
def terminate(self):
"""Terminate all the :attr:`initialized_providers`."""
logger.debug('Terminating initialized providers')
for name in list(self.initialized_providers):
del self[name]
def download_subtitles(paths, languages=None, services=None, force=True, multi=False, cache_dir=None, max_depth=3, order=None):
"""Download subtitles in given paths according to the criteria
def check_video(video, languages=None, age=None, undefined=False):
"""Perform some checks on the `video`.
:param paths: path(s) to video file or folder
:type paths: string or list
:param list languages: languages to search for, in preferred order
:param list services: services to use for the search, in preferred order
:param bool force: force searching for subtitles even if some are detected
:param bool multi: search multiple languages for the same video
:param string cache_dir: path to the cache directory to use
:param int max_depth: maximum depth for scanning entries
:param order: preferred order for subtitles sorting
:type list: list of :data:`~subliminal.core.LANGUAGE_INDEX`, :data:`~subliminal.core.SERVICE_INDEX`, :data:`~subliminal.core.SERVICE_CONFIDENCE`, :data:`~subliminal.core.MATCHING_CONFIDENCE`
:return: found subtitles
:rtype: list of (:class:`~subliminal.videos.Video`, [:class:`~subliminal.subtitles.ResultSubtitle`])
All the checks are optional. Return `False` if any of this check fails:
* `languages` already exist in `video`'s :attr:`~subliminal.video.Video.subtitle_languages`.
* `video` is older than `age`.
* `video` has an `undefined` language in :attr:`~subliminal.video.Video.subtitle_languages`.
:param video: video to check.
:type video: :class:`~subliminal.video.Video`
:param languages: desired languages.
:type languages: set of :class:`~babelfish.language.Language`
:param datetime.timedelta age: maximum age of the video.
:param bool undefined: fail on existing undefined language.
:return: `True` if the video passes the checks, `False` otherwise.
:rtype: bool
"""
services = services or SERVICES
languages = languages or list_languages(1)
if isinstance(paths, basestring):
paths = [paths]
order = order or [LANGUAGE_INDEX, SERVICE_INDEX, SERVICE_CONFIDENCE, MATCHING_CONFIDENCE]
subtitles_by_video = list_subtitles(paths, set(languages), services, force, multi, cache_dir, max_depth)
for video, subtitles in subtitles_by_video.iteritems():
subtitles.sort(key=lambda s: key_subtitles(s, video, languages, services, order), reverse=True)
results = []
service_instances = {}
tasks = create_download_tasks(subtitles_by_video, multi)
for task in tasks:
try:
result = consume_task(task, service_instances)
results.append(result)
except:
logger.error(u'Error consuming task %r' % task, exc_info=True)
for service_instance in service_instances.itervalues():
service_instance.terminate()
return results
# language test
if languages and not (languages - video.subtitle_languages):
logger.debug('All languages %r exist', languages)
return False
# age test
if age and video.age > age:
logger.debug('Video is older than %r', age)
return False
# undefined test
if undefined and Language('und') in video.subtitle_languages:
logger.debug('Undefined language found')
return False
return True
def list_subtitles(videos, languages, **kwargs):
"""List subtitles.
The `videos` must pass the `languages` check of :func:`check_video`.
All other parameters are passed onwards to the :class:`ProviderPool` constructor.
:param videos: videos to list subtitles for.
:type videos: set of :class:`~subliminal.video.Video`
:param languages: languages to search for.
:type languages: set of :class:`~babelfish.language.Language`
:return: found subtitles per video.
:rtype: dict of :class:`~subliminal.video.Video` to list of :class:`~subliminal.subtitle.Subtitle`
"""
listed_subtitles = defaultdict(list)
# check videos
checked_videos = []
for video in videos:
if not check_video(video, languages=languages):
logger.info('Skipping video %r', video)
continue
checked_videos.append(video)
# return immediatly if no video passed the checks
if not checked_videos:
return listed_subtitles
# list subtitles
with ProviderPool(**kwargs) as pool:
for video in checked_videos:
logger.info('Listing subtitles for %r', video)
subtitles = pool.list_subtitles(video, languages - video.subtitle_languages)
listed_subtitles[video].extend(subtitles)
logger.info('Found %d subtitle(s)', len(subtitles))
return listed_subtitles
def download_subtitles(subtitles, **kwargs):
"""Download :attr:`~subliminal.subtitle.Subtitle.content` of `subtitles`.
All other parameters are passed onwards to the :class:`ProviderPool` constructor.
:param subtitles: subtitles to download.
:type subtitles: list of :class:`~subliminal.subtitle.Subtitle`
"""
with ProviderPool(**kwargs) as pool:
for subtitle in subtitles:
logger.info('Downloading subtitle %r', subtitle)
pool.download_subtitle(subtitle)
def download_best_subtitles(videos, languages, min_score=0, hearing_impaired=False, only_one=False, scores=None,
**kwargs):
"""List and download the best matching subtitles.
The `videos` must pass the `languages` and `undefined` (`only_one`) checks of :func:`check_video`.
All other parameters are passed onwards to the :class:`ProviderPool` constructor.
:param videos: videos to download subtitles for.
:type videos: set of :class:`~subliminal.video.Video`
:param languages: languages to download.
:type languages: set of :class:`~babelfish.language.Language`
:param int min_score: minimum score for a subtitle to be downloaded.
:param bool hearing_impaired: hearing impaired preference.
:param bool only_one: download only one subtitle, not one per language.
:param dict scores: scores to use, if `None`, the :attr:`~subliminal.video.Video.scores` from the video are used.
:return: downloaded subtitles per video.
:rtype: dict of :class:`~subliminal.video.Video` to list of :class:`~subliminal.subtitle.Subtitle`
"""
downloaded_subtitles = defaultdict(list)
# check videos
checked_videos = []
for video in videos:
if not check_video(video, languages=languages, undefined=only_one):
logger.info('Skipping video %r')
continue
checked_videos.append(video)
# return immediatly if no video passed the checks
if not checked_videos:
return downloaded_subtitles
# download best subtitles
with ProviderPool(**kwargs) as pool:
for video in checked_videos:
logger.info('Downloading best subtitles for %r', video)
subtitles = pool.download_best_subtitles(pool.list_subtitles(video, languages - video.subtitle_languages),
video, languages, min_score=min_score,
hearing_impaired=hearing_impaired, only_one=only_one,
scores=scores)
logger.info('Downloaded %d subtitle(s)', len(subtitles))
downloaded_subtitles[video].extend(subtitles)
return downloaded_subtitles
def save_subtitles(video, subtitles, single=False, directory=None, encoding=None):
"""Save subtitles on filesystem.
Subtitles are saved in the order of the list. If a subtitle with a language has already been saved, other subtitles
with the same language are silently ignored.
The extension used is `.lang.srt` by default or `.srt` is `single` is `True`, with `lang` being the IETF code for
the :attr:`~subliminal.subtitle.Subtitle.language` of the subtitle.
:param video: video of the subtitles.
:type video: :class:`~subliminal.video.Video`
:param subtitles: subtitles to save.
:type subtitles: list of :class:`~subliminal.subtitle.Subtitle`
:param bool single: save a single subtitle, default is to save one subtitle per language.
:param str directory: path to directory where to save the subtitles, default is next to the video.
:param str encoding: encoding in which to save the subtitles, default is to keep original encoding.
:return: the saved subtitles
:rtype: list of :class:`~subliminal.subtitle.Subtitle`
"""
saved_subtitles = []
for subtitle in subtitles:
# check content
if subtitle.content is None:
logger.error('Skipping subtitle %r: no content', subtitle)
continue
# check language
if subtitle.language in set(s.language for s in saved_subtitles):
logger.debug('Skipping subtitle %r: language already saved', subtitle)
continue
# create subtitle path
subtitle_path = get_subtitle_path(video.name, None if single else subtitle.language)
if directory is not None:
subtitle_path = os.path.join(directory, os.path.split(subtitle_path)[1])
# save content as is or in the specified encoding
logger.info('Saving %r to %r', subtitle, subtitle_path)
if encoding is None:
with io.open(subtitle_path, 'wb') as f:
f.write(subtitle.content)
else:
with io.open(subtitle_path, 'w', encoding=encoding) as f:
f.write(subtitle.text)
saved_subtitles.append(subtitle)
# check single
if single:
break
return saved_subtitles
-141
View File
@@ -1,141 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2011-2012 Antoine Bertin <diaoulael@gmail.com>
#
# This file is part of subliminal.
#
# subliminal is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# subliminal is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with subliminal. If not, see <http://www.gnu.org/licenses/>.
from .core import (consume_task, LANGUAGE_INDEX, SERVICE_INDEX,
SERVICE_CONFIDENCE, MATCHING_CONFIDENCE, SERVICES, create_list_tasks,
create_download_tasks, group_by_video, key_subtitles)
from .languages import list_languages
from .tasks import StopTask
import Queue
import logging
import threading
logger = logging.getLogger(__name__)
class Worker(threading.Thread):
"""Consume tasks and put the result in the queue"""
def __init__(self, tasks, results):
super(Worker, self).__init__()
self.tasks = tasks
self.results = results
self.services = {}
def run(self):
while 1:
result = []
try:
task = self.tasks.get(block=True)
if isinstance(task, StopTask):
break
result = consume_task(task, self.services)
self.results.put((task.video, result))
except:
logger.error(u'Exception raised in worker %s' % self.name, exc_info=True)
finally:
self.tasks.task_done()
self.terminate()
logger.debug(u'Thread %s terminated' % self.name)
def terminate(self):
"""Terminate instantiated services"""
for service_name, service in self.services.iteritems():
try:
service.terminate()
except:
logger.error(u'Exception raised when terminating service %s' % service_name, exc_info=True)
class Pool(object):
"""Pool of workers"""
def __init__(self, size):
self.tasks = Queue.Queue()
self.results = Queue.Queue()
self.workers = []
for _ in range(size):
self.workers.append(Worker(self.tasks, self.results))
def __enter__(self):
self.start()
return self
def __exit__(self, *args):
self.stop()
self.join()
def start(self):
"""Start workers"""
for worker in self.workers:
worker.start()
def stop(self):
"""Stop workers"""
for _ in self.workers:
self.tasks.put(StopTask())
def join(self):
"""Join the task queue"""
self.tasks.join()
def collect(self):
"""Collect available results
:return: results of tasks
:rtype: list of :class:`~subliminal.tasks.Task`
"""
results = []
while 1:
try:
result = self.results.get(block=False)
results.append(result)
except Queue.Empty:
break
return results
def list_subtitles(self, paths, languages=None, services=None, force=True, multi=False, cache_dir=None, max_depth=3):
"""See :meth:`subliminal.list_subtitles`"""
services = services or SERVICES
languages = set(languages or list_languages(1))
if isinstance(paths, basestring):
paths = [paths]
if any([not isinstance(p, unicode) for p in paths]):
logger.warning(u'Not all entries are unicode')
tasks = create_list_tasks(paths, languages, services, force, multi, cache_dir, max_depth)
for task in tasks:
self.tasks.put(task)
self.join()
results = self.collect()
return group_by_video(results)
def download_subtitles(self, paths, languages=None, services=None, cache_dir=None, max_depth=3, force=True, multi=False, order=None):
"""See :meth:`subliminal.download_subtitles`"""
services = services or SERVICES
languages = languages or list_languages(1)
if isinstance(paths, basestring):
paths = [paths]
order = order or [LANGUAGE_INDEX, SERVICE_INDEX, SERVICE_CONFIDENCE, MATCHING_CONFIDENCE]
subtitles_by_video = self.list_subtitles(paths, set(languages), services, force, multi, cache_dir, max_depth)
for video, subtitles in subtitles_by_video.iteritems():
subtitles.sort(key=lambda s: key_subtitles(s, video, languages, services, order), reverse=True)
tasks = create_download_tasks(subtitles_by_video, multi)
for task in tasks:
self.tasks.put(task)
self.join()
results = self.collect()
return results
+17
View File
@@ -0,0 +1,17 @@
# -*- coding: utf-8 -*-
import datetime
from dogpile.cache import make_region
#: Subliminal's cache version
CACHE_VERSION = 1
#: Expiration time for show caching
SHOW_EXPIRATION_TIME = datetime.timedelta(weeks=3).total_seconds()
#: Expiration time for episode caching
EPISODE_EXPIRATION_TIME = datetime.timedelta(days=3).total_seconds()
region = make_region()
+323
View File
@@ -0,0 +1,323 @@
# -*- coding: utf-8 -*-
"""
Subliminal uses `click <http://click.pocoo.org>`_ to provide a powerful :abbr:`CLI (command-line interface)`.
"""
from __future__ import unicode_literals, division
from collections import defaultdict
from datetime import timedelta
import logging
import os
import re
import sys
from babelfish import Error as BabelfishError, Language
import click
from dogpile.cache.backends.file import AbstractFileLock
from dogpile.core import ReadWriteMutex
from subliminal import (Episode, Movie, ProviderPool, Video, __version__, check_video, provider_manager, region,
save_subtitles, scan_video, scan_videos)
from subliminal.subtitle import compute_score
logger = logging.getLogger(__name__)
class MutexLock(AbstractFileLock):
""":class:`MutexLock` is a thread-based rw lock based on :class:`dogpile.core.ReadWriteMutex`."""
def __init__(self, filename):
self.mutex = ReadWriteMutex()
def acquire_read_lock(self, wait):
ret = self.mutex.acquire_read_lock(wait)
return wait or ret
def acquire_write_lock(self, wait):
ret = self.mutex.acquire_write_lock(wait)
return wait or ret
def release_read_lock(self):
return self.mutex.release_read_lock()
def release_write_lock(self):
return self.mutex.release_write_lock()
class StringPath(click.Path):
"""A :class:`~click.Path` as :class:`str`."""
def convert(self, value, param, ctx):
if isinstance(value, bytes):
try:
enc = getattr(sys.stdin, 'encoding', None)
if enc is not None:
value = value.decode(enc)
except UnicodeDecodeError:
try:
value = value.decode(click.utils.get_filesystem_encoding())
except UnicodeDecodeError:
self.fail('%s is not a correctly encoded path' % value.decode('utf-8', 'replace'))
return super(StringPath, self).convert(value, param, ctx)
class LanguageParamType(click.ParamType):
""":class:`~click.ParamType` for languages that returns a :class:`~babelfish.language.Language`"""
name = 'language'
def convert(self, value, param, ctx):
try:
return Language.fromietf(value)
except BabelfishError:
self.fail('%s is not a valid language' % value)
LANGUAGE = LanguageParamType()
class AgeParamType(click.ParamType):
""":class:`~click.ParamType` for age strings that returns a :class:`~datetime.timedelta`
An age string is in the form `number + identifier` with possible identifiers:
* ``w`` for weeks
* ``d`` for days
* ``h`` for hours
The form can be specified multiple times but only with that idenfier ordering. For example:
* ``1w2d4h`` for 1 week, 2 days and 4 hours
* ``2w`` for 2 weeks
* ``3w6h`` for 3 weeks and 6 hours
"""
name = 'age'
def convert(self, value, param, ctx):
match = re.match(r'^(?:(?P<weeks>\d+?)w)?(?:(?P<days>\d+?)d)?(?:(?P<hours>\d+?)h)?$', value)
if not match:
self.fail('%s is not a valid age' % value)
return timedelta(**{k: int(v) for k, v in match.groupdict(0).items()})
AGE = AgeParamType()
PROVIDER = click.Choice(sorted(provider_manager.names()))
subliminal_cache = 'subliminal.dbm'
@click.group(context_settings={'max_content_width': 100}, epilog='Suggestions and bug reports are greatly appreciated: '
'https://github.com/Diaoul/subliminal/')
@click.option('--addic7ed', type=click.STRING, nargs=2, metavar='USERNAME PASSWORD', help='Addic7ed configuration.')
@click.option('--cache-dir', type=click.Path(writable=True, resolve_path=True, file_okay=False),
default=click.get_app_dir('subliminal'), show_default=True, expose_value=True,
help='Path to the cache directory.')
@click.option('--debug', is_flag=True, help='Print useful information for debugging subliminal and for reporting bugs.')
@click.version_option(__version__)
@click.pass_context
def subliminal(ctx, addic7ed, cache_dir, debug):
"""Subtitles, faster than your thoughts."""
# create cache directory
try:
os.makedirs(cache_dir)
except OSError:
if not os.path.isdir(cache_dir):
raise
# configure cache
region.configure('dogpile.cache.dbm', expiration_time=timedelta(days=30),
arguments={'filename': os.path.join(cache_dir, subliminal_cache), 'lock_factory': MutexLock})
# configure logging
if debug:
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter(logging.BASIC_FORMAT))
logging.getLogger('subliminal').addHandler(handler)
logging.getLogger('subliminal').setLevel(logging.DEBUG)
# provider configs
ctx.obj = {'provider_configs': {}}
if addic7ed:
ctx.obj['provider_configs']['addic7ed'] = {'username': addic7ed[0], 'password': addic7ed[1]}
@subliminal.command()
@click.option('--clear-subliminal', is_flag=True, help='Clear subliminal\'s cache. Use this ONLY if your cache is '
'corrupted or if you experience issues.')
@click.pass_context
def cache(ctx, clear_subliminal):
"""Cache management."""
if clear_subliminal:
os.remove(os.path.join(ctx.parent.params['cache_dir'], subliminal_cache))
click.echo('Subliminal\'s cache cleared.')
else:
click.echo('Nothing done.')
@subliminal.command()
@click.option('-l', '--language', type=LANGUAGE, required=True, multiple=True, help='Language as IETF code, '
'e.g. en, pt-BR (can be used multiple times).')
@click.option('-p', '--provider', type=PROVIDER, multiple=True, help='Provider to use (can be used multiple times).')
@click.option('-a', '--age', type=AGE, help='Filter videos newer than AGE, e.g. 12h, 1w2d.')
@click.option('-d', '--directory', type=click.STRING, metavar='DIR', help='Directory where to save subtitles, '
'default is next to the video file.')
@click.option('-e', '--encoding', type=click.STRING, metavar='ENC', help='Subtitle file encoding, default is to '
'preserve original encoding.')
@click.option('-s', '--single', is_flag=True, default=False, help='Save subtitle without language code in the file '
'name, i.e. use .srt extension.')
@click.option('-f', '--force', is_flag=True, default=False, help='Force download even if a subtitle already exist.')
@click.option('-hi', '--hearing-impaired', is_flag=True, default=False, help='Prefer hearing impaired subtitles.')
@click.option('-m', '--min-score', type=click.IntRange(0, 100), default=0, help='Minimum score for a subtitle '
'to be downloaded (0 to 100).')
@click.option('-v', '--verbose', count=True, help='Increase verbosity.')
@click.argument('path', type=StringPath(), required=True, nargs=-1)
@click.pass_obj
def download(obj, provider, language, age, directory, encoding, single, force, hearing_impaired, min_score, verbose,
path):
"""Download best subtitles.
PATH can be an directory containing videos, a video file path or a video file name. It can be used multiple times.
If an existing subtitle is detected (external or embedded) in the correct language, the download is skipped for
the associated video.
"""
# process parameters
language = set(language)
# scan videos
videos = []
ignored_videos = []
errored_paths = []
with click.progressbar(path, label='Collecting videos', item_show_func=lambda p: p or '') as bar:
for p in bar:
logger.debug('Collecting path %s', p)
# non-existing
if not os.path.exists(p):
try:
video = Video.fromname(p)
except:
logger.exception('Unexpected error while collecting non-existing path %s', p)
errored_paths.append(p)
continue
videos.append(video)
continue
# directories
if os.path.isdir(p):
try:
scanned_videos = scan_videos(p, subtitles=not force, embedded_subtitles=not force)
except:
logger.exception('Unexpected error while collecting directory path %s', p)
errored_paths.append(p)
continue
for video in scanned_videos:
if check_video(video, languages=language, age=age, undefined=single):
videos.append(video)
else:
ignored_videos.append(video)
continue
# other inputs
try:
video = scan_video(p, subtitles=not force, embedded_subtitles=not force)
except:
logger.exception('Unexpected error while collecting path %s', p)
errored_paths.append(p)
continue
if check_video(video, languages=language, age=age, undefined=single):
videos.append(video)
else:
ignored_videos.append(video)
# output errored paths
if verbose > 0:
for p in errored_paths:
click.secho('%s errored' % p, fg='red')
# output ignored videos
if verbose > 1:
for video in ignored_videos:
click.secho('%s ignored - subtitles: %s / age: %d day%s' % (
os.path.split(video.name)[1],
', '.join(str(s) for s in video.subtitle_languages) or 'none',
video.age.days,
's' if video.age.days > 1 else ''
), fg='yellow')
# report collected videos
click.echo('%s video%s collected / %s video%s ignored / %s error%s' % (
click.style(str(len(videos)), bold=True, fg='green' if videos else None),
's' if len(videos) > 1 else '',
click.style(str(len(ignored_videos)), bold=True, fg='yellow' if ignored_videos else None),
's' if len(ignored_videos) > 1 else '',
click.style(str(len(errored_paths)), bold=True, fg='red' if errored_paths else None),
's' if len(errored_paths) > 1 else '',
))
# exit if no video collected
if not videos:
return
# download best subtitles
downloaded_subtitles = defaultdict(list)
with ProviderPool(providers=provider, provider_configs=obj['provider_configs']) as pool:
with click.progressbar(videos, label='Downloading subtitles',
item_show_func=lambda v: os.path.split(v.name)[1] if v is not None else '') as bar:
for v in bar:
subtitles = pool.download_best_subtitles(pool.list_subtitles(v, language - v.subtitle_languages),
v, language, min_score=v.scores['hash'] * min_score / 100,
hearing_impaired=hearing_impaired, only_one=single)
downloaded_subtitles[v] = subtitles
# save subtitles
total_subtitles = 0
for v, subtitles in downloaded_subtitles.items():
saved_subtitles = save_subtitles(v, subtitles, single=single, directory=directory, encoding=encoding)
total_subtitles += len(saved_subtitles)
if verbose > 0:
click.echo('%s subtitle%s downloaded for %s' % (click.style(str(len(saved_subtitles)), bold=True),
's' if len(saved_subtitles) > 1 else '',
os.path.split(v.name)[1]))
if verbose > 1:
for s in saved_subtitles:
matches = s.get_matches(v, hearing_impaired=hearing_impaired)
score = compute_score(matches, v)
# score color
score_color = None
if isinstance(v, Movie):
if score < v.scores['title']:
score_color = 'red'
elif score < v.scores['title'] + v.scores['year'] + v.scores['release_group']:
score_color = 'yellow'
else:
score_color = 'green'
elif isinstance(v, Episode):
if score < v.scores['series'] + v.scores['season'] + v.scores['episode']:
score_color = 'red'
elif score < (v.scores['series'] + v.scores['season'] + v.scores['episode'] +
v.scores['release_group']):
score_color = 'yellow'
else:
score_color = 'green'
# scale score from 0 to 100 taking out preferences
scaled_score = score
if s.hearing_impaired == hearing_impaired:
scaled_score -= v.scores['hearing_impaired']
scaled_score *= 100 / v.scores['hash']
# echo some nice colored output
click.echo(' - [{score}] {language} subtitle from {provider_name} (match on {matches})'.format(
score=click.style('{:5.1f}'.format(scaled_score), fg=score_color, bold=score >= v.scores['hash']),
language=s.language.name if s.language.country is None else '%s (%s)' % (s.language.name,
s.language.country.name),
provider_name=s.provider_name,
matches=', '.join(sorted(matches, key=v.scores.get, reverse=True))
))
if verbose == 0:
click.echo('Downloaded %s subtitle%s' % (click.style(str(total_subtitles), bold=True),
's' if total_subtitles > 1 else ''))
View File
+33
View File
@@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from babelfish import LanguageReverseConverter, language_converters
class Addic7edConverter(LanguageReverseConverter):
def __init__(self):
self.name_converter = language_converters['name']
self.from_addic7ed = {'Català': ('cat',), 'Chinese (Simplified)': ('zho',), 'Chinese (Traditional)': ('zho',),
'Euskera': ('eus',), 'Galego': ('glg',), 'Greek': ('ell',), 'Malay': ('msa',),
'Portuguese (Brazilian)': ('por', 'BR'), 'Serbian (Cyrillic)': ('srp', None, 'Cyrl'),
'Serbian (Latin)': ('srp',), 'Spanish (Latin America)': ('spa',),
'Spanish (Spain)': ('spa',)}
self.to_addic7ed = {('cat',): 'Català', ('zho',): 'Chinese (Simplified)', ('eus',): 'Euskera',
('glg',): 'Galego', ('ell',): 'Greek', ('msa',): 'Malay',
('por', 'BR'): 'Portuguese (Brazilian)', ('srp', None, 'Cyrl'): 'Serbian (Cyrillic)'}
self.codes = self.name_converter.codes | set(self.from_addic7ed.keys())
def convert(self, alpha3, country=None, script=None):
if (alpha3, country, script) in self.to_addic7ed:
return self.to_addic7ed[(alpha3, country, script)]
if (alpha3, country) in self.to_addic7ed:
return self.to_addic7ed[(alpha3, country)]
if (alpha3,) in self.to_addic7ed:
return self.to_addic7ed[(alpha3,)]
return self.name_converter.convert(alpha3, country, script)
def reverse(self, addic7ed):
if addic7ed in self.from_addic7ed:
return self.from_addic7ed[addic7ed]
return self.name_converter.reverse(addic7ed)
+26
View File
@@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from babelfish import LanguageReverseConverter, language_converters
class TVsubtitlesConverter(LanguageReverseConverter):
def __init__(self):
self.alpha2_converter = language_converters['alpha2']
self.from_tvsubtitles = {'br': ('por', 'BR'), 'ua': ('ukr',), 'gr': ('ell',), 'cn': ('zho',), 'jp': ('jpn',),
'cz': ('ces',)}
self.to_tvsubtitles = {v: k for k, v in self.from_tvsubtitles.items()}
self.codes = self.alpha2_converter.codes | set(self.from_tvsubtitles.keys())
def convert(self, alpha3, country=None, script=None):
if (alpha3, country) in self.to_tvsubtitles:
return self.to_tvsubtitles[(alpha3, country)]
if (alpha3,) in self.to_tvsubtitles:
return self.to_tvsubtitles[(alpha3,)]
return self.alpha2_converter.convert(alpha3, country, script)
def reverse(self, tvsubtitles):
if tvsubtitles in self.from_tvsubtitles:
return self.from_tvsubtitles[tvsubtitles]
return self.alpha2_converter.reverse(tvsubtitles)
-240
View File
@@ -1,240 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2011-2012 Antoine Bertin <diaoulael@gmail.com>
#
# This file is part of subliminal.
#
# subliminal is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# subliminal is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with subliminal. If not, see <http://www.gnu.org/licenses/>.
from .exceptions import DownloadFailedError
from .services import ServiceConfig
from .tasks import DownloadTask, ListTask
from .utils import get_keywords
from .videos import Episode, Movie, scan
from collections import defaultdict
from itertools import groupby
import guessit
import logging
__all__ = ['SERVICES', 'LANGUAGE_INDEX', 'SERVICE_INDEX', 'SERVICE_CONFIDENCE', 'MATCHING_CONFIDENCE',
'create_list_tasks', 'create_download_tasks', 'consume_task', 'matching_confidence',
'key_subtitles', 'group_by_video']
logger = logging.getLogger(__name__)
SERVICES = ['opensubtitles', 'bierdopje', 'subswiki', 'subtitulos', 'thesubdb']
LANGUAGE_INDEX, SERVICE_INDEX, SERVICE_CONFIDENCE, MATCHING_CONFIDENCE = range(4)
def create_list_tasks(paths, languages, services, force, multi, cache_dir, max_depth):
"""Create a list of :class:`~subliminal.tasks.ListTask` from one or more paths using the given criteria
:param paths: path(s) to video file or folder
:type paths: string or list
:param set languages: languages to search for
:param list services: services to use for the search
:param bool force: force searching for subtitles even if some are detected
:param bool multi: search multiple languages for the same video
:param string cache_dir: path to the cache directory to use
:param int max_depth: maximum depth for scanning entries
:return: the created tasks
:rtype: list of :class:`~subliminal.tasks.ListTask`
"""
scan_result = []
for p in paths:
scan_result.extend(scan(p, max_depth))
logger.debug(u'Found %d videos in %r with maximum depth %d' % (len(scan_result), paths, max_depth))
tasks = []
config = ServiceConfig(multi, cache_dir)
for video, detected_subtitles in scan_result:
detected_languages = set([s.language for s in detected_subtitles])
wanted_languages = languages.copy()
if not force and multi:
wanted_languages -= detected_languages
if not wanted_languages:
logger.debug(u'No need to list multi subtitles %r for %r because %r detected' % (languages, video, detected_languages))
continue
if not force and not multi and None in detected_languages:
logger.debug(u'No need to list single subtitles %r for %r because one detected' % (languages, video))
continue
logger.debug(u'Listing subtitles %r for %r with services %r' % (wanted_languages, video, services))
for service_name in services:
mod = __import__('services.' + service_name, globals=globals(), locals=locals(), fromlist=['Service'], level=-1)
service = mod.Service
service_languages = wanted_languages & service.available_languages()
if not service_languages:
logger.debug(u'Skipping %r: none of wanted languages %r available for service %s' % (video, wanted_languages, service_name))
continue
if not service.is_valid_video(video):
logger.debug(u'Skipping %r: not part of supported videos %r for service %s' % (video, service.videos, service_name))
continue
task = ListTask(video, service_languages, service_name, config)
logger.debug(u'Created task %r' % task)
tasks.append(task)
return tasks
def create_download_tasks(subtitles_by_video, multi):
"""Create a list of :class:`~subliminal.tasks.DownloadTask` from a list results grouped by video
:param subtitles_by_video: :class:`~subliminal.tasks.ListTask` results grouped by video and sorted
:type subtitles_by_video: dict of :class:`~subliminal.videos.Video` => [:class:`~subliminal.subtitles.Subtitle`]
:param order: preferred order for subtitles sorting
:type list: list of :data:`LANGUAGE_INDEX`, :data:`SERVICE_INDEX`, :data:`SERVICE_CONFIDENCE`, :data:`MATCHING_CONFIDENCE`
:param bool multi: download multiple languages for the same video
:return: the created tasks
:rtype: list of :class:`~subliminal.tasks.DownloadTask`
"""
tasks = []
for video, subtitles in subtitles_by_video.iteritems():
if not subtitles:
continue
if not multi:
task = DownloadTask(video, list(subtitles))
logger.debug(u'Created task %r' % task)
tasks.append(task)
continue
for _, by_language in groupby(subtitles, lambda s: s.language):
task = DownloadTask(video, list(by_language))
logger.debug(u'Created task %r' % task)
tasks.append(task)
return tasks
def consume_task(task, services=None):
"""Consume a task. If the ``services`` parameter is given, the function will attempt
to get the service from it. In case the service is not in ``services``, it will be initialized
and put in ``services``
:param task: task to consume
:type task: :class:`~subliminal.tasks.ListTask` or :class:`~subliminal.tasks.DownloadTask`
:param dict services: mapping between the service name and an instance of this service
:return: the result of the task
:rtype: list of :class:`~subliminal.subtitles.ResultSubtitle` or :class:`~subliminal.subtitles.Subtitle`
"""
if services is None:
services = {}
logger.info(u'Consuming %r' % task)
result = None
if isinstance(task, ListTask):
if task.service not in services:
mod = __import__('services.' + task.service, globals=globals(), locals=locals(), fromlist=['Service'], level=-1)
services[task.service] = mod.Service(task.config)
services[task.service].init()
subtitles = services[task.service].list(task.video, task.languages)
result = subtitles
elif isinstance(task, DownloadTask):
for subtitle in task.subtitles:
if subtitle.service not in services:
mod = __import__('services.' + subtitle.service, globals=globals(), locals=locals(), fromlist=['Service'], level=-1)
services[subtitle.service] = mod.Service()
services[subtitle.service].init()
try:
services[subtitle.service].download(subtitle)
result = subtitle
break
except DownloadFailedError:
logger.warning(u'Could not download subtitle %r, trying next' % subtitle)
continue
if result is None:
logger.error(u'No subtitles could be downloaded for video %r' % task.video)
return result
def matching_confidence(video, subtitle):
"""Compute the probability (confidence) that the subtitle matches the video
:param video: video to match
:type video: :class:`~subliminal.videos.Video`
:param subtitle: subtitle to match
:type subtitle: :class:`~subliminal.subtitles.Subtitle`
:return: the matching probability
:rtype: float
"""
guess = guessit.guess_file_info(subtitle.release, 'autodetect')
video_keywords = get_keywords(video.guess)
subtitle_keywords = get_keywords(guess) | subtitle.keywords
replacement = {'keywords': len(video_keywords & subtitle_keywords)}
if isinstance(video, Episode):
replacement.update({'series': 0, 'season': 0, 'episode': 0})
matching_format = '{series:b}{season:b}{episode:b}{keywords:03b}'
best = matching_format.format(series=1, season=1, episode=1, keywords=len(video_keywords))
if guess['type'] in ['episode', 'episodesubtitle']:
if 'series' in guess and guess['series'].lower() == video.series.lower():
replacement['series'] = 1
if 'season' in guess and guess['season'] == video.season:
replacement['season'] = 1
if 'episodeNumber' in guess and guess['episodeNumber'] == video.episode:
replacement['episode'] = 1
elif isinstance(video, Movie):
replacement.update({'title': 0, 'year': 0})
matching_format = '{title:b}{year:b}{keywords:03b}'
best = matching_format.format(title=1, year=1, keywords=len(video_keywords))
if guess['type'] in ['movie', 'moviesubtitle']:
if 'title' in guess and guess['title'].lower() == video.title.lower():
replacement['title'] = 1
if 'year' in guess and guess['year'] == video.year:
replacement['year'] = 1
else:
return 0
confidence = float(int(matching_format.format(**replacement), 2)) / float(int(best, 2))
return confidence
def key_subtitles(subtitle, video, languages, services, order):
"""Create a key to sort subtitle using the given order
:param subtitle: subtitle to sort
:type subtitle: :class:`~subliminal.subtitles.ResultSubtitle`
:param video: video to match
:type video: :class:`~subliminal.videos.Video`
:param list languages: languages in preferred order
:param list services: services in preferred order
:param order: preferred order for subtitles sorting
:type list: list of :data:`LANGUAGE_INDEX`, :data:`SERVICE_INDEX`, :data:`SERVICE_CONFIDENCE`, :data:`MATCHING_CONFIDENCE`
:return: a key ready to use for subtitles sorting
:rtype: int
"""
key = ''
for sort_item in order:
if sort_item == LANGUAGE_INDEX:
key += '{0:03d}'.format(len(languages) - languages.index(subtitle.language) - 1)
elif sort_item == SERVICE_INDEX:
key += '{0:02d}'.format(len(services) - services.index(subtitle.service) - 1)
elif sort_item == SERVICE_CONFIDENCE:
key += '{0:04d}'.format(int(subtitle.confidence * 1000))
elif sort_item == MATCHING_CONFIDENCE:
confidence = 0
if subtitle.release:
confidence = matching_confidence(video, subtitle)
key += '{0:04d}'.format(int(confidence * 1000))
return int(key)
def group_by_video(list_results):
"""Group the results of :class:`ListTasks <subliminal.tasks.ListTask>` into a
dictionary of :class:`~subliminal.videos.Video` => :class:`~subliminal.subtitles.Subtitle`
:param list_results:
:type list_results: list of result of :class:`~subliminal.tasks.ListTask`
:return: subtitles grouped by videos
:rtype: dict of :class:`~subliminal.videos.Video` => [:class:`~subliminal.subtitles.Subtitle`]
"""
result = defaultdict(list)
for video, subtitles in list_results:
result[video] += subtitles
return result
+10 -64
View File
@@ -1,81 +1,27 @@
# -*- coding: utf-8 -*-
# Copyright 2011-2012 Antoine Bertin <diaoulael@gmail.com>
#
# This file is part of subliminal.
#
# subliminal is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# subliminal is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with subliminal. If not, see <http://www.gnu.org/licenses/>.
from __future__ import unicode_literals
class Error(Exception):
"""Base class for exceptions in subliminal"""
"""Base class for exceptions in subliminal."""
pass
class InvalidLanguageError(Error):
"""Exception raised when invalid language is submitted
Attributes:
language -- language that cause the error
"""
def __init__(self, language):
self.language = language
def __str__(self):
return self.language
class MissingLanguageError(Error):
"""Exception raised when a missing language is found
Attributes:
language -- the missing language
"""
def __init__(self, language):
self.language = language
def __str__(self):
return self.language
class InvalidServiceError(Error):
"""Exception raised when invalid service is submitted
:param string service: service that causes the error
"""
def __init__(self, service):
self.service = service
def __str__(self):
return self.service
class ServiceError(Error):
""""Exception raised by services"""
class ProviderError(Error):
"""Exception raised by providers."""
pass
class WrongTaskError(Error):
""""Exception raised when invalid task is submitted"""
class ConfigurationError(ProviderError):
"""Exception raised by providers when badly configured."""
pass
class DownloadFailedError(Error):
""""Exception raised when a download task has failed in service"""
class AuthenticationError(ProviderError):
"""Exception raised by providers when authentication failed."""
pass
class UnknownVideoError(Error):
""""Exception raised when a video could not be identified"""
class DownloadLimitExceeded(ProviderError):
"""Exception raised by providers when download limit is exceeded."""
pass
-18
View File
@@ -1,18 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2011-2012 Antoine Bertin <diaoulael@gmail.com>
#
# This file is part of subliminal.
#
# subliminal is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# subliminal is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with subliminal. If not, see <http://www.gnu.org/licenses/>.
__version__ = '0.5'
-547
View File
@@ -1,547 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2011-2012 Antoine Bertin <diaoulael@gmail.com>
#
# This file is part of subliminal.
#
# subliminal is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# subliminal is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with subliminal. If not, see <http://www.gnu.org/licenses/>.
__all__ = ['convert_language', 'list_languages', 'LANGUAGES']
def convert_language(language, to_iso, from_iso=None):
"""Convert a language into another format
:param string language: language
:param int to_iso: convert language to ISO-639-x
:param int from_iso: convert language from ISO-639-x
:return: converted language
:rtype: string
"""
if from_iso == None: # if no from_iso is given, try to guess it
if language.startswith(language[:1].upper()):
from_iso = 0
elif len(language) == 2:
from_iso = 1
elif len(language) == 3:
from_iso = 2
else:
raise ValueError('Invalid input language format')
if isinstance(language, unicode):
language = language.encode('utf-8')
converted_language = None
for language_tuple in LANGUAGES:
if language_tuple[from_iso] == language and language_tuple[to_iso]:
converted_language = language_tuple[to_iso]
break
return converted_language
def list_languages(iso):
"""List languages in the given ISO-639-x format
:param int iso: ISO-639-x format to list
:return: languages in the requested format
:rtype: list
"""
return [l[iso] for l in LANGUAGES if l[iso]]
#: ISO-639-2 languages list from http://www.loc.gov/standards/iso639-2/ISO-639-2_utf-8.txt
#: + ('Brazilian', 'po', 'pob')
LANGUAGES = [('Afar', 'aa', 'aar'),
('Abkhazian', 'ab', 'abk'),
('Achinese', '', 'ace'),
('Acoli', '', 'ach'),
('Adangme', '', 'ada'),
('Adyghe; Adygei', '', 'ady'),
('Afro-Asiatic languages', '', 'afa'),
('Afrihili', '', 'afh'),
('Afrikaans', 'af', 'afr'),
('Ainu', '', 'ain'),
('Akan', 'ak', 'aka'),
('Akkadian', '', 'akk'),
('Albanian', 'sq', 'alb'),
('Aleut', '', 'ale'),
('Algonquian languages', '', 'alg'),
('Southern Altai', '', 'alt'),
('Amharic', 'am', 'amh'),
('English, Old (ca.450-1100)', '', 'ang'),
('Angika', '', 'anp'),
('Apache languages', '', 'apa'),
('Arabic', 'ar', 'ara'),
('Official Aramaic (700-300 BCE); Imperial Aramaic (700-300 BCE)', '', 'arc'),
('Aragonese', 'an', 'arg'),
('Armenian', 'hy', 'arm'),
('Mapudungun; Mapuche', '', 'arn'),
('Arapaho', '', 'arp'),
('Artificial languages', '', 'art'),
('Arawak', '', 'arw'),
('Assamese', 'as', 'asm'),
('Asturian; Bable; Leonese; Asturleonese', '', 'ast'),
('Athapascan languages', '', 'ath'),
('Australian languages', '', 'aus'),
('Avaric', 'av', 'ava'),
('Avestan', 'ae', 'ave'),
('Awadhi', '', 'awa'),
('Aymara', 'ay', 'aym'),
('Azerbaijani', 'az', 'aze'),
('Banda languages', '', 'bad'),
('Bamileke languages', '', 'bai'),
('Bashkir', 'ba', 'bak'),
('Baluchi', '', 'bal'),
('Bambara', 'bm', 'bam'),
('Balinese', '', 'ban'),
('Basque', 'eu', 'baq'),
('Basa', '', 'bas'),
('Baltic languages', '', 'bat'),
('Beja; Bedawiyet', '', 'bej'),
('Belarusian', 'be', 'bel'),
('Bemba', '', 'bem'),
('Bengali', 'bn', 'ben'),
('Berber languages', '', 'ber'),
('Bhojpuri', '', 'bho'),
('Bihari languages', 'bh', 'bih'),
('Bikol', '', 'bik'),
('Bini; Edo', '', 'bin'),
('Bislama', 'bi', 'bis'),
('Siksika', '', 'bla'),
('Bantu (Other)', '', 'bnt'),
('Bosnian', 'bs', 'bos'),
('Braj', '', 'bra'),
('Breton', 'br', 'bre'),
('Batak languages', '', 'btk'),
('Buriat', '', 'bua'),
('Buginese', '', 'bug'),
('Bulgarian', 'bg', 'bul'),
('Burmese', 'my', 'bur'),
('Blin; Bilin', '', 'byn'),
('Caddo', '', 'cad'),
('Central American Indian languages', '', 'cai'),
('Galibi Carib', '', 'car'),
('Catalan; Valencian', 'ca', 'cat'),
('Caucasian languages', '', 'cau'),
('Cebuano', '', 'ceb'),
('Celtic languages', '', 'cel'),
('Chamorro', 'ch', 'cha'),
('Chibcha', '', 'chb'),
('Chechen', 'ce', 'che'),
('Chagatai', '', 'chg'),
('Chinese', 'zh', 'chi'),
('Chuukese', '', 'chk'),
('Mari', '', 'chm'),
('Chinook jargon', '', 'chn'),
('Choctaw', '', 'cho'),
('Chipewyan; Dene Suline', '', 'chp'),
('Cherokee', '', 'chr'),
('Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic', 'cu', 'chu'),
('Chuvash', 'cv', 'chv'),
('Cheyenne', '', 'chy'),
('Chamic languages', '', 'cmc'),
('Coptic', '', 'cop'),
('Cornish', 'kw', 'cor'),
('Corsican', 'co', 'cos'),
('Creoles and pidgins, English based', '', 'cpe'),
('Creoles and pidgins, French-based ', '', 'cpf'),
('Creoles and pidgins, Portuguese-based ', '', 'cpp'),
('Cree', 'cr', 'cre'),
('Crimean Tatar; Crimean Turkish', '', 'crh'),
('Creoles and pidgins ', '', 'crp'),
('Kashubian', '', 'csb'),
('Cushitic languages', '', 'cus'),
('Czech', 'cs', 'cze'),
('Dakota', '', 'dak'),
('Danish', 'da', 'dan'),
('Dargwa', '', 'dar'),
('Land Dayak languages', '', 'day'),
('Delaware', '', 'del'),
('Slave (Athapascan)', '', 'den'),
('Dogrib', '', 'dgr'),
('Dinka', '', 'din'),
('Divehi; Dhivehi; Maldivian', 'dv', 'div'),
('Dogri', '', 'doi'),
('Dravidian languages', '', 'dra'),
('Lower Sorbian', '', 'dsb'),
('Duala', '', 'dua'),
('Dutch, Middle (ca.1050-1350)', '', 'dum'),
('Dutch; Flemish', 'nl', 'dut'),
('Dyula', '', 'dyu'),
('Dzongkha', 'dz', 'dzo'),
('Efik', '', 'efi'),
('Egyptian (Ancient)', '', 'egy'),
('Ekajuk', '', 'eka'),
('Elamite', '', 'elx'),
('English', 'en', 'eng'),
('English, Middle (1100-1500)', '', 'enm'),
('Esperanto', 'eo', 'epo'),
('Estonian', 'et', 'est'),
('Ewe', 'ee', 'ewe'),
('Ewondo', '', 'ewo'),
('Fang', '', 'fan'),
('Faroese', 'fo', 'fao'),
('Fanti', '', 'fat'),
('Fijian', 'fj', 'fij'),
('Filipino; Pilipino', '', 'fil'),
('Finnish', 'fi', 'fin'),
('Finno-Ugrian languages', '', 'fiu'),
('Fon', '', 'fon'),
('French', 'fr', 'fre'),
('French, Middle (ca.1400-1600)', '', 'frm'),
('French, Old (842-ca.1400)', '', 'fro'),
('Northern Frisian', '', 'frr'),
('Eastern Frisian', '', 'frs'),
('Western Frisian', 'fy', 'fry'),
('Fulah', 'ff', 'ful'),
('Friulian', '', 'fur'),
('Ga', '', 'gaa'),
('Gayo', '', 'gay'),
('Gbaya', '', 'gba'),
('Germanic languages', '', 'gem'),
('Georgian', 'ka', 'geo'),
('German', 'de', 'ger'),
('Geez', '', 'gez'),
('Gilbertese', '', 'gil'),
('Gaelic; Scottish Gaelic', 'gd', 'gla'),
('Irish', 'ga', 'gle'),
('Galician', 'gl', 'glg'),
('Manx', 'gv', 'glv'),
('German, Middle High (ca.1050-1500)', '', 'gmh'),
('German, Old High (ca.750-1050)', '', 'goh'),
('Gondi', '', 'gon'),
('Gorontalo', '', 'gor'),
('Gothic', '', 'got'),
('Grebo', '', 'grb'),
('Greek, Ancient (to 1453)', '', 'grc'),
('Greek, Modern (1453-)', 'el', 'gre'),
('Guarani', 'gn', 'grn'),
('Swiss German; Alemannic; Alsatian', '', 'gsw'),
('Gujarati', 'gu', 'guj'),
('Gwich\'in', '', 'gwi'),
('Haida', '', 'hai'),
('Haitian; Haitian Creole', 'ht', 'hat'),
('Hausa', 'ha', 'hau'),
('Hawaiian', '', 'haw'),
('Hebrew', 'he', 'heb'),
('Herero', 'hz', 'her'),
('Hiligaynon', '', 'hil'),
('Himachali languages; Western Pahari languages', '', 'him'),
('Hindi', 'hi', 'hin'),
('Hittite', '', 'hit'),
('Hmong; Mong', '', 'hmn'),
('Hiri Motu', 'ho', 'hmo'),
('Croatian', 'hr', 'hrv'),
('Upper Sorbian', '', 'hsb'),
('Hungarian', 'hu', 'hun'),
('Hupa', '', 'hup'),
('Iban', '', 'iba'),
('Igbo', 'ig', 'ibo'),
('Icelandic', 'is', 'ice'),
('Ido', 'io', 'ido'),
('Sichuan Yi; Nuosu', 'ii', 'iii'),
('Ijo languages', '', 'ijo'),
('Inuktitut', 'iu', 'iku'),
('Interlingue; Occidental', 'ie', 'ile'),
('Iloko', '', 'ilo'),
('Interlingua (International Auxiliary Language Association)', 'ia', 'ina'),
('Indic languages', '', 'inc'),
('Indonesian', 'id', 'ind'),
('Indo-European languages', '', 'ine'),
('Ingush', '', 'inh'),
('Inupiaq', 'ik', 'ipk'),
('Iranian languages', '', 'ira'),
('Iroquoian languages', '', 'iro'),
('Italian', 'it', 'ita'),
('Javanese', 'jv', 'jav'),
('Lojban', '', 'jbo'),
('Japanese', 'ja', 'jpn'),
('Judeo-Persian', '', 'jpr'),
('Judeo-Arabic', '', 'jrb'),
('Kara-Kalpak', '', 'kaa'),
('Kabyle', '', 'kab'),
('Kachin; Jingpho', '', 'kac'),
('Kalaallisut; Greenlandic', 'kl', 'kal'),
('Kamba', '', 'kam'),
('Kannada', 'kn', 'kan'),
('Karen languages', '', 'kar'),
('Kashmiri', 'ks', 'kas'),
('Kanuri', 'kr', 'kau'),
('Kawi', '', 'kaw'),
('Kazakh', 'kk', 'kaz'),
('Kabardian', '', 'kbd'),
('Khasi', '', 'kha'),
('Khoisan languages', '', 'khi'),
('Central Khmer', 'km', 'khm'),
('Khotanese; Sakan', '', 'kho'),
('Kikuyu; Gikuyu', 'ki', 'kik'),
('Kinyarwanda', 'rw', 'kin'),
('Kirghiz; Kyrgyz', 'ky', 'kir'),
('Kimbundu', '', 'kmb'),
('Konkani', '', 'kok'),
('Komi', 'kv', 'kom'),
('Kongo', 'kg', 'kon'),
('Korean', 'ko', 'kor'),
('Kosraean', '', 'kos'),
('Kpelle', '', 'kpe'),
('Karachay-Balkar', '', 'krc'),
('Karelian', '', 'krl'),
('Kru languages', '', 'kro'),
('Kurukh', '', 'kru'),
('Kuanyama; Kwanyama', 'kj', 'kua'),
('Kumyk', '', 'kum'),
('Kurdish', 'ku', 'kur'),
('Kutenai', '', 'kut'),
('Ladino', '', 'lad'),
('Lahnda', '', 'lah'),
('Lamba', '', 'lam'),
('Lao', 'lo', 'lao'),
('Latin', 'la', 'lat'),
('Latvian', 'lv', 'lav'),
('Lezghian', '', 'lez'),
('Limburgan; Limburger; Limburgish', 'li', 'lim'),
('Lingala', 'ln', 'lin'),
('Lithuanian', 'lt', 'lit'),
('Mongo', '', 'lol'),
('Lozi', '', 'loz'),
('Luxembourgish; Letzeburgesch', 'lb', 'ltz'),
('Luba-Lulua', '', 'lua'),
('Luba-Katanga', 'lu', 'lub'),
('Ganda', 'lg', 'lug'),
('Luiseno', '', 'lui'),
('Lunda', '', 'lun'),
('Luo (Kenya and Tanzania)', '', 'luo'),
('Lushai', '', 'lus'),
('Macedonian', 'mk', 'mac'),
('Madurese', '', 'mad'),
('Magahi', '', 'mag'),
('Marshallese', 'mh', 'mah'),
('Maithili', '', 'mai'),
('Makasar', '', 'mak'),
('Malayalam', 'ml', 'mal'),
('Mandingo', '', 'man'),
('Maori', 'mi', 'mao'),
('Austronesian languages', '', 'map'),
('Marathi', 'mr', 'mar'),
('Masai', '', 'mas'),
('Malay', 'ms', 'may'),
('Moksha', '', 'mdf'),
('Mandar', '', 'mdr'),
('Mende', '', 'men'),
('Irish, Middle (900-1200)', '', 'mga'),
('Mi\'kmaq; Micmac', '', 'mic'),
('Minangkabau', '', 'min'),
('Uncoded languages', '', 'mis'),
('Mon-Khmer languages', '', 'mkh'),
('Malagasy', 'mg', 'mlg'),
('Maltese', 'mt', 'mlt'),
('Manchu', '', 'mnc'),
('Manipuri', '', 'mni'),
('Manobo languages', '', 'mno'),
('Mohawk', '', 'moh'),
('Mongolian', 'mn', 'mon'),
('Mossi', '', 'mos'),
('Multiple languages', '', 'mul'),
('Munda languages', '', 'mun'),
('Creek', '', 'mus'),
('Mirandese', '', 'mwl'),
('Marwari', '', 'mwr'),
('Mayan languages', '', 'myn'),
('Erzya', '', 'myv'),
('Nahuatl languages', '', 'nah'),
('North American Indian languages', '', 'nai'),
('Neapolitan', '', 'nap'),
('Nauru', 'na', 'nau'),
('Navajo; Navaho', 'nv', 'nav'),
('Ndebele, South; South Ndebele', 'nr', 'nbl'),
('Ndebele, North; North Ndebele', 'nd', 'nde'),
('Ndonga', 'ng', 'ndo'),
('Low German; Low Saxon; German, Low; Saxon, Low', '', 'nds'),
('Nepali', 'ne', 'nep'),
('Nepal Bhasa; Newari', '', 'new'),
('Nias', '', 'nia'),
('Niger-Kordofanian languages', '', 'nic'),
('Niuean', '', 'niu'),
('Norwegian Nynorsk; Nynorsk, Norwegian', 'nn', 'nno'),
('Bokmål, Norwegian; Norwegian Bokmål', 'nb', 'nob'),
('Nogai', '', 'nog'),
('Norse, Old', '', 'non'),
('Norwegian', 'no', 'nor'),
('N\'Ko', '', 'nqo'),
('Pedi; Sepedi; Northern Sotho', '', 'nso'),
('Nubian languages', '', 'nub'),
('Classical Newari; Old Newari; Classical Nepal Bhasa', '', 'nwc'),
('Chichewa; Chewa; Nyanja', 'ny', 'nya'),
('Nyamwezi', '', 'nym'),
('Nyankole', '', 'nyn'),
('Nyoro', '', 'nyo'),
('Nzima', '', 'nzi'),
('Occitan (post 1500); Provençal', 'oc', 'oci'),
('Ojibwa', 'oj', 'oji'),
('Oriya', 'or', 'ori'),
('Oromo', 'om', 'orm'),
('Osage', '', 'osa'),
('Ossetian; Ossetic', 'os', 'oss'),
('Turkish, Ottoman (1500-1928)', '', 'ota'),
('Otomian languages', '', 'oto'),
('Papuan languages', '', 'paa'),
('Pangasinan', '', 'pag'),
('Pahlavi', '', 'pal'),
('Pampanga; Kapampangan', '', 'pam'),
('Panjabi; Punjabi', 'pa', 'pan'),
('Papiamento', '', 'pap'),
('Palauan', '', 'pau'),
('Persian, Old (ca.600-400 B.C.)', '', 'peo'),
('Persian', 'fa', 'per'),
('Philippine languages', '', 'phi'),
('Phoenician', '', 'phn'),
('Pali', 'pi', 'pli'),
('Polish', 'pl', 'pol'),
('Pohnpeian', '', 'pon'),
('Portuguese', 'pt', 'por'),
('Prakrit languages', '', 'pra'),
('Provençal, Old (to 1500)', '', 'pro'),
('Pushto; Pashto', 'ps', 'pus'),
('Reserved for local use', '', 'qaa-qtz'),
('Quechua', 'qu', 'que'),
('Rajasthani', '', 'raj'),
('Rapanui', '', 'rap'),
('Rarotongan; Cook Islands Maori', '', 'rar'),
('Romance languages', '', 'roa'),
('Romansh', 'rm', 'roh'),
('Romany', '', 'rom'),
('Romanian; Moldavian; Moldovan', 'ro', 'rum'),
('Rundi', 'rn', 'run'),
('Aromanian; Arumanian; Macedo-Romanian', '', 'rup'),
('Russian', 'ru', 'rus'),
('Sandawe', '', 'sad'),
('Sango', 'sg', 'sag'),
('Yakut', '', 'sah'),
('South American Indian (Other)', '', 'sai'),
('Salishan languages', '', 'sal'),
('Samaritan Aramaic', '', 'sam'),
('Sanskrit', 'sa', 'san'),
('Sasak', '', 'sas'),
('Santali', '', 'sat'),
('Sicilian', '', 'scn'),
('Scots', '', 'sco'),
('Selkup', '', 'sel'),
('Semitic languages', '', 'sem'),
('Irish, Old (to 900)', '', 'sga'),
('Sign Languages', '', 'sgn'),
('Shan', '', 'shn'),
('Sidamo', '', 'sid'),
('Sinhala; Sinhalese', 'si', 'sin'),
('Siouan languages', '', 'sio'),
('Sino-Tibetan languages', '', 'sit'),
('Slavic languages', '', 'sla'),
('Slovak', 'sk', 'slo'),
('Slovenian', 'sl', 'slv'),
('Southern Sami', '', 'sma'),
('Northern Sami', 'se', 'sme'),
('Sami languages', '', 'smi'),
('Lule Sami', '', 'smj'),
('Inari Sami', '', 'smn'),
('Samoan', 'sm', 'smo'),
('Skolt Sami', '', 'sms'),
('Shona', 'sn', 'sna'),
('Sindhi', 'sd', 'snd'),
('Soninke', '', 'snk'),
('Sogdian', '', 'sog'),
('Somali', 'so', 'som'),
('Songhai languages', '', 'son'),
('Sotho, Southern', 'st', 'sot'),
('Spanish; Castilian', 'es', 'spa'),
('Sardinian', 'sc', 'srd'),
('Sranan Tongo', '', 'srn'),
('Serbian', 'sr', 'srp'),
('Serer', '', 'srr'),
('Nilo-Saharan languages', '', 'ssa'),
('Swati', 'ss', 'ssw'),
('Sukuma', '', 'suk'),
('Sundanese', 'su', 'sun'),
('Susu', '', 'sus'),
('Sumerian', '', 'sux'),
('Swahili', 'sw', 'swa'),
('Swedish', 'sv', 'swe'),
('Classical Syriac', '', 'syc'),
('Syriac', '', 'syr'),
('Tahitian', 'ty', 'tah'),
('Tai languages', '', 'tai'),
('Tamil', 'ta', 'tam'),
('Tatar', 'tt', 'tat'),
('Telugu', 'te', 'tel'),
('Timne', '', 'tem'),
('Tereno', '', 'ter'),
('Tetum', '', 'tet'),
('Tajik', 'tg', 'tgk'),
('Tagalog', 'tl', 'tgl'),
('Thai', 'th', 'tha'),
('Tibetan', 'bo', 'tib'),
('Tigre', '', 'tig'),
('Tigrinya', 'ti', 'tir'),
('Tiv', '', 'tiv'),
('Tokelau', '', 'tkl'),
('Klingon; tlhIngan-Hol', '', 'tlh'),
('Tlingit', '', 'tli'),
('Tamashek', '', 'tmh'),
('Tonga (Nyasa)', '', 'tog'),
('Tonga (Tonga Islands)', 'to', 'ton'),
('Tok Pisin', '', 'tpi'),
('Tsimshian', '', 'tsi'),
('Tswana', 'tn', 'tsn'),
('Tsonga', 'ts', 'tso'),
('Turkmen', 'tk', 'tuk'),
('Tumbuka', '', 'tum'),
('Tupi languages', '', 'tup'),
('Turkish', 'tr', 'tur'),
('Altaic languages', '', 'tut'),
('Tuvalu', '', 'tvl'),
('Twi', 'tw', 'twi'),
('Tuvinian', '', 'tyv'),
('Udmurt', '', 'udm'),
('Ugaritic', '', 'uga'),
('Uighur; Uyghur', 'ug', 'uig'),
('Ukrainian', 'uk', 'ukr'),
('Umbundu', '', 'umb'),
('Undetermined', '', 'und'),
('Urdu', 'ur', 'urd'),
('Uzbek', 'uz', 'uzb'),
('Vai', '', 'vai'),
('Venda', 've', 'ven'),
('Vietnamese', 'vi', 'vie'),
('Volapük', 'vo', 'vol'),
('Votic', '', 'vot'),
('Wakashan languages', '', 'wak'),
('Walamo', '', 'wal'),
('Waray', '', 'war'),
('Washo', '', 'was'),
('Welsh', 'cy', 'wel'),
('Sorbian languages', '', 'wen'),
('Walloon', 'wa', 'wln'),
('Wolof', 'wo', 'wol'),
('Kalmyk; Oirat', '', 'xal'),
('Xhosa', 'xh', 'xho'),
('Yao', '', 'yao'),
('Yapese', '', 'yap'),
('Yiddish', 'yi', 'yid'),
('Yoruba', 'yo', 'yor'),
('Yupik languages', '', 'ypk'),
('Zapotec', '', 'zap'),
('Blissymbols; Blissymbolics; Bliss', '', 'zbl'),
('Zenaga', '', 'zen'),
('Zhuang; Chuang', 'za', 'zha'),
('Zande languages', '', 'znd'),
('Zulu', 'zu', 'zul'),
('Zuni', '', 'zun'),
('No linguistic content; Not applicable', '', 'zxx'),
('Zaza; Dimili; Dimli; Kirdki; Kirmanjki; Zazaki', '', 'zza'),
('Brazilian', 'po', 'pob')]
+173
View File
@@ -0,0 +1,173 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import logging
from bs4 import BeautifulSoup, FeatureNotFound
from six.moves.xmlrpc_client import SafeTransport
from ..video import Episode, Movie
logger = logging.getLogger(__name__)
def get_version(version):
"""Put the `version` in the major.minor form.
:param str version: the full version.
:return: the major.minor form of the `version`.
:rtype: str
"""
return '.'.join(version.split('.')[:2])
class TimeoutSafeTransport(SafeTransport):
"""Timeout support for ``xmlrpc.client.SafeTransport``."""
def __init__(self, timeout, *args, **kwargs):
SafeTransport.__init__(self, *args, **kwargs)
self.timeout = timeout
def make_connection(self, host):
c = SafeTransport.make_connection(self, host)
c.timeout = self.timeout
return c
class ParserBeautifulSoup(BeautifulSoup):
"""A ``bs4.BeautifulSoup`` that picks the first parser available in `parsers`.
:param markup: markup for the ``bs4.BeautifulSoup``.
:param list parsers: parser names, in order of preference
"""
def __init__(self, markup, parsers, **kwargs):
# reject features
if set(parsers).intersection({'fast', 'permissive', 'strict', 'xml', 'html', 'html5'}):
raise ValueError('Features not allowed, only parser names')
# reject some kwargs
if 'features' in kwargs:
raise ValueError('Cannot use features kwarg')
if 'builder' in kwargs:
raise ValueError('Cannot use builder kwarg')
# pick the first parser available
for parser in parsers:
try:
super(ParserBeautifulSoup, self).__init__(markup, parser, **kwargs)
return
except FeatureNotFound:
pass
raise FeatureNotFound
class Provider(object):
"""Base class for providers.
If any configuration is possible for the provider, like credentials, it must take place during instantiation.
:raise: :class:`~subliminal.exceptions.ConfigurationError` if there is a configuration error
"""
#: Supported set of :class:`~babelfish.language.Language`
languages = set()
#: Supported video types
video_types = (Episode, Movie)
#: Required hash, if any
required_hash = None
def __enter__(self):
self.initialize()
return self
def __exit__(self, exc_type, exc_value, traceback):
self.terminate()
def initialize(self):
"""Initialize the provider.
Must be called when starting to work with the provider. This is the place for network initialization
or login operations.
.. note::
This is called automatically when entering the :keyword:`with` statement
"""
raise NotImplementedError
def terminate(self):
"""Terminate the provider.
Must be called when done with the provider. This is the place for network shutdown or logout operations.
.. note::
This is called automatically when exiting the :keyword:`with` statement
"""
raise NotImplementedError
@classmethod
def check(cls, video):
"""Check if the `video` can be processed.
The `video` is considered invalid if not an instance of :attr:`video_types` or if the :attr:`required_hash` is
not present in :attr:`~subliminal.video.Video.hashes` attribute of the `video`.
:param video: the video to check.
:type video: :class:`~subliminal.video.Video`
:return: `True` if the `video` is valid, `False` otherwise.
:rtype: bool
"""
if not isinstance(video, cls.video_types):
return False
if cls.required_hash is not None and cls.required_hash not in video.hashes:
return False
return True
def query(self, *args, **kwargs):
"""Query the provider for subtitles.
Arguments should match as much as possible the actual parameters for querying the provider
:return: found subtitles.
:rtype: list of :class:`~subliminal.subtitle.Subtitle`
:raise: :class:`~subliminal.exceptions.ProviderError`
"""
raise NotImplementedError
def list_subtitles(self, video, languages):
"""List subtitles for the `video` with the given `languages`.
This will call the :meth:`query` method internally. The parameters passed to the :meth:`query` method may
vary depending on the amount of information available in the `video`.
:param video: video to list subtitles for.
:type video: :class:`~subliminal.video.Video`
:param languages: languages to search for.
:type languages: set of :class:`~babelfish.language.Language`
:return: found subtitles.
:rtype: list of :class:`~subliminal.subtitle.Subtitle`
:raise: :class:`~subliminal.exceptions.ProviderError`
"""
raise NotImplementedError
def download_subtitle(self, subtitle):
"""Download `subtitle`'s :attr:`~subliminal.subtitle.Subtitle.content`.
:param subtitle: subtitle to download.
:type subtitle: :class:`~subliminal.subtitle.Subtitle`
:raise: :class:`~subliminal.exceptions.ProviderError`
"""
raise NotImplementedError
def __repr__(self):
return '<%s [%r]>' % (self.__class__.__name__, self.video_types)
+271
View File
@@ -0,0 +1,271 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import logging
import re
from babelfish import Language
from requests import Session
from . import ParserBeautifulSoup, Provider, get_version
from .. import __version__
from ..cache import SHOW_EXPIRATION_TIME, region
from ..exceptions import AuthenticationError, ConfigurationError, DownloadLimitExceeded
from ..subtitle import Subtitle, fix_line_ending, guess_matches, guess_properties
from ..video import Episode
logger = logging.getLogger(__name__)
series_year_re = re.compile('^(?P<series>[ \w]+)(?: \((?P<year>\d{4})\))?$')
class Addic7edSubtitle(Subtitle):
provider_name = 'addic7ed'
def __init__(self, language, hearing_impaired, page_link, series, season, episode, title, year, version,
download_link):
super(Addic7edSubtitle, self).__init__(language, hearing_impaired, page_link)
self.series = series
self.season = season
self.episode = episode
self.title = title
self.year = year
self.version = version
self.download_link = download_link
@property
def id(self):
return self.download_link
def get_matches(self, video, hearing_impaired=False):
matches = super(Addic7edSubtitle, self).get_matches(video, hearing_impaired=hearing_impaired)
# series
if video.series and self.series.lower() == video.series.lower():
matches.add('series')
# season
if video.season and self.season == video.season:
matches.add('season')
# episode
if video.episode and self.episode == video.episode:
matches.add('episode')
# title
if video.title and self.title.lower() == video.title.lower():
matches.add('title')
# year
if video.year == self.year:
matches.add('year')
# release_group
if video.release_group and self.version and video.release_group.lower() in self.version.lower():
matches.add('release_group')
# resolution
if video.resolution and self.version and video.resolution in self.version.lower():
matches.add('resolution')
# format
if video.format and self.version and video.format.lower() in self.version.lower():
matches.add('format')
# other properties
matches |= guess_matches(video, guess_properties(self.version), partial=True)
return matches
class Addic7edProvider(Provider):
languages = {Language('por', 'BR')} | {Language(l) for l in [
'ara', 'aze', 'ben', 'bos', 'bul', 'cat', 'ces', 'dan', 'deu', 'ell', 'eng', 'eus', 'fas', 'fin', 'fra', 'glg',
'heb', 'hrv', 'hun', 'hye', 'ind', 'ita', 'jpn', 'kor', 'mkd', 'msa', 'nld', 'nor', 'pol', 'por', 'ron', 'rus',
'slk', 'slv', 'spa', 'sqi', 'srp', 'swe', 'tha', 'tur', 'ukr', 'vie', 'zho'
]}
video_types = (Episode,)
server_url = 'http://www.addic7ed.com/'
def __init__(self, username=None, password=None):
if username is not None and password is None or username is None and password is not None:
raise ConfigurationError('Username and password must be specified')
self.username = username
self.password = password
self.logged_in = False
def initialize(self):
self.session = Session()
self.session.headers = {'User-Agent': 'Subliminal/%s' % get_version(__version__)}
# login
if self.username is not None and self.password is not None:
logger.info('Logging in')
data = {'username': self.username, 'password': self.password, 'Submit': 'Log in'}
r = self.session.post(self.server_url + 'dologin.php', data, allow_redirects=False, timeout=10)
if r.status_code != 302:
raise AuthenticationError(self.username)
logger.debug('Logged in')
self.logged_in = True
def terminate(self):
# logout
if self.logged_in:
logger.info('Logging out')
r = self.session.get(self.server_url + 'logout.php', timeout=10)
r.raise_for_status()
logger.debug('Logged out')
self.logged_in = False
self.session.close()
@region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME)
def _get_show_ids(self):
"""Get the ``dict`` of show ids per series by querying the `shows.php` page.
:return: show id per series, lower case and without quotes.
:rtype: dict
"""
# get the show page
logger.info('Getting show ids')
r = self.session.get(self.server_url + 'shows.php', timeout=10)
r.raise_for_status()
soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser'])
# populate the show ids
show_ids = {}
for show in soup.select('td.version > h3 > a[href^="/show/"]'):
show_ids[show.text.lower().replace('\'', '')] = int(show['href'][6:])
logger.debug('Found %d show ids', len(show_ids))
return show_ids
@region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME)
def _search_show_id(self, series, year=None):
"""Search the show id from the `series` and `year`.
:param string series: series of the episode.
:param year: year of the series, if any.
:type year: int or None
:return: the show id, if found.
:rtype: int or None
"""
# build the params
series_year = '%s (%d)' % (series, year) if year is not None else series
params = {'search': series_year, 'Submit': 'Search'}
# make the search
logger.info('Searching show ids with %r', params)
r = self.session.get(self.server_url + 'search.php', params=params, timeout=10)
r.raise_for_status()
soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser'])
# get the suggestion
suggestion = soup.select('span.titulo > a[href^="/show/"]')
if not suggestion:
logger.warning('Show id not found: no suggestion')
return None
if not suggestion[0].i.text.lower() == series_year.lower():
logger.warning('Show id not found: suggestion does not match')
return None
show_id = int(suggestion[0]['href'][6:])
logger.debug('Found show id %d', show_id)
return show_id
def get_show_id(self, series, year=None, country_code=None):
"""Get the best matching show id for `series`, `year` and `country_code`.
First search in the result of :meth:`_get_show_ids` and fallback on a search with :meth:`_search_show_id`
:param str series: series of the episode.
:param year: year of the series, if any.
:type year: int or None
:param country_code: country code of the series, if any.
:type country_code: str or None
:return: the show id, if found.
:rtype: int or None
"""
series_clean = series.lower().replace('\'', '')
show_ids = self._get_show_ids()
show_id = None
# attempt with country
if not show_id and country_code:
logger.debug('Getting show id with country')
show_id = show_ids.get('%s (%s)' % (series_clean, country_code.lower()))
# attempt with year
if not show_id and year:
logger.debug('Getting show id with year')
show_id = show_ids.get('%s (%d)' % (series_clean, year))
# attempt clean
if not show_id:
logger.debug('Getting show id')
show_id = show_ids.get(series_clean)
# search as last resort
if not show_id:
logger.warning('Series not found in show ids')
show_id = self._search_show_id(series)
return show_id
def query(self, series, season, year=None, country=None):
# get the show id
show_id = self.get_show_id(series, year, country)
if show_id is None:
logger.error('No show id found for %r (%r)', series, {'year': year, 'country': country})
return []
# get the page of the season of the show
logger.info('Getting the page of show id %d, season %d', show_id, season)
r = self.session.get(self.server_url + 'show/%d' % show_id, params={'season': season}, timeout=10)
r.raise_for_status()
soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser'])
# loop over subtitle rows
match = series_year_re.match(soup.select('#header font')[0].text.strip()[:-10])
series = match.group('series')
year = int(match.group('year')) if match.group('year') else None
subtitles = []
for row in soup.select('tr.epeven'):
cells = row('td')
# ignore incomplete subtitles
status = cells[5].text
if status != 'Completed':
logger.debug('Ignoring subtitle with status %s', status)
continue
# read the item
language = Language.fromaddic7ed(cells[3].text)
hearing_impaired = bool(cells[6].text)
page_link = self.server_url + cells[2].a['href'][1:]
season = int(cells[0].text)
episode = int(cells[1].text)
title = cells[2].text
version = cells[4].text
download_link = cells[9].a['href'][1:]
subtitle = Addic7edSubtitle(language, hearing_impaired, page_link, series, season, episode, title, year,
version, download_link)
logger.debug('Found subtitle %r', subtitle)
subtitles.append(subtitle)
return subtitles
def list_subtitles(self, video, languages):
return [s for s in self.query(video.series, video.season, video.year)
if s.language in languages and s.episode == video.episode]
def download_subtitle(self, subtitle):
# download the subtitle
logger.info('Downloading subtitle %r', subtitle)
r = self.session.get(self.server_url + subtitle.download_link, headers={'Referer': subtitle.page_link},
timeout=10)
r.raise_for_status()
# detect download limit exceeded
if r.headers['Content-Type'] == 'text/html':
raise DownloadLimitExceeded
subtitle.content = fix_line_ending(r.content)
+255
View File
@@ -0,0 +1,255 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import base64
import logging
import os
import re
import zlib
from babelfish import Language, language_converters
from guessit import guess_episode_info, guess_movie_info
from six.moves.xmlrpc_client import ServerProxy
from . import Provider, TimeoutSafeTransport, get_version
from .. import __version__
from ..exceptions import AuthenticationError, DownloadLimitExceeded, ProviderError
from ..subtitle import Subtitle, fix_line_ending, guess_matches
from ..video import Episode, Movie
logger = logging.getLogger(__name__)
class OpenSubtitlesSubtitle(Subtitle):
provider_name = 'opensubtitles'
series_re = re.compile('^"(?P<series_name>.*)" (?P<series_title>.*)$')
def __init__(self, language, hearing_impaired, page_link, subtitle_id, matched_by, movie_kind, hash, movie_name,
movie_release_name, movie_year, movie_imdb_id, series_season, series_episode):
super(OpenSubtitlesSubtitle, self).__init__(language, hearing_impaired, page_link)
self.subtitle_id = subtitle_id
self.matched_by = matched_by
self.movie_kind = movie_kind
self.hash = hash
self.movie_name = movie_name
self.movie_release_name = movie_release_name
self.movie_year = movie_year
self.movie_imdb_id = movie_imdb_id
self.series_season = series_season
self.series_episode = series_episode
@property
def id(self):
return str(self.subtitle_id)
@property
def series_name(self):
return self.series_re.match(self.movie_name).group('series_name')
@property
def series_title(self):
return self.series_re.match(self.movie_name).group('series_title')
def get_matches(self, video, hearing_impaired=False):
matches = super(OpenSubtitlesSubtitle, self).get_matches(video, hearing_impaired=hearing_impaired)
# episode
if isinstance(video, Episode) and self.movie_kind == 'episode':
# series
if video.series and self.series_name.lower() == video.series.lower():
matches.add('series')
# season
if video.season and self.series_season == video.season:
matches.add('season')
# episode
if video.episode and self.series_episode == video.episode:
matches.add('episode')
# title
if video.title and self.series_title.lower() == video.title.lower():
matches.add('title')
# guess
matches |= guess_matches(video, guess_episode_info(self.movie_release_name + '.mkv'))
# movie
elif isinstance(video, Movie) and self.movie_kind == 'movie':
# title
if video.title and self.movie_name.lower() == video.title.lower():
matches.add('title')
# year
if video.year and self.movie_year == video.year:
matches.add('year')
# guess
matches |= guess_matches(video, guess_movie_info(self.movie_release_name + '.mkv'))
else:
logger.info('%r is not a valid movie_kind', self.movie_kind)
return matches
# hash
if 'opensubtitles' in video.hashes and self.hash == video.hashes['opensubtitles']:
matches.add('hash')
# imdb_id
if video.imdb_id and self.movie_imdb_id == video.imdb_id:
matches.add('imdb_id')
return matches
class OpenSubtitlesProvider(Provider):
languages = {Language.fromopensubtitles(l) for l in language_converters['opensubtitles'].codes}
def __init__(self):
self.server = ServerProxy('https://api.opensubtitles.org/xml-rpc', TimeoutSafeTransport(10))
self.token = None
def initialize(self):
logger.info('Logging in')
response = checked(self.server.LogIn('', '', 'eng', 'subliminal v%s' % get_version(__version__)))
self.token = response['token']
logger.debug('Logged in with token %r', self.token)
def terminate(self):
logger.info('Logging out')
checked(self.server.LogOut(self.token))
self.server.close()
logger.debug('Logged out')
def no_operation(self):
logger.debug('No operation')
checked(self.server.NoOperation(self.token))
def query(self, languages, hash=None, size=None, imdb_id=None, query=None, season=None, episode=None):
# fill the search criteria
criteria = []
if hash and size:
criteria.append({'moviehash': hash, 'moviebytesize': str(size)})
if imdb_id:
criteria.append({'imdbid': imdb_id})
if query and season and episode:
criteria.append({'query': query, 'season': season, 'episode': episode})
elif query:
criteria.append({'query': query})
if not criteria:
raise ValueError('Not enough information')
# add the language
for criterion in criteria:
criterion['sublanguageid'] = ','.join(sorted(l.opensubtitles for l in languages))
# query the server
logger.info('Searching subtitles %r', criteria)
response = checked(self.server.SearchSubtitles(self.token, criteria))
subtitles = []
# exit if no data
if not response['data']:
logger.info('No subtitles found')
return subtitles
# loop over subtitle items
for subtitle_item in response['data']:
# read the item
language = Language.fromopensubtitles(subtitle_item['SubLanguageID'])
hearing_impaired = bool(int(subtitle_item['SubHearingImpaired']))
page_link = subtitle_item['SubtitlesLink']
subtitle_id = int(subtitle_item['IDSubtitleFile'])
matched_by = subtitle_item['MatchedBy']
movie_kind = subtitle_item['MovieKind']
hash = subtitle_item['MovieHash']
movie_name = subtitle_item['MovieName']
movie_release_name = subtitle_item['MovieReleaseName']
movie_year = int(subtitle_item['MovieYear']) if subtitle_item['MovieYear'] else None
movie_imdb_id = int(subtitle_item['IDMovieImdb'])
series_season = int(subtitle_item['SeriesSeason']) if subtitle_item['SeriesSeason'] else None
series_episode = int(subtitle_item['SeriesEpisode']) if subtitle_item['SeriesEpisode'] else None
subtitle = OpenSubtitlesSubtitle(language, hearing_impaired, page_link, subtitle_id, matched_by, movie_kind,
hash, movie_name, movie_release_name, movie_year, movie_imdb_id,
series_season, series_episode)
logger.debug('Found subtitle %r', subtitle)
subtitles.append(subtitle)
return subtitles
def list_subtitles(self, video, languages):
query = season = episode = None
if isinstance(video, Episode):
query = video.series
season = video.season
episode = video.episode
elif ('opensubtitles' not in video.hashes or not video.size) and not video.imdb_id:
query = video.name.split(os.sep)[-1]
return self.query(languages, hash=video.hashes.get('opensubtitles'), size=video.size, imdb_id=video.imdb_id,
query=query, season=season, episode=episode)
def download_subtitle(self, subtitle):
logger.info('Downloading subtitle %r', subtitle)
response = checked(self.server.DownloadSubtitles(self.token, [str(subtitle.subtitle_id)]))
subtitle.content = fix_line_ending(zlib.decompress(base64.b64decode(response['data'][0]['data']), 47))
class OpenSubtitlesError(ProviderError):
"""Base class for non-generic :class:`OpenSubtitlesProvider` exceptions."""
pass
class Unauthorized(OpenSubtitlesError, AuthenticationError):
"""Exception raised when status is '401 Unauthorized'."""
pass
class NoSession(OpenSubtitlesError, AuthenticationError):
"""Exception raised when status is '406 No session'."""
pass
class DownloadLimitReached(OpenSubtitlesError, DownloadLimitExceeded):
"""Exception raised when status is '407 Download limit reached'."""
pass
class InvalidImdbid(OpenSubtitlesError):
"""Exception raised when status is '413 Invalid ImdbID'."""
pass
class UnknownUserAgent(OpenSubtitlesError, AuthenticationError):
"""Exception raised when status is '414 Unknown User Agent'."""
pass
class DisabledUserAgent(OpenSubtitlesError, AuthenticationError):
"""Exception raised when status is '415 Disabled user agent'."""
pass
class ServiceUnavailable(OpenSubtitlesError):
"""Exception raised when status is '503 Service Unavailable'."""
pass
def checked(response):
"""Check a response status before returning it.
:param response: a response from a XMLRPC call to OpenSubtitles.
:return: the response.
:raise: :class:`OpenSubtitlesError`
"""
status_code = int(response['status'][:3])
if status_code == 401:
raise Unauthorized
if status_code == 406:
raise NoSession
if status_code == 407:
raise DownloadLimitReached
if status_code == 413:
raise InvalidImdbid
if status_code == 414:
raise UnknownUserAgent
if status_code == 415:
raise DisabledUserAgent
if status_code == 503:
raise ServiceUnavailable
if status_code != 200:
raise OpenSubtitlesError(response['status'])
return response
+173
View File
@@ -0,0 +1,173 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import io
import logging
import re
from babelfish import Language, language_converters
from guessit import guess_episode_info, guess_movie_info
try:
from lxml import etree
except ImportError:
try:
import xml.etree.cElementTree as etree
except ImportError:
import xml.etree.ElementTree as etree
from requests import Session
from zipfile import ZipFile
from . import Provider, get_version
from .. import __version__
from ..exceptions import ProviderError
from ..subtitle import Subtitle, fix_line_ending, guess_matches
from ..video import Episode, Movie
logger = logging.getLogger(__name__)
class PodnapisiSubtitle(Subtitle):
provider_name = 'podnapisi'
def __init__(self, language, hearing_impaired, page_link, pid, releases, title, season=None, episode=None,
year=None):
super(PodnapisiSubtitle, self).__init__(language, hearing_impaired, page_link)
self.pid = pid
self.releases = releases
self.title = title
self.season = season
self.episode = episode
self.year = year
@property
def id(self):
return self.pid
def get_matches(self, video, hearing_impaired=False):
matches = super(PodnapisiSubtitle, self).get_matches(video, hearing_impaired=hearing_impaired)
# episode
if isinstance(video, Episode):
# series
if video.series and self.title.lower() == video.series.lower():
matches.add('series')
# season
if video.season and self.season == video.season:
matches.add('season')
# episode
if video.episode and self.episode == video.episode:
matches.add('episode')
# guess
for release in self.releases:
matches |= guess_matches(video, guess_episode_info(release + '.mkv'))
# movie
elif isinstance(video, Movie):
# title
if video.title and self.title.lower() == video.title.lower():
matches.add('title')
# guess
for release in self.releases:
matches |= guess_matches(video, guess_movie_info(release + '.mkv'))
# year
if video.year and self.year == video.year:
matches.add('year')
return matches
class PodnapisiProvider(Provider):
languages = ({Language('por', 'BR'), Language('srp', script='Latn')} |
{Language.fromalpha2(l) for l in language_converters['alpha2'].codes})
video_types = (Episode, Movie)
server_url = 'http://podnapisi.net/subtitles/'
def initialize(self):
self.session = Session()
self.session.headers = {'User-Agent': 'Subliminal/%s' % get_version(__version__)}
def terminate(self):
self.session.close()
def query(self, language, keyword, season=None, episode=None, year=None):
# set parameters, see http://www.podnapisi.net/forum/viewtopic.php?f=62&t=26164#p212652
params = {'sXML': 1, 'sL': str(language), 'sK': keyword}
is_episode = False
if season and episode:
is_episode = True
params['sTS'] = season
params['sTE'] = episode
if year:
params['sY'] = year
# loop over paginated results
logger.info('Searching subtitles %r', params)
subtitles = []
pids = set()
while True:
# query the server
xml = etree.fromstring(self.session.get(self.server_url + 'search/old', params=params, timeout=10).content)
# exit if no results
if not int(xml.find('pagination/results').text):
logger.debug('No subtitles found')
break
# loop over subtitles
for subtitle_xml in xml.findall('subtitle'):
# read xml elements
language = Language.fromietf(subtitle_xml.find('language').text)
hearing_impaired = 'n' in (subtitle_xml.find('flags').text or '')
page_link = subtitle_xml.find('url').text
pid = subtitle_xml.find('pid').text
releases = []
if subtitle_xml.find('release').text:
for release in subtitle_xml.find('release').text.split():
releases.append(re.sub(r'\.+$', '', release)) # remove trailing dots
title = subtitle_xml.find('title').text
season = int(subtitle_xml.find('tvSeason').text)
episode = int(subtitle_xml.find('tvEpisode').text)
year = int(subtitle_xml.find('year').text)
if is_episode:
subtitle = PodnapisiSubtitle(language, hearing_impaired, page_link, pid, releases, title,
season=season, episode=episode, year=year)
else:
subtitle = PodnapisiSubtitle(language, hearing_impaired, page_link, pid, releases, title,
year=year)
# ignore duplicates, see http://www.podnapisi.net/forum/viewtopic.php?f=62&t=26164&start=10#p213321
if pid in pids:
continue
logger.debug('Found subtitle %r', subtitle)
subtitles.append(subtitle)
pids.add(pid)
# stop on last page
if int(xml.find('pagination/current').text) >= int(xml.find('pagination/count').text):
break
# increment current page
params['page'] = int(xml.find('pagination/current').text) + 1
logger.debug('Getting page %d', params['page'])
return subtitles
def list_subtitles(self, video, languages):
if isinstance(video, Episode):
return [s for l in languages for s in self.query(l, video.series, season=video.season,
episode=video.episode, year=video.year)]
elif isinstance(video, Movie):
return [s for l in languages for s in self.query(l, video.title, year=video.year)]
def download_subtitle(self, subtitle):
# download as a zip
logger.info('Downloading subtitle %r')
r = self.session.get(self.server_url + subtitle.pid + '/download', params={'container': 'zip'}, timeout=10)
r.raise_for_status()
# open the zip
with ZipFile(io.BytesIO(r.content)) as zf:
if len(zf.namelist()) > 1:
raise ProviderError('More than one file to unzip')
subtitle.content = fix_line_ending(zf.read(zf.namelist()[0]))
+82
View File
@@ -0,0 +1,82 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import logging
from babelfish import Language
from requests import Session
from . import Provider, get_version
from .. import __version__
from ..subtitle import Subtitle, fix_line_ending
logger = logging.getLogger(__name__)
class TheSubDBSubtitle(Subtitle):
provider_name = 'thesubdb'
def __init__(self, language, hash):
super(TheSubDBSubtitle, self).__init__(language)
self.hash = hash
@property
def id(self):
return self.hash
def get_matches(self, video, hearing_impaired=False):
matches = super(TheSubDBSubtitle, self).get_matches(video, hearing_impaired=hearing_impaired)
# hash
if 'thesubdb' in video.hashes and video.hashes['thesubdb'] == self.hash:
matches.add('hash')
return matches
class TheSubDBProvider(Provider):
languages = {Language.fromalpha2(l) for l in ['en', 'es', 'fr', 'it', 'nl', 'pl', 'pt', 'ro', 'sv', 'tr']}
required_hash = 'thesubdb'
server_url = 'http://api.thesubdb.com/'
def initialize(self):
self.session = Session()
self.session.headers = {'User-Agent': 'SubDB/1.0 (subliminal/%s; https://github.com/Diaoul/subliminal)' %
get_version(__version__)}
def terminate(self):
self.session.close()
def query(self, hash):
# make the query
params = {'action': 'search', 'hash': hash}
logger.info('Searching subtitles %r', params)
r = self.session.get(self.server_url, params=params, timeout=10)
# handle subtitles not found and errors
if r.status_code == 404:
logger.debug('No subtitles found')
return []
r.raise_for_status()
# loop over languages
subtitles = []
for language_code in r.text.split(','):
language = Language.fromalpha2(language_code)
subtitle = TheSubDBSubtitle(language, hash)
logger.info('Found subtitle %r', subtitle)
subtitles.append(subtitle)
return subtitles
def list_subtitles(self, video, languages):
return [s for s in self.query(video.hashes['thesubdb']) if s.language in languages]
def download_subtitle(self, subtitle):
logger.info('Downloading subtitle %r')
params = {'action': 'download', 'hash': subtitle.hash, 'language': subtitle.language.alpha2}
r = self.session.get(self.server_url, params=params, timeout=10)
r.raise_for_status()
subtitle.content = fix_line_ending(r.content)
+202
View File
@@ -0,0 +1,202 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import io
import logging
import re
from zipfile import ZipFile
from babelfish import Language
from requests import Session
from . import ParserBeautifulSoup, Provider, get_version
from .. import __version__
from ..cache import EPISODE_EXPIRATION_TIME, SHOW_EXPIRATION_TIME, region
from ..exceptions import ProviderError
from ..subtitle import Subtitle, fix_line_ending, guess_matches, guess_properties
from ..video import Episode
logger = logging.getLogger(__name__)
link_re = re.compile('^(?P<series>.+?)(?: \(?\d{4}\)?| \((?:US|UK)\))? \((?P<first_year>\d{4})-\d{4}\)$')
episode_id_re = re.compile('^episode-\d+\.html$')
class TVsubtitlesSubtitle(Subtitle):
provider_name = 'tvsubtitles'
def __init__(self, language, page_link, subtitle_id, series, season, episode, year, rip, release):
super(TVsubtitlesSubtitle, self).__init__(language, page_link=page_link)
self.subtitle_id = subtitle_id
self.series = series
self.season = season
self.episode = episode
self.year = year
self.rip = rip
self.release = release
@property
def id(self):
return str(self.subtitle_id)
def get_matches(self, video, hearing_impaired=False):
matches = super(TVsubtitlesSubtitle, self).get_matches(video, hearing_impaired=hearing_impaired)
# series
if video.series and self.series.lower() == video.series.lower():
matches.add('series')
# season
if video.season and self.season == video.season:
matches.add('season')
# episode
if video.episode and self.episode == video.episode:
matches.add('episode')
# year
if self.year == video.year:
matches.add('year')
# release_group
if video.release_group and self.release and video.release_group.lower() in self.release.lower():
matches.add('release_group')
# other properties
if self.release:
matches |= guess_matches(video, guess_properties(self.release), partial=True)
if self.rip:
matches |= guess_matches(video, guess_properties(self.rip), partial=True)
return matches
class TVsubtitlesProvider(Provider):
languages = {Language('por', 'BR')} | {Language(l) for l in [
'ara', 'bul', 'ces', 'dan', 'deu', 'ell', 'eng', 'fin', 'fra', 'hun', 'ita', 'jpn', 'kor', 'nld', 'pol', 'por',
'ron', 'rus', 'spa', 'swe', 'tur', 'ukr', 'zho'
]}
video_types = (Episode,)
server_url = 'http://www.tvsubtitles.net/'
def initialize(self):
self.session = Session()
self.session.headers = {'User-Agent': 'Subliminal/%s' % get_version(__version__)}
def terminate(self):
self.session.close()
@region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME)
def search_show_id(self, series, year=None):
"""Search the show id from the `series` and `year`.
:param string series: series of the episode.
:param year: year of the series, if any.
:type year: int or None
:return: the show id, if any.
:rtype: int or None
"""
# make the search
logger.info('Searching show id for %r', series)
r = self.session.post(self.server_url + 'search.php', data={'q': series}, timeout=10)
r.raise_for_status()
# get the series out of the suggestions
soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser'])
show_id = None
for suggestion in soup.select('div.left li div a[href^="/tvshow-"]'):
match = link_re.match(suggestion.text)
if not match:
logger.error('Failed to match %s', suggestion.text)
continue
if match.group('series').lower() == series.lower():
if year is not None and int(match.group('first_year')) != year:
logger.debug('Year does not match')
continue
show_id = int(suggestion['href'][8:-5])
logger.debug('Found show id %d', show_id)
break
return show_id
@region.cache_on_arguments(expiration_time=EPISODE_EXPIRATION_TIME)
def get_episode_ids(self, show_id, season):
"""Get episode ids from the show id and the season.
:param int show_id: show id.
:param int season: season of the episode.
:return: episode ids per episode number.
:rtype: dict
"""
# get the page of the season of the show
logger.info('Getting the page of show id %d, season %d', show_id, season)
r = self.session.get(self.server_url + 'tvshow-%d-%d.html' % (show_id, season), timeout=10)
soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser'])
# loop over episode rows
episode_ids = {}
for row in soup.select('table#table5 tr'):
# skip rows that do not have a link to the episode page
if not row('a', href=episode_id_re):
continue
# extract data from the cells
cells = row('td')
episode = int(cells[0].text.split('x')[1])
episode_id = int(cells[1].a['href'][8:-5])
episode_ids[episode] = episode_id
if episode_ids:
logger.debug('Found episode ids %r', episode_ids)
else:
logger.warning('No episode ids found')
return episode_ids
def query(self, series, season, episode, year=None):
# search the show id
show_id = self.search_show_id(series, year)
if show_id is None:
logger.error('No show id found for %r (%r)', series, {'year': year})
return []
# get the episode ids
episode_ids = self.get_episode_ids(show_id, season)
if episode not in episode_ids:
logger.error('Episode %d not found', episode)
return []
# get the episode page
logger.info('Getting the page for episode %d', episode_ids[episode])
r = self.session.get(self.server_url + 'episode-%d.html' % episode_ids[episode], timeout=10)
soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser'])
# loop over subtitles rows
subtitles = []
for row in soup.select('.subtitlen'):
# read the item
language = Language.fromtvsubtitles(row.h5.img['src'][13:-4])
subtitle_id = int(row.parent['href'][10:-5])
page_link = self.server_url + 'subtitle-%d.html' % subtitle_id
rip = row.find('p', title='rip').text.strip() or None
release = row.find('p', title='release').text.strip() or None
subtitle = TVsubtitlesSubtitle(language, page_link, subtitle_id, series, season, episode, year, rip,
release)
logger.info('Found subtitle %s', subtitle)
subtitles.append(subtitle)
return subtitles
def list_subtitles(self, video, languages):
return [s for s in self.query(video.series, video.season, video.episode, video.year) if s.language in languages]
def download_subtitle(self, subtitle):
# download as a zip
logger.info('Downloading subtitle %r', subtitle)
r = self.session.get(self.server_url + 'download-%d.html' % subtitle.subtitle_id, timeout=10)
r.raise_for_status()
# open the zip
with ZipFile(io.BytesIO(r.content)) as zf:
if len(zf.namelist()) > 1:
raise ProviderError('More than one file to unzip')
subtitle.content = fix_line_ending(zf.read(zf.namelist()[0]))
+125
View File
@@ -0,0 +1,125 @@
# -*- coding: utf-8 -*-
"""
This module is responsible for calculating the :attr:`~subliminal.video.Video.scores` dicts
(:attr:`Episode.scores <subliminal.video.Episode.scores>` and :attr:`Movie.scores <subliminal.video.Movie.scores>`)
by assigning a score to a match.
.. note::
To avoid unnecessary dependency on `sympy <http://www.sympy.org/>`_ and boost subliminal's import time, the
resulting scores are hardcoded in their respective classes and manually updated when the set of equations change.
Available matches:
* hearing_impaired
* format
* release_group
* resolution
* video_codec
* audio_codec
* imdb_id
* hash
* title
* year
* series
* season
* episode
* tvdb_id
The :meth:`Subtitle.get_matches <subliminal.subtitle.Subtitle.get_matches>` method get the matches between the
:class:`~subliminal.subtitle.Subtitle` and the :class:`~subliminal.video.Video` and
:func:`~subliminal.subtitle.compute_score` computes the score.
"""
from __future__ import unicode_literals, print_function
from sympy import Eq, solve, symbols
# Symbols
hearing_impaired, format, release_group, resolution = symbols('hearing_impaired format release_group resolution')
video_codec, audio_codec, imdb_id, hash, title, year = symbols('video_codec audio_codec imdb_id hash title year')
series, season, episode, tvdb_id = symbols('series season episode tvdb_id')
def solve_episode_equations():
"""Solve the score equations for an :class:`~subliminal.video.Episode`.
The equations are the following:
1. hash = resolution + format + video_codec + audio_codec + series + season + episode + year + release_group
2. series = resolution + video_codec + audio_codec + season + episode + release_group + 1
3. year = series
4. tvdb_id = series + year
5. season = resolution + video_codec + audio_codec + 1
6. imdb_id = series + season + episode + year
7. format = video_codec + audio_codec
8. resolution = video_codec
9. video_codec = 2 * audio_codec
10. title = season + episode
11. season = episode
12. release_group = season
13. audio_codec = 2 * hearing_impaired
14. hearing_impaired = 1
:return: the result of the equations.
:rtype: dict
"""
equations = [
Eq(hash, resolution + format + video_codec + audio_codec + series + season + episode + year + release_group),
Eq(series, resolution + video_codec + audio_codec + season + episode + release_group + 1),
Eq(year, series),
Eq(tvdb_id, series + year),
Eq(season, resolution + video_codec + audio_codec + 1),
Eq(imdb_id, series + season + episode + year),
Eq(format, video_codec + audio_codec),
Eq(resolution, video_codec),
Eq(video_codec, 2 * audio_codec),
Eq(title, season + episode),
Eq(season, episode),
Eq(release_group, season),
Eq(audio_codec, 2 * hearing_impaired),
Eq(hearing_impaired, 1)
]
return solve(equations, [hearing_impaired, format, release_group, resolution, video_codec, audio_codec, imdb_id,
hash, series, season, episode, title, year, tvdb_id])
def solve_movie_equations():
"""Solve the score equations for a :class:`~subliminal.video.Movie`.
The equations are the following:
1. hash = resolution + format + video_codec + audio_codec + title + year + release_group
2. imdb_id = hash
3. resolution = video_codec
4. video_codec = 2 * audio_codec
5. format = video_codec + audio_codec
6. title = resolution + video_codec + audio_codec + year + 1
7. release_group = resolution + video_codec + audio_codec + 1
8. year = release_group + 1
9. audio_codec = 2 * hearing_impaired
10. hearing_impaired = 1
:return: the result of the equations.
:rtype: dict
"""
equations = [
Eq(hash, resolution + format + video_codec + audio_codec + title + year + release_group),
Eq(imdb_id, hash),
Eq(resolution, video_codec),
Eq(video_codec, 2 * audio_codec),
Eq(format, video_codec + audio_codec),
Eq(title, resolution + video_codec + audio_codec + year + 1),
Eq(release_group, resolution + video_codec + audio_codec + 1),
Eq(year, release_group + 1),
Eq(audio_codec, 2 * hearing_impaired),
Eq(hearing_impaired, 1)
]
return solve(equations, [hearing_impaired, format, release_group, resolution, video_codec, audio_codec, imdb_id,
hash, title, year])
-214
View File
@@ -1,214 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2011-2012 Antoine Bertin <diaoulael@gmail.com>
#
# This file is part of subliminal.
#
# subliminal is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# subliminal is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with subliminal. If not, see <http://www.gnu.org/licenses/>.
from ..exceptions import MissingLanguageError, DownloadFailedError
import logging
import os
import requests
import threading
__all__ = ['ServiceBase', 'ServiceConfig']
logger = logging.getLogger(__name__)
class ServiceBase(object):
"""Service base class
:param config: service configuration
:type config: :class:`ServiceConfig`
"""
#: URL to the service server
server_url = ''
#: User Agent for any HTTP-based requests
user_agent = 'subliminal v0.5'
#: Whether based on an API or not
api_based = False
#: Timeout for web requests
timeout = 5
#: Lock for cache interactions
lock = threading.Lock()
#: Mapping to Service's language codes and subliminal's
languages = {}
#: Whether the mapping is reverted or not
reverted_languages = False
#: Accepted video classes (:class:`~subliminal.videos.Episode`, :class:`~subliminal.videos.Movie`, :class:`~subliminal.videos.UnknownVideo`)
videos = []
#: Whether the video has to exist or not
require_video = False
def __init__(self, config=None):
self.config = config or ServiceConfig()
def __enter__(self):
self.init()
return self
def __exit__(self, *args):
self.terminate()
def init(self):
"""Initialize connection"""
logger.debug(u'Initializing %s' % self.__class__.__name__)
self.session = requests.session(timeout=10, headers={'User-Agent': self.user_agent})
def terminate(self):
"""Terminate connection"""
logger.debug(u'Terminating %s' % self.__class__.__name__)
def query(self, *args):
"""Make the actual query"""
pass
def list(self, video, languages):
"""List subtitles"""
pass
def download(self, subtitle):
"""Download a subtitle"""
self.download_file(subtitle.link, subtitle.path)
@classmethod
def available_languages(cls):
"""Available languages in the Service
:return: available languages
:rtype: set
"""
if not cls.reverted_languages:
return set(cls.languages.keys())
return set(cls.languages.values())
@classmethod
def check_validity(cls, video, languages):
"""Check for video and languages validity in the Service
:param video: the video to check
:type video: :class:`~subliminal.videos.video`
:param set languages: languages to check
:rtype: bool
"""
languages &= cls.available_languages()
if not languages:
logger.debug(u'No language available for service %s' % cls.__class__.__name__.lower())
return False
if not cls.is_valid_video(video):
logger.debug(u'%r is not valid for service %s' % (video, cls.__class__.__name__.lower()))
return False
return True
@classmethod
def is_valid_video(cls, video):
"""Check if video is valid in the Service
:param video: the video to check
:type video: :class:`~subliminal.videos.Video`
:rtype: bool
"""
if cls.require_video and not video.exists:
return False
if not isinstance(video, tuple(cls.videos)):
return False
return True
@classmethod
def is_valid_language(cls, language):
"""Check if language is valid in the Service
:param string language: the language to check
:rtype: bool
"""
if language in cls.available_languages():
return True
return False
@classmethod
def get_revert_language(cls, language):
"""ISO-639-1 language code from service language code
:param string language: service language code
:return: ISO-639-1 language code
:rtype: string
"""
if not cls.reverted_languages and language in cls.languages.values():
return [k for k, v in cls.languages.iteritems() if v == language][0]
if cls.reverted_languages and language in cls.languages.keys():
return cls.languages[language]
raise MissingLanguageError(language)
@classmethod
def get_language(cls, language):
"""Service language code from ISO-639-1 language code
:param string language: ISO-639-1 language code
:return: service language code
:rtype: string
"""
if not cls.reverted_languages and language in cls.languages.keys():
return cls.languages[language]
if cls.reverted_languages and language in cls.languages.values():
return [k for k, v in cls.languages.iteritems() if v == language][0]
raise MissingLanguageError(language)
def download_file(self, url, filepath):
"""Attempt to download a file and remove it in case of failure
:param string url: URL to download
:param string filepath: destination path
"""
logger.info(u'Downloading %s' % url)
try:
r = self.session.get(url, headers={'Referer': url, 'User-Agent': self.user_agent})
with open(filepath, 'wb') as f:
f.write(r.content)
except Exception as e:
logger.error(u'Download %s failed: %s' % (url, e))
if os.path.exists(filepath):
os.remove(filepath)
raise DownloadFailedError(str(e))
logger.debug(u'Download finished for file %s. Size: %s' % (filepath, os.path.getsize(filepath)))
class ServiceConfig(object):
"""Configuration for any :class:`Service`
:param bool multi: whether to download one subtitle per language or not
:param string cache_dir: cache directory
"""
def __init__(self, multi=False, cache_dir=None):
self.multi = multi
self.cache_dir = cache_dir
def __repr__(self):
return 'ServiceConfig(%r, %s)' % (self.multi, self.cache_dir)
-122
View File
@@ -1,122 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2011-2012 Antoine Bertin <diaoulael@gmail.com>
#
# This file is part of subliminal.
#
# subliminal is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# subliminal is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with subliminal. If not, see <http://www.gnu.org/licenses/>.
from . import ServiceBase
from ..exceptions import ServiceError
from ..subtitles import get_subtitle_path, ResultSubtitle
from ..videos import Episode
from ..utils import to_unicode
import BeautifulSoup
import logging
import os.path
import urllib
try:
import cPickle as pickle
except ImportError:
import pickle
logger = logging.getLogger(__name__)
class BierDopje(ServiceBase):
server_url = 'http://api.bierdopje.com/A2B638AC5D804C2E/'
api_based = True
languages = {'en': 'en', 'nl': 'nl'}
reverted_languages = False
videos = [Episode]
require_video = False
def __init__(self, config=None):
super(BierDopje, self).__init__(config)
self.showids = {}
if self.config and self.config.cache_dir:
self.init_cache()
def init_cache(self):
logger.debug(u'Initializing cache...')
if not self.config or not self.config.cache_dir:
raise ServiceError('Cache directory is required')
self.showids_cache = os.path.join(self.config.cache_dir, 'bierdopje_showids.cache')
if not os.path.exists(self.showids_cache):
self.save_cache()
def save_cache(self):
logger.debug(u'Saving showids to cache...')
with self.lock:
with open(self.showids_cache, 'w') as f:
pickle.dump(self.showids, f)
def load_cache(self):
logger.debug(u'Loading showids from cache...')
with self.lock:
with open(self.showids_cache, 'r') as f:
self.showids = pickle.load(f)
def query(self, season, episode, languages, filepath, tvdbid=None, series=None):
self.load_cache()
if series:
if series.lower() in self.showids: # from cache
request_id = self.showids[series.lower()]
logger.debug(u'Retreived showid %d for %s from cache' % (request_id, series))
else: # query to get showid
logger.debug(u'Getting showid from show name %s...' % series)
r = self.session.get('%sGetShowByName/%s' % (self.server_url, urllib.quote(series.lower())))
if r.status_code != 200:
logger.error(u'Request %s returned status code %d' % (r.url, r.status_code))
return []
soup = BeautifulSoup.BeautifulStoneSoup(r.content)
if soup.status.contents[0] == 'false':
logger.debug(u'Could not find show %s' % series)
return []
request_id = int(soup.showid.contents[0])
self.showids[series.lower()] = request_id
self.save_cache()
request_source = 'showid'
request_is_tvdbid = 'false'
elif tvdbid:
request_id = tvdbid
request_source = 'tvdbid'
request_is_tvdbid = 'true'
else:
raise ServiceError('One or more parameter missing')
subtitles = []
for language in languages:
logger.debug(u'Getting subtitles for %s %d season %d episode %d with language %s' % (request_source, request_id, season, episode, language))
r = self.session.get('%sGetAllSubsFor/%s/%s/%s/%s/%s' % (self.server_url, request_id, season, episode, language, request_is_tvdbid))
if r.status_code != 200:
logger.error(u'Request %s returned status code %d' % (r.url, r.status_code))
return []
soup = BeautifulSoup.BeautifulStoneSoup(r.content)
if soup.status.contents[0] == 'false':
logger.debug(u'Could not find subtitles for %s %d season %d episode %d with language %s' % (request_source, request_id, season, episode, language))
continue
path = get_subtitle_path(filepath, language, self.config.multi)
for result in soup.results('result'):
subtitle = ResultSubtitle(path, language, service=self.__class__.__name__.lower(), link=result.downloadlink.contents[0],
release=to_unicode(result.filename.contents[0]))
subtitles.append(subtitle)
return subtitles
def list(self, video, languages):
if not self.check_validity(video, languages):
return []
results = self.query(video.season, video.episode, languages, video.path or video.release, video.tvdbid, video.series)
return results
Service = BierDopje
-143
View File
@@ -1,143 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2011-2012 Antoine Bertin <diaoulael@gmail.com>
#
# This file is part of subliminal.
#
# subliminal is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# subliminal is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with subliminal. If not, see <http://www.gnu.org/licenses/>.
from . import ServiceBase
from ..exceptions import ServiceError, DownloadFailedError
from ..subtitles import get_subtitle_path, ResultSubtitle
from ..videos import Episode, Movie
from ..utils import to_unicode
import gzip
import logging
import os.path
import xmlrpclib
logger = logging.getLogger(__name__)
class OpenSubtitles(ServiceBase):
server_url = 'http://api.opensubtitles.org/xml-rpc'
api_based = True
languages = {'aa': 'aar', 'ab': 'abk', 'af': 'afr', 'ak': 'aka', 'sq': 'alb', 'am': 'amh', 'ar': 'ara',
'an': 'arg', 'hy': 'arm', 'as': 'asm', 'av': 'ava', 'ae': 'ave', 'ay': 'aym', 'az': 'aze',
'ba': 'bak', 'bm': 'bam', 'eu': 'baq', 'be': 'bel', 'bn': 'ben', 'bh': 'bih', 'bi': 'bis',
'bs': 'bos', 'br': 'bre', 'bg': 'bul', 'my': 'bur', 'ca': 'cat', 'ch': 'cha', 'ce': 'che',
'zh': 'chi', 'cu': 'chu', 'cv': 'chv', 'kw': 'cor', 'co': 'cos', 'cr': 'cre', 'cs': 'cze',
'da': 'dan', 'dv': 'div', 'nl': 'dut', 'dz': 'dzo', 'en': 'eng', 'eo': 'epo', 'et': 'est',
'ee': 'ewe', 'fo': 'fao', 'fj': 'fij', 'fi': 'fin', 'fr': 'fre', 'fy': 'fry', 'ff': 'ful',
'ka': 'geo', 'de': 'ger', 'gd': 'gla', 'ga': 'gle', 'gl': 'glg', 'gv': 'glv', 'el': 'ell',
'gn': 'grn', 'gu': 'guj', 'ht': 'hat', 'ha': 'hau', 'he': 'heb', 'hz': 'her', 'hi': 'hin',
'ho': 'hmo', 'hr': 'hrv', 'hu': 'hun', 'ig': 'ibo', 'is': 'ice', 'io': 'ido', 'ii': 'iii',
'iu': 'iku', 'ie': 'ile', 'ia': 'ina', 'id': 'ind', 'ik': 'ipk', 'it': 'ita', 'jv': 'jav',
'ja': 'jpn', 'kl': 'kal', 'kn': 'kan', 'ks': 'kas', 'kr': 'kau', 'kk': 'kaz', 'km': 'khm',
'ki': 'kik', 'rw': 'kin', 'ky': 'kir', 'kv': 'kom', 'kg': 'kon', 'ko': 'kor', 'kj': 'kua',
'ku': 'kur', 'lo': 'lao', 'la': 'lat', 'lv': 'lav', 'li': 'lim', 'ln': 'lin', 'lt': 'lit',
'lb': 'ltz', 'lu': 'lub', 'lg': 'lug', 'mk': 'mac', 'mh': 'mah', 'ml': 'mal', 'mi': 'mao',
'mr': 'mar', 'ms': 'may', 'mg': 'mlg', 'mt': 'mlt', 'mo': 'mol', 'mn': 'mon', 'na': 'nau',
'nv': 'nav', 'nr': 'nbl', 'nd': 'nde', 'ng': 'ndo', 'ne': 'nep', 'nn': 'nno', 'nb': 'nob',
'no': 'nor', 'ny': 'nya', 'oc': 'oci', 'oj': 'oji', 'or': 'ori', 'om': 'orm', 'os': 'oss',
'pa': 'pan', 'fa': 'per', 'pi': 'pli', 'pl': 'pol', 'pt': 'por', 'ps': 'pus', 'qu': 'que',
'rm': 'roh', 'rn': 'run', 'ru': 'rus', 'sg': 'sag', 'sa': 'san', 'sr': 'scc', 'si': 'sin',
'sk': 'slo', 'sl': 'slv', 'se': 'sme', 'sm': 'smo', 'sn': 'sna', 'sd': 'snd', 'so': 'som',
'st': 'sot', 'es': 'spa', 'sc': 'srd', 'ss': 'ssw', 'su': 'sun', 'sw': 'swa', 'sv': 'swe',
'ty': 'tah', 'ta': 'tam', 'tt': 'tat', 'te': 'tel', 'tg': 'tgk', 'tl': 'tgl', 'th': 'tha',
'bo': 'tib', 'ti': 'tir', 'to': 'ton', 'tn': 'tsn', 'ts': 'tso', 'tk': 'tuk', 'tr': 'tur',
'tw': 'twi', 'ug': 'uig', 'uk': 'ukr', 'ur': 'urd', 'uz': 'uzb', 've': 'ven', 'vi': 'vie',
'vo': 'vol', 'cy': 'wel', 'wa': 'wln', 'wo': 'wol', 'xh': 'xho', 'yi': 'yid', 'yo': 'yor',
'za': 'zha', 'zu': 'zul', 'ro': 'rum', 'po': 'pob', 'un': 'unk', 'ay': 'ass'}
reverted_languages = False
videos = [Episode, Movie]
require_video = False
confidence_order = ['moviehash', 'imdbid', 'fulltext']
def __init__(self, config=None):
super(OpenSubtitles, self).__init__(config)
self.server = xmlrpclib.ServerProxy(self.server_url)
self.token = None
def init(self):
super(OpenSubtitles, self).init()
result = self.server.LogIn('', '', 'eng', self.user_agent)
if result['status'] != '200 OK':
raise ServiceError('Login failed')
self.token = result['token']
def terminate(self):
super(OpenSubtitles, self).terminate()
if self.token:
self.server.LogOut(self.token)
def query(self, filepath, languages, moviehash=None, size=None, imdbid=None, query=None):
searches = []
if moviehash and size:
searches.append({'moviehash': moviehash, 'moviebytesize': size})
if imdbid:
searches.append({'imdbid': imdbid})
if query:
searches.append({'query': query})
if not searches:
raise ServiceError('One or more parameter missing')
for search in searches:
search['sublanguageid'] = ','.join([self.get_language(l) for l in languages])
logger.debug(u'Getting subtitles %r with token %s' % (searches, self.token))
results = self.server.SearchSubtitles(self.token, searches)
if not results['data']:
logger.debug(u'Could not find subtitles for %r with token %s' % (searches, self.token))
return []
subtitles = []
for result in results['data']:
language = self.get_revert_language(result['SubLanguageID'])
path = get_subtitle_path(filepath, language, self.config.multi)
confidence = 1 - float(self.confidence_order.index(result['MatchedBy'])) / float(len(self.confidence_order))
subtitle = ResultSubtitle(path, language, service=self.__class__.__name__.lower(), link=result['SubDownloadLink'],
release=to_unicode(result['SubFileName']), confidence=confidence)
subtitles.append(subtitle)
return subtitles
def list(self, video, languages):
if not self.check_validity(video, languages):
return []
results = []
if video.exists:
results = self.query(video.path or video.release, languages, moviehash=video.hashes['OpenSubtitles'], size=str(video.size))
elif video.imdbid:
results = self.query(video.path or video.release, languages, imdbid=video.imdbid)
elif isinstance(video, Episode):
results = self.query(video.path or video.release, languages, query=video.series)
elif isinstance(video, Movie):
results = self.query(video.path or video.release, languages, query=video.title)
return results
def download(self, subtitle):
#TODO: Use OpenSubtitles DownloadSubtitles method
try:
self.download_file(subtitle.link, subtitle.path + '.gz')
with open(subtitle.path, 'wb') as dump:
gz = gzip.open(subtitle.path + '.gz')
dump.write(gz.read())
gz.close()
except Exception as e:
if os.path.exists(subtitle.path):
os.remove(subtitle.path)
raise DownloadFailedError(str(e))
finally:
if os.path.exists(subtitle.path + '.gz'):
os.remove(subtitle.path + '.gz')
return subtitle
Service = OpenSubtitles
-99
View File
@@ -1,99 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2011-2012 Antoine Bertin <diaoulael@gmail.com>
#
# This file is part of subliminal.
#
# subliminal is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# subliminal is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with subliminal. If not, see <http://www.gnu.org/licenses/>.
from . import ServiceBase
from ..exceptions import ServiceError
from ..subtitles import get_subtitle_path, ResultSubtitle
from ..videos import Episode, Movie
from subliminal.utils import get_keywords, split_keyword
import BeautifulSoup
import logging
import re
import urllib
logger = logging.getLogger(__name__)
class SubsWiki(ServiceBase):
server_url = 'http://www.subswiki.com'
api_based = False
languages = {u'English (US)': 'en', u'English (UK)': 'en', u'English': 'en', u'French': 'fr', u'Brazilian': 'po',
u'Portuguese': 'pt', u'Español (Latinoamérica)': 'es', u'Español (España)': 'es', u'Español': 'es',
u'Italian': 'it', u'Català': 'ca'}
reverted_languages = True
videos = [Episode, Movie]
require_video = False
release_pattern = re.compile('\nVersion (.+), ([0-9]+).([0-9])+ MBs')
def list(self, video, languages):
if not self.check_validity(video, languages):
return []
results = []
if isinstance(video, Episode):
results = self.query(video.path or video.release, languages, get_keywords(video.guess), series=video.series, season=video.season, episode=video.episode)
elif isinstance(video, Movie) and video.year:
results = self.query(video.path or video.release, languages, get_keywords(video.guess), movie=video.title, year=video.year)
return results
def query(self, filepath, languages, keywords=None, series=None, season=None, episode=None, movie=None, year=None):
if series and season and episode:
request_series = series.lower().replace(' ', '_')
if isinstance(request_series, unicode):
request_series = request_series.encode('utf-8')
logger.debug(u'Getting subtitles for %s season %d episode %d with languages %r' % (series, season, episode, languages))
r = self.session.get('%s/serie/%s/%s/%s/' % (self.server_url, urllib.quote(request_series), season, episode))
if r.status_code == 404:
logger.debug(u'Could not find subtitles for %s season %d episode %d with languages %r' % (series, season, episode, languages))
return []
elif movie and year:
request_movie = movie.title().replace(' ', '_')
if isinstance(request_movie, unicode):
request_movie = request_movie.encode('utf-8')
logger.debug(u'Getting subtitles for %s (%d) with languages %r' % (movie, year, languages))
r = self.session.get('%s/film/%s_(%d)' % (self.server_url, urllib.quote(request_movie), year))
if r.status_code == 404:
logger.debug(u'Could not find subtitles for %s (%d) with languages %r' % (movie, year, languages))
return []
else:
raise ServiceError('One or more parameter missing')
if r.status_code != 200:
logger.error(u'Request %s returned status code %d' % (r.url, r.status_code))
return []
soup = BeautifulSoup.BeautifulSoup(r.content)
subtitles = []
for sub in soup('td', {'class': 'NewsTitle'}):
sub_keywords = split_keyword(self.release_pattern.search(sub.contents[1]).group(1).lower())
if not keywords & sub_keywords:
logger.debug(u'None of subtitle keywords %r in %r' % (sub_keywords, keywords))
continue
for html_language in sub.parent.parent.findAll('td', {'class': 'language'}):
language = self.get_revert_language(html_language.string.strip())
if not language in languages:
logger.debug(u'Language %r not in wanted languages %r' % (language, languages))
continue
html_status = html_language.findNextSibling('td')
status = html_status.find('strong').string.strip()
if status != 'Completed':
logger.debug(u'Wrong subtitle status %s' % status)
continue
path = get_subtitle_path(filepath, language, self.config.multi)
subtitle = ResultSubtitle(path, language, service=self.__class__.__name__.lower(), link='%s%s' % (self.server_url, html_status.findNext('td').find('a')['href']))
subtitles.append(subtitle)
return subtitles
Service = SubsWiki
-83
View File
@@ -1,83 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2011-2012 Antoine Bertin <diaoulael@gmail.com>
#
# This file is part of subliminal.
#
# subliminal is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# subliminal is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with subliminal. If not, see <http://www.gnu.org/licenses/>.
from . import ServiceBase
from ..subtitles import get_subtitle_path, ResultSubtitle
from ..videos import Episode
from subliminal.utils import get_keywords, split_keyword
import BeautifulSoup
import logging
import re
import unicodedata
import urllib
logger = logging.getLogger(__name__)
class Subtitulos(ServiceBase):
server_url = 'http://www.subtitulos.es'
api_based = False
languages = {u'English (US)': 'en', u'English (UK)': 'en', u'English': 'en', u'French': 'fr', u'Brazilian': 'po',
u'Portuguese': 'pt', u'Español (Latinoamérica)': 'es', u'Español (España)': 'es', u'Español': 'es',
u'Italian': 'it', u'Català': 'ca'}
reverted_languages = True
videos = [Episode]
require_video = False
release_pattern = re.compile('Versi&oacute;n (.+) ([0-9]+).([0-9])+ megabytes')
def list(self, video, languages):
if not self.check_validity(video, languages):
return []
results = self.query(video.path or video.release, languages, get_keywords(video.guess), video.series, video.season, video.episode)
return results
def query(self, filepath, languages, keywords, series, season, episode):
request_series = series.lower().replace(' ', '_')
if isinstance(request_series, unicode):
request_series = unicodedata.normalize('NFKD', request_series).encode('ascii', 'ignore')
logger.debug(u'Getting subtitles for %s season %d episode %d with languages %r' % (series, season, episode, languages))
r = self.session.get('%s/%s/%sx%.2d' % (self.server_url, urllib.quote(request_series), season, episode))
if r.status_code == 404:
logger.debug(u'Could not find subtitles for %s season %d episode %d with languages %r' % (series, season, episode, languages))
return []
if r.status_code != 200:
logger.error(u'Request %s returned status code %d' % (r.url, r.status_code))
return []
soup = BeautifulSoup.BeautifulSoup(r.content)
subtitles = []
for sub in soup('div', {'id': 'version'}):
sub_keywords = split_keyword(self.release_pattern.search(sub.find('p', {'class': 'title-sub'}).contents[1]).group(1).lower())
if not keywords & sub_keywords:
logger.debug(u'None of subtitle keywords %r in %r' % (sub_keywords, keywords))
continue
for html_language in sub.findAllNext('ul', {'class': 'sslist'}):
language = self.get_revert_language(html_language.findNext('li', {'class': 'li-idioma'}).find('strong').contents[0].string.strip())
if not language in languages:
logger.debug(u'Language %r not in wanted languages %r' % (language, languages))
continue
html_status = html_language.findNext('li', {'class': 'li-estado green'})
status = html_status.contents[0].string.strip()
if status != 'Completado':
logger.debug(u'Wrong subtitle status %s' % status)
continue
path = get_subtitle_path(filepath, language, self.config.multi)
subtitle = ResultSubtitle(path, language, service=self.__class__.__name__.lower(), link=html_status.findNext('span', {'class': 'descargar green'}).find('a')['href'], keywords=sub_keywords)
subtitles.append(subtitle)
return subtitles
Service = Subtitulos
-65
View File
@@ -1,65 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2011-2012 Antoine Bertin <diaoulael@gmail.com>
#
# This file is part of subliminal.
#
# subliminal is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# subliminal is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with subliminal. If not, see <http://www.gnu.org/licenses/>.
from . import ServiceBase
from ..subtitles import get_subtitle_path, ResultSubtitle
from ..videos import Episode, Movie, UnknownVideo
import logging
logger = logging.getLogger(__name__)
class TheSubDB(ServiceBase):
server_url = 'http://api.thesubdb.com/' # for testing purpose, use http://sandbox.thesubdb.com/ instead
user_agent = 'SubDB/1.0 (subliminal/0.5; https://github.com/Diaoul/subliminal)' # defined by the API
api_based = True
languages = {'af': 'af', 'cs': 'cs', 'da': 'da', 'de': 'de', 'en': 'en', 'es': 'es', 'fi': 'fi',
'fr': 'fr', 'hu': 'hu', 'id': 'id', 'it': 'it', 'la': 'la', 'nl': 'nl', 'no': 'no',
'oc': 'oc', 'pl': 'pl', 'pt': 'pt', 'ro': 'ro', 'ru': 'ru', 'sl': 'sl', 'sr': 'sr',
'sv': 'sv', 'tr': 'tr'} # list available with the API at http://sandbox.thesubdb.com/?action=languages
reverted_languages = False
videos = [Movie, Episode, UnknownVideo]
require_video = True
def list(self, video, languages):
if not self.check_validity(video, languages):
return []
results = self.query(video.path, video.hashes['TheSubDB'], languages)
return results
def query(self, filepath, moviehash, languages):
r = self.session.get(self.server_url, params={'action': 'search', 'hash': moviehash})
if r.status_code == 404:
logger.debug(u'Could not find subtitles for hash %s' % moviehash)
return []
if r.status_code != 200:
logger.error(u'Request %s returned status code %d' % (r.url, r.status_code))
return []
available_languages = set([self.get_revert_language(l) for l in r.content.split(',')])
languages &= available_languages
if not languages:
logger.debug(u'Could not find subtitles for hash %s with languages %r (only %r available)' % (moviehash, languages, available_languages))
return []
subtitles = []
for language in languages:
path = get_subtitle_path(filepath, language, self.config.multi)
subtitle = ResultSubtitle(path, language, service=self.__class__.__name__.lower(), link='%s?action=download&hash=%s&language=%s' % (self.server_url, moviehash, self.get_language(language)))
subtitles.append(subtitle)
return subtitles
Service = TheSubDB
+302
View File
@@ -0,0 +1,302 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import logging
import os
import chardet
from guessit.matchtree import MatchTree
from guessit.plugins.transformers import get_transformer
import pysrt
from .video import Episode, Movie
logger = logging.getLogger(__name__)
class Subtitle(object):
"""Base class for subtitle.
:param language: language of the subtitle.
:type language: :class:`~babelfish.language.Language`
:param bool hearing_impaired: whether or not the subtitle is hearing impaired.
:param page_link: URL of the web page from which the subtitle can be downloaded.
:type page_link: str
"""
#: Name of the provider that returns that class of subtitle
provider_name = ''
def __init__(self, language, hearing_impaired=False, page_link=None):
#: Language of the subtitle
self.language = language
#: Whether or not the subtitle is hearing impaired
self.hearing_impaired = hearing_impaired
#: URL of the web page from which the subtitle can be downloaded
self.page_link = page_link
#: Content as bytes
self.content = None
#: Encoding to decode with when accessing :attr:`text`
self.encoding = None
@property
def id(self):
"""Unique identifier of the subtitle."""
raise NotImplementedError
@property
def text(self):
"""Content as string.
If :attr:`encoding` is None, the encoding is guessed with :meth:`guess_encoding`
"""
if not self.content:
return
return self.content.decode(self.encoding or self.guess_encoding(), errors='replace')
def is_valid(self):
"""Check if a :attr:`text` is a valid SubRip format.
:return: whether or not the subtitle is valid.
:rtype: bool
"""
if not self.text:
return False
try:
pysrt.from_string(self.text, error_handling=pysrt.ERROR_RAISE)
except pysrt.Error as e:
if e.args[0] < 80:
return False
return True
def guess_encoding(self):
"""Guess encoding using the language, falling back on chardet.
:return: the guessed encoding.
:rtype: str
"""
logger.info('Guessing encoding for language %s', self.language)
# always try utf-8 first
encodings = ['utf-8']
# add language-specific encodings
if self.language.alpha3 == 'zho':
encodings.extend(['gb18030', 'big5'])
elif self.language.alpha3 == 'jpn':
encodings.append('shift-jis')
elif self.language.alpha3 == 'ara':
encodings.append('windows-1256')
elif self.language.alpha3 == 'heb':
encodings.append('windows-1255')
elif self.language.alpha3 == 'tur':
encodings.extend(['iso-8859-9', 'windows-1254'])
elif self.language.alpha3 == 'pol':
# Eastern European Group 1
encodings.extend(['windows-1250'])
elif self.language.alpha3 == 'bul':
# Eastern European Group 2
encodings.extend(['windows-1251'])
else:
# Western European (windows-1252)
encodings.append('latin-1')
# try to decode
logger.debug('Trying encodings %r', encodings)
for encoding in encodings:
try:
self.content.decode(encoding)
except UnicodeDecodeError:
pass
else:
logger.info('Guessed encoding %s', encoding)
return encoding
logger.warning('Could not guess encoding from language')
# fallback on chardet
encoding = chardet.detect(self.content)['encoding']
logger.info('Chardet found encoding %s', encoding)
return encoding
def get_matches(self, video, hearing_impaired=False):
"""Get the matches against the `video`.
:param video: the video to get the matches with.
:type video: :class:`~subliminal.video.Video`
:param bool hearing_impaired: hearing impaired preference.
:return: matches of the subtitle.
:rtype: set
"""
matches = set()
# hearing_impaired
if self.hearing_impaired == hearing_impaired:
matches.add('hearing_impaired')
return matches
def __hash__(self):
return hash(self.provider_name + '-' + self.id)
def __repr__(self):
return '<%s %r [%s]>' % (self.__class__.__name__, self.id, self.language)
def compute_score(matches, video, scores=None):
"""Compute the score of the `matches` against the `video`.
Some matches count as much as a combination of others in order to level the final score:
* `hash` removes everything else
* For :class:`~subliminal.video.Episode`
* `imdb_id` removes `series`, `tvdb_id`, `season`, `episode`, `title` and `year`
* `tvdb_id` removes `series` and `year`
* `title` removes `season` and `episode`
:param video: the video to get the score with.
:type video: :class:`~subliminal.video.Video`
:param dict scores: scores to use, if `None`, the :attr:`~subliminal.video.Video.scores` from the video are used.
:return: score of the subtitle.
:rtype: int
"""
final_matches = matches.copy()
scores = scores or video.scores
logger.info('Computing score for matches %r and %r', matches, video)
# remove equivalent match combinations
if 'hash' in final_matches:
final_matches &= {'hash', 'hearing_impaired'}
elif isinstance(video, Episode):
if 'imdb_id' in final_matches:
final_matches -= {'series', 'tvdb_id', 'season', 'episode', 'title', 'year'}
if 'tvdb_id' in final_matches:
final_matches -= {'series', 'year'}
if 'title' in final_matches:
final_matches -= {'season', 'episode'}
# compute score
logger.debug('Final matches: %r', final_matches)
score = sum((scores[match] for match in final_matches))
logger.info('Computed score %d', score)
# ensure score is capped by the best possible score (hash + preferences)
assert score <= scores['hash'] + scores['hearing_impaired']
return score
def get_subtitle_path(video_path, language=None, extension='.srt'):
"""Get the subtitle path using the `video_path` and `language`.
:param str video_path: path to the video.
:param language: language of the subtitle to put in the path.
:type language: :class:`~babelfish.language.Language`
:param str extension: extension of the subtitle.
:return: path of the subtitle.
:rtype: str
"""
subtitle_root = os.path.splitext(video_path)[0]
if language:
subtitle_root += '.' + str(language)
return subtitle_root + extension
def guess_matches(video, guess, partial=False):
"""Get matches between a `video` and a `guess`.
If a guess is `partial`, the absence information won't be counted as a match.
:param video: the video.
:type video: :class:`~subliminal.video.Video`
:param guess: the guess.
:type guess: dict
:param bool partial: whether or not the guess is partial.
:return: matches between the `video` and the `guess`.
:rtype: set
"""
matches = set()
if isinstance(video, Episode):
# series
if video.series and 'series' in guess and guess['series'].lower() == video.series.lower():
matches.add('series')
# season
if video.season and 'season' in guess and guess['season'] == video.season:
matches.add('season')
# episode
if video.episode and 'episodeNumber' in guess and guess['episodeNumber'] == video.episode:
matches.add('episode')
# year
if video.year and 'year' in guess and guess['year'] == video.year:
matches.add('year')
# count "no year" as an information
if not partial and video.year is None and 'year' not in guess:
matches.add('year')
elif isinstance(video, Movie):
# year
if video.year and 'year' in guess and guess['year'] == video.year:
matches.add('year')
# title
if video.title and 'title' in guess and guess['title'].lower() == video.title.lower():
matches.add('title')
# release_group
if video.release_group and 'releaseGroup' in guess and guess['releaseGroup'].lower() == video.release_group.lower():
matches.add('release_group')
# resolution
if video.resolution and 'screenSize' in guess and guess['screenSize'] == video.resolution:
matches.add('resolution')
# format
if video.format and 'format' in guess and guess['format'].lower() == video.format.lower():
matches.add('format')
# video_codec
if video.video_codec and 'videoCodec' in guess and guess['videoCodec'] == video.video_codec:
matches.add('video_codec')
# audio_codec
if video.audio_codec and 'audioCodec' in guess and guess['audioCodec'] == video.audio_codec:
matches.add('audio_codec')
return matches
def guess_properties(string):
"""Extract properties from `string` using guessit's `guess_properties` transformer.
:param str string: the string potentially containing properties.
:return: the guessed properties.
:rtype: dict
"""
mtree = MatchTree(string)
get_transformer('guess_properties').process(mtree)
return mtree.matched()
def fix_line_ending(content):
"""Fix line ending of `content` by changing it to \n.
:param bytes content: content of the subtitle.
:return: the content with fixed line endings.
:rtype: bytes
"""
return content.replace(b'\r\n', b'\n').replace(b'\r', b'\n')
-130
View File
@@ -1,130 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2011-2012 Antoine Bertin <diaoulael@gmail.com>
#
# This file is part of subliminal.
#
# subliminal is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# subliminal is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with subliminal. If not, see <http://www.gnu.org/licenses/>.
from .languages import list_languages, convert_language
import os.path
__all__ = ['Subtitle', 'EmbeddedSubtitle', 'ExternalSubtitle', 'ResultSubtitle', 'get_subtitle_path']
#: Subtitles extensions
EXTENSIONS = ['.srt', '.sub', '.txt']
class Subtitle(object):
"""Base class for subtitles
:param string path: path to the subtitle
:param string language: language of the subtitle (second element of :class:`~subliminal.languages.LANGUAGES`)
"""
def __init__(self, path, language):
self.path = path
self.language = language
@property
def exists(self):
"""Whether the subtitle exists or not"""
if self.path:
return os.path.exists(self.path)
return False
class EmbeddedSubtitle(Subtitle):
"""Subtitle embedded in a container
:param string path: path to the subtitle
:param string language: language of the subtitle (second element of :class:`~subliminal.languages.LANGUAGES`)
:param int track_id: id of the subtitle track in the container
"""
def __init__(self, path, language, track_id):
super(EmbeddedSubtitle, self).__init__(path, language)
self.track_id = track_id
@classmethod
def from_enzyme(cls, path, subtitle):
language = convert_language(subtitle.language, 1, 2)
return cls(path, language, subtitle.trackno)
class ExternalSubtitle(Subtitle):
"""Subtitle in a file next to the video file"""
@classmethod
def from_path(cls, path):
"""Create an :class:`ExternalSubtitle` from path"""
extension = ''
for e in EXTENSIONS:
if path.endswith(e):
extension = e
break
if not extension:
raise ValueError('Not a supported subtitle extension')
language = os.path.splitext(path[:len(path) - len(extension)])[1][1:]
if not language in list_languages(1):
language = None
return cls(path, language)
class ResultSubtitle(ExternalSubtitle):
"""Subtitle found using :mod:`~subliminal.services`
:param string path: path to the subtitle
:param string language: language of the subtitle (second element of :class:`~subliminal.languages.LANGUAGES`)
:param string service: name of the service
:param string link: download link for the subtitle
:param string release: release name of the video
:param float confidence: confidence that the subtitle matches the video according to the service
:param set keywords: keywords that describe the subtitle
"""
def __init__(self, path, language, service, link, release=None, confidence=1, keywords=set()):
super(ResultSubtitle, self).__init__(path, language)
self.service = service
self.link = link
self.release = release
self.confidence = confidence
self.keywords = keywords
@property
def single(self):
"""Whether this is a single subtitle or not. A single subtitle does not have
a language indicator in its file name
:rtype: bool
"""
extension = os.path.splitext(self.path)[0]
language = os.path.splitext(self.path[:len(self.path) - len(extension)])[1][1:]
if not language in list_languages(1):
return True
return False
def __repr__(self):
return 'ResultSubtitle(%s, %s, %.2f, %s)' % (self.language, self.service, self.confidence, self.release)
def get_subtitle_path(video_path, language, multi):
"""Create the subtitle path from the given video path using language if multi"""
if not os.path.exists(video_path):
path = os.path.splitext(os.path.basename(video_path))[0]
else:
path = os.path.splitext(video_path)[0]
if multi and language:
return path + '.%s%s' % (language, EXTENSIONS[0])
return path + '%s' % EXTENSIONS[0]
-66
View File
@@ -1,66 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2011-2012 Antoine Bertin <diaoulael@gmail.com>
#
# This file is part of subliminal.
#
# subliminal is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# subliminal is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with subliminal. If not, see <http://www.gnu.org/licenses/>.
__all__ = ['Task', 'ListTask', 'DownloadTask', 'StopTask']
class Task(object):
"""Base class for tasks to use in subliminal"""
pass
class ListTask(Task):
"""List task used by the worker to search for subtitles
:param video: video to search subtitles for
:type video: :class:`~subliminal.videos.Video`
:param list languages: languages to search for
:param string service: name of the service to use
:param config: configuration for the service
:type config: :class:`~subliminal.services.ServiceConfig`
"""
def __init__(self, video, languages, service, config):
self.video = video
self.service = service
self.languages = languages
self.config = config
def __repr__(self):
return 'ListTask(%r, %r, %s, %r)' % (self.video, self.languages, self.service, self.config)
class DownloadTask(Task):
"""Download task used by the worker to download subtitles
:param video: video to download subtitles for
:type video: :class:`~subliminal.videos.Video`
:param subtitles: subtitles to download in order of preference
:type subtitles: list of :class:`~subliminal.subtitles.Subtitle`
"""
def __init__(self, video, subtitles):
self.video = video
self.subtitles = subtitles
def __repr__(self):
return 'DownloadTask(%r, %r)' % (self.video, self.subtitles)
class StopTask(Task):
"""Stop task that will stop the worker"""
pass
-64
View File
@@ -1,64 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2011-2012 Antoine Bertin <diaoulael@gmail.com>
#
# This file is part of subliminal.
#
# subliminal is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# subliminal is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with subliminal. If not, see <http://www.gnu.org/licenses/>.
import re
__all__ = ['get_keywords', 'split_keyword', 'to_unicode']
def get_keywords(guess):
"""Retrieve keywords from guessed informations
:param guess: guessed informations
:type guess: :class:`guessit.guess.Guess`
:return: lower case alphanumeric keywords
:rtype: set
"""
keywords = set()
for k in ['releaseGroup', 'screenSize', 'videoCodec', 'format']:
if k in guess:
keywords = keywords | split_keyword(guess[k].lower())
return keywords
def split_keyword(keyword):
"""Split a keyword in multiple ones on any non-alphanumeric character
:param string keyword: keyword
:return: keywords
:rtype: set
"""
split = set(re.findall(r'\w+', keyword))
return split
def to_unicode(data):
"""Convert a basestring to unicode
:param basestring data: data to decode
:return: data as unicode
:rtype: unicode
"""
if not isinstance(data, basestring):
raise ValueError('Basestring expected')
if isinstance(data, unicode):
return data
return unicode(data, 'utf-8', 'replace')
+516
View File
@@ -0,0 +1,516 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, division
from datetime import datetime, timedelta
import hashlib
import logging
import os
import struct
from babelfish import Error as BabelfishError, Language
from enzyme import Error as EnzymeError, MKV
from guessit import guess_episode_info, guess_file_info, guess_movie_info
logger = logging.getLogger(__name__)
#: Video extensions
VIDEO_EXTENSIONS = ('.3g2', '.3gp', '.3gp2', '.3gpp', '.60d', '.ajp', '.asf', '.asx', '.avchd', '.avi', '.bik',
'.bix', '.box', '.cam', '.dat', '.divx', '.dmf', '.dv', '.dvr-ms', '.evo', '.flc', '.fli',
'.flic', '.flv', '.flx', '.gvi', '.gvp', '.h264', '.m1v', '.m2p', '.m2ts', '.m2v', '.m4e',
'.m4v', '.mjp', '.mjpeg', '.mjpg', '.mkv', '.moov', '.mov', '.movhd', '.movie', '.movx', '.mp4',
'.mpe', '.mpeg', '.mpg', '.mpv', '.mpv2', '.mxf', '.nsv', '.nut', '.ogg', '.ogm', '.omf', '.ps',
'.qt', '.ram', '.rm', '.rmvb', '.swf', '.ts', '.vfw', '.vid', '.video', '.viv', '.vivo', '.vob',
'.vro', '.wm', '.wmv', '.wmx', '.wrap', '.wvx', '.wx', '.x264', '.xvid')
#: Subtitle extensions
SUBTITLE_EXTENSIONS = ('.srt', '.sub', '.smi', '.txt', '.ssa', '.ass', '.mpl')
class Video(object):
"""Base class for videos.
Represent a video, existing or not. Attributes have an associated score based on equations defined in
:mod:`~subliminal.score`.
:param str name: name or path of the video.
:param str format: format of the video (HDTV, WEB-DL, BluRay, ...).
:param str release_group: release group of the video.
:param str resolution: resolution of the video stream (480p, 720p, 1080p or 1080i).
:param str video_codec: codec of the video stream.
:param str audio_codec: codec of the main audio stream.
:param int imdb_id: IMDb id of the video.
:param dict hashes: hashes of the video file by provider names.
:param int size: size of the video file in bytes.
:param set subtitle_languages: existing subtitle languages
"""
#: Score by match property
scores = {}
def __init__(self, name, format=None, release_group=None, resolution=None, video_codec=None, audio_codec=None,
imdb_id=None, hashes=None, size=None, subtitle_languages=None):
#: Name or path of the video
self.name = name
#: Format of the video (HDTV, WEB-DL, BluRay, ...)
self.format = format
#: Release group of the video
self.release_group = release_group
#: Resolution of the video stream (480p, 720p, 1080p or 1080i)
self.resolution = resolution
#: Codec of the video stream
self.video_codec = video_codec
#: Codec of the main audio stream
self.audio_codec = audio_codec
#: IMDb id of the video
self.imdb_id = imdb_id
#: Hashes of the video file by provider names
self.hashes = hashes or {}
#: Size of the video file in bytes
self.size = size
#: Existing subtitle languages
self.subtitle_languages = subtitle_languages or set()
@property
def exists(self):
"""Test whether the video exists."""
return os.path.exists(self.name)
@property
def age(self):
"""Age of the video."""
if self.exists:
return datetime.utcnow() - datetime.utcfromtimestamp(os.path.getmtime(self.name))
return timedelta()
@classmethod
def fromguess(cls, name, guess):
"""Create an :class:`Episode` or a :class:`Movie` with the given `name` based on the `guess`.
:param str name: name of the video.
:param dict guess: guessed data, like a :class:`~guessit.guess.Guess` instance.
:raise: :class:`ValueError` if the `type` of the `guess` is invalid
"""
if guess['type'] == 'episode':
return Episode.fromguess(name, guess)
if guess['type'] == 'movie':
return Movie.fromguess(name, guess)
raise ValueError('The guess must be an episode or a movie guess')
@classmethod
def fromname(cls, name):
"""Shortcut for :meth:`fromguess` with a `guess` guessed from the `name`.
:param str name: name of the video.
"""
return cls.fromguess(name, guess_file_info(name))
def __repr__(self):
return '<%s [%r]>' % (self.__class__.__name__, self.name)
def __hash__(self):
return hash(self.name)
class Episode(Video):
"""Episode :class:`Video`.
Scores are defined by a set of equations, see :func:`~subliminal.score.solve_episode_equations`
:param str series: series of the episode.
:param int season: season number of the episode.
:param int episode: episode number of the episode.
:param str title: title of the episode.
:param int year: year of series.
:param int tvdb_id: TVDB id of the episode
"""
#: Score by match property
scores = {'hash': 137, 'imdb_id': 110, 'tvdb_id': 88, 'series': 44, 'year': 44, 'title': 22, 'season': 11,
'episode': 11, 'release_group': 11, 'format': 6, 'video_codec': 4, 'resolution': 4, 'audio_codec': 2,
'hearing_impaired': 1}
def __init__(self, name, series, season, episode, format=None, release_group=None, resolution=None,
video_codec=None, audio_codec=None, imdb_id=None, hashes=None, size=None, subtitle_languages=None,
title=None, year=None, tvdb_id=None):
super(Episode, self).__init__(name, format, release_group, resolution, video_codec, audio_codec, imdb_id,
hashes, size, subtitle_languages)
#: Series of the episode
self.series = series
#: Season number of the episode
self.season = season
#: Episode number of the episode
self.episode = episode
#: Title of the episode
self.title = title
#: Year of series
self.year = year
#: TVDB id of the episode
self.tvdb_id = tvdb_id
@classmethod
def fromguess(cls, name, guess):
if guess['type'] != 'episode':
raise ValueError('The guess must be an episode guess')
if 'series' not in guess or 'season' not in guess or 'episodeNumber' not in guess:
raise ValueError('Insufficient data to process the guess')
return cls(name, guess['series'], guess['season'], guess['episodeNumber'], format=guess.get('format'),
release_group=guess.get('releaseGroup'), resolution=guess.get('screenSize'),
video_codec=guess.get('videoCodec'), audio_codec=guess.get('audioCodec'),
title=guess.get('title'), year=guess.get('year'))
@classmethod
def fromname(cls, name):
return cls.fromguess(name, guess_episode_info(name))
def __repr__(self):
if self.year is None:
return '<%s [%r, %dx%d]>' % (self.__class__.__name__, self.series, self.season, self.episode)
return '<%s [%r, %d, %dx%d]>' % (self.__class__.__name__, self.series, self.year, self.season, self.episode)
class Movie(Video):
"""Movie :class:`Video`.
Scores are defined by a set of equations, see :func:`~subliminal.score.solve_movie_equations`
:param str title: title of the movie.
:param int year: year of the movie
"""
#: Score by match property
scores = {'hash': 62, 'imdb_id': 62, 'title': 23, 'year': 12, 'release_group': 11, 'format': 6, 'video_codec': 4,
'resolution': 4, 'audio_codec': 2, 'hearing_impaired': 1}
def __init__(self, name, title, format=None, release_group=None, resolution=None, video_codec=None,
audio_codec=None, imdb_id=None, hashes=None, size=None, subtitle_languages=None, year=None):
super(Movie, self).__init__(name, format, release_group, resolution, video_codec, audio_codec, imdb_id, hashes,
size, subtitle_languages)
#: Title of the movie
self.title = title
#: Year of the movie
self.year = year
@classmethod
def fromguess(cls, name, guess):
if guess['type'] != 'movie':
raise ValueError('The guess must be a movie guess')
if 'title' not in guess:
raise ValueError('Insufficient data to process the guess')
return cls(name, guess['title'], format=guess.get('format'), release_group=guess.get('releaseGroup'),
resolution=guess.get('screenSize'), video_codec=guess.get('videoCodec'),
audio_codec=guess.get('audioCodec'), year=guess.get('year'))
@classmethod
def fromname(cls, name):
return cls.fromguess(name, guess_movie_info(name))
def __repr__(self):
if self.year is None:
return '<%s [%r]>' % (self.__class__.__name__, self.title)
return '<%s [%r, %d]>' % (self.__class__.__name__, self.title, self.year)
def search_external_subtitles(path):
"""Search for external subtitles from a video `path` and their associated language.
:param str path: path to the video.
:return: found subtitles with their languages.
:rtype: dict
"""
dirpath, filename = os.path.split(path)
dirpath = dirpath or '.'
fileroot, fileext = os.path.splitext(filename)
subtitles = {}
for p in os.listdir(dirpath):
# skip badly encoded filenames
if isinstance(p, bytes): # pragma: no cover
logger.error('Skipping badly encoded filename %r in %r', p.decode('utf-8', errors='replace'), dirpath)
continue
# keep only valid subtitle filenames
if not p.startswith(fileroot) or not p.endswith(SUBTITLE_EXTENSIONS):
continue
# extract the potential language code
language_code = p[len(fileroot):-len(os.path.splitext(p)[1])].replace(fileext, '').replace('_', '-')[1:]
# default language is undefined
language = Language('und')
# attempt to parse
if language_code:
try:
language = Language.fromietf(language_code)
except ValueError:
logger.error('Cannot parse language code %r', language_code)
subtitles[p] = language
logger.debug('Found subtitles %r', subtitles)
return subtitles
def scan_video(path, subtitles=True, embedded_subtitles=True):
"""Scan a video and its subtitle languages from a video `path`.
:param str path: existing path to the video.
:param bool subtitles: scan for subtitles with the same name.
:param bool embedded_subtitles: scan for embedded subtitles.
:return: the scanned video.
:rtype: :class:`Video`
"""
# check for non-existing path
if not os.path.exists(path):
raise ValueError('Path does not exist')
# check video extension
if not path.endswith(VIDEO_EXTENSIONS):
raise ValueError('%s is not a valid video extension' % os.path.splitext(path)[1])
dirpath, filename = os.path.split(path)
logger.info('Scanning video %r in %r', filename, dirpath)
# guess
video = Video.fromguess(path, guess_file_info(path))
# size and hashes
video.size = os.path.getsize(path)
if video.size > 10485760:
logger.debug('Size is %d', video.size)
video.hashes['opensubtitles'] = hash_opensubtitles(path)
video.hashes['thesubdb'] = hash_thesubdb(path)
logger.debug('Computed hashes %r', video.hashes)
else:
logger.warning('Size is lower than 10MB: hashes not computed')
# external subtitles
if subtitles:
video.subtitle_languages |= set(search_external_subtitles(path).values())
# video metadata with enzyme
try:
if filename.endswith('.mkv'):
with open(path, 'rb') as f:
mkv = MKV(f)
# main video track
if mkv.video_tracks:
video_track = mkv.video_tracks[0]
# resolution
if video_track.height in (480, 720, 1080):
if video_track.interlaced:
video.resolution = '%di' % video_track.height
else:
video.resolution = '%dp' % video_track.height
logger.debug('Found resolution %s with enzyme', video.resolution)
# video codec
if video_track.codec_id == 'V_MPEG4/ISO/AVC':
video.video_codec = 'h264'
logger.debug('Found video_codec %s with enzyme', video.video_codec)
elif video_track.codec_id == 'V_MPEG4/ISO/SP':
video.video_codec = 'DivX'
logger.debug('Found video_codec %s with enzyme', video.video_codec)
elif video_track.codec_id == 'V_MPEG4/ISO/ASP':
video.video_codec = 'XviD'
logger.debug('Found video_codec %s with enzyme', video.video_codec)
else:
logger.warning('MKV has no video track')
# main audio track
if mkv.audio_tracks:
audio_track = mkv.audio_tracks[0]
# audio codec
if audio_track.codec_id == 'A_AC3':
video.audio_codec = 'AC3'
logger.debug('Found audio_codec %s with enzyme', video.audio_codec)
elif audio_track.codec_id == 'A_DTS':
video.audio_codec = 'DTS'
logger.debug('Found audio_codec %s with enzyme', video.audio_codec)
elif audio_track.codec_id == 'A_AAC':
video.audio_codec = 'AAC'
logger.debug('Found audio_codec %s with enzyme', video.audio_codec)
else:
logger.warning('MKV has no audio track')
# subtitle tracks
if mkv.subtitle_tracks:
if embedded_subtitles:
embedded_subtitle_languages = set()
for st in mkv.subtitle_tracks:
if st.language:
try:
embedded_subtitle_languages.add(Language.fromalpha3b(st.language))
except BabelfishError:
logger.error('Embedded subtitle track language %r is not a valid language', st.language)
embedded_subtitle_languages.add(Language('und'))
elif st.name:
try:
embedded_subtitle_languages.add(Language.fromname(st.name))
except BabelfishError:
logger.debug('Embedded subtitle track name %r is not a valid language', st.name)
embedded_subtitle_languages.add(Language('und'))
else:
embedded_subtitle_languages.add(Language('und'))
logger.debug('Found embedded subtitle %r with enzyme', embedded_subtitle_languages)
video.subtitle_languages |= embedded_subtitle_languages
else:
logger.debug('MKV has no subtitle track')
except EnzymeError:
logger.exception('Parsing video metadata with enzyme failed')
return video
def scan_videos(path, subtitles=True, embedded_subtitles=True):
"""Scan `path` for videos and their subtitles.
:param str path: existing directory path to scan.
:param bool subtitles: scan for subtitles with the same name.
:param bool embedded_subtitles: scan for embedded subtitles.
:return: the scanned videos.
:rtype: list of :class:`Video`
"""
# check for non-existing path
if not os.path.exists(path):
raise ValueError('Path does not exist')
# check for non-directory path
if not os.path.isdir(path):
raise ValueError('Path is not a directory')
# walk the path
videos = []
for dirpath, dirnames, filenames in os.walk(path):
# skip badly encoded directory names
if isinstance(dirpath, bytes): # pragma: no cover
logger.error('Skipping badly encoded directory %r', dirpath.decode('utf-8', errors='replace'))
continue
logger.debug('Walking directory %s', dirpath)
# remove badly encoded and hidden dirnames
for dirname in list(dirnames):
if isinstance(dirname, bytes): # pragma: no cover
logger.error('Skipping badly encoded dirname %r in %r', dirname.decode('utf-8', errors='replace'),
dirpath)
dirnames.remove(dirname)
elif dirname.startswith('.'):
logger.debug('Skipping hidden dirname %r in %r', dirname, dirpath)
dirnames.remove(dirname)
# scan for videos
for filename in filenames:
# skip badly encoded filenames
if isinstance(filename, bytes): # pragma: no cover
logger.error('Skipping badly encoded filename %r in %r', filename.decode('utf-8', errors='replace'),
dirpath)
continue
# filter on videos
if not filename.endswith(VIDEO_EXTENSIONS):
continue
# skip hidden files
if filename.startswith('.'):
logger.debug('Skipping hidden filename %r in %r', filename, dirpath)
continue
# reconstruct the file path
filepath = os.path.join(dirpath, filename)
# skip links
if os.path.islink(filepath):
logger.debug('Skipping link %r in %r', filename, dirpath)
continue
# scan video
try:
video = scan_video(filepath, subtitles=subtitles, embedded_subtitles=embedded_subtitles)
except ValueError: # pragma: no cover
logger.exception('Error scanning video')
continue
videos.append(video)
return videos
def hash_opensubtitles(video_path):
"""Compute a hash using OpenSubtitles' algorithm.
:param str video_path: path of the video.
:return: the hash.
:rtype: str
"""
bytesize = struct.calcsize(b'<q')
with open(video_path, 'rb') as f:
filesize = os.path.getsize(video_path)
filehash = filesize
if filesize < 65536 * 2:
return
for _ in range(65536 // bytesize):
filebuffer = f.read(bytesize)
(l_value,) = struct.unpack(b'<q', filebuffer)
filehash += l_value
filehash &= 0xFFFFFFFFFFFFFFFF # to remain as 64bit number
f.seek(max(0, filesize - 65536), 0)
for _ in range(65536 // bytesize):
filebuffer = f.read(bytesize)
(l_value,) = struct.unpack(b'<q', filebuffer)
filehash += l_value
filehash &= 0xFFFFFFFFFFFFFFFF
returnedhash = '%016x' % filehash
return returnedhash
def hash_thesubdb(video_path):
"""Compute a hash using TheSubDB's algorithm.
:param str video_path: path of the video.
:return: the hash.
:rtype: str
"""
readsize = 64 * 1024
if os.path.getsize(video_path) < readsize:
return
with open(video_path, 'rb') as f:
data = f.read(readsize)
f.seek(-readsize, os.SEEK_END)
data += f.read(readsize)
return hashlib.md5(data).hexdigest()
-269
View File
@@ -1,269 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2011-2012 Antoine Bertin <diaoulael@gmail.com>
#
# This file is part of subliminal.
#
# subliminal is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# subliminal is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with subliminal. If not, see <http://www.gnu.org/licenses/>.
from . import subtitles
from .languages import list_languages
import enzyme
import guessit
import hashlib
import logging
import mimetypes
import os
import struct
__all__ = ['EXTENSIONS', 'MIMETYPES', 'Video', 'Episode', 'Movie', 'UnknownVideo',
'scan', 'hash_opensubtitles', 'hash_thesubdb']
logger = logging.getLogger(__name__)
#: Video extensions
EXTENSIONS = ['.avi', '.mkv', '.mpg', '.mp4', '.m4v', '.mov', '.ogm', '.ogv', '.wmv',
'.divx', '.asf']
#: Video mimetypes
MIMETYPES = ['video/mpeg', 'video/mp4', 'video/quicktime', 'video/x-ms-wmv', 'video/x-msvideo',
'video/x-flv', 'video/x-matroska', 'video/x-matroska-3d']
class Video(object):
"""Base class for videos
:param string path: path
:param guess: guessed informations
:type guess: :class:`~guessit.guess.Guess`
:param string imdbid: imdbid
"""
def __init__(self, path, guess, imdbid=None):
self.release = path
self.guess = guess
self.imdbid = imdbid
self._path = None
self.hashes = {}
if os.path.exists(path):
self._path = path
self.size = os.path.getsize(self._path)
self._compute_hashes()
@classmethod
def from_path(cls, path):
"""Create a :class:`Video` subclass guessing all informations from the given path
:param string path: path
:return: video object
:rtype: :class:`Episode` or :class:`Movie` or :class:`UnknownVideo`
"""
guess = guessit.guess_file_info(path, 'autodetect')
result = None
if guess['type'] == 'episode' and 'series' in guess and 'season' in guess and 'episodeNumber' in guess:
title = None
if 'title' in guess:
title = guess['title']
result = Episode(path, guess['series'], guess['season'], guess['episodeNumber'], title, guess)
if guess['type'] == 'movie' and 'title' in guess:
year = None
if 'year' in guess:
year = guess['year']
result = Movie(path, guess['title'], year, guess)
if not result:
result = UnknownVideo(path, guess)
if not isinstance(result, cls):
raise ValueError('Video is not of requested type')
return result
@property
def exists(self):
"""Whether the video exists or not"""
if self._path:
return os.path.exists(self._path)
return False
@property
def path(self):
"""Path to the video"""
return self._path
@path.setter
def path(self, value):
if not os.path.exists(value):
raise ValueError('Path does not exists')
self._path = value
self.size = os.path.getsize(self._path)
self._compute_hashes()
def _compute_hashes(self):
"""Compute different hashes"""
self.hashes['OpenSubtitles'] = hash_opensubtitles(self.path)
self.hashes['TheSubDB'] = hash_thesubdb(self.path)
def scan(self):
"""Scan and return associated subtitles
:return: associated subtitles
:rtype: list of :class:`~subliminal.subtitles.Subtitle`
"""
if not self.exists:
return []
basepath = os.path.splitext(self.path)[0]
results = []
video_infos = None
try:
video_infos = enzyme.parse(self.path)
logger.debug(u'Succeeded parsing %s with enzyme: %r' % (self.path, video_infos))
except enzyme.ParseError:
logger.debug(u'Failed parsing %s with enzyme' % self.path)
if isinstance(video_infos, enzyme.core.AVContainer):
results.extend([subtitles.EmbeddedSubtitle.from_enzyme(self.path, s) for s in video_infos.subtitles])
for l in list_languages(1):
for e in subtitles.EXTENSIONS:
single_path = basepath + '%s' % e
if os.path.exists(single_path):
results.append(subtitles.ExternalSubtitle(single_path, None))
multi_path = basepath + '.%s%s' % (l, e)
if os.path.exists(multi_path):
results.append(subtitles.ExternalSubtitle(multi_path, l))
return results
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, self.release)
class Episode(Video):
"""Episode :class:`Video`
:param string path: path
:param string series: series
:param int season: season number
:param int episode: episode number
:param string title: title
:param guess: guessed informations
:type guess: :class:`~guessit.guess.Guess`
:param string tvdbid: tvdbid
:param string imdbid: imdbid
"""
def __init__(self, path, series, season, episode, title=None, guess=None, tvdbid=None, imdbid=None):
super(Episode, self).__init__(path, guess, imdbid)
self.series = series
self.title = title
self.season = season
self.episode = episode
self.tvdbid = tvdbid
class Movie(Video):
"""Movie :class:`Video`
:param string path: path
:param string title: title
:param int year: year
:param guess: guessed informations
:type guess: :class:`~guessit.guess.Guess`
:param string imdbid: imdbid
"""
def __init__(self, path, title, year=None, guess=None, imdbid=None):
super(Movie, self).__init__(path, guess, imdbid)
self.title = title
self.year = year
class UnknownVideo(Video):
"""Unknown video"""
pass
def scan(entry, max_depth=3, depth=0):
"""Scan a path for videos and subtitles
:param string entry: path
:param int max_depth: maximum folder depth
:param int depth: starting depth
:return: found videos and subtitles
:rtype: list of (:class:`Video`, [:class:`~subliminal.subtitles.Subtitle`])
"""
if depth > max_depth and max_depth != 0: # we do not want to search the whole file system except if max_depth = 0
return []
if depth == 0:
entry = os.path.abspath(entry)
if os.path.isdir(entry): # a dir? recurse
logger.debug(u'Scanning directory %s with depth %d/%d' % (entry, depth, max_depth))
result = []
for e in os.listdir(entry):
result.extend(scan(os.path.join(entry, e), max_depth, depth + 1))
return result
if os.path.isfile(entry) or depth == 0:
logger.debug(u'Scanning file %s with depth %d/%d' % (entry, depth, max_depth))
if depth != 0: # trust the user: only check for valid format if recursing
if mimetypes.guess_type(entry)[0] not in MIMETYPES and os.path.splitext(entry)[1] not in EXTENSIONS:
return []
video = Video.from_path(entry)
return [(video, video.scan())]
logger.warning(u'Scanning entry %s failed with depth %d/%d' % (entry, depth, max_depth))
return [] # anything else
def hash_opensubtitles(path):
"""Compute a hash using OpenSubtitles' algorithm
:param string path: path
:return: hash
:rtype: string
"""
longlongformat = 'q' # long long
bytesize = struct.calcsize(longlongformat)
with open(path, 'rb') as f:
filesize = os.path.getsize(path)
filehash = filesize
if filesize < 65536 * 2:
return None
for _ in range(65536 / bytesize):
filebuffer = f.read(bytesize)
(l_value,) = struct.unpack(longlongformat, filebuffer)
filehash += l_value
filehash = filehash & 0xFFFFFFFFFFFFFFFF # to remain as 64bit number
f.seek(max(0, filesize - 65536), 0)
for _ in range(65536 / bytesize):
filebuffer = f.read(bytesize)
(l_value,) = struct.unpack(longlongformat, filebuffer)
filehash += l_value
filehash = filehash & 0xFFFFFFFFFFFFFFFF
returnedhash = '%016x' % filehash
logger.debug(u'Computed OpenSubtitle hash %s for %s' % (returnedhash, path))
return returnedhash
def hash_thesubdb(path):
"""Compute a hash using TheSubDB's algorithm
:param string path: path
:return: hash
:rtype: string
"""
readsize = 64 * 1024
with open(path, 'rb') as f:
data = f.read(readsize)
f.seek(-readsize, os.SEEK_END)
data += f.read(readsize)
returnedhash = hashlib.md5(data).hexdigest()
logger.debug(u'Computed TheSubDB hash %s for %s' % (returnedhash, path))
return returnedhash
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+333
View File
@@ -0,0 +1,333 @@
interactions:
- request:
body: password=subliminal&username=subliminal&Submit=Log+in
headers:
Content-Length: ['53']
Content-Type: [application/x-www-form-urlencoded]
User-Agent: [Subliminal/0.8.0]
method: POST
uri: http://www.addic7ed.com/dologin.php
response:
body: {string: "\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta
http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n<title>Addic7ed.com
- For all those TV Series Addic7s: Subtitles, Tv Series and Movies Talk, Forum
and more -</title>\n<link href=\"css/wikisubtitles.css\" rel=\"stylesheet\"
title=\"default\" type=\"text/css\" media=\"screen\"/>\n</head>\n\n<body>\n<center><br
/>\n<table border=\"0\">\n<tr>\n <td rowspan=\"9\"><a href=\"/\"><img height=\"200\"
width=\"350\" src=\"http://www.addic7ed.com/images/addic7edheader.jpg\" border=\"0\"
\ title=\"Addic7ed.com - Quality Subtitles for TV Shows and movies\" alt=\"Addic7ed.com
- Quality Subtitles for TV Shows and movies\" /></a></td>\n</tr>\n<tr><td
align=\"center\" colspan=\"2\">\n<h1><small>Download free subtitles for TV
Shows and Movies.</small>&nbsp; \n<select name=\"applang\" class=\"inputCool\"
onchange=\"changeAppLang();\" id=\"comboLang\"><option value=\"ar\">Arabic</option><option
value=\"ca\">Catala</option><option selected=\"selected\" value=\"en\">English</option><option
value=\"eu\">Euskera</option><option value=\"fr\">French</option><option value=\"ga\">Galician</option><option
value=\"de\">German</option><option value=\"gr\">Greek</option><option value=\"hu\">Hungarian</option><option
value=\"it\">Italian</option><option value=\"fa\">Persian</option><option
value=\"pl\">Polish</option><option value=\"pt\">Portuguese</option><option
value=\"br\">Portuguese (Brazilian)</option><option value=\"ro\">Romanian</option><option
value=\"ru\">Russian</option><option value=\"es\">Spanish</option><option
value=\"se\">Swedish</option></select></h1>\n</td></tr>\n<tr><td align=\"center\"
colspan=\"2\">\n\n<script language=\"javascript\">\nvar url=\"/msgspopup.php?count=1\";\t\teditwin
= window.open(url, \"msgswin\", 'height=200,width=350,toolbar=0,location=0,statusbar=0,menubar=0');
\n\t\tif (editwin.focus) {editwin.focus()}\n</script>\n<div id=\"hBar\">\n\t\t\t
\ <ul>\n\t\t\t\t<li><a class=\"button white\" href=\"/panel.php\">My Panel</a></li><li><a
class=\"button white\" href=\"/newsub.php\">Upload</a></li>\t\t\t<li><a class=\"button
white\" href=\"/shows.php\">Shows</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/allshows/a\">Air dates</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"http://www.sub-talk.net\">Forum</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/logout.php\">Logout</a></li>\n\t\t\t </ul>\n\t\t\t </div>\n</td></tr>
\n<tr>\n <td>\n</td><td>\n\t<g:plusone size=\"medium\"></g:plusone>\n <a
href=\"http://twitter.com/addic7ed\" target=\"_blank\"><img width=\"32\" height=\"32\"
src=\"http://www.addic7ed.com/images/twitter_right.png\" alt=\"Twitter\" border=\"0\"
/></a>\n\t<a href=\"irc://irc.efnet.net:6667/addic7ed\"><img width=\"32\"
height=\"32\" src=\"http://www.addic7ed.com/images/irc-right.png\" alt=\"IRC\"
border=\"0\" /></a>\n<div style=\"float: right; padding-right:10%;\">\n\n
\ </td>\n </tr>\n <tr>\n <td colspan=2><iframe src=\"http://www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FAddic7ed&amp;send=false&amp;layout=button_count&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=tahoma&amp;height=21&amp;appId=121322186712\"
scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden; width:80px;
height:21px;\" allowTransparency=\"true\"></iframe>\n </td>\n </tr>\n</table>\n</center>\n\n<center>\n\n<!--[if
lt IE 7]>\n <style type=\"text/css\">\n div, img { behavior: url(http://www.addic7ed.com/js/iepngfix.htc)
}\n </style>\n<![endif]-->\n\n<center><table border=\"0\" width=\"90%\">\n<tr>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Addic7ed</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\"
src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\"
alt=\" \" />Popular Shows</td>\n<td class=\"NewsTitle\"><img width=\"20\"
height=\"20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\"
/><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Useful</td>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Forums</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/shows.php\">Browse
By Shows</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/4906\">12
Monkeys</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/shows-schedule\">TV
Shows Schedule</a></div></td>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/1031-changelog/\">Site
Changelog</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/movie-subtitles\">Browse
By Movies</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/1812\">Homeland</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/2784-frequently-asked-questions/\">Frequently
Asked Questions</a></div></td>\n<td><div id=\"footermenu\">Support Us</div></td>\n</tr>\n<tr>\n<td><div
id=\"footermenu\"><a href=\"/top-uploaders\">Top Uploaders</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/620\">Modern Family</a></div></td>\n<td><div
id=\"footermenu\">RSS Feeds</div></td>\n<td><div id=\"footermenu\">Premium
Accounts</div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/log.php?mode=downloaded\">Top
Downloads</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/466\">Glee</a></div></td>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\"/>Tutorials</td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/thread-6-1-1.html\">Video
Formats</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/log.php?mode=news\">All
News</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/450\">Parks
and Recreation</a></div></td>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/338-guide-to-syncing-with-subtitleedit/page__p__1485__hl__%2B+%2Bsync__fromsearch__1#entry1485\">How
to Synchronize Subtitles</a></div></td>\n<td><div id=\"footermenu\">Frequently
Asked Questions</div></td>\n</tr> \n<tr>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net\">Sub-Talk
Forums</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/1277\">Shameless
(US)</a></div></td>\n<td><div id=\"footermenu\">What Are Subtitles</div></td>\n<td><div
id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=7\">TV Shows
Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/latest_comments.php\">Latest
Comments</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/126\">The
Big Bang Theory</a></div></td>\n<td><div id=\"footermenu\">New Translation
Tutorial</div></td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=22\">Movies
Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"http://www.vreaubagaj.ro/troler/\"
title=\"Trolere ieftine\" alt=\"Trolere ieftine\">Troler ieftin</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/130\">Family Guy</a></div></td>\n<td><div
id=\"footermenu\">Upload a New Subtitle Tutorial</div></td>\n<td class=\"NewsTitle\"><img
width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Stats</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\">Terms of Service</div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/1799\">American Horror Story</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"http://sub-talk.net/viewthread.php?tid=294\">How
to have an Avatar</a></div></td>\n<td align=\"left\">.\n\t\t\t\t</td>\n</tr>\n<tr>\n<td><div
id=\"footermenu\"><a href=\"/contact.php\">Contact</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/15\">House</a></div></td>\n<td><div id=\"footermenu\"><a
href=\"http://www.vreaubagaj.ro/\" alt=\"Trolere\" title=\"Trolere\">Trolere</a></div></td>\n<td>\n</td>\n</tr>\n</table></center>\n</center>\n\n<script
type=\"text/javascript\">\nvar gaJsHost = ((\"https:\" == document.location.protocol)
? \"https://ssl.\" : \"http://www.\");\ndocument.write(unescape(\"%3Cscript
src='\" + gaJsHost + \"google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E\"));\n</script>\n<script
type=\"text/javascript\">\ntry {\nvar pageTracker = _gat._getTracker(\"UA-10775680-1\");\npageTracker._trackPageview();\n}
catch(err) {}</script>\n\n\n<script type=\"text/javascript\" src=\"http://apis.google.com/js/plusone.js\"></script>\n
\ \n</body>\n</html>\n"}
headers:
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Connection: [keep-alive]
Content-Type: [text/html]
Date: ['Sat, 04 Jul 2015 17:11:36 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Location: [/]
Pragma: [no-cache]
Server: [nginx]
Set-Cookie: [PHPSESSID=sji8d1inpflpb64eg1ahge4f74; path=/]
X-Powered-By: [PHP/5.3.3]
status: {code: 302, message: Moved Temporarily}
- request:
body: null
headers:
Cookie: [PHPSESSID=sji8d1inpflpb64eg1ahge4f74]
User-Agent: [Subliminal/0.8.0]
method: GET
uri: http://www.addic7ed.com/panel.php
response:
body: {string: " \n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n\n<meta
http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n<title>Addic7ed.com
- For all those TV Series Addic7s: Subtitles, Tv Series and Movies Talk, Forum
and more -</title>\n<link href=\"css/wikisubtitles.css\" rel=\"stylesheet\"
title=\"default\" type=\"text/css\" />\n<link rel=\"SHORTCUT ICON\" href=\"favicon.ico\"
/> \n<link rel=\"stylesheet\" type=\"text/css\" href=\"css/panel.css\" >\n</head>\n<body>\n\n<center><br
/>\n<table border=\"0\">\n<tr>\n <td rowspan=\"9\"><a href=\"/\"><img height=\"200\"
width=\"350\" src=\"http://www.addic7ed.com/images/addic7edheader.jpg\" border=\"0\"
\ title=\"Addic7ed.com - Quality Subtitles for TV Shows and movies\" alt=\"Addic7ed.com
- Quality Subtitles for TV Shows and movies\" /></a></td>\n</tr>\n<tr><td
align=\"center\" colspan=\"2\">\n<h1><small>Download free subtitles for TV
Shows and Movies.</small>&nbsp; \n<select name=\"applang\" class=\"inputCool\"
onchange=\"changeAppLang();\" id=\"comboLang\"><option value=\"ar\">Arabic</option><option
value=\"ca\">Catala</option><option selected=\"selected\" value=\"en\">English</option><option
value=\"eu\">Euskera</option><option value=\"fr\">French</option><option value=\"ga\">Galician</option><option
value=\"de\">German</option><option value=\"gr\">Greek</option><option value=\"hu\">Hungarian</option><option
value=\"it\">Italian</option><option value=\"fa\">Persian</option><option
value=\"pl\">Polish</option><option value=\"pt\">Portuguese</option><option
value=\"br\">Portuguese (Brazilian)</option><option value=\"ro\">Romanian</option><option
value=\"ru\">Russian</option><option value=\"es\">Spanish</option><option
value=\"se\">Swedish</option></select></h1>\n</td></tr>\n<tr><td align=\"center\"
colspan=\"2\">\n\n<script language=\"javascript\">\nvar url=\"/msgspopup.php?count=1\";\t\teditwin
= window.open(url, \"msgswin\", 'height=200,width=350,toolbar=0,location=0,statusbar=0,menubar=0');
\n\t\tif (editwin.focus) {editwin.focus()}\n</script>\n<div id=\"hBar\">\n\t\t\t
\ <ul>\n\t\t\t\t<li><a class=\"button white\" href=\"/panel.php\">My Panel</a></li><li><a
class=\"button white\" href=\"/newsub.php\">Upload</a></li>\t\t\t<li><a class=\"button
white\" href=\"/shows.php\">Shows</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/allshows/a\">Air dates</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"http://www.sub-talk.net\">Forum</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/logout.php\">Logout</a></li>\n\t\t\t </ul>\n\t\t\t </div>\n</td></tr>
\n<tr>\n <td>\n</td><td>\n\t<g:plusone size=\"medium\"></g:plusone>\n <a
href=\"http://twitter.com/addic7ed\" target=\"_blank\"><img width=\"32\" height=\"32\"
src=\"http://www.addic7ed.com/images/twitter_right.png\" alt=\"Twitter\" border=\"0\"
/></a>\n\t<a href=\"irc://irc.efnet.net:6667/addic7ed\"><img width=\"32\"
height=\"32\" src=\"http://www.addic7ed.com/images/irc-right.png\" alt=\"IRC\"
border=\"0\" /></a>\n<div style=\"float: right; padding-right:10%;\">\n\n
\ </td>\n </tr>\n <tr>\n <td colspan=2><iframe src=\"http://www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FAddic7ed&amp;send=false&amp;layout=button_count&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=tahoma&amp;height=21&amp;appId=121322186712\"
scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden; width:80px;
height:21px;\" allowTransparency=\"true\"></iframe>\n </td>\n </tr>\n</table>\n</center>\n\n<center>\n\n<!--[if
lt IE 7]>\n <style type=\"text/css\">\n div, img { behavior: url(http://www.addic7ed.com/js/iepngfix.htc)
}\n </style>\n<![endif]-->\n\n\n<table width=\"94%\" border=\"0\" cellpadding=\"0\"
cellspacing=\"0\">\n <tr bgcolor=\"#FFFFFF\">\n <th width=\"14%\" height=\"37\"
bgcolor=\"#009BCA\" scope=\"row\"></th>\n \n <td width=\"83%\" height=\"37\"><center>\n<div
id=\"container\"> \n \t<table class=\"tabel\" border=\"0\">\n \t<tr>
<!-- table header -->\n \t<td class=\"tablecorner\"><img src=\"images/tl.gif\"
/></td>\n <td></td>\n <td class=\"tablecorner\"><img
src=\"images/tr.gif\" /></td>\n </tr>\n <tr>\n \t<td></td>\n
\ <td><div class=\"subItem\"><big><center>subliminal - </center></div>\n</td>\n
\ <td></td>\n </tr>\n <tr> <!-- table
footer -->\n \t<td class=\"tablecorner\"><img src=\"images/bl.gif\"
/></td>\n <td></td>\n <td class=\"tablecorner\"><img
src=\"images/br.gif\" /></td>\n </tr>\n </table>\n </div></td>\n
\ </tr>\n<tr><td><img src=\"images/invisible.gif\"></td></tr>\n <tr>\n<th
height=\"58\" bgcolor=\"#009BCA\" scope=\"row\"><div class=\"navbar\">\r\n<!--
*********************************Start Menu******************************
-->\r\n<div class=\"mainDiv\" >\r\n<div class=\"topItem\" >Personal</div>\r\n<div
class=\"dropMenu\" ><!-- -->\r\n <div class=\"subMenu\" style=\"display:inline;\">\r\n
\ <div class=\"subItem\"><a href=\"/panel_edit_profile.php\">Edit
Profile</a></div>\r\n <div class=\"subItem\"><a href=\"/mydownloads.php\">My
Downloads</a></div>\r\n <div class=\"subItem\"><a href=\"/following.php\">I'm
Following</a></div>\r\n <div class=\"subItem\"><a href=\"/myviews.php\">I've
Viewed</a></div>\r\n </div>\r\n</div>\r\n</div>\r\n<!-- *********************************End
Menu****************************** --></th>\r\n <td bgcolor=\"#009BCA\"
align=\"center\">\n<div id=\"container\"> \n \t<table class=\"tabel70\"
border=0\">\n \t<tr> <!-- table header -->\n \t<td class=\"tablecorner\"><img
src=\"/images/tl.gif\" /></td>\n <td></td>\n <td
class=\"tablecorner\"><img src=\"/images/tr.gif\" /></td>\n </tr>\n
\ <tr>\n \t<td></td>\n <td>\n<table class=\"tabel\"
border=\"0\" align=\"center\">\n <tr>\n <td align=\"center\" rowspan=\"10\"><img
src=\"http://www.gravatar.com/avatar.php?gravatar_id=db74435d70e361342a19ce6de59db4ff&size=100&rating=X&border=FF0000\"
width=\"100\" height=\"100\" /></td>\n <td></td>\n </tr>\n <tr>\n
\ <td class=\"topItem\">Addict Since</td>\n <td>2015-06-30 16:35:35</td>\n
\ <td></td>\n </tr>\n <tr>\n <td class=\"topItem\">Web
site</td>\n <td></td>\n <td></td>\n </tr>\n <tr>\n
\ <td class=\"topItem\">Signature</td>\n <td></td>\n <td></td>\n
\ </tr>\n <tr>\n <td class=\"topItem\">Gender</td>\n <td>Male</td>\n
\ <td></td>\n </tr>\n <tr>\n <td class=\"topItem\">Downloads
by User Today</td>\n <td><a href='mydownloads.php'>0 of 40</a></td>\n
\ <td></td>\n </tr>\n <tr>\n <td class=\"topItem\">Downloads
from IP Today</td>\n <td><a href='log.php?mode=ip&ip=5.51.3.145'>5</a></td>\n
\ <td></td>\n </tr>\n <tr>\n <td class=\"topItem\">Class</td>\n
\ \t<td>Regular</td>\n <td></td>\n </tr>\n <tr>\n <td
class=\"topItem\">Last Seen</td>\n <td>2015-07-04 19:11:36</td>\n <td></td>\n
\ </tr>\n <tr>\n <td class=\"topItem\">Last IP</td>\n <td><a
href='log.php?mode=ip&ip=5.51.3.145'>5.51.3.145</a></td>\n <td></td>\n
\ </tr>\n <tr>\n <td class=\"topItem\">Episodes created</td>\n
\ <td>0</td>\n <td></td>\n </tr>\n </table>\n</td>\n
\ <td></td>\n </tr>\n <tr> <!-- table
footer -->\n \t<td class=\"tablecorner\"><img src=\"/images/bl.gif\"
/></td>\n <td></td>\n <td class=\"tablecorner\"><img
src=\"/images/br.gif\" /></td>\n </tr>\n </table>\n </div>\n</td>\n
\ \n<tr bgcolor=\"#009BCA\">\n <th height=\"80\" scope=\"row\"><div
class=\"navbar\">\n<!-- *********************************Start Menu******************************
-->\n<div class=\"mainDiv\" >\n<div class=\"topItem\" >Messages</div> \n<div
class=\"dropMenu\" ><!-- -->\n\t<div class=\"subMenu\" style=\"display:inline;\">\n\t\t<div
class=\"subItem\"><a href=\"msginbox.php\">Inbox</a></div>\n\t <div
class=\"subItem\"><a href=\"msgoutbox.php\">Outbox</a></div>\n\t\t<div class=\"subItem\"><a
href=\"msgcreate.php\">Compose</a></div>\n\t</div>\n</div>\n</div>\n<!-- *********************************End
Menu****************************** --></th>\n <td colspan=\"2\" bgcolor=\"#009BCA\"></td>\n
\ </tr>\n <tr bgcolor=\"#009BCA\">\n <th height=\"74\" bgcolor=\"#009BCA\"
scope=\"row\"><div class=\"navbar\">\n<!-- *********************************Start
Menu****************************** -->\n<div class=\"mainDiv\" >\n<div class=\"topItem\"
>RSS Feeds</div> \n<div class=\"dropMenu\" ><!-- -->\n\t<div class=\"subMenu\"
style=\"display:inline;\">\n\t\t<div class=\"subItem\"><a href=\"/log.php?mode=news\">Latest
News</a></div>\n\t\t<div class=\"subItem\"><a href=\"/rss.php?mode=hotspot\">New
Releases</a></div>\n\t <div class=\"subItem\"><a href=\"/rss.php?mode=completed\">Latest
Files</a></div>\n\t\t<div class=\"subItem\"><a href=\"/rss.php?mode=edited\">Latest
Edited Files</a></div>\n\t\t<div class=\"subItem\"><a href=\"/rss.php?mode=translated\">Latest
Started Translations</a></div>\n\t\t<div class=\"subItem\"><a href=\"/rss.php?mode=versions\">Latest
New Versions</a></div>\n\t</div>\n</div>\n</div>\n<!-- *********************************End
Menu****************************** --></th>\n <td colspan=\"2\" rowspan=\"5\"></td>\n
\ </tr>\n <tr bgcolor=\"#FFFFFF\">\n <th height=\"75\" bgcolor=\"#009BCA\"
scope=\"row\"><div class=\"navbar\">\n <!-- *********************************Start
Menu****************************** -->\n <div class=\"mainDiv\" >\n <div
class=\"topItem\" >Support Addic7ed</div> \n <div class=\"dropMenu\"
><!-- -->\n <div class=\"subMenu\" style=\"display:inline;\">\n <div
class=\"subItem\"><a href=\"/contact.php\">Donations</a></div>\n </div>\n
\ </div>\n </div>\n <!-- *********************************End Menu******************************
--></th>\n </tr>\n <tr bgcolor=\"#009BCA\">\n <th height=\"70\" scope=\"row\"><div
class=\"navbar\">\n <!-- *********************************Start Menu******************************
-->\n <div class=\"mainDiv\" >\n <div class=\"topItem\" >Help & Contact</div>
\ \n <div class=\"dropMenu\" ><!-- -->\n <div class=\"subMenu\"
style=\"display:inline;\">\n <div class=\"subItem\"><a href=\"http://www.sub-talk.net/\">Forums</a></div>\n
\ <div class=\"subItem\"><a href=\"/contact.php\">Contact</a></div> \n
\ </div>\n </div>\n </div>\n <!-- *********************************End
Menu****************************** --></th>\n </tr>\n <tr bgcolor=\"#009BCA\">\n
\ <th height=\"98\" scope=\"row\"><div class=\"navbar\">\n <!-- *********************************Start
Menu****************************** -->\n <div class=\"mainDiv\" >\n <div
class=\"topItem\" >Miscellaneous</div> \n <div class=\"dropMenu\"
><!-- -->\n <div class=\"subMenu\" style=\"display:inline;\">\n <div
class=\"subItem\"><a href=\"/shows-schedule\">Shows Schedule</a></div>\n <div
class=\"subItem\"><a href=\"http://www.twitter.com/addic7ed\">Addic7ed@Twitter</a></div>\n
\ <div class=\"subItem\"><a href=\"irc://irc.efnet.net/addic7ed\">Addic7ed
on IRC</a></div>\n <div class=\"subItem\"><a href=\"http://chat.mibbit.com/?server=irc.umich.edu&channel=%23addic7ed\">Addic7ed
- IRC (WebChat)</a></div>\n <div class=\"subItem\"><a href=\"http://www.facebook.com/pages/Addic7ed-Subtitles/103460216722?ref=nf\">Addic7ed
on Facebook</a></div>\n </div>\n </div>\n </div>\n <!-- *********************************End
Menu****************************** --></th>\n </tr>\n \n\n</table>\n<script
type=\"text/javascript\" src=\"/xpmenuv21.js\"></script>\n</div>\n\n<center><table
border=\"0\" width=\"90%\">\n<tr>\n<td class=\"NewsTitle\"><img width=\"20\"
height=\"20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\"
/><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Addic7ed</td>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Popular Shows</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\"
src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\"
alt=\" \" />Useful</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\"
src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\"
alt=\" \" />Forums</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/shows.php\">Browse
By Shows</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/4906\">12
Monkeys</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/shows-schedule\">TV
Shows Schedule</a></div></td>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/1031-changelog/\">Site
Changelog</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/movie-subtitles\">Browse
By Movies</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/1812\">Homeland</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/2784-frequently-asked-questions/\">Frequently
Asked Questions</a></div></td>\n<td><div id=\"footermenu\">Support Us</div></td>\n</tr>\n<tr>\n<td><div
id=\"footermenu\"><a href=\"/top-uploaders\">Top Uploaders</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/620\">Modern Family</a></div></td>\n<td><div
id=\"footermenu\">RSS Feeds</div></td>\n<td><div id=\"footermenu\">Premium
Accounts</div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/log.php?mode=downloaded\">Top
Downloads</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/466\">Glee</a></div></td>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\"/>Tutorials</td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/thread-6-1-1.html\">Video
Formats</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/log.php?mode=news\">All
News</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/450\">Parks
and Recreation</a></div></td>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/338-guide-to-syncing-with-subtitleedit/page__p__1485__hl__%2B+%2Bsync__fromsearch__1#entry1485\">How
to Synchronize Subtitles</a></div></td>\n<td><div id=\"footermenu\">Frequently
Asked Questions</div></td>\n</tr> \n<tr>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net\">Sub-Talk
Forums</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/1277\">Shameless
(US)</a></div></td>\n<td><div id=\"footermenu\">What Are Subtitles</div></td>\n<td><div
id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=7\">TV Shows
Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/latest_comments.php\">Latest
Comments</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/126\">The
Big Bang Theory</a></div></td>\n<td><div id=\"footermenu\">New Translation
Tutorial</div></td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=22\">Movies
Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"http://www.vreaubagaj.ro/troler/\"
title=\"Trolere ieftine\" alt=\"Trolere ieftine\">Troler ieftin</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/130\">Family Guy</a></div></td>\n<td><div
id=\"footermenu\">Upload a New Subtitle Tutorial</div></td>\n<td class=\"NewsTitle\"><img
width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Stats</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\">Terms of Service</div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/1799\">American Horror Story</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"http://sub-talk.net/viewthread.php?tid=294\">How
to have an Avatar</a></div></td>\n<td align=\"left\">.\n\t\t\t\t</td>\n</tr>\n<tr>\n<td><div
id=\"footermenu\"><a href=\"/contact.php\">Contact</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/15\">House</a></div></td>\n<td><div id=\"footermenu\"><a
href=\"http://www.vreaubagaj.ro/\" alt=\"Trolere\" title=\"Trolere\">Trolere</a></div></td>\n<td>\n</td>\n</tr>\n</table></center>\n</center>\n\n<script
type=\"text/javascript\">\nvar gaJsHost = ((\"https:\" == document.location.protocol)
? \"https://ssl.\" : \"http://www.\");\ndocument.write(unescape(\"%3Cscript
src='\" + gaJsHost + \"google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E\"));\n</script>\n<script
type=\"text/javascript\">\ntry {\nvar pageTracker = _gat._getTracker(\"UA-10775680-1\");\npageTracker._trackPageview();\n}
catch(err) {}</script>\n\n\n<script type=\"text/javascript\" src=\"http://apis.google.com/js/plusone.js\"></script>\n
\ \n</body>\n</html>\n"}
headers:
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Connection: [keep-alive]
Content-Type: [text/html]
Date: ['Sat, 04 Jul 2015 17:11:36 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [nginx]
X-Powered-By: [PHP/5.3.3]
status: {code: 200, message: OK}
version: 1
@@ -0,0 +1,116 @@
interactions:
- request:
body: password=lanimilbus&username=subliminal&Submit=Log+in
headers:
Content-Length: ['53']
Content-Type: [application/x-www-form-urlencoded]
User-Agent: [Subliminal/0.8.0]
method: POST
uri: http://www.addic7ed.com/dologin.php
response:
body: {string: "\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta
http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n<title>Addic7ed.com
- For all those TV Series Addic7s: Subtitles, Tv Series and Movies Talk, Forum
and more -</title>\n<link href=\"css/wikisubtitles.css\" rel=\"stylesheet\"
title=\"default\" type=\"text/css\" media=\"screen\"/>\n</head>\n\n<body>\n<center><br
/>\n<table border=\"0\">\n<tr>\n <td rowspan=\"9\"><a href=\"/\"><img height=\"200\"
width=\"350\" src=\"http://www.addic7ed.com/images/addic7edheader.jpg\" border=\"0\"
\ title=\"Addic7ed.com - Quality Subtitles for TV Shows and movies\" alt=\"Addic7ed.com
- Quality Subtitles for TV Shows and movies\" /></a></td>\n</tr>\n<tr><td
align=\"center\" colspan=\"2\">\n<h1><small>Download free subtitles for TV
Shows and Movies.</small>&nbsp; \n<select name=\"applang\" class=\"inputCool\"
onchange=\"changeAppLang();\" id=\"comboLang\"><option value=\"ar\">Arabic</option><option
value=\"ca\">Catala</option><option selected=\"selected\" value=\"en\">English</option><option
value=\"eu\">Euskera</option><option value=\"fr\">French</option><option value=\"ga\">Galician</option><option
value=\"de\">German</option><option value=\"gr\">Greek</option><option value=\"hu\">Hungarian</option><option
value=\"it\">Italian</option><option value=\"fa\">Persian</option><option
value=\"pl\">Polish</option><option value=\"pt\">Portuguese</option><option
value=\"br\">Portuguese (Brazilian)</option><option value=\"ro\">Romanian</option><option
value=\"ru\">Russian</option><option value=\"es\">Spanish</option><option
value=\"se\">Swedish</option></select></h1>\n</td></tr>\n<tr><td align=\"center\"
colspan=\"2\">\n<div id=\"hBar\">\n\t\t\t <ul>\n\t\t\t\t<li><a class=\"button
white\" href=\"/newaccount.php\">Signup</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/login.php\">Login</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/shows.php\">Shows</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/allshows/a\">Air dates</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"http://www.sub-talk.net\">Forum</a></li>\n\t\t\t </ul>\n\t\t\t
\ </div>\n</td></tr> \n<tr>\n <td>\n</td><td>\n\t<g:plusone size=\"medium\"></g:plusone>\n
\ <a href=\"http://twitter.com/addic7ed\" target=\"_blank\"><img width=\"32\"
height=\"32\" src=\"http://www.addic7ed.com/images/twitter_right.png\" alt=\"Twitter\"
border=\"0\" /></a>\n\t<a href=\"irc://irc.efnet.net:6667/addic7ed\"><img
width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/irc-right.png\"
alt=\"IRC\" border=\"0\" /></a>\n<div style=\"float: right; padding-right:10%;\">\n\n
\ </td>\n </tr>\n <tr>\n <td colspan=2><iframe src=\"http://www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FAddic7ed&amp;send=false&amp;layout=button_count&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=tahoma&amp;height=21&amp;appId=121322186712\"
scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden; width:80px;
height:21px;\" allowTransparency=\"true\"></iframe>\n </td>\n </tr>\n</table>\n</center>\n\n<center>\n\n<!--[if
lt IE 7]>\n <style type=\"text/css\">\n div, img { behavior: url(http://www.addic7ed.com/js/iepngfix.htc)
}\n </style>\n<![endif]-->\n<p align=\"center\">Wrong password </p>\n<center><table
border=\"0\" width=\"90%\">\n<tr>\n<td class=\"NewsTitle\"><img width=\"20\"
height=\"20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\"
/><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Addic7ed</td>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Popular Shows</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\"
src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\"
alt=\" \" />Useful</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\"
src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\"
alt=\" \" />Forums</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/shows.php\">Browse
By Shows</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/4906\">12
Monkeys</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/shows-schedule\">TV
Shows Schedule</a></div></td>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/1031-changelog/\">Site
Changelog</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/movie-subtitles\">Browse
By Movies</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/1812\">Homeland</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/2784-frequently-asked-questions/\">Frequently
Asked Questions</a></div></td>\n<td><div id=\"footermenu\">Support Us</div></td>\n</tr>\n<tr>\n<td><div
id=\"footermenu\"><a href=\"/top-uploaders\">Top Uploaders</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/620\">Modern Family</a></div></td>\n<td><div
id=\"footermenu\">RSS Feeds</div></td>\n<td><div id=\"footermenu\">Premium
Accounts</div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/log.php?mode=downloaded\">Top
Downloads</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/466\">Glee</a></div></td>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\"/>Tutorials</td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/thread-6-1-1.html\">Video
Formats</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/log.php?mode=news\">All
News</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/450\">Parks
and Recreation</a></div></td>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/338-guide-to-syncing-with-subtitleedit/page__p__1485__hl__%2B+%2Bsync__fromsearch__1#entry1485\">How
to Synchronize Subtitles</a></div></td>\n<td><div id=\"footermenu\">Frequently
Asked Questions</div></td>\n</tr> \n<tr>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net\">Sub-Talk
Forums</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/1277\">Shameless
(US)</a></div></td>\n<td><div id=\"footermenu\">What Are Subtitles</div></td>\n<td><div
id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=7\">TV Shows
Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/latest_comments.php\">Latest
Comments</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/126\">The
Big Bang Theory</a></div></td>\n<td><div id=\"footermenu\">New Translation
Tutorial</div></td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=22\">Movies
Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"http://www.vreaubagaj.ro/troler/\"
title=\"Trolere ieftine\" alt=\"Trolere ieftine\">Troler ieftin</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/130\">Family Guy</a></div></td>\n<td><div
id=\"footermenu\">Upload a New Subtitle Tutorial</div></td>\n<td class=\"NewsTitle\"><img
width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Stats</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\">Terms of Service</div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/1799\">American Horror Story</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"http://sub-talk.net/viewthread.php?tid=294\">How
to have an Avatar</a></div></td>\n<td align=\"left\">.\n\t\t\t\t</td>\n</tr>\n<tr>\n<td><div
id=\"footermenu\"><a href=\"/contact.php\">Contact</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/15\">House</a></div></td>\n<td><div id=\"footermenu\"><a
href=\"http://www.vreaubagaj.ro/\" alt=\"Trolere\" title=\"Trolere\">Trolere</a></div></td>\n<td>\n</td>\n</tr>\n</table></center>\n</center>\n\n<script
type=\"text/javascript\">\nvar gaJsHost = ((\"https:\" == document.location.protocol)
? \"https://ssl.\" : \"http://www.\");\ndocument.write(unescape(\"%3Cscript
src='\" + gaJsHost + \"google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E\"));\n</script>\n<script
type=\"text/javascript\">\ntry {\nvar pageTracker = _gat._getTracker(\"UA-10775680-1\");\npageTracker._trackPageview();\n}
catch(err) {}</script>\n\n\n<script type=\"text/javascript\" src=\"http://apis.google.com/js/plusone.js\"></script>\n
\ \n</body>\n</html>\n"}
headers:
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Connection: [keep-alive]
Content-Type: [text/html]
Date: ['Sat, 04 Jul 2015 17:11:36 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [nginx]
Set-Cookie: [PHPSESSID=d3o4eeisg08alu7niut1m3oh04; path=/]
X-Powered-By: [PHP/5.3.3]
status: {code: 200, message: OK}
version: 1
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,527 @@
interactions:
- request:
body: null
headers:
User-Agent: [Subliminal/0.8.0]
method: GET
uri: http://www.addic7ed.com/search.php?Submit=Search&search=The+Big+Bang+Theory
response:
body: {string: "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta
http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n<title>\nSearch
\"The Big Bang Theory\" Subtitle Download - Addic7ed.com - For all those TV
Series Addic7s: Subtitles, Tv Series and Movies Talk, Forum and more -</title>\n<link
href=\"http://www.addic7ed.com/css/wikisubtitles.css\" rel=\"stylesheet\"
title=\"default\" type=\"text/css\" />\n<link rel=\"SHORTCUT ICON\" href=\"favicon.ico\"
/> \n<script type=\"text/javascript\" src=\"http://www.addic7ed.com/js/mootools.v1.11.js\"></script>\n\n</head>\n<body>\n<center><br
/>\n<table border=\"0\">\n<tr>\n <td rowspan=\"9\"><a href=\"/\"><img height=\"200\"
width=\"350\" src=\"http://www.addic7ed.com/images/addic7edheader.jpg\" border=\"0\"
\ title=\"Addic7ed.com - Quality Subtitles for TV Shows and movies\" alt=\"Addic7ed.com
- Quality Subtitles for TV Shows and movies\" /></a></td>\n</tr>\n<tr><td
align=\"center\" colspan=\"2\">\n<h1><small>Download free subtitles for TV
Shows and Movies.</small>&nbsp; \n<select name=\"applang\" class=\"inputCool\"
onchange=\"changeAppLang();\" id=\"comboLang\"><option value=\"ar\">Arabic</option><option
value=\"ca\">Catala</option><option selected=\"selected\" value=\"en\">English</option><option
value=\"eu\">Euskera</option><option value=\"fr\">French</option><option value=\"ga\">Galician</option><option
value=\"de\">German</option><option value=\"gr\">Greek</option><option value=\"hu\">Hungarian</option><option
value=\"it\">Italian</option><option value=\"fa\">Persian</option><option
value=\"pl\">Polish</option><option value=\"pt\">Portuguese</option><option
value=\"br\">Portuguese (Brazilian)</option><option value=\"ro\">Romanian</option><option
value=\"ru\">Russian</option><option value=\"es\">Spanish</option><option
value=\"se\">Swedish</option></select></h1>\n</td></tr>\n<tr><td align=\"center\"
colspan=\"2\">\n<div id=\"hBar\">\n\t\t\t <ul>\n\t\t\t\t<li><a class=\"button
white\" href=\"/newaccount.php\">Signup</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/login.php\">Login</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/shows.php\">Shows</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/allshows/a\">Air dates</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"http://www.sub-talk.net\">Forum</a></li>\n\t\t\t </ul>\n\t\t\t
\ </div>\n</td></tr> \n<tr>\n <td>\n</td><td>\n\t<g:plusone size=\"medium\"></g:plusone>\n
\ <a href=\"http://twitter.com/addic7ed\" target=\"_blank\"><img width=\"32\"
height=\"32\" src=\"http://www.addic7ed.com/images/twitter_right.png\" alt=\"Twitter\"
border=\"0\" /></a>\n\t<a href=\"irc://irc.efnet.net:6667/addic7ed\"><img
width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/irc-right.png\"
alt=\"IRC\" border=\"0\" /></a>\n<div style=\"float: right; padding-right:10%;\">\n\n
\ </td>\n </tr>\n <tr>\n <td colspan=2><iframe src=\"http://www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FAddic7ed&amp;send=false&amp;layout=button_count&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=tahoma&amp;height=21&amp;appId=121322186712\"
scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden; width:80px;
height:21px;\" allowTransparency=\"true\"></iframe>\n </td>\n </tr>\n</table>\n</center>\n\n<center>\n\n<!--[if
lt IE 7]>\n <style type=\"text/css\">\n div, img { behavior: url(http://www.addic7ed.com/js/iepngfix.htc)
}\n </style>\n<![endif]-->\n<br />\n<center>\n<!-- MarketGidComposite Start
-->\n<div id=\"MarketGidScriptRootC13385\">\n <div id=\"MarketGidPreloadC13385\">\n
\ <a id=\"mg_add13385\" href=\"http://mgid.com/advertisers/?utm_source=widget&utm_medium=text&utm_campaign=add\"
target=\"_blank\">Place your ad here</a><br> <a href=\"http://mgid.com/\"
target=\"_blank\">Loading...</a> \n </div>\n <script>\n
\ window.MGWidgetTitle13385 = \"Promoted
Content\"; (function(){\n var
D=new Date(),d=document,b='body',ce='createElement',ac='appendChild',st='style',ds='display',n='none',gi='getElementById';\n
\ var i=d[ce]('iframe');i[st][ds]=n;d[gi](\"MarketGidScriptRootC13385\")[ac](i);try{var
iw=i.contentWindow.document;iw.open();iw.writeln(\"<ht\"+\"ml><bo\"+\"dy></bo\"+\"dy></ht\"+\"ml>\");iw.close();var
c=iw[b];}\n catch(e){var
iw=d;var c=d[gi](\"MarketGidScriptRootC13385\");}var dv=iw[ce]('div');dv.id=\"MG_ID\";dv[st][ds]=n;dv.innerHTML=13385;c[ac](dv);\n
\ var
s=iw[ce]('script');s.async='async';s.defer='defer';s.charset='utf-8';s.src=\"//jsc.mgid.com/a/d/addic7ed.com.13385.js?t=\"+D.getYear()+D.getMonth()+D.getDate()+D.getHours();c[ac](s);})();\n
\ </script>\n
\ </div>\n
\ <!--
MarketGidComposite End -->\n<script type=\"text/javascript\" src=\"//eclkspsa.com/adServe/banners?tid=ADTPOP&tagid=2\"></script>\n</center><br
/>\n\n<div id=\"container\"> \n \t<table class=\"tabel70\" border=\"0\">\n
\ \t<tr> <!-- table header -->\n \t<td class=\"tablecorner\"><img
src=\"http://www.addic7ed.com/images/tl.gif\" /></td>\n <td></td>\n
\ <td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/tr.gif\"
/></td>\n </tr>\n <tr>\n \t<td></td>\n <td>\n<form
action=\"/search.php\" method=\"get\">\n<div align=\"center\">\n<input name=\"search\"
type=\"text\" id=\"search\" size=\"50\" value=\"The Big Bang Theory\" class=\"inputCool\"/>&nbsp;\n
<input name=\"Submit\" type=\"submit\" class=\"coolBoton\" value=\"Search\"
/></form><br />\n\n<b>187 results found</b> </div><br />\n\n<br />\n\t<center>\n\n</center>\n<br
/>\n<center>&nbsp;&nbsp;<img src=\"http://www.addic7ed.com/images/database.png\"
/> <span class=\"titulo\">\nAre you looking for <a href=\"/show/126\" >Show
<i>The Big Bang Theory</i></a>&nbsp;?</span></center><br /><br />\n\n<table
class=\"tabel\" align=\"center\" width=\"80%\" border=\"0\">\n<tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/0/Unaired_Pilot\"
debug=\"27979\">The Big Bang Theory - 01x00 - Unaired Pilot</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/1/Pilot\"
debug=\"2354\">The Big Bang Theory - 01x01 - Pilot</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/2/The_big_bran_hypothesis\"
debug=\"2420\">The Big Bang Theory - 01x02 - The big bran hypothesis</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/3/The_fuzzy_boots_collorary\"
debug=\"2563\">The Big Bang Theory - 01x03 - The fuzzy boots collorary</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/4/The_luminous_fish_effect\"
debug=\"2795\">The Big Bang Theory - 01x04 - The luminous fish effect</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/5/The_hamburger_postulate\"
debug=\"2937\">The Big Bang Theory - 01x05 - The hamburger postulate</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/6/The_middle_earth_paradigm\"
debug=\"3025\">The Big Bang Theory - 01x06 - The middle earth paradigm</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/7/The_dumpling_paradox\"
debug=\"3161\">The Big Bang Theory - 01x07 - The dumpling paradox</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/8/The_grasshopper_experiment\"
debug=\"3365\">The Big Bang Theory - 01x08 - The grasshopper experiment</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/9/The_Cooper_Hofstadter_polarization\"
debug=\"7863\">The Big Bang Theory - 01x09 - The Cooper Hofstadter polarization</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/10/The_Loobenfeld_decay\"
debug=\"7943\">The Big Bang Theory - 01x10 - The Loobenfeld decay</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/11/The_pancake_batter_anomaly\"
debug=\"8069\">The Big Bang Theory - 01x11 - The pancake batter anomaly</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/12/The_Jerusalem_duality\"
debug=\"8415\">The Big Bang Theory - 01x12 - The Jerusalem duality</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/13/The_Bat_Jar_Conjceture\"
debug=\"8561\">The Big Bang Theory - 01x13 - The Bat Jar Conjceture</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/14/The_Nerdvana_Annihilation\"
debug=\"8672\">The Big Bang Theory - 01x14 - The Nerdvana Annihilation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/15/The_Shiksa_Indeterminacy\"
debug=\"8792\">The Big Bang Theory - 01x15 - The Shiksa Indeterminacy</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/16/The_Peanut_Reaction\"
debug=\"8979\">The Big Bang Theory - 01x16 - The Peanut Reaction</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/17/The_Tangerine_Factor\"
debug=\"11375\">The Big Bang Theory - 01x17 - The Tangerine Factor</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/1/The_Bad_Fish_Paradigm\"
debug=\"9593\">The Big Bang Theory - 02x01 - The Bad Fish Paradigm</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/2/The_Codpiece_Topology\"
debug=\"9596\">The Big Bang Theory - 02x02 - The Codpiece Topology</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/3/The_Barbarian_Sublimation\"
debug=\"10093\">The Big Bang Theory - 02x03 - The Barbarian Sublimation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/4/The_Griffin_Equivalency\"
debug=\"10094\">The Big Bang Theory - 02x04 - The Griffin Equivalency</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/5/The_Euclid_Alternative\"
debug=\"10095\">The Big Bang Theory - 02x05 - The Euclid Alternative</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/6/The_Cooper-Nowitzki_Theorem\"
debug=\"10096\">The Big Bang Theory - 02x06 - The Cooper-Nowitzki Theorem</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/7/The_Panty_Pi%C3%B1ata_Polarization\"
debug=\"9600\">The Big Bang Theory - 02x07 - The Panty Pi\xF1ata Polarization</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/8/The_Lizard-Spock_Expansion\"
debug=\"10099\">The Big Bang Theory - 02x08 - The Lizard-Spock Expansion</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/9/The_White_Asparagus_Triangulation\"
debug=\"9602\">The Big Bang Theory - 02x09 - The White Asparagus Triangulation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/10/The_Vartabedian_Conundrum\"
debug=\"9605\">The Big Bang Theory - 02x10 - The Vartabedian Conundrum</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/11/The_Bath_Item_Gift_Hypothesis\"
debug=\"9608\">The Big Bang Theory - 02x11 - The Bath Item Gift Hypothesis</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/12/The_Killer_Robot_Instability\"
debug=\"10100\">The Big Bang Theory - 02x12 - The Killer Robot Instability</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/13/The_Friendship_Algorithm\"
debug=\"10102\">The Big Bang Theory - 02x13 - The Friendship Algorithm</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/14/The_Financial_Permeability\"
debug=\"10552\">The Big Bang Theory - 02x14 - The Financial Permeability</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/15/The_Maternal_Capacitance\"
debug=\"10631\">The Big Bang Theory - 02x15 - The Maternal Capacitance</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/16/The_Cushion_Saturation\"
debug=\"11144\">The Big Bang Theory - 02x16 - The Cushion Saturation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/17/The_Terminator_Decoupling\"
debug=\"11339\">The Big Bang Theory - 02x17 - The Terminator Decoupling</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/18/The_Work_Song_Nanocluster\"
debug=\"11418\">The Big Bang Theory - 02x18 - The Work Song Nanocluster</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/19/The_Dead_Hooker_Juxtaposition\"
debug=\"11809\">The Big Bang Theory - 02x19 - The Dead Hooker Juxtaposition</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/20/The_Hofstadter_Isotope\"
debug=\"11989\">The Big Bang Theory - 02x20 - The Hofstadter Isotope</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/21/The_Vegas_Renormalization\"
debug=\"12156\">The Big Bang Theory - 02x21 - The Vegas Renormalization</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/22/The_Classified_Materials_Turbulence\"
debug=\"12320\">The Big Bang Theory - 02x22 - The Classified Materials Turbulence</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/23/The_Monopolar_Expedition\"
debug=\"12769\">The Big Bang Theory - 02x23 - The Monopolar Expedition</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/1/The_Electric_Can_Opener_Fluctuation\"
debug=\"20679\">The Big Bang Theory - 03x01 - The Electric Can Opener Fluctuation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/2/The_Jiminy_Conjecture\"
debug=\"20792\">The Big Bang Theory - 03x02 - The Jiminy Conjecture</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/3/The_Gothowitz_Deviation\"
debug=\"21229\">The Big Bang Theory - 03x03 - The Gothowitz Deviation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/4/The_Pirate_Solution\"
debug=\"21404\">The Big Bang Theory - 03x04 - The Pirate Solution</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/5/The_Creepy_Candy_Coating_Corollary\"
debug=\"22031\">The Big Bang Theory - 03x05 - The Creepy Candy Coating Corollary</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/6/The_Cornhusker_Vortex\"
debug=\"22315\">The Big Bang Theory - 03x06 - The Cornhusker Vortex</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/7/The_Guitarist_Amplification\"
debug=\"22479\">The Big Bang Theory - 03x07 - The Guitarist Amplification</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/8/The_Adhesive_Duck_Deficiency\"
debug=\"22733\">The Big Bang Theory - 03x08 - The Adhesive Duck Deficiency</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/9/The_Vengeance_Formulation\"
debug=\"23240\">The Big Bang Theory - 03x09 - The Vengeance Formulation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/10/The_Gorilla_Experiment\"
debug=\"23507\">The Big Bang Theory - 03x10 - The Gorilla Experiment</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/11/The_Maternal_Congruence\"
debug=\"23645\">The Big Bang Theory - 03x11 - The Maternal Congruence</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/12/The_Psychic_Vortex\"
debug=\"23974\">The Big Bang Theory - 03x12 - The Psychic Vortex</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/13/The_Bozeman_Reaction\"
debug=\"24082\">The Big Bang Theory - 03x13 - The Bozeman Reaction</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/14/The_Einstein_Approximation\"
debug=\"24334\">The Big Bang Theory - 03x14 - The Einstein Approximation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/15/The_Large_Hadron_Collision\"
debug=\"24335\">The Big Bang Theory - 03x15 - The Large Hadron Collision</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/16/The_Excelsior_Acquisition\"
debug=\"24337\">The Big Bang Theory - 03x16 - The Excelsior Acquisition</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/17/The_Precious_Fragmentation\"
debug=\"24352\">The Big Bang Theory - 03x17 - The Precious Fragmentation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/18/The_Pants_Alternative\"
debug=\"24339\">The Big Bang Theory - 03x18 - The Pants Alternative</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/19/The_Wheaton_Recurrence\"
debug=\"25230\">The Big Bang Theory - 03x19 - The Wheaton Recurrence</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/20/The_Spaghetti_Catalyst\"
debug=\"26996\">The Big Bang Theory - 03x20 - The Spaghetti Catalyst</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/21/The_Plimpton_Stimulation\"
debug=\"27303\">The Big Bang Theory - 03x21 - The Plimpton Stimulation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/22/The_Staircase_Implementation\"
debug=\"27531\">The Big Bang Theory - 03x22 - The Staircase Implementation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/23/The_Lunar_Excitation\"
debug=\"27712\">The Big Bang Theory - 03x23 - The Lunar Excitation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/1/The_Robotic_Manipulation\"
debug=\"32678\">The Big Bang Theory - 04x01 - The Robotic Manipulation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/2/The_Cruciferous_Vegetable_Amplification\"
debug=\"33395\">The Big Bang Theory - 04x02 - The Cruciferous Vegetable Amplification</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/3/The_Zazzy_Substitution\"
debug=\"33712\">The Big Bang Theory - 04x03 - The Zazzy Substitution</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/4/The_Hot_Troll_Deviation\"
debug=\"33944\">The Big Bang Theory - 04x04 - The Hot Troll Deviation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/5/The_Desperation_Emanation\"
debug=\"34325\">The Big Bang Theory - 04x05 - The Desperation Emanation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/6/The_Irish_Pub_Formulation\"
debug=\"34542\">The Big Bang Theory - 04x06 - The Irish Pub Formulation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/7/The_Apology_Insufficiency\"
debug=\"34799\">The Big Bang Theory - 04x07 - The Apology Insufficiency</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/8/The_21_Second_Excitation\"
debug=\"35076\">The Big Bang Theory - 04x08 - The 21 Second Excitation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/9/The_Boyfriend_Complexity\"
debug=\"35418\">The Big Bang Theory - 04x09 - The Boyfriend Complexity</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/10/The_Alien_Parasite_Hypothesis\"
debug=\"36421\">The Big Bang Theory - 04x10 - The Alien Parasite Hypothesis</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/11/The_Justice_League_Recombination\"
debug=\"36591\">The Big Bang Theory - 04x11 - The Justice League Recombination</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/12/The_Bus_Pants_Utilization\"
debug=\"37789\">The Big Bang Theory - 04x12 - The Bus Pants Utilization</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/13/The_Love_Car_Displacement\"
debug=\"38686\">The Big Bang Theory - 04x13 - The Love Car Displacement</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/14/The_Thespian_Catalyst\"
debug=\"39279\">The Big Bang Theory - 04x14 - The Thespian Catalyst</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/15/The_Benefactor_Factor\"
debug=\"39696\">The Big Bang Theory - 04x15 - The Benefactor Factor</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/16/The_Cohabitation_Formulation\"
debug=\"40060\">The Big Bang Theory - 04x16 - The Cohabitation Formulation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/17/The_Toast_Derivation\"
debug=\"40369\">The Big Bang Theory - 04x17 - The Toast Derivation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/17/The_toast_derivation\"
debug=\"70619\">The Big Bang Theory - 04x17 - The toast derivation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/18/The_Prestidigitation_Approximation\"
debug=\"41307\">The Big Bang Theory - 04x18 - The Prestidigitation Approximation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/19/The_Zarnecki_Incursion\"
debug=\"42144\">The Big Bang Theory - 04x19 - The Zarnecki Incursion</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/20/The_Herb_Garden_Germination\"
debug=\"42506\">The Big Bang Theory - 04x20 - The Herb Garden Germination</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/21/The_Agreement_Dissection\"
debug=\"43453\">The Big Bang Theory - 04x21 - The Agreement Dissection</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/22/The_Wildebeest_Implementation\"
debug=\"43963\">The Big Bang Theory - 04x22 - The Wildebeest Implementation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/23/The_Engagement_Reaction\"
debug=\"44298\">The Big Bang Theory - 04x23 - The Engagement Reaction</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/24/The_Roommate_Transmogrification\"
debug=\"45211\">The Big Bang Theory - 04x24 - The Roommate Transmogrification</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/99/It_All_Started_With_A_Big_Bang\"
debug=\"61471\">The Big Bang Theory - 04x99 - It All Started With A Big Bang</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/0/Access_All_Areas\"
debug=\"61470\">The Big Bang Theory - 05x00 - Access All Areas</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/1/The_Skank_Reflex_Analysis\"
debug=\"50098\">The Big Bang Theory - 05x01 - The Skank Reflex Analysis</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/2/The_Infestation_Hypothesis\"
debug=\"50100\">The Big Bang Theory - 05x02 - The Infestation Hypothesis</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/3/The_Pulled_Groin_Extrapolation\"
debug=\"50464\">The Big Bang Theory - 05x03 - The Pulled Groin Extrapolation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/4/The_Wiggly_Finger_Catalyst\"
debug=\"50787\">The Big Bang Theory - 05x04 - The Wiggly Finger Catalyst</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/5/The_Russian_Rocket_Reaction\"
debug=\"51286\">The Big Bang Theory - 05x05 - The Russian Rocket Reaction</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/6/The_Rhinitis_Revelation\"
debug=\"52502\">The Big Bang Theory - 05x06 - The Rhinitis Revelation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/7/The_Good_Guy_Fluctuation\"
debug=\"53602\">The Big Bang Theory - 05x07 - The Good Guy Fluctuation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/8/The_Isolation_Permutation\"
debug=\"54479\">The Big Bang Theory - 05x08 - The Isolation Permutation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/9/The_Ornithophobia_Diffusion\"
debug=\"54953\">The Big Bang Theory - 05x09 - The Ornithophobia Diffusion</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/10/The_Flaming_Spittoon_Acquisition\"
debug=\"55214\">The Big Bang Theory - 05x10 - The Flaming Spittoon Acquisition</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/11/The_Speckerman_Recurrence\"
debug=\"56382\">The Big Bang Theory - 05x11 - The Speckerman Recurrence</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/12/The_Shiny_Trinket_Maneuver\"
debug=\"58784\">The Big Bang Theory - 05x12 - The Shiny Trinket Maneuver</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/13/The_Recombination_Hypothesis\"
debug=\"59003\">The Big Bang Theory - 05x13 - The Recombination Hypothesis</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/14/The_Beta_Test_Initiation\"
debug=\"59196\">The Big Bang Theory - 05x14 - The Beta Test Initiation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/15/The_Friendship_Contraction\"
debug=\"59388\">The Big Bang Theory - 05x15 - The Friendship Contraction</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/16/The_Vacation_Solution\"
debug=\"59650\">The Big Bang Theory - 05x16 - The Vacation Solution</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/17/The_Rothman_Disintegration\"
debug=\"59867\">The Big Bang Theory - 05x17 - The Rothman Disintegration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/18/The_Werewolf_Transformation\"
debug=\"60147\">The Big Bang Theory - 05x18 - The Werewolf Transformation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/19/The_Weekend_Vortex\"
debug=\"60580\">The Big Bang Theory - 05x19 - The Weekend Vortex</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/20/The_Transporter_Malfunction\"
debug=\"61153\">The Big Bang Theory - 05x20 - The Transporter Malfunction</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/21/The_Hawking_Excitation\"
debug=\"61378\">The Big Bang Theory - 05x21 - The Hawking Excitation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/22/The_Stag_Convergence\"
debug=\"61967\">The Big Bang Theory - 05x22 - The Stag Convergence</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/23/The_Launch_Acceleration\"
debug=\"62208\">The Big Bang Theory - 05x23 - The Launch Acceleration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/24/The_Countdown_Reflection\"
debug=\"62389\">The Big Bang Theory - 05x24 - The Countdown Reflection</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/1/The_Date_Night_Variable\"
debug=\"67050\">The Big Bang Theory - 06x01 - The Date Night Variable</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/2/The_Decoupling_Fluctuation\"
debug=\"67274\">The Big Bang Theory - 06x02 - The Decoupling Fluctuation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/3/The_Higgs_Boson_Observation\"
debug=\"67718\">The Big Bang Theory - 06x03 - The Higgs Boson Observation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/4/The_Re_Entry_Minimization\"
debug=\"67942\">The Big Bang Theory - 06x04 - The Re Entry Minimization</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/5/The_Holographic_Excitation\"
debug=\"68166\">The Big Bang Theory - 06x05 - The Holographic Excitation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/6/The_Extract_Obliteration\"
debug=\"68409\">The Big Bang Theory - 06x06 - The Extract Obliteration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/7/The_Habitation_Configuration\"
debug=\"68645\">The Big Bang Theory - 06x07 - The Habitation Configuration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/8/The_43_Peculiarity\"
debug=\"68891\">The Big Bang Theory - 06x08 - The 43 Peculiarity</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/9/The_Parking_Spot_Escalation\"
debug=\"69291\">The Big Bang Theory - 06x09 - The Parking Spot Escalation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/10/The_Fish_Guts_Displacement\"
debug=\"69486\">The Big Bang Theory - 06x10 - The Fish Guts Displacement</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/11/The_Santa_Simulation\"
debug=\"69725\">The Big Bang Theory - 06x11 - The Santa Simulation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/12/The_Egg_Salad_Equivalency\"
debug=\"70156\">The Big Bang Theory - 06x12 - The Egg Salad Equivalency</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/13/The_Bakersfield_Expedition\"
debug=\"70438\">The Big Bang Theory - 06x13 - The Bakersfield Expedition</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/14/The_Cooper_Kripke_Inversion\"
debug=\"71175\">The Big Bang Theory - 06x14 - The Cooper Kripke Inversion</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/15/The_Spoiler_Alert_Segmentation\"
debug=\"71445\">The Big Bang Theory - 06x15 - The Spoiler Alert Segmentation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/16/The_Tangible_Affection_Proof\"
debug=\"71783\">The Big Bang Theory - 06x16 - The Tangible Affection Proof</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/17/The_Monster_Isolation\"
debug=\"72089\">The Big Bang Theory - 06x17 - The Monster Isolation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/18/The_Contractual_Obligation_Implementation\"
debug=\"72726\">The Big Bang Theory - 06x18 - The Contractual Obligation Implementation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/19/The_Closet_Reconfiguration\"
debug=\"73084\">The Big Bang Theory - 06x19 - The Closet Reconfiguration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/20/The_Tenure_Turbulence\"
debug=\"73969\">The Big Bang Theory - 06x20 - The Tenure Turbulence</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/21/The_Closure_Alternative\"
debug=\"74818\">The Big Bang Theory - 06x21 - The Closure Alternative</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/22/The_Proton_Resurgence\"
debug=\"75066\">The Big Bang Theory - 06x22 - The Proton Resurgence</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/23/The_Love_Spell_Potential\"
debug=\"75335\">The Big Bang Theory - 06x23 - The Love Spell Potential</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/24/The_Bon_Voyage_Reaction\"
debug=\"75567\">The Big Bang Theory - 06x24 - The Bon Voyage Reaction</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/1/The_Hofstadter_Insufficiency\"
debug=\"79523\">The Big Bang Theory - 07x01 - The Hofstadter Insufficiency</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/2/The_Deception_Verification\"
debug=\"79524\">The Big Bang Theory - 07x02 - The Deception Verification</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/3/The_Scavenger_Vortex\"
debug=\"79722\">The Big Bang Theory - 07x03 - The Scavenger Vortex</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/4/The_Raiders_Minimization\"
debug=\"80031\">The Big Bang Theory - 07x04 - The Raiders Minimization</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/5/The_Workplace_Proximity\"
debug=\"80254\">The Big Bang Theory - 07x05 - The Workplace Proximity</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/6/The_Romance_Resonance\"
debug=\"80518\">The Big Bang Theory - 07x06 - The Romance Resonance</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/7/The_Proton_Displacement\"
debug=\"81067\">The Big Bang Theory - 07x07 - The Proton Displacement</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/8/The_Itchy_Brain_Simulation\"
debug=\"81272\">The Big Bang Theory - 07x08 - The Itchy Brain Simulation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/9/The_Thanksgiving_Decoupling\"
debug=\"81525\">The Big Bang Theory - 07x09 - The Thanksgiving Decoupling</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/10/The_Discovery_Dissipation\"
debug=\"82096\">The Big Bang Theory - 07x10 - The Discovery Dissipation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/11/The_Cooper_Extraction\"
debug=\"82274\">The Big Bang Theory - 07x11 - The Cooper Extraction</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/12/The_Hesitation_Ramification\"
debug=\"82674\">The Big Bang Theory - 07x12 - The Hesitation Ramification</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/13/The_Occupation_Recalibration\"
debug=\"82916\">The Big Bang Theory - 07x13 - The Occupation Recalibration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/14/The_Convention_Conundrum\"
debug=\"83752\">The Big Bang Theory - 07x14 - The Convention Conundrum</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/15/The_Locomotive_Manipulation\"
debug=\"83978\">The Big Bang Theory - 07x15 - The Locomotive Manipulation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/16/The_Table_Polarization\"
debug=\"84736\">The Big Bang Theory - 07x16 - The Table Polarization</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/17/The_Friendship_Turbulence\"
debug=\"85106\">The Big Bang Theory - 07x17 - The Friendship Turbulence</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/18/The_Mommy_Observation\"
debug=\"85542\">The Big Bang Theory - 07x18 - The Mommy Observation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/19/The_Indecision_Amalgamation\"
debug=\"86494\">The Big Bang Theory - 07x19 - The Indecision Amalgamation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/20/The_Relationship_Diremption\"
debug=\"86744\">The Big Bang Theory - 07x20 - The Relationship Diremption</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/21/The_Anything_Can_Happen_Recurrence\"
debug=\"87403\">The Big Bang Theory - 07x21 - The Anything Can Happen Recurrence</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/22/The_Proton_Transmogrification\"
debug=\"87725\">The Big Bang Theory - 07x22 - The Proton Transmogrification</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/23/The_Gorilla_Dissolution\"
debug=\"87935\">The Big Bang Theory - 07x23 - The Gorilla Dissolution</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/24/The_Status_Quo_Combustion\"
debug=\"88184\">The Big Bang Theory - 07x24 - The Status Quo Combustion</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/1/The_Locomotion_Interruption\"
debug=\"92140\">The Big Bang Theory - 08x01 - The Locomotion Interruption</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/2/The_Junior_Professor_Solution\"
debug=\"92142\">The Big Bang Theory - 08x02 - The Junior Professor Solution</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/3/The_First_Pitch_Insufficiency\"
debug=\"92307\">The Big Bang Theory - 08x03 - The First Pitch Insufficiency</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/4/The_Hook-up_Reverberation\"
debug=\"92545\">The Big Bang Theory - 08x04 - The Hook-up Reverberation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/5/The_Focus_Attenuation\"
debug=\"92757\">The Big Bang Theory - 08x05 - The Focus Attenuation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/6/The_Expedition_Approximation\"
debug=\"93043\">The Big Bang Theory - 08x06 - The Expedition Approximation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/7/The_Misinterpretation_Agitation\"
debug=\"93361\">The Big Bang Theory - 08x07 - The Misinterpretation Agitation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/8/The_Prom_Equivalency\"
debug=\"93612\">The Big Bang Theory - 08x08 - The Prom Equivalency</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/9/The_Septum_Deviation\"
debug=\"93873\">The Big Bang Theory - 08x09 - The Septum Deviation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/10/The_Champagne_Reflection\"
debug=\"94116\">The Big Bang Theory - 08x10 - The Champagne Reflection</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/11/The_Clean_Room_Infiltration\"
debug=\"94911\">The Big Bang Theory - 08x11 - The Clean Room Infiltration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/12/The_Space_Probe_Disintegration\"
debug=\"95594\">The Big Bang Theory - 08x12 - The Space Probe Disintegration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/13/The_Anxiety_Optimization\"
debug=\"96388\">The Big Bang Theory - 08x13 - The Anxiety Optimization</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/14/The_Troll_Manifestation\"
debug=\"96654\">The Big Bang Theory - 08x14 - The Troll Manifestation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/15/The_Comic_Book_Store_Regeneration\"
debug=\"97289\">The Big Bang Theory - 08x15 - The Comic Book Store Regeneration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/16/The_Intimacy_Acceleration\"
debug=\"97610\">The Big Bang Theory - 08x16 - The Intimacy Acceleration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/17/The_Colonization_Application\"
debug=\"97863\">The Big Bang Theory - 08x17 - The Colonization Application</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/18/The_Leftover_Thermalization\"
debug=\"98196\">The Big Bang Theory - 08x18 - The Leftover Thermalization</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/19/The_Skywalker_Incursion\"
debug=\"99011\">The Big Bang Theory - 08x19 - The Skywalker Incursion</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/20/The_Fortification_Implementation\"
debug=\"99310\">The Big Bang Theory - 08x20 - The Fortification Implementation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/21/The_Communication_Deterioration\"
debug=\"99595\">The Big Bang Theory - 08x21 - The Communication Deterioration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/22/The_Graduation_Transmission\"
debug=\"99816\">The Big Bang Theory - 08x22 - The Graduation Transmission</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/23/The_Maternal_Combustion\"
debug=\"100083\">The Big Bang Theory - 08x23 - The Maternal Combustion</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/24/The_Commitment_Determination\"
debug=\"100419\">The Big Bang Theory - 08x24 - The Commitment Determination</a></td></tr><tr><p>\n<p>\n</table>\n</td>\n
\ <td></td>\n </tr>\n <tr> <!-- table
footer -->\n \t<td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/bl.gif\"
/></td>\n <td></td>\n <td class=\"tablecorner\"><img
src=\"http://www.addic7ed.com/images/br.gif\" /></td>\n </tr>\n
\ </table>\n </div>\n<iframe src=\"//s.ato.mx/p.html#id=7869&size=728x90\"
width=\"728\" height=\"90\" frameborder=\"0\" scrolling=\"no\" marginwidth=\"0\"
marginheight=\"0\"></iframe>\n\n\n<center><table border=\"0\" width=\"90%\">\n<tr>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Addic7ed</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\"
src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\"
alt=\" \" />Popular Shows</td>\n<td class=\"NewsTitle\"><img width=\"20\"
height=\"20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\"
/><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Useful</td>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Forums</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/shows.php\">Browse
By Shows</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/4906\">12
Monkeys</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/shows-schedule\">TV
Shows Schedule</a></div></td>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/1031-changelog/\">Site
Changelog</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/movie-subtitles\">Browse
By Movies</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/1812\">Homeland</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/2784-frequently-asked-questions/\">Frequently
Asked Questions</a></div></td>\n<td><div id=\"footermenu\">Support Us</div></td>\n</tr>\n<tr>\n<td><div
id=\"footermenu\"><a href=\"/top-uploaders\">Top Uploaders</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/620\">Modern Family</a></div></td>\n<td><div
id=\"footermenu\">RSS Feeds</div></td>\n<td><div id=\"footermenu\">Premium
Accounts</div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/log.php?mode=downloaded\">Top
Downloads</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/466\">Glee</a></div></td>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\"/>Tutorials</td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/thread-6-1-1.html\">Video
Formats</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/log.php?mode=news\">All
News</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/450\">Parks
and Recreation</a></div></td>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/338-guide-to-syncing-with-subtitleedit/page__p__1485__hl__%2B+%2Bsync__fromsearch__1#entry1485\">How
to Synchronize Subtitles</a></div></td>\n<td><div id=\"footermenu\">Frequently
Asked Questions</div></td>\n</tr> \n<tr>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net\">Sub-Talk
Forums</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/1277\">Shameless
(US)</a></div></td>\n<td><div id=\"footermenu\">What Are Subtitles</div></td>\n<td><div
id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=7\">TV Shows
Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/latest_comments.php\">Latest
Comments</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/126\">The
Big Bang Theory</a></div></td>\n<td><div id=\"footermenu\">New Translation
Tutorial</div></td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=22\">Movies
Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"http://www.vreaubagaj.ro/troler/\"
title=\"Trolere ieftine\" alt=\"Trolere ieftine\">Troler ieftin</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/130\">Family Guy</a></div></td>\n<td><div
id=\"footermenu\">Upload a New Subtitle Tutorial</div></td>\n<td class=\"NewsTitle\"><img
width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Stats</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\">Terms of Service</div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/1799\">American Horror Story</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"http://sub-talk.net/viewthread.php?tid=294\">How
to have an Avatar</a></div></td>\n<td align=\"left\">.\n\t\t\t\t</td>\n</tr>\n<tr>\n<td><div
id=\"footermenu\"><a href=\"/contact.php\">Contact</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/15\">House</a></div></td>\n<td><div id=\"footermenu\"><a
href=\"http://www.vreaubagaj.ro/\" alt=\"Trolere\" title=\"Trolere\">Trolere</a></div></td>\n<td>\n</td>\n</tr>\n</table></center>\n</center>\n\n<script
type=\"text/javascript\">\nvar gaJsHost = ((\"https:\" == document.location.protocol)
? \"https://ssl.\" : \"http://www.\");\ndocument.write(unescape(\"%3Cscript
src='\" + gaJsHost + \"google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E\"));\n</script>\n<script
type=\"text/javascript\">\ntry {\nvar pageTracker = _gat._getTracker(\"UA-10775680-1\");\npageTracker._trackPageview();\n}
catch(err) {}</script>\n\n\n<script type=\"text/javascript\" src=\"http://apis.google.com/js/plusone.js\"></script>\n
\ \n</body></html>\n"}
headers:
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Connection: [keep-alive]
Content-Type: [text/html]
Date: ['Sat, 04 Jul 2015 17:11:36 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [nginx]
Set-Cookie: [PHPSESSID=j0e42neln9hhc3oi0um9k4mkr6; path=/]
X-Powered-By: [PHP/5.3.3]
status: {code: 200, message: OK}
version: 1
@@ -0,0 +1,153 @@
interactions:
- request:
body: null
headers:
User-Agent: [Subliminal/0.8.0]
method: GET
uri: http://www.addic7ed.com/search.php?Submit=Search&search=The+Big+How+I+Met+Your+Mother
response:
body: {string: "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta
http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n<title>\nSearch
\"The Big How I Met Your Mother\" Subtitle Download - Addic7ed.com - For all
those TV Series Addic7s: Subtitles, Tv Series and Movies Talk, Forum and more
-</title>\n<link href=\"http://www.addic7ed.com/css/wikisubtitles.css\" rel=\"stylesheet\"
title=\"default\" type=\"text/css\" />\n<link rel=\"SHORTCUT ICON\" href=\"favicon.ico\"
/> \n<script type=\"text/javascript\" src=\"http://www.addic7ed.com/js/mootools.v1.11.js\"></script>\n\n</head>\n<body>\n<center><br
/>\n<table border=\"0\">\n<tr>\n <td rowspan=\"9\"><a href=\"/\"><img height=\"200\"
width=\"350\" src=\"http://www.addic7ed.com/images/addic7edheader.jpg\" border=\"0\"
\ title=\"Addic7ed.com - Quality Subtitles for TV Shows and movies\" alt=\"Addic7ed.com
- Quality Subtitles for TV Shows and movies\" /></a></td>\n</tr>\n<tr><td
align=\"center\" colspan=\"2\">\n<h1><small>Download free subtitles for TV
Shows and Movies.</small>&nbsp; \n<select name=\"applang\" class=\"inputCool\"
onchange=\"changeAppLang();\" id=\"comboLang\"><option value=\"ar\">Arabic</option><option
value=\"ca\">Catala</option><option selected=\"selected\" value=\"en\">English</option><option
value=\"eu\">Euskera</option><option value=\"fr\">French</option><option value=\"ga\">Galician</option><option
value=\"de\">German</option><option value=\"gr\">Greek</option><option value=\"hu\">Hungarian</option><option
value=\"it\">Italian</option><option value=\"fa\">Persian</option><option
value=\"pl\">Polish</option><option value=\"pt\">Portuguese</option><option
value=\"br\">Portuguese (Brazilian)</option><option value=\"ro\">Romanian</option><option
value=\"ru\">Russian</option><option value=\"es\">Spanish</option><option
value=\"se\">Swedish</option></select></h1>\n</td></tr>\n<tr><td align=\"center\"
colspan=\"2\">\n<div id=\"hBar\">\n\t\t\t <ul>\n\t\t\t\t<li><a class=\"button
white\" href=\"/newaccount.php\">Signup</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/login.php\">Login</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/shows.php\">Shows</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/allshows/a\">Air dates</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"http://www.sub-talk.net\">Forum</a></li>\n\t\t\t </ul>\n\t\t\t
\ </div>\n</td></tr> \n<tr>\n <td>\n</td><td>\n\t<g:plusone size=\"medium\"></g:plusone>\n
\ <a href=\"http://twitter.com/addic7ed\" target=\"_blank\"><img width=\"32\"
height=\"32\" src=\"http://www.addic7ed.com/images/twitter_right.png\" alt=\"Twitter\"
border=\"0\" /></a>\n\t<a href=\"irc://irc.efnet.net:6667/addic7ed\"><img
width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/irc-right.png\"
alt=\"IRC\" border=\"0\" /></a>\n<div style=\"float: right; padding-right:10%;\">\n\n
\ </td>\n </tr>\n <tr>\n <td colspan=2><iframe src=\"http://www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FAddic7ed&amp;send=false&amp;layout=button_count&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=tahoma&amp;height=21&amp;appId=121322186712\"
scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden; width:80px;
height:21px;\" allowTransparency=\"true\"></iframe>\n </td>\n </tr>\n</table>\n</center>\n\n<center>\n\n<!--[if
lt IE 7]>\n <style type=\"text/css\">\n div, img { behavior: url(http://www.addic7ed.com/js/iepngfix.htc)
}\n </style>\n<![endif]-->\n<br />\n<center>\n<!-- MarketGidComposite Start
-->\n<div id=\"MarketGidScriptRootC13385\">\n <div id=\"MarketGidPreloadC13385\">\n
\ <a id=\"mg_add13385\" href=\"http://mgid.com/advertisers/?utm_source=widget&utm_medium=text&utm_campaign=add\"
target=\"_blank\">Place your ad here</a><br> <a href=\"http://mgid.com/\"
target=\"_blank\">Loading...</a> \n </div>\n <script>\n
\ window.MGWidgetTitle13385 = \"Promoted
Content\"; (function(){\n var
D=new Date(),d=document,b='body',ce='createElement',ac='appendChild',st='style',ds='display',n='none',gi='getElementById';\n
\ var i=d[ce]('iframe');i[st][ds]=n;d[gi](\"MarketGidScriptRootC13385\")[ac](i);try{var
iw=i.contentWindow.document;iw.open();iw.writeln(\"<ht\"+\"ml><bo\"+\"dy></bo\"+\"dy></ht\"+\"ml>\");iw.close();var
c=iw[b];}\n catch(e){var
iw=d;var c=d[gi](\"MarketGidScriptRootC13385\");}var dv=iw[ce]('div');dv.id=\"MG_ID\";dv[st][ds]=n;dv.innerHTML=13385;c[ac](dv);\n
\ var
s=iw[ce]('script');s.async='async';s.defer='defer';s.charset='utf-8';s.src=\"//jsc.mgid.com/a/d/addic7ed.com.13385.js?t=\"+D.getYear()+D.getMonth()+D.getDate()+D.getHours();c[ac](s);})();\n
\ </script>\n
\ </div>\n
\ <!--
MarketGidComposite End -->\n<script type=\"text/javascript\" src=\"//eclkspsa.com/adServe/banners?tid=ADTPOP&tagid=2\"></script>\n</center><br
/>\n\n<div id=\"container\"> \n \t<table class=\"tabel70\" border=\"0\">\n
\ \t<tr> <!-- table header -->\n \t<td class=\"tablecorner\"><img
src=\"http://www.addic7ed.com/images/tl.gif\" /></td>\n <td></td>\n
\ <td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/tr.gif\"
/></td>\n </tr>\n <tr>\n \t<td></td>\n <td>\n<form
action=\"/search.php\" method=\"get\">\n<div align=\"center\">\n<input name=\"search\"
type=\"text\" id=\"search\" size=\"50\" value=\"The Big How I Met Your Mother\"
class=\"inputCool\"/>&nbsp;\n <input name=\"Submit\" type=\"submit\" class=\"coolBoton\"
value=\"Search\" /></form><br />\n\n<b>1 results found</b> </div><br />\n\n<br
/>\n\t<center>\n\n</center>\n<br />\n\n<table class=\"tabel\" align=\"center\"
width=\"80%\" border=\"0\">\n<tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/The_Big_Bang_Theory/3/3/The_Gothowitz_Deviation\"
debug=\"21229\">The Big Bang Theory - 03x03 - The Gothowitz Deviation</a></td></tr><tr><p>\n<p>\n</table>\n</td>\n
\ <td></td>\n </tr>\n <tr> <!-- table
footer -->\n \t<td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/bl.gif\"
/></td>\n <td></td>\n <td class=\"tablecorner\"><img
src=\"http://www.addic7ed.com/images/br.gif\" /></td>\n </tr>\n
\ </table>\n </div>\n<iframe src=\"//s.ato.mx/p.html#id=7869&size=728x90\"
width=\"728\" height=\"90\" frameborder=\"0\" scrolling=\"no\" marginwidth=\"0\"
marginheight=\"0\"></iframe>\n\n\n<center><table border=\"0\" width=\"90%\">\n<tr>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Addic7ed</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\"
src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\"
alt=\" \" />Popular Shows</td>\n<td class=\"NewsTitle\"><img width=\"20\"
height=\"20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\"
/><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Useful</td>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Forums</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/shows.php\">Browse
By Shows</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/4906\">12
Monkeys</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/shows-schedule\">TV
Shows Schedule</a></div></td>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/1031-changelog/\">Site
Changelog</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/movie-subtitles\">Browse
By Movies</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/1812\">Homeland</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/2784-frequently-asked-questions/\">Frequently
Asked Questions</a></div></td>\n<td><div id=\"footermenu\">Support Us</div></td>\n</tr>\n<tr>\n<td><div
id=\"footermenu\"><a href=\"/top-uploaders\">Top Uploaders</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/620\">Modern Family</a></div></td>\n<td><div
id=\"footermenu\">RSS Feeds</div></td>\n<td><div id=\"footermenu\">Premium
Accounts</div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/log.php?mode=downloaded\">Top
Downloads</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/466\">Glee</a></div></td>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\"/>Tutorials</td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/thread-6-1-1.html\">Video
Formats</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/log.php?mode=news\">All
News</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/450\">Parks
and Recreation</a></div></td>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/338-guide-to-syncing-with-subtitleedit/page__p__1485__hl__%2B+%2Bsync__fromsearch__1#entry1485\">How
to Synchronize Subtitles</a></div></td>\n<td><div id=\"footermenu\">Frequently
Asked Questions</div></td>\n</tr> \n<tr>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net\">Sub-Talk
Forums</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/1277\">Shameless
(US)</a></div></td>\n<td><div id=\"footermenu\">What Are Subtitles</div></td>\n<td><div
id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=7\">TV Shows
Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/latest_comments.php\">Latest
Comments</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/126\">The
Big Bang Theory</a></div></td>\n<td><div id=\"footermenu\">New Translation
Tutorial</div></td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=22\">Movies
Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"http://www.vreaubagaj.ro/troler/\"
title=\"Trolere ieftine\" alt=\"Trolere ieftine\">Troler ieftin</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/130\">Family Guy</a></div></td>\n<td><div
id=\"footermenu\">Upload a New Subtitle Tutorial</div></td>\n<td class=\"NewsTitle\"><img
width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Stats</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\">Terms of Service</div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/1799\">American Horror Story</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"http://sub-talk.net/viewthread.php?tid=294\">How
to have an Avatar</a></div></td>\n<td align=\"left\">.\n\t\t\t\t</td>\n</tr>\n<tr>\n<td><div
id=\"footermenu\"><a href=\"/contact.php\">Contact</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/15\">House</a></div></td>\n<td><div id=\"footermenu\"><a
href=\"http://www.vreaubagaj.ro/\" alt=\"Trolere\" title=\"Trolere\">Trolere</a></div></td>\n<td>\n</td>\n</tr>\n</table></center>\n</center>\n\n<script
type=\"text/javascript\">\nvar gaJsHost = ((\"https:\" == document.location.protocol)
? \"https://ssl.\" : \"http://www.\");\ndocument.write(unescape(\"%3Cscript
src='\" + gaJsHost + \"google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E\"));\n</script>\n<script
type=\"text/javascript\">\ntry {\nvar pageTracker = _gat._getTracker(\"UA-10775680-1\");\npageTracker._trackPageview();\n}
catch(err) {}</script>\n\n\n<script type=\"text/javascript\" src=\"http://apis.google.com/js/plusone.js\"></script>\n
\ \n</body></html>\n"}
headers:
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Connection: [keep-alive]
Content-Type: [text/html]
Date: ['Sat, 04 Jul 2015 17:11:40 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [nginx]
Set-Cookie: [PHPSESSID=2mcc47dmkf0qb4ffmvushb3pl0; path=/]
X-Powered-By: [PHP/5.3.3]
status: {code: 200, message: OK}
version: 1
@@ -0,0 +1,533 @@
interactions:
- request:
body: null
headers:
User-Agent: [Subliminal/0.8.0]
method: GET
uri: http://www.addic7ed.com/search.php?Submit=Search&search=The+Big+Bang
response:
body: {string: "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta
http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n<title>\nSearch
\"The Big Bang\" Subtitle Download - Addic7ed.com - For all those TV Series
Addic7s: Subtitles, Tv Series and Movies Talk, Forum and more -</title>\n<link
href=\"http://www.addic7ed.com/css/wikisubtitles.css\" rel=\"stylesheet\"
title=\"default\" type=\"text/css\" />\n<link rel=\"SHORTCUT ICON\" href=\"favicon.ico\"
/> \n<script type=\"text/javascript\" src=\"http://www.addic7ed.com/js/mootools.v1.11.js\"></script>\n\n</head>\n<body>\n<center><br
/>\n<table border=\"0\">\n<tr>\n <td rowspan=\"9\"><a href=\"/\"><img height=\"200\"
width=\"350\" src=\"http://www.addic7ed.com/images/addic7edheader.jpg\" border=\"0\"
\ title=\"Addic7ed.com - Quality Subtitles for TV Shows and movies\" alt=\"Addic7ed.com
- Quality Subtitles for TV Shows and movies\" /></a></td>\n</tr>\n<tr><td
align=\"center\" colspan=\"2\">\n<h1><small>Download free subtitles for TV
Shows and Movies.</small>&nbsp; \n<select name=\"applang\" class=\"inputCool\"
onchange=\"changeAppLang();\" id=\"comboLang\"><option value=\"ar\">Arabic</option><option
value=\"ca\">Catala</option><option selected=\"selected\" value=\"en\">English</option><option
value=\"eu\">Euskera</option><option value=\"fr\">French</option><option value=\"ga\">Galician</option><option
value=\"de\">German</option><option value=\"gr\">Greek</option><option value=\"hu\">Hungarian</option><option
value=\"it\">Italian</option><option value=\"fa\">Persian</option><option
value=\"pl\">Polish</option><option value=\"pt\">Portuguese</option><option
value=\"br\">Portuguese (Brazilian)</option><option value=\"ro\">Romanian</option><option
value=\"ru\">Russian</option><option value=\"es\">Spanish</option><option
value=\"se\">Swedish</option></select></h1>\n</td></tr>\n<tr><td align=\"center\"
colspan=\"2\">\n<div id=\"hBar\">\n\t\t\t <ul>\n\t\t\t\t<li><a class=\"button
white\" href=\"/newaccount.php\">Signup</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/login.php\">Login</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/shows.php\">Shows</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/allshows/a\">Air dates</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"http://www.sub-talk.net\">Forum</a></li>\n\t\t\t </ul>\n\t\t\t
\ </div>\n</td></tr> \n<tr>\n <td>\n</td><td>\n\t<g:plusone size=\"medium\"></g:plusone>\n
\ <a href=\"http://twitter.com/addic7ed\" target=\"_blank\"><img width=\"32\"
height=\"32\" src=\"http://www.addic7ed.com/images/twitter_right.png\" alt=\"Twitter\"
border=\"0\" /></a>\n\t<a href=\"irc://irc.efnet.net:6667/addic7ed\"><img
width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/irc-right.png\"
alt=\"IRC\" border=\"0\" /></a>\n<div style=\"float: right; padding-right:10%;\">\n\n
\ </td>\n </tr>\n <tr>\n <td colspan=2><iframe src=\"http://www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FAddic7ed&amp;send=false&amp;layout=button_count&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=tahoma&amp;height=21&amp;appId=121322186712\"
scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden; width:80px;
height:21px;\" allowTransparency=\"true\"></iframe>\n </td>\n </tr>\n</table>\n</center>\n\n<center>\n\n<!--[if
lt IE 7]>\n <style type=\"text/css\">\n div, img { behavior: url(http://www.addic7ed.com/js/iepngfix.htc)
}\n </style>\n<![endif]-->\n<br />\n<center>\n<!-- MarketGidComposite Start
-->\n<div id=\"MarketGidScriptRootC13385\">\n <div id=\"MarketGidPreloadC13385\">\n
\ <a id=\"mg_add13385\" href=\"http://mgid.com/advertisers/?utm_source=widget&utm_medium=text&utm_campaign=add\"
target=\"_blank\">Place your ad here</a><br> <a href=\"http://mgid.com/\"
target=\"_blank\">Loading...</a> \n </div>\n <script>\n
\ window.MGWidgetTitle13385 = \"Promoted
Content\"; (function(){\n var
D=new Date(),d=document,b='body',ce='createElement',ac='appendChild',st='style',ds='display',n='none',gi='getElementById';\n
\ var i=d[ce]('iframe');i[st][ds]=n;d[gi](\"MarketGidScriptRootC13385\")[ac](i);try{var
iw=i.contentWindow.document;iw.open();iw.writeln(\"<ht\"+\"ml><bo\"+\"dy></bo\"+\"dy></ht\"+\"ml>\");iw.close();var
c=iw[b];}\n catch(e){var
iw=d;var c=d[gi](\"MarketGidScriptRootC13385\");}var dv=iw[ce]('div');dv.id=\"MG_ID\";dv[st][ds]=n;dv.innerHTML=13385;c[ac](dv);\n
\ var
s=iw[ce]('script');s.async='async';s.defer='defer';s.charset='utf-8';s.src=\"//jsc.mgid.com/a/d/addic7ed.com.13385.js?t=\"+D.getYear()+D.getMonth()+D.getDate()+D.getHours();c[ac](s);})();\n
\ </script>\n
\ </div>\n
\ <!--
MarketGidComposite End -->\n<script type=\"text/javascript\" src=\"//eclkspsa.com/adServe/banners?tid=ADTPOP&tagid=2\"></script>\n</center><br
/>\n\n<div id=\"container\"> \n \t<table class=\"tabel70\" border=\"0\">\n
\ \t<tr> <!-- table header -->\n \t<td class=\"tablecorner\"><img
src=\"http://www.addic7ed.com/images/tl.gif\" /></td>\n <td></td>\n
\ <td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/tr.gif\"
/></td>\n </tr>\n <tr>\n \t<td></td>\n <td>\n<form
action=\"/search.php\" method=\"get\">\n<div align=\"center\">\n<input name=\"search\"
type=\"text\" id=\"search\" size=\"50\" value=\"The Big Bang\" class=\"inputCool\"/>&nbsp;\n
<input name=\"Submit\" type=\"submit\" class=\"coolBoton\" value=\"Search\"
/></form><br />\n\n<b>190 results found</b> </div><br />\n\n<br />\n\t<center>\n\n</center>\n<br
/>\n<center>&nbsp;&nbsp;<img src=\"http://www.addic7ed.com/images/database.png\"
/> <span class=\"titulo\">\nAre you looking for <a href=\"/show/126\" >Show
<i>The Big Bang Theory</i></a>&nbsp;?</span></center><br /><br />\n\n<table
class=\"tabel\" align=\"center\" width=\"80%\" border=\"0\">\n<tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/0/Unaired_Pilot\"
debug=\"27979\">The Big Bang Theory - 01x00 - Unaired Pilot</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/1/Pilot\"
debug=\"2354\">The Big Bang Theory - 01x01 - Pilot</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/2/The_big_bran_hypothesis\"
debug=\"2420\">The Big Bang Theory - 01x02 - The big bran hypothesis</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/3/The_fuzzy_boots_collorary\"
debug=\"2563\">The Big Bang Theory - 01x03 - The fuzzy boots collorary</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/4/The_luminous_fish_effect\"
debug=\"2795\">The Big Bang Theory - 01x04 - The luminous fish effect</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/5/The_hamburger_postulate\"
debug=\"2937\">The Big Bang Theory - 01x05 - The hamburger postulate</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/6/The_middle_earth_paradigm\"
debug=\"3025\">The Big Bang Theory - 01x06 - The middle earth paradigm</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/7/The_dumpling_paradox\"
debug=\"3161\">The Big Bang Theory - 01x07 - The dumpling paradox</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/8/The_grasshopper_experiment\"
debug=\"3365\">The Big Bang Theory - 01x08 - The grasshopper experiment</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/9/The_Cooper_Hofstadter_polarization\"
debug=\"7863\">The Big Bang Theory - 01x09 - The Cooper Hofstadter polarization</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/10/The_Loobenfeld_decay\"
debug=\"7943\">The Big Bang Theory - 01x10 - The Loobenfeld decay</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/11/The_pancake_batter_anomaly\"
debug=\"8069\">The Big Bang Theory - 01x11 - The pancake batter anomaly</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/12/The_Jerusalem_duality\"
debug=\"8415\">The Big Bang Theory - 01x12 - The Jerusalem duality</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/13/The_Bat_Jar_Conjceture\"
debug=\"8561\">The Big Bang Theory - 01x13 - The Bat Jar Conjceture</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/14/The_Nerdvana_Annihilation\"
debug=\"8672\">The Big Bang Theory - 01x14 - The Nerdvana Annihilation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/15/The_Shiksa_Indeterminacy\"
debug=\"8792\">The Big Bang Theory - 01x15 - The Shiksa Indeterminacy</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/16/The_Peanut_Reaction\"
debug=\"8979\">The Big Bang Theory - 01x16 - The Peanut Reaction</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/1/17/The_Tangerine_Factor\"
debug=\"11375\">The Big Bang Theory - 01x17 - The Tangerine Factor</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/1/The_Bad_Fish_Paradigm\"
debug=\"9593\">The Big Bang Theory - 02x01 - The Bad Fish Paradigm</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/2/The_Codpiece_Topology\"
debug=\"9596\">The Big Bang Theory - 02x02 - The Codpiece Topology</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/3/The_Barbarian_Sublimation\"
debug=\"10093\">The Big Bang Theory - 02x03 - The Barbarian Sublimation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/4/The_Griffin_Equivalency\"
debug=\"10094\">The Big Bang Theory - 02x04 - The Griffin Equivalency</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/5/The_Euclid_Alternative\"
debug=\"10095\">The Big Bang Theory - 02x05 - The Euclid Alternative</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/6/The_Cooper-Nowitzki_Theorem\"
debug=\"10096\">The Big Bang Theory - 02x06 - The Cooper-Nowitzki Theorem</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/7/The_Panty_Pi%C3%B1ata_Polarization\"
debug=\"9600\">The Big Bang Theory - 02x07 - The Panty Pi\xF1ata Polarization</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/8/The_Lizard-Spock_Expansion\"
debug=\"10099\">The Big Bang Theory - 02x08 - The Lizard-Spock Expansion</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/9/The_White_Asparagus_Triangulation\"
debug=\"9602\">The Big Bang Theory - 02x09 - The White Asparagus Triangulation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/10/The_Vartabedian_Conundrum\"
debug=\"9605\">The Big Bang Theory - 02x10 - The Vartabedian Conundrum</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/11/The_Bath_Item_Gift_Hypothesis\"
debug=\"9608\">The Big Bang Theory - 02x11 - The Bath Item Gift Hypothesis</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/12/The_Killer_Robot_Instability\"
debug=\"10100\">The Big Bang Theory - 02x12 - The Killer Robot Instability</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/13/The_Friendship_Algorithm\"
debug=\"10102\">The Big Bang Theory - 02x13 - The Friendship Algorithm</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/14/The_Financial_Permeability\"
debug=\"10552\">The Big Bang Theory - 02x14 - The Financial Permeability</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/15/The_Maternal_Capacitance\"
debug=\"10631\">The Big Bang Theory - 02x15 - The Maternal Capacitance</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/16/The_Cushion_Saturation\"
debug=\"11144\">The Big Bang Theory - 02x16 - The Cushion Saturation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/17/The_Terminator_Decoupling\"
debug=\"11339\">The Big Bang Theory - 02x17 - The Terminator Decoupling</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/18/The_Work_Song_Nanocluster\"
debug=\"11418\">The Big Bang Theory - 02x18 - The Work Song Nanocluster</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/19/The_Dead_Hooker_Juxtaposition\"
debug=\"11809\">The Big Bang Theory - 02x19 - The Dead Hooker Juxtaposition</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/20/The_Hofstadter_Isotope\"
debug=\"11989\">The Big Bang Theory - 02x20 - The Hofstadter Isotope</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/21/The_Vegas_Renormalization\"
debug=\"12156\">The Big Bang Theory - 02x21 - The Vegas Renormalization</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/22/The_Classified_Materials_Turbulence\"
debug=\"12320\">The Big Bang Theory - 02x22 - The Classified Materials Turbulence</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/2/23/The_Monopolar_Expedition\"
debug=\"12769\">The Big Bang Theory - 02x23 - The Monopolar Expedition</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/1/The_Electric_Can_Opener_Fluctuation\"
debug=\"20679\">The Big Bang Theory - 03x01 - The Electric Can Opener Fluctuation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/2/The_Jiminy_Conjecture\"
debug=\"20792\">The Big Bang Theory - 03x02 - The Jiminy Conjecture</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/3/The_Gothowitz_Deviation\"
debug=\"21229\">The Big Bang Theory - 03x03 - The Gothowitz Deviation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/4/The_Pirate_Solution\"
debug=\"21404\">The Big Bang Theory - 03x04 - The Pirate Solution</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/5/The_Creepy_Candy_Coating_Corollary\"
debug=\"22031\">The Big Bang Theory - 03x05 - The Creepy Candy Coating Corollary</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/6/The_Cornhusker_Vortex\"
debug=\"22315\">The Big Bang Theory - 03x06 - The Cornhusker Vortex</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/7/The_Guitarist_Amplification\"
debug=\"22479\">The Big Bang Theory - 03x07 - The Guitarist Amplification</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/8/The_Adhesive_Duck_Deficiency\"
debug=\"22733\">The Big Bang Theory - 03x08 - The Adhesive Duck Deficiency</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/9/The_Vengeance_Formulation\"
debug=\"23240\">The Big Bang Theory - 03x09 - The Vengeance Formulation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/10/The_Gorilla_Experiment\"
debug=\"23507\">The Big Bang Theory - 03x10 - The Gorilla Experiment</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/11/The_Maternal_Congruence\"
debug=\"23645\">The Big Bang Theory - 03x11 - The Maternal Congruence</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/12/The_Psychic_Vortex\"
debug=\"23974\">The Big Bang Theory - 03x12 - The Psychic Vortex</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/13/The_Bozeman_Reaction\"
debug=\"24082\">The Big Bang Theory - 03x13 - The Bozeman Reaction</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/14/The_Einstein_Approximation\"
debug=\"24334\">The Big Bang Theory - 03x14 - The Einstein Approximation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/15/The_Large_Hadron_Collision\"
debug=\"24335\">The Big Bang Theory - 03x15 - The Large Hadron Collision</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/16/The_Excelsior_Acquisition\"
debug=\"24337\">The Big Bang Theory - 03x16 - The Excelsior Acquisition</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/17/The_Precious_Fragmentation\"
debug=\"24352\">The Big Bang Theory - 03x17 - The Precious Fragmentation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/18/The_Pants_Alternative\"
debug=\"24339\">The Big Bang Theory - 03x18 - The Pants Alternative</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/19/The_Wheaton_Recurrence\"
debug=\"25230\">The Big Bang Theory - 03x19 - The Wheaton Recurrence</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/20/The_Spaghetti_Catalyst\"
debug=\"26996\">The Big Bang Theory - 03x20 - The Spaghetti Catalyst</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/21/The_Plimpton_Stimulation\"
debug=\"27303\">The Big Bang Theory - 03x21 - The Plimpton Stimulation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/22/The_Staircase_Implementation\"
debug=\"27531\">The Big Bang Theory - 03x22 - The Staircase Implementation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/3/23/The_Lunar_Excitation\"
debug=\"27712\">The Big Bang Theory - 03x23 - The Lunar Excitation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/1/The_Robotic_Manipulation\"
debug=\"32678\">The Big Bang Theory - 04x01 - The Robotic Manipulation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/2/The_Cruciferous_Vegetable_Amplification\"
debug=\"33395\">The Big Bang Theory - 04x02 - The Cruciferous Vegetable Amplification</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/3/The_Zazzy_Substitution\"
debug=\"33712\">The Big Bang Theory - 04x03 - The Zazzy Substitution</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/4/The_Hot_Troll_Deviation\"
debug=\"33944\">The Big Bang Theory - 04x04 - The Hot Troll Deviation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/5/The_Desperation_Emanation\"
debug=\"34325\">The Big Bang Theory - 04x05 - The Desperation Emanation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/6/The_Irish_Pub_Formulation\"
debug=\"34542\">The Big Bang Theory - 04x06 - The Irish Pub Formulation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/7/The_Apology_Insufficiency\"
debug=\"34799\">The Big Bang Theory - 04x07 - The Apology Insufficiency</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/8/The_21_Second_Excitation\"
debug=\"35076\">The Big Bang Theory - 04x08 - The 21 Second Excitation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/9/The_Boyfriend_Complexity\"
debug=\"35418\">The Big Bang Theory - 04x09 - The Boyfriend Complexity</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/10/The_Alien_Parasite_Hypothesis\"
debug=\"36421\">The Big Bang Theory - 04x10 - The Alien Parasite Hypothesis</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/11/The_Justice_League_Recombination\"
debug=\"36591\">The Big Bang Theory - 04x11 - The Justice League Recombination</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/12/The_Bus_Pants_Utilization\"
debug=\"37789\">The Big Bang Theory - 04x12 - The Bus Pants Utilization</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/13/The_Love_Car_Displacement\"
debug=\"38686\">The Big Bang Theory - 04x13 - The Love Car Displacement</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/14/The_Thespian_Catalyst\"
debug=\"39279\">The Big Bang Theory - 04x14 - The Thespian Catalyst</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/15/The_Benefactor_Factor\"
debug=\"39696\">The Big Bang Theory - 04x15 - The Benefactor Factor</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/16/The_Cohabitation_Formulation\"
debug=\"40060\">The Big Bang Theory - 04x16 - The Cohabitation Formulation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/17/The_Toast_Derivation\"
debug=\"40369\">The Big Bang Theory - 04x17 - The Toast Derivation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/17/The_toast_derivation\"
debug=\"70619\">The Big Bang Theory - 04x17 - The toast derivation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/18/The_Prestidigitation_Approximation\"
debug=\"41307\">The Big Bang Theory - 04x18 - The Prestidigitation Approximation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/19/The_Zarnecki_Incursion\"
debug=\"42144\">The Big Bang Theory - 04x19 - The Zarnecki Incursion</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/20/The_Herb_Garden_Germination\"
debug=\"42506\">The Big Bang Theory - 04x20 - The Herb Garden Germination</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/21/The_Agreement_Dissection\"
debug=\"43453\">The Big Bang Theory - 04x21 - The Agreement Dissection</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/22/The_Wildebeest_Implementation\"
debug=\"43963\">The Big Bang Theory - 04x22 - The Wildebeest Implementation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/23/The_Engagement_Reaction\"
debug=\"44298\">The Big Bang Theory - 04x23 - The Engagement Reaction</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/24/The_Roommate_Transmogrification\"
debug=\"45211\">The Big Bang Theory - 04x24 - The Roommate Transmogrification</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/4/99/It_All_Started_With_A_Big_Bang\"
debug=\"61471\">The Big Bang Theory - 04x99 - It All Started With A Big Bang</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/0/Access_All_Areas\"
debug=\"61470\">The Big Bang Theory - 05x00 - Access All Areas</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/1/The_Skank_Reflex_Analysis\"
debug=\"50098\">The Big Bang Theory - 05x01 - The Skank Reflex Analysis</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/2/The_Infestation_Hypothesis\"
debug=\"50100\">The Big Bang Theory - 05x02 - The Infestation Hypothesis</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/3/The_Pulled_Groin_Extrapolation\"
debug=\"50464\">The Big Bang Theory - 05x03 - The Pulled Groin Extrapolation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/4/The_Wiggly_Finger_Catalyst\"
debug=\"50787\">The Big Bang Theory - 05x04 - The Wiggly Finger Catalyst</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/5/The_Russian_Rocket_Reaction\"
debug=\"51286\">The Big Bang Theory - 05x05 - The Russian Rocket Reaction</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/6/The_Rhinitis_Revelation\"
debug=\"52502\">The Big Bang Theory - 05x06 - The Rhinitis Revelation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/7/The_Good_Guy_Fluctuation\"
debug=\"53602\">The Big Bang Theory - 05x07 - The Good Guy Fluctuation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/8/The_Isolation_Permutation\"
debug=\"54479\">The Big Bang Theory - 05x08 - The Isolation Permutation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/9/The_Ornithophobia_Diffusion\"
debug=\"54953\">The Big Bang Theory - 05x09 - The Ornithophobia Diffusion</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/10/The_Flaming_Spittoon_Acquisition\"
debug=\"55214\">The Big Bang Theory - 05x10 - The Flaming Spittoon Acquisition</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/11/The_Speckerman_Recurrence\"
debug=\"56382\">The Big Bang Theory - 05x11 - The Speckerman Recurrence</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/12/The_Shiny_Trinket_Maneuver\"
debug=\"58784\">The Big Bang Theory - 05x12 - The Shiny Trinket Maneuver</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/13/The_Recombination_Hypothesis\"
debug=\"59003\">The Big Bang Theory - 05x13 - The Recombination Hypothesis</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/14/The_Beta_Test_Initiation\"
debug=\"59196\">The Big Bang Theory - 05x14 - The Beta Test Initiation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/15/The_Friendship_Contraction\"
debug=\"59388\">The Big Bang Theory - 05x15 - The Friendship Contraction</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/16/The_Vacation_Solution\"
debug=\"59650\">The Big Bang Theory - 05x16 - The Vacation Solution</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/17/The_Rothman_Disintegration\"
debug=\"59867\">The Big Bang Theory - 05x17 - The Rothman Disintegration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/18/The_Werewolf_Transformation\"
debug=\"60147\">The Big Bang Theory - 05x18 - The Werewolf Transformation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/19/The_Weekend_Vortex\"
debug=\"60580\">The Big Bang Theory - 05x19 - The Weekend Vortex</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/20/The_Transporter_Malfunction\"
debug=\"61153\">The Big Bang Theory - 05x20 - The Transporter Malfunction</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/21/The_Hawking_Excitation\"
debug=\"61378\">The Big Bang Theory - 05x21 - The Hawking Excitation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/22/The_Stag_Convergence\"
debug=\"61967\">The Big Bang Theory - 05x22 - The Stag Convergence</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/23/The_Launch_Acceleration\"
debug=\"62208\">The Big Bang Theory - 05x23 - The Launch Acceleration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/5/24/The_Countdown_Reflection\"
debug=\"62389\">The Big Bang Theory - 05x24 - The Countdown Reflection</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/1/The_Date_Night_Variable\"
debug=\"67050\">The Big Bang Theory - 06x01 - The Date Night Variable</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/2/The_Decoupling_Fluctuation\"
debug=\"67274\">The Big Bang Theory - 06x02 - The Decoupling Fluctuation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/3/The_Higgs_Boson_Observation\"
debug=\"67718\">The Big Bang Theory - 06x03 - The Higgs Boson Observation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/4/The_Re_Entry_Minimization\"
debug=\"67942\">The Big Bang Theory - 06x04 - The Re Entry Minimization</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/5/The_Holographic_Excitation\"
debug=\"68166\">The Big Bang Theory - 06x05 - The Holographic Excitation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/6/The_Extract_Obliteration\"
debug=\"68409\">The Big Bang Theory - 06x06 - The Extract Obliteration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/7/The_Habitation_Configuration\"
debug=\"68645\">The Big Bang Theory - 06x07 - The Habitation Configuration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/8/The_43_Peculiarity\"
debug=\"68891\">The Big Bang Theory - 06x08 - The 43 Peculiarity</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/9/The_Parking_Spot_Escalation\"
debug=\"69291\">The Big Bang Theory - 06x09 - The Parking Spot Escalation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/10/The_Fish_Guts_Displacement\"
debug=\"69486\">The Big Bang Theory - 06x10 - The Fish Guts Displacement</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/11/The_Santa_Simulation\"
debug=\"69725\">The Big Bang Theory - 06x11 - The Santa Simulation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/12/The_Egg_Salad_Equivalency\"
debug=\"70156\">The Big Bang Theory - 06x12 - The Egg Salad Equivalency</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/13/The_Bakersfield_Expedition\"
debug=\"70438\">The Big Bang Theory - 06x13 - The Bakersfield Expedition</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/14/The_Cooper_Kripke_Inversion\"
debug=\"71175\">The Big Bang Theory - 06x14 - The Cooper Kripke Inversion</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/15/The_Spoiler_Alert_Segmentation\"
debug=\"71445\">The Big Bang Theory - 06x15 - The Spoiler Alert Segmentation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/16/The_Tangible_Affection_Proof\"
debug=\"71783\">The Big Bang Theory - 06x16 - The Tangible Affection Proof</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/17/The_Monster_Isolation\"
debug=\"72089\">The Big Bang Theory - 06x17 - The Monster Isolation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/18/The_Contractual_Obligation_Implementation\"
debug=\"72726\">The Big Bang Theory - 06x18 - The Contractual Obligation Implementation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/19/The_Closet_Reconfiguration\"
debug=\"73084\">The Big Bang Theory - 06x19 - The Closet Reconfiguration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/20/The_Tenure_Turbulence\"
debug=\"73969\">The Big Bang Theory - 06x20 - The Tenure Turbulence</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/21/The_Closure_Alternative\"
debug=\"74818\">The Big Bang Theory - 06x21 - The Closure Alternative</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/22/The_Proton_Resurgence\"
debug=\"75066\">The Big Bang Theory - 06x22 - The Proton Resurgence</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/23/The_Love_Spell_Potential\"
debug=\"75335\">The Big Bang Theory - 06x23 - The Love Spell Potential</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/6/24/The_Bon_Voyage_Reaction\"
debug=\"75567\">The Big Bang Theory - 06x24 - The Bon Voyage Reaction</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/1/The_Hofstadter_Insufficiency\"
debug=\"79523\">The Big Bang Theory - 07x01 - The Hofstadter Insufficiency</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/2/The_Deception_Verification\"
debug=\"79524\">The Big Bang Theory - 07x02 - The Deception Verification</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/3/The_Scavenger_Vortex\"
debug=\"79722\">The Big Bang Theory - 07x03 - The Scavenger Vortex</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/4/The_Raiders_Minimization\"
debug=\"80031\">The Big Bang Theory - 07x04 - The Raiders Minimization</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/5/The_Workplace_Proximity\"
debug=\"80254\">The Big Bang Theory - 07x05 - The Workplace Proximity</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/6/The_Romance_Resonance\"
debug=\"80518\">The Big Bang Theory - 07x06 - The Romance Resonance</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/7/The_Proton_Displacement\"
debug=\"81067\">The Big Bang Theory - 07x07 - The Proton Displacement</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/8/The_Itchy_Brain_Simulation\"
debug=\"81272\">The Big Bang Theory - 07x08 - The Itchy Brain Simulation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/9/The_Thanksgiving_Decoupling\"
debug=\"81525\">The Big Bang Theory - 07x09 - The Thanksgiving Decoupling</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/10/The_Discovery_Dissipation\"
debug=\"82096\">The Big Bang Theory - 07x10 - The Discovery Dissipation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/11/The_Cooper_Extraction\"
debug=\"82274\">The Big Bang Theory - 07x11 - The Cooper Extraction</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/12/The_Hesitation_Ramification\"
debug=\"82674\">The Big Bang Theory - 07x12 - The Hesitation Ramification</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/13/The_Occupation_Recalibration\"
debug=\"82916\">The Big Bang Theory - 07x13 - The Occupation Recalibration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/14/The_Convention_Conundrum\"
debug=\"83752\">The Big Bang Theory - 07x14 - The Convention Conundrum</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/15/The_Locomotive_Manipulation\"
debug=\"83978\">The Big Bang Theory - 07x15 - The Locomotive Manipulation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/16/The_Table_Polarization\"
debug=\"84736\">The Big Bang Theory - 07x16 - The Table Polarization</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/17/The_Friendship_Turbulence\"
debug=\"85106\">The Big Bang Theory - 07x17 - The Friendship Turbulence</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/18/The_Mommy_Observation\"
debug=\"85542\">The Big Bang Theory - 07x18 - The Mommy Observation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/19/The_Indecision_Amalgamation\"
debug=\"86494\">The Big Bang Theory - 07x19 - The Indecision Amalgamation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/20/The_Relationship_Diremption\"
debug=\"86744\">The Big Bang Theory - 07x20 - The Relationship Diremption</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/21/The_Anything_Can_Happen_Recurrence\"
debug=\"87403\">The Big Bang Theory - 07x21 - The Anything Can Happen Recurrence</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/22/The_Proton_Transmogrification\"
debug=\"87725\">The Big Bang Theory - 07x22 - The Proton Transmogrification</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/23/The_Gorilla_Dissolution\"
debug=\"87935\">The Big Bang Theory - 07x23 - The Gorilla Dissolution</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/7/24/The_Status_Quo_Combustion\"
debug=\"88184\">The Big Bang Theory - 07x24 - The Status Quo Combustion</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/1/The_Locomotion_Interruption\"
debug=\"92140\">The Big Bang Theory - 08x01 - The Locomotion Interruption</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/2/The_Junior_Professor_Solution\"
debug=\"92142\">The Big Bang Theory - 08x02 - The Junior Professor Solution</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/3/The_First_Pitch_Insufficiency\"
debug=\"92307\">The Big Bang Theory - 08x03 - The First Pitch Insufficiency</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/4/The_Hook-up_Reverberation\"
debug=\"92545\">The Big Bang Theory - 08x04 - The Hook-up Reverberation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/5/The_Focus_Attenuation\"
debug=\"92757\">The Big Bang Theory - 08x05 - The Focus Attenuation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/6/The_Expedition_Approximation\"
debug=\"93043\">The Big Bang Theory - 08x06 - The Expedition Approximation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/7/The_Misinterpretation_Agitation\"
debug=\"93361\">The Big Bang Theory - 08x07 - The Misinterpretation Agitation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/8/The_Prom_Equivalency\"
debug=\"93612\">The Big Bang Theory - 08x08 - The Prom Equivalency</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/9/The_Septum_Deviation\"
debug=\"93873\">The Big Bang Theory - 08x09 - The Septum Deviation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/10/The_Champagne_Reflection\"
debug=\"94116\">The Big Bang Theory - 08x10 - The Champagne Reflection</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/11/The_Clean_Room_Infiltration\"
debug=\"94911\">The Big Bang Theory - 08x11 - The Clean Room Infiltration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/12/The_Space_Probe_Disintegration\"
debug=\"95594\">The Big Bang Theory - 08x12 - The Space Probe Disintegration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/13/The_Anxiety_Optimization\"
debug=\"96388\">The Big Bang Theory - 08x13 - The Anxiety Optimization</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/14/The_Troll_Manifestation\"
debug=\"96654\">The Big Bang Theory - 08x14 - The Troll Manifestation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/15/The_Comic_Book_Store_Regeneration\"
debug=\"97289\">The Big Bang Theory - 08x15 - The Comic Book Store Regeneration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/16/The_Intimacy_Acceleration\"
debug=\"97610\">The Big Bang Theory - 08x16 - The Intimacy Acceleration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/17/The_Colonization_Application\"
debug=\"97863\">The Big Bang Theory - 08x17 - The Colonization Application</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/18/The_Leftover_Thermalization\"
debug=\"98196\">The Big Bang Theory - 08x18 - The Leftover Thermalization</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/19/The_Skywalker_Incursion\"
debug=\"99011\">The Big Bang Theory - 08x19 - The Skywalker Incursion</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/20/The_Fortification_Implementation\"
debug=\"99310\">The Big Bang Theory - 08x20 - The Fortification Implementation</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/21/The_Communication_Deterioration\"
debug=\"99595\">The Big Bang Theory - 08x21 - The Communication Deterioration</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/22/The_Graduation_Transmission\"
debug=\"99816\">The Big Bang Theory - 08x22 - The Graduation Transmission</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/23/The_Maternal_Combustion\"
debug=\"100083\">The Big Bang Theory - 08x23 - The Maternal Combustion</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Big_Bang_Theory/8/24/The_Commitment_Determination\"
debug=\"100419\">The Big Bang Theory - 08x24 - The Commitment Determination</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Closer/6/1/The_Big_Bang\"
debug=\"28952\">The Closer - 06x01 - The Big Bang</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_New_Adventures_of_Old_Christine/3/1/The_big_bang\"
debug=\"6773\">The New Adventures of Old Christine - 03x01 - The big bang</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/The_Universe/1/14/Beyond_the_Big_Bang\"
debug=\"19618\">The Universe - 01x14 - Beyond the Big Bang</a></td></tr><tr><p>\n<p>\n</table>\n</td>\n
\ <td></td>\n </tr>\n <tr> <!-- table
footer -->\n \t<td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/bl.gif\"
/></td>\n <td></td>\n <td class=\"tablecorner\"><img
src=\"http://www.addic7ed.com/images/br.gif\" /></td>\n </tr>\n
\ </table>\n </div>\n<iframe src=\"//s.ato.mx/p.html#id=7869&size=728x90\"
width=\"728\" height=\"90\" frameborder=\"0\" scrolling=\"no\" marginwidth=\"0\"
marginheight=\"0\"></iframe>\n\n\n<center><table border=\"0\" width=\"90%\">\n<tr>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Addic7ed</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\"
src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\"
alt=\" \" />Popular Shows</td>\n<td class=\"NewsTitle\"><img width=\"20\"
height=\"20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\"
/><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Useful</td>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Forums</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/shows.php\">Browse
By Shows</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/4906\">12
Monkeys</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/shows-schedule\">TV
Shows Schedule</a></div></td>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/1031-changelog/\">Site
Changelog</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/movie-subtitles\">Browse
By Movies</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/1812\">Homeland</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/2784-frequently-asked-questions/\">Frequently
Asked Questions</a></div></td>\n<td><div id=\"footermenu\">Support Us</div></td>\n</tr>\n<tr>\n<td><div
id=\"footermenu\"><a href=\"/top-uploaders\">Top Uploaders</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/620\">Modern Family</a></div></td>\n<td><div
id=\"footermenu\">RSS Feeds</div></td>\n<td><div id=\"footermenu\">Premium
Accounts</div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/log.php?mode=downloaded\">Top
Downloads</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/466\">Glee</a></div></td>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\"/>Tutorials</td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/thread-6-1-1.html\">Video
Formats</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/log.php?mode=news\">All
News</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/450\">Parks
and Recreation</a></div></td>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/338-guide-to-syncing-with-subtitleedit/page__p__1485__hl__%2B+%2Bsync__fromsearch__1#entry1485\">How
to Synchronize Subtitles</a></div></td>\n<td><div id=\"footermenu\">Frequently
Asked Questions</div></td>\n</tr> \n<tr>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net\">Sub-Talk
Forums</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/1277\">Shameless
(US)</a></div></td>\n<td><div id=\"footermenu\">What Are Subtitles</div></td>\n<td><div
id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=7\">TV Shows
Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/latest_comments.php\">Latest
Comments</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/126\">The
Big Bang Theory</a></div></td>\n<td><div id=\"footermenu\">New Translation
Tutorial</div></td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=22\">Movies
Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"http://www.vreaubagaj.ro/troler/\"
title=\"Trolere ieftine\" alt=\"Trolere ieftine\">Troler ieftin</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/130\">Family Guy</a></div></td>\n<td><div
id=\"footermenu\">Upload a New Subtitle Tutorial</div></td>\n<td class=\"NewsTitle\"><img
width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Stats</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\">Terms of Service</div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/1799\">American Horror Story</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"http://sub-talk.net/viewthread.php?tid=294\">How
to have an Avatar</a></div></td>\n<td align=\"left\">.\n\t\t\t\t</td>\n</tr>\n<tr>\n<td><div
id=\"footermenu\"><a href=\"/contact.php\">Contact</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/15\">House</a></div></td>\n<td><div id=\"footermenu\"><a
href=\"http://www.vreaubagaj.ro/\" alt=\"Trolere\" title=\"Trolere\">Trolere</a></div></td>\n<td>\n</td>\n</tr>\n</table></center>\n</center>\n\n<script
type=\"text/javascript\">\nvar gaJsHost = ((\"https:\" == document.location.protocol)
? \"https://ssl.\" : \"http://www.\");\ndocument.write(unescape(\"%3Cscript
src='\" + gaJsHost + \"google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E\"));\n</script>\n<script
type=\"text/javascript\">\ntry {\nvar pageTracker = _gat._getTracker(\"UA-10775680-1\");\npageTracker._trackPageview();\n}
catch(err) {}</script>\n\n\n<script type=\"text/javascript\" src=\"http://apis.google.com/js/plusone.js\"></script>\n
\ \n</body></html>\n"}
headers:
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Connection: [keep-alive]
Content-Type: [text/html]
Date: ['Sat, 04 Jul 2015 17:11:37 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [nginx]
Set-Cookie: [PHPSESSID=ns25ifo5qplrt2o336ogcb9v50; path=/]
X-Powered-By: [PHP/5.3.3]
status: {code: 200, message: OK}
version: 1
@@ -0,0 +1,514 @@
interactions:
- request:
body: null
headers:
User-Agent: [Subliminal/0.8.0]
method: GET
uri: http://www.addic7ed.com/search.php?Submit=Search&search=Dallas
response:
body: {string: "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta
http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n<title>\nSearch
\"Dallas\" Subtitle Download - Addic7ed.com - For all those TV Series Addic7s:
Subtitles, Tv Series and Movies Talk, Forum and more -</title>\n<link href=\"http://www.addic7ed.com/css/wikisubtitles.css\"
rel=\"stylesheet\" title=\"default\" type=\"text/css\" />\n<link rel=\"SHORTCUT
ICON\" href=\"favicon.ico\" /> \n<script type=\"text/javascript\" src=\"http://www.addic7ed.com/js/mootools.v1.11.js\"></script>\n\n</head>\n<body>\n<center><br
/>\n<table border=\"0\">\n<tr>\n <td rowspan=\"9\"><a href=\"/\"><img height=\"200\"
width=\"350\" src=\"http://www.addic7ed.com/images/addic7edheader.jpg\" border=\"0\"
\ title=\"Addic7ed.com - Quality Subtitles for TV Shows and movies\" alt=\"Addic7ed.com
- Quality Subtitles for TV Shows and movies\" /></a></td>\n</tr>\n<tr><td
align=\"center\" colspan=\"2\">\n<h1><small>Download free subtitles for TV
Shows and Movies.</small>&nbsp; \n<select name=\"applang\" class=\"inputCool\"
onchange=\"changeAppLang();\" id=\"comboLang\"><option value=\"ar\">Arabic</option><option
value=\"ca\">Catala</option><option selected=\"selected\" value=\"en\">English</option><option
value=\"eu\">Euskera</option><option value=\"fr\">French</option><option value=\"ga\">Galician</option><option
value=\"de\">German</option><option value=\"gr\">Greek</option><option value=\"hu\">Hungarian</option><option
value=\"it\">Italian</option><option value=\"fa\">Persian</option><option
value=\"pl\">Polish</option><option value=\"pt\">Portuguese</option><option
value=\"br\">Portuguese (Brazilian)</option><option value=\"ro\">Romanian</option><option
value=\"ru\">Russian</option><option value=\"es\">Spanish</option><option
value=\"se\">Swedish</option></select></h1>\n</td></tr>\n<tr><td align=\"center\"
colspan=\"2\">\n<div id=\"hBar\">\n\t\t\t <ul>\n\t\t\t\t<li><a class=\"button
white\" href=\"/newaccount.php\">Signup</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/login.php\">Login</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/shows.php\">Shows</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/allshows/a\">Air dates</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"http://www.sub-talk.net\">Forum</a></li>\n\t\t\t </ul>\n\t\t\t
\ </div>\n</td></tr> \n<tr>\n <td>\n</td><td>\n\t<g:plusone size=\"medium\"></g:plusone>\n
\ <a href=\"http://twitter.com/addic7ed\" target=\"_blank\"><img width=\"32\"
height=\"32\" src=\"http://www.addic7ed.com/images/twitter_right.png\" alt=\"Twitter\"
border=\"0\" /></a>\n\t<a href=\"irc://irc.efnet.net:6667/addic7ed\"><img
width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/irc-right.png\"
alt=\"IRC\" border=\"0\" /></a>\n<div style=\"float: right; padding-right:10%;\">\n\n
\ </td>\n </tr>\n <tr>\n <td colspan=2><iframe src=\"http://www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FAddic7ed&amp;send=false&amp;layout=button_count&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=tahoma&amp;height=21&amp;appId=121322186712\"
scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden; width:80px;
height:21px;\" allowTransparency=\"true\"></iframe>\n </td>\n </tr>\n</table>\n</center>\n\n<center>\n\n<!--[if
lt IE 7]>\n <style type=\"text/css\">\n div, img { behavior: url(http://www.addic7ed.com/js/iepngfix.htc)
}\n </style>\n<![endif]-->\n<br />\n<center>\n<!-- MarketGidComposite Start
-->\n<div id=\"MarketGidScriptRootC13385\">\n <div id=\"MarketGidPreloadC13385\">\n
\ <a id=\"mg_add13385\" href=\"http://mgid.com/advertisers/?utm_source=widget&utm_medium=text&utm_campaign=add\"
target=\"_blank\">Place your ad here</a><br> <a href=\"http://mgid.com/\"
target=\"_blank\">Loading...</a> \n </div>\n <script>\n
\ window.MGWidgetTitle13385 = \"Promoted
Content\"; (function(){\n var
D=new Date(),d=document,b='body',ce='createElement',ac='appendChild',st='style',ds='display',n='none',gi='getElementById';\n
\ var i=d[ce]('iframe');i[st][ds]=n;d[gi](\"MarketGidScriptRootC13385\")[ac](i);try{var
iw=i.contentWindow.document;iw.open();iw.writeln(\"<ht\"+\"ml><bo\"+\"dy></bo\"+\"dy></ht\"+\"ml>\");iw.close();var
c=iw[b];}\n catch(e){var
iw=d;var c=d[gi](\"MarketGidScriptRootC13385\");}var dv=iw[ce]('div');dv.id=\"MG_ID\";dv[st][ds]=n;dv.innerHTML=13385;c[ac](dv);\n
\ var
s=iw[ce]('script');s.async='async';s.defer='defer';s.charset='utf-8';s.src=\"//jsc.mgid.com/a/d/addic7ed.com.13385.js?t=\"+D.getYear()+D.getMonth()+D.getDate()+D.getHours();c[ac](s);})();\n
\ </script>\n
\ </div>\n
\ <!--
MarketGidComposite End -->\n<script type=\"text/javascript\" src=\"//eclkspsa.com/adServe/banners?tid=ADTPOP&tagid=2\"></script>\n</center><br
/>\n\n<div id=\"container\"> \n \t<table class=\"tabel70\" border=\"0\">\n
\ \t<tr> <!-- table header -->\n \t<td class=\"tablecorner\"><img
src=\"http://www.addic7ed.com/images/tl.gif\" /></td>\n <td></td>\n
\ <td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/tr.gif\"
/></td>\n </tr>\n <tr>\n \t<td></td>\n <td>\n<form
action=\"/search.php\" method=\"get\">\n<div align=\"center\">\n<input name=\"search\"
type=\"text\" id=\"search\" size=\"50\" value=\"Dallas\" class=\"inputCool\"/>&nbsp;\n
<input name=\"Submit\" type=\"submit\" class=\"coolBoton\" value=\"Search\"
/></form><br />\n\n<b>181 results found</b> </div><br />\n\n<br />\n\t<center>\n\n</center>\n<br
/>\n<center>&nbsp;&nbsp;<img src=\"http://www.addic7ed.com/images/database.png\"
/> <span class=\"titulo\">\nAre you looking for <a href=\"/show/802\" >Show
<i>Dallas</i></a>&nbsp;?</span></center><br /><br />\n\n<table class=\"tabel\"
align=\"center\" width=\"80%\" border=\"0\">\n<tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/1/1/Digger%27s_Daughter\" debug=\"31856\">Dallas
- 01x01 - Digger's Daughter</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/1/2/Lessons\" debug=\"31855\">Dallas - 01x02
- Lessons</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/1/3/Spy_in_the_House\" debug=\"31854\">Dallas
- 01x03 - Spy in the House</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/1/4/Winds_of_Vengeance\" debug=\"31853\">Dallas
- 01x04 - Winds of Vengeance</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/1/5/Barbecue\" debug=\"31852\">Dallas -
01x05 - Barbecue</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/1/Reunion__%281%29\" debug=\"31906\">Dallas
- 02x01 - Reunion (1)</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/2/Reunion__%282%29\" debug=\"31905\">Dallas
- 02x02 - Reunion (2)</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/3/Old_Acquaintance\" debug=\"31904\">Dallas
- 02x03 - Old Acquaintance</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/4/Bypass\" debug=\"31903\">Dallas - 02x04
- Bypass</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/5/Black_Market_Baby\" debug=\"31901\">Dallas
- 02x05 - Black Market Baby</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/6/Double_Wedding\" debug=\"31900\">Dallas
- 02x06 - Double Wedding</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/7/Runaway\" debug=\"31899\">Dallas - 02x07
- Runaway</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/8/Election\" debug=\"31898\">Dallas -
02x08 - Election</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/9/Survival\" debug=\"31897\">Dallas -
02x09 - Survival</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/10/Act_of_Love\" debug=\"31896\">Dallas
- 02x10 - Act of Love</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/11/Triangle\" debug=\"31895\">Dallas -
02x11 - Triangle</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/12/Fallen_Idol\" debug=\"31894\">Dallas
- 02x12 - Fallen Idol</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/13/Kidnapped\" debug=\"31893\">Dallas
- 02x13 - Kidnapped</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/14/Home_Again\" debug=\"31892\">Dallas
- 02x14 - Home Again</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/15/For_Love_or_Money\" debug=\"31891\">Dallas
- 02x15 - For Love or Money</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/16/Julie%27s_Return\" debug=\"31890\">Dallas
- 02x16 - Julie's Return</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/17/The_Red_File__%281%29\" debug=\"31889\">Dallas
- 02x17 - The Red File (1)</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/18/The_Red_File__%282%29\" debug=\"31888\">Dallas
- 02x18 - The Red File (2)</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/19/Sue_Ellen%27s_Sister\" debug=\"31887\">Dallas
- 02x19 - Sue Ellen's Sister</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/20/Call_Girl\" debug=\"31886\">Dallas
- 02x20 - Call Girl</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/21/Royal_Marriage\" debug=\"31885\">Dallas
- 02x21 - Royal Marriage</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/22/The_Outsiders\" debug=\"31884\">Dallas
- 02x22 - The Outsiders</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/23/John_Ewing_III__%281%29\" debug=\"31883\">Dallas
- 02x23 - John Ewing III (1)</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/2/24/John_Ewing_III_%282%29\" debug=\"31882\">Dallas
- 02x24 - John Ewing III (2)</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/1/Whatever_Happened_to_Baby_John%3F__%281%29\"
debug=\"31858\">Dallas - 03x01 - Whatever Happened to Baby John? (1)</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/3/2/Whatever_Happened_to_Baby_John%3F__%282%29\"
debug=\"31857\">Dallas - 03x02 - Whatever Happened to Baby John? (2)</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/3/3/The_Silent_Killer\"
debug=\"31881\">Dallas - 03x03 - The Silent Killer</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/3/4/Secrets\"
debug=\"31880\">Dallas - 03x04 - Secrets</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/5/The_Kristin_Affair\" debug=\"31879\">Dallas
- 03x05 - The Kristin Affair</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/6/The_Dove_Hunt\" debug=\"31878\">Dallas
- 03x06 - The Dove Hunt</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/7/The_Lost_Child\" debug=\"31877\">Dallas
- 03x07 - The Lost Child</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/8/Rodeo\" debug=\"31876\">Dallas - 03x08
- Rodeo</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/9/Mastectomy__%281%29\" debug=\"31875\">Dallas
- 03x09 - Mastectomy (1)</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/10/Mastectomy__%282%29\" debug=\"31874\">Dallas
- 03x10 - Mastectomy (2)</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/11/The_Heiress\" debug=\"31873\">Dallas
- 03x11 - The Heiress</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/12/Ellie_Saves_the_Day\" debug=\"31872\">Dallas
- 03x12 - Ellie Saves the Day</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/13/Mother_of_the_Year\" debug=\"31871\">Dallas
- 03x13 - Mother of the Year</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/14/Return_Engagements\" debug=\"31870\">Dallas
- 03x14 - Return Engagements</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/15/Love_and_Marriage\" debug=\"31869\">Dallas
- 03x15 - Love and Marriage</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/16/Power_Play\" debug=\"31868\">Dallas
- 03x16 - Power Play</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/17/Paternity_Suit\" debug=\"31867\">Dallas
- 03x17 - Paternity Suit</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/18/Jenna%27s_Return\" debug=\"31866\">Dallas
- 03x18 - Jenna's Return</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/19/Sue_Ellen%27s_Choice\" debug=\"31865\">Dallas
- 03x19 - Sue Ellen's Choice</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/20/Second_Thoughts\" debug=\"31864\">Dallas
- 03x20 - Second Thoughts</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/21/Divorce___Ewing_Style\" debug=\"31863\">Dallas
- 03x21 - Divorce Ewing Style</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/22/Jock%27s_Trial__%281%29\" debug=\"31862\">Dallas
- 03x22 - Jock's Trial (1)</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/23/Jock%27s_Trial__%282%29\" debug=\"31861\">Dallas
- 03x23 - Jock's Trial (2)</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/24/The_Wheeler_Dealer\" debug=\"31860\">Dallas
- 03x24 - The Wheeler Dealer</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/3/25/A_House_Divided\" debug=\"31859\">Dallas
- 03x25 - A House Divided</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/8/1/Killer_at_Large\" debug=\"69652\">Dallas
- 08x01 - Killer at Large</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/1/The_Family_Ewing\" debug=\"31937\">Dallas
- 09x01 - The Family Ewing</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/2/Rock_Bottom\" debug=\"31936\">Dallas
- 09x02 - Rock Bottom</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/3/Those_Eyes\" debug=\"31935\">Dallas
- 09x03 - Those Eyes</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/4/Resurrection\" debug=\"31934\">Dallas
- 09x04 - Resurrection</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/5/Saving_Grace\" debug=\"31933\">Dallas
- 09x05 - Saving Grace</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/6/Mothers\" debug=\"31932\">Dallas - 09x06
- Mothers</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/7/The_Wind_of_Change\" debug=\"31931\">Dallas
- 09x07 - The Wind of Change</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/8/Quandary\" debug=\"31930\">Dallas -
09x08 - Quandary</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/9/Close_Encounters\" debug=\"31929\">Dallas
- 09x09 - Close Encounters</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/10/Suffer_the_Little_Children\" debug=\"31928\">Dallas
- 09x10 - Suffer the Little Children</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/11/The_Prize\" debug=\"31927\">Dallas
- 09x11 - The Prize</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/12/En_Passant\" debug=\"31926\">Dallas
- 09x12 - En Passant</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/13/Goodbye%2C_Farewell%2C_and_Amen\" debug=\"31925\">Dallas
- 09x13 - Goodbye, Farewell, and Amen</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/14/Curiosity_Killed_the_Cat\" debug=\"31924\">Dallas
- 09x14 - Curiosity Killed the Cat</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/15/The_Missing_Link\" debug=\"31923\">Dallas
- 09x15 - The Missing Link</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/16/Twenty_Four_Hours\" debug=\"31922\">Dallas
- 09x16 - Twenty Four Hours</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/17/The_Deadly_Game\" debug=\"31921\">Dallas
- 09x17 - The Deadly Game</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/18/Blame_it_on_Bogota\" debug=\"31920\">Dallas
- 09x18 - Blame it on Bogota</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/19/Shadow_Games\" debug=\"31919\">Dallas
- 09x19 - Shadow Games</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/20/Missing\" debug=\"31918\">Dallas -
09x20 - Missing</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/21/Dire_Straits\" debug=\"31917\">Dallas
- 09x21 - Dire Straits</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/22/Overture\" debug=\"31916\">Dallas -
09x22 - Overture</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/23/Sitting_Ducks\" debug=\"31915\">Dallas
- 09x23 - Sitting Ducks</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/24/Masquerade\" debug=\"31914\">Dallas
- 09x24 - Masquerade</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/25/Just_Desserts\" debug=\"31913\">Dallas
- 09x25 - Just Desserts</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/26/Nothing%27s_Ever_Perfect\" debug=\"31912\">Dallas
- 09x26 - Nothing's Ever Perfect</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/27/J.R._Rising\" debug=\"31911\">Dallas
- 09x27 - J.R. Rising</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/28/Serendipity\" debug=\"31910\">Dallas
- 09x28 - Serendipity</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/29/Thrice_in_a_Lifetime\" debug=\"31909\">Dallas
- 09x29 - Thrice in a Lifetime</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/30/Hello%2C_Goodbye%2C_Hello\" debug=\"31908\">Dallas
- 09x30 - Hello, Goodbye, Hello</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/9/31/Blast_From_the_Past\" debug=\"31907\">Dallas
- 09x31 - Blast From the Past</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/1/Carousel\" debug=\"25485\">Dallas -
12x01 - Carousel</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/2/No_Greater_Love\" debug=\"25486\">Dallas
- 12x02 - No Greater Love</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/3/The_Call_of_the_Wild\" debug=\"25487\">Dallas
- 12x03 - The Call of the Wild</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/4/Out_of_the_Frying_Pan\" debug=\"25488\">Dallas
- 12x04 - Out of the Frying Pan</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/5/Road_Work\" debug=\"25489\">Dallas
- 12x05 - Road Work</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/6/War_and_Love_and_the_Whole_Damned_Thing\"
debug=\"25490\">Dallas - 12x06 - War and Love and the Whole Damned Thing</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/12/7/Showdown_at_the_Ewing_Corral\"
debug=\"25491\">Dallas - 12x07 - Showdown at the Ewing Corral</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/12/8/Deception\"
debug=\"25492\">Dallas - 12x08 - Deception</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/9/Counter_Attack\" debug=\"25493\">Dallas
- 12x09 - Counter Attack</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/10/The_Sting\" debug=\"25494\">Dallas
- 12x10 - The Sting</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/11/The_Two_Mrs._Ewings\" debug=\"25495\">Dallas
- 12x11 - The Two Mrs. Ewings</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/12/The_Switch\" debug=\"25496\">Dallas
- 12x12 - The Switch</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/13/Here%27s_Papa%21\" debug=\"25497\">Dallas
- 12x13 - Here's Papa!</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/14/Comings_and_Goings\" debug=\"25498\">Dallas
- 12x14 - Comings and Goings</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/15/Country_Girl\" debug=\"25499\">Dallas
- 12x15 - Country Girl</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/16/Wedding_Bell_Blues\" debug=\"25500\">Dallas
- 12x16 - Wedding Bell Blues</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/17/The_Way_We_Were\" debug=\"25501\">Dallas
- 12x17 - The Way We Were</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/18/The_Serpent%27s_Tooth\" debug=\"25502\">Dallas
- 12x18 - The Serpent's Tooth</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/19/Three_Hundred\" debug=\"25503\">Dallas
- 12x19 - Three Hundred</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/20/April_Showers\" debug=\"25504\">Dallas
- 12x20 - April Showers</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/21/And_Away_We_Go%21\" debug=\"25505\">Dallas
- 12x21 - And Away We Go!</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/22/Yellow_Brick_Road\" debug=\"25506\">Dallas
- 12x22 - Yellow Brick Road</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/23/The_Sound_of_Money\" debug=\"25507\">Dallas
- 12x23 - The Sound of Money</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/24/The_Great_Texas_Waltz\" debug=\"25508\">Dallas
- 12x24 - The Great Texas Waltz</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/25/Mission_to_Moscow\" debug=\"25510\">Dallas
- 12x25 - Mission to Moscow</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/12/26/Reel_Life\" debug=\"25511\">Dallas
- 12x26 - Reel Life</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/1/Phantom_of_the_Oil_Rig\" debug=\"26320\">Dallas
- 13x01 - Phantom of the Oil Rig</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/2/The_Leopard%27s_Spots\" debug=\"26321\">Dallas
- 13x02 - The Leopard's Spots</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/3/Cry_Me_a_River_of_Oil\" debug=\"26322\">Dallas
- 13x03 - Cry Me a River of Oil</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/4/Ka-Booooom%21\" debug=\"26323\">Dallas
- 13x04 - Ka-Booooom!</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/5/Sunrise%2C_Sunset\" debug=\"26324\">Dallas
- 13x05 - Sunrise, Sunset</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/6/Pride_and_Prejudice\" debug=\"26325\">Dallas
- 13x06 - Pride and Prejudice</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/7/Fathers_and_Other_Strangers\" debug=\"26326\">Dallas
- 13x07 - Fathers and Other Strangers</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/8/Black_Tide\" debug=\"26327\">Dallas
- 13x08 - Black Tide</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/9/Daddy_Dearest\" debug=\"26328\">Dallas
- 13x09 - Daddy Dearest</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/10/Hell%27s_Fury\" debug=\"26329\">Dallas
- 13x10 - Hell's Fury</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/11/Cally_on_a_Hot_Tin_Roof\" debug=\"26330\">Dallas
- 13x11 - Cally on a Hot Tin Roof</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/12/Sex%2C_Lies_and_Videotape\" debug=\"26331\">Dallas
- 13x12 - Sex, Lies and Videotape</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/13/Tale_of_Two_Cities\" debug=\"26332\">Dallas
- 13x13 - Tale of Two Cities</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/14/Judgment_Day\" debug=\"26333\">Dallas
- 13x14 - Judgment Day</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/15/Unchain_My_Heart\" debug=\"26334\">Dallas
- 13x15 - Unchain My Heart</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/16/I_Dream_of_Jeannie\" debug=\"26335\">Dallas
- 13x16 - I Dream of Jeannie</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/17/After_Midnight\" debug=\"26336\">Dallas
- 13x17 - After Midnight</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/18/The_Crucible\" debug=\"26337\">Dallas
- 13x18 - The Crucible</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/19/Dear_Hearts_and_Gentle_People\" debug=\"26338\">Dallas
- 13x19 - Dear Hearts and Gentle People</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/20/Paradise_Lost\" debug=\"26339\">Dallas
- 13x20 - Paradise Lost</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/21/Will_Power\" debug=\"26340\">Dallas
- 13x21 - Will Power</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/22/The_Smiling_Cobra\" debug=\"26341\">Dallas
- 13x22 - The Smiling Cobra</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/23/Jessica_Redux\" debug=\"26346\">Dallas
- 13x23 - Jessica Redux</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/24/Family_Plot\" debug=\"26342\">Dallas
- 13x24 - Family Plot</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/25/The_Southfork_Wedding_Jinx\" debug=\"26343\">Dallas
- 13x25 - The Southfork Wedding Jinx</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas/13/26/Three%2C_Three%2C_Three_%281%29\"
debug=\"26344\">Dallas - 13x26 - Three, Three, Three (1)</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas/13/27/Three%2C_Three%2C_Three_%282%29\"
debug=\"26345\">Dallas - 13x27 - Three, Three, Three (2)</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/film.png\" /></td><td><a href=\"movie/88544\"
debug=\"88544\">Dallas (1950)</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas_%282012%29/1/1/Changing_of_the_Guard\" debug=\"63362\">Dallas
(2012) - 01x01 - Changing of the Guard</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas_%282012%29/1/2/Hedging_Your_Bets\" debug=\"63364\">Dallas
(2012) - 01x02 - Hedging Your Bets</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas_%282012%29/1/3/The_Price_You_Pay\" debug=\"63827\">Dallas
(2012) - 01x03 - The Price You Pay</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas_%282012%29/1/4/The_Last_Hurrah\" debug=\"63994\">Dallas
(2012) - 01x04 - The Last Hurrah</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas_%282012%29/1/5/Truth_and_consequences\"
debug=\"64210\">Dallas (2012) - 01x05 - Truth and consequences</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/1/6/The_Enemy_of_My_Enemy\"
debug=\"64512\">Dallas (2012) - 01x06 - The Enemy of My Enemy</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/1/7/Collateral_Damage\"
debug=\"64686\">Dallas (2012) - 01x07 - Collateral Damage</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/1/8/No_Good_Deed\"
debug=\"64933\">Dallas (2012) - 01x08 - No Good Deed</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/1/9/Family_Business\"
debug=\"65100\">Dallas (2012) - 01x09 - Family Business</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/1/10/Revelations\"
debug=\"65276\">Dallas (2012) - 01x10 - Revelations</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/1/Battle_Lines\"
debug=\"71069\">Dallas (2012) - 02x01 - Battle Lines</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/2/Venomous_Creatures\"
debug=\"71070\">Dallas (2012) - 02x02 - Venomous Creatures</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/3/Sins_of_the_Father\"
debug=\"71358\">Dallas (2012) - 02x03 - Sins of the Father</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/4/False_Confessions\"
debug=\"71644\">Dallas (2012) - 02x04 - False Confessions</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/5/Trial_and_Error\"
debug=\"71949\">Dallas (2012) - 02x05 - Trial and Error</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/6/Blame_Game\"
debug=\"72265\">Dallas (2012) - 02x06 - Blame Game</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/7/The_Furious_and_the_Fast\"
debug=\"72625\">Dallas (2012) - 02x07 - The Furious and the Fast</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/8/J.R.%27s_Masterpiece\"
debug=\"72969\">Dallas (2012) - 02x08 - J.R.'s Masterpiece</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/9/Ewings_Unite%21\"
debug=\"73242\">Dallas (2012) - 02x09 - Ewings Unite!</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/10/Guilt_And_Innocence\"
debug=\"73578\">Dallas (2012) - 02x10 - Guilt And Innocence</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/11/Let_Me_In\"
debug=\"73846\">Dallas (2012) - 02x11 - Let Me In</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/12/A_Call_to_Arms\"
debug=\"74098\">Dallas (2012) - 02x12 - A Call to Arms</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/13/Love_%40_Family\"
debug=\"74099\">Dallas (2012) - 02x13 - Love & Family</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/14/Guilt_By_Association\"
debug=\"74342\">Dallas (2012) - 02x14 - Guilt By Association</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/15/Legacies\"
debug=\"74347\">Dallas (2012) - 02x15 - Legacies</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/1/The_Return\"
debug=\"84652\">Dallas (2012) - 03x01 - The Return</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/2/Trust_Me\"
debug=\"84941\">Dallas (2012) - 03x02 - Trust Me</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/3/Playing_Chicken\"
debug=\"85388\">Dallas (2012) - 03x03 - Playing Chicken</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/4/Lifting_the_Veil\"
debug=\"85735\">Dallas (2012) - 03x04 - Lifting the Veil</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/5/D.T.R.\"
debug=\"86033\">Dallas (2012) - 03x05 - D.T.R.</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/6/Like_Father%2C_Like_Son\"
debug=\"86406\">Dallas (2012) - 03x06 - Like Father, Like Son</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/7/Like_a_Bad_Penny\"
debug=\"86664\">Dallas (2012) - 03x07 - Like a Bad Penny</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/8/Where_There%27s_Smoke\"
debug=\"86948\">Dallas (2012) - 03x08 - Where There's Smoke</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/9/Denial%2C_Anger%2C_Acceptance\"
debug=\"91222\">Dallas (2012) - 03x09 - Denial, Anger, Acceptance</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/10/Dead_Reckoning\"
debug=\"91469\">Dallas (2012) - 03x10 - Dead Reckoning</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/11/Hurt\"
debug=\"91634\">Dallas (2012) - 03x11 - Hurt</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/12/Victims_of_Love\"
debug=\"91837\">Dallas (2012) - 03x12 - Victims of Love</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/13/Boxed_In\"
debug=\"91959\">Dallas (2012) - 03x13 - Boxed In</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/14/Endgame\"
debug=\"92148\">Dallas (2012) - 03x14 - Endgame</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/15/Brave_New_World\"
debug=\"92160\">Dallas (2012) - 03x15 - Brave New World</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/film.png\" /></td><td><a href=\"movie/82717\"
debug=\"82717\">Dallas Buyers Club (2013)</a></td></tr><tr><p>\n<p>\n</table>\n</td>\n
\ <td></td>\n </tr>\n <tr> <!-- table
footer -->\n \t<td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/bl.gif\"
/></td>\n <td></td>\n <td class=\"tablecorner\"><img
src=\"http://www.addic7ed.com/images/br.gif\" /></td>\n </tr>\n
\ </table>\n </div>\n<iframe src=\"//s.ato.mx/p.html#id=7869&size=728x90\"
width=\"728\" height=\"90\" frameborder=\"0\" scrolling=\"no\" marginwidth=\"0\"
marginheight=\"0\"></iframe>\n\n\n<center><table border=\"0\" width=\"90%\">\n<tr>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Addic7ed</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\"
src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\"
alt=\" \" />Popular Shows</td>\n<td class=\"NewsTitle\"><img width=\"20\"
height=\"20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\"
/><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Useful</td>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Forums</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/shows.php\">Browse
By Shows</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/4906\">12
Monkeys</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/shows-schedule\">TV
Shows Schedule</a></div></td>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/1031-changelog/\">Site
Changelog</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/movie-subtitles\">Browse
By Movies</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/1812\">Homeland</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/2784-frequently-asked-questions/\">Frequently
Asked Questions</a></div></td>\n<td><div id=\"footermenu\">Support Us</div></td>\n</tr>\n<tr>\n<td><div
id=\"footermenu\"><a href=\"/top-uploaders\">Top Uploaders</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/620\">Modern Family</a></div></td>\n<td><div
id=\"footermenu\">RSS Feeds</div></td>\n<td><div id=\"footermenu\">Premium
Accounts</div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/log.php?mode=downloaded\">Top
Downloads</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/466\">Glee</a></div></td>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\"/>Tutorials</td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/thread-6-1-1.html\">Video
Formats</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/log.php?mode=news\">All
News</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/450\">Parks
and Recreation</a></div></td>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/338-guide-to-syncing-with-subtitleedit/page__p__1485__hl__%2B+%2Bsync__fromsearch__1#entry1485\">How
to Synchronize Subtitles</a></div></td>\n<td><div id=\"footermenu\">Frequently
Asked Questions</div></td>\n</tr> \n<tr>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net\">Sub-Talk
Forums</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/1277\">Shameless
(US)</a></div></td>\n<td><div id=\"footermenu\">What Are Subtitles</div></td>\n<td><div
id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=7\">TV Shows
Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/latest_comments.php\">Latest
Comments</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/126\">The
Big Bang Theory</a></div></td>\n<td><div id=\"footermenu\">New Translation
Tutorial</div></td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=22\">Movies
Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"http://www.vreaubagaj.ro/troler/\"
title=\"Trolere ieftine\" alt=\"Trolere ieftine\">Troler ieftin</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/130\">Family Guy</a></div></td>\n<td><div
id=\"footermenu\">Upload a New Subtitle Tutorial</div></td>\n<td class=\"NewsTitle\"><img
width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Stats</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\">Terms of Service</div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/1799\">American Horror Story</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"http://sub-talk.net/viewthread.php?tid=294\">How
to have an Avatar</a></div></td>\n<td align=\"left\">.\n\t\t\t\t</td>\n</tr>\n<tr>\n<td><div
id=\"footermenu\"><a href=\"/contact.php\">Contact</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/15\">House</a></div></td>\n<td><div id=\"footermenu\"><a
href=\"http://www.vreaubagaj.ro/\" alt=\"Trolere\" title=\"Trolere\">Trolere</a></div></td>\n<td>\n</td>\n</tr>\n</table></center>\n</center>\n\n<script
type=\"text/javascript\">\nvar gaJsHost = ((\"https:\" == document.location.protocol)
? \"https://ssl.\" : \"http://www.\");\ndocument.write(unescape(\"%3Cscript
src='\" + gaJsHost + \"google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E\"));\n</script>\n<script
type=\"text/javascript\">\ntry {\nvar pageTracker = _gat._getTracker(\"UA-10775680-1\");\npageTracker._trackPageview();\n}
catch(err) {}</script>\n\n\n<script type=\"text/javascript\" src=\"http://apis.google.com/js/plusone.js\"></script>\n
\ \n</body></html>\n"}
headers:
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Connection: [keep-alive]
Content-Type: [text/html]
Date: ['Sat, 04 Jul 2015 17:11:38 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [nginx]
Set-Cookie: [PHPSESSID=38vgutgvno5eij1f9au3ch6au6; path=/]
X-Powered-By: [PHP/5.3.3]
status: {code: 200, message: OK}
version: 1
@@ -0,0 +1,233 @@
interactions:
- request:
body: null
headers:
User-Agent: [Subliminal/0.8.0]
method: GET
uri: http://www.addic7ed.com/search.php?Submit=Search&search=Dallas+%282012%29
response:
body: {string: "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta
http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n<title>\nSearch
\"Dallas (2012)\" Subtitle Download - Addic7ed.com - For all those TV Series
Addic7s: Subtitles, Tv Series and Movies Talk, Forum and more -</title>\n<link
href=\"http://www.addic7ed.com/css/wikisubtitles.css\" rel=\"stylesheet\"
title=\"default\" type=\"text/css\" />\n<link rel=\"SHORTCUT ICON\" href=\"favicon.ico\"
/> \n<script type=\"text/javascript\" src=\"http://www.addic7ed.com/js/mootools.v1.11.js\"></script>\n\n</head>\n<body>\n<center><br
/>\n<table border=\"0\">\n<tr>\n <td rowspan=\"9\"><a href=\"/\"><img height=\"200\"
width=\"350\" src=\"http://www.addic7ed.com/images/addic7edheader.jpg\" border=\"0\"
\ title=\"Addic7ed.com - Quality Subtitles for TV Shows and movies\" alt=\"Addic7ed.com
- Quality Subtitles for TV Shows and movies\" /></a></td>\n</tr>\n<tr><td
align=\"center\" colspan=\"2\">\n<h1><small>Download free subtitles for TV
Shows and Movies.</small>&nbsp; \n<select name=\"applang\" class=\"inputCool\"
onchange=\"changeAppLang();\" id=\"comboLang\"><option value=\"ar\">Arabic</option><option
value=\"ca\">Catala</option><option selected=\"selected\" value=\"en\">English</option><option
value=\"eu\">Euskera</option><option value=\"fr\">French</option><option value=\"ga\">Galician</option><option
value=\"de\">German</option><option value=\"gr\">Greek</option><option value=\"hu\">Hungarian</option><option
value=\"it\">Italian</option><option value=\"fa\">Persian</option><option
value=\"pl\">Polish</option><option value=\"pt\">Portuguese</option><option
value=\"br\">Portuguese (Brazilian)</option><option value=\"ro\">Romanian</option><option
value=\"ru\">Russian</option><option value=\"es\">Spanish</option><option
value=\"se\">Swedish</option></select></h1>\n</td></tr>\n<tr><td align=\"center\"
colspan=\"2\">\n<div id=\"hBar\">\n\t\t\t <ul>\n\t\t\t\t<li><a class=\"button
white\" href=\"/newaccount.php\">Signup</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/login.php\">Login</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/shows.php\">Shows</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"/allshows/a\">Air dates</a></li>\n\t\t\t\t<li><a class=\"button
white\" href=\"http://www.sub-talk.net\">Forum</a></li>\n\t\t\t </ul>\n\t\t\t
\ </div>\n</td></tr> \n<tr>\n <td>\n</td><td>\n\t<g:plusone size=\"medium\"></g:plusone>\n
\ <a href=\"http://twitter.com/addic7ed\" target=\"_blank\"><img width=\"32\"
height=\"32\" src=\"http://www.addic7ed.com/images/twitter_right.png\" alt=\"Twitter\"
border=\"0\" /></a>\n\t<a href=\"irc://irc.efnet.net:6667/addic7ed\"><img
width=\"32\" height=\"32\" src=\"http://www.addic7ed.com/images/irc-right.png\"
alt=\"IRC\" border=\"0\" /></a>\n<div style=\"float: right; padding-right:10%;\">\n\n
\ </td>\n </tr>\n <tr>\n <td colspan=2><iframe src=\"http://www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FAddic7ed&amp;send=false&amp;layout=button_count&amp;width=450&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=tahoma&amp;height=21&amp;appId=121322186712\"
scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden; width:80px;
height:21px;\" allowTransparency=\"true\"></iframe>\n </td>\n </tr>\n</table>\n</center>\n\n<center>\n\n<!--[if
lt IE 7]>\n <style type=\"text/css\">\n div, img { behavior: url(http://www.addic7ed.com/js/iepngfix.htc)
}\n </style>\n<![endif]-->\n<br />\n<center>\n<!-- MarketGidComposite Start
-->\n<div id=\"MarketGidScriptRootC13385\">\n <div id=\"MarketGidPreloadC13385\">\n
\ <a id=\"mg_add13385\" href=\"http://mgid.com/advertisers/?utm_source=widget&utm_medium=text&utm_campaign=add\"
target=\"_blank\">Place your ad here</a><br> <a href=\"http://mgid.com/\"
target=\"_blank\">Loading...</a> \n </div>\n <script>\n
\ window.MGWidgetTitle13385 = \"Promoted
Content\"; (function(){\n var
D=new Date(),d=document,b='body',ce='createElement',ac='appendChild',st='style',ds='display',n='none',gi='getElementById';\n
\ var i=d[ce]('iframe');i[st][ds]=n;d[gi](\"MarketGidScriptRootC13385\")[ac](i);try{var
iw=i.contentWindow.document;iw.open();iw.writeln(\"<ht\"+\"ml><bo\"+\"dy></bo\"+\"dy></ht\"+\"ml>\");iw.close();var
c=iw[b];}\n catch(e){var
iw=d;var c=d[gi](\"MarketGidScriptRootC13385\");}var dv=iw[ce]('div');dv.id=\"MG_ID\";dv[st][ds]=n;dv.innerHTML=13385;c[ac](dv);\n
\ var
s=iw[ce]('script');s.async='async';s.defer='defer';s.charset='utf-8';s.src=\"//jsc.mgid.com/a/d/addic7ed.com.13385.js?t=\"+D.getYear()+D.getMonth()+D.getDate()+D.getHours();c[ac](s);})();\n
\ </script>\n
\ </div>\n
\ <!--
MarketGidComposite End -->\n<script type=\"text/javascript\" src=\"//eclkspsa.com/adServe/banners?tid=ADTPOP&tagid=2\"></script>\n</center><br
/>\n\n<div id=\"container\"> \n \t<table class=\"tabel70\" border=\"0\">\n
\ \t<tr> <!-- table header -->\n \t<td class=\"tablecorner\"><img
src=\"http://www.addic7ed.com/images/tl.gif\" /></td>\n <td></td>\n
\ <td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/tr.gif\"
/></td>\n </tr>\n <tr>\n \t<td></td>\n <td>\n<form
action=\"/search.php\" method=\"get\">\n<div align=\"center\">\n<input name=\"search\"
type=\"text\" id=\"search\" size=\"50\" value=\"Dallas (2012)\" class=\"inputCool\"/>&nbsp;\n
<input name=\"Submit\" type=\"submit\" class=\"coolBoton\" value=\"Search\"
/></form><br />\n\n<b>40 results found</b> </div><br />\n\n<br />\n\t<center>\n\n</center>\n<br
/>\n<center>&nbsp;&nbsp;<img src=\"http://www.addic7ed.com/images/database.png\"
/> <span class=\"titulo\">\nAre you looking for <a href=\"/show/2559\" >Show
<i>Dallas (2012)</i></a>&nbsp;?</span></center><br /><br />\n\n<table class=\"tabel\"
align=\"center\" width=\"80%\" border=\"0\">\n<tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas_%282012%29/1/1/Changing_of_the_Guard\" debug=\"63362\">Dallas
(2012) - 01x01 - Changing of the Guard</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas_%282012%29/1/2/Hedging_Your_Bets\" debug=\"63364\">Dallas
(2012) - 01x02 - Hedging Your Bets</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas_%282012%29/1/3/The_Price_You_Pay\" debug=\"63827\">Dallas
(2012) - 01x03 - The Price You Pay</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas_%282012%29/1/4/The_Last_Hurrah\" debug=\"63994\">Dallas
(2012) - 01x04 - The Last Hurrah</a></td></tr><tr><tr><td><img src=\"http://www.addic7ed.com/images/television.png\"
/></td><td><a href=\"serie/Dallas_%282012%29/1/5/Truth_and_consequences\"
debug=\"64210\">Dallas (2012) - 01x05 - Truth and consequences</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/1/6/The_Enemy_of_My_Enemy\"
debug=\"64512\">Dallas (2012) - 01x06 - The Enemy of My Enemy</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/1/7/Collateral_Damage\"
debug=\"64686\">Dallas (2012) - 01x07 - Collateral Damage</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/1/8/No_Good_Deed\"
debug=\"64933\">Dallas (2012) - 01x08 - No Good Deed</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/1/9/Family_Business\"
debug=\"65100\">Dallas (2012) - 01x09 - Family Business</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/1/10/Revelations\"
debug=\"65276\">Dallas (2012) - 01x10 - Revelations</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/1/Battle_Lines\"
debug=\"71069\">Dallas (2012) - 02x01 - Battle Lines</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/2/Venomous_Creatures\"
debug=\"71070\">Dallas (2012) - 02x02 - Venomous Creatures</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/3/Sins_of_the_Father\"
debug=\"71358\">Dallas (2012) - 02x03 - Sins of the Father</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/4/False_Confessions\"
debug=\"71644\">Dallas (2012) - 02x04 - False Confessions</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/5/Trial_and_Error\"
debug=\"71949\">Dallas (2012) - 02x05 - Trial and Error</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/6/Blame_Game\"
debug=\"72265\">Dallas (2012) - 02x06 - Blame Game</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/7/The_Furious_and_the_Fast\"
debug=\"72625\">Dallas (2012) - 02x07 - The Furious and the Fast</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/8/J.R.%27s_Masterpiece\"
debug=\"72969\">Dallas (2012) - 02x08 - J.R.'s Masterpiece</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/9/Ewings_Unite%21\"
debug=\"73242\">Dallas (2012) - 02x09 - Ewings Unite!</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/10/Guilt_And_Innocence\"
debug=\"73578\">Dallas (2012) - 02x10 - Guilt And Innocence</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/11/Let_Me_In\"
debug=\"73846\">Dallas (2012) - 02x11 - Let Me In</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/12/A_Call_to_Arms\"
debug=\"74098\">Dallas (2012) - 02x12 - A Call to Arms</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/13/Love_%40_Family\"
debug=\"74099\">Dallas (2012) - 02x13 - Love & Family</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/14/Guilt_By_Association\"
debug=\"74342\">Dallas (2012) - 02x14 - Guilt By Association</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/2/15/Legacies\"
debug=\"74347\">Dallas (2012) - 02x15 - Legacies</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/1/The_Return\"
debug=\"84652\">Dallas (2012) - 03x01 - The Return</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/2/Trust_Me\"
debug=\"84941\">Dallas (2012) - 03x02 - Trust Me</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/3/Playing_Chicken\"
debug=\"85388\">Dallas (2012) - 03x03 - Playing Chicken</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/4/Lifting_the_Veil\"
debug=\"85735\">Dallas (2012) - 03x04 - Lifting the Veil</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/5/D.T.R.\"
debug=\"86033\">Dallas (2012) - 03x05 - D.T.R.</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/6/Like_Father%2C_Like_Son\"
debug=\"86406\">Dallas (2012) - 03x06 - Like Father, Like Son</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/7/Like_a_Bad_Penny\"
debug=\"86664\">Dallas (2012) - 03x07 - Like a Bad Penny</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/8/Where_There%27s_Smoke\"
debug=\"86948\">Dallas (2012) - 03x08 - Where There's Smoke</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/9/Denial%2C_Anger%2C_Acceptance\"
debug=\"91222\">Dallas (2012) - 03x09 - Denial, Anger, Acceptance</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/10/Dead_Reckoning\"
debug=\"91469\">Dallas (2012) - 03x10 - Dead Reckoning</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/11/Hurt\"
debug=\"91634\">Dallas (2012) - 03x11 - Hurt</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/12/Victims_of_Love\"
debug=\"91837\">Dallas (2012) - 03x12 - Victims of Love</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/13/Boxed_In\"
debug=\"91959\">Dallas (2012) - 03x13 - Boxed In</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/14/Endgame\"
debug=\"92148\">Dallas (2012) - 03x14 - Endgame</a></td></tr><tr><tr><td><img
src=\"http://www.addic7ed.com/images/television.png\" /></td><td><a href=\"serie/Dallas_%282012%29/3/15/Brave_New_World\"
debug=\"92160\">Dallas (2012) - 03x15 - Brave New World</a></td></tr><tr><p>\n<p>\n</table>\n</td>\n
\ <td></td>\n </tr>\n <tr> <!-- table
footer -->\n \t<td class=\"tablecorner\"><img src=\"http://www.addic7ed.com/images/bl.gif\"
/></td>\n <td></td>\n <td class=\"tablecorner\"><img
src=\"http://www.addic7ed.com/images/br.gif\" /></td>\n </tr>\n
\ </table>\n </div>\n<iframe src=\"//s.ato.mx/p.html#id=7869&size=728x90\"
width=\"728\" height=\"90\" frameborder=\"0\" scrolling=\"no\" marginwidth=\"0\"
marginheight=\"0\"></iframe>\n\n\n<center><table border=\"0\" width=\"90%\">\n<tr>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Addic7ed</td>\n<td class=\"NewsTitle\"><img width=\"20\" height=\"20\"
src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\"
alt=\" \" />Popular Shows</td>\n<td class=\"NewsTitle\"><img width=\"20\"
height=\"20\" src=\"http://www.addic7ed.com/images/television.png\" alt=\"TV\"
/><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\" \" />Useful</td>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Forums</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/shows.php\">Browse
By Shows</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/4906\">12
Monkeys</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/shows-schedule\">TV
Shows Schedule</a></div></td>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/1031-changelog/\">Site
Changelog</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/movie-subtitles\">Browse
By Movies</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/1812\">Homeland</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/2784-frequently-asked-questions/\">Frequently
Asked Questions</a></div></td>\n<td><div id=\"footermenu\">Support Us</div></td>\n</tr>\n<tr>\n<td><div
id=\"footermenu\"><a href=\"/top-uploaders\">Top Uploaders</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/620\">Modern Family</a></div></td>\n<td><div
id=\"footermenu\">RSS Feeds</div></td>\n<td><div id=\"footermenu\">Premium
Accounts</div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/log.php?mode=downloaded\">Top
Downloads</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/466\">Glee</a></div></td>\n<td
class=\"NewsTitle\"><img width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\"/>Tutorials</td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/thread-6-1-1.html\">Video
Formats</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/log.php?mode=news\">All
News</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/450\">Parks
and Recreation</a></div></td>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net/topic/338-guide-to-syncing-with-subtitleedit/page__p__1485__hl__%2B+%2Bsync__fromsearch__1#entry1485\">How
to Synchronize Subtitles</a></div></td>\n<td><div id=\"footermenu\">Frequently
Asked Questions</div></td>\n</tr> \n<tr>\n<td><div id=\"footermenu\"><a href=\"http://www.sub-talk.net\">Sub-Talk
Forums</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/1277\">Shameless
(US)</a></div></td>\n<td><div id=\"footermenu\">What Are Subtitles</div></td>\n<td><div
id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=7\">TV Shows
Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"/latest_comments.php\">Latest
Comments</a></div></td>\n<td><div id=\"footermenu\"><a href=\"/show/126\">The
Big Bang Theory</a></div></td>\n<td><div id=\"footermenu\">New Translation
Tutorial</div></td>\n<td><div id=\"footermenu\"><a href=\"http://sub-talk.net/index.php?gid=22\">Movies
Talk</a></div></td>\n</tr>\n<tr>\n<td><div id=\"footermenu\"><a href=\"http://www.vreaubagaj.ro/troler/\"
title=\"Trolere ieftine\" alt=\"Trolere ieftine\">Troler ieftin</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/130\">Family Guy</a></div></td>\n<td><div
id=\"footermenu\">Upload a New Subtitle Tutorial</div></td>\n<td class=\"NewsTitle\"><img
width=\"20\" height=\"20\" src=\"http://www.addic7ed.com/images/television.png\"
alt=\"TV\" /><img src=\"http://www.addic7ed.com/images/invisible.gif\" alt=\"
\" />Stats</td>\n</tr>\n<tr>\n<td><div id=\"footermenu\">Terms of Service</div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/1799\">American Horror Story</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"http://sub-talk.net/viewthread.php?tid=294\">How
to have an Avatar</a></div></td>\n<td align=\"left\">.\n\t\t\t\t</td>\n</tr>\n<tr>\n<td><div
id=\"footermenu\"><a href=\"/contact.php\">Contact</a></div></td>\n<td><div
id=\"footermenu\"><a href=\"/show/15\">House</a></div></td>\n<td><div id=\"footermenu\"><a
href=\"http://www.vreaubagaj.ro/\" alt=\"Trolere\" title=\"Trolere\">Trolere</a></div></td>\n<td>\n</td>\n</tr>\n</table></center>\n</center>\n\n<script
type=\"text/javascript\">\nvar gaJsHost = ((\"https:\" == document.location.protocol)
? \"https://ssl.\" : \"http://www.\");\ndocument.write(unescape(\"%3Cscript
src='\" + gaJsHost + \"google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E\"));\n</script>\n<script
type=\"text/javascript\">\ntry {\nvar pageTracker = _gat._getTracker(\"UA-10775680-1\");\npageTracker._trackPageview();\n}
catch(err) {}</script>\n\n\n<script type=\"text/javascript\" src=\"http://apis.google.com/js/plusone.js\"></script>\n
\ \n</body></html>\n"}
headers:
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Connection: [keep-alive]
Content-Type: [text/html]
Date: ['Sat, 04 Jul 2015 17:11:38 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [nginx]
Set-Cookie: [PHPSESSID=uj1fmp2tpmevdai9ef5b9913l3; path=/]
X-Powered-By: [PHP/5.3.3]
status: {code: 200, message: OK}
version: 1
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,826 @@
interactions:
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5Mb2dJbjwvbWV0
aG9kTmFtZT4KPHBhcmFtcz4KPHBhcmFtPgo8dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVl
Pgo8L3BhcmFtPgo8cGFyYW0+Cjx2YWx1ZT48c3RyaW5nPjwvc3RyaW5nPjwvdmFsdWU+CjwvcGFy
YW0+CjxwYXJhbT4KPHZhbHVlPjxzdHJpbmc+ZW5nPC9zdHJpbmc+PC92YWx1ZT4KPC9wYXJhbT4K
PHBhcmFtPgo8dmFsdWU+PHN0cmluZz5zdWJsaW1pbmFsIHYxLjA8L3N0cmluZz48L3ZhbHVlPgo8
L3BhcmFtPgo8L3BhcmFtcz4KPC9tZXRob2RDYWxsPgo=
headers:
Accept-Encoding: [gzip]
Content-Length: ['317']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA6WRwW7CMAyG7zxF1PtIug6pBxMeYIdJe4PQGtbRxCV2qj3+SokEQmhD4vbZ8u//
lw2bH9+rESN3FNZFuTSFwtBQ24X9ukiye6mLjV2AR/mi9hN5oMA4NQYXnWe7UGeaQMHo+oQnUsAS
UyMzq0nstxjPhYLgPFqhAwbQM+f+RZ0XTBHsYSzrPZWruFtRdRy+O5GaXX2s3kDnkSzXV3rQ15b3
/FmcJH4gwKsx6uP9STNsKLR/urWUtj1aszQV6Fz85zWHyle+TIHOD8nAJ7p93y9uhcB49wEAAA==
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Content-Encoding: [gzip]
Content-Length: ['226']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:54:08 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [lighttpd/1.4.35]
Set-Cookie: [PHPSESSID=kv18go15rf5o3qpjitt8sa8q34; path=/; domain=.opensubtitles.org]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5TZWFyY2hTdWJ0
aXRsZXM8L21ldGhvZE5hbWU+CjxwYXJhbXM+CjxwYXJhbT4KPHZhbHVlPjxzdHJpbmc+a3YxOGdv
MTVyZjVvM3Fwaml0dDhzYThxMzQ8L3N0cmluZz48L3ZhbHVlPgo8L3BhcmFtPgo8cGFyYW0+Cjx2
YWx1ZT48YXJyYXk+PGRhdGE+Cjx2YWx1ZT48c3RydWN0Pgo8bWVtYmVyPgo8bmFtZT5tb3ZpZWhh
c2g8L25hbWU+Cjx2YWx1ZT48c3RyaW5nPjViOGY4ZjRlNDFjY2IyMWU8L3N0cmluZz48L3ZhbHVl
Pgo8L21lbWJlcj4KPG1lbWJlcj4KPG5hbWU+c3VibGFuZ3VhZ2VpZDwvbmFtZT4KPHZhbHVlPjxz
dHJpbmc+ZnJlLGdlcjwvc3RyaW5nPjwvdmFsdWU+CjwvbWVtYmVyPgo8bWVtYmVyPgo8bmFtZT5t
b3ZpZWJ5dGVzaXplPC9uYW1lPgo8dmFsdWU+PHN0cmluZz43MDMzNzMyNzE0PC9zdHJpbmc+PC92
YWx1ZT4KPC9tZW1iZXI+Cjwvc3RydWN0PjwvdmFsdWU+Cjx2YWx1ZT48c3RydWN0Pgo8bWVtYmVy
Pgo8bmFtZT5pbWRiaWQ8L25hbWU+Cjx2YWx1ZT48aW50Pjc3MDgyODwvaW50PjwvdmFsdWU+Cjwv
bWVtYmVyPgo8bWVtYmVyPgo8bmFtZT5zdWJsYW5ndWFnZWlkPC9uYW1lPgo8dmFsdWU+PHN0cmlu
Zz5mcmUsZ2VyPC9zdHJpbmc+PC92YWx1ZT4KPC9tZW1iZXI+Cjwvc3RydWN0PjwvdmFsdWU+Cjwv
ZGF0YT48L2FycmF5PjwvdmFsdWU+CjwvcGFyYW0+CjwvcGFyYW1zPgo8L21ldGhvZENhbGw+Cg==
headers:
Accept-Encoding: [gzip]
Content-Length: ['739']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
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
q+9tYOAAAA==
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Content-Encoding: [gzip]
Content-Length: ['2401']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:54:08 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [lighttpd/1.4.35]
Set-Cookie: [PHPSESSID=kv18go15rf5o3qpjitt8sa8q34; path=/; domain=.opensubtitles.org]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5Eb3dubG9hZFN1
YnRpdGxlczwvbWV0aG9kTmFtZT4KPHBhcmFtcz4KPHBhcmFtPgo8dmFsdWU+PHN0cmluZz5rdjE4
Z28xNXJmNW8zcXBqaXR0OHNhOHEzNDwvc3RyaW5nPjwvdmFsdWU+CjwvcGFyYW0+CjxwYXJhbT4K
PHZhbHVlPjxhcnJheT48ZGF0YT4KPHZhbHVlPjxzdHJpbmc+MTk1Mzc2NzY1MDwvc3RyaW5nPjwv
dmFsdWU+CjwvZGF0YT48L2FycmF5PjwvdmFsdWU+CjwvcGFyYW0+CjwvcGFyYW1zPgo8L21ldGhv
ZENhbGw+Cg==
headers:
Accept-Encoding: [gzip]
Content-Length: ['292']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA4Sdx5LzXHed576KrzRF2cip6rNcyAARCSLPkHPOuHrjlX/ZsuTQkybZRDjn7L3W
s9gk+Pd/u/ruryNf1noc/us/wf8F+qe/8iEds3oo/+s/7Vvxn6l/+m///J/+7vOtGjM7X6dxWPP3
gSle4n795//01/+49d746+8j7vb8z62//l63ZU+3f7n917txn+TL/7jz199D3Of/vG7xtq9/g/9y
5x9/+F+b/2MP7zn8MwJBf5nq3+A/7v7jqeC/ee7f4L/d///pYFm8xf+vQ8XLEt//eu+vv/88/X/e
+3fP/fdj+8dD/9tB//o3h66zdU+2euvyou7y/+0k/i+7/zdjh2kcJQmSwKF/N/6//uMs/OtD//FM
/u8n9x/m5f9/SjK2Ksy//qAIfeNKe+FCt4+pAtay4vhYrRTYSUHpoc1urAqYozGsKOq13f82FLOH
qs8DMTcEWql2MQF6qxfAMXCPYrmbibfFkDbgE3rUZAbyEal1FRNKkJFraV72ZCaGiUIanPhlIvWl
RfpLd/sPT3dyBkGS9rNV2gAioemPeVx00O88aGCITGEFiedi50+IGIF54jgwYcyUdYEBGyVp4ZFA
gU6gda3isl9rIWOIQDY4TQNrPwzwz95hOoii7CHpJN8hCgS8O0QVVMsLP7hptNP1EcR5qsd+tt6h
Augo2SV4UdHMR4YWDOXo22zi6GfHCGpHvQBQLtSL0eU7kRRe5AMaCEQDGnOEAUTQo/uyZ5U5A0hH
e3fvJI5YgkRCGeq7vs+eEzt1+VSQM9uiPUdKk7fSoiDxK1BM7uMG3y7ftz/bUDhBTyD3xwCrhgYK
790IdSMcSO2CPPPr6CZplWObjgAyXuuIRvadJHGa1SlMLrGFInnLkjsQ5XDpJp5VJHcebkCyoHPr
SzqWqTSFNX2Eq0MIWuti+A5ijDoAE8HM70If7LijBLDjgAlJeAFPOKh4NNz4IX0vUL7erpDnTbUW
zWIdJjIM5I/dAn5OGrwgs9QYDg/daY/0k32zOG70hgOnD9XaKIvPWCzPducxc/wB1JU62tI8xiDF
gxYbTNq6AG/NgLdki5s4LpnfOwoNDpKiDobSUsNpdblTx+0Rvr3dFQskwEOFI+LT/mja6kiT6jSe
WL4J3wB5EqLEreEFDQWA5SH0Um8ViKNfLLJu1gtriVsVvEgIcjTSvgvqu1bP1Mczo8YHiCCTcTVJ
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
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Content-Encoding: [gzip]
Content-Length: ['33165']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:54:08 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [lighttpd/1.4.35]
Set-Cookie: [PHPSESSID=kv18go15rf5o3qpjitt8sa8q34; path=/; domain=.opensubtitles.org]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5Mb2dPdXQ8L21l
dGhvZE5hbWU+CjxwYXJhbXM+CjxwYXJhbT4KPHZhbHVlPjxzdHJpbmc+a3YxOGdvMTVyZjVvM3Fw
aml0dDhzYThxMzQ8L3N0cmluZz48L3ZhbHVlPgo8L3BhcmFtPgo8L3BhcmFtcz4KPC9tZXRob2RD
YWxsPgo=
headers:
Accept-Encoding: [gzip]
Content-Length: ['176']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA4WQTQ6CMBCF95yi6V5ajAsXQzmACxNvUOioJLQl/SEe3wJNIMbo7nudN/OmA81L
D2RC53tralqVnBI0nVW9edQ0hvvhTBtRgMbwtOqGfrTGY3oYpZPai4KslIDAJIeIMxHwwcUuLExS
s27RrYKAkRqFDzJED2wRubC15wlpB3HknFwvwLLMVrbzAtvP/xqGnTXqZ5qysR1Q8JKfKmBZ/Qtb
tsrf3FzA8kUy+Jk+7/cGaUzqgngBAAA=
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Content-Encoding: [gzip]
Content-Length: ['194']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:54:08 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [lighttpd/1.4.35]
Set-Cookie: [PHPSESSID=kv18go15rf5o3qpjitt8sa8q34; path=/; domain=.opensubtitles.org]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5jbG9zZTwvbWV0
aG9kTmFtZT4KPHBhcmFtcz4KPC9wYXJhbXM+CjwvbWV0aG9kQ2FsbD4K
headers:
Accept-Encoding: [gzip]
Content-Length: ['99']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA4WQTQ6CMBCF95xiwl6KCQtMhnoCN96g0EFJaEv6Qzy+BZpAjNHd92b65k0Hry81
wkzWDUY3+bkocyDdGTnoR5MH35/q/MozVOSfRt7JTUY7ioVJWKEcz2CjCICzGAMtBOi8DZ1fGaJZ
tWQ3AaiFIu688MEhW0Vq7PY0Ie7Aq/ICtzUctPHQm6AlstRMRnZwIjumfY2mzmj5M1ua0I7Ey6Ks
amRJ/Qtbt0qf3l8hS/dJ4Bb6vOYb0rW33YYBAAA=
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Content-Encoding: [gzip]
Content-Length: ['200']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:54:08 GMT']
Server: [lighttpd/1.4.35]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
version: 1
@@ -0,0 +1,186 @@
interactions:
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5Mb2dJbjwvbWV0
aG9kTmFtZT4KPHBhcmFtcz4KPHBhcmFtPgo8dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVl
Pgo8L3BhcmFtPgo8cGFyYW0+Cjx2YWx1ZT48c3RyaW5nPjwvc3RyaW5nPjwvdmFsdWU+CjwvcGFy
YW0+CjxwYXJhbT4KPHZhbHVlPjxzdHJpbmc+ZW5nPC9zdHJpbmc+PC92YWx1ZT4KPC9wYXJhbT4K
PHBhcmFtPgo8dmFsdWU+PHN0cmluZz5zdWJsaW1pbmFsIHYxLjA8L3N0cmluZz48L3ZhbHVlPgo8
L3BhcmFtPgo8L3BhcmFtcz4KPC9tZXRob2RDYWxsPgo=
headers:
Accept-Encoding: [gzip]
Content-Length: ['317']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA6WRQY7CMAxF95wi6h4SiipRyaQHmAXS3CBtPVBonE6dRHP8KSUSaDQCJHbPlr//
lw3Vj+1FxJE7R7tsvVKZQGpc29FhlwX/tdxmlV6ARX907Sfy4IhxagxmNJb1QlxpAgHR9AEvJID9
GBo/s5jEtsbxWgggY1F7d0YCOXPq39RpwRRBrw9uKDex+46+3B7JbGjITzlTLECmkSSXd3qQ95b/
+bM3PvALAXKlxP7jTTNsHLUP3VoX6h61WqmiBJmqZ2ZzqnTm2xTI9JEEfKG///sFGksCTvgBAAA=
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Content-Encoding: [gzip]
Content-Length: ['227']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:54:07 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [lighttpd/1.4.35]
Set-Cookie: [PHPSESSID=1gop93viqvt98hna3np2j2snv5; path=/; domain=.opensubtitles.org]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5TZWFyY2hTdWJ0
aXRsZXM8L21ldGhvZE5hbWU+CjxwYXJhbXM+CjxwYXJhbT4KPHZhbHVlPjxzdHJpbmc+MWdvcDkz
dmlxdnQ5OGhuYTNucDJqMnNudjU8L3N0cmluZz48L3ZhbHVlPgo8L3BhcmFtPgo8cGFyYW0+Cjx2
YWx1ZT48YXJyYXk+PGRhdGE+Cjx2YWx1ZT48c3RydWN0Pgo8bWVtYmVyPgo8bmFtZT5zZWFzb248
L25hbWU+Cjx2YWx1ZT48aW50PjI8L2ludD48L3ZhbHVlPgo8L21lbWJlcj4KPG1lbWJlcj4KPG5h
bWU+cXVlcnk8L25hbWU+Cjx2YWx1ZT48c3RyaW5nPk1hcnZlbHMgQWdlbnRzIG9mIFMuSC5JLkUu
TC5ELjwvc3RyaW5nPjwvdmFsdWU+CjwvbWVtYmVyPgo8bWVtYmVyPgo8bmFtZT5lcGlzb2RlPC9u
YW1lPgo8dmFsdWU+PGludD42PC9pbnQ+PC92YWx1ZT4KPC9tZW1iZXI+CjxtZW1iZXI+CjxuYW1l
PnN1Ymxhbmd1YWdlaWQ8L25hbWU+Cjx2YWx1ZT48c3RyaW5nPmh1bjwvc3RyaW5nPjwvdmFsdWU+
CjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPgo8L2RhdGE+PC9hcnJheT48L3ZhbHVlPgo8L3Bh
cmFtPgo8L3BhcmFtcz4KPC9tZXRob2RDYWxsPgo=
headers:
Accept-Encoding: [gzip]
Content-Length: ['599']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA+1cW3ObOBR+769gsjP7hhBXg5e6E8fOxNPcNs52Z/dNRsJmy8VF4CT99SsIThzH
LpFttWyXyUwsgZC+czjn6Ej6BvfDfRRKC5LSIInfH6kAHkkk9hIcxNP3R3nmy/bRh947NyLZLME3
hM6TmBJ2YY5SFNHeO+mxxAqSu0BhToqS5NIszb2sLEvs4WhC0seK5MYoIj2aoSynrlJWqhvPj1c9
MAw9DULp6qOrVNWqqbLS1lVW+980GEYZ+tZQKE3Rw7ImuUXzp9pa23XZqksvBpVWhr5AmTcjuP/w
YvwtPa+I7edhmJH7bE1w6bX4y0uvIWxHNRqM88lFsgjIaRASTmhQDKYSzhmiswbB6T9kZBx8bZKG
boOIXIybAag0oyzIwl3MSHVMw7AMA+piwDFoBapLVuZEdoHSBQkpOJ6SOKMg8cEYnIERGIJzMABj
qA2hBY7BaYq8LE8JBmdJTgnoaHAO/hz25QFrNjCByh7SLEPujwFNBTkyE/KYgUDhyYBX/cIA7eAw
huVo4sxgl6Ci+56OPTwhHadj+L6NNYItjExj4qsqFqe8c0SzW273hl1D7YpypGcv54Rl2rbpOI4Y
VH9Qko54jV5QHCzfWzzN0ZRwQ5rlsbj4l6QRyjgBiYxV4zxqUKA6zllOm54kUcTiPB8q5fBgMB6g
jNfFNKgasqrK0JZYENAdFgeEqauPcGPc7QZlrFteOEAcoEFyF4cJwvSE15R6qmkJipFlwnhDQoLo
LnmQdPBESKCYp9e8s6ZmAgiFZcYlKF5LsI2OZgtFNIrwhDc5gx3btEWuaXawzV9/0Y3fHu1SSnxp
1S7LW9Kx9GSWUmmWgvEPecPRgaeQEshfBKU7zCACVVPY207B2gaCYBV5EUGlYTRjOisy2cvA+8zv
BQc2odH4ytId7vxVjFaWCfUOseEsj6coDZC4xLrKGWkzDKhY4jLHZ/2OojkKGmXYNyj+/GNTa5IG
hI5ZCpTEvKFR0OsqEQ3nAU0wr2lbAkP1xyDmNRyyFEKUWTdlsVi+stHFoH+NUu7FYk/TLcO0RZlT
PhlWBzacsE6uVc0U5Pu/5yR9uC5OhkhGUp5AuXa0smWUp4HoNs/eMsSK/JtfyGbptyigDt2XQg07
gavWXtLmHFc8crI1PtVj3xylDgqP5pOwyhCCTVGrHuS2jTdOmGUf6zZ7GPe5zIu7zZjLV7Y4zgPe
Kb03y7J5V1FwCJI5iWm1nUxBkk4VEiu46lnxg5CwH5p6MpoHyiL15YlqOLBj2Lal0ADL6jSZO/oi
+LLIHHsWIz2ea/9oNF6YyvOBEph+FaOFv4P5d9ACu7OmBB050Peh6ut1ShC65748B6C7C393d7dZ
+qcLSxHqJEVlYJQTX6byTA5kIocylpHsL5f98qxY9st7LVBee/er51p+wBq0lh/wIyH9XPwAk/0J
3Afaix+wJTWTZEm7hxb7ebUFCc4Gt58e/w0/XYFZ3hIDasCYmgXNJhEDUMdCnmVAn0CiWr6jG7aF
fa2jG46DVGvSPGIA7JqC0oE9iAEdS7UEGVpLDKgH1RID/h/EACjrUFLtrqZ2VUHnii0xQBgxQDMN
kfu9+xMD9s2AGkUHgC0b4C2oWjZAywbYGVHLBqgF1LIBWjZAywYQlk+3bIB6SC0boAZKywZo2QAt
G+Ct2Fs2QMsGeAFqDzaA7XiOYUwmRH0TG6A8Pvrp2AC2bxhex3LUWkqE0I3278UGKEX4j7ABXGX1
4wGusvplgRdt6z9aQImXxPibn0jACYt7pNi5sliQrWp1g60K8dzKVarPOFQFWpTWP/rwL7cfifYt
QgAA
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Content-Encoding: [gzip]
Content-Length: ['1371']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:54:07 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [lighttpd/1.4.35]
Set-Cookie: [PHPSESSID=1gop93viqvt98hna3np2j2snv5; path=/; domain=.opensubtitles.org]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5Mb2dPdXQ8L21l
dGhvZE5hbWU+CjxwYXJhbXM+CjxwYXJhbT4KPHZhbHVlPjxzdHJpbmc+MWdvcDkzdmlxdnQ5OGhu
YTNucDJqMnNudjU8L3N0cmluZz48L3ZhbHVlPgo8L3BhcmFtPgo8L3BhcmFtcz4KPC9tZXRob2RD
YWxsPgo=
headers:
Accept-Encoding: [gzip]
Content-Length: ['176']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA4WQTQ6CMBCF95yiYS+trFwM5QAuTLxBoaOS0Nb0h3h8C0wCMUZ33+u8mTcdaF9m
ZBP6MDjblMdKlAxt7/Rg702Z4u1wKltZgMH4cPqK4elswPzwVF6ZIAu2UgYGkxoTzsQgRJ/6uDDL
zaZDvwoGVhmUIaqYAvBFUGFrpwl5B1kLwS5n4CTJynde4Pv5X8Owd1b/TNMudSNKUYm6Bk7qX9iy
FX1zcwGnixCEmT7v9wZFg1bKeAEAAA==
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Content-Encoding: [gzip]
Content-Length: ['193']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:54:07 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [lighttpd/1.4.35]
Set-Cookie: [PHPSESSID=1gop93viqvt98hna3np2j2snv5; path=/; domain=.opensubtitles.org]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5jbG9zZTwvbWV0
aG9kTmFtZT4KPHBhcmFtcz4KPC9wYXJhbXM+CjwvbWV0aG9kQ2FsbD4K
headers:
Accept-Encoding: [gzip]
Content-Length: ['99']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA4WQTQ6CMBCF95xiwl4KiQtMhnoCN96g0EFJaEv6Qzy+BZpAjNHd92b65k0Hry81
wkzWDUY3eVWUOZDujBz0o8mD7091fuUZKvJPI+/kJqMdxcIkrFCOZ7BRBMBZjIEWAnTehs6vDNGs
WrKbANRCEXde+OCQrSI1dnuaEHfg5/ICtzUctPHQm6AlstRMRnZwIjumfY2mzmj5M1ua0I7Ey6Ks
amRJ/Qtbt0qf3l8hS/dJ4Bb6vOYbaMBv3YYBAAA=
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Content-Encoding: [gzip]
Content-Length: ['200']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:54:07 GMT']
Server: [lighttpd/1.4.35]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
version: 1
@@ -0,0 +1,206 @@
interactions:
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5Mb2dJbjwvbWV0
aG9kTmFtZT4KPHBhcmFtcz4KPHBhcmFtPgo8dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVl
Pgo8L3BhcmFtPgo8cGFyYW0+Cjx2YWx1ZT48c3RyaW5nPjwvc3RyaW5nPjwvdmFsdWU+CjwvcGFy
YW0+CjxwYXJhbT4KPHZhbHVlPjxzdHJpbmc+ZW5nPC9zdHJpbmc+PC92YWx1ZT4KPC9wYXJhbT4K
PHBhcmFtPgo8dmFsdWU+PHN0cmluZz5zdWJsaW1pbmFsIHYxLjA8L3N0cmluZz48L3ZhbHVlPgo8
L3BhcmFtPgo8L3BhcmFtcz4KPC9tZXRob2RDYWxsPgo=
headers:
Accept-Encoding: [gzip]
Content-Length: ['317']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA6WRTY7CMAyF95wi6n5I6IjCwoQDsBhpbhBaFyj5KbWDOD6hRAKNRsxI7D5bfnnP
MawvzoozDnQIflXMpqoQ6OvQHPxuVURuP5bFWk/AIe9D843UB0+YGr0ZjCM9EXdKIOBsbMQbCSAe
Ys0jiyR2WxzuhQBvHGoOR/QgR879hzo/kCJoE7tqx1U3X/Ylm1M1a+28pUVnP0HmkSyXT3qQz5a/
+RMbjvSPAKVS4mvzphnWwTcv3ZoQtxa1mqoybZarv8zGVPmbH1Mg80Uy0I1+3u8KdB9H3fgBAAA=
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Content-Encoding: [gzip]
Content-Length: ['227']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:54:05 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [lighttpd/1.4.35]
Set-Cookie: [PHPSESSID=auj6gt6j58p2taq61fl5fs7jl3; path=/; domain=.opensubtitles.org]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5TZWFyY2hTdWJ0
aXRsZXM8L21ldGhvZE5hbWU+CjxwYXJhbXM+CjxwYXJhbT4KPHZhbHVlPjxzdHJpbmc+YXVqNmd0
Nmo1OHAydGFxNjFmbDVmczdqbDM8L3N0cmluZz48L3ZhbHVlPgo8L3BhcmFtPgo8cGFyYW0+Cjx2
YWx1ZT48YXJyYXk+PGRhdGE+Cjx2YWx1ZT48c3RydWN0Pgo8bWVtYmVyPgo8bmFtZT5tb3ZpZWhh
c2g8L25hbWU+Cjx2YWx1ZT48c3RyaW5nPjViOGY4ZjRlNDFjY2IyMWU8L3N0cmluZz48L3ZhbHVl
Pgo8L21lbWJlcj4KPG1lbWJlcj4KPG5hbWU+c3VibGFuZ3VhZ2VpZDwvbmFtZT4KPHZhbHVlPjxz
dHJpbmc+ZnJlLGdlcjwvc3RyaW5nPjwvdmFsdWU+CjwvbWVtYmVyPgo8bWVtYmVyPgo8bmFtZT5t
b3ZpZWJ5dGVzaXplPC9uYW1lPgo8dmFsdWU+PHN0cmluZz43MDMzNzMyNzE0PC9zdHJpbmc+PC92
YWx1ZT4KPC9tZW1iZXI+Cjwvc3RydWN0PjwvdmFsdWU+Cjx2YWx1ZT48c3RydWN0Pgo8bWVtYmVy
Pgo8bmFtZT5pbWRiaWQ8L25hbWU+Cjx2YWx1ZT48aW50Pjc3MDgyODwvaW50PjwvdmFsdWU+Cjwv
bWVtYmVyPgo8bWVtYmVyPgo8bmFtZT5zdWJsYW5ndWFnZWlkPC9uYW1lPgo8dmFsdWU+PHN0cmlu
Zz5mcmUsZ2VyPC9zdHJpbmc+PC92YWx1ZT4KPC9tZW1iZXI+Cjwvc3RydWN0PjwvdmFsdWU+Cjwv
ZGF0YT48L2FycmF5PjwvdmFsdWU+CjwvcGFyYW0+CjwvcGFyYW1zPgo8L21ldGhvZENhbGw+Cg==
headers:
Accept-Encoding: [gzip]
Content-Length: ['739']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
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
OcjXYOAAAA==
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Content-Encoding: [gzip]
Content-Length: ['2401']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:54:05 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [lighttpd/1.4.35]
Set-Cookie: [PHPSESSID=auj6gt6j58p2taq61fl5fs7jl3; path=/; domain=.opensubtitles.org]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5Mb2dPdXQ8L21l
dGhvZE5hbWU+CjxwYXJhbXM+CjxwYXJhbT4KPHZhbHVlPjxzdHJpbmc+YXVqNmd0Nmo1OHAydGFx
NjFmbDVmczdqbDM8L3N0cmluZz48L3ZhbHVlPgo8L3BhcmFtPgo8L3BhcmFtcz4KPC9tZXRob2RD
YWxsPgo=
headers:
Accept-Encoding: [gzip]
Content-Length: ['176']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA4WQTQ6DIBCF956CsK+gqy5GPEAXTXoDlGlrImD4MT1+UUk0TdPuvse8mTcMtC89
khmdH6xpaFVyStD0Vg3m0dAY7qczbUUBGsPTqhv6yRqP6WGSTmovCrJRAgKzHCMuRMAHF/uwMknN
ukO3CQJGahQ+yBA9sFXkwt6eJ6QdRM05uV6AZZmt7OAFdpz/NQx7a9TPNGVjN6LgJa8rYFn9C1u3
yt/cXcDyRTL4hT7v9wZFFXqCeAEAAA==
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Content-Encoding: [gzip]
Content-Length: ['193']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:54:05 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [lighttpd/1.4.35]
Set-Cookie: [PHPSESSID=auj6gt6j58p2taq61fl5fs7jl3; path=/; domain=.opensubtitles.org]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5jbG9zZTwvbWV0
aG9kTmFtZT4KPHBhcmFtcz4KPC9wYXJhbXM+CjwvbWV0aG9kQ2FsbD4K
headers:
Accept-Encoding: [gzip]
Content-Length: ['99']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA4WQSw6DMAxE95zCYl+SSl1QyYQTdNMbBGJaJJKgfFCPXz6RQFXV7t7YGY9jrF96
gImc762p8nPBcyDTWtWbR5XH0J3KvBYZagpPq+7kR2s8zYVROqm9yGCjGQAnOURaCNAHF9uwMsxm
3ZDbBKCRmoQPMkSPbBWpsdvThHkHceFXuK3hYGyAzkajkKVmMrKDE9kx7Ws0tdaon9nKxmYgwQvO
S2RJ/Qtbt0qf3l8hS/dJ4Bf6vOYbJSaHa4YBAAA=
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Content-Encoding: [gzip]
Content-Length: ['200']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:54:05 GMT']
Server: [lighttpd/1.4.35]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
version: 1
@@ -0,0 +1,187 @@
interactions:
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5Mb2dJbjwvbWV0
aG9kTmFtZT4KPHBhcmFtcz4KPHBhcmFtPgo8dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVl
Pgo8L3BhcmFtPgo8cGFyYW0+Cjx2YWx1ZT48c3RyaW5nPjwvc3RyaW5nPjwvdmFsdWU+CjwvcGFy
YW0+CjxwYXJhbT4KPHZhbHVlPjxzdHJpbmc+ZW5nPC9zdHJpbmc+PC92YWx1ZT4KPC9wYXJhbT4K
PHBhcmFtPgo8dmFsdWU+PHN0cmluZz5zdWJsaW1pbmFsIHYxLjA8L3N0cmluZz48L3ZhbHVlPgo8
L3BhcmFtPgo8L3BhcmFtcz4KPC9tZXRob2RDYWxsPgo=
headers:
Accept-Encoding: [gzip]
Content-Length: ['317']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA6WRQY7CMAxF95wi6h4SmBHMwoQDsECaG6SNC4UmLolTcXxKiQQajQak2T1b/v5f
NmwurhU9htiQXxfzmSoE+ops4/frInE9/So2egIO+UD2G2NHPuLQ6EwwLuqJuNMAAnrTJryRgMgh
VTyyGMSuxHAvBHjjUDOd0IMcOfcf6rxgiKCroMpjs6J6aXt16OnMp2XdJT5+gswjWS6f9CCfLX/z
j2w4xTcCLJQSu+0/zbAib/90s5TKFrWaqY8FyFy9MhtT5TM/pkDmj2SIN/r5vys9Mxtb+AEAAA==
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Content-Encoding: [gzip]
Content-Length: ['226']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:54:05 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [lighttpd/1.4.35]
Set-Cookie: [PHPSESSID=cr0bji7of6dv0hvoqtk6fputj4; path=/; domain=.opensubtitles.org]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5TZWFyY2hTdWJ0
aXRsZXM8L21ldGhvZE5hbWU+CjxwYXJhbXM+CjxwYXJhbT4KPHZhbHVlPjxzdHJpbmc+Y3IwYmpp
N29mNmR2MGh2b3F0azZmcHV0ajQ8L3N0cmluZz48L3ZhbHVlPgo8L3BhcmFtPgo8cGFyYW0+Cjx2
YWx1ZT48YXJyYXk+PGRhdGE+Cjx2YWx1ZT48c3RydWN0Pgo8bWVtYmVyPgo8bmFtZT5xdWVyeTwv
bmFtZT4KPHZhbHVlPjxzdHJpbmc+ZW5kZXJzLmdhbWUuMjAxMy43MjBwLmJsdXJheS54MjY0LXNw
YXJrcy5ta3Y8L3N0cmluZz48L3ZhbHVlPgo8L21lbWJlcj4KPG1lbWJlcj4KPG5hbWU+c3VibGFu
Z3VhZ2VpZDwvbmFtZT4KPHZhbHVlPjxzdHJpbmc+Z2VyPC9zdHJpbmc+PC92YWx1ZT4KPC9tZW1i
ZXI+Cjwvc3RydWN0PjwvdmFsdWU+CjwvZGF0YT48L2FycmF5PjwvdmFsdWU+CjwvcGFyYW0+Cjwv
cGFyYW1zPgo8L21ldGhvZENhbGw+Cg==
headers:
Accept-Encoding: [gzip]
Content-Length: ['478']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA+2cW3ObOBTH3/spmLzsExdxx+Om08RJN5OmTeN0ZnffBBIODRcXgdN09sOvwDix
HbtYJMpSj94Ag/Q/R+Lo6PzGDN/9SGJphnMSZenbA6BoBxJOgwxF6eTtQVmEsnvw7vDNMMHFTYau
MJlmKcH0whTmMCGHb6T5ET2QhjMYl7g6koakyMugqI8l+nDi43x+Ig1TmOBDUsCiJEO1Pml+eHy8
aYFqONQ1Tfp8PlSb0+ZWdeneobrc/qbOECzgr7qCeQ7vF2fSsLr94Wzt3nXbmksrnUpLXV/AIrjB
6Oh+pf8tLS+ZHZZxXOAfxZrh0lPzF5eeStiu6mw0Lv2LbBbh0yjGjNI0PppqOX9CctMjOUf3BR5H
P/vkoesowRfjfgiqp1ERFXGXaQQ8ywSWY3guH3FUWqXqEz1mVIZTROPhhD4iA83VpgrJOb2HVOP7
oChhfDxi9R43QR3mu6tbQOcmqENM8EFgQy90nSAMAmA62DF9YFqaYQaa6eqYm9aPkBTXzG8nGFjG
wOI0pI8vKaMsy3KAq3Ma168E52fMk96yDQtYHEcvnZRwgpmFTXDOL4hleQILRkE8I9a4THoUrt6X
NDHNj7MkwSmjl9SXF4PQCBasL5quAVPWDFmzJeAMDHugO9zcdQRRP3IHquUKFrRZVjkKP0Gj7C6N
M4jIMetUOgS2bnDM+q5wjCHpksyc1MmM8oE+o4wgUSZ5RghWxtMIx8oHTGNLqow+KvNE5ygur+C9
8kO3Tfnkry9fo3F0fcLRrNNL1rVSNxTPsXmtlLUo5pEHdI/KVdFZgnxWVY4BgMkp7Naius7FP4j0
oX6Uq7IT1sDywotBLeRvDHP2tYBnHKlmUqewayv81qRTDIsyxz1ZmKrM9FMU3HaY3ym+u41SRDgF
g/Fn2/AYJSFOL9oiVe7gpfmiw202Nakg6cdsqvavNArQds+SKYx6NcuvYHrLqKbIS1JUNnDxFc4j
TMY00cnSfnhpruhkGpEM9akIeE6jDKOcZJ7a8JrjfdkQ1gN2djE6uoQ584aQYxA4aZgKo6Cv16cy
p/rolxLn95cVu8EF3SEwCFuDH1t6eejoe9XRhua39LBk/bwQq1SVWKVKjBRHp5sUPy7zxSaFTGF+
S5TkdrbRSZv9tMVVbXaQ0o+bVS/a9Pa127OtTMQos25jfRBeZj58Kqtfe/PWLDbkHyPmleqmKKYD
VUWxkk1xSpoSKFGyfKLiVEVNy2oY0Z01UkkeyHAaqbM8lDG0oKuHQPNUEiE5yDX/W+RkoY1m2s0s
+17c2uG0LL6Z6iPDUCY/+Xjhn2j6Cl6gv6w5wdYswwcWdsI2J3CtEy9q16S78Xd3d5utf7iwMKHN
0joeyUSu0dCzMuunr/CT5wR3XpMmuPP/KWnPuLPtWJyqiN258y6l2joD2limFZS6RYxr2obZJ0od
ADfAoYk9hFzdAwggx3M9Nwh1Pwg0g1/Bbd8oNfA4jWsnSs0vHRZ8ehdBgk/z49M0COjOwBJ8+nfj
07rGacxeAU9vz3kEmhZoelWWQNO7CRFoul3WHqHpF55CAkW3y9o/FM0pZHdD0S+dHAv23C5JsOf2
ARPseQdRgj0L9rxsnmDPD9g10KGP7BD7u7HnimPsHXvWQGCg0AJmK5HlWv19PfZMTRDsWbDnXsgR
7PmXgp7Nnk3T4Fb9ehn2XKc7T/8QNL58f3U+Fpi5RYwLXMBxB88eLEy6vlieHxq2hUzXt33T9TDA
mhlqjq77vcTMBqeNR3fM7NqmY3sCMwvMLDBzq5jumBlosq5Juj7Q3AEQmPl3w8zA4cn1umNmaef8
pldImY4yZ34riHKbLEGUdxMiiHK7LEGUBVF+1uzZM6LMcVYLorxFkSDKLV4SRLnVQR2J8vEl0C39
XxrrZde1PFnAZQGXV68KuNwq6hlwOQw8P/SRCVtp4yOo2Du4HFq6ZnpeCFsJO9ea7yvB5bkJfYLL
Q3X5+9pDdfnj2yv3rra+6skmcOEgqz+3tOS9Vb8NUUaDG64KKSbd0zVnbZ0tG/F411BtvnTeHJDq
aP276P8B6iSi8VBdAAA=
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Content-Encoding: [gzip]
Content-Length: ['1553']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:54:06 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [lighttpd/1.4.35]
Set-Cookie: [PHPSESSID=cr0bji7of6dv0hvoqtk6fputj4; path=/; domain=.opensubtitles.org]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5Mb2dPdXQ8L21l
dGhvZE5hbWU+CjxwYXJhbXM+CjxwYXJhbT4KPHZhbHVlPjxzdHJpbmc+Y3IwYmppN29mNmR2MGh2
b3F0azZmcHV0ajQ8L3N0cmluZz48L3ZhbHVlPgo8L3BhcmFtPgo8L3BhcmFtcz4KPC9tZXRob2RD
YWxsPgo=
headers:
Accept-Encoding: [gzip]
Content-Length: ['176']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA4WQTQ6CMBCF95yi6V5aZeNiKAdwYeINCh2VhLakP8TjW6AJxBjdfa/zZt50oHnp
gUzofG9NTY8lpwRNZ1VvHjWN4X4400YUoDE8rbqhH63xmB5G6aT2oiArJSAwySHiTAR8cLELC5PU
rFt0qyBgpEbhgwzRA1tELmzteULaQZw4J9cLsCyzle28wPbzv4ZhZ436maZsbAcUvORVBSyrf2HL
VvmbmwtYvkgGP9Pn/d43FXXyeAEAAA==
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Content-Encoding: [gzip]
Content-Length: ['193']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:54:06 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [lighttpd/1.4.35]
Set-Cookie: [PHPSESSID=cr0bji7of6dv0hvoqtk6fputj4; path=/; domain=.opensubtitles.org]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5jbG9zZTwvbWV0
aG9kTmFtZT4KPHBhcmFtcz4KPC9wYXJhbXM+CjwvbWV0aG9kQ2FsbD4K
headers:
Accept-Encoding: [gzip]
Content-Length: ['99']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA4WQTQ6CMBCF95xiwl4KiQtJhnoCN96g0EFJaEv6Qzy+BZpAjNHd92b65k0Hry81
wkzWDUY3eVWUOZDujBz0o8mD70+X/MozVOSfRt7JTUY7ioVJWKEcz2CjCICzGAMtBOi8DZ1fGaJZ
tWQ3AaiFIu688MEhW0Vq7PY0Ie7Az2UNtzUctPHQm6AlstRMRnZwIjumfY2mzmj5M1ua0I7Ey6Ks
amRJ/Qtbt0qf3l8hS/dJ4Bb6vOYbV7CkU4YBAAA=
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Content-Encoding: [gzip]
Content-Length: ['200']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:54:06 GMT']
Server: [lighttpd/1.4.35]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
version: 1
@@ -0,0 +1,161 @@
interactions:
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5Mb2dJbjwvbWV0
aG9kTmFtZT4KPHBhcmFtcz4KPHBhcmFtPgo8dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVl
Pgo8L3BhcmFtPgo8cGFyYW0+Cjx2YWx1ZT48c3RyaW5nPjwvc3RyaW5nPjwvdmFsdWU+CjwvcGFy
YW0+CjxwYXJhbT4KPHZhbHVlPjxzdHJpbmc+ZW5nPC9zdHJpbmc+PC92YWx1ZT4KPC9wYXJhbT4K
PHBhcmFtPgo8dmFsdWU+PHN0cmluZz5zdWJsaW1pbmFsIHYxLjA8L3N0cmluZz48L3ZhbHVlPgo8
L3BhcmFtPgo8L3BhcmFtcz4KPC9tZXRob2RDYWxsPgo=
headers:
Accept-Encoding: [gzip]
Content-Length: ['317']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA6WRTY7CMAyF95wi6n5IiAR0YcIBWIw0N0hTAxXND4mD5viUEgmEECCx+2z5+T3Z
sP63PTthTJ13q2o2FRVDZ3zbud2qyrT9qau1moBF2vv2D1PwLuHQCDpqm9SEXWkABifdZ7wQg0Qx
GxqZDWLbYLwWDJy2qMgf0AEfufRv6rJgiKAoSLld7IKp93Np9LKJdTczFI5z4GWkyPmdHvi95TP/
RJpy+iCAFIL9br40Q+Nd+9Kt9bnpUYmpkMBL8c5rDFWufJsCXh5SIF3o8X1nyMpjPfcBAAA=
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Content-Encoding: [gzip]
Content-Length: ['224']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:53:58 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [lighttpd/1.4.35]
Set-Cookie: [PHPSESSID=tp22f6gpc8h52ca7br8i1ctpq5; path=/; domain=.opensubtitles.org]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5Ob09wZXJhdGlv
bjwvbWV0aG9kTmFtZT4KPHBhcmFtcz4KPHBhcmFtPgo8dmFsdWU+PHN0cmluZz50cDIyZjZncGM4
aDUyY2E3YnI4aTFjdHBxNTwvc3RyaW5nPjwvdmFsdWU+CjwvcGFyYW0+CjwvcGFyYW1zPgo8L21l
dGhvZENhbGw+Cg==
headers:
Accept-Encoding: [gzip]
Content-Length: ['181']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA71UQW6DMBC85xUW59Y2hEhFcsgDeqjUDyBjtolVY6fYTtvfF4gVQtKWRI16mzXj
2dld1mz1USu0g8ZKo5dRjGmEQAtTSb1eRt693D9Eq3zGanAbUz2D3RptoT3Y8obXNp+hPWoBYjuu
PHQIMesaL1yPUXu5LqHZB4hpXkNuHXfeMtIH4cNwPSi0HvKEUvT0yEgIA5UccRk51v8uWWXetTK8
KpSspZvKevB9pnYQXCtTclUk6aYYa4+kz9S7A6ldVxMjHRh4ZEwc1/SzEaEkaFfI7XTi0MAswUlK
cTJPcZykd2iBFzGe4zhdnPT4D676VhRiA+K1KD8vtuYtNH0pt/IRujMakzBeXzim+LZDOlh488bx
Cy1k2W1N/N8v249x2KUrV9aCMLr6dVUr40sFOcV0njISoqlkx64GFiPhEQvAduj0yfsC3Y8tfSsF
AAA=
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Content-Encoding: [gzip]
Content-Length: ['344']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:53:58 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [lighttpd/1.4.35]
Set-Cookie: [PHPSESSID=tp22f6gpc8h52ca7br8i1ctpq5; path=/; domain=.opensubtitles.org]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5Mb2dPdXQ8L21l
dGhvZE5hbWU+CjxwYXJhbXM+CjxwYXJhbT4KPHZhbHVlPjxzdHJpbmc+dHAyMmY2Z3BjOGg1MmNh
N2JyOGkxY3RwcTU8L3N0cmluZz48L3ZhbHVlPgo8L3BhcmFtPgo8L3BhcmFtcz4KPC9tZXRob2RD
YWxsPgo=
headers:
Accept-Encoding: [gzip]
Content-Length: ['176']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA4WQQQ6DIBBF956CuK9QV12MeIAumvQGKNPWRKBhwPT4RSXRNE27e5/5M38YaF9m
ZBN6GpxtymMlSoa2d3qw96aM4XY4la0swGB4OH1FejpLmB6eyitDsmArJWAwqTHiTAwo+NiHhVlq
Nh36VTCwyqCkoEIk4IvIha09T0g7yFoIdjkDzzJb+c4LfD//axj2zuqfadrFbkQpKlEDz+Jf1rJU
/uXmAp4PkoFm+jzfG9lJD213AQAA
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Content-Encoding: [gzip]
Content-Length: ['192']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:53:58 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [lighttpd/1.4.35]
Set-Cookie: [PHPSESSID=tp22f6gpc8h52ca7br8i1ctpq5; path=/; domain=.opensubtitles.org]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5jbG9zZTwvbWV0
aG9kTmFtZT4KPHBhcmFtcz4KPC9wYXJhbXM+CjwvbWV0aG9kQ2FsbD4K
headers:
Accept-Encoding: [gzip]
Content-Length: ['99']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA4WQQQ6CMBBF95xiwl5ajQtNhnICN96g0EFJaEtoSzy+UJpAjNHd+zP986eD1Uv3
MNHoOmvK/FjwHMg0VnXmUebBt4dLXokMNfmnVXdygzWO5sIgR6mdyGClGQAn2QdaCND5MTQ+Msxm
XdO4CkAjNQnnpQ8OWRSpsdnThHkHceZXuMVwMNZDa4NRyFIzGdnOiWyf9jWaGmvUz2xlQ92T4AU/
IUviX1ZcKv15e4UsnSeBW+jzmG8XBP1ahQEAAA==
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Content-Encoding: [gzip]
Content-Length: ['199']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:53:58 GMT']
Server: [lighttpd/1.4.35]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
version: 1
@@ -0,0 +1,236 @@
interactions:
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5Mb2dJbjwvbWV0
aG9kTmFtZT4KPHBhcmFtcz4KPHBhcmFtPgo8dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVl
Pgo8L3BhcmFtPgo8cGFyYW0+Cjx2YWx1ZT48c3RyaW5nPjwvc3RyaW5nPjwvdmFsdWU+CjwvcGFy
YW0+CjxwYXJhbT4KPHZhbHVlPjxzdHJpbmc+ZW5nPC9zdHJpbmc+PC92YWx1ZT4KPC9wYXJhbT4K
PHBhcmFtPgo8dmFsdWU+PHN0cmluZz5zdWJsaW1pbmFsIHYxLjA8L3N0cmluZz48L3ZhbHVlPgo8
L3BhcmFtPgo8L3BhcmFtcz4KPC9tZXRob2RDYWxsPgo=
headers:
Accept-Encoding: [gzip]
Content-Length: ['317']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA6WR0WrDMAxF3/sVJu+rvZbSDVT3A/Yw2B84trJkteUQ2Waf3zQ1tIyxDfZ2JHR1
LxIcP4MXBSceIh2ax7VqBJKNbqD3Q5NT9/DUHPUKAqY+ujfkMRLj3BjNZALrlbjSDAKK8RkvJIDT
lG1aWMzi0OJ0LQSQCahTPCGBXLj2b+q6YI6gi7cDtc+8cyMV/7HtOqv63rZFgawjVS7v9CDvLb/z
52RS5j8E2CglXl/+aYY2kvvRzcXcetRqrTZ7kLX6zWxJVc98mwJZP1KBL/T1f2c8Qhe3+AEAAA==
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Content-Encoding: [gzip]
Content-Length: ['226']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:54:02 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [lighttpd/1.4.35]
Set-Cookie: [PHPSESSID=vlcinb9s5dpnvlj3ffc0hhcbv0; path=/; domain=.opensubtitles.org]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5TZWFyY2hTdWJ0
aXRsZXM8L21ldGhvZE5hbWU+CjxwYXJhbXM+CjxwYXJhbT4KPHZhbHVlPjxzdHJpbmc+dmxjaW5i
OXM1ZHBudmxqM2ZmYzBoaGNidjA8L3N0cmluZz48L3ZhbHVlPgo8L3BhcmFtPgo8cGFyYW0+Cjx2
YWx1ZT48YXJyYXk+PGRhdGE+Cjx2YWx1ZT48c3RydWN0Pgo8bWVtYmVyPgo8bmFtZT5tb3ZpZWhh
c2g8L25hbWU+Cjx2YWx1ZT48c3RyaW5nPjViOGY4ZjRlNDFjY2IyMWU8L3N0cmluZz48L3ZhbHVl
Pgo8L21lbWJlcj4KPG1lbWJlcj4KPG5hbWU+c3VibGFuZ3VhZ2VpZDwvbmFtZT4KPHZhbHVlPjxz
dHJpbmc+ZW5nPC9zdHJpbmc+PC92YWx1ZT4KPC9tZW1iZXI+CjxtZW1iZXI+CjxuYW1lPm1vdmll
Ynl0ZXNpemU8L25hbWU+Cjx2YWx1ZT48c3RyaW5nPjcwMzM3MzI3MTQ8L3N0cmluZz48L3ZhbHVl
Pgo8L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1ZT4KPC9kYXRhPjwvYXJyYXk+PC92YWx1ZT4KPC9w
YXJhbT4KPC9wYXJhbXM+CjwvbWV0aG9kQ2FsbD4K
headers:
Accept-Encoding: [gzip]
Content-Length: ['543']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
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
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Content-Encoding: [gzip]
Content-Length: ['4307']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:54:02 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [lighttpd/1.4.35]
Set-Cookie: [PHPSESSID=vlcinb9s5dpnvlj3ffc0hhcbv0; path=/; domain=.opensubtitles.org]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5Mb2dPdXQ8L21l
dGhvZE5hbWU+CjxwYXJhbXM+CjxwYXJhbT4KPHZhbHVlPjxzdHJpbmc+dmxjaW5iOXM1ZHBudmxq
M2ZmYzBoaGNidjA8L3N0cmluZz48L3ZhbHVlPgo8L3BhcmFtPgo8L3BhcmFtcz4KPC9tZXRob2RD
YWxsPgo=
headers:
Accept-Encoding: [gzip]
Content-Length: ['176']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA4WQTQ6CMBCF95yi6V5aXBgXQzmACxNvUOioJLQl/SEe3wJNIMbo7nudN/OmA81L
D2RC53tralqVnBI0nVW9edQ0hvvhTBtRgMbwtOqGfrTGY3oYpZPai4KslIDAJIeIMxHwwcUuLExS
s27RrYKAkRqFDzJED2wRubC15wlpB3HknFwvwLLMVrbzAtvP/xqGnTXqZ5qysR1Q8JJXJ2BZ/Qtb
tsrf3FzA8kUy+Jk+7/cG7GWgnHgBAAA=
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Cache-Control: ['no-store, no-cache, must-revalidate, post-check=0, pre-check=0']
Content-Encoding: [gzip]
Content-Length: ['194']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:54:03 GMT']
Expires: ['Thu, 19 Nov 1981 08:52:00 GMT']
Pragma: [no-cache]
Server: [lighttpd/1.4.35]
Set-Cookie: [PHPSESSID=vlcinb9s5dpnvlj3ffc0hhcbv0; path=/; domain=.opensubtitles.org]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
- request:
body: !!binary |
PD94bWwgdmVyc2lvbj0nMS4wJz8+CjxtZXRob2RDYWxsPgo8bWV0aG9kTmFtZT5jbG9zZTwvbWV0
aG9kTmFtZT4KPHBhcmFtcz4KPC9wYXJhbXM+CjwvbWV0aG9kQ2FsbD4K
headers:
Accept-Encoding: [gzip]
Content-Length: ['99']
Content-Type: [text/xml]
User-Agent: [Python-xmlrpc/3.4]
method: POST
uri: https://api.opensubtitles.org/xml-rpc
response:
body:
string: !!binary |
H4sIAAAAAAAAA4WQTQrCMBCF9z3F0L1NBAWFaXoCN94gbaZaaJKSn+Lx7U+gRUR335vJmzcZrF66
h5Gc76wp82PBcyDTWNWZR5nH0B4ueSUy1BSeVt3JD9Z4mgqDdFJ7kcFKEwCOso80E6APLjZhYZjM
uia3CkAjNQkfZIge2SJSY7OnCdMO4sSvcFvCwdgArY1GIUvNZGQ7J7J92tdoaqxRP7OVjXVPghec
n5El9S9s2Sp9enuFLN0ngZ/p85pvWwiPHoYBAAA=
headers:
Accept-Ranges: [bytes]
Access-Control-Allow-Headers: ['Origin, X-Requested-With, Content-Type, Accept']
Access-Control-Allow-Origin: ['*']
Age: ['0']
Content-Encoding: [gzip]
Content-Length: ['200']
Content-type: [text/xml;charset=UTF-8]
Date: ['Sat, 11 Jul 2015 21:54:03 GMT']
Server: [lighttpd/1.4.35]
Strict-Transport-Security: [max-age=63072000; includeSubdomains; preload]
X-Cache: [MISS]
X-Cache-Backend: [web3]
X-Content-Type-Options: [nosniff]
X-Frame-Options: [DENY]
status: {code: 200, message: OK}
version: 1

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