Loading db/tables.sql +25 −1 Original line number Diff line number Diff line Loading @@ -23,7 +23,8 @@ avail INT not null DEFAULT 0, PRIMARY KEY(book_id), KEY(filename), KEY(title,format,filesize), KEY(avail)); KEY(avail), KEY(doublicat)); commit; drop table if exists catalogs; Loading Loading @@ -72,6 +73,29 @@ PRIMARY KEY(book_id,genre_id), INDEX(genre_id)); commit; drop table if exists series; create table series( ser_id INT not null AUTO_INCREMENT, ser VARCHAR(64), PRIMARY KEY(ser_id), KEY(ser)); commit; drop table if exists bseries; create table bseries( ser_id INT not NULL, book_id INT not NULL, PRIMARY KEY(book_id,ser_id), INDEX(ser_id)); commit; drop table if exists dbver; create table dbver( ver varchar(5)); commit; insert into dbver(ver) values("0.14"); commit; insert into authors(author_id,last_name) values(1,"Неизвестный Автор"); commit; Loading py/__pycache__/sopdsdb.cpython-33.pyc +5.81 KiB (32.8 KiB) File changed.No diff preview for this file type. View original file View changed file py/__pycache__/sopdsparse.cpython-33.pyc +773 B (10.9 KiB) File changed.No diff preview for this file type. View original file View changed file py/sopds-scan.py +3 −0 Original line number Diff line number Diff line Loading @@ -159,6 +159,9 @@ def processfile(db,fb2,name,full_path,file,archive=0,file_size=0,cat_id=0): for l in fb2.genre.getvalue(): opdsdb.addbgenre(book_id,opdsdb.addgenre(l.lower().strip(' \'\"'))) for l in fb2.series.getattrs('name'): opdsdb.addbseries(book_id,opdsdb.addseries(l.strip())) if not cfg.SINGLE_COMMIT: opdsdb.commit() else: Loading py/sopds.cgi +114 −12 Original line number Diff line number Diff line Loading @@ -92,20 +92,25 @@ def main_menu(): enc_print('<id>id:01</id></entry>') enc_print('<entry>') enc_print('<title>По авторам</title>') enc_print('<content type="text">Авторов: %s, книг: %s.</content>'%(dbinfo[1][1],dbinfo[0][1])) enc_print('<content type="text">Авторов: %s.</content>'%dbinfo[1][1]) enc_print('<link type="application/atom+xml;profile=opds-catalog;kind=navigation" href="'+cfg.CGI_PATH+'?id='+am+'02"/>') enc_print('<id>id:02</id></entry>') enc_print('<entry>') enc_print('<title>По наименованию</title>') enc_print('<content type="text">Авторов: %s, книг: %s.</content>'%(dbinfo[1][1],dbinfo[0][1])) enc_print('<content type="text">Книг: %s.</content>'%dbinfo[0][1]) enc_print('<link type="application/atom+xml;profile=opds-catalog;kind=navigation" href="'+cfg.CGI_PATH+'?id='+am+'03"/>') enc_print('<id>id:03</id></entry>') enc_print('<entry>') enc_print('<title>По Жанрам</title>') enc_print('<content type="text">Жанров: %s, книг: %s.</content>'%(dbinfo[3][1],dbinfo[0][1])) enc_print('<content type="text">Жанров: %s.</content>'%dbinfo[3][1]) enc_print('<link type="application/atom+xml;profile=opds-catalog;kind=navigation" href="'+cfg.CGI_PATH+'?id=04"/>') enc_print('<id>id:04</id></entry>') enc_print('<entry>') enc_print('<title>По Сериям</title>') enc_print('<content type="text">Серий: %s.</content>'%dbinfo[4][1]) enc_print('<link type="application/atom+xml;profile=opds-catalog;kind=navigation" href="'+cfg.CGI_PATH+'?id='+am+'06"/>') enc_print('<id>id:06</id></entry>') enc_print('<entry>') enc_print('<title>Последние добавленные</title>') enc_print('<content type="text">Книг: %s.</content>'%(cfg.MAXITEMS)) enc_print('<link type="application/atom+xml;profile=opds-catalog;kind=navigation" href="'+cfg.CGI_PATH+'?id=05"/>') Loading Loading @@ -156,6 +161,14 @@ def entry_genres(db,book_id): genres+=genre return genres def entry_series(db,book_id): series="" for (ser,) in opdsdb.getseries(book_id): if len(series)>0: series+=', ' series+=ser return series def entry_covers(cover,cover_type,book_id): have_extracted_cover=0 if cfg.COVER_SHOW!=0: Loading @@ -176,7 +189,7 @@ def entry_covers(cover,cover_type,book_id): def entry_content(e_content): enc_print('<content type="text">'+websym(e_content)+'</content>') def entry_content2(annotation='',title='',authors='',genres='',filename='',filesize=0,docdate=''): def entry_content2(annotation='',title='',authors='',genres='',filename='',filesize=0,docdate='',series=''): enc_print('<content type="text/html">') if annotation!='': enc_print('<p class=book>'+annotation+'</p>') Loading @@ -186,6 +199,8 @@ def entry_content2(annotation='',title='',authors='',genres='',filename='',files enc_print('<b>Авторы:</b> '+authors+'<br/>') if genres!='': enc_print('<b>Жанры:</b> '+genres+'<br/>') if series!='': enc_print('<b>Серии:</b> '+series+'<br/>') if filename!='': enc_print('<b>Файл:</b> '+filename+'<br/>') if filesize>0: Loading Loading @@ -254,9 +269,10 @@ if 'searchType' in form: searchType=form.getvalue("searchType","").strip() if searchType=='books': type_value=71 if searchType=='authors': type_value=72 if searchType=='series': type_value=73 if 'searchTerm' in form: searchTerm=form.getvalue("searchTerm","").strip() if type_value!=71 and type_value!=72: type_value=7 if type_value!=71 and type_value!=72 and type_value!=73: type_value=7 slice_value=-1 id_value='%02d&searchTerm=%s'%(type_value,searchTerm) if 'alpha' in form: Loading Loading @@ -288,7 +304,8 @@ elif type_value==1: entry_covers(cover,cover_type,item_id) authors=entry_authors(opdsdb,item_id,True) genres=entry_genres(opdsdb,item_id) entry_content2(annotation,item_title,authors,genres,item_name,fsize,docdate) series=entry_series(opdsdb,item_id) entry_content2(annotation,item_title,authors,genres,item_name,fsize,docdate,series) entry_finish() page_control(opdsdb,page_value,id_value) footer() Loading Loading @@ -329,6 +346,35 @@ elif type_value==2: entry_finish() footer() ######################################################### # Выбрана сортировка "По сериям" - выбор по нескольким первым буквам серии # elif type_value==6: i=slice_value letter="" while i>0: letter=chr(i%10000)+letter i=i//10000 header() for (letters,cnt) in opdsdb.getseries_2letters(letter,alpha): id="" for i in range(len(letters)): id+='%04d'%(ord(letters[i])) if cfg.SPLITTITLES==0 or cnt<=cfg.SPLITTITLES or len(letters)>10: id='16'+id else: id='06'+id entry_start() entry_head(letters, None, id_value) entry_link_subsection(id) entry_content('Всего: '+str(cnt)+' серий.') entry_finish() footer() ######################################################### # Выбрана сортировка "По наименованию" - выбор по нескольким первым буквам наименования # Loading Loading @@ -380,7 +426,8 @@ if type_value==13 or type_value==71: entry_covers(cover,cover_type,book_id) authors=entry_authors(opdsdb,book_id,True) genres=entry_genres(opdsdb,book_id) entry_content2(annotation,book_title,authors,genres,book_name,fsize,docdate) series=entry_series(opdsdb,book_id) entry_content2(annotation,book_title,authors,genres,book_name,fsize,docdate,series) entry_finish() page_control(opdsdb,page_value,id_value) footer() Loading Loading @@ -427,7 +474,8 @@ if type_value==24: entry_covers(cover,cover_type,book_id) authors=entry_authors(opdsdb,book_id,True) genres=entry_genres(opdsdb,book_id) entry_content2(annotation,book_title,authors,genres,book_name,fsize,docdate) series=entry_series(opdsdb,book_id) entry_content2(annotation,book_title,authors,genres,book_name,fsize,docdate,series) entry_finish() page_control(opdsdb,page_value,id_value) footer() Loading @@ -445,12 +493,13 @@ elif type_value==5: entry_covers(cover,cover_type,book_id) authors=entry_authors(opdsdb,book_id,True) genres=entry_genres(opdsdb,book_id) entry_content2(annotation,book_title,authors,genres,book_name,fsize,docdate) series=entry_series(opdsdb,book_id) entry_content2(annotation,book_title,authors,genres,book_name,fsize,docdate,series) entry_finish() footer() ######################################################### # Выбор типа поиска по автору или наименованию # Выбор типа поиска по автору или наименованию или серии # if type_value==7: header_search(searchTerm) Loading @@ -466,6 +515,11 @@ if type_value==7: entry_content('Поиск авторов по имени') enc_print('<link type="application/atom+xml;profile=opds-catalog" href="'+cfg.CGI_PATH+'?searchType=authors&searchTerm='+parse.quote(searchTerm)+'" />') entry_finish() entry_start() entry_head('Поиск серий',None,'73') entry_content('Поиск серий книг') enc_print('<link type="application/atom+xml;profile=opds-catalog" href="'+cfg.CGI_PATH+'?searchType=series&searchTerm='+parse.quote(searchTerm)+'" />') entry_finish() footer() Loading Loading @@ -494,6 +548,33 @@ if type_value==12 or type_value==72: page_control(opdsdb,page_value,id_value) footer() ######################################################### # Выдача списка серий по названию или на основании поиска # if type_value==16 or type_value==73: if slice_value>0: i=slice_value letter="" while i>0: letter=chr(i%10000)+letter i=i//10000 else: letter="%"+searchTerm header() for (ser_id,ser,cnt) in opdsdb.getseriesbyl(letter,cfg.MAXITEMS,page_value,cfg.DUBLICATES_SHOW): id='26'+str(ser_id) entry_start() entry_head(ser, None, id_value) entry_link_subsection(id) entry_content('Всего: '+str(cnt)+' книг.') entry_finish() page_control(opdsdb,page_value,id_value) footer() ######################################################### # Выдача списка книг по автору # Loading @@ -507,7 +588,27 @@ if type_value==22: entry_covers(cover,cover_type,book_id) authors=entry_authors(opdsdb,book_id,True) genres=entry_genres(opdsdb,book_id) entry_content2(annotation,book_title,authors,genres,book_name,fsize,docdate) series=entry_series(opdsdb,book_id) entry_content2(annotation,book_title,authors,genres,book_name,fsize,docdate,series) entry_finish() page_control(opdsdb,page_value,id_value) footer() ######################################################### # Выдача списка книг по серии # if type_value==26: header() for (book_id,book_name,book_path,reg_date,book_title,annotation,docdate,format,fsize,cover,cover_type) in opdsdb.getbooksforser(slice_value,cfg.MAXITEMS,page_value,cfg.DUBLICATES_SHOW): id='90'+str(book_id) entry_start() entry_head(book_title, reg_date, id_value) entry_link_book(book_id,format) entry_covers(cover,cover_type,book_id) authors=entry_authors(opdsdb,book_id,True) genres=entry_genres(opdsdb,book_id) series=entry_series(opdsdb,book_id) entry_content2(annotation,book_title,authors,genres,book_name,fsize,docdate,series) entry_finish() page_control(opdsdb,page_value,id_value) footer() Loading @@ -526,7 +627,8 @@ elif type_value==90: entry_covers(cover,cover_type,slice_value) authors=entry_authors(opdsdb,slice_value,True) genres=entry_genres(opdsdb,slice_value) entry_content2(annotation,title,authors,genres,book_name,fsize,docdate) series=entry_series(opdsdb,book_id) entry_content2(annotation,title,authors,genres,book_name,fsize,docdate,series) entry_finish() footer() Loading Loading
db/tables.sql +25 −1 Original line number Diff line number Diff line Loading @@ -23,7 +23,8 @@ avail INT not null DEFAULT 0, PRIMARY KEY(book_id), KEY(filename), KEY(title,format,filesize), KEY(avail)); KEY(avail), KEY(doublicat)); commit; drop table if exists catalogs; Loading Loading @@ -72,6 +73,29 @@ PRIMARY KEY(book_id,genre_id), INDEX(genre_id)); commit; drop table if exists series; create table series( ser_id INT not null AUTO_INCREMENT, ser VARCHAR(64), PRIMARY KEY(ser_id), KEY(ser)); commit; drop table if exists bseries; create table bseries( ser_id INT not NULL, book_id INT not NULL, PRIMARY KEY(book_id,ser_id), INDEX(ser_id)); commit; drop table if exists dbver; create table dbver( ver varchar(5)); commit; insert into dbver(ver) values("0.14"); commit; insert into authors(author_id,last_name) values(1,"Неизвестный Автор"); commit; Loading
py/__pycache__/sopdsdb.cpython-33.pyc +5.81 KiB (32.8 KiB) File changed.No diff preview for this file type. View original file View changed file
py/__pycache__/sopdsparse.cpython-33.pyc +773 B (10.9 KiB) File changed.No diff preview for this file type. View original file View changed file
py/sopds-scan.py +3 −0 Original line number Diff line number Diff line Loading @@ -159,6 +159,9 @@ def processfile(db,fb2,name,full_path,file,archive=0,file_size=0,cat_id=0): for l in fb2.genre.getvalue(): opdsdb.addbgenre(book_id,opdsdb.addgenre(l.lower().strip(' \'\"'))) for l in fb2.series.getattrs('name'): opdsdb.addbseries(book_id,opdsdb.addseries(l.strip())) if not cfg.SINGLE_COMMIT: opdsdb.commit() else: Loading
py/sopds.cgi +114 −12 Original line number Diff line number Diff line Loading @@ -92,20 +92,25 @@ def main_menu(): enc_print('<id>id:01</id></entry>') enc_print('<entry>') enc_print('<title>По авторам</title>') enc_print('<content type="text">Авторов: %s, книг: %s.</content>'%(dbinfo[1][1],dbinfo[0][1])) enc_print('<content type="text">Авторов: %s.</content>'%dbinfo[1][1]) enc_print('<link type="application/atom+xml;profile=opds-catalog;kind=navigation" href="'+cfg.CGI_PATH+'?id='+am+'02"/>') enc_print('<id>id:02</id></entry>') enc_print('<entry>') enc_print('<title>По наименованию</title>') enc_print('<content type="text">Авторов: %s, книг: %s.</content>'%(dbinfo[1][1],dbinfo[0][1])) enc_print('<content type="text">Книг: %s.</content>'%dbinfo[0][1]) enc_print('<link type="application/atom+xml;profile=opds-catalog;kind=navigation" href="'+cfg.CGI_PATH+'?id='+am+'03"/>') enc_print('<id>id:03</id></entry>') enc_print('<entry>') enc_print('<title>По Жанрам</title>') enc_print('<content type="text">Жанров: %s, книг: %s.</content>'%(dbinfo[3][1],dbinfo[0][1])) enc_print('<content type="text">Жанров: %s.</content>'%dbinfo[3][1]) enc_print('<link type="application/atom+xml;profile=opds-catalog;kind=navigation" href="'+cfg.CGI_PATH+'?id=04"/>') enc_print('<id>id:04</id></entry>') enc_print('<entry>') enc_print('<title>По Сериям</title>') enc_print('<content type="text">Серий: %s.</content>'%dbinfo[4][1]) enc_print('<link type="application/atom+xml;profile=opds-catalog;kind=navigation" href="'+cfg.CGI_PATH+'?id='+am+'06"/>') enc_print('<id>id:06</id></entry>') enc_print('<entry>') enc_print('<title>Последние добавленные</title>') enc_print('<content type="text">Книг: %s.</content>'%(cfg.MAXITEMS)) enc_print('<link type="application/atom+xml;profile=opds-catalog;kind=navigation" href="'+cfg.CGI_PATH+'?id=05"/>') Loading Loading @@ -156,6 +161,14 @@ def entry_genres(db,book_id): genres+=genre return genres def entry_series(db,book_id): series="" for (ser,) in opdsdb.getseries(book_id): if len(series)>0: series+=', ' series+=ser return series def entry_covers(cover,cover_type,book_id): have_extracted_cover=0 if cfg.COVER_SHOW!=0: Loading @@ -176,7 +189,7 @@ def entry_covers(cover,cover_type,book_id): def entry_content(e_content): enc_print('<content type="text">'+websym(e_content)+'</content>') def entry_content2(annotation='',title='',authors='',genres='',filename='',filesize=0,docdate=''): def entry_content2(annotation='',title='',authors='',genres='',filename='',filesize=0,docdate='',series=''): enc_print('<content type="text/html">') if annotation!='': enc_print('<p class=book>'+annotation+'</p>') Loading @@ -186,6 +199,8 @@ def entry_content2(annotation='',title='',authors='',genres='',filename='',files enc_print('<b>Авторы:</b> '+authors+'<br/>') if genres!='': enc_print('<b>Жанры:</b> '+genres+'<br/>') if series!='': enc_print('<b>Серии:</b> '+series+'<br/>') if filename!='': enc_print('<b>Файл:</b> '+filename+'<br/>') if filesize>0: Loading Loading @@ -254,9 +269,10 @@ if 'searchType' in form: searchType=form.getvalue("searchType","").strip() if searchType=='books': type_value=71 if searchType=='authors': type_value=72 if searchType=='series': type_value=73 if 'searchTerm' in form: searchTerm=form.getvalue("searchTerm","").strip() if type_value!=71 and type_value!=72: type_value=7 if type_value!=71 and type_value!=72 and type_value!=73: type_value=7 slice_value=-1 id_value='%02d&searchTerm=%s'%(type_value,searchTerm) if 'alpha' in form: Loading Loading @@ -288,7 +304,8 @@ elif type_value==1: entry_covers(cover,cover_type,item_id) authors=entry_authors(opdsdb,item_id,True) genres=entry_genres(opdsdb,item_id) entry_content2(annotation,item_title,authors,genres,item_name,fsize,docdate) series=entry_series(opdsdb,item_id) entry_content2(annotation,item_title,authors,genres,item_name,fsize,docdate,series) entry_finish() page_control(opdsdb,page_value,id_value) footer() Loading Loading @@ -329,6 +346,35 @@ elif type_value==2: entry_finish() footer() ######################################################### # Выбрана сортировка "По сериям" - выбор по нескольким первым буквам серии # elif type_value==6: i=slice_value letter="" while i>0: letter=chr(i%10000)+letter i=i//10000 header() for (letters,cnt) in opdsdb.getseries_2letters(letter,alpha): id="" for i in range(len(letters)): id+='%04d'%(ord(letters[i])) if cfg.SPLITTITLES==0 or cnt<=cfg.SPLITTITLES or len(letters)>10: id='16'+id else: id='06'+id entry_start() entry_head(letters, None, id_value) entry_link_subsection(id) entry_content('Всего: '+str(cnt)+' серий.') entry_finish() footer() ######################################################### # Выбрана сортировка "По наименованию" - выбор по нескольким первым буквам наименования # Loading Loading @@ -380,7 +426,8 @@ if type_value==13 or type_value==71: entry_covers(cover,cover_type,book_id) authors=entry_authors(opdsdb,book_id,True) genres=entry_genres(opdsdb,book_id) entry_content2(annotation,book_title,authors,genres,book_name,fsize,docdate) series=entry_series(opdsdb,book_id) entry_content2(annotation,book_title,authors,genres,book_name,fsize,docdate,series) entry_finish() page_control(opdsdb,page_value,id_value) footer() Loading Loading @@ -427,7 +474,8 @@ if type_value==24: entry_covers(cover,cover_type,book_id) authors=entry_authors(opdsdb,book_id,True) genres=entry_genres(opdsdb,book_id) entry_content2(annotation,book_title,authors,genres,book_name,fsize,docdate) series=entry_series(opdsdb,book_id) entry_content2(annotation,book_title,authors,genres,book_name,fsize,docdate,series) entry_finish() page_control(opdsdb,page_value,id_value) footer() Loading @@ -445,12 +493,13 @@ elif type_value==5: entry_covers(cover,cover_type,book_id) authors=entry_authors(opdsdb,book_id,True) genres=entry_genres(opdsdb,book_id) entry_content2(annotation,book_title,authors,genres,book_name,fsize,docdate) series=entry_series(opdsdb,book_id) entry_content2(annotation,book_title,authors,genres,book_name,fsize,docdate,series) entry_finish() footer() ######################################################### # Выбор типа поиска по автору или наименованию # Выбор типа поиска по автору или наименованию или серии # if type_value==7: header_search(searchTerm) Loading @@ -466,6 +515,11 @@ if type_value==7: entry_content('Поиск авторов по имени') enc_print('<link type="application/atom+xml;profile=opds-catalog" href="'+cfg.CGI_PATH+'?searchType=authors&searchTerm='+parse.quote(searchTerm)+'" />') entry_finish() entry_start() entry_head('Поиск серий',None,'73') entry_content('Поиск серий книг') enc_print('<link type="application/atom+xml;profile=opds-catalog" href="'+cfg.CGI_PATH+'?searchType=series&searchTerm='+parse.quote(searchTerm)+'" />') entry_finish() footer() Loading Loading @@ -494,6 +548,33 @@ if type_value==12 or type_value==72: page_control(opdsdb,page_value,id_value) footer() ######################################################### # Выдача списка серий по названию или на основании поиска # if type_value==16 or type_value==73: if slice_value>0: i=slice_value letter="" while i>0: letter=chr(i%10000)+letter i=i//10000 else: letter="%"+searchTerm header() for (ser_id,ser,cnt) in opdsdb.getseriesbyl(letter,cfg.MAXITEMS,page_value,cfg.DUBLICATES_SHOW): id='26'+str(ser_id) entry_start() entry_head(ser, None, id_value) entry_link_subsection(id) entry_content('Всего: '+str(cnt)+' книг.') entry_finish() page_control(opdsdb,page_value,id_value) footer() ######################################################### # Выдача списка книг по автору # Loading @@ -507,7 +588,27 @@ if type_value==22: entry_covers(cover,cover_type,book_id) authors=entry_authors(opdsdb,book_id,True) genres=entry_genres(opdsdb,book_id) entry_content2(annotation,book_title,authors,genres,book_name,fsize,docdate) series=entry_series(opdsdb,book_id) entry_content2(annotation,book_title,authors,genres,book_name,fsize,docdate,series) entry_finish() page_control(opdsdb,page_value,id_value) footer() ######################################################### # Выдача списка книг по серии # if type_value==26: header() for (book_id,book_name,book_path,reg_date,book_title,annotation,docdate,format,fsize,cover,cover_type) in opdsdb.getbooksforser(slice_value,cfg.MAXITEMS,page_value,cfg.DUBLICATES_SHOW): id='90'+str(book_id) entry_start() entry_head(book_title, reg_date, id_value) entry_link_book(book_id,format) entry_covers(cover,cover_type,book_id) authors=entry_authors(opdsdb,book_id,True) genres=entry_genres(opdsdb,book_id) series=entry_series(opdsdb,book_id) entry_content2(annotation,book_title,authors,genres,book_name,fsize,docdate,series) entry_finish() page_control(opdsdb,page_value,id_value) footer() Loading @@ -526,7 +627,8 @@ elif type_value==90: entry_covers(cover,cover_type,slice_value) authors=entry_authors(opdsdb,slice_value,True) genres=entry_genres(opdsdb,slice_value) entry_content2(annotation,title,authors,genres,book_name,fsize,docdate) series=entry_series(opdsdb,book_id) entry_content2(annotation,title,authors,genres,book_name,fsize,docdate,series) entry_finish() footer() Loading