simple-justwatch-python-api 0.17__tar.gz → 0.18.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: simple-justwatch-python-api
3
- Version: 0.17
3
+ Version: 0.18.0
4
4
  Summary: A simple JustWatch Python API
5
5
  Keywords: justwatch,api,graphql
6
6
  Author: Electronic Mango
@@ -682,6 +682,7 @@ License: GNU GENERAL PUBLIC LICENSE
682
682
  Classifier: Development Status :: 3 - Alpha
683
683
  Classifier: Intended Audience :: Developers
684
684
  Classifier: Topic :: Software Development :: Build Tools
685
+ Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
685
686
  Classifier: Programming Language :: Python :: 3
686
687
  Classifier: Programming Language :: Python :: 3.11
687
688
  Classifier: Programming Language :: Python :: 3.12
@@ -749,20 +750,28 @@ Example outputs from all functions are in [`examples/`](examples/) directory.
749
750
  Search functions allows for searching entries based on a given title.
750
751
 
751
752
  ```python
752
- from simplejustwatchapi.justwatch import search
753
+ from simplejustwatchapi import search
753
754
 
754
- results = search("title", "US", "en", 5, True)
755
+ results = search("title", "US", "en", 5, True, 0, {"nfx", "apv"})
755
756
  ```
756
757
 
757
- Only the first argument is required, it specifies a title to search.
758
+ No arguments are required.
758
759
 
