+
+
+
+ Search
+
+
+
+
+
+
+
+
+ 00
+ 00
+ AM
+
+
+ Day
+ 00
+ Month
+ Year
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Server.bat b/Server.bat
new file mode 100644
index 0000000..79e7856
--- /dev/null
+++ b/Server.bat
@@ -0,0 +1,3 @@
+@echo off
+python -m http.server
+pause
diff --git a/SimpleBrowser.py b/SimpleBrowser.py
new file mode 100644
index 0000000..8322472
--- /dev/null
+++ b/SimpleBrowser.py
@@ -0,0 +1,441 @@
+# importing libraries
+from PyQt5.QtCore import *
+from PyQt5.QtWidgets import *
+from PyQt5.QtGui import *
+from PyQt5.QtWebEngineWidgets import *
+from PyQt5.QtPrintSupport import *
+import webbrowser, json, os, sys, datetime
+from json.decoder import JSONDecodeError
+
+# creating main window class
+class MainWindow(QMainWindow):
+
+ # constructor
+ def __init__(self, *args, **kwargs):
+ super(MainWindow, self).__init__(*args, **kwargs)
+
+ # ADD TAB WIGDETS TO DISPLAY WEB TABS
+ self.tabs = QTabWidget()
+ self.tabs.setDocumentMode(True)
+ self.tabs.setTabsClosable(True)
+ self.setCentralWidget(self.tabs)
+ self.setGeometry(100, 100, 1000, 700)
+ self.history = []
+
+ # ADD DOUBLE CLICK EVENT LISTENER
+ self.tabs.tabBarDoubleClicked.connect(self.tab_open_doubleclick)
+ # ADD TAB CLOSE EVENT LISTENER
+ self.tabs.tabCloseRequested.connect(self.close_current_tab)
+ # ADD ACTIVE TAB CHANGE EVENT LISTENER
+ self.tabs.currentChanged.connect(self.current_tab_changed)
+
+ self.status = QStatusBar()
+ self.setStatusBar(self.status)
+
+ # ADD NAVIGATION TOOLBAR
+ navtb = QToolBar("Navigation")
+ navtb.setIconSize(QSize(20, 20))
+ self.addToolBar(navtb)
+
+ #### ADD BUTTONS TO NAVIGATION TOOLBAR
+ # PREVIOUS WEB PAGE BUTTON
+ back_btn = QAction(QIcon(os.path.join('icons', 'left.svg')), "Back", self)
+ back_btn.setStatusTip("Back to previous page")
+ navtb.addAction(back_btn)
+ back_btn.triggered.connect(lambda: self.tabs.currentWidget().back())
+
+ # NEXT WEB PAGE BUTTON
+ next_btn = QAction(QIcon(os.path.join('icons', 'right.svg')), "Forward", self)
+ next_btn.setStatusTip("Forward to next page")
+ navtb.addAction(next_btn)
+ next_btn.triggered.connect(lambda: self.tabs.currentWidget().forward())
+
+ # REFRESH WEB PAGE BUTTON
+ reload_btn = QAction(QIcon(os.path.join('icons', 'reload.svg')), "Reload", self)
+ reload_btn.setStatusTip("Reload page")
+ navtb.addAction(reload_btn)
+ reload_btn.triggered.connect(lambda: self.tabs.currentWidget().reload())
+
+ # HOME PAGE BUTTON
+ home_btn = QAction(QIcon(os.path.join('icons', 'home.svg')), "Home", self)
+ home_btn.setStatusTip("Go home")
+ navtb.addAction(home_btn)
+ home_btn.triggered.connect(self.navigate_home)
+
+ # Separator in the tool bar
+ navtb.addSeparator()
+
+ # Google Page BUTTON
+ google_btn = QAction(QIcon(os.path.join('icons', 'google-logo.png')), "Google", self)
+ google_btn.setStatusTip("Google")
+ navtb.addAction(google_btn)
+ google_btn.triggered.connect(self.navigate_google)
+
+ # ADD LINE EDIT TO SHOW AND EDIT URLS
+ self.urlbar = QLineEdit()
+ navtb.addWidget(self.urlbar)
+ self.urlbar.returnPressed.connect(self.navigate_to_url)
+
+ # Separator in the tool bar
+ navtb.addSeparator()
+
+ # ADD STOP BUTTON TO STOP URL LOADING
+ stop_btn = QAction(QIcon(os.path.join('icons', 'stop.svg')), "Stop", self)
+ stop_btn.setStatusTip("Stop loading current page")
+ navtb.addAction(stop_btn)
+ stop_btn.triggered.connect(lambda: self.tabs.currentWidget().stop())
+
+ # creating a button for bookmark
+ bookmark_btn = QAction(QIcon(os.path.join('icons', 'bookmark.svg')), "Add Bookmark", self)
+ bookmark_btn.setStatusTip("Bookmark this page")
+ navtb.addAction(bookmark_btn)
+ bookmark_btn.triggered.connect(self.add_bookmark)
+
+ # ADD FILE MENU ACTIONS
+ file_menu = self.menuBar().addMenu("&Tab+")
+
+ # ADD FILE MENU ACTIONS
+ new_tab_action = QAction(QIcon(os.path.join('icons', 'cil-library-add.png')), "New Tab", self)
+ new_tab_action.setStatusTip("Open a new tab")
+ file_menu.addAction(new_tab_action)
+ # ADD NEW TAB
+ new_tab_action.triggered.connect(lambda _: self.add_new_tab())
+ self.add_new_tab(QUrl.fromLocalFile("/Home.html"))
+
+ # creating a menu for bookmarks
+ # adding this menu to the menu bar
+ bookmark_menu = self.menuBar().addMenu("&Bookmarks")
+ show_bookmarks = QAction("Show Bookmarks", self)
+ bookmark_menu.addAction(show_bookmarks)
+ show_bookmarks.triggered.connect(self.show_bookmark)
+
+ # Help menu
+ help_menu = self.menuBar().addMenu("&Help")
+ # ADD HELP MENU ACTIONS
+ navigate_home_action = QAction(QIcon(os.path.join('icons', 'cil-exit-to-app.png')), "Homepage", self)
+ navigate_home_action.setStatusTip("Go to Homepage")
+ help_menu.addAction(navigate_home_action)
+ # NAVIGATE TO DEVELOPER WEBSITE
+ navigate_home_action.triggered.connect(self.navigate_home)
+
+ # creating a button for History
+ history_btn = QAction(QIcon(os.path.join('icons', 'history.svg')), "Show History", self)
+ history_btn.setStatusTip("Show History")
+
+ navtb.addAction(history_btn)
+ history_btn.triggered.connect(self.show_history)
+
+ # STYLESHEET TO CUSTOMIZE WINDOW
+ self.setStyleSheet("""
+
+ /*Body */
+ QWidget{
+ background-color:#202832;
+ color: rgb(255, 255, 255);
+ }
+ /* The tab widget frame */
+ QTabWidget::pane {
+ border-top: 2px solid rgb(90, 90, 90);
+ position: absolute;
+ color: rgb(255, 255, 255);
+ }
+ /* New Tab Css */
+ QTabBar::tab {
+ width: 100%;
+ background-color:#202832;
+ margin: 0.1em;
+ padding: 0.3em;
+ font-size:14px;
+ border : 1px solid white;
+ border-radius : 4px;
+ }
+ QTabBar::tab:hover{
+ background: rgb(49, 49, 49);
+ border: 1px solid aqua;
+ background-color:#0d1117;
+ border-radius: 4px;
+ }
+ QTabBar::tab:selected{
+ background: rgb(49, 49, 49);
+ border: 1px solid #112740;
+ background-color:#0d1117;
+ border-radius: 4px;
+ border:1px solid yellow;
+ }
+ /*searchbar*/
+ QLineEdit {
+ border: 2px solid #112740;
+ border-radius: 10px;
+ padding: 5px;
+ margin-right:50px;
+ background-color:#0d1117;
+ color: rgb(255, 255, 255);
+ }
+ QLineEdit:hover {
+ border: 2px solid white;
+ }
+ QLineEdit:focus{
+ border: 2px solid rgb(0, 136, 255);
+ color: rgb(200, 200, 200);
+ }
+ QPushButton{
+ background: rgb(49, 49, 49);
+ border: 2px solid rgb(0, 36, 36);
+ background-color: rgb(0, 36, 36);
+ padding: 5px;
+ border-radius: 10px;
+ }
+ /*Button*/
+ QLabel:hover{
+
+ border: 2px solid #112740;
+
+ border-radius: 10px;
+ }
+ QToolButton::hover{
+ background: rgb(49, 49, 49);
+ border: 2px solid #112740;
+ background-color:#0d1117;
+ border-radius: 10px;
+ }
+
+ """)
+
+ # SHOW MAIN WINDOW
+ self.show()
+
+ #*********** FUNCTION ***********#
+
+ # ADD NEW WEB TAB
+ def add_new_tab(self, qurl=None, label="Loading..."):
+ # Check if url value is blank
+ if qurl is None:
+ qurl = QUrl.fromLocalFile("/Home.html")
+
+ # Load the passed url
+ browser = QWebEngineView()
+ browser.setUrl(qurl)
+
+ # ADD THE WEB PAGE TAB
+ i = self.tabs.addTab(browser, label)
+ self.tabs.setCurrentIndex(i)
+
+ # ADD BROWSER EVENT LISTENERS
+ # On URL change
+ browser.urlChanged.connect(lambda qurl, browser=browser:
+ self.update_urlbar(qurl, browser))
+ # On loadfinished
+ browser.loadFinished.connect(lambda _, i=i, browser=browser:
+ self.tabs.setTabText(i, browser.page().title()))
+
+ browser.loadFinished.connect(lambda qurl, browser=browser:
+ self.add_history(qurl, browser)) # Connect to add_history method
+
+ # ADD NEW TAB ON DOUBLE CLICK ON TABS
+ def tab_open_doubleclick(self, i):
+ if i == -1: # No tab under the click
+ self.add_new_tab()
+
+ # CLOSE TABS
+ def close_current_tab(self, i):
+ if self.tabs.count() < 2: #Only close if there is more than one tab open
+ return
+
+ self.tabs.removeTab(i)
+
+ # method for updating url
+ # this method is called by the QWebEngineView object
+ def update_urlbar(self, q, browser):
+
+ if browser != self.tabs.currentWidget():
+
+ return
+
+ # URL Schema
+ if q.scheme() == 'https':
+ pass
+
+
+ else:
+ pass
+
+ # setting text to the url bar
+
+ # setting cursor position of the url bar
+
+ self.urlbar.setText(q.toString())
+ self.urlbar.setCursorPosition(0)
+
+ def current_tab_changed(self, i):
+ # i = tab index
+ # GET CURRENT TAB URL
+ qurl = self.tabs.currentWidget().url()
+ # UPDATE URL TEXT
+ self.update_urlbar(qurl, self.tabs.currentWidget())
+ # UPDATE WINDOWS TITTLE
+ self.update_title(self.tabs.currentWidget())
+
+ # method for updating the title of the window
+ def update_title(self, browser):
+ if browser != self.tabs.currentWidget():
+ # If this signal is not from the current ACTIVE tab, ignore
+ return
+
+ title = self.tabs.currentWidget().page().title()
+ self.setWindowTitle("% s - Simple Browser" % title)
+
+ # home action
+ def navigate_home(self, browser):
+ self.tabs.currentWidget().setUrl(QUrl.fromLocalFile("/Home.html"))
+
+ # Google action
+ def navigate_google(self, browser):
+ self.tabs.currentWidget().setUrl(QUrl("http://google.com"))
+
+ # method called by the line edit when return key is pressed
+ def navigate_to_url(self):
+
+ # getting url and converting it to QUrl object
+ q = QUrl(self.urlbar.text())
+
+ # if url is scheme is blank
+ if q.scheme() == "":
+ # set url scheme to html
+ q.setScheme("http")
+
+ # set the url to the browser
+ self.tabs.currentWidget().setUrl(q)
+
+ # method for adding bookmark
+ def add_bookmark(self):
+ # get the current page's title and url
+ title = self.tabs.currentWidget().title()
+ url = self.tabs.currentWidget().url().toString()
+ date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+
+ # create a bookmark object with title and url
+ bookmark = {"title": title, "url": url, "date": date}
+
+ # load the existing bookmarks from file
+ with open("bookmarks.json", "r") as f:
+ try:
+ bookmarks = json.load(f)
+ except JSONDecodeError:
+ bookmarks = []
+
+ # add the new bookmark to the list of bookmarks
+ bookmarks.append(bookmark)
+
+ # save the updated bookmarks to file
+ with open("bookmarks.json", "w") as f:
+ json.dump(bookmarks, f, indent=1)
+
+ # show a message box to inform the user
+ msg_box = QMessageBox()
+ msg_box.setText(f"Bookmark added for {title}")
+ msg_box.exec_()
+ self.show_bookmark()
+
+ def show_bookmark(self):
+ # load the existing bookmarks from file
+
+ with open("bookmarks.json", "r") as f:
+ try:
+ bookmarks = json.load(f)
+ except JSONDecodeError:
+ bookmarks = []
+
+ # create a dialog to display the bookmarks
+ dialog = QDialog(self)
+ dialog.setWindowTitle("Bookmarks")
+ dialog.setMinimumWidth(500)
+ dialog.setMinimumHeight(300)
+
+ # create a list widget to display the bookmarks
+ list_widget = QListWidget(dialog)
+ list_widget.itemDoubleClicked.connect(self.navigate_to_bookmark)
+ dialog_layout = QVBoxLayout(dialog)
+ dialog_layout.addWidget(list_widget)
+
+ # add the bookmarks to the list widget
+ for bookmark in bookmarks:
+ item = QListWidgetItem(bookmark["title"])
+ item.setData(Qt.UserRole, bookmark["url"])
+ list_widget.addItem(item)
+
+ # show the dialog
+ dialog.exec_()
+
+ # method for navigating to a bookmark
+ def navigate_to_bookmark(self, item):
+ url = item.data(Qt.UserRole)
+ self.tabs.currentWidget().load(QUrl(url))
+
+ def add_history(self, qurl, browser):
+ # get the current page's title and url
+ title = self.tabs.currentWidget().title()
+ url = self.tabs.currentWidget().url().toString()
+ date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+
+ # create a history object with title and url
+ record = {"title": title, "url": url, "date": date}
+
+ # load the existing history from file
+ with open("history.json", "r") as f:
+ try:
+ history = json.load(f)
+ except JSONDecodeError:
+ history = []
+
+ # add the new record to the list of history
+ history.append(record)
+
+ # save the updated history to file
+ with open("history.json", "w") as f:
+ json.dump(history, f, indent=1)
+
+ def show_history(self):
+ # load the existing history from file
+ with open("history.json", "r") as f:
+ try:
+ history = json.load(f)
+ except JSONDecodeError:
+ history = []
+
+ # create a dialog to display the history
+ dialog = QDialog(self)
+ dialog.setWindowTitle("Web History")
+ dialog.setMinimumWidth(800)
+ dialog.setMinimumHeight(500)
+
+ # create a list widget to display the history
+ list_widget = QListWidget(dialog)
+ list_widget.itemDoubleClicked.connect(self.navigate_to_history)
+ dialog_layout = QVBoxLayout(dialog)
+ dialog_layout.addWidget(list_widget)
+
+ # add the history to the list widget
+ for record in history:
+ item = QListWidgetItem(record["title"])
+ item.setData(Qt.UserRole, record["url"])
+ list_widget.addItem(item)
+
+ # show the dialog
+ dialog.exec_()
+
+ # method for navigating to a history
+ def navigate_to_history(self, item):
+ url = item.data(Qt.UserRole)
+ self.tabs.currentWidget().load(QUrl(url))
+
+# creating a pyQt5 application
+app = QApplication(sys.argv)
+
+# name to the application
+app.setApplicationName("Simple Browser")
+
+# creating a main window object
+window = MainWindow()
+
+# loop
+app.exec_()
diff --git a/bookmarks.html b/bookmarks.html
new file mode 100644
index 0000000..22c6a9f
--- /dev/null
+++ b/bookmarks.html
@@ -0,0 +1,198 @@
+
+
+
+
+
+
+
+
+
Bookmarks
+
+
+
+
+
+
+
+
+
+
+
+
+ Title
+ Url
+ Date
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/bookmarks.json b/bookmarks.json
new file mode 100644
index 0000000..8b5b160
--- /dev/null
+++ b/bookmarks.json
@@ -0,0 +1,32 @@
+[
+ {
+ "title": "HyperWannaFLY - YouTube",
+ "url": "https://www.youtube.com/@HyperWannaFLY/videos",
+ "date": "2023-03-14 19:04:35"
+ },
+ {
+ "title": "Master The Blaster (Valorant Montage) - YouTube",
+ "url": "https://www.youtube.com/watch?v=q53JPm6BB58",
+ "date": "2023-03-14 19:05:27"
+ },
+ {
+ "title": "LE Kraken - YouTube",
+ "url": "https://www.youtube.com/@lekraken",
+ "date": "2023-03-14 22:14:19"
+ },
+ {
+ "title": "MD Computers",
+ "url": "https://mdcomputers.in/",
+ "date": "2023-03-17 01:04:45"
+ },
+ {
+ "title": "GB Devil - YouTube",
+ "url": "https://www.youtube.com/@GB_Devil",
+ "date": "2023-03-22 23:15:50"
+ },
+ {
+ "title": "YouTube",
+ "url": "https://www.youtube.com/gaming",
+ "date": "2023-04-09 01:15:25"
+ }
+]
\ No newline at end of file
diff --git a/history.html b/history.html
new file mode 100644
index 0000000..6254fcc
--- /dev/null
+++ b/history.html
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+
+
Web History
+
+
+
+
+
+
+
+
+
+
+
+ Title
+ Url
+ Date
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/history.json b/history.json
new file mode 100644
index 0000000..95465e6
--- /dev/null
+++ b/history.json
@@ -0,0 +1,457 @@
+[
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-03-30 16:17:34"
+ },
+ {
+ "title": "YouTube",
+ "url": "https://www.youtube.com/",
+ "date": "2023-03-30 16:17:39"
+ },
+ {
+ "title": "Google",
+ "url": "https://www.google.com/",
+ "date": "2023-03-30 16:17:48"
+ },
+ {
+ "title": "youtuv - Google Search",
+ "url": "https://www.google.com/search?q=youtuv&source=hp&ei=1GglZLyiKo_t-AbVlpHQBQ&iflsig=AOEireoAAAAAZCV25LricxdisxZF_PaT4Ew3E2AIYhuY&ved=0ahUKEwi83N2WvYP-AhWPNt4KHVVLBFoQ4dUDCAk&uact=5&oq=youtuv&gs_lcp=Cgdnd3Mtd2l6EAMyEwguEIAEELEDEIMBEMcBENEDEAoyBggAEAoQAzINCAAQgAQQsQMQgwEQCjIGCAAQChADMg0IABCABBCxAxCDARAKMg0IABCABBCxAxCDARAKMgoIABCABBCxAxAKMg0IABCABBCxAxCDARAKMgYIABAKEAMyBwgAEIAEEAo6DgguEI8BEOoCEIwDEOUCOg4IABCPARDqAhCMAxDlAjoRCC4QgwEQxwEQsQMQ0QMQgAQ6CwgAEIAEELEDEIMBOgQIABADOhEILhCABBCxAxCDARDHARDRAzoLCC4QgAQQsQMQgwE6CAgAEIAEELEDOgUIABCABFDWI1jrK2DsNGgBcAB4AIABa4gB0gSSAQM0LjKYAQCgAQGwAQo&sclient=gws-wiz",
+ "date": "2023-03-30 16:17:59"
+ },
+ {
+ "title": "YouTube",
+ "url": "https://www.youtube.com/",
+ "date": "2023-03-30 16:18:25"
+ },
+ {
+ "title": "youtuv - Google Search",
+ "url": "https://www.google.com/search?q=youtuv&source=hp&ei=1GglZLyiKo_t-AbVlpHQBQ&iflsig=AOEireoAAAAAZCV25LricxdisxZF_PaT4Ew3E2AIYhuY&ved=0ahUKEwi83N2WvYP-AhWPNt4KHVVLBFoQ4dUDCAk&uact=5&oq=youtuv&gs_lcp=Cgdnd3Mtd2l6EAMyEwguEIAEELEDEIMBEMcBENEDEAoyBggAEAoQAzINCAAQgAQQsQMQgwEQCjIGCAAQChADMg0IABCABBCxAxCDARAKMg0IABCABBCxAxCDARAKMgoIABCABBCxAxAKMg0IABCABBCxAxCDARAKMgYIABAKEAMyBwgAEIAEEAo6DgguEI8BEOoCEIwDEOUCOg4IABCPARDqAhCMAxDlAjoRCC4QgwEQxwEQsQMQ0QMQgAQ6CwgAEIAEELEDEIMBOgQIABADOhEILhCABBCxAxCDARDHARDRAzoLCC4QgAQQsQMQgwE6CAgAEIAEELEDOgUIABCABFDWI1jrK2DsNGgBcAB4AIABa4gB0gSSAQM0LjKYAQCgAQGwAQo&sclient=gws-wiz",
+ "date": "2023-03-30 16:18:37"
+ },
+ {
+ "title": "HyperWannaFly - Google Search",
+ "url": "https://www.google.com/search?q=HyperWannaFly&ei=3mglZM-eKb_p4-EPuaOv8A0&ved=0ahUKEwjPhb-bvYP-AhW_9DgGHbnRC94Q4dUDCA8&uact=5&oq=HyperWannaFly&gs_lcp=Cgxnd3Mtd2l6LXNlcnAQAzoOCAAQigUQsQMQgwEQkQI6CggAEIoFEAoQkQI6BQgAEIAEOhEILhCDARDHARCxAxDRAxCABDoLCAAQigUQsQMQgwE6CwguEIAEELEDEIMBOgsIABCABBCxAxCDAToICAAQgAQQsQM6EwguEIoFELEDEMcBENEDEEMQ6gQ6BwgAEIoFEEM6CAguEIAEELEDOgcILhCKBRBDOh4ILhCKBRCxAxDHARDRAxBDEOoEENwEEN4EEOAEGAE6DQguEIoFEOUEENQCEEM6CggAEIoFELEDEEM6EAguEIoFEOUEENQCEEMQ6gQ6CgguEIoFEOUEEEM6GwguEIoFEOUEENQCEEMQ6gQQ3AQQ3gQQ4AQYAToLCC4QgAQQxwEQ0QM6BwgAEIAEEAo6BwgAEA0QgAQ6CAgAEB4QDRAKOgoIABAeEA0QDxAKOgUIABCiBEoECEEYAEoFCEASATFQAFjfIWCqJmgAcAF4AIABrQGIAfkMkgEEMC4xM5gBAKABAcABAdoBBggBEAEYFA&sclient=gws-wiz-serp",
+ "date": "2023-03-30 16:18:44"
+ },
+ {
+ "title": "HyperWannaFLY - YouTube",
+ "url": "https://www.youtube.com/c/hyperwannafly",
+ "date": "2023-03-30 16:19:01"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-03-30 19:07:05"
+ },
+ {
+ "title": "information page",
+ "url": "file:///info.html",
+ "date": "2023-03-30 19:08:08"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-03-30 19:08:11"
+ },
+ {
+ "title": "Bookmarks",
+ "url": "http://localhost:8000/bookmarks.html",
+ "date": "2023-03-30 19:08:37"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-03-30 19:08:44"
+ },
+ {
+ "title": "Web History",
+ "url": "http://localhost:8000/history.html",
+ "date": "2023-03-30 19:08:46"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-03-30 19:10:41"
+ },
+ {
+ "title": "YouTube",
+ "url": "https://www.youtube.com/",
+ "date": "2023-03-30 19:10:45"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-03-30 19:10:46"
+ },
+ {
+ "title": "Hyperwannafly - Google Search",
+ "url": "https://www.google.com/search?q=Hyperwannafly",
+ "date": "2023-03-30 19:10:55"
+ },
+ {
+ "title": "HyperWannaFLY - YouTube",
+ "url": "https://www.youtube.com/c/hyperwannafly",
+ "date": "2023-03-30 19:10:57"
+ },
+ {
+ "title": "Hyperwannafly - Google Search",
+ "url": "https://www.google.com/search?q=Hyperwannafly",
+ "date": "2023-03-30 19:10:58"
+ },
+ {
+ "title": "HyperWannaFLY (@hyperwannafly) \u2022 Instagram photos and videos",
+ "url": "https://www.instagram.com/hyperwannafly/",
+ "date": "2023-03-30 19:10:59"
+ },
+ {
+ "title": "Hyperwannafly - Google Search",
+ "url": "https://www.google.com/search?q=Hyperwannafly",
+ "date": "2023-03-30 19:11:02"
+ },
+ {
+ "title": "https://twitter.com/HyperX555",
+ "url": "https://twitter.com/HyperX555",
+ "date": "2023-03-30 19:11:04"
+ },
+ {
+ "title": "Hyperwannafly - Google Search",
+ "url": "https://www.google.com/search?q=Hyperwannafly",
+ "date": "2023-03-30 19:11:05"
+ },
+ {
+ "title": "Hyperwannafly - Google Search",
+ "url": "https://www.google.com/search?q=Hyperwannafly&source=lnms&tbm=isch&sa=X&ved=2ahUKEwj42aDv44P-AhUkXmwGHQIpCt4Q_AUoAXoECAEQAw&biw=1920&bih=948&dpr=1",
+ "date": "2023-03-30 19:11:21"
+ },
+ {
+ "title": "Hyperwannafly - Google Search",
+ "url": "https://www.google.com/search?q=Hyperwannafly&source=lmns&tbm=vid&bih=948&biw=1920&hl=en&sa=X&ved=2ahUKEwjxyOn744P-AhUgArcAHSmYABEQ_AUoAnoECAEQAg",
+ "date": "2023-03-30 19:11:23"
+ },
+ {
+ "title": "Hyperwannafly - Google Search",
+ "url": "https://www.google.com/search?q=Hyperwannafly&hl=en&tbm=isch&source=lnms&sa=X&ved=2ahUKEwjLqez844P-AhW1SWwGHXsZC2oQ_AUoAXoECAEQAw&biw=1920&bih=948&dpr=1",
+ "date": "2023-03-30 19:11:24"
+ },
+ {
+ "title": "Web History",
+ "url": "http://localhost:8000/history.html",
+ "date": "2023-03-30 19:11:35"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:03:14"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:04:38"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:04:39"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:05:26"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:05:26"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:05:27"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:05:27"
+ },
+ {
+ "title": "youtube - Google Search",
+ "url": "https://www.google.com/search?q=youtube",
+ "date": "2023-04-09 01:05:42"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:06:00"
+ },
+ {
+ "title": "YouTube",
+ "url": "https://www.youtube.com/",
+ "date": "2023-04-09 01:06:05"
+ },
+ {
+ "title": "Bookmarks",
+ "url": "http://localhost:8000/bookmarks.html",
+ "date": "2023-04-09 01:06:13"
+ },
+ {
+ "title": "Web History",
+ "url": "http://localhost:8000/history.html",
+ "date": "2023-04-09 01:06:16"
+ },
+ {
+ "title": "Spotify - Web Player: Music for everyone",
+ "url": "https://open.spotify.com/",
+ "date": "2023-04-09 01:06:25"
+ },
+ {
+ "title": "information page",
+ "url": "file:///info.html",
+ "date": "2023-04-09 01:06:29"
+ },
+ {
+ "title": "Google",
+ "url": "https://www.google.com/",
+ "date": "2023-04-09 01:06:37"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:08:24"
+ },
+ {
+ "title": "Bookmarks",
+ "url": "http://localhost:8000/bookmarks.html",
+ "date": "2023-04-09 01:08:32"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:08:48"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:08:51"
+ },
+ {
+ "title": "Bookmarks",
+ "url": "http://localhost:8000/bookmarks.html",
+ "date": "2023-04-09 01:08:58"
+ },
+ {
+ "title": "HyperWannaFLY - YouTube",
+ "url": "https://www.youtube.com/@HyperWannaFLY/videos",
+ "date": "2023-04-09 01:09:07"
+ },
+ {
+ "title": "Bookmarks",
+ "url": "http://localhost:8000/bookmarks.html",
+ "date": "2023-04-09 01:09:08"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:09:11"
+ },
+ {
+ "title": "Web History",
+ "url": "http://localhost:8000/history.html",
+ "date": "2023-04-09 01:09:12"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:09:15"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:09:16"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:09:17"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:09:17"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:09:18"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:09:18"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:09:18"
+ },
+ {
+ "title": "YouTube",
+ "url": "https://www.youtube.com/",
+ "date": "2023-04-09 01:09:23"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:09:39"
+ },
+ {
+ "title": "Bookmarks",
+ "url": "http://localhost:8000/bookmarks.html",
+ "date": "2023-04-09 01:09:44"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:10:19"
+ },
+ {
+ "title": "YouTube",
+ "url": "https://www.youtube.com/",
+ "date": "2023-04-09 01:13:45"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:16:38"
+ },
+ {
+ "title": "information page",
+ "url": "file:///info.html",
+ "date": "2023-04-09 01:16:42"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-09 01:17:09"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-15 11:48:56"
+ },
+ {
+ "title": "youtube - Google Search",
+ "url": "https://www.google.com/search?q=youtube",
+ "date": "2023-04-15 11:51:45"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-15 11:54:18"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-15 12:01:02"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-15 12:17:31"
+ },
+ {
+ "title": "information page",
+ "url": "file:///info.html",
+ "date": "2023-04-15 12:26:17"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-15 12:28:28"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-15 13:19:35"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-15 13:20:20"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-15 13:20:38"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-15 13:24:18"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-15 13:29:18"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-15 18:25:31"
+ },
+ {
+ "title": "Web History",
+ "url": "http://localhost:8000/history.html",
+ "date": "2023-04-15 18:25:39"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-16 14:59:49"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-16 15:00:07"
+ },
+ {
+ "title": "YouTube",
+ "url": "https://www.youtube.com/",
+ "date": "2023-04-16 15:00:30"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-16 15:00:59"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-16 15:00:59"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-22 01:21:06"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-22 01:21:26"
+ },
+ {
+ "title": "localhost",
+ "url": "http://localhost:8000/bookmarks.html",
+ "date": "2023-04-22 01:21:27"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-04-22 01:21:30"
+ },
+ {
+ "title": "Dashboard",
+ "url": "file:///Home.html",
+ "date": "2023-06-24 02:01:43"
+ }
+]
\ No newline at end of file
diff --git a/icons/bookmark.svg b/icons/bookmark.svg
new file mode 100644
index 0000000..297ece7
--- /dev/null
+++ b/icons/bookmark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/icons/cil-arrow-circle-left.png b/icons/cil-arrow-circle-left.png
new file mode 100644
index 0000000..9e3b928
Binary files /dev/null and b/icons/cil-arrow-circle-left.png differ
diff --git a/icons/cil-arrow-circle-right.png b/icons/cil-arrow-circle-right.png
new file mode 100644
index 0000000..200695e
Binary files /dev/null and b/icons/cil-arrow-circle-right.png differ
diff --git a/icons/cil-home.png b/icons/cil-home.png
new file mode 100644
index 0000000..ef3160f
Binary files /dev/null and b/icons/cil-home.png differ
diff --git a/icons/cil-library-add.png b/icons/cil-library-add.png
new file mode 100644
index 0000000..4856e1e
Binary files /dev/null and b/icons/cil-library-add.png differ
diff --git a/icons/cil-media-stop.png b/icons/cil-media-stop.png
new file mode 100644
index 0000000..6050b40
Binary files /dev/null and b/icons/cil-media-stop.png differ
diff --git a/icons/cil-options.png b/icons/cil-options.png
new file mode 100644
index 0000000..75630e4
Binary files /dev/null and b/icons/cil-options.png differ
diff --git a/icons/cil-reload.png b/icons/cil-reload.png
new file mode 100644
index 0000000..63acc08
Binary files /dev/null and b/icons/cil-reload.png differ
diff --git a/icons/cil-tag.png b/icons/cil-tag.png
new file mode 100644
index 0000000..c4bb725
Binary files /dev/null and b/icons/cil-tag.png differ
diff --git a/icons/google-logo.png b/icons/google-logo.png
new file mode 100644
index 0000000..e7196bc
Binary files /dev/null and b/icons/google-logo.png differ
diff --git a/icons/history.svg b/icons/history.svg
new file mode 100644
index 0000000..94af7a7
--- /dev/null
+++ b/icons/history.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/icons/home.svg b/icons/home.svg
new file mode 100644
index 0000000..9e78e1f
--- /dev/null
+++ b/icons/home.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/icons/left.svg b/icons/left.svg
new file mode 100644
index 0000000..d2349fa
--- /dev/null
+++ b/icons/left.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/icons/options.svg b/icons/options.svg
new file mode 100644
index 0000000..c180067
--- /dev/null
+++ b/icons/options.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/icons/reload.svg b/icons/reload.svg
new file mode 100644
index 0000000..8cac811
--- /dev/null
+++ b/icons/reload.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/icons/right.svg b/icons/right.svg
new file mode 100644
index 0000000..c0b847d
--- /dev/null
+++ b/icons/right.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/icons/stop.svg b/icons/stop.svg
new file mode 100644
index 0000000..1ff435f
--- /dev/null
+++ b/icons/stop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/images/0.jpg b/images/0.jpg
new file mode 100644
index 0000000..a86ac38
Binary files /dev/null and b/images/0.jpg differ
diff --git a/images/1.jpg b/images/1.jpg
new file mode 100644
index 0000000..9b78803
Binary files /dev/null and b/images/1.jpg differ
diff --git a/images/2.png b/images/2.png
new file mode 100644
index 0000000..04741c3
Binary files /dev/null and b/images/2.png differ
diff --git a/images/3.jpg b/images/3.jpg
new file mode 100644
index 0000000..a6e9314
Binary files /dev/null and b/images/3.jpg differ
diff --git a/images/4.jpg b/images/4.jpg
new file mode 100644
index 0000000..075a47e
Binary files /dev/null and b/images/4.jpg differ
diff --git a/images/5.jpg b/images/5.jpg
new file mode 100644
index 0000000..93b6198
Binary files /dev/null and b/images/5.jpg differ
diff --git a/images/6.jpg b/images/6.jpg
new file mode 100644
index 0000000..93d23b5
Binary files /dev/null and b/images/6.jpg differ
diff --git a/images/Spiderman.jpg b/images/Spiderman.jpg
new file mode 100644
index 0000000..584cc63
Binary files /dev/null and b/images/Spiderman.jpg differ
diff --git a/images/Spiderman.mp4 b/images/Spiderman.mp4
new file mode 100644
index 0000000..d708a36
Binary files /dev/null and b/images/Spiderman.mp4 differ
diff --git a/images/cropped-1920-1080-1030412.jpg b/images/cropped-1920-1080-1030412.jpg
new file mode 100644
index 0000000..7d59b42
Binary files /dev/null and b/images/cropped-1920-1080-1030412.jpg differ
diff --git a/info.html b/info.html
new file mode 100644
index 0000000..43dc89d
--- /dev/null
+++ b/info.html
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+
+
+
information page
+
+
+
+
+
+
+
+
+
+
+
Browser
+
+ A web browser made in Python is a software application that allows users to access and navigate web pages on the internet.
+ It is built using the Python programming language and third-party libraries such as PyQt & Tkinter to create a graphical user interface.
+ The browser may include features such as tabbed browsing, bookmark management, and support for various web technologies such as HTML, CSS, and JavaScript.
+
+
+
+
+
+
+
+
+
+
+
+
HTML & CSS
+
Mayuresh Khadpe
+
+
+ Works on HTML & CSS to Create Homepages & All Web Related Part.
+ Made a Fully Working Browser Front Page & graphical user interface.
+
+
+
+
+
+
+
+
+
+
+
+
+
Python
+
Sarvesh Patil
+
+
+ Works on Python to Create Browser ( Software ).
+ libraries used are PyQt to create a graphical user interface.
+ Data like History and Bookmarks are stored in the .json file format.
+
+
+
+
+
+
+
+
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..507eee4
Binary files /dev/null and b/requirements.txt differ
diff --git a/test.py b/test.py
new file mode 100644
index 0000000..8673500
--- /dev/null
+++ b/test.py
@@ -0,0 +1,2 @@
+import subprocess
+subprocess.call(['D:\Project\SimpleBrowser\Server.bat'])
\ No newline at end of file