Python Code
editThis code may be used under either the license CC-BY-SA 3.0 or the GNU Lesser General Public License, version 2.1 or later.
File patent_lib.py
editimport re,urllib2,os,pickle,datetime,sys
CACHE_FILES = True
if CACHE_FILES:
cache_dir = os.path.join(os.path.expanduser('~'),".patent_lib_cache")
if not os.path.exists(cache_dir):
os.mkdir(cache_dir)
term_extension_file = os.path.join(cache_dir,"term_extension")
if os.path.exists(term_extension_file):
term_extension_dict = pickle.load(open(term_extension_file,"r"))
else:
term_extension_dict = {}
def get_patent_info(patent):
patent_lines = download_patent_data(patent)
return parse_patent_lines(patent,patent_lines)
def download_patent_data(patent):
patent = get_canonical_name(patent)
if CACHE_FILES:
if not os.path.exists(cache_dir):
os.mkdir(cache_dir)
patent_file = os.path.join(cache_dir,"us"+patent)
if os.path.exists(patent_file):
patent_lines = open(patent_file).readlines()
return patent_lines
first = urllib2.urlopen("http://patft1.uspto.gov/netacgi/nph-Parser?patentnumber="+patent)
first_lines = first.readlines()
refresh_line = [line for line in first_lines if "REFRESH" in line][0]
refresh_url = "http://patft1.uspto.gov"+re.match('.*?URL=(.*?)">',refresh_line).group(1)
#print refresh_url
patent_connection = urllib2.urlopen(refresh_url)
patent_lines = patent_connection.readlines()
if CACHE_FILES:
open(patent_file,"w").writelines(patent_lines)
return patent_lines
def parse_patent_lines(patent,patent_lines):
patent = get_canonical_name(patent)
ret_dict = {}
#print patent_lines
grant_index = patent_lines.index('<TD ALIGN="RIGHT" WIDTH="50%"> <B>\n')+1
grant_date = patent_lines[grant_index].strip()
file_index = patent_lines.index(' <TR><TD VALIGN="TOP" ALIGN="LEFT" WIDTH="10%">Filed:\n')+2
file_line = patent_lines[file_index]
file_date = re.match(".*?<B>(.*?)</B>",file_line).group(1)
summary_index = grant_index+5
summary_end_index = patent_lines.index('</font><BR>\n',summary_index)
summary = patent_lines[summary_index][16:].strip()
for i in range(summary_index+1,summary_end_index):
summary += " "+patent_lines[i].strip()
related_patents_header = '<HR> <CENTER><B>Related U.S. Patent Documents</B></CENTER> <HR> <TABLE WIDTH="100%"> <TR><TD WIDTH="7%"></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR> <TR><TD align="left">\n'
patent_case_header = "<CENTER><b><i>Parent Case Text</i></b></CENTER>\n"
if patent_case_header in patent_lines:
patent_case_index = patent_lines.index(patent_case_header)
patent_case_end = patent_lines.index("<HR>\n",patent_case_index+2)
patent_case_text = (" ".join([x.lstrip() for x in patent_lines[patent_case_index+2:patent_case_end]])).replace("<BR><BR>","")
ret_dict["patent_case_text"] = patent_case_text
if related_patents_header in patent_lines:
related_index = patent_lines.index(related_patents_header)
related_list = re.split("</TR><TR>",patent_lines[related_index+1])[1:-1]
related_parsed = [[re.match("<TD.*>(.*)",x).group(1) for x in re.split("</TD>",y)[1:5]] for y in related_list]
related_info = [{"application_number":x[0],"filing_date": find_related_exact_date(ret_dict,x[1]),"patent_number":x[2],"issue_date":x[3]} for x in related_parsed]
related_info = [keep_non_empty(x) for x in related_info]
ret_dict["related_info"] = related_info
pct_file_header = ' <TR><TD VALIGN="TOP" ALIGN="LEFT" WIDTH="10%">PCT Filed:\n'
if pct_file_header in patent_lines:
pct_file_index = patent_lines.index(pct_file_header)
pct_date = patent_lines[pct_file_index+2].strip()
ret_dict["pct_file_date"] = pct_date
ret_dict.update({"patent":patent,"file_date":file_date,
"grant_date":grant_date,"summary":summary})
terminal_disclaimer_header = '</TR> <TR><TD VALIGN="TOP" ALIGN="LEFT" WIDTH="10%" NOWRAP><B>[*]</B> Notice: </TD>\n'
if terminal_disclaimer_header in patent_lines:
terminal_disclaimer_index = patent_lines.index(terminal_disclaimer_header)
terminal_disclaimer_date = " ".join(patent_lines[terminal_disclaimer_index+1].split()[-3:])
ret_dict["terminal_disclaimer_date"] = terminal_disclaimer_date
if patent.lower().startswith("re"):
reissue_index = -1
for i in xrange(len(patent_lines)):
if "Reissue of:" in patent_lines[i]:
reissue_index = i
break
if reissue_index > 0:
reissue_line = patent_lines[reissue_index]
reissue_tail = re.match(".*?Reissue of:(.*)",reissue_line).group(1)
reissue_parts = reissue_tail.replace("<TD align=center>","").split("</TD>")
orig_file_date,orig_patent,orig_grant_date = reissue_parts[2:5]
ret_dict.update({"orig_patent":orig_patent,"orig_file_date":orig_file_date,"orig_grant_date":orig_grant_date})
return ret_dict
#print patent,file_date,grant_date,orig_patent,orig_file_date,orig_grant_date,"--",repr(summary)
else:
return ret_dict
#print patent,file_date,grant_date,"--",repr(summary)
month_names = ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
mon_names = [name[:3].lower() for name in month_names]
def get_numeric_date(date):
#Could be two formats: "December 9, 1994" or "Mar., 1993"
list = date.split()
month = list[0][:3].lower()
year = int(list[-1])
if len(list) == 3:
day = int(list[1].strip(","))
else:
day = 32
month = mon_names.index(month)
return [year,month,day]
#20 year term start date is first of related file date, pct file date or file date.
# If filed or pct filed before June 8, 1995, 17 years from grant date or 20 years from 20 year term start
#After June 8, 1995, 20 years from first file date.
#If a reissued patent, Use original patent date, not final date.
#If it has a terminal disclaimer, use that instead of calculated date.
#XXX: Note that this does not handle the possibility that the patent office
# might have delayed granting the application and it could be extended because of that.
#XXX: Note that if maintenance fees are not paid, the patent might expire early
def get_patent_expiration(patent_info):
reason = ""
if patent_info.has_key("orig_patent"):
filed = patent_info["orig_file_date"]
granted = patent_info["orig_grant_date"]
else:
filed = patent_info["file_date"]
granted = patent_info["grant_date"]
file_date = get_numeric_date(filed)
grant_date = get_numeric_date(granted)
file_plus = file_date[:]
file_plus[0] += 20
reason += "file+20: "+str(file_plus)
if "related_info" in patent_info and len(patent_info["related_info"]) > 0:
related_file = sorted([get_numeric_date(x["filing_date"])
for x in patent_info["related_info"] if "filing_date" in x])
if len(related_file) > 0:
related_file_plus = related_file[0]
related_file_plus[0] += 20
file_plus = min(related_file_plus,file_plus)
reason += " related_patent+20:"+str(related_file_plus)
if "pct_file_date" in patent_info:
pct_file_date = get_numeric_date(patent_info["pct_file_date"])
pct_file_plus = pct_file_date[:]
pct_file_plus[0] += 20
file_plus = min(file_plus,pct_file_plus)
reason += " pct_file+20:"+str(pct_file_plus)
if "override_reason" in patent_info:
reason += " Override: "+patent_info["override_reason"]
if file_date < [1995,6,8] or ("pct_file_date" in patent_info and pct_file_date < [1995,6,8]):
grant_plus = grant_date
grant_plus[0] += 17
reason += " grant+17:"+str(grant_plus)
max_date = max(file_plus,grant_plus)
max_date,reason = adjust_expiration_date(patent_info,max_date,reason)
return max_date,reason
else:
file_plus,reason = adjust_expiration_date(patent_info,file_plus,reason)
return file_plus,reason
def adjust_expiration_date(patent,date,reason):
"""Adjusts date based on terminal disclaimers and term extensions"""
if "terminal_disclaimer_date" in patent:
new_date = get_numeric_date(patent["terminal_disclaimer_date"])
reason += " terminal disclaimer date "+patent["terminal_disclaimer_date"]
return new_date,reason
if "term_extension" in patent:
term_extension = patent["term_extension"]
if term_extension >= 0:
reason += " term extension "+str(term_extension)+" days "
if term_extension > 0:
delta = datetime.timedelta(term_extension)
if date[2] == 32:
#If exact date is unknown, it is set to 32
date = [date[0],date[1],1]
date_o = datetime.date(date[0],date[1],date[2])
date_adjusted = date_o + delta
new_date = [date_adjusted.year,date_adjusted.month,date_adjusted.day]
return new_date,reason
return date,reason
def find_related_exact_date(patent,date):
if len(date) < 4:
#Bad date, filtered out elsewhere
return date
numeric_date = get_numeric_date(date)
if "patent_case_text" in patent:
month = mon_names[numeric_date[1]]
year = str(numeric_date[0])
case_text = patent["patent_case_text"]
dates = re.findall(month+".?\s+(\d{1,2}),\s+"+year,case_text.lower())+\
re.findall("(\d{1,2})\s+"+month+".\s+"+year,case_text.lower())
if len(dates) == 1:
#"December 9, 1994"
month = month_names[numeric_date[1]]
new_day = dates[0]
return month+" "+new_day+", "+year
return date
def get_first_date(patent_info):
""" Calculates the first relevent date for patent prior art"""
if patent_info.has_key("orig_patent"):
filed = patent_info["orig_file_date"]
else:
filed = patent_info["file_date"]
file_date = get_numeric_date(filed)
first_date = file_date
if "related_info" in patent_info and len(patent_info["related_info"]) > 0:
related_file = sorted([get_numeric_date(x["filing_date"])
for x in patent_info["related_info"] if "filing_date" in x])
if len(related_file) > 0:
related_file = related_file[0]
first_date = min(related_file,first_date)
if "pct_file_date" in patent_info:
pct_file_date = get_numeric_date(patent_info["pct_file_date"])
first_date = min(pct_file_date,first_date)
return first_date
def get_canonical_name(patent):
if patent.startswith("0"):
patent = patent[1:]
patent = patent.replace(",","")
return patent
def keep_non_empty(dic):
new_dict = {}
for key in dic:
if dic[key] and dic[key] != '':
new_dict[key] = dic[key]
return new_dict
def get_patent_term_extension(patent):
patent = get_canonical_name(patent)
if CACHE_FILES:
if patent in term_extension_dict:
return term_extension_dict[patent]
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Patent Reader')]
#print >> sys.stderr,"Opening "+"http://www.google.com/patents?as_pnum="+patent
google_search = opener.open("http://www.google.com/patents?as_pnum="+patent)
search_data = google_search.read()
patent_url = re.search("<a href=\"(http://www.google.com/patents/about\?id=.*?)\">",search_data).group(1)
google_id = re.search("id=(.*?)&",patent_url).group(1)
#print >> sys.stderr,"Opening "+"http://www.google.com/patents?printsec=abstract&zoom=4&id="+google_id+"&output=text&pg=PA1"
patent_text_file = opener.open("http://www.google.com/patents?printsec=abstract&zoom=4&id="+google_id+"&output=text&pg=PA1")
patent_text = patent_text_file.read()
patent_search = re.search("35 U.S.C. 154\(b\) by ([0-9]*) days.",patent_text)
if patent_search:
days = int(patent_search.group(1))
else:
days = -1
if CACHE_FILES:
term_extension_dict[patent] = days
out_file = open(term_extension_file,"w")
pickle.dump(term_extension_dict,out_file)
out_file.close()
return days
File patent_add_term_extension.py
edit#!/usr/bin/env python
import sys
import patent_lib
if len(sys.argv) > 1:
lines = open(sys.argv[1]).readlines()
else:
lines = sys.stdin.readlines()
for line in lines:
if line.startswith("**"):
patent = eval(line[3:].strip())
term_extension = patent_lib.get_patent_term_extension(patent["patent"])
if term_extension >= 0:
patent["term_extension"] = term_extension
#print "Adding",patent["patent"],term_extension
#else:
#print "Not adding",patent["patent"],term_extension
print "**",patent
sys.stdout.flush()
else:
print line,
File patent_grab.py
edit#!/usr/bin/env python
import sys
import patent_lib
lines = open(sys.argv[1]).readlines()
for line in lines:
if line.startswith("**"):
patent = line[5:].strip().replace(" ","").upper()
#print patent,
print "**",patent_lib.get_patent_info(patent)
sys.stdout.flush()
else:
print line,
#print get_patent_info("4,864,393")
#print get_patent_info("RE39,080")
File patent_re_orig_date.py
edit#!/usr/bin/env python
import sys
import patent_lib
if len(sys.argv) > 1:
lines = open(sys.argv[1]).readlines()
else:
lines = sys.stdin.readlines()
for line in lines:
if line.startswith("**"):
patent = eval(line[3:].strip())
#print patent,
if patent.has_key("orig_patent"):
orig_patent = patent_lib.get_patent_info(patent["orig_patent"])
patent["orig_grant_date"] = orig_patent["grant_date"]
patent["orig_file_date"] = orig_patent["file_date"]
patent["related_info"] = patent.get("related_info",[])+orig_patent.get("related_info",[])
if "pct_file_date" in orig_patent:
patent["pct_file_date"] = orig_patent["pct_file_date"]
print "**",patent
sys.stdout.flush()
else:
print line,
#print get_patent_info("4,864,393")
#print get_patent_info("RE39,080")
File patent_add_company_info.py
edit#!/usr/bin/env python
import sys
import patent_lib
lines = open(sys.argv[1]).readlines()
company = "???"
for line in lines:
if line.startswith("**"):
patent = eval(line[3:].strip())
patent["company"] = company
#print patent,
print "**",patent
sys.stdout.flush()
elif line.startswith("*"):
company = line[line.index("[[")+2:line.index("]]")]
print line,
else:
print line,
File patent_override.py
edit#!/usr/bin/env python
import sys
import patent_lib
if len(sys.argv) > 2:
lines = open(sys.argv[1]).readlines()
override_lines = open(sys.argv[2]).readlines()
else:
lines = sys.stdin.readlines()
override_lines = open(sys.argv[1]).readlines()
override_dict = {}
for line in override_lines:
if len(line.strip()) == 0 or line.startswith("#"):
pass #skip
else:
patent = line.split()[0]
override = eval(line[len(patent):])
override_dict[patent] = override
#print override_dict
for line in lines:
if line.startswith("**"):
patent = eval(line[3:].strip())
patent_number = patent["patent"]
if patent_number in override_dict:
sub_dict = override_dict[patent_number]
overridden = {}
for key in sub_dict.keys():
if key in patent:
overridden[key] = patent[key]
patent[key] = sub_dict[key]
if len(overridden) > 0:
patent["before_override"] = overridden
print "**",patent
sys.stdout.flush()
else:
print line,
File patent_to_wiki_table.py
edit#!/usr/bin/env python
import sys
import patent_lib
def to_wiki_date_s(string):
return to_wiki_date(patent_lib.get_numeric_date(string))
def to_wiki_date(list):
year,month,day = list
return "%02d %s %d" % (day,patent_lib.mon_names[month],year)
if len(sys.argv) > 1:
lines = open(sys.argv[1]).readlines()
else:
lines = sys.stdin.readlines()
print """{|class="wikitable sortable"
!Patent!!Filed!!Granted!!First File!!Expiration!!Summary!!Notes!!Company"""
for line in lines:
if line.startswith("**"):
patent = eval(line[3:].strip())
expire_date,reason = patent_lib.get_patent_expiration(patent)
expiration = to_wiki_date(expire_date)
if patent.has_key("orig_patent"):
filed = to_wiki_date_s(patent["orig_file_date"])
granted = to_wiki_date_s(patent["orig_grant_date"])
notes = "Reissue of "+patent["orig_patent"]+" filed "+to_wiki_date_s(patent["file_date"])+" granted "+to_wiki_date_s(patent["grant_date"])
else:
filed = to_wiki_date_s(patent["file_date"])
granted = to_wiki_date_s(patent["grant_date"])
notes = ""
first_date = to_wiki_date(patent_lib.get_first_date(patent))
notes += " [http://patft1.uspto.gov/netacgi/nph-Parser?patentnumber="+patent["patent"]+"]"+" "+reason
if "patent_case_text" in patent:
notes += " Case Text: "+patent["patent_case_text"].replace("\n","")
print '|-'
print '|',patent["patent"],"||",filed,"||",granted,"||",first_date,"||",expiration,"||",patent["summary"],"||",notes,"||","[["+patent.get("company","Unknown")+"]]"
#print patent,
#if patent.has_key("orig_patent"):
sys.stdout.flush()
print '|-\n|}'
TODO
editFix handling of Continuation patents. Example: http://patft1.uspto.gov/netacgi/nph-Parser?patentnumber=6,289,308 This patent's application date is Jun., 1990, so the expiration date should be June, 2010, instead of 08 mar 2020. More or less done. The information that is easy to parse is parsed.
Fix handling of Foreign patents. Example: http://patft1.uspto.gov/netacgi/nph-Parser?patentnumber=5455833 This patent has foreign patent priority data, so the 20 year terms starts earlier. The expiration date should be October 3, 2012, not 26 apr 2013 that the program reports. More or less done.
Ask USPTO to include Patent term adjustment data. Done. (No response yet, and its been a month). Maybe could grab from google instead. Search http://www.google.com/patents?as_pnum=7020204 to get id number, then http://www.google.com/patents?id=PSR4AAAAEBAJ&output=text&pg=PA1 to get text version (already OCRed) and see if there is a patent term adjustment.
PCT filed patents have the PCT filing date as filing date, not the US filing date. http://www.uspto.gov/web/offices/pac/mpep/documents/appxl_35_U_S_C_365.htm#usc35s365
The filing date for determining if there is a 17 year term is the PCT filing date or the last filing date. The filing date from the first continuation only determines the start of the 20 year term.
See: http://www.uspto.gov/web/offices/pac/mpep/documents/appxl_35_U_S_C_119.htm#usc35s119 http://www.uspto.gov/web/offices/pac/mpep/documents/appxl_35_U_S_C_154.htm#usc35s154 http://www.uspto.gov/web/offices/pac/mpep/documents/2700_2701.htm#sect2701
Test Data
editShort Test Data
edit
Comment
** US 4,849,812
** US 4,864,393
** US RE39,080
MPEG-2 Patent List
edit- MPEGLA patents [1]
- Alcatel-Lucent
- US 4,833,543
- US 4,970,590
- US 5,453,790
- AT&T Bell Laboratories
- US 5,136,377
- Bell Telephone Laboratories, Incorporated
- US 4,383,272
- British Telecommunications plc
- US 5,291,284
- Canon Inc.
- US 4,982,270
- CIF LICENSING, LLC
- US 5,068,724
- US 5,091,782
- US 5,093,720
- Columbia University
- US Re 35,093
- France Télécom (CNET)
- US 4,796,087
- Fujitsu
- US 5,235,618
- General Electric Capital Corporation
- US 4,706,260
- US 4,813,056
- General Instrument Corp. (now the broadband division of Motorola)
- US 4,394,774
- US 4,698,672
- GE Technology Development, Inc.
- US 5,426,464
- US 5,486,864
- US 5,491,516
- US 5,600,376
- US 5,796,743
- Hewlett-Packard Company
- US 5,867,501
- Hitachi, Ltd.
- Koninklijke Philips Electronics N.V.
- US 4,849,812
- US 4,901,075
- US 5,021,879
- US 5,027,206
- US 5,128,758
- US 5,179,442
- US 5,333,135
- US 5,606,539
- US 5,608,697
- US 5,699,476
- US 5,740,310
- US 5,844,867
- US 6,181,712
- US 6,792,001
- KDDI Corporation (KDDI)
- LG Electronics Inc.
- US Re 37,057
- US Re 37,568
- Matsushita now Panasonic Corporation
- US 5,113,255
- US Re 35,910
- US Re 36,015
- US Re 36,507
- US Re 39,276
- US Re 39,278
- US Re 39,280
- US 5,223,949
- US 5,412,430
- US 5,784,107
- Mitsubishi
- US 4,954,892
- US 5,072,295
- US 5,268,846
- US 5,949,489
- US 5,963,258
- US 5,970,175
- US 5,990,960
- US 6,002,439
- US 6,097,759
- US 6,188,794
- US 6,307,973
- US 7,362,805
- US 7,376,184
- US 7,756,202
- US 7,936,817
- Multimedia Patent Trust
- US 4,958,226
- US 5,227,878
- US 5,500,678
- US 5,563,593
- Nippon Telegraph and Telephone Corporation (NTT)
- NXP
- Philips
- US 4,849,812
- US 4,901,075
- US 5,021,879
- US 5,027,206
- US 5,128,758
- US 5,179,442
- US 5,333,135
- US 5,606,539
- US 5,608,697
- US 5,740,310
- US 5,844,867
- Robert Bosch GmbH
- Samsung
- US 5,461,421
- US 5,467,086
- US 5,654,706
- US 6,680,975
- US 7,292,657
- US 7,609,760
- US 7,616,687
- US 7,684,490
- US 7,724,821
- US 7,724,822
- US 7,724,823
- US 7,724,824
- US 7,724,828
- US 7,724,829
- US 7,742,522
- US 7,742,527
- US 7,764,735
- US 7,782,956
- US 7,787,538
- Sanyo Electric Co., Ltd.
- Scientific Atlanta
- US 5,418,782
- US 5,420,866
- US 5,457,701
- Sharp
- Sony
- US 4,864,393
- US Re 37,222
- US 5,191,436
- US 5,291,486
- US 5,298,991
- US 5,343,248
- US 5,428,396
- US 5,461,420
- US 5,481,553
- US 5,510,840
- US 5,539,466
- US 5,543,847
- US 5,559,557
- US 5,663,763
- US 5,666,461
- US 5,701,164
- US 5,946,042
- US 5,982,437
- US 6,040,863
- US 6,160,849
- US 7,627,041
- The Trustees of Columbia University in the City of New York
- US Re 35,093
- Thomson Licensing S.A.
- US 4,800,432
- US 4,969,055
- US 5,289,276
- US 5,365,272
- US 5,381,181
- US 5,422,676
- US 5,442,400
- US 5,459,789
- US 5,483,287
- US 5,565,923
- US 5,784,110
- US 7,020,204
- US 7,334,248
- Toshiba
- US 5,317,397
- US 5,424,779
- US 5,467,136
- US 5,742,344
- US 5,986,713
- Victor Company of Japan, Limited (JVC).
- US Re 34,965
- US Re 35,158
- US Re 36,822
- US 5,103,307
- US 5,175,618
- Alcatel-Lucent [2]
- US 5,341,457
- US RE39,080
- Audio MPEG, Inc [3]
- US 4,972,484
- US 5,214,678
- US 5,323,396
- US 5,539,829
- US 5,606,618
- US 5,530,655
- US 5,777,992
- US 6,289,308
- US 5,481,643
- US 5,544,247
- US 5,610,985
- US 5,740,317
- US 5,878,080
- US 5,960,037
- US 5,991,715
- US 6,023,490
- Thomson [4]
- US 4,821,260
- US 4,942,607
- US 5,214,742
- US 5,227,990
- US 5,384,811
- US 5,736,943
- US 5,455,833
- US 5,559,834
- US 5,321,729
- US 5,706,309
- US 5,701,346
- US 5,742,735
- US 5,812,672
- US 5,579,430
- US 6,185,539
- US 6,009,399
- US 5,924,060
- US 5,703,999
Overrides
edit6792001 {'related_info': [{'application_number': '537701', 'patent_number': '6181712','filing_date': 'Feb. 23, 1995'}],'override_reason':'Auto parse missed date'}
7609760 {'related_info': [{'filing_date': 'Mar. 1, 1993'}],'override_reason':'Autoparse missed application Ser. No. 08/024,305, filed Mar. 1, 1993.'}
7616687 {'related_info': [{'filing_date': 'Mar. 1, 1993'}],'override_reason':'Autoparse missed application Ser. No. 08/024,305, filed Mar. 1, 1993.'}
7684490 {'related_info': [{'filing_date': 'Mar. 1, 1993'}],'override_reason':'Autoparse missed application Ser. No. 08/024,305, filed Mar. 1, 1993.'}
7724821 {'related_info': [{'filing_date': 'Mar. 1, 1993'}],'override_reason':'Autoparse missed application Ser. No. 08/024,305, filed Mar. 1, 1993.'}
7724822 {'related_info': [{'filing_date': 'Mar. 1, 1993'}],'override_reason':'Autoparse missed application Ser. No. 08/024,305, filed Mar. 1, 1993.'}
7724823 {'related_info': [{'filing_date': 'Mar. 1, 1993'}],'override_reason':'Autoparse missed application Ser. No. 08/024,305, filed Mar. 1, 1993.'}
7724824 {'related_info': [{'filing_date': 'Mar. 1, 1993'}],'override_reason':'Autoparse missed application Ser. No. 08/024,305, filed Mar. 1, 1993.'}
7742522 {'related_info': [{'filing_date': 'Mar. 1, 1993'}],'override_reason':'Autoparse missed application Ser. No. 08/024,305, filed Mar. 1, 1993.'}
7742527 {'related_info': [{'filing_date': 'Mar. 1, 1993'}],'override_reason':'Autoparse missed application Ser. No. 08/024,305, filed Mar. 1, 1993.'}
7764735 {'related_info': [{'filing_date': 'Mar. 1, 1993'}],'override_reason':'Autoparse missed application Ser. No. 08/024,305, filed Mar. 1, 1993.'}
7787538 {'related_info': [{'filing_date': 'Mar. 1, 1993'}],'override_reason':'Autoparse missed application Ser. No. 08/024,305, filed Mar. 1, 1993.'}
5701164 {'related_info': [{'filing_date': 'Mar. 24, 1994'}],'override_reason':'Auto parse missed PCT date'}
5946042 {'related_info': [{'filing_date': 'Mar. 24, 1994'}],'override_reason':'Auto parse missed PCT date'}
6040863 {'related_info': [{'filing_date': 'Mar. 24, 1994'}],'override_reason':'Auto parse missed PCT date'}
7627041 {'related_info': [{'filing_date': 'Jan. 13, 1994'}],'override_reason':'Auto parse missed old filing date'}
7334248 {'related_info': [{'filing_date': 'Apr. 22, 1994'}],'override_reason':'Error in original patent, fixed in correction B2'}
4394774 {'terminal_disclaimer_date': 'December 15, 1998','override_reason': 'Referenced patent had its term changed'}
7627041 {'term_extension': 889, 'override_reason': 'Error in original patent, fixed in correction B2'}
Philips Video CD US patent list
edit- From http://www.ip.philips.com/services/?module=IpsLicenseProgram&command=View&id=52&part=4
- general philps and sony
- US 5068846
- mode 2 philps and sony
- US 4977550
- mei
- US 5113255
- US 5223949
- part philps
- US 5127858
- US 5179442
- US 5991715
- US 5323396
- US 5777992
- US 5539829
- US 7209565
- US 5745641
- US 5606539
- US 5844867
- US 5214678
- part sony
- US RE37222
- US 5191436
- US 5291486
- part jvc
- US RE34965
- US RE35158
Script for MPEG-2 patents
edit./patent_grab.py bare_mpeg2_patents | ./patent_re_orig_date.py | ./patent_add_company_info.py | ./patent_add_term_extension.py | ./patent_override.py mpeg2_overrides > grabbed_company_mpeg2_patent_info
./patent_to_wiki_table.py grabbed_re_mpeg2_patent_info > mpeg2_wiki_table