759
- | | Argument | Type | Required | Default value | Description |
760
- |---|-------------|--------|----------|---------------|--------------------------------------------------------|
761
- | 1 | `title` | `str` | **YES** | - | Title to look up |
762
- | 2 | `country` | `str` | NO | `"US"` | Country to search for offers |
763
- | 3 | `language` | `str` | NO | `"en"` | Language of responses |
764
- | 4 | `count` | `int` | NO | `4` | Up to how many entries should be returned |
765
- | 5 | `best_only` | `bool` | NO | `True` | Determines whether only best offers should be returned |
760
+ | | Argument | Type | Required | Default value | Description |
761
+ |---|-------------|--------|----------|---------------------|--------------------------------------------------------|
762
+ | 1 | `title` | `str` | NO | - | Title to look up |
763
+ | 2 | `country` | `str` | NO | `"US"` | Country to search for offers |
764
+ | 3 | `language` | `str` | NO | `"en"` | Language of responses |
765
+ | 4 | `count` | `int` | NO | `4` | Up to how many entries should be returned |
766
+ | 5 | `best_only` | `bool` | NO | `True` | Determines whether only best offers should be returned |
767
+ | 6 | `offset` | `int` | NO | `0` | How many titles should be skipped from the output |
768
+ | 7 | `providers` | `list[str] \| str \| None`| NO | `None` | Determines whether only best offers should be returned |
769
+
770
+ `title` is just a string to look up. If empty, or not provided, you'll get a selection of popular titles,
771
+ similar to [`popular`](#popular) function.
772
+
773
+ > **Note**: value of `title` isn't stripped, so passing a string
774
+ with multiple spaces will look them up. For more than 1 space it will (probably) always return an empty list.
766
775
 
767
776
  `country` must be **ISO 3166-1 alpha-2** 2-letter code , e.g. `US`, `GB`, `FR`.
768
777
  It should be uppercase, however lowercase codes are automatically converted to uppercase.
@@ -775,6 +784,19 @@ If JustWatch GraphQL API returns fewer entries, then this function will also ret
775
784
  `best_only` determines whether similar offers, but lower quality should be included in response.
776
785
  If a platform offers streaming for a given entry in 4K, HD and SD, then `best_only = True` will return only the 4K offer, `best_only = False` will return all three.
777
786
 
787
+ `offset` allows for very basic pagination, letting you get more data without running into [request complexity](#request-complexity).
788
+ It simply skips `offset` number of first entries (on the API side, nothing is done inside the library).
789
+ Since there is no session there's no guarantee of results "stability" - if JustWatch decides to
790
+ shuffle returned values (I'm not sure what would be the reason, but in theory it's possible)
791
+ you might get repeats, or missing entries. It's also not possible to get **all** the data,
792
+ only up to 1999, check [Maximum number of entries](#maximum-number-of-entries) for details.
793
+
794
+ `providers` is a selection of (usually) **3-letter** identifiers for a service provider ("Netflix", "Amazon Prime Video", etc.).
795
+ It can be either a list, or (for single providers) a string.
796
+ `None` (used as default) turns off any filtering based on providers.
797
+ You can get the possible values through [`providers`](#providers) function and `short_name` field from returned `OfferPackage` NamedTuples,
798
+ or check [Provider codes](#provider-codes) for more details.
799
+
778
800
  Returned value is a list of [`MediaEntry`](#return-data-structures) objects.
779
801
 
780
802
  For very large searches (high `count` value) I recommend using default `best_only=True` to avoid issues with [request complexity](#request-complexity).
@@ -782,6 +804,57 @@ For very large searches (high `count` value) I recommend using default `best_onl
782
804
  Example function call and its output is in [`examples/search_output.py`](examples/search_output.py).
783
805
 
784
806
 
807
+ ### Popular
808
+ Look up all currently popular titles.
809
+ The usage and output will be similar to [`search`](#search), function without any titles specified.
810
+
811
+ ```python
812
+ from simplejustwatchapi import popular
813
+
814
+ results = popular("US", "en", 5, True, 0, {"nfx", "apv"})
815
+ ```
816
+
817
+ No arguments are required.
818
+
819
+ | | Argument | Type | Required | Default value | Description |
820
+ |---|-------------|--------|----------|---------------------|--------------------------------------------------------|
821
+ | 1 | `country` | `str` | NO | `"US"` | Country to search for titles |
822
+ | 2 | `language` | `str` | NO | `"en"` | Language of responses |
823
+ | 3 | `count` | `int` | NO | `4` | Up to how many entries should be returned |
824
+ | 4 | `best_only` | `bool` | NO | `True` | Determines whether only best offers should be returned |
825
+ | 5 | `offset` | `int` | NO | `0` | How many titles should be skipped from the output |
826
+ | 6 | `providers` | `list[str] \| str \| None`| NO | `None` | Determines whether only best offers should be returned |
827
+
828
+ `country` must be **ISO 3166-1 alpha-2** 2-letter code , e.g. `US`, `GB`, `FR`.
829
+ It should be uppercase, however lowercase codes are automatically converted to uppercase.
830
+
831
+ `language` is a **ISO 639-1** (usually) 2-letter code, lowercase, e.g. `en`, `fr`.
832
+
833
+ `count` determines **up to** how many entries should be returned.
834
+ If JustWatch GraphQL API returns fewer entries, then this function will also return fewer values.
835
+
836
+ `best_only` determines whether similar offers, but lower quality should be included in response.
837
+ If a platform offers streaming for a given entry in 4K, HD and SD, then `best_only = True` will return only the 4K offer, `best_only = False` will return all three.
838
+
839
+ `offset` allows for very basic pagination letting you get more data without running into [request complexity](#request-complexity).
840
+ It simply skips first entries (on the API side, nothing is done inside the library).
841
+ Since there is no session there's no guarantee of results "stability" - if JustWatch decides to
842
+ shuffle returned values (I'm not sure what would be the reason, but in theory it's possible)
843
+ you might get repeats, or missing entries. It's also not possible to get **all** the data,
844
+ only up to 2000, check [Maximum number of entries](#maximum-number-of-entries) for details.
845
+
846
+ `providers` is a selection of (usually) **3-letter** identifiers for a service provider ("Netflix", "Amazon Prime Video", etc.).
847
+ It can be either a list, or (for single providers) a string.
848
+ `None` (used as default) turns off any filtering based on providers.
849
+ You can get the possible values through [`providers`](#providers) function and `short_name` field from returned `OfferPackage` NamedTuples,
850
+ or check [Provider codes](#provider-codes) for more details.
851
+
852
+ Returned value is a list of [`MediaEntry`](#return-data-structures) objects.
853
+
854
+ For very large searches (high `count` value) I recommend using default `best_only=True` to avoid issues with [request complexity](#request-complexity).
855
+
856
+ Example function call and its output is in [`examples/popular_output.py`](examples/popular_output.py).
857
+
785
858
  ### Details
786
859
 
787
860
  Details function allows for looking up details for a single entry via its node ID.
@@ -795,7 +868,7 @@ If you want to get seasons/episodes you can use the ID from [`search`](#search)
795
868
 
796
869
  Usage is similar to [`search`](#search) function, just without `count` argument:
797
870
  ```python
798
- from simplejustwatchapi.justwatch import details
871
+ from simplejustwatchapi import details
799
872
 
800
873
  results = details("nodeID", "US", "en", False)
801
874
  ```
@@ -836,7 +909,7 @@ Each season contains similar data to the [`details`](#details) function, with ad
836
909
 
837
910
  Usage also matches [`details`](#details) function:
838
911
  ```python
839
- from simplejustwatchapi.justwatch import seasons
912
+ from simplejustwatchapi import seasons
840
913
 
841
914
  results = seasons("nodeID", "US", "en", False)
842
915
  ```
@@ -860,7 +933,7 @@ Node/season ID can be taken from output of the [`seasons`](#seasons) function.
860
933
 
861
934
  Usage matches [`details`](#details) function:
862
935
  ```python
863
- from simplejustwatchapi.justwatch import seasons
936
+ from simplejustwatchapi import seasons
864
937
 
865
938
  results = seasons("nodeID", "US", "en", False)
866
939
  ```
@@ -886,7 +959,7 @@ It allows specifying a set of countries, instead of a single one.
886
959
  This way you can simultaneously look up offers for multiple countries.
887
960
 
888
961
  ```python
889
- from simplejustwatchapi.justwatch import offers_for_countries
962
+ from simplejustwatchapi import offers_for_countries
890
963
 
891
964
  results = offers_for_countries("nodeID", {"US", "UK", "CA"}, "en", True)
892
965
  ```
@@ -907,8 +980,35 @@ Returned value `dict[str, list[Offer]]`, where key is country given as argument
907
980
  Example function call and its output is in [`examples/offers_for_countries_output.py`](examples/offers_for_countries_output.py).
908
981
 
909
982
 
983
+ ### Providers
984
+
985
+ Get all available service providers ("Netflix", "Amazon Prime Video, etc.) for a given country.
910
986
 
911
- ## Return data structures
987
+ ```python
988
+ from simplejustwatchapi import providers
989
+
990
+ results = providers("US")
991
+ ```
992
+
993
+ | | Argument | Type | Required | Default value | Description |
994
+ |---|-------------|--------|----------|---------------|---------------------------------|
995
+ | 1 | `country` | `str` | NO | `"US"` | Country to search for providers |
996
+
997
+ `country` must be **ISO 3166-1 alpha-2** 2-letter code , e.g. `US`, `GB`, `FR`.
998
+ It should be uppercase, however lowercase codes are automatically converted to uppercase.
999
+
1000
+ Returned value is a list of `OfferPackage` tuples.
1001
+ Initially they were meant to be used for `Offer` in `MediaEntry`/`Episode`, however the data structure
1002
+ matches output here, so it's reused.
1003
+
1004
+ You can use this function to get values for providers for [`search`](#search) and [`popular`](#popular) functions,
1005
+ the `short_name` field in returned `OfferPackage` tuples is the exact 3-letter code needed there.
1006
+
1007
+ Example function call and its output is in [`examples/providers_output.py`](examples/providers_output.py).
1008
+
1009
+
1010
+
1011
+ ## Data structures
912
1012
 
913
1013
  Detailed descriptions of all used data structures are available in the [documentation](https://electronic-mango.github.io/simple-justwatch-python-api/simplejustwatchapi.html#module-simplejustwatchapi.query).
914
1014
 
@@ -955,6 +1055,112 @@ Using `best_only=True` should alleviate the issue somewhat, so for very large re
955
1055
 
956
1056
 
957
1057
 
1058
+ ## Maximum number of entries
1059
+
1060
+ The JustWatch API itself won't allow for getting more than 1999 entries, through `count` and `offset`, regardless of request complexity.
1061
+ If you try to get the 2000th entry the API (and functions in this libary) will return an empty list.
1062
+
1063
+ **If you try to access over the 1999th entry you won't get *up to* 1999 entries, you'll get an empty list.**
1064
+
1065
+ For example, this will get you entries 1990 - 1999 - a 9 element list of `MediaEntry`, as expected:
1066
+
1067
+ ```python
1068
+ from simplejustwatchapi import search
1069
+
1070
+ results = search("title", count=9, offset=1990)
1071
+ # len(results) == 9, as expected
1072
+ ```
1073
+
1074
+ But trying to get 1990 - 2000 will result in an empty list:
1075
+
1076
+ ```python
1077
+ from simplejustwatchapi import search
1078
+
1079
+ results = search("title", count=10, offset=1990)
1080
+ # len(results) == 0, API responded with empty list
1081
+ ```
1082
+
1083
+ Overshooting will also result in an empty list:
1084
+
1085
+ ```python
1086
+ from simplejustwatchapi import search
1087
+
1088
+ results = search("title", count=100, offset=1950)
1089
+ # len(results) == 0, API responded with empty list
1090
+ ```
1091
+
1092
+ Interestingly, you'll still hit [too high request complexity](#request-complexity)
1093
+ for too high values of `count`, even though you'd get an empty list anyway:
1094
+
1095
+ ```python
1096
+ from simplejustwatchapi import search
1097
+
1098
+ results = search("title", count=200, offset=1950)
1099
+ # Errors out due to complexity
1100
+ ```
1101
+
1102
+
1103
+
1104
+ ## Provider codes
1105
+
1106
+ One note to keep in mind - the codes can be different for different countries.
1107
+
1108
+
1109
+ ### [`providers`](#providers) function
1110
+
1111
+ The easiest way of getting all provider codes for filtering in [`search`](#search) and [`popular`](#popular) functions
1112
+ is through [`providers`](#providers) function, for example:
1113
+
1114
+ ```python
1115
+ from simplejustwatchapi import popular, providers
1116
+
1117
+ codes = [
1118
+ package.short_name
1119
+ for package
1120
+ in providers("GB") # Look up all providers in the UK.
1121
+ if package.name in ("Netflix", "Amazon Prime Video") # Only get codes for specific providers
1122
+ ]
1123
+
1124
+ # codes == ["nfx", "amp"]
1125
+
1126
+ # Get popular titles only for selected providers:
1127
+ popular_netflix_amazon = popular(providers=codes)
1128
+ ```
1129
+
1130
+
1131
+ ### Query parameters from JustWatch
1132
+
1133
+ You can also get them by going to [JustWatch main page](https://www.justwatch.com/)
1134
+ and selecting **at least 2** of available services.
1135
+ **You need 2**, for 1 you'll get its full name.
1136
+ Only for multiple you'll get the needed codes as `?providers=<code1>+<code2>+...` query parameter,
1137
+ for example on US version the URL when selecting "Netflix" and "Amazon Prime Video" is:
1138
+
1139
+ ```url
1140
+ https://www.justwatch.com/us?providers=nfx,prv
1141
+ ```
1142
+
1143
+ So the codes for them are `nfx` and `prv` for the US.
1144
+
1145
+
1146
+ ### Stored output from other functions with offers
1147
+
1148
+ The codes are also returned when looking up offers (through pretty much any function aside from `providers`) through `OfferPackage` and its `short_name` field.
1149
+ For example, to get a `dict` "**full name**": "**code**" you can:
1150
+
1151
+ ```python
1152
+ from simplejustwatchapi import search
1153
+
1154
+ results = search("title", "US", "en", 5, True)
1155
+ name_to_code_dict = {
1156
+ offer.package.name: offer.package.short_name # Get name and short_name/code from packages
1157
+ for entry in results # Iterate all entries
1158
+ for offer in entry.offers # Iterate all offers per entry
1159
+ }
1160
+ ```
1161
+
1162
+
1163
+
958
1164
  ## Disclaimer
959
1165
 
960
1166
  This API is in no way affiliated, associated, authorized, endorsed by, or in any way officially connected with JustWatch.
@@ -53,20 +53,28 @@ Example outputs from all functions are in [`examples/`](examples/) directory.
53
53
  Search functions allows for searching entries based on a given title.
54
54
 
55
55
  ```python
56
- from simplejustwatchapi.justwatch import search
56
+ from simplejustwatchapi import search
57
57
 
58
- results = search("title", "US", "en", 5, True)
58
+ results = search("title", "US", "en", 5, True, 0, {"nfx", "apv"})
59
59
  ```
60
60
 
61
- Only the first argument is required, it specifies a title to search.
61
+ No arguments are required.
62
62
 
63
- | | Argument | Type | Required | Default value | Description |
64
- |---|-------------|--------|----------|---------------|--------------------------------------------------------|
65
- | 1 | `title` | `str` | **YES** | - | Title to look up |
66
- | 2 | `country` | `str` | NO | `"US"` | Country to search for offers |
67
- | 3 | `language` | `str` | NO | `"en"` | Language of responses |
68
- | 4 | `count` | `int` | NO | `4` | Up to how many entries should be returned |
69
- | 5 | `best_only` | `bool` | NO | `True` | Determines whether only best offers should be returned |
63
+ | | Argument | Type | Required | Default value | Description |
64
+ |---|-------------|--------|----------|---------------------|--------------------------------------------------------|
65
+ | 1 | `title` | `str` | NO | - | Title to look up |
66
+ | 2 | `country` | `str` | NO | `"US"` | Country to search for offers |
67
+ | 3 | `language` | `str` | NO | `"en"` | Language of responses |
68
+ | 4 | `count` | `int` | NO | `4` | Up to how many entries should be returned |
69
+ | 5 | `best_only` | `bool` | NO | `True` | Determines whether only best offers should be returned |
70
+ | 6 | `offset` | `int` | NO | `0` | How many titles should be skipped from the output |
71
+ | 7 | `providers` | `list[str] \| str \| None`| NO | `None` | Determines whether only best offers should be returned |
72
+
73
+ `title` is just a string to look up. If empty, or not provided, you'll get a selection of popular titles,
74
+ similar to [`popular`](#popular) function.
75
+
76
+ > **Note**: value of `title` isn't stripped, so passing a string
77
+ with multiple spaces will look them up. For more than 1 space it will (probably) always return an empty list.
70
78
 
71
79
  `country` must be **ISO 3166-1 alpha-2** 2-letter code , e.g. `US`, `GB`, `FR`.
72
80
  It should be uppercase, however lowercase codes are automatically converted to uppercase.
@@ -79,6 +87,19 @@ If JustWatch GraphQL API returns fewer entries, then this function will also ret
79
87
  `best_only` determines whether similar offers, but lower quality should be included in response.
80
88
  If a platform offers streaming for a given entry in 4K, HD and SD, then `best_only = True` will return only the 4K offer, `best_only = False` will return all three.
81
89
 
90
+ `offset` allows for very basic pagination, letting you get more data without running into [request complexity](#request-complexity).
91
+ It simply skips `offset` number of first entries (on the API side, nothing is done inside the library).
92
+ Since there is no session there's no guarantee of results "stability" - if JustWatch decides to
93
+ shuffle returned values (I'm not sure what would be the reason, but in theory it's possible)
94
+ you might get repeats, or missing entries. It's also not possible to get **all** the data,
95
+ only up to 1999, check [Maximum number of entries](#maximum-number-of-entries) for details.
96
+
97
+ `providers` is a selection of (usually) **3-letter** identifiers for a service provider ("Netflix", "Amazon Prime Video", etc.).
98
+ It can be either a list, or (for single providers) a string.
99
+ `None` (used as default) turns off any filtering based on providers.
100
+ You can get the possible values through [`providers`](#providers) function and `short_name` field from returned `OfferPackage` NamedTuples,
101
+ or check [Provider codes](#provider-codes) for more details.
102
+
82
103
  Returned value is a list of [`MediaEntry`](#return-data-structures) objects.
83
104
 
84
105
  For very large searches (high `count` value) I recommend using default `best_only=True` to avoid issues with [request complexity](#request-complexity).
@@ -86,6 +107,57 @@ For very large searches (high `count` value) I recommend using default `best_onl
86
107
  Example function call and its output is in [`examples/search_output.py`](examples/search_output.py).
87
108
 
88
109
 
110
+ ### Popular
111
+ Look up all currently popular titles.
112
+ The usage and output will be similar to [`search`](#search), function without any titles specified.
113
+
114
+ ```python
115
+ from simplejustwatchapi import popular
116
+
117
+ results = popular("US", "en", 5, True, 0, {"nfx", "apv"})
118
+ ```
119
+
120
+ No arguments are required.
121
+
122
+ | | Argument | Type | Required | Default value | Description |
123
+ |---|-------------|--------|----------|---------------------|--------------------------------------------------------|
124
+ | 1 | `country` | `str` | NO | `"US"` | Country to search for titles |
125
+ | 2 | `language` | `str` | NO | `"en"` | Language of responses |
126
+ | 3 | `count` | `int` | NO | `4` | Up to how many entries should be returned |
127
+ | 4 | `best_only` | `bool` | NO | `True` | Determines whether only best offers should be returned |
128
+ | 5 | `offset` | `int` | NO | `0` | How many titles should be skipped from the output |
129
+ | 6 | `providers` | `list[str] \| str \| None`| NO | `None` | Determines whether only best offers should be returned |
130
+
131
+ `country` must be **ISO 3166-1 alpha-2** 2-letter code , e.g. `US`, `GB`, `FR`.
132
+ It should be uppercase, however lowercase codes are automatically converted to uppercase.
133
+
134
+ `language` is a **ISO 639-1** (usually) 2-letter code, lowercase, e.g. `en`, `fr`.
135
+
136
+ `count` determines **up to** how many entries should be returned.
137
+ If JustWatch GraphQL API returns fewer entries, then this function will also return fewer values.
138
+
139
+ `best_only` determines whether similar offers, but lower quality should be included in response.
140
+ If a platform offers streaming for a given entry in 4K, HD and SD, then `best_only = True` will return only the 4K offer, `best_only = False` will return all three.
141
+
142
+ `offset` allows for very basic pagination letting you get more data without running into [request complexity](#request-complexity).
143
+ It simply skips first entries (on the API side, nothing is done inside the library).
144
+ Since there is no session there's no guarantee of results "stability" - if JustWatch decides to
145
+ shuffle returned values (I'm not sure what would be the reason, but in theory it's possible)
146
+ you might get repeats, or missing entries. It's also not possible to get **all** the data,
147
+ only up to 2000, check [Maximum number of entries](#maximum-number-of-entries) for details.
148
+
149
+ `providers` is a selection of (usually) **3-letter** identifiers for a service provider ("Netflix", "Amazon Prime Video", etc.).
150
+ It can be either a list, or (for single providers) a string.
151
+ `None` (used as default) turns off any filtering based on providers.
152
+ You can get the possible values through [`providers`](#providers) function and `short_name` field from returned `OfferPackage` NamedTuples,
153
+ or check [Provider codes](#provider-codes) for more details.
154
+
155
+ Returned value is a list of [`MediaEntry`](#return-data-structures) objects.
156
+
157
+ For very large searches (high `count` value) I recommend using default `best_only=True` to avoid issues with [request complexity](#request-complexity).
158
+
159
+ Example function call and its output is in [`examples/popular_output.py`](examples/popular_output.py).
160
+
89
161
  ### Details
90
162
 
91
163
  Details function allows for looking up details for a single entry via its node ID.
@@ -99,7 +171,7 @@ If you want to get seasons/episodes you can use the ID from [`search`](#search)
99
171
 
100
172
  Usage is similar to [`search`](#search) function, just without `count` argument:
101
173
  ```python
102
- from simplejustwatchapi.justwatch import details
174
+ from simplejustwatchapi import details
103
175
 
104
176
  results = details("nodeID", "US", "en", False)
105
177
  ```
@@ -140,7 +212,7 @@ Each season contains similar data to the [`details`](#details) function, with ad
140
212
 
141
213
  Usage also matches [`details`](#details) function:
142
214
  ```python
143
- from simplejustwatchapi.justwatch import seasons
215
+ from simplejustwatchapi import seasons
144
216
 
145
217
  results = seasons("nodeID", "US", "en", False)
146
218
  ```
@@ -164,7 +236,7 @@ Node/season ID can be taken from output of the [`seasons`](#seasons) function.
164
236
 
165
237
  Usage matches [`details`](#details) function:
166
238
  ```python
167
- from simplejustwatchapi.justwatch import seasons
239
+ from simplejustwatchapi import seasons
168
240
 
169
241
  results = seasons("nodeID", "US", "en", False)
170
242
  ```
@@ -190,7 +262,7 @@ It allows specifying a set of countries, instead of a single one.
190
262
  This way you can simultaneously look up offers for multiple countries.
191
263
 
192
264
  ```python
193
- from simplejustwatchapi.justwatch import offers_for_countries
265
+ from simplejustwatchapi import offers_for_countries
194
266
 
195
267
  results = offers_for_countries("nodeID", {"US", "UK", "CA"}, "en", True)
196
268
  ```
@@ -211,8 +283,35 @@ Returned value `dict[str, list[Offer]]`, where key is country given as argument
211
283
  Example function call and its output is in [`examples/offers_for_countries_output.py`](examples/offers_for_countries_output.py).
212
284
 
213
285
 
286
+ ### Providers
287
+
288
+ Get all available service providers ("Netflix", "Amazon Prime Video, etc.) for a given country.
214
289
 
215
- ## Return data structures
290
+ ```python
291
+ from simplejustwatchapi import providers
292
+
293
+ results = providers("US")
294
+ ```
295
+
296
+ | | Argument | Type | Required | Default value | Description |
297
+ |---|-------------|--------|----------|---------------|---------------------------------|
298
+ | 1 | `country` | `str` | NO | `"US"` | Country to search for providers |
299
+
300
+ `country` must be **ISO 3166-1 alpha-2** 2-letter code , e.g. `US`, `GB`, `FR`.
301
+ It should be uppercase, however lowercase codes are automatically converted to uppercase.
302
+
303
+ Returned value is a list of `OfferPackage` tuples.
304
+ Initially they were meant to be used for `Offer` in `MediaEntry`/`Episode`, however the data structure
305
+ matches output here, so it's reused.
306
+
307
+ You can use this function to get values for providers for [`search`](#search) and [`popular`](#popular) functions,
308
+ the `short_name` field in returned `OfferPackage` tuples is the exact 3-letter code needed there.
309
+
310
+ Example function call and its output is in [`examples/providers_output.py`](examples/providers_output.py).
311
+
312
+
313
+
314
+ ## Data structures
216
315
 
217
316
  Detailed descriptions of all used data structures are available in the [documentation](https://electronic-mango.github.io/simple-justwatch-python-api/simplejustwatchapi.html#module-simplejustwatchapi.query).
218
317
 
@@ -259,6 +358,112 @@ Using `best_only=True` should alleviate the issue somewhat, so for very large re
259
358
 
260
359
 
261
360
 
361
+ ## Maximum number of entries
362
+
363
+ The JustWatch API itself won't allow for getting more than 1999 entries, through `count` and `offset`, regardless of request complexity.
364
+ If you try to get the 2000th entry the API (and functions in this libary) will return an empty list.
365
+
366
+ **If you try to access over the 1999th entry you won't get *up to* 1999 entries, you'll get an empty list.**
367
+
368
+ For example, this will get you entries 1990 - 1999 - a 9 element list of `MediaEntry`, as expected:
369
+
370
+ ```python
371
+ from simplejustwatchapi import search
372
+
373
+ results = search("title", count=9, offset=1990)
374
+ # len(results) == 9, as expected
375
+ ```
376
+
377
+ But trying to get 1990 - 2000 will result in an empty list:
378
+
379
+ ```python
380
+ from simplejustwatchapi import search
381
+
382
+ results = search("title", count=10, offset=1990)
383
+ # len(results) == 0, API responded with empty list
384
+ ```
385
+
386
+ Overshooting will also result in an empty list:
387
+
388
+ ```python
389
+ from simplejustwatchapi import search
390
+
391
+ results = search("title", count=100, offset=1950)
392
+ # len(results) == 0, API responded with empty list
393
+ ```
394
+
395
+ Interestingly, you'll still hit [too high request complexity](#request-complexity)
396
+ for too high values of `count`, even though you'd get an empty list anyway:
397
+
398
+ ```python
399
+ from simplejustwatchapi import search
400
+
401
+ results = search("title", count=200, offset=1950)
402
+ # Errors out due to complexity
403
+ ```
404
+
405
+
406
+
407
+ ## Provider codes
408
+
409
+ One note to keep in mind - the codes can be different for different countries.
410
+
411
+
412
+ ### [`providers`](#providers) function
413
+
414
+ The easiest way of getting all provider codes for filtering in [`search`](#search) and [`popular`](#popular) functions
415
+ is through [`providers`](#providers) function, for example:
416
+
417
+ ```python
418
+ from simplejustwatchapi import popular, providers
419
+
420
+ codes = [
421
+ package.short_name
422
+ for package
423
+ in providers("GB") # Look up all providers in the UK.
424
+ if package.name in ("Netflix", "Amazon Prime Video") # Only get codes for specific providers
425
+ ]
426
+
427
+ # codes == ["nfx", "amp"]
428
+
429
+ # Get popular titles only for selected providers:
430
+ popular_netflix_amazon = popular(providers=codes)
431
+ ```
432
+
433
+
434
+ ### Query parameters from JustWatch
435
+
436
+ You can also get them by going to [JustWatch main page](https://www.justwatch.com/)
437
+ and selecting **at least 2** of available services.
438
+ **You need 2**, for 1 you'll get its full name.
439
+ Only for multiple you'll get the needed codes as `?providers=<code1>+<code2>+...` query parameter,
440
+ for example on US version the URL when selecting "Netflix" and "Amazon Prime Video" is:
441
+
442
+ ```url
443
+ https://www.justwatch.com/us?providers=nfx,prv
444
+ ```
445
+
446
+ So the codes for them are `nfx` and `prv` for the US.
447
+
448
+
449
+ ### Stored output from other functions with offers
450
+
451
+ The codes are also returned when looking up offers (through pretty much any function aside from `providers`) through `OfferPackage` and its `short_name` field.
452
+ For example, to get a `dict` "**full name**": "**code**" you can:
453
+
454
+ ```python
455
+ from simplejustwatchapi import search
456
+
457
+ results = search("title", "US", "en", 5, True)
458
+ name_to_code_dict = {
459
+ offer.package.name: offer.package.short_name # Get name and short_name/code from packages
460
+ for entry in results # Iterate all entries
461
+ for offer in entry.offers # Iterate all offers per entry
462
+ }
463
+ ```
464
+
465
+
466
+
262
467
  ## Disclaimer
263
468
 
264
469
  This API is in no way affiliated, associated, authorized, endorsed by, or in any way officially connected with JustWatch.
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "simple-justwatch-python-api"
3
3
  authors = [{name = "Electronic Mango", email = "78230210+Electronic-Mango@users.noreply.github.com"}]
4
- version = "0.17"
4
+ version = "0.18.0"
5
5
  description="A simple JustWatch Python API"
6
6
  readme = "README.md"
7
7
  license = {file = "LICENSE"}
@@ -11,6 +11,7 @@ classifiers = [
11
11
  "Development Status :: 3 - Alpha",
12
12
  "Intended Audience :: Developers",
13
13
  "Topic :: Software Development :: Build Tools",
14
+ "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
14
15
  "Programming Language :: Python :: 3",
15
16
  "Programming Language :: Python :: 3.11",
16
17
  "Programming Language :: Python :: 3.12",
@@ -60,6 +61,7 @@ ignore = [
60
61
  "D212", # Conflicts with D213
61
62
  "FBT",
62
63
  "FIX002",
64
+ "PLR0913", # I think it makes sense for functions here to have more arguments
63
65
  "S101", # Remove once asserts are converted to exceptions
64
66
  "TD002",
65
67
  "TD003",
@@ -3,6 +3,8 @@
3
3
  from simplejustwatchapi.justwatch import details as details
4
4
  from simplejustwatchapi.justwatch import episodes as episodes
5
5
  from simplejustwatchapi.justwatch import offers_for_countries as offers_for_countries
6
+ from simplejustwatchapi.justwatch import popular as popular
7
+ from simplejustwatchapi.justwatch import providers as providers
6
8
  from simplejustwatchapi.justwatch import search as search
7
9
  from simplejustwatchapi.justwatch import seasons as seasons
8
10
  from simplejustwatchapi.tuples import Episode as Episode
@@ -24,6 +26,8 @@ __all__ = [
24
26
  "details",
25
27
  "episodes",
26
28
  "offers_for_countries",
29
+ "popular",
30
+ "providers",
27
31
  "search",
28
32
  "seasons",
29
33
  ]