Compare commits
310 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e0788be5af | |||
| 52709a3e25 | |||
| 25cf0ac996 | |||
| 4c3d7d5b9d | |||
| b4cbfc0de2 | |||
| 600393c12a | |||
| faeeeca39a | |||
| 537d33b66a | |||
| 3933db4936 | |||
| 86c6d2c253 | |||
| 75ffe3767f | |||
| 015b7547db | |||
| 2a6d861968 | |||
| 0f188e30b0 | |||
| 5faf8277f1 | |||
| b86b4f1405 | |||
| 98f903174a | |||
| d8df8a4624 | |||
| 0df19e300f | |||
| b26bf1c470 | |||
| 53cd3f6118 | |||
| c23f955b6c | |||
| 5c5b2656ec | |||
| c6278909ff | |||
| 64d599d6f7 | |||
| 90d638e9c6 | |||
| 1dabbf78b2 | |||
| 58b0b0c756 | |||
| 1426d9d62d | |||
| 85db6c7884 | |||
| 43d02c349f | |||
| c7af4573ca | |||
| 73a217eb1b | |||
| b1854222a0 | |||
| 7cb72b2bb2 | |||
| 00245dd44d | |||
| c1972ab26f | |||
| b86254b0b8 | |||
| 00157ee655 | |||
| 6aaece1c44 | |||
| 6445064836 | |||
| 9d0c9d93a0 | |||
| 01a06166ff | |||
| f41fc2bceb | |||
| 5ffa344f1c | |||
| 31c2b21350 | |||
| b2c6562c64 | |||
| 02a36d9cad | |||
| 5dcb1916b2 | |||
| c5623ec868 | |||
| 1c17c1987f | |||
| b6318bfae0 | |||
| 0e8489951d | |||
| 21d3a1c1bb | |||
| 9055021282 | |||
| 10fcfd21b1 | |||
| c142233ff9 | |||
| e660e47265 | |||
| 40c4c0aeec | |||
| 97c9a7b025 | |||
| 9145f2530b | |||
| a1b073e5d6 | |||
| 7425153760 | |||
| c0836a94a9 | |||
| 9dc24951a2 | |||
| f3eaad8d1c | |||
| effde5014e | |||
| 74c4c06a5c | |||
| f10b7683c9 | |||
| 5e26185c9f | |||
| 2d350f5340 | |||
| f0519bbefb | |||
| 7acfb3f027 | |||
| 24621e15e3 | |||
| 3474b2363f | |||
| 560dea3e3e | |||
| f6e5cf91ab | |||
| 57e8770fda | |||
| 7e8f7e41b5 | |||
| 84d890d7b0 | |||
| e57c90b97e | |||
| 236c43b807 | |||
| bb32c286d9 | |||
| f1d4975079 | |||
| 464b783477 | |||
| c4756030c7 | |||
| bf538fee32 | |||
| cc32c29930 | |||
| 27b8703949 | |||
| 0d9bbff534 | |||
| cad60e73a6 | |||
| 1d14d21684 | |||
| 0733ef7d32 | |||
| 143f872166 | |||
| 95abab3c18 | |||
| 2e5fb46ebc | |||
| 0d11092178 | |||
| 80589f325a | |||
| 0b6b3d0905 | |||
| bc97f772b8 | |||
| efe944a10c | |||
| 9d9aed2d4b | |||
| 9cd8b7d593 | |||
| abfd2361d4 | |||
| b10e616ec2 | |||
| 7dc2a90edc | |||
| cb53199748 | |||
| 7b2402c436 | |||
| 0715437888 | |||
| bea95113e7 | |||
| e73e969f58 | |||
| fd30cf7388 | |||
| fa9792b280 | |||
| e93530c7c7 | |||
| 35d4c37d61 | |||
| 4d61d3fc42 | |||
| a24388137e | |||
| 60c7666610 | |||
| e11f1c4b28 | |||
| e1b32f237c | |||
| fe76634d02 | |||
| b499540bed | |||
| 7b4a9c2060 | |||
| a84cc80a88 | |||
| 241cea9729 | |||
| 4b83ddc63e | |||
| 0b431fbb8d | |||
| 3736d921a1 | |||
| 380fb28d2e | |||
| 64c0ee4ccf | |||
| 5977bf69fb | |||
| 179ae6a24e | |||
| 16942ec4c7 | |||
| 6f5378ea40 | |||
| 02ee2039f4 | |||
| e7f89c1a19 | |||
| be4f9d92eb | |||
| ca63b97e79 | |||
| c1ed4a0232 | |||
| b826a0bf08 | |||
| fd0d87d719 | |||
| 094373f3c1 | |||
| 5dac623c9f | |||
| 57d1e772ec | |||
| 983efbfd9b | |||
| 1f11e293c1 | |||
| bfd278ae1c | |||
| dbe1b9d2af | |||
| d71bc4bf09 | |||
| faf2e1dfa4 | |||
| 93360aa1bb | |||
| 8df7780ef9 | |||
| c1fda7f44c | |||
| ce42201eee | |||
| f65131e5b0 | |||
| 8d9efa5dc0 | |||
| 1a54bfb732 | |||
| a15c1f05b2 | |||
| ccfd341fe9 | |||
| aab8e0aa4d | |||
| 9b669c8a3d | |||
| 50960fed24 | |||
| ff61bc8d2d | |||
| e5d9c229ed | |||
| b0e38c7e2c | |||
| c12dade5ea | |||
| cb35dabf31 | |||
| a66cf4b501 | |||
| c355d6a24a | |||
| 60c1e93037 | |||
| 708126aca3 | |||
| bf763a3ad7 | |||
| bb0c3b91a2 | |||
| a7c0cd0d19 | |||
| f315ef9bd0 | |||
| b262a5491c | |||
| d7b30336b6 | |||
| c834bac460 | |||
| 36da0a1204 | |||
| 6ece9271eb | |||
| a465058bb3 | |||
| bad7dbb55c | |||
| 501aaf076e | |||
| 49d27cc7e4 | |||
| e3903f77e9 | |||
| b6ee9b5d7e | |||
| e3301cefd7 | |||
| 74ac38329e | |||
| 50c39382e6 | |||
| 9a65708855 | |||
| 4ebcb2cc95 | |||
| 0c3c41fb4a | |||
| f44942f78e | |||
| d7f2211800 | |||
| 60610e2032 | |||
| f11402c452 | |||
| 277b046b41 | |||
| 7878fb2f92 | |||
| f90c4634c2 | |||
| b52fbc8af5 | |||
| cde1175a7b | |||
| 30786743e3 | |||
| c675bad95c | |||
| 288b92d2ce | |||
| f6e656117c | |||
| 896baa6a04 | |||
| b8f820a9af | |||
| eb8b046dbd | |||
| ff9e0f3190 | |||
| c823eda245 | |||
| 6340de0ddb | |||
| e4f10b9e77 | |||
| 5ca2623c13 | |||
| e560823271 | |||
| 3f83b13a29 | |||
| 507bf09466 | |||
| 688a07dbe9 | |||
| e7c4bc9fc3 | |||
| 04c74afad6 | |||
| e8a4521b7e | |||
| 768b9d203c | |||
| ba5e03342f | |||
| cb3ff0334d | |||
| b96bf9b9a5 | |||
| 4bf673dfc6 | |||
| 223fe8025c | |||
| cf47cf1512 | |||
| 1bac0c3e8c | |||
| 4634c353d8 | |||
| 9ac2dde4e1 | |||
| 07a6db43e6 | |||
| c40f1f0cc2 | |||
| c4ddc6d793 | |||
| 8f58974a1a | |||
| b17fbd6fc0 | |||
| 57d5d57c53 | |||
| 5436512b1f | |||
| 40e10ea72c | |||
| ea6aba4e92 | |||
| e4817dd0d3 | |||
| 751a2d822a | |||
| 38cc8422b6 | |||
| 35f2e47195 | |||
| ab3ad0fe70 | |||
| ccf26730a2 | |||
| c23868dfb1 | |||
| b24af17326 | |||
| 45aff11bff | |||
| 1ee700fa9d | |||
| 4f74dc9031 | |||
| b53fd0bd61 | |||
| 80e3514d56 | |||
| 3f1cac3ccc | |||
| 261e4e8f67 | |||
| bec7ec1901 | |||
| 69015293a4 | |||
| ca55e417ee | |||
| ed37415ee2 | |||
| 68dc99f7ab | |||
| 4d9cac8941 | |||
| fbd6fe00d6 | |||
| e491680dff | |||
| ffc8474918 | |||
| dd7f26e51e | |||
| 498460031e | |||
| d977e3569f | |||
| f122e7e4ed | |||
| 3af3db3df6 | |||
| f4246de8a7 | |||
| 43b647ed28 | |||
| 04958f63de | |||
| b15b2c0e7b | |||
| 61909b68cc | |||
| 71c91bed29 | |||
| a8aa57dcd6 | |||
| a7de8c81b4 | |||
| c2688fe81c | |||
| 295474506b | |||
| c4a989dd3d | |||
| 7f6e192149 | |||
| 28b40e9174 | |||
| f2d2da94a1 | |||
| 14d19ff090 | |||
| a547464d1e | |||
| 23b9aba560 | |||
| 347038c528 | |||
| 2fc26d910a | |||
| 4828730ea3 | |||
| 7c4f539a44 | |||
| 598ef91a30 | |||
| 4862f12619 | |||
| c96ac214bb | |||
| 8fb9cf6a0b | |||
| 4a177b6008 | |||
| 58b59a3304 | |||
| 83e84a24b1 | |||
| 322e6c1f1c | |||
| d1ca77d7db | |||
| d885c78b9a | |||
| 6c8a8a53e7 | |||
| 21ec9335fc | |||
| 4c40a463da | |||
| 169e97975d | |||
| e26c65d4f1 | |||
| d1dd86c825 | |||
| e8388a757b | |||
| 51c7d46390 | |||
| 84688acf32 | |||
| f16ecd220a | |||
| a0f89e46a8 |
@@ -0,0 +1,8 @@
|
||||
[report]
|
||||
exclude_lines =
|
||||
pragma: no cover
|
||||
raise NotImplementedError
|
||||
def __repr__
|
||||
if __name__ == .__main__.:
|
||||
omit =
|
||||
subliminal/cli.py
|
||||
+50
-24
@@ -1,38 +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/
|
||||
|
||||
#Rope
|
||||
.ropeproject
|
||||
# PyBuilder
|
||||
target/
|
||||
|
||||
#Sphinx
|
||||
docs/_build
|
||||
# Pycharm
|
||||
.idea
|
||||
|
||||
# Subliminal
|
||||
tests/data/mkv/
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
[submodule "docs/_themes"]
|
||||
path = docs/_themes
|
||||
url = git://github.com/Diaoul/diaoul-sphinx-themes.git
|
||||
+26
-6
@@ -1,9 +1,29 @@
|
||||
sudo: false
|
||||
|
||||
language: python
|
||||
|
||||
python:
|
||||
- "2.7"
|
||||
- 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 -r requirements.txt --use-mirrors
|
||||
- pip install -r optional-requirements.txt --use-mirrors
|
||||
script: python setup.py test
|
||||
notifications:
|
||||
irc: "irc.freenode.org#subliminal"
|
||||
- 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
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
@@ -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
@@ -1 +1 @@
|
||||
include COPYING COPYING.LESSER NEWS.rst README.rst
|
||||
include LICENSE HISTORY.rst requirements.txt
|
||||
|
||||
@@ -1,69 +0,0 @@
|
||||
News
|
||||
====
|
||||
|
||||
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:** not released yet
|
||||
|
||||
* Initial release
|
||||
+48
-34
@@ -1,49 +1,63 @@
|
||||
Subliminal
|
||||
==========
|
||||
Subtitles, faster than your thoughts.
|
||||
|
||||
.. image:: https://secure.travis-ci.org/Diaoul/subliminal.png?branch=develop
|
||||
.. image:: https://img.shields.io/pypi/v/subliminal.svg
|
||||
:target: https://pypi.python.org/pypi/subliminal
|
||||
:alt: Latest Version
|
||||
|
||||
Subliminal is a python library to search and download subtitles.
|
||||
.. image:: https://travis-ci.org/Diaoul/subliminal.svg?branch=master
|
||||
:target: https://travis-ci.org/Diaoul/subliminal
|
||||
:alt: Travis CI build status
|
||||
|
||||
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://readthedocs.org/projects/subliminal/badge/?version=latest
|
||||
:target: https://subliminal.readthedocs.org/
|
||||
:alt: Documentation Status
|
||||
|
||||
Features
|
||||
--------
|
||||
Multiple subtitles services are available:
|
||||
.. 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
|
||||
|
||||
* Addic7ed
|
||||
* BierDopje
|
||||
* OpenSubtitles
|
||||
* Podnapisi
|
||||
* SubsWiki
|
||||
* Subtitulos
|
||||
* TheSubDB
|
||||
* TvSubtitles
|
||||
.. image:: https://img.shields.io/github/license/Diaoul/subliminal.svg
|
||||
:target: https://github.com/Diaoul/subliminal/blob/master/LICENSE
|
||||
:alt: License
|
||||
|
||||
You can use main subliminal's functions with a **file path**, a **file name** or a **folder path**.
|
||||
|
||||
: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 subtitle(s) for 1 video(s)
|
||||
The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.srt from opensubtitles
|
||||
**************************************************
|
||||
$ 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
@@ -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."
|
||||
|
||||
Vendored
BIN
Binary file not shown.
|
Before Width: | Height: | Size: 34 KiB |
Vendored
-4
@@ -1,4 +0,0 @@
|
||||
<h3>About</h3>
|
||||
<p>
|
||||
Subliminal is a python library to search and download subtitles.
|
||||
</p>
|
||||
Vendored
-6
@@ -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>
|
||||
-1
Submodule docs/_themes deleted from 4b7a0c3e43
@@ -0,0 +1,7 @@
|
||||
API
|
||||
===
|
||||
.. automodule:: subliminal.api
|
||||
|
||||
.. data:: provider_manager
|
||||
|
||||
:class:`~stevedore.extension.ExtensionManager` based on the entry point ``subliminal.providers``
|
||||
@@ -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
|
||||
@@ -0,0 +1,3 @@
|
||||
CLI
|
||||
===
|
||||
.. automodule:: subliminal.cli
|
||||
@@ -0,0 +1,3 @@
|
||||
Exceptions
|
||||
==========
|
||||
.. automodule:: subliminal.exceptions
|
||||
@@ -0,0 +1,3 @@
|
||||
Providers
|
||||
=========
|
||||
.. automodule:: subliminal.providers
|
||||
@@ -0,0 +1,3 @@
|
||||
Score
|
||||
=====
|
||||
.. automodule:: subliminal.score
|
||||
@@ -0,0 +1,3 @@
|
||||
Subtitle
|
||||
========
|
||||
.. automodule:: subliminal.subtitle
|
||||
@@ -0,0 +1,10 @@
|
||||
Video
|
||||
=====
|
||||
.. automodule:: subliminal.video
|
||||
:exclude-members: VIDEO_EXTENSIONS, SUBTITLE_EXTENSIONS
|
||||
|
||||
.. autodata:: VIDEO_EXTENSIONS
|
||||
:annotation:
|
||||
|
||||
.. autodata:: SUBTITLE_EXTENSIONS
|
||||
:annotation:
|
||||
@@ -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
|
||||
+104
-43
@@ -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,25 +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 = 'diaoul'
|
||||
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 = {'github_user': 'Diaoul',
|
||||
'github_repo': 'subliminal',
|
||||
'github_branch': 'develop',
|
||||
'fork_me': 1,
|
||||
'flattr_href': 'http://subliminal.readthedocs.org/',
|
||||
'flattr_thing_url': 'http://flattr.com/thing/629842/Subliminal'}
|
||||
#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".
|
||||
@@ -117,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
|
||||
@@ -129,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'
|
||||
@@ -138,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', 'sidebar-travis-ci.html', 'sidebar-donate.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.
|
||||
@@ -173,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').
|
||||
@@ -188,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
|
||||
@@ -218,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.
|
||||
@@ -251,5 +294,23 @@ 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']
|
||||
|
||||
@@ -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')
|
||||
@@ -1,98 +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 do not want to 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 makes heavy use of ISO-3166 and ISO-639
|
||||
in a dedicated module.
|
||||
|
||||
.. automodule:: subliminal.language
|
||||
:members:
|
||||
|
||||
.. data:: subliminal.language.COUNTRIES
|
||||
|
||||
ISO-3166-1 countries list from `Debian package iso-codes 3.36-1 <http://packages.debian.org/fr/sid/iso-codes>`_.
|
||||
Each item of this list is a tuple like ``(‘alpha2’, ‘alpha3’, ‘numeric’, ‘name’)``
|
||||
|
||||
.. data:: subliminal.language.LANGUAGES
|
||||
|
||||
ISO-639-2 languages list from `the official source <http://www.loc.gov/standards/iso639-2/ISO-639-2_utf-8.txt>`_.
|
||||
Each item of this list is a tuple like ``(‘alpha3’, ‘terminologic’, ‘alpha2’, ‘name’, ‘french_name’)``
|
||||
|
||||
|
||||
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
-66
@@ -1,80 +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:
|
||||
|
||||
* Addic7ed
|
||||
* BierDopje
|
||||
* OpenSubtitles
|
||||
* Podnapisi
|
||||
* SubsWiki
|
||||
* Subtitulos
|
||||
* TheSubDB
|
||||
* TvSubtitles
|
||||
|
||||
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 subtitle(s) for 1 video(s)
|
||||
The.Big.Bang.Theory.S05E18.HDTV.x264-LOL.srt from opensubtitles
|
||||
**************************************************
|
||||
|
||||
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
@@ -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
|
||||
-118
@@ -1,118 +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 representations based on `ISO-639 <http://en.wikipedia.org/wiki/ISO_639>`_
|
||||
and `ISO-3166 <http://en.wikipedia.org/wiki/ISO_3166>`_. Any single ISO-639 string or combination of ISO-639 and
|
||||
ISO-3166 is acceptable. For example, you can use ``pt-br`` for Portuguese (Brazil) or ``en`` for English.
|
||||
|
||||
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 Command Line Interface that allows you to
|
||||
download subtitles for one or more videos in a multithreaded way.
|
||||
|
||||
.. note::
|
||||
|
||||
The cache directory defaults to *~/.config/subliminal*. Even on Windows
|
||||
|
||||
Usage
|
||||
^^^^^
|
||||
You can have the documentation of the CLI using ``subliminal --help``::
|
||||
|
||||
usage: subliminal [-h] [-l LG] [-s NAME] [-m] [-f] [-w N] [-a AGE] [-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)
|
||||
-a AGE, --age AGE scan only for files newer or older (prefix with +)
|
||||
than AGE (e.g. 12h, 1w2d, +3d6h)
|
||||
-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
|
||||
|
||||
Cron job
|
||||
^^^^^^^^
|
||||
This CLI is well suited for automatic subtitles downloads. For example, to download english and french
|
||||
subtitles for videos newer than one week under /path/to/videos/ each day at 1:00AM with a single worker,
|
||||
you can use the following crontab line::
|
||||
|
||||
0 1 * * * user /path/to/subliminal -m -l en -l fr -w 1 -a 1w -q /path/to/videos/
|
||||
|
||||
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'])
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -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.
|
||||
@@ -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 +0,0 @@
|
||||
lxml
|
||||
+1
-5
@@ -1,5 +1 @@
|
||||
beautifulsoup4>=4.0
|
||||
guessit>=0.4.1
|
||||
requests
|
||||
enzyme>=0.1
|
||||
html5lib
|
||||
-e .
|
||||
|
||||
@@ -1,99 +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 datetime
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
import subliminal
|
||||
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', type=int, default=4)
|
||||
parser.add_argument('-a', '--age', action='store', help='scan only for files newer or older (prefix with +) than AGE (e.g. 12h, 1w2d, +3d6h)', metavar='AGE', default=None)
|
||||
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)
|
||||
|
||||
# Create filter function
|
||||
scan_filter = None
|
||||
if args.age:
|
||||
regex = re.compile(r'^(?P<sign>\+?)((?P<weeks>\d+?)w)?((?P<days>\d+?)d)?((?P<hours>\d+?)h)?')
|
||||
parts = regex.match(args.age)
|
||||
if not parts:
|
||||
raise ValueError('Incorrect age format')
|
||||
time_params = {}
|
||||
parts = parts.groupdict()
|
||||
for name, param in parts.iteritems():
|
||||
if param and name != 'sign':
|
||||
time_params[name] = int(param)
|
||||
if parts['sign'] == '+':
|
||||
scan_filter = lambda x: datetime.datetime.now() - datetime.datetime.fromtimestamp(os.path.getmtime(x)) < datetime.timedelta(**time_params)
|
||||
else:
|
||||
scan_filter = lambda x: datetime.datetime.now() - datetime.datetime.fromtimestamp(os.path.getmtime(x)) > datetime.timedelta(**time_params)
|
||||
|
||||
# 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:
|
||||
results = p.download_subtitles(paths, languages=args.languages, services=args.services, cache_dir=args.cache_dir,
|
||||
force=args.force, multi=args.multi, scan_filter=scan_filter)
|
||||
|
||||
if not results:
|
||||
if not args.quiet:
|
||||
sys.stderr.write('No subtitles downloaded\n')
|
||||
exit(1)
|
||||
if not args.quiet:
|
||||
print '*' * 50
|
||||
print 'Downloaded %d subtitle(s) for %d video(s)' % (sum([len(s) for s in results.itervalues()]), len(results))
|
||||
for _, subtitles in results.iteritems():
|
||||
for subtitle in subtitles:
|
||||
print '%s from %s' % (subtitle.path, subtitle.service)
|
||||
print '*' * 50
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -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
|
||||
|
||||
@@ -1,53 +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()
|
||||
|
||||
required = ['beautifulsoup4 >= 4.0', 'guessit >= 0.4.1', 'requests', 'enzyme >= 0.1', 'html5lib']
|
||||
if sys.hexversion < 0x20700f0:
|
||||
required.append('argparse >= 1.1')
|
||||
|
||||
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'],
|
||||
test_suite='tests.suite',
|
||||
install_requires=required,
|
||||
extras_require={'full': ['lxml']})
|
||||
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
@@ -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
-87
@@ -1,104 +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 .language import language_set, language_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, scan_filter=None):
|
||||
"""List subtitles in given paths according to the criteria
|
||||
|
||||
:param paths: path(s) to video file or folder
|
||||
:type paths: string or list
|
||||
:param languages: languages to search for, in preferred order
|
||||
:type languages: list of :class:`~subliminal.language.Language` or string
|
||||
: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 function scan_filter: filter function that takes a path as argument and returns a boolean indicating whether it has to be filtered out (``True``) or not (``False``)
|
||||
: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 = language_set(languages) if languages is not None else language_set(LANGUAGES)
|
||||
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, scan_filter)
|
||||
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, scan_filter=None, 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 languages: languages to search for, in preferred order
|
||||
:type languages: list of :class:`~subliminal.language.Language` or string
|
||||
: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 function scan_filter: filter function that takes a path as argument and returns a boolean indicating whether it has to be filtered out (``True``) or not (``False``)
|
||||
: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: downloaded subtitles
|
||||
:rtype: dict 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 = language_list(languages) if languages is not None else language_list(LANGUAGES)
|
||||
if isinstance(paths, basestring):
|
||||
paths = [paths]
|
||||
order = order or [LANGUAGE_INDEX, SERVICE_INDEX, SERVICE_CONFIDENCE, MATCHING_CONFIDENCE]
|
||||
subtitles_by_video = list_subtitles(paths, languages, services, force, multi, cache_dir, max_depth, scan_filter)
|
||||
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((task.video, result))
|
||||
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)
|
||||
# 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
|
||||
|
||||
@@ -1,142 +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 .language import language_list, language_set, LANGUAGES
|
||||
from .tasks import StopTask
|
||||
import Queue
|
||||
import logging
|
||||
import threading
|
||||
|
||||
|
||||
__all__ = ['Worker', 'Pool']
|
||||
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, scan_filter=None):
|
||||
"""See :meth:`subliminal.list_subtitles`"""
|
||||
services = services or SERVICES
|
||||
languages = language_set(languages) if languages is not None else language_set(LANGUAGES)
|
||||
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, scan_filter)
|
||||
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, force=True, multi=False, cache_dir=None, max_depth=3, scan_filter=None, order=None):
|
||||
"""See :meth:`subliminal.download_subtitles`"""
|
||||
services = services or SERVICES
|
||||
languages = language_list(languages) if languages is not None else language_list(LANGUAGES)
|
||||
if isinstance(paths, basestring):
|
||||
paths = [paths]
|
||||
order = order or [LANGUAGE_INDEX, SERVICE_INDEX, SERVICE_CONFIDENCE, MATCHING_CONFIDENCE]
|
||||
subtitles_by_video = self.list_subtitles(paths, languages, services, force, multi, cache_dir, max_depth, scan_filter)
|
||||
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 group_by_video(results)
|
||||
+12
-129
@@ -1,134 +1,17 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright 2012 Nicolas Wack <wackou@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 collections import defaultdict
|
||||
from functools import wraps
|
||||
import logging
|
||||
import os.path
|
||||
import threading
|
||||
try:
|
||||
import cPickle as pickle
|
||||
except ImportError:
|
||||
import pickle
|
||||
import datetime
|
||||
|
||||
from dogpile.cache import make_region
|
||||
|
||||
|
||||
__all__ = ['Cache', 'cachedmethod']
|
||||
logger = logging.getLogger(__name__)
|
||||
#: 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()
|
||||
|
||||
|
||||
class Cache(object):
|
||||
"""A Cache object contains cached values for methods. It can have
|
||||
separate internal caches, one for each service
|
||||
|
||||
"""
|
||||
def __init__(self, cache_dir):
|
||||
self.cache_dir = cache_dir
|
||||
self.cache = defaultdict(dict)
|
||||
self.lock = threading.RLock()
|
||||
|
||||
def __del__(self):
|
||||
for service_name in self.cache:
|
||||
self.save(service_name)
|
||||
|
||||
def cache_location(self, service_name):
|
||||
return os.path.join(self.cache_dir, 'subliminal_%s.cache' % service_name)
|
||||
|
||||
def load(self, service_name):
|
||||
with self.lock:
|
||||
if service_name in self.cache:
|
||||
# already loaded
|
||||
return
|
||||
|
||||
self.cache[service_name] = defaultdict(dict)
|
||||
filename = self.cache_location(service_name)
|
||||
logger.debug(u'Cache: loading cache from %s' % filename)
|
||||
try:
|
||||
self.cache[service_name] = pickle.load(open(filename, 'rb'))
|
||||
except IOError:
|
||||
logger.info('Cache: Cache file "%s" doesn\'t exist, creating it' % filename)
|
||||
except EOFError:
|
||||
logger.error('Cache: cache file "%s" is corrupted... Removing it.' % filename)
|
||||
os.remove(filename)
|
||||
|
||||
def save(self, service_name):
|
||||
filename = self.cache_location(service_name)
|
||||
logger.debug(u'Cache: saving cache to %s' % filename)
|
||||
with self.lock:
|
||||
pickle.dump(self.cache[service_name], open(filename, 'wb'))
|
||||
|
||||
def clear(self, service_name):
|
||||
try:
|
||||
os.remove(self.cache_location(service_name))
|
||||
except OSError:
|
||||
pass
|
||||
self.cache[service_name] = defaultdict(dict)
|
||||
|
||||
def cached_func_key(self, func, cls=None):
|
||||
try:
|
||||
cls = func.im_class
|
||||
except:
|
||||
pass
|
||||
return ('%s.%s' % (cls.__module__, cls.__name__), func.__name__)
|
||||
|
||||
def function_cache(self, service_name, func):
|
||||
func_key = self.cached_func_key(func)
|
||||
return self.cache[service_name][func_key]
|
||||
|
||||
def cache_for(self, service_name, func, args, result):
|
||||
# no need to lock here, dict ops are atomic
|
||||
self.function_cache(service_name, func)[args] = result
|
||||
|
||||
def cached_value(self, service_name, func, args):
|
||||
"""Raises KeyError if not found"""
|
||||
# no need to lock here, dict ops are atomic
|
||||
return self.function_cache(service_name, func)[args]
|
||||
|
||||
|
||||
def cachedmethod(function):
|
||||
"""Decorator to make a method use the cache.
|
||||
|
||||
.. note::
|
||||
|
||||
This can NOT be used with static functions, it has to be used on
|
||||
methods of some class
|
||||
|
||||
"""
|
||||
@wraps(function)
|
||||
def cached(*args):
|
||||
c = args[0].config.cache
|
||||
service_name = args[0].__class__.__name__
|
||||
func_key = c.cached_func_key(function, cls=args[0].__class__)
|
||||
func_cache = c.cache[service_name][func_key]
|
||||
|
||||
# we need to remove the first element of args for the key, as it is the
|
||||
# instance pointer and we don't want the cache to know which instance
|
||||
# called it, it is shared among all instances of the same class
|
||||
key = args[1:]
|
||||
|
||||
if key in func_cache:
|
||||
result = func_cache[key]
|
||||
logger.debug(u'Using cached value for %s(%s), returns: %s' % (func_key, key, result))
|
||||
return result
|
||||
|
||||
result = function(*args)
|
||||
|
||||
# note: another thread could have already cached a value in the
|
||||
# meantime, but that's ok as we prefer to keep the latest value in
|
||||
# the cache
|
||||
func_cache[key] = result
|
||||
return result
|
||||
return cached
|
||||
region = make_region()
|
||||
|
||||
@@ -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 ''))
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -1,270 +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 bs4
|
||||
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', 'addic7ed', 'tvsubtitles']
|
||||
LANGUAGE_INDEX, SERVICE_INDEX, SERVICE_CONFIDENCE, MATCHING_CONFIDENCE = range(4)
|
||||
|
||||
|
||||
def create_list_tasks(paths, languages, services, force, multi, cache_dir, max_depth, scan_filter):
|
||||
"""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
|
||||
:param function scan_filter: filter function that takes a path as argument and returns a boolean indicating whether it has to be filtered out (``True``) or not (``False``)
|
||||
:return: the created tasks
|
||||
:rtype: list of :class:`~subliminal.tasks.ListTask`
|
||||
|
||||
"""
|
||||
scan_result = []
|
||||
for p in paths:
|
||||
scan_result.extend(scan(p, max_depth, scan_filter))
|
||||
logger.debug(u'Found %d videos in %r with maximum depth %d' % (len(scan_result), paths, max_depth))
|
||||
tasks = []
|
||||
config = ServiceConfig(multi, cache_dir)
|
||||
services = filter_services(services)
|
||||
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
|
||||
if not service.check_validity(video, wanted_languages):
|
||||
continue
|
||||
task = ListTask(video, wanted_languages & 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`
|
||||
|
||||
"""
|
||||
if services is None:
|
||||
services = {}
|
||||
logger.info(u'Consuming %r' % task)
|
||||
result = None
|
||||
if isinstance(task, ListTask):
|
||||
service = get_service(services, task.service, config=task.config)
|
||||
result = service.list(task.video, task.languages)
|
||||
elif isinstance(task, DownloadTask):
|
||||
for subtitle in task.subtitles:
|
||||
service = get_service(services, subtitle.service)
|
||||
try:
|
||||
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 get_service(services, service_name, config=None):
|
||||
"""Get a service from its name in the service dict with the specified config.
|
||||
If the service does not exist in the service dict, it is created and added to the dict.
|
||||
|
||||
:param dict services: dict where to get existing services or put created ones
|
||||
:param string service_name: name of the service to get
|
||||
:param config: config to use for the service
|
||||
:type config: :class:`~subliminal.services.ServiceConfig` or None
|
||||
:return: the corresponding service
|
||||
:rtype: :class:`~subliminal.services.ServiceBase`
|
||||
|
||||
"""
|
||||
if service_name not in services:
|
||||
mod = __import__('services.' + service_name, globals=globals(), locals=locals(), fromlist=['Service'], level=-1)
|
||||
services[service_name] = mod.Service()
|
||||
services[service_name].init()
|
||||
services[service_name].config = config
|
||||
return services[service_name]
|
||||
|
||||
|
||||
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)
|
||||
key += '{0:01d}'.format(subtitle.language == languages[languages.index(subtitle.language)])
|
||||
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
|
||||
|
||||
|
||||
def filter_services(services):
|
||||
"""Filter out services that are not available because of a missing feature
|
||||
|
||||
:param list services: service names to filter
|
||||
:return: a copy of the initial list of service names without unavailable ones
|
||||
:rtype: list
|
||||
|
||||
"""
|
||||
filtered_services = services[:]
|
||||
for service_name in services:
|
||||
mod = __import__('services.' + service_name, globals=globals(), locals=locals(), fromlist=['Service'], level=-1)
|
||||
service = mod.Service
|
||||
if service.required_features is not None and bs4.builder_registry.lookup(*service.required_features) is None:
|
||||
logger.warning(u'Service %s not available: none of available features could be used. One of %r required' % (service_name, service.required_features))
|
||||
filtered_services.remove(service_name)
|
||||
return filtered_services
|
||||
+16
-21
@@ -1,32 +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 ServiceError(Error):
|
||||
""""Exception raised by services"""
|
||||
class ProviderError(Error):
|
||||
"""Exception raised by providers."""
|
||||
pass
|
||||
|
||||
|
||||
class DownloadFailedError(Error):
|
||||
""""Exception raised when a download task has failed in service"""
|
||||
class ConfigurationError(ProviderError):
|
||||
"""Exception raised by providers when badly configured."""
|
||||
pass
|
||||
|
||||
|
||||
class AuthenticationError(ProviderError):
|
||||
"""Exception raised by providers when authentication failed."""
|
||||
pass
|
||||
|
||||
|
||||
class DownloadLimitExceeded(ProviderError):
|
||||
"""Exception raised by providers when download limit is exceeded."""
|
||||
pass
|
||||
|
||||
@@ -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.6.0'
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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]))
|
||||
@@ -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)
|
||||
@@ -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]))
|
||||
Executable
+125
@@ -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])
|
||||
@@ -1,256 +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 ..cache import Cache
|
||||
from ..exceptions import DownloadFailedError, ServiceError
|
||||
from ..language import language_set, Language
|
||||
from ..subtitles import EXTENSIONS
|
||||
import logging
|
||||
import os
|
||||
import requests
|
||||
import threading
|
||||
import zipfile
|
||||
|
||||
|
||||
__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.6'
|
||||
|
||||
#: Whether based on an API or not
|
||||
api_based = False
|
||||
|
||||
#: Timeout for web requests
|
||||
timeout = 5
|
||||
|
||||
#: :class:`~subliminal.language.language_set` of available languages
|
||||
languages = language_set()
|
||||
|
||||
#: Map between language objects and language codes used in the service
|
||||
language_map = {}
|
||||
|
||||
#: Default attribute of a :class:`~subliminal.language.Language` to get with :meth:`get_code`
|
||||
language_code = 'alpha2'
|
||||
|
||||
#: 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
|
||||
|
||||
#: List of required features for BeautifulSoup
|
||||
required_features = None
|
||||
|
||||
def __init__(self, config=None):
|
||||
self.config = config or ServiceConfig()
|
||||
self.session = None
|
||||
|
||||
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 init_cache(self):
|
||||
"""Initialize cache, make sure it is loaded from disk"""
|
||||
if not self.config or not self.config.cache:
|
||||
raise ServiceError('Cache directory is required')
|
||||
self.config.cache.load(self.__class__.__name__)
|
||||
|
||||
def save_cache(self):
|
||||
self.config.cache.save(self.__class__.__name__)
|
||||
|
||||
def clear_cache(self):
|
||||
self.config.cache.clear(self.__class__.__name__)
|
||||
|
||||
def cache_for(self, func, args, result):
|
||||
return self.config.cache.cache_for(self.__class__.__name__, func, args, result)
|
||||
|
||||
def cached_value(self, func, args):
|
||||
return self.config.cache.cached_value(self.__class__.__name__, func, args)
|
||||
|
||||
def terminate(self):
|
||||
"""Terminate connection"""
|
||||
logger.debug(u'Terminating %s' % self.__class__.__name__)
|
||||
|
||||
def get_code(self, language):
|
||||
"""Get the service code for a :class:`~subliminal.language.Language`
|
||||
|
||||
It uses the :data:`language_map` and if there's no match, falls back
|
||||
on the :data:`language_code` attribute of the given :class:`~subliminal.language.Language`
|
||||
|
||||
"""
|
||||
if language in self.language_map:
|
||||
return self.language_map[language]
|
||||
if self.language_code is None:
|
||||
raise ValueError('%r has no matching code' % language)
|
||||
return getattr(language, self.language_code)
|
||||
|
||||
def get_language(self, code):
|
||||
"""Get a :class:`~subliminal.language.Language` from a service code
|
||||
|
||||
It uses the :data:`language_map` and if there's no match, uses the
|
||||
given code as ``language`` parameter for the :class:`~subliminal.language.Language`
|
||||
constructor
|
||||
|
||||
.. note::
|
||||
|
||||
A warning is emitted if the generated :class:`~subliminal.language.Language`
|
||||
is "Undetermined"
|
||||
|
||||
"""
|
||||
if code in self.language_map:
|
||||
return self.language_map[code]
|
||||
language = Language(code, strict=False)
|
||||
if language == Language('Undetermined'):
|
||||
logger.warning(u'Code %s could not be identified as a language for %s' % (code, self.__class__.__name__))
|
||||
return language
|
||||
|
||||
def query(self, *args):
|
||||
"""Make the actual query"""
|
||||
raise NotImplementedError()
|
||||
|
||||
def list(self, video, languages):
|
||||
"""List subtitles
|
||||
|
||||
As a service writer, you can either override this method or implement
|
||||
:meth:`list_checked` instead to have the languages pre-filtered for you
|
||||
|
||||
"""
|
||||
if not self.check_validity(video, languages):
|
||||
return []
|
||||
return self.list_checked(video, languages)
|
||||
|
||||
def list_checked(self, video, languages):
|
||||
"""List subtitles without having to check parameters for validity"""
|
||||
raise NotImplementedError()
|
||||
|
||||
def download(self, subtitle):
|
||||
"""Download a subtitle"""
|
||||
self.download_file(subtitle.link, subtitle.path)
|
||||
|
||||
@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 languages: languages to check
|
||||
:type languages: :class:`~subliminal.language.Language`
|
||||
:rtype: bool
|
||||
|
||||
"""
|
||||
languages = (languages & cls.languages) - language_set(['Undetermined'])
|
||||
if not languages:
|
||||
logger.debug(u'No language available for service %s' % cls.__name__.lower())
|
||||
return False
|
||||
if cls.require_video and not video.exists or not isinstance(video, tuple(cls.videos)):
|
||||
logger.debug(u'%r is not valid for service %s' % (video, cls.__name__.lower()))
|
||||
return False
|
||||
return True
|
||||
|
||||
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)))
|
||||
|
||||
def download_zip_file(self, url, filepath):
|
||||
"""Attempt to download a zip file and extract any subtitle file from it, if any.
|
||||
This cleans up after itself if anything fails.
|
||||
|
||||
:param string url: URL of the zip file to download
|
||||
:param string filepath: destination path for the subtitle
|
||||
|
||||
"""
|
||||
logger.info(u'Downloading %s' % url)
|
||||
try:
|
||||
zippath = filepath + '.zip'
|
||||
r = self.session.get(url, headers={'Referer': url, 'User-Agent': self.user_agent})
|
||||
with open(zippath, 'wb') as f:
|
||||
f.write(r.content)
|
||||
if not zipfile.is_zipfile(zippath):
|
||||
# TODO: could check if maybe we already have a text file and
|
||||
# download it directly
|
||||
raise DownloadFailedError('Downloaded file is not a zip file')
|
||||
zipsub = zipfile.ZipFile(zippath)
|
||||
for subfile in zipsub.namelist():
|
||||
if os.path.splitext(subfile)[1] in EXTENSIONS:
|
||||
open(filepath, 'w').write(zipsub.open(subfile).read())
|
||||
break
|
||||
else:
|
||||
logger.debug(u'No subtitles found in zip file')
|
||||
raise DownloadFailedError('No subtitles found in zip file')
|
||||
os.remove(zippath)
|
||||
logger.debug(u'Download finished for file %s. Size: %s' % (filepath, os.path.getsize(filepath)))
|
||||
return
|
||||
except Exception as e:
|
||||
logger.error(u'Download %s failed: %s' % (url, e))
|
||||
if os.path.exists(zippath):
|
||||
os.remove(zippath)
|
||||
if os.path.exists(filepath):
|
||||
os.remove(filepath)
|
||||
raise DownloadFailedError(str(e))
|
||||
|
||||
|
||||
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
|
||||
self.cache = None
|
||||
if cache_dir is not None:
|
||||
self.cache = Cache(cache_dir)
|
||||
|
||||
def __repr__(self):
|
||||
return 'ServiceConfig(%r, %s)' % (self.multi, self.cache.cache_dir)
|
||||
@@ -1,154 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright 2012 Olivier Leveau <olifozzy@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 ..cache import cachedmethod
|
||||
from ..language import Language, language_set
|
||||
from ..subtitles import get_subtitle_path, ResultSubtitle
|
||||
from ..utils import get_keywords
|
||||
from ..videos import Episode
|
||||
from bs4 import BeautifulSoup
|
||||
import logging
|
||||
import re
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def match(pattern, string):
|
||||
try:
|
||||
return re.search(pattern, string).group(1)
|
||||
except AttributeError:
|
||||
logger.debug(u'Could not match %r on %r' % (pattern, string))
|
||||
return None
|
||||
|
||||
|
||||
def matches(pattern, string):
|
||||
try:
|
||||
return re.search(pattern, string).group(1, 2)
|
||||
except AttributeError:
|
||||
logger.debug(u'Could not match %r on %r' % (pattern, string))
|
||||
return None
|
||||
|
||||
|
||||
class Addic7ed(ServiceBase):
|
||||
server_url = 'http://www.addic7ed.com'
|
||||
api_based = False
|
||||
#TODO: Complete this
|
||||
languages = language_set(['ar', 'ca', 'de', 'el', 'en', 'es', 'eu', 'fr', 'ga', 'he', 'hr', 'hu', 'it',
|
||||
'pl', 'pt', 'ro', 'ru', 'se', 'pt-br'])
|
||||
language_map = {'Portuguese (Brazilian)': Language('por-BR'), 'Greek': Language('gre')}
|
||||
videos = [Episode]
|
||||
require_video = False
|
||||
required_features = ['permissive']
|
||||
|
||||
@cachedmethod
|
||||
def get_likely_series_id(self, name):
|
||||
r = self.session.get('%s/shows.php' % self.server_url)
|
||||
soup = BeautifulSoup(r.content, self.required_features)
|
||||
for elem in soup.find_all('h3'):
|
||||
show_name = elem.a.text.lower()
|
||||
show_id = int(match('show/([0-9]+)', elem.a['href']))
|
||||
# we could just return the id of the queried show, but as we
|
||||
# already downloaded the whole page we might as well fill in the
|
||||
# information for all the shows
|
||||
self.cache_for(self.get_likely_series_id, args=(show_name,), result=show_id)
|
||||
return self.cached_value(self.get_likely_series_id, args=(name,))
|
||||
|
||||
@cachedmethod
|
||||
def get_episode_url(self, series_id, season, number):
|
||||
"""Get the Addic7ed id for the given episode. Raises KeyError if none
|
||||
could be found
|
||||
|
||||
"""
|
||||
# download the page of the show, contains ids for all episodes all seasons
|
||||
r = self.session.get('%s/show/%d' % (self.server_url, series_id))
|
||||
soup = BeautifulSoup(r.content, self.required_features)
|
||||
form = soup.find('form', attrs={'name': 'multidl'})
|
||||
for table in form.find_all('table'):
|
||||
for row in table.find_all('tr'):
|
||||
cell = row.find('td', 'MultiDldS')
|
||||
if not cell:
|
||||
continue
|
||||
m = matches('/serie/.+/([0-9]+)/([0-9]+)/', cell.a['href'])
|
||||
if not m:
|
||||
continue
|
||||
episode_url = cell.a['href']
|
||||
season_number = int(m[0])
|
||||
episode_number = int(m[1])
|
||||
# we could just return the url of the queried episode, but as we
|
||||
# already downloaded the whole page we might as well fill in the
|
||||
# information for all the episodes of the show
|
||||
self.cache_for(self.get_episode_url, args=(series_id, season_number, episode_number), result=episode_url)
|
||||
# raises KeyError if not found
|
||||
return self.cached_value(self.get_episode_url, args=(series_id, season, number))
|
||||
|
||||
# Do not cache this method in order to always check for the most recent
|
||||
# subtitles
|
||||
def get_sub_urls(self, episode_url):
|
||||
suburls = []
|
||||
r = self.session.get('%s/%s' % (self.server_url, episode_url))
|
||||
epsoup = BeautifulSoup(r.content, self.required_features)
|
||||
for releaseTable in epsoup.find_all('table', 'tabel95'):
|
||||
releaseRow = releaseTable.find('td', 'NewsTitle')
|
||||
if not releaseRow:
|
||||
continue
|
||||
release = releaseRow.text.strip()
|
||||
for row in releaseTable.find_all('tr'):
|
||||
link = row.find('a', 'buttonDownload')
|
||||
if not link:
|
||||
continue
|
||||
if 'href' not in link.attrs or not (link['href'].startswith('/original') or link['href'].startswith('/updated')):
|
||||
continue
|
||||
suburl = link['href']
|
||||
lang = self.get_language(row.find('td', 'language').text.strip())
|
||||
result = {'suburl': suburl, 'language': lang, 'release': release}
|
||||
suburls.append(result)
|
||||
return suburls
|
||||
|
||||
def list_checked(self, video, languages):
|
||||
return self.query(video.path or video.release, languages, get_keywords(video.guess), video.series, video.season, video.episode)
|
||||
|
||||
def query(self, filepath, languages, keywords, series, season, episode):
|
||||
logger.debug(u'Getting subtitles for %s season %d episode %d with languages %r' % (series, season, episode, languages))
|
||||
self.init_cache()
|
||||
try:
|
||||
sid = self.get_likely_series_id(series.lower())
|
||||
except KeyError:
|
||||
logger.debug(u'Could not find series id for %s' % series)
|
||||
return []
|
||||
try:
|
||||
ep_url = self.get_episode_url(sid, season, episode)
|
||||
except KeyError:
|
||||
logger.debug(u'Could not find episode id for %s season %d episode %d' % (series, season, episode))
|
||||
return []
|
||||
suburls = self.get_sub_urls(ep_url)
|
||||
# filter the subtitles with our queried languages
|
||||
subtitles = []
|
||||
for suburl in suburls:
|
||||
language = suburl['language']
|
||||
if language not in languages:
|
||||
continue
|
||||
path = get_subtitle_path(filepath, language, self.config.multi)
|
||||
subtitle = ResultSubtitle(path, language, self.__class__.__name__.lower(),
|
||||
'%s/%s' % (self.server_url, suburl['suburl']),
|
||||
keywords=[suburl['release']])
|
||||
subtitles.append(subtitle)
|
||||
return subtitles
|
||||
|
||||
|
||||
Service = Addic7ed
|
||||
@@ -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 ..cache import cachedmethod
|
||||
from ..exceptions import ServiceError
|
||||
from ..language import language_set
|
||||
from ..subtitles import get_subtitle_path, ResultSubtitle
|
||||
from ..utils import to_unicode
|
||||
from ..videos import Episode
|
||||
from bs4 import BeautifulSoup
|
||||
import logging
|
||||
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 = language_set(['eng', 'dut'])
|
||||
videos = [Episode]
|
||||
require_video = False
|
||||
required_features = ['xml']
|
||||
|
||||
@cachedmethod
|
||||
def get_show_id(self, 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 None
|
||||
soup = BeautifulSoup(r.content, self.required_features)
|
||||
if soup.status.contents[0] == 'false':
|
||||
logger.debug(u'Could not find show %s' % series)
|
||||
return None
|
||||
return int(soup.showid.contents[0])
|
||||
|
||||
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, filepath, season, episode, languages, tvdbid=None, series=None):
|
||||
self.init_cache()
|
||||
if series:
|
||||
request_id = self.get_show_id(series.lower())
|
||||
if request_id is None:
|
||||
return []
|
||||
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.alpha2))
|
||||
r = self.session.get('%sGetAllSubsFor/%s/%s/%s/%s/%s' % (self.server_url, request_id, season, episode, language.alpha2, 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(r.content, self.required_features)
|
||||
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.alpha2))
|
||||
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_checked(self, video, languages):
|
||||
return self.query(video.path or video.release, video.season, video.episode, languages, video.tvdbid, video.series)
|
||||
|
||||
|
||||
Service = BierDopje
|
||||
@@ -1,158 +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 ..language import Language, language_set
|
||||
from ..subtitles import get_subtitle_path, ResultSubtitle
|
||||
from ..utils import to_unicode
|
||||
from ..videos import Episode, Movie
|
||||
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
|
||||
# Source: http://www.opensubtitles.org/addons/export_languages.php
|
||||
languages = language_set(['aar', 'abk', 'ace', 'ach', 'ada', 'ady', 'afa', 'afh', 'afr', 'ain', 'aka', 'akk',
|
||||
'alb', 'ale', 'alg', 'alt', 'amh', 'ang', 'apa', 'ara', 'arc', 'arg', 'arm', 'arn',
|
||||
'arp', 'art', 'arw', 'asm', 'ast', 'ath', 'aus', 'ava', 'ave', 'awa', 'aym', 'aze',
|
||||
'bad', 'bai', 'bak', 'bal', 'bam', 'ban', 'baq', 'bas', 'bat', 'bej', 'bel', 'bem',
|
||||
'ben', 'ber', 'bho', 'bih', 'bik', 'bin', 'bis', 'bla', 'bnt', 'bos', 'bra', 'bre',
|
||||
'btk', 'bua', 'bug', 'bul', 'bur', 'byn', 'cad', 'cai', 'car', 'cat', 'cau', 'ceb',
|
||||
'cel', 'cha', 'chb', 'che', 'chg', 'chi', 'chk', 'chm', 'chn', 'cho', 'chp', 'chr',
|
||||
'chu', 'chv', 'chy', 'cmc', 'cop', 'cor', 'cos', 'cpe', 'cpf', 'cpp', 'cre', 'crh',
|
||||
'crp', 'csb', 'cus', 'cze', 'dak', 'dan', 'dar', 'day', 'del', 'den', 'dgr', 'din',
|
||||
'div', 'doi', 'dra', 'dua', 'dum', 'dut', 'dyu', 'dzo', 'efi', 'egy', 'eka', 'ell',
|
||||
'elx', 'eng', 'enm', 'epo', 'est', 'ewe', 'ewo', 'fan', 'fao', 'fat', 'fij', 'fil',
|
||||
'fin', 'fiu', 'fon', 'fre', 'frm', 'fro', 'fry', 'ful', 'fur', 'gaa', 'gay', 'gba',
|
||||
'gem', 'geo', 'ger', 'gez', 'gil', 'gla', 'gle', 'glg', 'glv', 'gmh', 'goh', 'gon',
|
||||
'gor', 'got', 'grb', 'grc', 'grn', 'guj', 'gwi', 'hai', 'hat', 'hau', 'haw', 'heb',
|
||||
'her', 'hil', 'him', 'hin', 'hit', 'hmn', 'hmo', 'hrv', 'hun', 'hup', 'iba', 'ibo',
|
||||
'ice', 'ido', 'iii', 'ijo', 'iku', 'ile', 'ilo', 'ina', 'inc', 'ind', 'ine', 'inh',
|
||||
'ipk', 'ira', 'iro', 'ita', 'jav', 'jpn', 'jpr', 'jrb', 'kaa', 'kab', 'kac', 'kal',
|
||||
'kam', 'kan', 'kar', 'kas', 'kau', 'kaw', 'kaz', 'kbd', 'kha', 'khi', 'khm', 'kho',
|
||||
'kik', 'kin', 'kir', 'kmb', 'kok', 'kom', 'kon', 'kor', 'kos', 'kpe', 'krc', 'kro',
|
||||
'kru', 'kua', 'kum', 'kur', 'kut', 'lad', 'lah', 'lam', 'lao', 'lat', 'lav', 'lez',
|
||||
'lim', 'lin', 'lit', 'lol', 'loz', 'ltz', 'lua', 'lub', 'lug', 'lui', 'lun', 'luo',
|
||||
'lus', 'mac', 'mad', 'mag', 'mah', 'mai', 'mak', 'mal', 'man', 'mao', 'map', 'mar',
|
||||
'mas', 'may', 'mdf', 'mdr', 'men', 'mga', 'mic', 'min', 'mkh', 'mlg', 'mlt', 'mnc',
|
||||
'mni', 'mno', 'moh', 'mon', 'mos', 'mun', 'mus', 'mwl', 'mwr', 'myn', 'myv', 'nah',
|
||||
'nai', 'nap', 'nau', 'nav', 'nbl', 'nde', 'ndo', 'nds', 'nep', 'new', 'nia', 'nic',
|
||||
'niu', 'nno', 'nob', 'nog', 'non', 'nor', 'nso', 'nub', 'nwc', 'nya', 'nym', 'nyn',
|
||||
'nyo', 'nzi', 'oci', 'oji', 'ori', 'orm', 'osa', 'oss', 'ota', 'oto', 'paa', 'pag',
|
||||
'pal', 'pam', 'pan', 'pap', 'pau', 'peo', 'per', 'phi', 'phn', 'pli', 'pol', 'pon',
|
||||
'por', 'pra', 'pro', 'pus', 'que', 'raj', 'rap', 'rar', 'roa', 'roh', 'rom', 'rum',
|
||||
'run', 'rup', 'rus', 'sad', 'sag', 'sah', 'sai', 'sal', 'sam', 'san', 'sas', 'sat',
|
||||
'scn', 'sco', 'sel', 'sem', 'sga', 'sgn', 'shn', 'sid', 'sin', 'sio', 'sit', 'sla',
|
||||
'slo', 'slv', 'sma', 'sme', 'smi', 'smj', 'smn', 'smo', 'sms', 'sna', 'snd', 'snk',
|
||||
'sog', 'som', 'son', 'sot', 'spa', 'srd', 'srp', 'srr', 'ssa', 'ssw', 'suk', 'sun',
|
||||
'sus', 'sux', 'swa', 'swe', 'syr', 'tah', 'tai', 'tam', 'tat', 'tel', 'tem', 'ter',
|
||||
'tet', 'tgk', 'tgl', 'tha', 'tib', 'tig', 'tir', 'tiv', 'tkl', 'tlh', 'tli', 'tmh',
|
||||
'tog', 'ton', 'tpi', 'tsi', 'tsn', 'tso', 'tuk', 'tum', 'tup', 'tur', 'tut', 'tvl',
|
||||
'twi', 'tyv', 'udm', 'uga', 'uig', 'ukr', 'umb', 'urd', 'uzb', 'vai', 'ven', 'vie',
|
||||
'vol', 'vot', 'wak', 'wal', 'war', 'was', 'wel', 'wen', 'wln', 'wol', 'xal', 'xho',
|
||||
'yao', 'yap', 'yid', 'yor', 'ypk', 'zap', 'zen', 'zha', 'znd', 'zul', 'zun',
|
||||
'por-BR', 'rum-MD'])
|
||||
language_map = {'mol': Language('rum-MD'), 'scc': Language('srp'), 'pob': Language('por-BR'),
|
||||
Language('rum-MD'): 'mol', Language('srp'): 'scc', Language('por-BR'): 'pob'}
|
||||
language_code = 'alpha3'
|
||||
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_code(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_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_checked(self, video, languages):
|
||||
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
|
||||
@@ -1,110 +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 ..language import language_set, Language
|
||||
from ..subtitles import get_subtitle_path, ResultSubtitle
|
||||
from ..utils import to_unicode
|
||||
from ..videos import Episode, Movie
|
||||
from hashlib import md5, sha256
|
||||
import logging
|
||||
import xmlrpclib
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class Podnapisi(ServiceBase):
|
||||
server_url = 'http://ssp.podnapisi.net:8000'
|
||||
api_based = True
|
||||
languages = language_set(['ar', 'be', 'bg', 'bs', 'ca', 'ca', 'cs', 'da', 'de', 'el', 'en',
|
||||
'es', 'et', 'fa', 'fi', 'fr', 'ga', 'he', 'hi', 'hr', 'hu', 'id',
|
||||
'is', 'it', 'ja', 'ko', 'lt', 'lv', 'mk', 'ms', 'nl', 'nn', 'pl',
|
||||
'pt', 'ro', 'ru', 'sk', 'sl', 'sq', 'sr', 'sv', 'th', 'tr', 'uk',
|
||||
'vi', 'zh', 'es-ar', 'pt-br'])
|
||||
language_map = {'jp': Language('jpn'), Language('jpn'): 'jp',
|
||||
'gr': Language('gre'), Language('gre'): 'gr',
|
||||
'pb': Language('por-BR'), Language('por-BR'): 'pb',
|
||||
'ag': Language('spa-AR'), Language('spa-AR'): 'ag',
|
||||
'cyr': Language('srp')}
|
||||
videos = [Episode, Movie]
|
||||
require_video = True
|
||||
|
||||
def __init__(self, config=None):
|
||||
super(Podnapisi, self).__init__(config)
|
||||
self.server = xmlrpclib.ServerProxy(self.server_url)
|
||||
self.token = None
|
||||
|
||||
def init(self):
|
||||
super(Podnapisi, self).init()
|
||||
result = self.server.initiate(self.user_agent)
|
||||
if result['status'] != 200:
|
||||
raise ServiceError('Initiate failed')
|
||||
username = 'python_subliminal'
|
||||
password = sha256(md5('XWFXQ6gE5Oe12rv4qxXX').hexdigest() + result['nonce']).hexdigest()
|
||||
self.token = result['session']
|
||||
result = self.server.authenticate(self.token, username, password)
|
||||
if result['status'] != 200:
|
||||
raise ServiceError('Authenticate failed')
|
||||
|
||||
def terminate(self):
|
||||
super(Podnapisi, self).terminate()
|
||||
|
||||
def query(self, filepath, languages, moviehash):
|
||||
results = self.server.search(self.token, [moviehash])
|
||||
if results['status'] != 200:
|
||||
logger.error('Search failed with error code %d' % results['status'])
|
||||
return []
|
||||
if not results['results'] or not results['results'][moviehash]['subtitles']:
|
||||
logger.debug(u'Could not find subtitles for %r with token %s' % (moviehash, self.token))
|
||||
return []
|
||||
subtitles = []
|
||||
for result in results['results'][moviehash]['subtitles']:
|
||||
language = self.get_language(result['lang'])
|
||||
if language not in languages:
|
||||
continue
|
||||
path = get_subtitle_path(filepath, language, self.config.multi)
|
||||
subtitle = ResultSubtitle(path, language, service=self.__class__.__name__.lower(), link=result['id'],
|
||||
release=to_unicode(result['release']), confidence=result['weight'])
|
||||
subtitles.append(subtitle)
|
||||
if not subtitles:
|
||||
return []
|
||||
# Convert weight to confidence
|
||||
max_weight = float(max([s.confidence for s in subtitles]))
|
||||
min_weight = float(min([s.confidence for s in subtitles]))
|
||||
for subtitle in subtitles:
|
||||
if max_weight == 0 and min_weight == 0:
|
||||
subtitle.confidence = 1.0
|
||||
else:
|
||||
subtitle.confidence = (subtitle.confidence - min_weight) / (max_weight - min_weight)
|
||||
return subtitles
|
||||
|
||||
def list_checked(self, video, languages):
|
||||
results = self.query(video.path, languages, video.hashes['OpenSubtitles'])
|
||||
return results
|
||||
|
||||
def download(self, subtitle):
|
||||
results = self.server.download(self.token, [subtitle.link])
|
||||
if results['status'] != 200:
|
||||
raise DownloadFailedError()
|
||||
subtitle.link = 'http://www.podnapisi.net/static/podnapisi/' + results['names'][0]['filename']
|
||||
self.download_file(subtitle.link, subtitle.path)
|
||||
return subtitle
|
||||
|
||||
|
||||
Service = Podnapisi
|
||||
@@ -1,101 +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 ..language import language_set, Language
|
||||
from ..subtitles import get_subtitle_path, ResultSubtitle
|
||||
from ..videos import Episode, Movie
|
||||
from bs4 import BeautifulSoup
|
||||
from subliminal.utils import get_keywords, split_keyword
|
||||
import logging
|
||||
import re
|
||||
import urllib
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class SubsWiki(ServiceBase):
|
||||
server_url = 'http://www.subswiki.com'
|
||||
api_based = False
|
||||
languages = language_set(['eng-US', 'eng-GB', 'eng', 'fre', 'por-BR', 'por', 'spa-ES', u'spa', u'ita', u'cat'])
|
||||
language_map = {u'Español': Language('spa'), u'Español (España)': Language('spa'), u'Español (Latinoamérica)': Language('spa'),
|
||||
u'Català': Language('cat'), u'Brazilian': Language('por-BR'), u'English (US)': Language('eng-US'),
|
||||
u'English (UK)': Language('eng-GB')}
|
||||
language_code = 'name'
|
||||
videos = [Episode, Movie]
|
||||
require_video = False
|
||||
release_pattern = re.compile('\nVersion (.+), ([0-9]+).([0-9])+ MBs')
|
||||
required_features = ['permissive']
|
||||
|
||||
def list_checked(self, video, languages):
|
||||
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(r.content, self.required_features)
|
||||
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_language(html_language.string.strip())
|
||||
if language not 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
|
||||
@@ -1,87 +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 ..language import language_set, Language
|
||||
from ..subtitles import get_subtitle_path, ResultSubtitle
|
||||
from ..videos import Episode
|
||||
from bs4 import BeautifulSoup
|
||||
from subliminal.utils import get_keywords, split_keyword
|
||||
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 = language_set(['eng-US', 'eng-GB', 'eng', 'fre', 'por-BR', 'por', 'spa-ES', u'spa', u'ita', u'cat'])
|
||||
language_map = {u'Español': Language('spa'), u'Español (España)': Language('spa'), u'Español (Latinoamérica)': Language('spa'),
|
||||
u'Català': Language('cat'), u'Brazilian': Language('por-BR'), u'English (US)': Language('eng-US'),
|
||||
u'English (UK)': Language('eng-GB')}
|
||||
language_code = 'name'
|
||||
videos = [Episode]
|
||||
require_video = False
|
||||
required_features = ['permissive']
|
||||
# the '.+' in the pattern for Version allows us to match both 'ó'
|
||||
# and the 'ó' char directly. This is because now BS4 converts the html
|
||||
# code chars into their equivalent unicode char
|
||||
release_pattern = re.compile('Versi.+n (.+) ([0-9]+).([0-9])+ megabytes')
|
||||
|
||||
def list_checked(self, video, languages):
|
||||
return self.query(video.path or video.release, languages, get_keywords(video.guess), video.series, video.season, video.episode)
|
||||
|
||||
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(r.content, self.required_features)
|
||||
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_language(html_language.findNext('li', {'class': 'li-idioma'}).find('strong').contents[0].string.strip())
|
||||
if language not 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
|
||||
@@ -1,63 +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 ..language import language_set
|
||||
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'
|
||||
user_agent = 'SubDB/1.0 (subliminal/0.6; https://github.com/Diaoul/subliminal)'
|
||||
api_based = True
|
||||
# Source: http://api.thesubdb.com/?action=languages
|
||||
languages = language_set(['af', 'cs', 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'id', 'it',
|
||||
'la', 'nl', 'no', 'oc', 'pl', 'pt', 'ro', 'ru', 'sl', 'sr', 'sv',
|
||||
'tr'])
|
||||
videos = [Movie, Episode, UnknownVideo]
|
||||
require_video = True
|
||||
|
||||
def list_checked(self, video, languages):
|
||||
return self.query(video.path, video.hashes['TheSubDB'], languages)
|
||||
|
||||
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 = language_set(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, self.__class__.__name__.lower(), '%s?action=download&hash=%s&language=%s' % (self.server_url, moviehash, language.alpha2))
|
||||
subtitles.append(subtitle)
|
||||
return subtitles
|
||||
|
||||
|
||||
Service = TheSubDB
|
||||
@@ -1,141 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright 2012 Nicolas Wack <wackou@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 ..cache import cachedmethod
|
||||
from ..language import language_set, Language
|
||||
from ..subtitles import get_subtitle_path, ResultSubtitle
|
||||
from ..utils import get_keywords
|
||||
from ..videos import Episode
|
||||
from bs4 import BeautifulSoup
|
||||
import logging
|
||||
import re
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def match(pattern, string):
|
||||
try:
|
||||
return re.search(pattern, string).group(1)
|
||||
except AttributeError:
|
||||
logger.debug(u'Could not match %r on %r' % (pattern, string))
|
||||
return None
|
||||
|
||||
|
||||
class TvSubtitles(ServiceBase):
|
||||
server_url = 'http://www.tvsubtitles.net'
|
||||
api_based = False
|
||||
languages = language_set(['ar', 'bg', 'cs', 'da', 'de', 'el', 'en', 'es', 'fi', 'fr', 'hu',
|
||||
'it', 'ja', 'ko', 'nl', 'pl', 'pt', 'ro', 'ru', 'sv', 'tr', 'uk',
|
||||
'zh', 'pt-br'])
|
||||
#TODO: Find more exceptions
|
||||
language_map = {'gr': Language('gre'), 'cz': Language('cze'), 'ua': Language('ukr')}
|
||||
videos = [Episode]
|
||||
require_video = False
|
||||
required_features = ['permissive']
|
||||
|
||||
@cachedmethod
|
||||
def get_likely_series_id(self, name):
|
||||
r = self.session.post('%s/search.php' % self.server_url, data={'q': name})
|
||||
soup = BeautifulSoup(r.content, self.required_features)
|
||||
maindiv = soup.find('div', 'left')
|
||||
results = []
|
||||
for elem in maindiv.find_all('li'):
|
||||
sid = int(match('tvshow-([0-9]+)\.html', elem.a['href']))
|
||||
show_name = match('(.*) \(', elem.a.text)
|
||||
results.append((show_name, sid))
|
||||
#TODO: pick up the best one in a smart way
|
||||
result = results[0]
|
||||
return result[1]
|
||||
|
||||
@cachedmethod
|
||||
def get_episode_id(self, series_id, season, number):
|
||||
"""Get the TvSubtitles id for the given episode. Raises KeyError if none
|
||||
could be found."""
|
||||
# download the page of the season, contains ids for all episodes
|
||||
episode_id = None
|
||||
r = self.session.get('%s/tvshow-%d-%d.html' % (self.server_url, series_id, season))
|
||||
soup = BeautifulSoup(r.content, self.required_features)
|
||||
table = soup.find('table', id='table5')
|
||||
for row in table.find_all('tr'):
|
||||
cells = row.find_all('td')
|
||||
if not cells:
|
||||
continue
|
||||
episode_number = match('x([0-9]+)', cells[0].text)
|
||||
if not episode_number:
|
||||
continue
|
||||
episode_number = int(episode_number)
|
||||
episode_id = int(match('episode-([0-9]+)', cells[1].a['href']))
|
||||
# we could just return the id of the queried episode, but as we
|
||||
# already downloaded the whole page we might as well fill in the
|
||||
# information for all the episodes of the season
|
||||
self.cache_for(self.get_episode_id, args=(series_id, season, episode_number), result=episode_id)
|
||||
# raises KeyError if not found
|
||||
return self.cached_value(self.get_episode_id, args=(series_id, season, number))
|
||||
|
||||
# Do not cache this method in order to always check for the most recent
|
||||
# subtitles
|
||||
def get_sub_ids(self, episode_id):
|
||||
subids = []
|
||||
r = self.session.get('%s/episode-%d.html' % (self.server_url, episode_id))
|
||||
epsoup = BeautifulSoup(r.content, self.required_features)
|
||||
for subdiv in epsoup.find_all('a'):
|
||||
if 'href' not in subdiv.attrs or not subdiv['href'].startswith('/subtitle'):
|
||||
continue
|
||||
subid = int(match('([0-9]+)', subdiv['href']))
|
||||
lang = self.get_language(match('flags/(.*).gif', subdiv.img['src']))
|
||||
result = {'subid': subid, 'language': lang}
|
||||
for p in subdiv.find_all('p'):
|
||||
if 'alt' in p.attrs and p['alt'] == 'rip':
|
||||
result['rip'] = p.text.strip()
|
||||
if 'alt' in p.attrs and p['alt'] == 'release':
|
||||
result['release'] = p.text.strip()
|
||||
subids.append(result)
|
||||
return subids
|
||||
|
||||
def list_checked(self, video, languages):
|
||||
return self.query(video.path or video.release, languages, get_keywords(video.guess), video.series, video.season, video.episode)
|
||||
|
||||
def query(self, filepath, languages, keywords, series, season, episode):
|
||||
logger.debug(u'Getting subtitles for %s season %d episode %d with languages %r' % (series, season, episode, languages))
|
||||
self.init_cache()
|
||||
sid = self.get_likely_series_id(series.lower())
|
||||
try:
|
||||
ep_id = self.get_episode_id(sid, season, episode)
|
||||
except KeyError:
|
||||
logger.debug(u'Could not find episode id for %s season %d episode %d' % (series, season, episode))
|
||||
return []
|
||||
subids = self.get_sub_ids(ep_id)
|
||||
# filter the subtitles with our queried languages
|
||||
subtitles = []
|
||||
for subid in subids:
|
||||
language = subid['language']
|
||||
if language not in languages:
|
||||
continue
|
||||
path = get_subtitle_path(filepath, language, self.config.multi)
|
||||
subtitle = ResultSubtitle(path, language, self.__class__.__name__.lower(),
|
||||
'%s/download-%d.html' % (self.server_url, subid['subid']),
|
||||
keywords=[subid['rip'], subid['release']])
|
||||
subtitles.append(subtitle)
|
||||
return subtitles
|
||||
|
||||
def download(self, subtitle):
|
||||
self.download_zip_file(subtitle.link, subtitle.path)
|
||||
|
||||
|
||||
Service = TvSubtitles
|
||||
@@ -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')
|
||||
@@ -1,138 +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 .language import 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 language: language of the subtitle
|
||||
:type language: :class:`~subliminal.language.Language`
|
||||
|
||||
"""
|
||||
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 language: language of the subtitle
|
||||
:type language: :class:`~subliminal.language.Language`
|
||||
: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 = Language(subtitle.language) or None
|
||||
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:]
|
||||
language = Language(language) or None
|
||||
return cls(path, language)
|
||||
|
||||
|
||||
class ResultSubtitle(ExternalSubtitle):
|
||||
"""Subtitle found using :mod:`~subliminal.services`
|
||||
|
||||
:param string path: path to the subtitle
|
||||
:param language: language of the subtitle
|
||||
:type language: :class:`~subliminal.language.Language`
|
||||
: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:]
|
||||
return Language(language) == Language('und')
|
||||
|
||||
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
|
||||
|
||||
:param string video_path: path to the video
|
||||
:param language: language of the subtitle
|
||||
:type language: :class:`~subliminal.language.Language`
|
||||
:param bool multi: whether to use multi language naming or not
|
||||
:return: path of the subtitle
|
||||
:rtype: string
|
||||
|
||||
"""
|
||||
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.alpha2, EXTENSIONS[0])
|
||||
return path + '%s' % EXTENSIONS[0]
|
||||
@@ -1,68 +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):
|
||||
super(ListTask, self).__init__()
|
||||
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):
|
||||
super(DownloadTask, self).__init__()
|
||||
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
|
||||
@@ -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')
|
||||
@@ -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()
|
||||
@@ -1,282 +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
|
||||
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:
|
||||
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])
|
||||
|
||||
# cannot use glob here because it chokes if there are any square
|
||||
# brackets inside the filename, so we have to use basic string
|
||||
# startswith/endswith comparisons
|
||||
folder, basename = os.path.split(basepath)
|
||||
existing = [f for f in os.listdir(folder) if f.startswith(basename)]
|
||||
for path in existing:
|
||||
for ext in subtitles.EXTENSIONS:
|
||||
if path.endswith(ext):
|
||||
possible_lang = path[len(basename) + 1:-len(ext)]
|
||||
if possible_lang == '':
|
||||
results.append(subtitles.ExternalSubtitle(path, None))
|
||||
else:
|
||||
lang = guessit.Language(possible_lang)
|
||||
if lang:
|
||||
results.append(subtitles.ExternalSubtitle(path, lang))
|
||||
return results
|
||||
|
||||
def __repr__(self):
|
||||
return '%s(%r)' % (self.__class__.__name__, self.release)
|
||||
|
||||
def __hash__(self):
|
||||
return hash(self.path or 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, scan_filter=None, depth=0):
|
||||
"""Scan a path for videos and subtitles
|
||||
|
||||
:param string entry: path
|
||||
:param int max_depth: maximum folder depth
|
||||
:param function scan_filter: filter function that takes a path as argument and returns a boolean indicating whether it has to be filtered out (``True``) or not (``False``)
|
||||
: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, scan_filter, 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 []
|
||||
if scan_filter is not None and scan_filter(entry):
|
||||
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
|
||||
@@ -1,26 +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 test_language, test_services, test_subliminal
|
||||
import unittest
|
||||
|
||||
|
||||
suite = unittest.TestSuite([test_language.suite(), test_services.suite(), test_subliminal.suite()])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.TextTestRunner().run(suite)
|
||||
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
@@ -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> \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&send=false&layout=button_count&width=450&show_faces=false&action=like&colorscheme=light&font=tahoma&height=21&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> \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&send=false&layout=button_count&width=450&show_faces=false&action=like&colorscheme=light&font=tahoma&height=21&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> \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&send=false&layout=button_count&width=450&show_faces=false&action=like&colorscheme=light&font=tahoma&height=21&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> \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&send=false&layout=button_count&width=450&show_faces=false&action=like&colorscheme=light&font=tahoma&height=21&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\"/> \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> <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> ?</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> \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&send=false&layout=button_count&width=450&show_faces=false&action=like&colorscheme=light&font=tahoma&height=21&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\"/> \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> \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&send=false&layout=button_count&width=450&show_faces=false&action=like&colorscheme=light&font=tahoma&height=21&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\"/> \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> <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> ?</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> \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&send=false&layout=button_count&width=450&show_faces=false&action=like&colorscheme=light&font=tahoma&height=21&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\"/> \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> <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> ?</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> \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&send=false&layout=button_count&width=450&show_faces=false&action=like&colorscheme=light&font=tahoma&height=21&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\"/> \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> <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> ?</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
|
||||
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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 |
|
||||
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
|
||||
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
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user